source: trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Ldap/Group.pm @ 1904

Last change on this file since 1904 was 1865, checked in by nanardon, 8 years ago

Merge branch

File size: 3.5 KB
Line 
1package LATMOS::Accounts::Bases::Ldap::Group;
2
3use 5.010000;
4use strict;
5use warnings;
6
7use base qw(LATMOS::Accounts::Bases::Ldap::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 );
13use LATMOS::Accounts::Log;
14
15our $VERSION = (q$Rev: 649 $ =~ /^Rev: (\d+) /)[0];
16
17=head1 NAME
18
19LATMOS::Ldap - Perl extension for blah blah blah
20
21=head1 SYNOPSIS
22
23  use LATMOS::Ldap;
24  blah blah blah
25
26=head1 DESCRIPTION
27
28Stub documentation for LATMOS::Ldap, created by h2xs. It looks like the
29author of the extension was negligent enough to leave the stub
30unedited.
31
32Blah blah blah.
33
34=head1 FUNCTIONS
35
36=cut
37
38sub _class_filter { '(ObjectClass=posixGroup)' }
39
40sub _key_attr { 'cn' } 
41
42sub _my_ldap_classes { qw(top posixGroup) }
43
44sub _get_attr_schema {
45    my ($class, $base) = @_;
46    $class->SUPER::_get_attr_schema($base,
47    {
48        gidNumber => { uniq => 1, },
49        description => { },
50        memberUID => { multiple => 1, delayed => 1, },
51        cn => { ro => 1 },
52        dn => { ro => 1 },
53        objectClass => { ro => 1 },
54    }
55    );
56}
57
58sub _create {
59    my ($class, $base, $id, %data) = @_;
60
61    my $entry = Net::LDAP::Entry->new();
62
63    $entry->dn(join(',',
64        sprintf('%s=%s',
65            $class->_dn_attribute($base),
66            escape_filter_value($id)),
67            $base->object_base_dn($class->type),
68    ));
69    $entry->replace(objectClass => [ $class->_my_ldap_classes ],);
70    my %delayed;
71    $data{$class->_key_attribute($base)} = $id;
72    foreach (keys %data) {
73        /^(memberUID)$/ and do {
74            $delayed{memberUID} = $data{$_};
75            next;
76        };
77        $class->_populate_entry($entry, $_, $data{$_});
78    }
79    my $msg = $base->ldap->add($entry);
80    $base->log(LA_ERR, "Cannot create group: %s", $msg->error) if ($msg->code);
81    return if ($msg->code);
82    if (! keys %delayed) { return 1 };
83    my $res = $base->get_object('group', $id)->set_fields(%delayed);
84    return defined($res) ? 1 : 0;
85}
86
87sub get_field {
88    my ($self, $field) = @_;
89
90    $field eq 'memberUID' and do {
91        my $val = $self->SUPER::get_field('memberUid');
92        return ref $val ? $val : [ grep { $_ } $val ];
93    };
94    $self->SUPER::get_field($field);
95}
96
97sub set_fields {
98    my ($self, %data) = @_;
99    my %ndata;
100    while (my ($f, $val) = each(%data)) {
101        $f eq 'memberUID' and do {
102            $val = [ $val ] unless(ref $val);
103            my %users;
104            $users{$_}{e} = 1 foreach (@{ $self->get_field('memberUID') || []});
105            $users{$_}{n} = 1 foreach (@{ $val || []});
106            foreach (keys %users) {
107                $users{$_}{e} && $users{$_}{n} and next;
108                if ($users{$_}{e}) {
109                    $self->{entry}->delete(memberUid => $_);
110                } elsif ($users{$_}{n} && $self->base->get_object('user', $_)) {
111                    $self->{entry}->add(memberUid => $_);
112                } # else {} # can't happen
113                my $mesg = $self->{entry}->update($self->base->ldap);
114            }
115            next;
116        };
117        $ndata{$f} = $val;
118    }
119    $self->SUPER::set_fields(%ndata);
120}
121
1221;
123
124__END__
125
126=head1 SEE ALSO
127
128=head1 AUTHOR
129
130Olivier Thauvin, E<lt>olivier.thauvin@aerov.jussieu.frE<gt>
131
132=head1 COPYRIGHT AND LICENSE
133
134Copyright (C) 2008 CNRS SA/CETP/LATMOS
135
136This library is free software; you can redistribute it and/or modify
137it under the same terms as Perl itself, either Perl version 5.10.0 or,
138at your option, any later version of Perl 5 you may have available.
139
140
141=cut
Note: See TracBrowser for help on using the repository browser.