From a25833314ea659e02bfe93bc928322b189a36379 Mon Sep 17 00:00:00 2001
From: Hinrikus Wolf <mail@hinrikus-wolf.de>
Date: Wed, 16 May 2018 16:29:21 +0200
Subject: [PATCH] change dovecot s.t. a spamfilter can be plugged in

---
 dovecot/files/filter_junk.sieve           | 10 ++++++++++
 dovecot/files/report-ham.sieve            | 15 +++++++++++++++
 dovecot/files/report-spam.sieve           |  7 +++++++
 dovecot/handlers/main.yml                 |  5 +++++
 dovecot/tasks/main.yml                    | 19 +++++++++++++++++++
 dovecot/templates/conf.d/20-imap.conf.j2  | 22 ++++++++++++++++++++++
 dovecot/templates/conf.d/90-sieve.conf.j2 |  3 +++
 7 files changed, 81 insertions(+)
 create mode 100644 dovecot/files/filter_junk.sieve
 create mode 100644 dovecot/files/report-ham.sieve
 create mode 100644 dovecot/files/report-spam.sieve

diff --git a/dovecot/files/filter_junk.sieve b/dovecot/files/filter_junk.sieve
new file mode 100644
index 0000000..e1d9d3a
--- /dev/null
+++ b/dovecot/files/filter_junk.sieve
@@ -0,0 +1,10 @@
+require "fileinto";
+
+if header :contains "X-Spam-Flag" "YES" {
+  fileinto "Junk";
+}
+
+if header :contains "Subject" "*SPAM*" {
+  fileinto "Junk";
+}
+
diff --git a/dovecot/files/report-ham.sieve b/dovecot/files/report-ham.sieve
new file mode 100644
index 0000000..a9d30cf
--- /dev/null
+++ b/dovecot/files/report-ham.sieve
@@ -0,0 +1,15 @@
+require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];
+
+if environment :matches "imap.mailbox" "*" {
+  set "mailbox" "${1}";
+}
+
+if string "${mailbox}" "Trash" {
+  stop;
+}
+
+if environment :matches "imap.user" "*" {
+  set "username" "${1}";
+}
+
+pipe :copy "sa-learn-ham.sh" [ "${username}" ];
diff --git a/dovecot/files/report-spam.sieve b/dovecot/files/report-spam.sieve
new file mode 100644
index 0000000..4dda267
--- /dev/null
+++ b/dovecot/files/report-spam.sieve
@@ -0,0 +1,7 @@
+require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];
+
+if environment :matches "imap.user" "*" {
+  set "username" "${1}";
+}
+
+pipe :copy "sa-learn-spam.sh" [ "${username}" ];
diff --git a/dovecot/handlers/main.yml b/dovecot/handlers/main.yml
index 9f0e695..8ff9e91 100644
--- a/dovecot/handlers/main.yml
+++ b/dovecot/handlers/main.yml
@@ -3,3 +3,8 @@
 - name: restart dovecot
   service: name=dovecot state=restarted
 
+- name: compile sieve script
+  shell: "sievec /var/lib/dovecot/sieve.d/*.sieve"
+
+
+
diff --git a/dovecot/tasks/main.yml b/dovecot/tasks/main.yml
index 7961665..9393299 100644
--- a/dovecot/tasks/main.yml
+++ b/dovecot/tasks/main.yml
@@ -31,6 +31,25 @@
     - dovecot
     - mail
 
+- name: ensure there is a folder for global sieve scripts
+  file: dest=/var/lib/dovecot/sieve.d state=directory owner=dovecot group=vmail mode=0770
+  tags:
+    - dovecot
+    - mail
+  when: content_filter is defined
+
+- name: ensure the global spam filter and learning sieve script is present
+  copy: src="files/{{ item }}" dest="/var/lib/dovecot/sieve.d/{{ item }}" mode=0550 owner=dovecot group=vmail
+  with_items: 
+    - filter_junk.sieve
+    - report-spam.sieve
+    - report-ham.sieve
+  notify:
+    - compile sieve script
+  tags:
+    - dovecot
+    - mail
+  when: content_filter is defined
 
 - name: ensure dsync config is present
   template: src=templates/conf.d/99-dsync.conf.j2 dest=/etc/dovecot/conf.d/99-dsync.conf
diff --git a/dovecot/templates/conf.d/20-imap.conf.j2 b/dovecot/templates/conf.d/20-imap.conf.j2
index acad748..2fa9a16 100644
--- a/dovecot/templates/conf.d/20-imap.conf.j2
+++ b/dovecot/templates/conf.d/20-imap.conf.j2
@@ -75,3 +75,25 @@ protocol imap {
   #mail_max_userip_connections = 10
   mail_max_userip_connections = 40
 }
+
+{% if content_filter is defined %}
+
+plugin {
+  sieve_plugins = sieve_imapsieve sieve_extprograms
+
+  # From elsewhere to Spam folder
+  imapsieve_mailbox1_name = Junk
+  imapsieve_mailbox1_causes = COPY
+  imapsieve_mailbox1_before = file:/usr/lib/dovecot/sieve.d/report-spam.sieve
+
+  # From Spam folder to elsewhere
+  imapsieve_mailbox2_name = *
+  imapsieve_mailbox2_from = Junk
+  imapsieve_mailbox2_causes = COPY
+  imapsieve_mailbox2_before = file:/usr/lib/dovecot/sieve.d/report-ham.sieve
+
+  sieve_pipe_bin_dir = /usr/lib/dovecot/sieve.d
+
+  sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
+}
+{% endif %}
diff --git a/dovecot/templates/conf.d/90-sieve.conf.j2 b/dovecot/templates/conf.d/90-sieve.conf.j2
index ca494b0..bee89e3 100644
--- a/dovecot/templates/conf.d/90-sieve.conf.j2
+++ b/dovecot/templates/conf.d/90-sieve.conf.j2
@@ -76,6 +76,9 @@ plugin {
   #sieve_before = /var/lib/dovecot/sieve.d/
   #sieve_before2 = ldap:/etc/sieve-ldap.conf;name=ldap-domain
   #sieve_before3 = (etc...)
+{% if content_filter is defined %}
+  sieve_before = /var/lib/dovecot/sieve.d/filter_junk.sieve
+{% endif %}
 
   # Identical to sieve_before, only the specified scripts are executed after the
   # user's script (only when keep is still in effect!). Multiple script
-- 
GitLab