From 0467c0a622c5aa0b2b63615b2b36f31f4272bcd1 Mon Sep 17 00:00:00 2001 From: Guilhem Moulin Date: Wed, 18 Apr 2012 02:06:01 +0200 Subject: Implemented the changes on the LDAP schema. --- lib/Fripost/Schema.pm | 225 ++++++-------------------------------------------- 1 file changed, 23 insertions(+), 202 deletions(-) (limited to 'lib/Fripost/Schema.pm') diff --git a/lib/Fripost/Schema.pm b/lib/Fripost/Schema.pm index 5b57cd3..22c6064 100755 --- a/lib/Fripost/Schema.pm +++ b/lib/Fripost/Schema.pm @@ -6,6 +6,9 @@ use strict; use Fripost::Schema::Search; use Fripost::Schema::Type; +use Fripost::Schema::Type::User; +use Fripost::Schema::Type::Domain; +use Fripost::Schema::Type::Alias; use base qw/Net::LDAP/; our $VERSION = '0.01'; @@ -55,13 +58,13 @@ sub search { my $self = shift; my $res; if ( $self->{_type} == MAILBOX ) { - $res = $self->_searchUser(@_) + $res = $self->Fripost::Schema::Type::User::search(@_) } elsif ( $self->{_type} == DOMAIN ) { - $res = $self->_searchDomain(@_) + $res = $self->Fripost::Schema::Type::Domain::search(@_) } elsif ( $self->{_type} == ALIAS ) { - $res = $self->_searchAlias(@_) + $res = $self->Fripost::Schema::Type::Alias::search(@_) } else { die "Something weird happened. Please report." @@ -72,230 +75,46 @@ sub search { } -# Add. sub add { my $self = shift; if ( $self->{_type} == MAILBOX ) { - $self->_addUser(@_) + $self->Fripost::Schema::Type::User::add(@_) } elsif ( $self->{_type} == DOMAIN ) { - $self->_addDomain(@_) + $self->Fripost::Schema::Type::Domain::add(@_) } elsif ( $self->{_type} == ALIAS ) { - $self->_addAlias(@_) + $self->Fripost::Schema::Type::Alias::add(@_) } else { - die "Something weird happened. Please report." - } -} - - -# Disconnect to the LDAP server. -sub unbind { - $_[0]->{_ldap}->unbind(); -} - - -####################################################################### -# Search - -# Search a user, and return the corresponding entries if found. If no -# user is given, returns all users. -sub _searchUser { - my $self = shift; - - my $base = join ',', ('ou=mailboxes',$self->{_options}->{base_dn}); - my $filter = "(ObjectClass=virtualMailbox)"; - - $filter = "(&" .$filter. "(uid=" .$_[0]. ")" .")" - if defined $_[0]; - - my $res = $self->{_ldap}->search( - base => $base, - scope => 'one', - attrs => [ 'uid', 'gn' , 'sn', 'maildir', 'isActive' ], - filter => $filter - ); - die "Error: " .$res->error. "\n" if $res->code; - - return $res; -} - - -# Search a domain, and return the corresponding entries if found. If no -# domain is given, returns all domains. If the given domain has a -# defined owner, scope the search for this very owner only. If the -# owner is undefined, but still exists, scope the search to the "global" -# domains only. -sub _searchDomain { - my $self = shift; - - my $base = $self->{_options}->{base_dn}; - if (exists $_[0]->{owner}) { - if (defined $_[0]->{owner}) { - $base = join ',', ('uid='.$_[0]->{owner},'ou=mailboxes',$base); - } - else { - $base = join ',', ('ou=domains',$base); - } + die "Something weird happened. Please report."; } - - my $filter = '(ObjectClass=virtualDomain)'; - $filter = "(&" .$filter. "(dc=" .$_[0]->{domain}. ")" .")" - if defined $_[0]->{domain}; - - my $res = $self->{_ldap}->search( - base => $base, - scope => 'subtree', - attrs => [ 'dc', 'isActive' ], - filter => $filter - ); - die "Error: " .$res->error. "\n" if $res->code; - - return $res; } -# Search an alias, and return the corresponding entries if found. If no -# alias is given, returns all aliases. If the given alias has a -# defined owner, scope the search for this very owner only. If the -# owner is undefined, but still exists, scope the search to the "global" -# domains only. -sub _searchAlias { +sub password { my $self = shift; - - my $base = $self->{_options}->{base_dn}; - if (exists $_[0]->{owner}) { - if (defined $_[0]->{owner}) { - $base = join ',', ('uid='.$_[0]->{owner},'ou=mailboxes',$base); - } - else { - $base = join ',', ('ou=domains',$base); - } - } - $base = 'dc=' .$_[0]->{domain}. ',' .$base - if (exists $_[0]->{owner}) and (defined $_[0]->{domain}); - - my @filters = '(ObjectClass=virtualAliases)'; - push @filters, '(mailLocalAddress=' .$_[0]->{address}. ')' - if defined $_[0]->{address}; - push @filters, '(mailTarget=' .$_[0]->{goto}. ')' - if defined $_[0]->{goto}; - - my $filter; - if ($#filters == 0 ) { - $filter = $filters[0]; + if ( $self->{_type} == MAILBOX ) { + $self->Fripost::Schema::Type::User::pwd(@_); } - elsif ($#filters > 0) { - $filter = '(&' . (join '', @filters) . ')'; + elsif ( $self->{_type} == DOMAIN ) { + die "Cannot change the password of a domain."; } - - my $res = $self->{_ldap}->search( - base => $base, - scope => 'subtree', - attrs => [ 'mailLocalAddress', 'mailTarget', 'isActive' ], - filter => $filter - ); - die "Error: " .$res->error. "\n" if $res->code; - - return $res; -} - - - -####################################################################### -# Add - -# Add a user -sub _addUser { - my $self = shift; - my $user = shift; - - my $base = join ',', ('ou=mailboxes',$self->{_options}->{base_dn}); - - my $res = $self->{_ldap}->add( 'uid=' .$user->{username}. ',' .$base, - attrs => [ uid => $user->{username}, - objectClass => [ 'top', 'virtualMailbox' ], - userPassword => $user->{userPassword}, - maildir => $user->{maildir}, - isActive => $user->{isActive} - ] - ); - die "Error: " .$res->error. "\n" if $res->code; - return $res; -} - - -# Add a domain. -sub _addDomain { - my $self = shift; - my $domain = shift; - - my $base = $self->{_options}->{base_dn}; - if (defined $domain->{owner}) { - $base = join ',', ('uid=' .$domain->{owner},'ou=mailboxes',$base) + elsif ( $self->{_type} == ALIAS ) { + die "Cannot change the password of an alias."; } else { - $base = join ',', ('ou=domains',$base); + die "Something weird happened. Please report."; } - - my $res = $self->{_ldap}->add( 'dc=' .$domain->{domain}. ',' .$base, - attrs => [ dc => $domain->{domain}, - objectClass => [ 'top', 'virtualDomain' ], - isActive => $domain->{isActive} - ] - ); - die "Error: " .$res->error. "\n" if $res->code; - return $res; } -# Add an alias -sub _addAlias { - my $self = shift; - my $alias = shift; - - # TODO: detect cycles - die "Error: Cannot create alias `" .$alias->{address}. - "' targetting to itself.\n" - if $alias->{address} eq $alias->{goto}; - - my $base = $self->{_options}->{base_dn}; - if (defined $alias->{owner}) { - $base = join ',', ('uid=' .$alias->{owner},'ou=mailboxes',$base) - } - else { - $base = join ',', ('ou=domains',$base); - } - $base = 'mailTarget='.$alias->{goto}. - ','.'dc='. (split /\@/, $alias->{address}, 2)[1]. - ','.$base; - - my @attrs = ( mailLocalAddress => $alias->{address} - , isActive => $alias->{isActive} ); - my $res; - if ($self->_searchAlias($alias)->count) { - $res = $self->{_ldap}->modify( $base, attrs => [ @attrs ] ); - } - else { - $res = $self->{_ldap}->add( $base, - attrs => [ mailTarget => $alias->{goto} - , objectClass => [ 'top', - 'inetLocalMailRecipient', - 'virtualAliases' ], - @attrs - ] - ); - } - die "Error: " .$res->error. "\n" if $res->code; - return $res; +# Disconnect to the LDAP server. +sub unbind { + $_[0]->{_ldap}->unbind(); } - -####################################################################### -# Miscellaneous - # Debug print. sub _dsay { my $self = shift; @@ -306,6 +125,8 @@ sub _dsay { } +####################################################################### + 1; =head1 NAME -- cgit v1.2.3