package Fripost::Schema::Type::Domain; use 5.010_000; use warnings; use strict; use base qw/Net::LDAP/; our $VERSION = '0.01'; ####################################################################### # Search a domain, and return the corresponding entries if found. If no # domain is given, returns all domains. # Filters on values of both keys `domain' and `owner' (unless they are # undefined). sub search { my $self = shift; my ($base, $owner); $base = join ',', ('ou=domains',$self->{_options}->{base_dn}); $owner = join ',', ( 'uid='.$_[0]->{owner} , 'ou=mailboxes' , $self->{_options}->{base_dn} ) if defined $_[0]->{owner}; my @filters = ('(ObjectClass=virtualDomain)'); push @filters, "(dc=" .$_[0]->{domain}. ")" if defined $_[0]->{domain}; push @filters, "(owner=" .$owner. ")" if defined $_[0]->{owner}; my $filter; if ($#filters == 0) { $filter = $filters[0]; } elsif ($#filters > 0) { $filter = "(&" . (join '', @filters) . ")"; } my $res = $self->{_ldap}->search( base => $base, scope => 'one', attrs => [ 'dc', 'owner', 'isActive' ], filter => $filter ); die "Error: " .$res->error. "\n" if $res->code; return $res; } # Add the given domain. If it already exists, adds the new owner; Or # fails if the new domains is not self-manageable. sub add { my $self = shift; my $domain = shift; my ($base, $owner); $base = join ',', ( 'dc='.$domain->{domain} , 'ou=domains' , $self->{_options}->{base_dn} ); $owner = join ',', ( 'uid='.$domain->{owner} , 'ou=mailboxes' , $self->{_options}->{base_dn} ) if defined $domain->{owner}; my $res; if ($self->search({ domain => $domain->{domain} })->count) { die "Error: Cannot create self-managed domain `" .$domain->{domain}. "' since it already exists.\n" unless defined $domain->{owner}; $res = $self->{_ldap}->modify( $base, add => [ owner => $owner ] ); } else { my @attrs = ( dc => $domain->{domain}, , objectClass => [ 'top', 'virtualDomain' ], , isActive => $domain->{isActive} ); push @attrs, (owner => $owner) if defined $domain->{owner}; $res = $self->{_ldap}->add( $base, attrs => [ @attrs ] ); } die "Error: " .$res->error. "\n" if $res->code; return $res; } ####################################################################### 1; =head1 NAME Fripost::Schema::Type::Domain - =head1 AUTHOR Guilhem Moulin C<< >> =head1 COPYRIGHT Copyright 2012 Guilhem Moulin, all rights reserved. =head1 LICENSE This program is free software; you can redistribute it and/or modify it under the same terms as perl itself. =cut 1; # End of Domain.pm __END__