]> source.dussan.org Git - rspamd.git/commitdiff
* Improve maillist plugin to detect majordomo, cgp and google groups
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Wed, 11 May 2011 18:08:35 +0000 (22:08 +0400)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Wed, 11 May 2011 18:08:35 +0000 (22:08 +0400)
src/plugins/lua/maillist.lua

index c7a4751eb2fbe73b3f61ea760e001d95d6ab42ac..65d1c82c162f3b6f55d1f8c2df2fff21591aba17 100644 (file)
@@ -153,6 +153,86 @@ function check_ml_subscriberu(task)
 
 end
 
+-- RFC 2369 headers
+function check_rfc2369(task)
+       local message = task:get_message()
+       local header = message:get_header('List-Id')
+       if not header then
+               return false
+       end
+       header = message:get_header('List-Unsubscribe')
+       if not header or not string.find(header[1], '^^<.+>$') then
+               return false
+       end
+       header = message:get_header('List-Subscribe')
+       if not header or not string.find(header[1], '^^<.+>$') then
+               return false
+       end
+       
+       return true
+end
+
+-- RFC 2919 headers
+function check_rfc2919(task)
+       local message = task:get_message()
+       local header = message:get_header('List-Id')
+       if not header or not string.find(header[1], '^<.+>$') then
+               return false
+       end
+       
+       return check_rfc2369(task)
+end
+
+-- Google groups detector
+-- header exists X-Google-Loop
+-- RFC 2919 headers exist
+--
+function check_ml_googlegroup(task)
+       local message = task:get_message()
+       local header = message:get_header('X-Google-Loop')
+       
+       if not header then
+               return false
+       end
+
+       return check_rfc2919(task)
+end
+
+-- Majordomo detector
+-- Check Sender for owner- or -owner
+-- Check Precendence for 'Bulk' or 'List'
+--
+-- And nothing more can be extracted :(
+function check_ml_majordomo(task)
+       local message = task:get_message()
+       local header = message:get_header('Sender')
+       if not header or (not string.find(header[1], '^owner-.*$') and not string.find(header[1], '^.*-owner$')) then
+               return false
+       end
+       
+       local header = message:get_header('Precedence')
+       if not header or (header[1] ~= 'list' and header[1] ~= 'bulk') then
+               return false
+       end
+
+       return true
+end
+
+-- CGP detector
+-- X-Listserver = CommuniGate Pro LIST
+-- RFC 2919 headers exist
+--
+function check_ml_cgp(task)
+       local message = task:get_message()
+       local header = message:get_header('X-Listserver')
+       
+       if not header or header ~= 'CommuniGate Pro LIST' then
+               return false
+       end
+
+       return check_rfc2919(task)
+end
+
 function check_maillist(task)
        if check_ml_ezmlm(task) then
                task:insert_result(symbol, 1, 'ezmlm')
@@ -160,6 +240,12 @@ function check_maillist(task)
                task:insert_result(symbol, 1, 'mailman')
        elseif check_ml_subscriberu(task) then
                task:insert_result(symbol, 1, 'subscribe.ru')
+       elseif check_ml_googlegroup(task) then
+               task:insert_result(symbol, 1, 'googlegroups')
+       elseif check_ml_majordomo(task) then
+               task:insert_result(symbol, 1, 'majordomo')
+       elseif check_ml_cgp(task) then
+               task:insert_result(symbol, 1, 'cgp')
        end
 end
 -- Registration
@@ -169,8 +255,7 @@ if type(rspamd_config.get_api_version) ~= 'nil' then
        end
 end
 -- Configuration
-local opts =  rspamd_config:get_all_opt('maillist')
-if opts then
+local opts =  rspamd_config:get_all_opt('maillist')if opts then
        if opts['symbol'] then
                symbol = opts['symbol'] 
                rspamd_config:register_symbol(symbol, 1.0, 'check_maillist')