OSDN Git Service

eventd: add user/login and user/logout handler
[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("user", "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("user", "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     my $prefs = { nickname => $nickname, token => $token };
64
65     # check if token is correct
66     if (!$the_user || !$token) {
67         $c->render(activation_succeed => 0, error => "INVALID_TOKEN");
68         $c->res->code(400);
69         return;
70     }
71
72     # if reset activation
73     if ($cancel) {
74         $c->users->cancel_activation($the_user);
75         $c->render(activation_succeed => 0, error => "CANCEL_ACTIVATION");
76         return;
77     }
78
79     # check if token is valid
80     my $rs = $c->users->activation($nickname, $token);
81     if (!$rs) {
82         $c->render(activation_succeed => 0, error => $c->users->last_error);
83         $c->res->code(400);
84         return;
85     }
86
87     # ok
88     $c->render(prefs => $prefs, activation_succeed => 1, error => "");
89     return;
90 }
91
92 sub reset_password {
93     my $c = shift;
94
95     if ($c->req->method eq "GET") {
96         $c->render();
97         return;
98     }
99
100     if ($c->req->method eq "POST") {
101         my $users = $c->model('users');
102         my $email = $c->param("email");
103
104         if (!$email || !Email::Valid->address($email)) {
105             $c->render(result => "INVALID_EMAIL", email => $email);
106             $c->res->code(400);
107             return;
108         }
109
110         my $the_user = $users->select(realemail => $email);
111         if (!$the_user) {
112             $c->render(result => "NOT_FOUND", email => $email);
113             $c->res->code(400);
114             return;
115         }
116
117         # check done
118         my $rs = $c->users->reset_password($the_user);
119         if (!$rs) {
120             $c->render(result => "ERROR");
121             $c->res->code(400);
122             return;
123         }
124         $c->render(result => "DONE", email => $email);
125         return;
126     }
127 }
128
129 sub newuser {
130     my $c = shift;
131     my $user = $c->stash('user');
132
133     if ($user->{is_login}) {
134         $c->res->code(303);
135         $c->redirect_to("/my/");
136         return;
137     }
138
139     if ($c->req->method eq "GET") {
140         $c->render();
141         return;
142     }
143
144     if ($c->req->method ne "POST") {
145         $c->res->code(400);
146         return;
147     }
148
149     my $prefs = {};
150     for my $k (qw(unickname email email2 allow_newsletter allow_headline)) {
151         $prefs->{$k} = $c->param($k);
152     }
153
154     my $error = 0;
155     if (!$prefs->{nickname}) {
156         $error = 1;
157         $prefs->{id_error} = "BLANK_ID";
158     }
159
160     if (!$prefs->{email}) {
161         $error = 1;
162         $prefs->{mail_error} = "BLANK_MAIL";
163     }
164
165     # mail is valid?
166
167     if ($prefs->{email} ne $prefs->{email2}) {
168         $error = 1;
169         $prefs->{mail_error} = "MAIL_NOT_MATCH";
170     }
171
172     if ($error) {
173         $c->render(prefs => $prefs);
174         return;
175     }
176
177     # check ID
178
179     #my $result = $c->model('users')->create_user($c->param('nickname'), $c->param('email'), {});
180     # TODO: set newsletter and headline settings
181     # if (!$result) {
182     #     die "database error!";
183     # }
184     # if ($result->{error}) {
185     #     $c->render(error => 1);
186     # } else {
187     #     $c->render("login/register_done", uid => $result->{uid}, password => $result->{password});
188     # }
189 }
190
191 1;
192