aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2019-07-02 10:53:09 +0200
committerSergey Poznyakoff <gray@gnu.org.ua>2019-07-02 10:56:35 +0200
commitd1800cee2fa13ad4de85416e47648ae9a04e71cb (patch)
tree6f01847024874869b57081325e9f9dae3405b532
parent8a2f15b9143a1d2a913b018ff9bb7fdddaf35afe (diff)
downloadsavane-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_mailman29
-rw-r--r--lib/Savane/Conf.pm6
-rw-r--r--lib/Savane/LDAP.pm39
-rw-r--r--lib/Savane/LDAP/Base.pm5
-rw-r--r--lib/Savane/LDAP/Map.pm2
-rw-r--r--lib/Savane/LDAP/alias.pm30
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;

Return to:

Send suggestions and report system problems to the System administrator.