OSDN Git Service

Controller::Login: fix user prefs convertion
[newslash/newslash.git] / src / newslash_web / lib / Newslash / Web / Controller / Login.pm
1 package Newslash::Web::Controller::Login;
2 use Mojo::Base 'Mojolicious::Controller';
3 use Mojo::Util qw(b64_encode);
4
5 use Crypt::OpenSSL::Random qw(random_seed random_bytes );
6
7 # set random seed
8 if (!random_seed(time())) {
9     die 'random seed is not sufficient';
10 }
11
12 sub _generate_token {
13     my $self = shift;
14     my $randoms = random_bytes(128);
15     if ($randoms) {
16         return b64_encode($randoms);
17     }
18     return undef;
19 }
20
21
22 sub login {
23     my $c = shift;
24     my $nickname = $c->param('nickname') || '';
25     my $passwd = $c->param('passwd') || '';
26     my $users = $c->model('users');
27
28     if (length($nickname) == 0) {
29         $c->render(msg => 'SRAD login');
30         return;
31     }
32
33     # TODO: if user already logged-in, force logout?
34     my $user = $users->authentification($nickname, $passwd);
35     if ($user) {
36         # convert old preferences
37         my $new_cfg = $users->convert_old_prefs($user->{uid});
38         if ($new_cfg) {
39             # if convert executed, update conf
40             $user->{config} = $new_cfg;
41             $user->{configJSON} = encode_json($new_cfg);
42         }
43
44         my $token = $c->_generate_token;
45         # check token's overlap, if so, regenerate
46         my $existence = $c->kvs->hget('sessions', $token);
47         if ($existence) {
48             $token = $c->_generate_token;
49             $existence = $c->kvs->hget('sessions', $token);
50         }
51         $c->kvs->hset('sessions', $token, $user);
52         my $session = {
53                        token => $token,
54                        timestamp => time(),
55                        remote_addr => $c->req->env->{REMOTE_ADDR},
56                       };
57         $c->session(session => $session);
58         $c->redirect_to('/');
59         return;
60     }
61
62     $c->render(msg => 'Wrong username or password.');
63 }
64
65 sub logout {
66   my $c = shift;
67   my $session = $c->session('session');
68   $c->kvs->hdel('sessions', $session->{token});
69   #$c->model('users')->expire_token($session->{token});
70   #$c->session(expires => 1);
71   $c->redirect_to('/');
72 }
73
74 sub newuser {
75     my $c = shift;
76
77     # TODO: if user already logged-in, force logout?
78
79     for my $k (qw(nickname passwd email email_retype newsletter headline)) {
80         $c->stash($k => $c->param($k));
81     }
82
83     if (!$c->param('nickname')
84         || !$c->param('email')
85         || $c->param('email') ne $c->param('email_retype')) {
86         $c->render(error => 1);
87         return;
88     }
89
90     my $result = $c->model('users')->create_user($c->param('nickname'), $c->param('email'), {});
91     # TODO: set newsletter and headline settings
92     if (!$result) {
93         die "database error!";
94     }
95     if ($result->{error}) {
96         $c->render(error => 1);
97     } else {
98         $c->render("login/register_done", uid => $result->{uid}, password => $result->{password});
99     }
100 }
101
102 1;
103