* Wed Sep 11 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-8.sme

- merge dovecot-extra [SME: 12735]
This commit is contained in:
Jean-Philippe Pialasse 2024-09-11 23:54:44 -04:00
parent 4db0e85afa
commit f1f6daf9e3
23 changed files with 375 additions and 12 deletions

View File

@ -11,8 +11,4 @@ Show list of outstanding bugs: [here](https://bugs.koozali.org/buglist.cgi?compo
## Description ## Description
<br />*This description has been generated by an LLM AI system and cannot be relied on to be fully correct.* 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.
*Once it has been checked, then this comment will be deleted*
<br />
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.

View File

@ -14,13 +14,26 @@ event_link("adjust-dovecot", "email-update", "02");
event_link("adjust-dovecot", "bootstrap-console-save", "02"); event_link("adjust-dovecot", "bootstrap-console-save", "02");
#smeserver-dovecot-update #smeserver-dovecot-update
safe_symlink("restart", "root/etc/e-smith/events/smeserver-dovecot-update/services2adjust/dovecot"); my $event = "smeserver-dovecot-update";
safe_symlink("restart", "root/etc/e-smith/events/smeserver-dovecot-update/services2adjust/rsyslog"); safe_symlink("restart", "root/etc/e-smith/events/$event/services2adjust/dovecot");
event_link("adjust-dovecot", "smeserver-dovecot-update", "02"); safe_symlink("restart", "root/etc/e-smith/events/$event/services2adjust/rsyslog");
event_link("systemd-reload", "smeserver-dovecot-update", "89"); event_link("adjust-dovecot", $event, "02");
event_link("systemd-default", "smeserver-dovecot-update", "88"); event_link("systemd-reload", $event, "89");
templates2events("/etc/rsyslog.conf","smeserver-dovecot-update"); event_link("systemd-default", $event, "88");
templates2events("/etc/rsyslog.conf", $event);
# in case the ip change # in case the ip change
safe_symlink("sigusr2", "root/etc/e-smith/events/ip-change/services2adjust/dovecot"); 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");

View File

@ -0,0 +1 @@
4190

View File

@ -0,0 +1 @@
private

View File

@ -0,0 +1 @@
enabled

View File

@ -0,0 +1 @@
service

View File

@ -0,0 +1 @@
enabled

View File

@ -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);
}

View File

@ -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/

View File

@ -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;';
}
}

View File

@ -0,0 +1 @@
GID="sharedmailbox"

View File

@ -0,0 +1,6 @@
{
if (($sieve{'status'} || 'disabled') eq 'enabled'){
$proto .= " sieve";
}
$OUT .= "";
}

View File

@ -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";
}
}

View File

@ -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 .= '';
}

View File

@ -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 .= '}';
}
}

View File

@ -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':''}
\}

View File

@ -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";
}
}
}

View File

@ -0,0 +1,5 @@
#!/bin/sh
ACL_GROUPS=`groups $USER | tr ' ' ','`
export ACL_GROUPS
export USERDB_KEYS="$USERDB_KEYS acl_groups"
exec "$@"

View File

@ -0,0 +1 @@
exec /usr/bin/spamc -L ham

View File

@ -0,0 +1 @@
exec /usr/bin/spamc -L spam

View File

@ -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";

View File

@ -0,0 +1,2 @@
require ["vnd.dovecot.pipe", "copy"];
pipe :copy "learn-spam.sh";

View File

@ -1,5 +1,5 @@
%define version 11.0.0 %define version 11.0.0
%define release 7 %define release 8
%define name smeserver-dovecot %define name smeserver-dovecot
@ -24,6 +24,7 @@ Provides: smeserver-imap
Provides: smeserver-pop3 Provides: smeserver-pop3
Provides: e-smith-imap Provides: e-smith-imap
Provides: e-smith-pop3 Provides: e-smith-pop3
Provides: smeserver-dovecot-extras
Obsoletes: e-smith-imap Obsoletes: e-smith-imap
Obsoletes: e-smith-pop3 Obsoletes: e-smith-pop3
Obsoletes: e-smith-ssl-imap Obsoletes: e-smith-ssl-imap
@ -39,6 +40,9 @@ Configure the dovecot IMAP server with sieve scripts support,
quota, ACL, extended logging, master user quota, ACL, extended logging, master user
%changelog %changelog
* Wed Sep 11 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-8.sme
- merge dovecot-extra [SME: 12735]
* Fri Apr 05 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-7.sme * Fri Apr 05 2024 Jean-Philippe Pialasse <jpp@koozali.org> 11.0.0-7.sme
- add missing requirement for portreserve [SME: 12589] - add missing requirement for portreserve [SME: 12589]
@ -225,6 +229,16 @@ perl createlinks
/sbin/e-smith/genfilelist $RPM_BUILD_ROOT \ /sbin/e-smith/genfilelist $RPM_BUILD_ROOT \
--file /sbin/e-smith/systemd/dovecot-control 'attr(0554,root,root)'\ --file /sbin/e-smith/systemd/dovecot-control 'attr(0554,root,root)'\
--dir /var/log/dovecot 'attr(0750,smelog,smelog)' \ --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 > %{name}-%{version}-filelist
%files -f %{name}-%{version}-filelist %files -f %{name}-%{version}-filelist