1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
|
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<< <guilhem at fripost.org> >>
=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__
|