source: LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ad/objects.pm @ 69

Last change on this file since 69 was 69, checked in by nanardon, 15 years ago
  • Ad::Group, allow create
  • escape CN=
  • Property svn:keywords set to Id Rev
File size: 4.3 KB
Line 
1package LATMOS::Accounts::Bases::Ad::objects;
2
3use 5.010000;
4use strict;
5use warnings;
6
7use base qw(LATMOS::Accounts::Bases::Objects);
8use Net::LDAP;
9use Net::LDAP::Entry;
10use Net::LDAP::Control::Paged;
11use Net::LDAP::Constant qw( LDAP_CONTROL_PAGED ); 
12use Net::LDAP::Util     qw( escape_filter_value );
13
14our $VERSION = (q$Rev$ =~ /^Rev: (\d+) /)[0];
15
16=head1 NAME
17
18LATMOS::Ad - Perl extension for blah blah blah
19
20=head1 SYNOPSIS
21
22  use LATMOS::Ad;
23  blah blah blah
24
25=head1 DESCRIPTION
26
27Stub documentation for LATMOS::Ad, created by h2xs. It looks like the
28author of the extension was negligent enough to leave the stub
29unedited.
30
31Blah blah blah.
32
33=head1 FUNCTIONS
34
35=cut
36
37sub list {
38    my ($class, $base) = @_;
39   
40    my @uids;
41    eval {
42    my $xx = $base->_unlimited_search(
43        attrs => [ $class->_key_attr ],
44        base => $base->top_dn,
45        filter => $class->_class_filter,
46        callback => sub {
47            my ($mesg, $entry) = @_;
48            $mesg->code and die $mesg->error;
49            $entry or return;
50            ref $entry eq 'Net::LDAP::Entry' or return;
51            push(@uids, $entry->get_value( $class->_key_attr ));
52        },
53    );
54    };
55
56    return @uids;
57
58}
59
60sub _get_field_name {
61    my ($self, $field, $base, $for) = @_;
62
63    my %fields = map { $_ => 1 } $self->_canonical_fields($base, $for);
64
65    return $fields{$field} ? $field : undef;
66}
67
68sub new {
69    my ($class, $base, $uid) = @_;
70   
71    my $mesg = $base->ldap->search(
72        filter => sprintf(
73            '(&%s (%s=%s))',
74            $class->_class_filter,
75            $class->_key_attr,
76            escape_filter_value($uid),
77        ),
78        base => $base->top_dn,
79    );
80
81    $mesg->code and return;
82
83    my ($entry, @others) = $mesg->entries;
84
85    return if(@others); # we cannot have multiple entries...
86    return if (!$entry);
87    bless({ entry => $entry }, $class);
88}
89
90sub ldap {
91    return $_[0]->base->{_ldap};
92}
93
94sub get_field {
95    my ($self, $field) = @_;
96
97    $field eq 'dn' and return $self->{entry}->dn;
98    return $self->{entry}->get_value($field);
99}
100
101sub _populate_entry {
102    my ($self, $entry, $field, $value) = @_;
103    $entry->replace($field, $value);
104}
105
106sub set_fields {
107    my ($self, %fields) = @_;
108
109    foreach (keys %fields) {
110        $self->get_field_name($_, 'w') or return;
111        $self->_populate_entry($self->{entry}, $_, $fields{$_});
112    }
113   
114    my $mesg = $self->{entry}->update($self->base->ldap);
115
116    if ($mesg->code) {
117        warn $mesg->error;
118        return;
119    } else { return 1 }
120}
121
122sub get_group_users {
123    my ($self, $groupname, @searchargs) = @_;
124    my $gr = $self->get_group($groupname, attrs => [ qw(cn member) ]);
125
126    my @res;
127    foreach my $dnu (@{ $gr->get_value('member', asref => 1) || [] }) {
128        my $mesg = $self->search(
129            filter => '(objectClass=*)', # TODO can we get something else than user ?
130            @searchargs,
131            base => $dnu,
132        );
133
134        $mesg->code and return; # ensure error is propagate here
135        foreach my $entry ($mesg->entries) {
136           push(@res, $entry);
137       } 
138    }
139    @res
140}
141
142sub get_user_groups {
143    my ($self, $username, @searchargs) = @_;
144    my $user = $self->get_user($username);
145
146    my @res;
147    $self->unlimited_search(
148        base => $self->top_dn,
149        filter => sprintf(
150            '(&(objectClass=group)(member=%s))',
151            escape_filter_value($user->dn),
152        ),
153        @searchargs,
154        callback => sub {
155            my ($mesg, $entry) = @_;
156            ref $entry eq 'Net::LDAP::Entry' or return;
157            push(@res, $entry);
158        },
159    );
160
161    @res
162}
163
164sub add_user_group {
165    my ($self, $username, $groupname) = @_;
166
167    my $user = $self->get_user($username) or return;
168    my $group = $self->get_group($groupname) or return;
169
170    $group->add(member => $user->dn);
171
172    my $mesg = $group->update($self);
173    if ($mesg->code) {
174        warn $mesg->error;
175        return;
176    } else { return 1 };
177}
178
1791;
180
181__END__
182
183=head1 SEE ALSO
184
185=head1 AUTHOR
186
187Olivier Thauvin, E<lt>olivier.thauvin@aerov.jussieu.frE<gt>
188
189=head1 COPYRIGHT AND LICENSE
190
191Copyright (C) 2008 CNRS SA/CETP/LATMOS
192
193This library is free software; you can redistribute it and/or modify
194it under the same terms as Perl itself, either Perl version 5.10.0 or,
195at your option, any later version of Perl 5 you may have available.
196
197
198=cut
Note: See TracBrowser for help on using the repository browser.