Files
sn0int/modules/dev/pgp-keyserver.lua
2019-09-14 23:39:21 +02:00

80 lines
2.5 KiB
Lua

-- Description: Query pgp keyserver for email addresses
-- Version: 0.3.0
-- Source: domains
-- License: GPL-3.0
-- TODO: rename to pgp-pks-domains
function run(arg)
local domain = arg['value']
--lookup_url = 'https://pgp.mit.edu/pks/lookup'
local lookup_url = 'https://sks-keyservers.net/pks/lookup'
session = http_mksession()
local req = http_request(session, 'GET', lookup_url, {
query={
search=domain,
}
})
local resp = http_send(req)
if last_err() then return end
if resp['status'] ~= 200 then return 'http error: ' .. resp['status'] end
links = html_select_list(resp['text'], 'a')
debug('keys found: ' .. #links)
for i=1, #links do
href = links[i]['attrs']['href']
if href:find('/pks/lookup%?op=get&search=') == 1 then
url = url_join(lookup_url, href)
debug(url)
req = http_request(session, 'GET', url, {})
resp = http_send(req)
-- TODO: do not abort script if one attempt fails
if last_err() then return end
if resp['status'] ~= 200 then
error('http error: ' .. url .. ' => ' .. resp['status'])
else
pubkey = pgp_pubkey_armored(resp['text'])
if last_err() then
warn(last_err())
clear_err()
else
-- print(pubkey)
local emails = {}
local domain_matched = false
-- TODO: ensure at least one email matches our target domain
if pubkey['uids'] then
for j=1, #pubkey['uids'] do
local m = regex_find("(.+) <([^< ]+@[^< ]+)>$", pubkey['uids'][j])
if m then
local email = m[3]:lower()
emails[#emails+1] = {
value=email,
displayname=m[2],
}
if email:match('@' .. domain .. '$') then
domain_matched = true
end
end
end
end
if domain_matched then
for j=1, #emails do
db_add('email', emails[j])
end
end
end
end
end
end
end