-- Copyright (c) 2010 Jozsef Kovacs and Alex Beregszaszi -- -- Development kindly sponsored by Datira (www.datira.com), -- a professional hosting company. -- -- License: MIT -- local logging_enabled = 1 local function logger (logwhat) if logging_enabled == 1 then odkim.log(ctx, "LUA-SETUP "..logwhat) end end local function signer (domain) if odkim.sign(ctx, domain) == 1 then logger("Signing requested") else logger("Signing failed") end end -- Get SASL username local author = odkim.get_mtasymbol(ctx, "{auth_authen}") -- Incoming mail (without sasl username), verify only if author == nil then odkim.verify(ctx) return nil end logger("SASL username: "..author) -- Sign mail using the key associated to the envelope sender domain local mailfromdomain = odkim.get_fromdomain(ctx) local mailfrom = odkim.get_mtasymbol(ctx, "{mail_addr}") local headerfromaddr = odkim.get_header(ctx, "From", 0) logger("Mail from domain: "..mailfromdomain) logger("Mail from address: "..mailfrom) logger("Header from address: "..headerfromaddr) -- TODO: regexp email matching for headerfromaddr if string.find(headerfromaddr, mailfrom) ~= nil then -- If we have a direct match, sign the mail if author == mailfrom then signer(mailfromdomain) return nil end -- Check for additional possible sender aliases -- requires luasql-mysql require "luasql.mysql" local sql = luasql.mysql() if sql ~= nil then local conn = sql:connect("dbname", "dbuser", "dbpass", "db.example.com") if conn ~= nil then local cur = conn:execute(string.format("select * from alias where address=\"%s\" and goto like \"%%%s%%\"", mailfrom, author)) if cur ~= nil then if cur:numrows() > 0 then cur:close() conn:close() sql:close() logger("Alias found in SQL") signer(mailfromdomain) return nil end logger("No alias in SQL") cur:close() end conn:close() odkim.set_result(ctx, SMFIS_REJECT) return nil end sql:close() -- temporary failure: hope to process it again and SQL is available the second time odkim.set_result(ctx, SMFIS_TEMPFAIL) return nil end end -- If we got this far we have a forged sender associated to the sasl username odkim.set_result(ctx, SMFIS_REJECT) return nil