trashmail/nginx/lua/validator.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)