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

Last change on this file since 64 was 64, checked in by nanardon, 15 years ago
  • Property svn:keywords set to Id Rev
File size: 4.2 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 set_fields {
102    my ($self, %fields) = @_;
103
104    foreach (keys %fields) {
105        $self->get_field_name($_, 'w') or return;
106        $self->{entry}->replace($_, $fields{$_});
107    }
108   
109    my $mesg = $self->{entry}->update($self->base->ldap);
110
111    if ($mesg->code) {
112        warn $mesg->error;
113        return;
114    } else { return 1 }
115}
116
117sub get_group_users {
118    my ($self, $groupname, @searchargs) = @_;
119    my $gr = $self->get_group($groupname, attrs => [ qw(cn member) ]);
120
121    my @res;
122    foreach my $dnu (@{ $gr->get_value('member', asref => 1) || [] }) {
123        my $mesg = $self->search(
124            filter => '(objectClass=*)', # TODO can we get something else than user ?
125            @searchargs,
126            base => $dnu,
127        );
128
129        $mesg->code and return; # ensure error is propagate here
130        foreach my $entry ($mesg->entries) {
131           push(@res, $entry);
132       } 
133    }
134    @res
135}
136
137sub get_user_groups {
138    my ($self, $username, @searchargs) = @_;
139    my $user = $self->get_user($username);
140
141    my @res;
142    $self->unlimited_search(
143        base => $self->top_dn,
144        filter => sprintf(
145            '(&(objectClass=group)(member=%s))',
146            escape_filter_value($user->dn),
147        ),
148        @searchargs,
149        callback => sub {
150            my ($mesg, $entry) = @_;
151            ref $entry eq 'Net::LDAP::Entry' or return;
152            push(@res, $entry);
153        },
154    );
155
156    @res
157}
158
159sub add_user_group {
160    my ($self, $username, $groupname) = @_;
161
162    my $user = $self->get_user($username) or return;
163    my $group = $self->get_group($groupname) or return;
164
165    $group->add(member => $user->dn);
166
167    my $mesg = $group->update($self);
168    if ($mesg->code) {
169        warn $mesg->error;
170        return;
171    } else { return 1 };
172}
173
1741;
175
176__END__
177
178=head1 SEE ALSO
179
180=head1 AUTHOR
181
182Olivier Thauvin, E<lt>olivier.thauvin@aerov.jussieu.frE<gt>
183
184=head1 COPYRIGHT AND LICENSE
185
186Copyright (C) 2008 CNRS SA/CETP/LATMOS
187
188This library is free software; you can redistribute it and/or modify
189it under the same terms as Perl itself, either Perl version 5.10.0 or,
190at your option, any later version of Perl 5 you may have available.
191
192
193=cut
Note: See TracBrowser for help on using the repository browser.