source: LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Group.pm @ 162

Last change on this file since 162 was 162, checked in by nanardon, 15 years ago
  • rename column
  • Property svn:keywords set to Id Rev
File size: 3.7 KB
Line 
1package LATMOS::Accounts::Bases::Sql::Group;
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 { 'group' }
40
41sub key_field { 'name' }
42
43sub has_extended_attributes { 1 }
44
45sub _inline_fields {
46    my ($self, $for, $base) = @_;
47
48    my %fields = (
49        %{ $self->_initial_fields($for, $base) },
50        memberUID       => 'memberUID',
51        member          => 'member',
52        gidNumber       => 'gidnumber',
53        $for !~ /w/ ? (
54            sAMAccountName  => 'name',
55            groupname => 'name',
56        ) : (),
57    );
58    \%fields;
59}
60
61sub _delayed_fields {
62    my ($self)= @_;
63    return qw(memberUID member);
64}
65
66sub get_field {
67    my ($self, $field) = @_;
68    for ($field) {
69        /^(member|memberUID)$/ and do {
70            my $sth = $self->db->prepare_cached(
71                q{
72                select id from user_attributes_groups
73                join user_attributes_list on
74                user_attributes_groups.attr = user_attributes_list.ikey
75                where value = ? and canonical = ?
76                }
77            );
78            $sth->execute($self->id, 'memberOf');
79            my @res;
80            while (my $res = $sth->fetchrow_hashref) {
81                push(@res, $res->{id});
82            }
83            return \@res;
84        };
85    }
86    $self->SUPER::get_field($field);
87}
88
89sub set_fields {
90    my ($self, %data) = @_;
91    my %fdata;
92    foreach my $attr (keys %data) {
93        $attr =~ /^memberUID$/ and do {
94            my $cl = $self->base->_load_obj_class('user') or next;
95            my $attrid = $cl->_get_field_name_db('memberOf', $self->base) or next;
96            my %member;
97            foreach (@{ $self->get_field('memberUID') }) {
98                $member{$_}{c} = 1;
99            }
100            foreach (@{ $data{$attr} || []}) {
101                $member{$_}{n} = 1;
102            }
103
104            foreach (keys %member) {
105                $member{$_}{c} && $member{$_}{n} and next; # no change !
106                my $user = $self->base->get_object('user', $_) or next;
107                if ($member{$_}{n}) {
108                    my $sth = $self->db->prepare_cached(
109                        q{insert into user_attributes_groups (id, attr, value) values (?,?,?)}
110                    );
111                    $sth->execute($_, $attrid, $self->id);
112                } elsif ($member{$_}{c}) {
113                    my $sth = $self->db->prepare_cached(
114                        q{delete from user_attributes_groups where id = ? and attr = ? and value = ?}
115                    );
116                    $sth->execute($_, $attrid, $self->id);
117                } # else {} # can't happend
118            }
119            next;
120        };
121        $fdata{$attr} = $data{$attr};
122    }
123    if (keys %fdata) {
124        $self->SUPER::set_fields(%fdata);
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.