commit
53941d7314
13 changed files with 300 additions and 0 deletions
@ -0,0 +1,8 @@ |
|||||||
|
#!/usr/bin/perl -w |
||||||
|
|
||||||
|
use esmith::Build::CreateLinks qw(:all); |
||||||
|
|
||||||
|
event_link("dovecot-acl", "email-update", "85"); |
||||||
|
event_link("dovecot-acl", "user-create", "85"); |
||||||
|
|
||||||
|
safe_touch("root/etc/dovecot/sharedmailbox/dict.db"); |
@ -0,0 +1 @@ |
|||||||
|
4190 |
@ -0,0 +1 @@ |
|||||||
|
private |
@ -0,0 +1 @@ |
|||||||
|
enabled |
@ -0,0 +1 @@ |
|||||||
|
service |
@ -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,g:sharedmailbox:rwX,d:u::rwX,d:g::rwX,d:g:sharedmailbox:rwX', |
||||||
|
"/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); |
||||||
|
} |
||||||
|
|
@ -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;'; |
||||||
|
} |
||||||
|
} |
||||||
|
|
@ -0,0 +1,6 @@ |
|||||||
|
{ |
||||||
|
if (($sieve{'status'} || 'disabled') eq 'enabled'){ |
||||||
|
$proto .= " sieve"; |
||||||
|
} |
||||||
|
$OUT .= ""; |
||||||
|
} |
@ -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"; |
||||||
|
} |
||||||
|
} |
@ -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':''} |
||||||
|
\} |
||||||
|
|
@ -0,0 +1,68 @@ |
|||||||
|
{ |
||||||
|
return "" if (($dovecot{'SharedMailbox'} || 'disabled') eq 'disabled'); |
||||||
|
|
||||||
|
push @plugins, 'acl'; |
||||||
|
push @imap_plugins, 'imap_acl'; |
||||||
|
|
||||||
|
my $string =<<'HERE'; |
||||||
|
|
||||||
|
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 |
||||||
|
} |
||||||
|
|
||||||
|
namespace { |
||||||
|
type = shared |
||||||
|
separator = / |
||||||
|
prefix = shared/%%u/ |
||||||
|
location = maildir:%%h/Maildir:INDEX=~/Maildir/shared/%%u |
||||||
|
subscriptions = no |
||||||
|
list = children |
||||||
|
} |
||||||
|
|
||||||
|
plugin { |
||||||
|
acl_shared_dict = file:/home/e-smith/db/dovecot/sharedmailbox.db |
||||||
|
} |
||||||
|
|
||||||
|
plugin { |
||||||
|
acl = vfile |
||||||
|
} |
||||||
|
|
||||||
|
plugin { |
||||||
|
acl_anyone = allow |
||||||
|
} |
||||||
|
|
||||||
|
HERE |
||||||
|
|
||||||
|
push @conf, $string; |
||||||
|
$OUT .= ''; |
||||||
|
} |
@ -0,0 +1,5 @@ |
|||||||
|
#!/bin/sh |
||||||
|
ACL_GROUPS=`groups $USER | tr ' ' ','` |
||||||
|
export ACL_GROUPS |
||||||
|
export USERDB_KEYS="$USERDB_KEYS acl_groups" |
||||||
|
exec "$@" |
@ -0,0 +1,62 @@ |
|||||||
|
%define version 0.0.1 |
||||||
|
%define release 1.beta0 |
||||||
|
%define name smeserver-dovecot-extras |
||||||
|
|
||||||
|
|
||||||
|
Summary: Additional features for dovecot on SME Server |
||||||
|
Name: %{name} |
||||||
|
Version: %{version} |
||||||
|
Release: %{release}%{?dist} |
||||||
|
License: GPL |
||||||
|
Group: Networking/Daemons |
||||||
|
Source: %{name}-%{version}.tar.gz |
||||||
|
|
||||||
|
BuildRoot: /var/tmp/%{name}-%{version}-%{release}-buildroot |
||||||
|
BuildArchitectures: noarch |
||||||
|
BuildRequires: e-smith-devtools |
||||||
|
|
||||||
|
Requires: smeserver-dovecot |
||||||
|
Requires: dovecot-pigeonhole |
||||||
|
Requires: acl |
||||||
|
|
||||||
|
%description |
||||||
|
Add IMAP acl (sharedmailbox) and sieve capabilities to the IMAP server |
||||||
|
|
||||||
|
%changelog |
||||||
|
* Tue Nov 29 2011 Daniel Berteaud <daniel@firewall-services.com> - 0.0.1 |
||||||
|
- initial release |
||||||
|
|
||||||
|
%prep |
||||||
|
%setup -q -n %{name}-%{version} |
||||||
|
|
||||||
|
%build |
||||||
|
perl createlinks |
||||||
|
|
||||||
|
%install |
||||||
|
/bin/rm -rf $RPM_BUILD_ROOT |
||||||
|
(cd root ; /usr/bin/find . -depth -print | /bin/cpio -dump $RPM_BUILD_ROOT) |
||||||
|
/bin/rm -f %{name}-%{version}-filelist |
||||||
|
/sbin/e-smith/genfilelist $RPM_BUILD_ROOT \ |
||||||
|
--dir /home/e-smith/db/dovecot '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)' \ |
||||||
|
> %{name}-%{version}-filelist |
||||||
|
|
||||||
|
%files -f %{name}-%{version}-filelist |
||||||
|
%defattr(-,root,root) |
||||||
|
|
||||||
|
%clean |
||||||
|
rm -rf $RPM_BUILD_ROOT |
||||||
|
|
||||||
|
%pre |
||||||
|
/usr/sbin/groupadd -g 439 sharedmailbox 2> /dev/null || : |
||||||
|
|
||||||
|
%post |
||||||
|
# Migrate the sharedmailbox dict to its new location |
||||||
|
if [ -e /etc/dovecot/sharedmailbox/dict.db ]; then |
||||||
|
mv -f /etc/dovecot/sharedmailbox/dict.db /home/e-smith/db/dovecot/sharedmailbox.db |
||||||
|
rm -rf /etc/dovecot/sharedmailbox |
||||||
|
fi |
||||||
|
|
||||||
|
%preun |
||||||
|
|
Loading…
Reference in new issue