szurubooru/client/js/controllers/auth_controller.js
rr- da1386c7d2 client/auth: forget user when they try to log in
This is to let user log in if their login cookie is broken (for example
when it refers to a non existing user). Normally, the client should
treat errors caused by cookie logins as temporary server failures,
inform the user about it and leave the cookie, so that when the server
is up again, all user needs to do is to reload the page rather than
logging again.
2016-05-08 18:04:06 +02:00

98 lines
3.2 KiB
JavaScript

'use strict';
const page = require('page');
const api = require('../api.js');
const events = require('../events.js');
const topNavController = require('../controllers/top_nav_controller.js');
const LoginView = require('../views/login_view.js');
const PasswordResetView = require('../views/password_reset_view.js');
class AuthController {
constructor() {
this.loginView = new LoginView();
this.passwordResetView = new PasswordResetView();
}
registerRoutes() {
page(/\/password-reset\/([^:]+):([^:]+)$/,
(ctx, next) => {
this.passwordResetFinishRoute(ctx.params[0], ctx.params[1]);
});
page('/password-reset', (ctx, next) => { this.passwordResetRoute(); });
page('/login', (ctx, next) => { this.loginRoute(); });
page('/logout', (ctx, next) => { this.logoutRoute(); });
}
loginRoute() {
api.forget();
topNavController.activate('login');
this.loginView.render({
login: (name, password, doRemember) => {
return new Promise((resolve, reject) => {
api.forget();
api.login(name, password, doRemember)
.then(() => {
resolve();
page('/');
events.notify(events.Success, 'Logged in');
}, errorMessage => {
reject(errorMessage);
events.notify(events.Error, errorMessage);
});
});
}});
}
logoutRoute() {
api.forget();
api.logout();
page('/');
events.notify(events.Success, 'Logged out');
}
passwordResetRoute() {
topNavController.activate('login');
this.passwordResetView.render({
proceed: (...args) => {
return this._passwordReset(...args);
}});
}
passwordResetFinishRoute(name, token) {
api.forget();
api.logout();
api.post('/password-reset/' + name, {token: token})
.then(response => {
const password = response.password;
return api.login(name, password, false);
}, response => {
return Promise.reject(response.description);
}).then(() => {
page('/');
events.notify(events.Success, 'New password: ' + password);
}, errorMessage => {
page('/');
events.notify(events.Error, errorMessage);
});
}
_passwordReset(nameOrEmail) {
api.forget();
api.logout();
return new Promise((resolve, reject) => {
api.get('/password-reset/' + nameOrEmail)
.then(() => {
resolve();
events.notify(
events.Success,
'E-mail has been sent. To finish the procedure, ' +
'please click the link it contains.');
}, response => {
reject();
events.notify(events.Error, response.description);
});
});
}
}
module.exports = new AuthController();