source: server/trunk/web/lib/Sophie/Controller/User.pm @ 209

Last change on this file since 209 was 209, checked in by nanardon, 13 years ago
  • add dump/load as yaml user var
  • add set_password() for user
File size: 3.6 KB
Line 
1package Sophie::Controller::User;
2use Moose;
3use namespace::autoclean;
4use MIME::Base64;
5use Storable qw/nfreeze thaw/;
6use YAML;
7
8BEGIN {extends 'Catalyst::Controller'; }
9
10=head1 NAME
11
12Sophie::Controller::User - Catalyst Controller
13
14=head1 DESCRIPTION
15
16Catalyst Controller.
17
18=head1 METHODS
19
20=cut
21
22
23=head2 index
24
25=cut
26
27sub index :Path :Args(0) {
28    my ( $self, $c ) = @_;
29
30    $c->response->body('Matched Sophie::Controller::User in User.');
31}
32
33sub fetch_user_data : Private {
34    my ( $self, $c, $user, $dataname ) = @_;
35
36    if (my $rs = $c->model('Base')->resultset('Users')->search(
37        mail => $user,
38    )->search_related(
39        'UsersData', { varname => $dataname }
40    )->next) {
41        $c->stash->{xmlrpc} = thaw( decode_base64( $rs->get_column('value') ) );
42    } else {
43        $c->stash->{xmlrpc} = {};
44    }
45
46    return $c->stash->{xmlrpc};
47}
48
49
50sub fetchdata : XMLRPC {
51    my ( $self, $c, $dataname ) = @_;
52
53    $c->user or return {};
54
55    return $c->forward('fetch_user_data', [ $c->user->mail || '', $dataname ]);
56}
57
58sub dumpdata : XMLRPC {
59    my ( $self, $c, $dataname ) = @_;
60
61    return $c->stash->{xmlrpc} = YAML::freeze(
62        $c->forward('fetchdata', [ $dataname ])
63    );
64}
65
66sub set_user_data : Private {
67    my ( $self, $c, $user, $dataname, $data ) = @_;
68
69    my $User = $c->model('Base')->resultset('Users')->find( { mail => $user } )
70        or return;
71
72    $c->model('Base')->resultset('UsersData')->update_or_create({
73        Users => $User,
74        varname => $dataname,
75        value => encode_base64( nfreeze($data) ),
76    });
77    $c->model('Base')->storage->dbh->commit;
78    return $c->stash->{xmlrpc} = 'Updated';
79}
80
81sub setdata : XMLRPC {
82    my ( $self, $c, $dataname, $data ) = @_;
83
84    return $c->forward('set_user_data', [ $c->user->mail, $dataname, $data ]);
85}
86
87sub loaddata : XMLRPC {
88    my ( $self, $c, $dataname, $data ) = @_;
89
90    $c->forward('setdata', [ $dataname, YAML::thaw($data) ]);
91}
92
93sub update_data : XMLRPC {
94    my ( $self, $c, $dataname, $data ) = @_;
95    $c->forward('update_user_data', [ $c->user->mail || '', $dataname, $data ]);
96}
97
98sub update_user_data : Private {
99    my ( $self, $c, $user, $dataname, $data ) = @_;
100
101    my $prev_data = $c->forward('fetch_user_data',
102        [ $user || '', $dataname ]
103    ) || {};
104
105    foreach (keys %$data) {
106        $prev_data->{$_} = $data->{$_};
107    }
108
109    $c->forward('set_user_data', [ $user, $dataname, $prev_data ]);
110}
111
112sub set_user_password : Private {
113    my ($self, $c, $user, $clear_password ) = @_;
114
115    my @random = (('a'..'z'), ('A'..'Z'), (0 .. 9));
116    my $salt = join('', map { $random[rand(@random)] } (0..5));
117
118    my $pass = crypt($clear_password, '$1$' . $salt);
119    if (my $rsuser = $c->model('Base::Users')->find({
120            mail => $user,
121        }
122    )) {
123        $rsuser->update({ password => $pass });
124        $c->model('Base')->storage->dbh->commit;
125        return $c->stash->{xmlrpc} = 'Password changed for user ' . $user;
126    } else {
127        $c->error( 'No such user' );
128    }
129}
130
131=head2 user.set_password( PASSWORD )
132
133Change the password for the current user to password C<PASSWORD>.
134
135The change take effect immediately, so user must login again with the new
136password to continue to use the website.
137
138The password is stored internally crypted using UNIX MD5 method.
139
140=cut
141
142sub set_password : XMLRPC {
143    my ( $self, $c, $clear_password ) = @_;
144
145    $c->forward('set_user_password', [ $c->user->mail, $clear_password ]);
146}
147
148=head1 AUTHOR
149
150Olivier Thauvin
151
152=head1 LICENSE
153
154This library is free software. You can redistribute it and/or modify
155it under the same terms as Perl itself.
156
157=cut
158
159__PACKAGE__->meta->make_immutable;
160
1611;
Note: See TracBrowser for help on using the repository browser.