80 lines
2.5 KiB
Lua
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
|