diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2019-07-02 10:53:09 +0200 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2019-07-02 10:56:35 +0200 |
commit | d1800cee2fa13ad4de85416e47648ae9a04e71cb (patch) | |
tree | 6f01847024874869b57081325e9f9dae3405b532 | |
parent | 8a2f15b9143a1d2a913b018ff9bb7fdddaf35afe (diff) | |
download | savane-gray-d1800cee2fa13ad4de85416e47648ae9a04e71cb.tar.gz savane-gray-d1800cee2fa13ad4de85416e47648ae9a04e71cb.tar.bz2 |
Introduce alias map.
* backend/mail/sv_mailman: Minor changes.
* lib/Savane/Conf.pm: New variables: mailman_bin_dir and
mailman_command.
* lib/Savane/LDAP.pm (new): Add alias support.
* lib/Savane/LDAP/Base.pm (import): Fill in passwd attribute only if it
is supported.
* lib/Savane/LDAP/Map.pm: Fix typo.
* lib/Savane/LDAP/alias.pm: New file.
-rw-r--r-- | backend/mail/sv_mailman | 29 | ||||
-rw-r--r-- | lib/Savane/Conf.pm | 6 | ||||
-rw-r--r-- | lib/Savane/LDAP.pm | 39 | ||||
-rw-r--r-- | lib/Savane/LDAP/Base.pm | 5 | ||||
-rw-r--r-- | lib/Savane/LDAP/Map.pm | 2 | ||||
-rw-r--r-- | lib/Savane/LDAP/alias.pm | 30 |
6 files changed, 89 insertions, 22 deletions
diff --git a/backend/mail/sv_mailman b/backend/mail/sv_mailman index 97156bb..d28f7bb 100644 --- a/backend/mail/sv_mailman +++ b/backend/mail/sv_mailman @@ -33,12 +33,17 @@ use feature 'state'; use Symbol qw(gensym); my $sys_cron_mailman = GetConf('backend.sv_mailman.cron'); -my $sys_mailman_user = GetConf('backend.sv_mailman.user'); -my $sys_mailman_dir = GetConf('backend.sv_mailman.mailman_dir'); -my $sys_mailman_list_dir = GetConf('backend.sv_mailman.list_dir'); -my $sys_mailman_archive_dir = GetConf('backend.sv_mailman.archive_dir'); +my $sys_mailman_user = GetConf('backend.sv_mailman.user') + or abend(EX_CONFIG, 'backend.sv_mailman.user not set'); +my $sys_mailman_dir = GetConf('backend.sv_mailman.mailman_dir') + or abend(EX_CONFIG, 'backend.sv_mailman.mailman_dir not set'); +my $sys_mailman_list_dir = GetConf('backend.sv_mailman.list_dir') + or abend(EX_CONFIG, 'backend.sv_mailman.list_dir not set'); +my $sys_mailman_archive_dir = GetConf('backend.sv_mailman.archive_dir') + or abend(EX_CONFIG, 'backend.sv_mailman.archive_dir not set'); +my $sys_mail_domain = GetConf('mail.mail_domain') + or abend(EX_CONFIG, 'mail.mail_domain not set'); my $sys_mail_aliases = GetConf('backend.sv_aliases.alias_file'); -my $sys_mail_domain = GetConf('mail.mail_domain'); my $sys_mail_rebuild = GetConf('backend.sv_aliases.rebuild_command'); my $sys_mailman_keep_archives = GetConf('backend.sv_mailman.keep_archives'); my $sys_mailman_directory_file = GetConf('backend.sv_mailman.directory_file'); @@ -279,20 +284,6 @@ backend_setup(descr => "maintain Mailman mailing lists in sync with the Savane d }, cron => $sys_cron_mailman); -my $ret = EX_OK; -foreach my $var ('sys_cron_mailman', - 'sys_mailman_user', - 'sys_mailman_dir', - 'sys_mailman_list_dir', - 'sys_mailman_archive_dir', - 'sys_mail_domain') { - unless (eval "defined(\$$var)") { - logit('err', "\$$var undefined"); - $ret = EX_CONFIG; - } -} -exit($ret) unless $ret == EX_OK; - my (undef,undef,$uid,$gid) = getpwnam($sys_mailman_user) or abend(EX_NOUSER, "no such user: $sys_mailman_user"); diff --git a/lib/Savane/Conf.pm b/lib/Savane/Conf.pm index 26a4702..d10dc44 100644 --- a/lib/Savane/Conf.pm +++ b/lib/Savane/Conf.pm @@ -567,6 +567,9 @@ my %keywords = ( check => \&check_dir, oldvar => '$sys_mailman_dir' }, + mailman_bin_dir => { + check => \&check_dir + }, list_dir => { check => \&check_dir, oldvar => '$sys_mailman_list_dir' @@ -586,7 +589,8 @@ my %keywords = ( }, directory_file => { oldvar => '$sys_mailman_directory_file' - } + }, + mailman_command => 1 } }, sv_spamchecker => { diff --git a/lib/Savane/LDAP.pm b/lib/Savane/LDAP.pm index b97fb25..c1b70b5 100644 --- a/lib/Savane/LDAP.pm +++ b/lib/Savane/LDAP.pm @@ -5,6 +5,7 @@ use Net::LDAP; use Savane::LDAP::Config; use Savane::LDAP::pwent; use Savane::LDAP::grent; +use Savane::LDAP::alias; use Savane::LDAP::Map; use Carp; @@ -33,6 +34,9 @@ sub new { $opt{savane_membership_filter} ||= q{(&(objectclass=posixGroup)(memberUid=$arg))}; $opt{savane_account_object} ||= [ 'posixAccount', 'device', 'ldapPublicKey' ]; $opt{savane_group_object} ||= [ 'posixGroup' ]; + + $opt{savane_getalias_filter} ||= q{(&(objectClass=nisMailAlias)(cn=$arg))}; + $opt{savane_alias_object} ||= [ 'nisMailAlias' ]; $self->{_cfg} = new Savane::LDAP::Config(%opt); $self->cfg->read($file) if $file; @@ -42,6 +46,9 @@ sub new { unless ($self->cfg->{savane_group_dn}) { $self->cfg->{savane_group_dn} = 'cn=$name,ou=group,'.$self->cfg->{base}; } + unless ($self->cfg->{savane_alias_dn}) { + $self->cfg->{savane_alias_dn} = 'cn=$name,ou=mail,'.$self->cfg->{base}; + } $self->{_ldap} = Net::LDAP->new($self->cfg->{uri}) or croak "unable to connect to LDAP server ".$self->cfg->{uri}.": $!"; @@ -359,6 +366,38 @@ sub user_names { $u ? @$u : () } $res->entries() } + +my %getalias_attr = ( + cn => 'name', + rfc822MailMember => 'mem' +); + +sub getalias { + my ($self, $name) = @_; + (my $filter = $self->cfg->{savane_getalias_filter}) + =~ s/(?<!\\)(\$(?:name|arg))/$name/g; + my $res = $self->ldap->search(base => $self->cfg->{base}, + filter => $filter, + attrs => [keys %getalias_attr]); + if ($res->code) { + warn "$filter: ".$res->error; + return undef + } + + if (my $entry = ($res->entries())[0]) { + return new Savane::LDAP::alias(dn => $entry->dn, + %{Savane::LDAP::Map + ->new(%getalias_attr) + ->map($entry)}); + } +} + +sub chalias { + my ($self, $ent) = @_; + $self->change($ent, \%getalias_attr, + $self->cfg->{savane_alias_dn}, + $self->cfg->{savane_alias_object}); +} 1; diff --git a/lib/Savane/LDAP/Base.pm b/lib/Savane/LDAP/Base.pm index f4e159e..90d6f41 100644 --- a/lib/Savane/LDAP/Base.pm +++ b/lib/Savane/LDAP/Base.pm @@ -10,7 +10,10 @@ sub import { my ($package, $filename, $line) = caller; * { $package . '::new' } = sub { my ($class, %ini) = @_; - my $self = bless { passwd => 'x' }, $class; + my $self = bless {}, $class; + if ($self->can('passwd')) { + $self->{passwd} = 'x'; + } while (my ($k,$v) = each %ini) { $self->${ \$k }($v); } diff --git a/lib/Savane/LDAP/Map.pm b/lib/Savane/LDAP/Map.pm index fe3bed0..55ab896 100644 --- a/lib/Savane/LDAP/Map.pm +++ b/lib/Savane/LDAP/Map.pm @@ -49,7 +49,7 @@ sub _toLDAP { $self->{$_} => $subset->{$_} } keys %$subset }; } else { - croak "map value musr be hash or array ref"; + croak "map value must be hash or array ref"; } } \%r diff --git a/lib/Savane/LDAP/alias.pm b/lib/Savane/LDAP/alias.pm new file mode 100644 index 0000000..2a0a442 --- /dev/null +++ b/lib/Savane/LDAP/alias.pm @@ -0,0 +1,30 @@ +package Savane::LDAP::alias; +use strict; +use warnings; +use Carp; +use Savane::LDAP::Base qw(name mem:ar); +use overload + '""' => sub { shift->as_string }; + +sub mem_add { + my $self = shift; + my $mem = $self->mem; + foreach my $name (@_) { + push @$mem, $name + unless grep { $_ eq $name } @$mem; + } + $self->mem($mem); +} + +sub mem_del { + my $self = shift; + my $mem = $self->mem; + foreach my $name (@_) { + foreach my $n (reverse grep { $mem->[$_] eq $name } (0 .. $#{$mem})) { + splice @$mem, $n, 1; + } + } + $self->mem($mem); +} + +1; |