source: trunk/LATMOS-Accounts-Web/lib/LATMOS/Accounts/Web/Controller/Users.pm @ 1088

Last change on this file since 1088 was 1088, checked in by nanardon, 12 years ago
  • various fixes introduce by filter patch
  • Property svn:keywords set to Id Rev
File size: 6.7 KB
Line 
1package LATMOS::Accounts::Web::Controller::Users;
2
3use strict;
4use warnings;
5use base 'Catalyst::Controller';
6
7=head1 NAME
8
9LATMOS::Accounts::Web::Controller::Users - Catalyst Controller
10
11=head1 DESCRIPTION
12
13Catalyst Controller.
14
15=head1 METHODS
16
17=cut
18
19
20=head2 index
21
22=cut
23
24sub index : Private {
25    my ( $self, $c ) = @_;
26
27    $c->stash->{ofilter} = $c->model('AttrFilter', 'user');
28    $c->stash->{page}{title} = "Liste des utilisateurs";
29}
30
31
32sub change_password : Private {
33    my ($self, $c, $username, $password) = @_;
34
35    my $base = $c->model('Accounts')->db;
36    $c->stash->{user} = $base->get_object('user', $username) or do {
37        $c->forward('/no_object');
38        return "Cannot get user object";
39    };
40
41    my $sync = $c->model('Accounts')->sync_access;
42
43    # This is widelly burk:
44    # synchaccess do not manage connect() at time, opening a
45    # backdoor then :\
46    foreach ($sync->bases) { $_->{_user} = $username }
47
48    my $suser = $sync->get_object('user', $username);
49    my $msg = $c->stash->{user}->check_password($password);
50    if ($msg ne 'ok') {
51        return $msg . ', mot de passe inchangé';
52    } elsif ($suser && $suser->_set_password($password)) {
53        $sync->commit;
54        return;
55    } else {
56        return 'Erreur lors du changement de mot de passe';
57    }
58}
59
60sub default : LocalPath {
61    my ( $self, $c, undef, $username, $subform, $arg ) = @_;
62
63    my $base = $c->model('Accounts')->db;
64
65    $c->stash->{page}{title} = "Utilisateur :: $username";
66    $c->stash->{username} = $username;
67    $c->stash->{user} = $base->get_object('user', $username) or do {
68        $c->forward('/no_object');
69        return;
70    };
71    $c->stash->{subform} = $subform || '';
72    $c->stash->{page}{title} = "Utilisateur :: $username";
73
74    if ($c->req->param('make_active')) {
75        $c->stash->{user}->set_c_fields('exported' => 1);
76        $base->commit;
77    }
78
79    for ($subform || '') {
80        # Exceptions...
81        /^passwd$/ and do {
82            $c->stash->{template} = 'users/passwd.tt';
83            if ($c->req->param('passwd')) {
84                if ($base->check_acl($c->stash->{user}, 'userPassword', 'w')) {
85                    if ($c->req->param('passwd') eq ($c->req->param('cpasswd') || '')) {
86                        $c->stash->{pmerror} = $c->forward('change_password',
87                            [ $username, $c->req->param('passwd') ] ) || 'Mot de passe changé';
88                    } else {
89                        $c->stash->{pmerror} = 'Mot de passe différents';
90                    }
91                }
92            }
93            last;
94        };
95        /^groups$/ and do {
96            $c->stash->{template} = 'users/groups.tt';
97            # list of group for which users can be added
98            my %ingroups = map { $_ => 1 } @{ $c->stash->{user}->get_c_field('memberOf') || []};
99            if ($c->req->param('addgroup')) {
100                $c->stash->{user}->set_c_fields('memberOf', [ keys %ingroups, $c->req->param('addgroup') ]);
101                $c->stash->{user}->base->commit;
102                # reread:
103                %ingroups = map { $_ => 1 } @{ $c->stash->{user}->get_c_field('memberOf') || []};
104            } elsif ($c->req->param('delgroup')) {
105                $c->stash->{user}->set_c_fields('memberOf',
106                    [ grep { $_ ne $c->req->param('delgroup') } keys %ingroups ]
107                );
108                $c->stash->{user}->base->commit;
109                %ingroups = map { $_ => 1 } @{ $c->stash->{user}->get_c_field('memberOf') || []};
110            }
111
112            $c->stash->{othergroups} = [ grep { ! $ingroups{$_} } $base->list_objects('group') ];
113            last;
114        };
115        /^address$/ and do {
116            if ($arg) {
117                $c->stash->{address} = $base->get_object('address', $arg);
118            } else {
119
120                if ($c->req->param('delete')) {
121                    $base->delete_object('address', $c->req->param('delete'));
122                    $base->commit;
123                } elsif ($c->req->param('add_addr')) {
124                    $c->stash->{form} = $c->model('AttrForms', 'address', 'address',
125                        $base);
126                    my $addname = $username . join('', map
127                        {('a'..'z')[rand(26)]}(0..4));
128                    if ($base->create_c_object('address',
129                        $addname,
130                        (map { $_ => ($c->req->param($_) || undef) }
131                        $c->stash->{form}->attributes('w')),
132                        user => $username,
133                    )) {
134                        $base->commit;
135                        $c->res->redirect($c->uri_for($username, 'address',
136                                $addname));
137                        return;
138                    }
139                } elsif ($c->req->param('main')) {
140                    if (my $ad = $base->get_object('address',
141                            $c->req->param('main'))) {
142                        warn $c->req->param('main');
143                        warn $ad->set_c_fields('isMainAddress' => 1);
144                        $ad->base->commit;
145                    }
146                }
147
148                my ($main) = $c->stash->{user}->get_attributes('otheraddress');
149                $c->stash->{address} = $base->get_object('address', $main);
150            }
151            if ($c->stash->{address}) {
152                $c->stash->{form} = $c->model('AttrForms', 'address',
153                    $c->stash->{address});
154                $c->stash->{form}->set_attrs;
155            }
156            $c->stash->{template} = 'users/address.tt';
157
158            last;
159        };
160        /^mail$/ and do {
161
162            $c->stash->{db} = $base;
163            $c->stash->{template} = 'users/mail.tt';
164
165            if ($c->req->param('usermail')) {
166                $c->stash->{user}->set_c_fields(
167                    mail => $c->req->param('mail') || undef,
168                    aliases => [ grep { $_ } $c->req->param('aliases') ],
169                    revaliases => $c->req->param('revaliases') || undef,
170                    forward => $c->req->param('forward') || undef,
171                ) and $base->commit;
172            }
173
174            last;
175        };
176        /^my$/ and do {
177            $c->stash->{db} = $base;
178            $c->stash->{template} = 'users/my.tt';
179        };
180        /^dump$/ and do {
181            $c->stash->{db} = $base;
182            $c->stash->{template} = 'users/dump.tt'
183            #$c->res->body($c->stash->{user}->dump({only_rw => 1}));
184        };
185
186        $c->stash->{form} = $c->model('AttrForms', 'user' . $c->stash->{subform}, $c->stash->{user});
187        $c->stash->{form}->set_attrs;
188    }
189}
190
191=head1 AUTHOR
192
193Thauvin Olivier
194
195=head1 LICENSE
196
197This library is free software, you can redistribute it and/or modify
198it under the same terms as Perl itself.
199
200=cut
201
2021;
Note: See TracBrowser for help on using the repository browser.