diff options
| author | Leif Johansson <leifj@sunet.se> | 2011-01-26 14:42:17 +0100 |
|---|---|---|
| committer | Leif Johansson <leifj@sunet.se> | 2011-01-26 14:42:17 +0100 |
| commit | 4a19966c3bb9f7dce1cca158163d583a33458723 (patch) | |
| tree | bbe55f7b708c52011052c9bf9afdddc6be4a9755 /LDAPShell | |
import
Diffstat (limited to 'LDAPShell')
| -rwxr-xr-x | LDAPShell/CVS/Entries | 2 | ||||
| -rwxr-xr-x | LDAPShell/CVS/Repository | 1 | ||||
| -rwxr-xr-x | LDAPShell/CVS/Root | 1 | ||||
| -rwxr-xr-x | LDAPShell/Callbacks.pm | 180 |
4 files changed, 184 insertions, 0 deletions
diff --git a/LDAPShell/CVS/Entries b/LDAPShell/CVS/Entries new file mode 100755 index 0000000..f58e41c --- /dev/null +++ b/LDAPShell/CVS/Entries @@ -0,0 +1,2 @@ +/Callbacks.pm/1.1.1.1/Mon Feb 17 22:14:12 2003// +D diff --git a/LDAPShell/CVS/Repository b/LDAPShell/CVS/Repository new file mode 100755 index 0000000..e12e473 --- /dev/null +++ b/LDAPShell/CVS/Repository @@ -0,0 +1 @@ +LDAPShell/LDAPShell diff --git a/LDAPShell/CVS/Root b/LDAPShell/CVS/Root new file mode 100755 index 0000000..1c43cd7 --- /dev/null +++ b/LDAPShell/CVS/Root @@ -0,0 +1 @@ +:ext:leifj@cvs.it.su.se:/afs/su.se/services/cvs/public/cvsroot diff --git a/LDAPShell/Callbacks.pm b/LDAPShell/Callbacks.pm new file mode 100755 index 0000000..b4e60ba --- /dev/null +++ b/LDAPShell/Callbacks.pm @@ -0,0 +1,180 @@ +package LDAPShell::Callbacks; + +use Net::LDAP; + +@LDAPShell::Callbacks::ISA = qw(Exporter); +@LDAPShell::Callbacks::EXPORT = qw(check_global_uid_uniqueness + check_global_group_gid_uniqueness + check_global_group_cn_uniqueness + track_cn_and_displayname + track_mail + add_top_unless_present); + +sub new + { + my $self = shift; + my $class = ref $self || $self; + + bless {},$class; + } + +sub add_callbacks + { + my $self = shift; + my $entry = shift; + my $ldap = shift; + my @attrs = @{shift} || $entry->attributes; + + foreach my $attr (@attrs) + { + foreach my $cb (@{$self->{add}->{$attr}}) + { + &$cb($ldap,$attr,$entry,\@attrs); + } + foreach my $cb (@{$self->{any}->{$attr}}) + { + &$cb($ldap,$attr,$entry,\@attrs); + } + } + } + +sub modify_callbacks + { + my $self = shift; + my $entry = shift; + my $ldap = shift; + my @attrs = @{shift} || $entry->attributes; + + foreach my $attr (@attrs) + { + foreach my $cb (@{$self->{modify}->{$attr}}) + { + &$cb($ldap,$attr,$entry,\@attrs); + } + foreach my $cb (@{$self->{any}->{$attr}}) + { + &$cb($ldap,$attr,$entry,\@attrs); + } + } + } + +sub callback + { + my $self = shift; + my $attr = shift; + my $type = shift; + my $code = shift; + + die "Must be a CODE reference\n" unless ref $code eq 'CODE'; + + push(@{$self->{lc($type)}->{lc($attr)}},$code); + } + +sub check_global_uid_uniqueness + { + my $c = shift; + my $attr = shift; + my $entry = shift; + my $attrs = shift; + + return unless grep /(uid|userid)/is,@{$attrs}; + my $uid = $entry->get_value('uid'); + $uid = $entry->get_value('userid') unless $uid; + return unless $uid; + + my $res = $c->search(filter=>"uid=$uid",base=>'',attrs=>['uid']); + return if $res->code == LDAP_NO_SUCH_OBJECT; + $res->code && die "LDAP Error: ".$res->error."\n"; + my $e = $res->pop_entry; + return unless $e; + $e->dump(); + my $dn = $e->dn(); + die "The username \'$uid\' already exists: \"$dn\"\n"; + } + +sub check_global_group_cn_uniqueness + { + my $c = shift; + my $attr = shift; + my $entry = shift; + my $attrs = shift; + + return unless $c->isA($entry,'posixGroup'); + my $cn = $entry->get_value('cn'); + return unless $cn; + + my $res = $c->search(filter=>"(&(cn=$cn)(posixGroup))",base=>'',scope=>'sub',attrs=>['cn']); + return if $res->code == LDAP_NO_SUCH_OBJECT; + $res->code && die "LDAP Error: ".$res->error."\n"; + my $e = $res->pop_entry; + return unless $e; + my $dn = $e->dn(); + die "The group \'$cn\' already exists: \"$dn\"\n"; + } + +sub check_global_group_gid_uniqueness + { + my $c = shift; + my $attr = shift; + my $entry = shift; + my $attrs = shift; + + return unless $c->isA($e,'posixGroup'); + my $gidNumber = $entry->get_value('gidNumber'); + return unless $gidNumber; + + my $res = $c->search(filter=>"(&(gidNumber=$gidNumber)(posixGroup))",base=>'',scope=>'sub',attrs=>['cn']); + return if $res->code == LDAP_NO_SUCH_OBJECT; + $res->code && die "LDAP Error: ".$res->error."\n"; + my $e = $res->pop_entry; + return unless $e; + my $dn = $e->dn(); + die "The group with GID \'$gidNumber\' already exists: \"$dn\"\n"; + } + +sub track_cn_and_displayname + { + my $c = shift; + my $attr = shift; + my $entry = shift; + my $attrs = shift; + + return unless $c->isA($entry,'inetOrgPerson'); + return unless grep /sn/is,@{$attrs}; + return unless grep /givenName/is,@{$attrs}; + + my $sn = $entry->get_value('sn'); + my $givenName = $entry->get_value('givenName'); + return unless $sn && $givenName; + + my $cn = "$givenName $sn"; + $entry->replace(cn=>$cn); + $entry->replace(displayName=>$cn); + } + +sub track_mail + { + my $c = shift; + my $attr = shift; + my $entry = shift; + my $attrs = shift; + + return unless $c->isA($entry,'inetOrgPerson'); + my $uid = $entry->get_value('uid'); + my $domain = $c->domainOf($entry); + return unless $uid && $domain; + $entry->add(mail=>"$uid\@$domain") + unless grep /$uid\@$domain/is,$entry->get_value('mail'); + } + +sub add_top_unless_present + { + my $c = shift; + my $attr = shift; + my $entry = shift; + my $attrs = shift; + + my @oc = $entry->get_value('objectClass'); + push(@oc,'top') unless grep /top/is,@oc; + $entry->replace(objectClass=>\@oc); + } |
