diff --git a/README.md b/README.md index d7f54c6..9f055ab 100644 --- a/README.md +++ b/README.md @@ -11,8 +11,4 @@ Show list of outstanding bugs: [here](https://bugs.koozali.org/buglist.cgi?compo ## Description -
*This description has been generated by an LLM AI system and cannot be relied on to be fully correct.* -*Once it has been checked, then this comment will be deleted* -
- -Dovecot is an open source software service that provides secure access to emails, calendars, and other applications for both users and administrators. It works by creating a secure connection between a mail server and an email client, allowing users to securely sync and download their emails, calendar events, contacts, and other data. Dovecot also provides a secure authentication process to ensure that only users with the proper credentials can access the email server. It is highly reliable and scalable, making it a popular choice for large and small businesses alike. Additionally, Dovecot is easy to install and configure, so businesses can get started quickly and easily. +Dovecot is an open source software service that provides secure access to emails, calendars, and other applications for both users and administrators. It works by creating a secure connection between a mail server and an email client, allowing users to securely sync and download their emails, calendar events, contacts, and other data. Dovecot also provides a secure authentication process to ensure that only users with the proper credentials can access the email server. It is highly reliable and scalable, making it a popular choice for large and small businesses alike. diff --git a/createlinks b/createlinks index cbef5ca..3e3babf 100644 --- a/createlinks +++ b/createlinks @@ -14,13 +14,26 @@ event_link("adjust-dovecot", "email-update", "02"); event_link("adjust-dovecot", "bootstrap-console-save", "02"); #smeserver-dovecot-update -safe_symlink("restart", "root/etc/e-smith/events/smeserver-dovecot-update/services2adjust/dovecot"); -safe_symlink("restart", "root/etc/e-smith/events/smeserver-dovecot-update/services2adjust/rsyslog"); -event_link("adjust-dovecot", "smeserver-dovecot-update", "02"); -event_link("systemd-reload", "smeserver-dovecot-update", "89"); -event_link("systemd-default", "smeserver-dovecot-update", "88"); -templates2events("/etc/rsyslog.conf","smeserver-dovecot-update"); +my $event = "smeserver-dovecot-update"; +safe_symlink("restart", "root/etc/e-smith/events/$event/services2adjust/dovecot"); +safe_symlink("restart", "root/etc/e-smith/events/$event/services2adjust/rsyslog"); +event_link("adjust-dovecot", $event, "02"); +event_link("systemd-reload", $event, "89"); +event_link("systemd-default", $event, "88"); +templates2events("/etc/rsyslog.conf", $event); # in case the ip change safe_symlink("sigusr2", "root/etc/e-smith/events/ip-change/services2adjust/dovecot"); +# dovecot-extras +event_link("dovecot-acl", $event, "30"); +event_link("dovecot-compile-sieve", $event, "40"); +event_link("dovecot-acl", "email-update", "85"); +event_link("dovecot-acl", "user-create", "85"); +event_link("dovecot-acl", "post-upgrade", "85"); +event_link("dovecot-compile-sieve", "email-update", "86"); + +safe_touch("root/home/e-smith/db/dovecot/sharedmailbox.db"); + +templates2events("/home/e-smith/files/public/dovecot-acl", "email-update"); + diff --git a/root/etc/e-smith/db/configuration/defaults/sieve/TCPPort b/root/etc/e-smith/db/configuration/defaults/sieve/TCPPort new file mode 100644 index 0000000..025479c --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/sieve/TCPPort @@ -0,0 +1 @@ +4190 diff --git a/root/etc/e-smith/db/configuration/defaults/sieve/access b/root/etc/e-smith/db/configuration/defaults/sieve/access new file mode 100644 index 0000000..3e18ebf --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/sieve/access @@ -0,0 +1 @@ +private diff --git a/root/etc/e-smith/db/configuration/defaults/sieve/status b/root/etc/e-smith/db/configuration/defaults/sieve/status new file mode 100644 index 0000000..86981e6 --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/sieve/status @@ -0,0 +1 @@ +enabled diff --git a/root/etc/e-smith/db/configuration/defaults/sieve/type b/root/etc/e-smith/db/configuration/defaults/sieve/type new file mode 100644 index 0000000..24e1098 --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/sieve/type @@ -0,0 +1 @@ +service diff --git a/root/etc/e-smith/db/configuration/defaults/spamassassin/SpamLearning b/root/etc/e-smith/db/configuration/defaults/spamassassin/SpamLearning new file mode 100644 index 0000000..86981e6 --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/spamassassin/SpamLearning @@ -0,0 +1 @@ +enabled diff --git a/root/etc/e-smith/events/actions/dovecot-acl b/root/etc/e-smith/events/actions/dovecot-acl new file mode 100644 index 0000000..fea20ca --- /dev/null +++ b/root/etc/e-smith/events/actions/dovecot-acl @@ -0,0 +1,89 @@ +#!/usr/bin/perl -w + + +use esmith::ConfigDB; +use esmith::AccountsDB; +use File::Find; + +my $c = esmith::ConfigDB->open || die "Couldn't open ConfigDB\n"; +my $a = esmith::AccountsDB->open_ro || die "Couldn't open AccountsdDB\n"; + +my $dovecot = $c->get('dovecot'); + +die "couldn't find dovecot service\n" unless ($dovecot); + +my $event = $ARGV[0]; + +# SharedMailboxes disabled ? +if (($dovecot->prop('SharedMailbox') || 'disabled') eq 'disabled'){ + if (($dovecot->prop('SharedMailboxAcl') || 'yes') ne 'no'){ + foreach my $user ($a->users){ + my $name = $user->key; + die "Error removing SharedMailbox ACLs ($name"."'s Maildir)\n" unless ( + system('/usr/bin/setfacl', + '-R', + '-x', + 'g:sharedmailbox', + "/home/e-smith/files/users/$name") == 0 && + system('/bin/chmod', + '-R', + 'g-s', + "/home/e-smith/files/users/$name/Maildir") == 0 + ); + } + } + $dovecot->set_prop('SharedMailboxAcl','no'); + exit(0); +} + +# If SharedMailbox is enabled + +# Set the correct ACL during user creation +if ($event && $event eq 'user-create'){ + my $user = $ARGV[1]; + set_acl($user); +} + +if (($dovecot->prop('SharedMailboxAcl') || 'no') ne 'yes'){ + # ACL for existing users haven't been set yet + foreach my $user ($a->users){ + my $name = $user->key; + set_acl($name); + } + $dovecot->set_prop('SharedMailboxAcl','yes'); +} + +# Set ACL on a user's Maildir +sub set_acl { + my $user = shift; + die "Missing username\n" unless ($user); + die "Couldn't find $user"."'s home dir\n" unless (-e "/home/e-smith/files/users/$user"); + find(\&dirperm, "/home/e-smith/files/users/$user/Maildir"); + die "Error applying permissions to $user 's Maildir\n" unless ( + # sharedmailbox group needs read / write access on Maildir + system('/usr/bin/setfacl', + '-R', + '-m', + 'u::rwX,g::rwX,o::rX,g:sharedmailbox:rwX,d:u::rwX,d:g::rwX,d:g:sharedmailbox:rwX,d:o::rX', + "/home/e-smith/files/users/$user/Maildir") == 0 && + # Grant sharedmailbox group permission to go through + # the home dir so it can access the Maildir, but don't let it read + # anything (except the Maildir) + system('/usr/bin/setfacl', + '-m', + 'g:sharedmailbox:x', + "/home/e-smith/files/users/$user") == 0 + ); +} + +# The kernel will handle group perms when a user +# create a dir in another user's Maildir (if IMAP ACL allows it) +# This will prevent dovecot errors, see +# http://wiki2.dovecot.org/SharedMailboxes/Permissions and +# http://wiki2.dovecot.org/Errors/ChgrpNoPerm +sub dirperm { + system('/bin/chmod', + 'g+s', + "$_") if (-d); +} + diff --git a/root/etc/e-smith/events/actions/dovecot-compile-sieve b/root/etc/e-smith/events/actions/dovecot-compile-sieve new file mode 100644 index 0000000..e91e949 --- /dev/null +++ b/root/etc/e-smith/events/actions/dovecot-compile-sieve @@ -0,0 +1,9 @@ +#!/bin/bash + +status=$(/sbin/e-smith/config getprop spamassassin UseBayes || echo 0) +if [ "$status" = "1" ] +then + systemctl restart dovecot + /usr/bin/sievec /usr/libexec/dovecot/sieve/ +fi +#/usr/bin/sievec /usr/libexec/dovecot/sieve/ diff --git a/root/etc/e-smith/templates-user/.qmail/80DovecotLDA b/root/etc/e-smith/templates-user/.qmail/80DovecotLDA new file mode 100644 index 0000000..2847f27 --- /dev/null +++ b/root/etc/e-smith/templates-user/.qmail/80DovecotLDA @@ -0,0 +1,20 @@ +# Dovecot LDA delivery +{ + # vim: ft=perl: + use esmith::ConfigDB; + my $cdb = esmith::ConfigDB->open_ro || die "Couldn't open ConfigDB\n"; + my $sieve = $cdb->get('sieve'); + my $usersieve = $props{Sieve} || 'enabled'; + my $globalsieve = ($sieve) ? ($sieve->prop('status') || 'disabled') : 'disabled'; + + if (($usersieve ne 'enabled') || ($globalsieve ne 'enabled')){ + $OUT .= "# Sieve is disabled\n"; + } + elsif ($props{EmailForward} !~ /^(local|both)$/) { + $OUT .= "# No local delivery (Dovecot LDA)\n"; + } + else{ + $OUT .= '| /var/qmail/bin/preline -f /usr/libexec/dovecot/dovecot-lda -a "$RECIPIENT"; if [ $? -ne 0 ] ; then exit -1; else exit 99; fi;'; + } +} + diff --git a/root/etc/e-smith/templates.metadata/home/e-smith/files/public/dovecot-acl b/root/etc/e-smith/templates.metadata/home/e-smith/files/public/dovecot-acl new file mode 100644 index 0000000..501c14f --- /dev/null +++ b/root/etc/e-smith/templates.metadata/home/e-smith/files/public/dovecot-acl @@ -0,0 +1 @@ +GID="sharedmailbox" diff --git a/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/10protocols11sieve b/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/10protocols11sieve new file mode 100644 index 0000000..d0be3ab --- /dev/null +++ b/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/10protocols11sieve @@ -0,0 +1,6 @@ +{ +if (($sieve{'status'} || 'disabled') eq 'enabled'){ + $proto .= " sieve"; +} +$OUT .= ""; +} diff --git a/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/30listener11sieve b/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/30listener11sieve new file mode 100644 index 0000000..42c8e8a --- /dev/null +++ b/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/30listener11sieve @@ -0,0 +1,19 @@ +{ +if (($sieve{'status'} || 'enabled') eq 'enabled'){ + my $port = $sieve{'TCPPort'} || '4190'; + my $address = $sieve{'Listen'} || '127.0.0.1'; + $OUT .=<<"HERE"; + +service managesieve-login { + inet_listener sieve { + port = $port + address = $address + } +} + +HERE +} +else { + $OUT .= "# Sieve is disabled"; +} +} diff --git a/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/65pluginAcl b/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/65pluginAcl new file mode 100644 index 0000000..72f0305 --- /dev/null +++ b/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/65pluginAcl @@ -0,0 +1,89 @@ +{ +return "# Mailbox sharing is not enabled" + if (($dovecot{'SharedMailbox'} || 'disabled') eq 'disabled') && (($dovecot{'PublicMailbox'} || 'disabled') eq 'disabled'); + +push @plugins, 'acl'; +push @imap_plugins, 'imap_acl'; + +my $common =<<'_EOF'; + +mail_access_groups = sharedmailbox + +service dict { + unix_listener dict { + mode = 0660 + group = sharedmailbox + } +} + +service auth { + unix_listener auth-userdb { + mode = 0660 + group = sharedmailbox + } +} + +service imap { + executable = imap imap-postlogin +} + +service imap-postlogin { + executable = script-login -d /usr/bin/imap-postlogin + unix_listener imap-postlogin { + } +} + + +namespace { + type = private + separator = / + prefix = + inbox = yes +} +_EOF + +my $shared_mb = "\n# SharedMailbox is disabled\n"; +my $public_mb = "\n# PublicMailbox is disabled\n"; +if (($dovecot{'SharedMailbox'} || 'disabled') eq 'enabled'){ + $shared_mb =<<'_EOF'; +namespace { + type = shared + separator = / + prefix = shared/%%u/ + location = maildir:%%h/Maildir:INDEX=~/Maildir/shared/%%u + subscriptions = no + list = children +} +_EOF +} +if (($dovecot{'PublicMailbox'} || 'disabled') eq 'enabled'){ + $public_mb =<<'_EOF'; +namespace { + type = public + separator = / + prefix = public/ + location = maildir:/home/e-smith/files/public + subscriptions = no + list = children +} +_EOF +} + +my $acl =<<'_EOF'; +plugin { + acl_shared_dict = file:/home/e-smith/db/dovecot/sharedmailbox.db +} + +plugin { + acl = vfile +} + +plugin { + acl_anyone = allow +} + +_EOF + +push @conf, $common, $shared_mb, $public_mb, $acl; +$OUT .= ''; +} diff --git a/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/70pluginImapSieve b/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/70pluginImapSieve new file mode 100644 index 0000000..ea30834 --- /dev/null +++ b/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/70pluginImapSieve @@ -0,0 +1,52 @@ +{ +# If we have imap_sieve plugin, enable it +if (( -e '/usr/lib64/dovecot/lib95_imap_sieve_plugin.so' || -e '/usr/lib/dovecot/lib95_imap_sieve_plugin.so') && + ($spamassassin{'UseBayes'} || 'disabled') =~ m/^1|on|yes|enabled$/){ + push @imap_plugins, 'imap_sieve'; + my $index = 1; + $OUT.= <<'_EOF'; + +plugin { + sieve_plugins = sieve_imapsieve sieve_extprograms + sieve_execute_bin_dir = /usr/libexec/dovecot + sieve_pipe_bin_dir = /usr/libexec/dovecot + sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.execute + +_EOF + + if (($dovecot{'LearnSpam'} || 'enabled') =~ m/^1|on|yes|enabled$/){ + $OUT.= <<"_EOF"; + # Copy from anywhere to junkmail + imapsieve_mailbox$index\_name = junkmail + imapsieve_mailbox$index\_causes = COPY + imapsieve_mailbox$index\_before = file:/usr/libexec/dovecot/sieve/report-spam.sieve +_EOF + $index++; + $OUT.= <<"_EOF"; + imapsieve_mailbox$index\_name = Junk + imapsieve_mailbox$index\_causes = COPY + imapsieve_mailbox$index\_before = file:/usr/libexec/dovecot/sieve/report-spam.sieve +_EOF + $index++; + } + if (($dovecot{'LearnHam'} || 'enabled') =~ m/^1|on|yes|enabled$/){ + $OUT.= <<"_EOF"; + # Copy from junkmail to anywhere + imapsieve_mailbox$index\_name = * + imapsieve_mailbox$index\_from = junkmail + imapsieve_mailbox$index\_causes = COPY + imapsieve_mailbox$index\_before = file:/usr/libexec/dovecot/sieve/report-ham.sieve +_EOF + $index++; + $OUT.= <<"_EOF"; + imapsieve_mailbox$index\_name = * + imapsieve_mailbox$index\_from = Junk + imapsieve_mailbox$index\_causes = COPY + imapsieve_mailbox$index\_before = file:/usr/libexec/dovecot/sieve/report-ham.sieve +_EOF + $index++; + } + + $OUT .= '}'; +} +} diff --git a/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/91lda b/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/91lda new file mode 100644 index 0000000..ec4b723 --- /dev/null +++ b/root/etc/e-smith/templates/etc/dovecot/dovecot.conf/91lda @@ -0,0 +1,19 @@ + +postmaster_address = postmaster@{$DomainName} +lda_original_recipient_header = to + +{ +my $reason = $dovecot{'RejectMessage'} || ''; +my $subject = $dovecot{'RejectSubject'} || ''; +if ($reason ne ''){ + $OUT .= "rejection_reason = $reason\n"; +} +if ($subject ne ''){ + $OUT .= "rejection_subject = $subject\n"; +} +} + +protocol lda \{ + mail_plugins = $mail_plugins {$OUT .= (($sieve{'status'} || 'disabled') eq 'enabled') ? 'sieve':''} +\} + diff --git a/root/etc/e-smith/templates/home/e-smith/files/public/dovecot-acl/10All b/root/etc/e-smith/templates/home/e-smith/files/public/dovecot-acl/10All new file mode 100644 index 0000000..528c014 --- /dev/null +++ b/root/etc/e-smith/templates/home/e-smith/files/public/dovecot-acl/10All @@ -0,0 +1,11 @@ +{ + +if (($dovecot{'PublicMailbox'} || 'disabled') eq 'enabled'){ + my @PublicMailboxAdmins = split /[,:]/, ($dovecot{PublicMailboxAdmins} || ''); + $OUT .= "user=admin lrswtipekxa" . "\n"; + foreach my $PublicMailboxAdmins (sort @PublicMailboxAdmins){ + $OUT .= 'user=' . "$PublicMailboxAdmins " . 'lrswtipekxa' . "\n"; + } +} + +} diff --git a/root/usr/bin/imap-postlogin b/root/usr/bin/imap-postlogin new file mode 100644 index 0000000..0d17572 --- /dev/null +++ b/root/usr/bin/imap-postlogin @@ -0,0 +1,5 @@ +#!/bin/sh +ACL_GROUPS=`groups $USER | tr ' ' ','` +export ACL_GROUPS +export USERDB_KEYS="$USERDB_KEYS acl_groups" +exec "$@" diff --git a/root/usr/libexec/dovecot/learn-ham.sh b/root/usr/libexec/dovecot/learn-ham.sh new file mode 100644 index 0000000..4c2f75b --- /dev/null +++ b/root/usr/libexec/dovecot/learn-ham.sh @@ -0,0 +1 @@ +exec /usr/bin/spamc -L ham diff --git a/root/usr/libexec/dovecot/learn-spam.sh b/root/usr/libexec/dovecot/learn-spam.sh new file mode 100644 index 0000000..21f3370 --- /dev/null +++ b/root/usr/libexec/dovecot/learn-spam.sh @@ -0,0 +1 @@ +exec /usr/bin/spamc -L spam diff --git a/root/usr/libexec/dovecot/sieve/report-ham.sieve b/root/usr/libexec/dovecot/sieve/report-ham.sieve new file mode 100644 index 0000000..7abb109 --- /dev/null +++ b/root/usr/libexec/dovecot/sieve/report-ham.sieve @@ -0,0 +1,11 @@ +require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"]; +if environment :matches "imap.mailbox" "*" { + set "mailbox" "${1}"; +} +if anyof (string "${mailbox}" "Trash", + string "${mailbox}" "junkmail", + string "${mailbox}" "Junk", + string "${mailbox}" "Éléments supprimés") { + stop; +} +pipe :copy "learn-ham.sh"; diff --git a/root/usr/libexec/dovecot/sieve/report-spam.sieve b/root/usr/libexec/dovecot/sieve/report-spam.sieve new file mode 100644 index 0000000..80d3da5 --- /dev/null +++ b/root/usr/libexec/dovecot/sieve/report-spam.sieve @@ -0,0 +1,2 @@ +require ["vnd.dovecot.pipe", "copy"]; +pipe :copy "learn-spam.sh"; diff --git a/smeserver-dovecot.spec b/smeserver-dovecot.spec index f0ed35e..4622711 100644 --- a/smeserver-dovecot.spec +++ b/smeserver-dovecot.spec @@ -1,5 +1,5 @@ %define version 11.0.0 -%define release 7 +%define release 8 %define name smeserver-dovecot @@ -24,6 +24,7 @@ Provides: smeserver-imap Provides: smeserver-pop3 Provides: e-smith-imap Provides: e-smith-pop3 +Provides: smeserver-dovecot-extras Obsoletes: e-smith-imap Obsoletes: e-smith-pop3 Obsoletes: e-smith-ssl-imap @@ -39,6 +40,9 @@ Configure the dovecot IMAP server with sieve scripts support, quota, ACL, extended logging, master user %changelog +* Wed Sep 11 2024 Jean-Philippe Pialasse 11.0.0-8.sme +- merge dovecot-extra [SME: 12735] + * Fri Apr 05 2024 Jean-Philippe Pialasse 11.0.0-7.sme - add missing requirement for portreserve [SME: 12589] @@ -225,6 +229,16 @@ perl createlinks /sbin/e-smith/genfilelist $RPM_BUILD_ROOT \ --file /sbin/e-smith/systemd/dovecot-control 'attr(0554,root,root)'\ --dir /var/log/dovecot 'attr(0750,smelog,smelog)' \ + --dir /home/e-smith/db/dovecot 'attr(2770,root,sharedmailbox)' \ + --dir /home/e-smith/files/public 'attr(2770,root,sharedmailbox)' \ + --dir /home/e-smith/files/public/cur 'attr(2770,root,sharedmailbox)' \ + --dir /home/e-smith/files/public/new 'attr(2770,root,sharedmailbox)' \ + --dir /home/e-smith/files/public/tmp 'attr(2770,root,sharedmailbox)' \ + --file /home/e-smith/db/dovecot/sharedmailbox.db 'attr(0660,root,sharedmailbox) %config(noreplace)' \ + --file /usr/bin/imap-postlogin 'attr(0755,root,root)' \ + --file /usr/libexec/dovecot/learn-spam.sh 'attr(0755,root,root)' \ + --file /usr/libexec/dovecot/learn-ham.sh 'attr(0755,root,root)' \ + --ignoredir /usr/bin \ > %{name}-%{version}-filelist %files -f %{name}-%{version}-filelist