81 lines
2.1 KiB
Lua
81 lines
2.1 KiB
Lua
local request = require 'request'
|
|
local response = require 'response'
|
|
local helper = require 'helper'
|
|
local resolver = require 'dns'
|
|
local json = require 'json'
|
|
local ip = require 'ip'
|
|
|
|
local red = helper.redis.connect()
|
|
|
|
request_uri = helper.parseURL()
|
|
if type(request_uri) ~= "table" or table.getn(request_uri) < 2 then
|
|
response.quit(ngx.HTTP_BAD_REQUEST)
|
|
return
|
|
end
|
|
|
|
local response_type = request_uri[2]
|
|
if not response.isValidResponseType(response_type) then
|
|
response.quit(ngx.HTTP_BAD_REQUEST)
|
|
return
|
|
end
|
|
|
|
local data = request.getPostData()
|
|
if data == nil or data['email'] == nil then
|
|
response.quit(ngx.HTTP_BAD_REQUEST)
|
|
return
|
|
end
|
|
|
|
domain = helper.getDomain(data['email'])
|
|
if not domain then
|
|
response.quit(ngx.HTTP_BAD_REQUEST)
|
|
return
|
|
end
|
|
|
|
local isBad = helper.redis.checkDomain(red, "disposable", domain)
|
|
if not isBad or postData['no_dns_check'] == true then
|
|
local r, err = resolver:new{
|
|
nameservers = {'8.8.8.8', '8.8.4.4'},
|
|
retrans = 5,
|
|
timeout = 2000,
|
|
}
|
|
|
|
if not r or err then
|
|
ngx.log(ngx.ERR, err)
|
|
response.quit(ngx.HTTP_SERVICE_UNAVAILABLE)
|
|
end
|
|
|
|
local ans, err = r:tcp_query(domain, { qtype = r.TYPE_MX })
|
|
if not ans or err then
|
|
ngx.log(ngx.ERR, err)
|
|
if type(ans) == "table" then
|
|
for i, v in pairs(ans) do
|
|
ngx.log(ngx.ERR, json.encode(err))
|
|
end
|
|
end
|
|
response.quit(ngx.HTTP_SERVICE_UNAVAILABLE)
|
|
return
|
|
end
|
|
|
|
if not (type(ans) ~= "table" or #ans == 0) then
|
|
for _i, _v in pairs(ans) do
|
|
local ip_addrs, err = r:tcp_query(_v.exchange)
|
|
if not ip_addrs or err or type(ip_addrs) ~= 'table' or #ip_addrs == 0 then
|
|
isBad = true
|
|
break
|
|
end
|
|
local p
|
|
for i, v in pairs(ip_addrs) do
|
|
p = ip.parse(v.address)
|
|
if p.range(p) ~= "unicast" then
|
|
isBad = true
|
|
break
|
|
end
|
|
end
|
|
end
|
|
else
|
|
isBad = true
|
|
end
|
|
end
|
|
|
|
response.createResponse(response_type, data['email'], domain, isBad)
|