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

Last change on this file since 455 was 455, checked in by nanardon, 12 years ago
  • add options to list stored variables
File size: 4.2 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 session : XMLRPC {
34    my ( $self, $c ) = @_;
35
36    $c->session;
37    $c->stash->{xmlrpc} = 'sophie_session=' . $c->sessionid;
38}
39
40sub fetch_user_data : Private {
41    my ( $self, $c, $user, $dataname ) = @_;
42
43    if (my $rs = $c->model('Base')->resultset('Users')->search(
44        { mail => $user, }
45    )->search_related(
46        'UsersData', { varname => $dataname }
47    )->next) {
48        $c->stash->{xmlrpc} = thaw( decode_base64( $rs->get_column('value') ) );
49    } else {
50        $c->stash->{xmlrpc} = {};
51    }
52
53    return $c->stash->{xmlrpc};
54}
55
56sub list_user_data : XMLRPC {
57    my ( $self, $c, $user ) = @_;
58
59    return $c->stash->{xmlrpc} = [
60        $c->model('Base')->resultset('Users')->search(
61            { mail => $user, }
62        )->search_related('UsersData')->get_column('varname')->all
63    ];   
64}
65
66sub listdata : XMLRPC {
67    my ( $self, $c, $dataname ) = @_;
68
69    $c->user or return {};
70
71    return $c->forward('list_user_data', [ $c->user->mail || '', $dataname ]);
72}
73
74sub fetchdata : XMLRPC {
75    my ( $self, $c, $dataname ) = @_;
76
77    $c->user or return {};
78
79    return $c->forward('fetch_user_data', [ $c->user->mail || '', $dataname ]);
80}
81
82sub dumpdata : XMLRPC {
83    my ( $self, $c, $dataname ) = @_;
84
85    return $c->stash->{xmlrpc} = YAML::freeze(
86        $c->forward('fetchdata', [ $dataname ])
87    );
88}
89
90sub set_user_data : Private {
91    my ( $self, $c, $user, $dataname, $data ) = @_;
92
93    my $User = $c->model('Base')->resultset('Users')->find( { mail => $user } )
94        or return;
95
96    $c->model('Base')->resultset('UsersData')->update_or_create({
97        Users => $User,
98        varname => $dataname,
99        value => encode_base64( nfreeze($data) ),
100    });
101    $c->model('Base')->storage->dbh->commit;
102    return $c->stash->{xmlrpc} = 'Updated';
103}
104
105sub setdata : XMLRPC {
106    my ( $self, $c, $dataname, $data ) = @_;
107
108    return $c->forward('set_user_data', [ $c->user->mail, $dataname, $data ]);
109}
110
111sub loaddata : XMLRPC {
112    my ( $self, $c, $dataname, $data ) = @_;
113
114    $c->forward('setdata', [ $dataname, YAML::thaw($data) ]);
115}
116
117sub update_data : XMLRPC {
118    my ( $self, $c, $dataname, $data ) = @_;
119    $c->forward('update_user_data', [ $c->user->mail || '', $dataname, $data ]);
120}
121
122sub update_user_data : Private {
123    my ( $self, $c, $user, $dataname, $data ) = @_;
124
125    my $prev_data = $c->forward('fetch_user_data',
126        [ $user || '', $dataname ]
127    ) || {};
128
129    foreach (keys %$data) {
130        if (defined($data->{$_})) {
131            $prev_data->{$_} = $data->{$_};
132        } else {
133            delete($prev_data->{$_});
134        }
135    }
136
137    $c->forward('set_user_data', [ $user, $dataname, $prev_data ]);
138}
139
140sub set_user_password : Private {
141    my ($self, $c, $user, $clear_password ) = @_;
142
143    my @random = (('a'..'z'), ('A'..'Z'), (0 .. 9));
144    my $salt = join('', map { $random[rand(@random)] } (0..5));
145
146    my $pass = crypt($clear_password, '$1$' . $salt);
147    if (my $rsuser = $c->model('Base::Users')->find({
148            mail => $user,
149        }
150    )) {
151        $rsuser->update({ password => $pass });
152        $c->model('Base')->storage->dbh->commit;
153        return $c->stash->{xmlrpc} = 'Password changed for user ' . $user;
154    } else {
155        $c->error( 'No such user' );
156    }
157}
158
159=head2 user.set_password( PASSWORD )
160
161Change the password for the current user to password C<PASSWORD>.
162
163The change take effect immediately, so user must login again with the new
164password to continue to use the website.
165
166The password is stored internally crypted using UNIX MD5 method.
167
168=cut
169
170sub set_password : XMLRPC {
171    my ( $self, $c, $clear_password ) = @_;
172
173    $c->forward('set_user_password', [ $c->user->mail, $clear_password ]);
174}
175
176=head1 AUTHOR
177
178Olivier Thauvin
179
180=head1 LICENSE
181
182This library is free software. You can redistribute it and/or modify
183it under the same terms as Perl itself.
184
185=cut
186
187__PACKAGE__->meta->make_immutable;
188
1891;
Note: See TracBrowser for help on using the repository browser.