source: LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/User.pm @ 89

Last change on this file since 89 was 89, checked in by nanardon, 15 years ago
  • SQL support memberOf attribute
  • Property svn:keywords set to Id Rev
File size: 3.6 KB
Line 
1package LATMOS::Accounts::Bases::Sql::User;
2
3use 5.010000;
4use strict;
5use warnings;
6
7use base qw(LATMOS::Accounts::Bases::Sql::objects);
8
9our $VERSION = (q$Rev$ =~ /^Rev: (\d+) /)[0];
10
11=head1 NAME
12
13LATMOS::Ad - Perl extension for blah blah blah
14
15=head1 SYNOPSIS
16
17  use LATMOS::Accounts::Bases;
18  my $base = LATMOS::Accounts::Bases->new('sql');
19  ...
20
21=head1 DESCRIPTION
22
23Account base access over standard unix file format.
24
25=head1 FUNCTIONS
26
27=cut
28
29=head2 new(%options)
30
31Create a new LATMOS::Ad object for windows AD $domain.
32
33domain / server: either the Ad domain or directly the server
34
35ldap_args is an optionnal list of arguments to pass to L<Net::LDAP>.
36
37=cut
38
39sub object_table { 'user' }
40
41sub key_field { 'login' }
42
43sub has_extended_attributes { 1 }
44
45sub _inline_fields {
46    my ($self, $for) = @_;
47    my %fields = (
48        uidNumber       => 'uid',
49        gidNumber       => 'gid',
50        memberOf        => 'memberOf',
51        (($for !~ /w/)
52        ? (
53            gecos        => 'gecos',
54            sAMAccountName  => 'sAMAccountName',
55            uid          => 'login',
56        )
57        : ()),
58    );
59    \%fields
60}
61
62sub get_field {
63    my ($self, $field) = @_;
64    if ($field eq 'gecos') {
65        return join(' ', map { $_ || '' } ($self->get_c_field('givenName'), ($self->get_c_field('sn'))));
66    } elsif ($field =~ /^(sAMAccountName|login)$/) {
67        return $self->id,
68    } elsif ($field eq 'memberOf') {
69        my $sth = $self->db->prepare_cached(
70            q{
71            select groupname from users_groups join "user"
72            on users_groups.uid = "user".uid join
73            "group" on "group".gid = users_groups.gid
74            where "user".login = ? order by groupname
75            }
76        );
77        $sth->execute($self->id);
78        my @res;
79        while (my $res = $sth->fetchrow_hashref) {
80            push(@res, $res->{groupname});
81        }
82        return \@res;
83    } else {
84        return $self->SUPER::get_field($field);
85    }
86}
87
88sub set_fields {
89    my ($self, %data) = @_;
90    my %fdata;
91    foreach my $attr (keys %data) {
92        $attr =~ /^memberOf$/ and do {
93            my $uid = $self->get_field('uid') or next;
94            my %member;
95            foreach (@{ $self->get_field('memberOf') }) {
96                $member{$_}{c} = 1;
97            }
98            foreach (@{ $data{$attr} || []}) {
99                $member{$_}{n} = 1;
100            }
101
102            foreach (keys %member) {
103                $member{$_}{c} && $member{$_}{n} and next; # no change !
104                my $group = $self->base->get_object('group', $_) or next;
105                my $gid = $group->get_field('gid') or next;
106                if ($member{$_}{n}) {
107                    my $sth = $self->db->prepare_cached(
108                        q{insert into users_groups (uid, gid) values (?,?)}
109                    );
110                    $sth->execute($uid, $gid);
111                } elsif ($member{$_}{c}) {
112                    my $sth = $self->db->prepare_cached(
113                        q{delete from users_groups where uid = ? and gid = ?}
114                    );
115                    $sth->execute($uid, $gid);
116                } # else {} # can't happend
117            }
118            next;
119        };
120        $fdata{$attr} = $data{$attr};
121    }
122    if (keys %fdata) {
123        $self->SUPER::set_fields(%fdata);
124    }
125}
126
127
1281;
129
130__END__
131
132=head1 SEE ALSO
133
134=head1 AUTHOR
135
136Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
137
138=head1 COPYRIGHT AND LICENSE
139
140Copyright (C) 2008, 2009 CNRS SA/CETP/LATMOS
141
142This library is free software; you can redistribute it and/or modify
143it under the same terms as Perl itself, either Perl version 5.10.0 or,
144at your option, any later version of Perl 5 you may have available.
145
146
147=cut
Note: See TracBrowser for help on using the repository browser.