OSDN Git Service

ef16eeee343d95a180b23830bb2e399927349ea1
[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 dumper);
4 use Mojo::JSON qw(to_json);
5 use DateTime;
6 use DateTime::Format::MySQL;
7 use Email::Valid;
8
9 sub login {
10     my $c = shift;
11     my $nickname = $c->param('nickname') || '';
12     my $passwd = $c->param('passwd') || '';
13     my $users = $c->model('users');
14     my $rpath = $c->param('rpath') || '/';
15
16     # rpath must be absolute path.
17     if ($rpath !~ m/^\//) {
18         $rpath = '/';
19     }
20
21     if (length($nickname) == 0) {
22         $c->render(msg => 'SRAD login', rpath => $rpath);
23         return;
24     }
25
26     # TODO: if user already logged-in, force logout?
27     my $user = $users->authentification($nickname, $passwd);
28     if ($user) {
29         if (!$c->user_auth->do_login($user, $c)) {
30             $c->rendered(500);
31             return;
32         }
33         $c->redirect_to($rpath);
34         $c->event_que->emit("login", "login", $user->{uid});
35         return;
36     }
37
38     $c->render(msg => 'Wrong username or password.', rpath => $rpath, nickname => $nickname);
39 }
40
41 sub logout {
42   my $c = shift;
43   my $session = $c->session('session');
44   my $user = $c->stash('user');
45   $c->user_auth->clear_session($user, $session->{token});
46
47   my $rpath = $c->param('rpath') || '/';
48
49   #TODO: $c->model('users')->expire_token($session->{token});
50   $c->session(expires => 1);
51   $c->event_que->emit("login", "logout", $c->stash('user')->{uid});
52   $c->redirect_to($rpath);
53 }
54
55 sub activation {
56     my $c = shift;
57     my $users = $c->model('users');
58     my $nickname = $c->param("nickname");
59     my $token = $c->param("token");
60     my $cancel = $c->param("cancel");
61
62     my $the_user = $users->select(nickname => $nickname);
63
64     # check if token is correct
65     if (!$the_user || $token ne $the_user->{newpasswd}) {
66         $c->render(activation_succeed => 0, error => "INVALID_TOKEN");
67         $c->res->code(400);
68         return;
69     }
70
71     # if reset activation
72     if ($cancel) {
73         $c->users->cancel_activation($the_user);
74         $c->render(activation_succeed => 0, error => "CANCEL_ACTIVATION");
75         return;
76     }
77
78     # check if token is expired
79     my $expiration_limit = $c->config->{Users}->{newpasswd_expiration};
80     if (!$the_user->{newpasswd_ts}) {
81         $c->render(activation_succeed => 0, error => "INVALID_TOKEN");
82         $c->res->code(400);
83         return;
84     }
85     my $expire_dt = eval { DateTime::Format::MySQL->parse_datetime($the_user->{newpasswd_ts}) };
86     if (!$expire_dt) {
87         $c->log->error("Activation: invalid newpasswd_ts ($the_user->{newpasswd_ts}). uid: $the_user->{uid}");
88         $c->render(activation_succeed => 0, error => "INVALID_TOKEN");
89         $c->res->code(400);
90         return;
91     }
92     $expire_dt->add( seconds => $expiration_limit);
93     if ($expire_dt->epoch() < time()) {
94         $c->render(activation_succeed => 0,  error => "TOKEN_EXPIRED");
95         $c->res->code(400);
96         return;
97     }
98
99     # ok
100     $c->render(nickname => $nickname, activation_succeed => 1, error => 0);
101     return;
102 }
103
104 sub reset_password {
105     my $c = shift;
106
107     if ($c->req->method eq "GET") {
108         $c->render();
109         return;
110     }
111
112     if ($c->req->method eq "POST") {
113         my $users = $c->model('users');
114         my $email = $c->param("email");
115
116         if (!$email || !Email::Valid->address($email)) {
117             $c->render(result => "INVALID_EMAIL", email => $email);
118             $c->res->code(400);
119             return;
120         }
121
122         my $the_user = $users->select(realemail => $email);
123         if (!$the_user) {
124             $c->render(result => "NOT_FOUND", email => $email);
125             $c->res->code(400);
126             return;
127         }
128
129         # check done
130         my $rs = $c->users->reset_password($the_user);
131         if (!$rs) {
132             $c->render(result => "ERROR");
133             $c->res->code(400);
134             return;
135         }
136         $c->render(result => "DONE", email => $email);
137         return;
138     }
139 }
140
141 sub newuser {
142     my $c = shift;
143     my $user = $c->stash('user');
144
145     if ($user->{is_login}) {
146         $c->res->code(303);
147         $c->redirect_to("/my/");
148         return;
149     }
150
151     if ($c->req->method eq "GET") {
152         $c->render();
153         return;
154     }
155
156     if ($c->req->method ne "POST") {
157         $c->res->code(400);
158         return;
159     }
160
161     my $prefs = {};
162     for my $k (qw(unickname email email2 allow_newsletter allow_headline)) {
163         $prefs->{$k} = $c->param($k);
164     }
165
166     my $error = 0;
167     if (!$prefs->{nickname}) {
168         $error = 1;
169         $prefs->{id_error} = "BLANK_ID";
170     }
171
172     if (!$prefs->{email}) {
173         $error = 1;
174         $prefs->{mail_error} = "BLANK_MAIL";
175     }
176
177     # mail is valid?
178
179     if ($prefs->{email} ne $prefs->{email2}) {
180         $error = 1;
181         $prefs->{mail_error} = "MAIL_NOT_MATCH";
182     }
183
184     if ($error) {
185         $c->render(prefs => $prefs);
186         return;
187     }
188
189     # check ID
190
191     #my $result = $c->model('users')->create_user($c->param('nickname'), $c->param('email'), {});
192     # TODO: set newsletter and headline settings
193     # if (!$result) {
194     #     die "database error!";
195     # }
196     # if ($result->{error}) {
197     #     $c->render(error => 1);
198     # } else {
199     #     $c->render("login/register_done", uid => $result->{uid}, password => $result->{password});
200     # }
201 }
202
203 1;
204