sync/src/web/auth.js

235 lines
6 KiB
JavaScript
Raw Normal View History

/**
* web/auth.js - Webserver functions for user authentication and registration
*
* @author Calvin Montgomery <cyzon@cyzon.us>
*/
var pug = require("pug");
2014-01-20 12:42:20 -06:00
var path = require("path");
var webserver = require("./webserver");
var sendPug = require("./pug").sendPug;
2014-01-20 12:42:20 -06:00
var Logger = require("../logger");
var $util = require("../utilities");
var db = require("../database");
2014-02-05 18:05:52 -06:00
var Config = require("../config");
var url = require("url");
2015-02-15 21:56:00 -06:00
var session = require("../session");
2015-02-22 18:15:22 -06:00
var csrf = require("./csrf");
2017-04-04 23:02:31 -07:00
2017-07-08 20:11:54 -07:00
const LOGGER = require('@calzoneman/jsli')('web/auth');
/**
* Processes a login request. Sets a cookie upon successful authentication
*/
function handleLogin(req, res) {
2015-02-22 18:15:22 -06:00
csrf.verify(req);
var name = req.body.name;
var password = req.body.password;
var rememberMe = req.body.remember;
2015-02-15 21:56:00 -06:00
var dest = req.body.dest || req.header("referer") || null;
2015-02-20 23:23:10 -06:00
dest = dest && dest.match(/login|logout/) ? null : dest;
2014-01-20 12:42:20 -06:00
if (typeof name !== "string" || typeof password !== "string") {
2015-02-19 20:30:35 -06:00
res.sendStatus(400);
return;
}
2015-02-15 21:56:00 -06:00
var host = req.hostname;
if (host.indexOf(Config.get("http.root-domain")) === -1 &&
Config.get("http.alt-domains").indexOf(host) === -1) {
2017-04-04 23:02:31 -07:00
LOGGER.warn("Attempted login from non-approved domain " + host);
2015-02-19 20:30:35 -06:00
return res.sendStatus(403);
2015-02-15 21:56:00 -06:00
}
var expiration;
if (rememberMe) {
expiration = new Date("Fri, 31 Dec 9999 23:59:59 GMT");
} else {
expiration = new Date(Date.now() + 7*24*60*60*1000);
}
password = password.substring(0, 100);
2013-12-12 17:09:49 -06:00
db.users.verifyLogin(name, password, function (err, user) {
if (err) {
2014-01-20 12:42:20 -06:00
if (err === "Invalid username/password combination") {
2014-01-27 18:37:48 -06:00
Logger.eventlog.log("[loginfail] Login failed (bad password): " + name
2015-10-27 23:54:32 -07:00
+ "@" + req.realIP);
}
sendPug(res, "login", {
loggedIn: false,
loginError: err
});
2015-02-15 21:56:00 -06:00
return;
}
2015-02-15 21:56:00 -06:00
session.genSession(user, expiration, function (err, auth) {
if (err) {
sendPug(res, "login", {
2015-02-15 21:56:00 -06:00
loggedIn: false,
loginError: err
});
return;
2014-01-20 12:42:20 -06:00
}
webserver.setAuthCookie(req, res, expiration, auth);
2015-02-15 21:56:00 -06:00
if (dest) {
res.redirect(dest);
} else {
sendPug(res, "login", {
loggedIn: true,
loginName: user.name,
superadmin: user.global_rank >= 255
});
2015-02-15 21:56:00 -06:00
}
});
2015-02-15 21:56:00 -06:00
});
}
/**
* Handles a GET request for /login
*/
function handleLoginPage(req, res) {
2014-01-22 21:12:43 -06:00
if (webserver.redirectHttps(req, res)) {
return;
}
if (res.locals.loggedIn) {
return sendPug(res, "login", {
2015-02-15 21:56:00 -06:00
wasAlreadyLoggedIn: true
});
}
2015-02-15 21:56:00 -06:00
var redirect = req.query.dest || req.header("referer");
var locals = {};
if (!/\/register/.test(redirect)) {
locals.redirect = redirect;
}
sendPug(res, "login", locals);
}
/**
* Handles a request for /logout. Clears auth cookie
*/
function handleLogout(req, res) {
2015-02-22 18:15:22 -06:00
csrf.verify(req);
2014-01-20 12:42:20 -06:00
res.clearCookie("auth");
res.locals.loggedIn = res.locals.loginName = res.locals.superadmin = false;
2014-01-20 12:42:20 -06:00
// Try to find an appropriate redirect
2015-11-02 20:52:57 -08:00
var dest = req.body.dest || req.header("referer");
2015-02-20 23:23:10 -06:00
dest = dest && dest.match(/login|logout|account/) ? null : dest;
2014-01-20 12:42:20 -06:00
var host = req.hostname;
if (host.indexOf(Config.get("http.root-domain")) !== -1) {
2014-03-01 17:37:59 -06:00
res.clearCookie("auth", { domain: Config.get("http.root-domain-dotted") });
2014-01-20 12:42:20 -06:00
}
2015-02-15 21:56:00 -06:00
if (dest) {
res.redirect(dest);
2014-01-20 12:42:20 -06:00
} else {
sendPug(res, "logout", {});
2014-01-20 12:42:20 -06:00
}
}
/**
* Handles a GET request for /register
*/
function handleRegisterPage(req, res) {
2014-01-22 21:12:43 -06:00
if (webserver.redirectHttps(req, res)) {
return;
}
if (res.locals.loggedIn) {
sendPug(res, "register", {});
2015-02-15 21:56:00 -06:00
return;
}
2014-02-09 19:52:24 -06:00
sendPug(res, "register", {
registered: false,
registerError: false
});
}
/**
* Processes a registration request.
*/
function handleRegister(req, res) {
2015-02-22 18:15:22 -06:00
csrf.verify(req);
var name = req.body.name;
var password = req.body.password;
var email = req.body.email;
2014-01-20 12:42:20 -06:00
if (typeof email !== "string") {
email = "";
}
2015-10-27 23:54:32 -07:00
var ip = req.realIP;
2014-01-20 12:42:20 -06:00
if (typeof name !== "string" || typeof password !== "string") {
2015-02-19 20:30:35 -06:00
res.sendStatus(400);
return;
}
if (name.length === 0) {
sendPug(res, "register", {
2014-01-20 12:42:20 -06:00
registerError: "Username must not be empty"
});
return;
}
2014-02-05 18:05:52 -06:00
if (name.match(Config.get("reserved-names.usernames"))) {
sendPug(res, "register", {
2014-02-05 18:05:52 -06:00
registerError: "That username is reserved"
});
return;
}
if (password.length === 0) {
sendPug(res, "register", {
2014-01-20 12:42:20 -06:00
registerError: "Password must not be empty"
});
return;
}
password = password.substring(0, 100);
2013-12-26 22:15:54 -05:00
if (email.length > 0 && !$util.isValidEmail(email)) {
sendPug(res, "register", {
2014-01-20 12:42:20 -06:00
registerError: "Invalid email address"
});
return;
}
2013-12-25 22:30:24 -05:00
db.users.register(name, password, email, ip, function (err) {
if (err) {
sendPug(res, "register", {
registerError: err
});
} else {
2014-01-27 18:37:48 -06:00
Logger.eventlog.log("[register] " + ip + " registered account: " + name +
2014-01-20 12:42:20 -06:00
(email.length > 0 ? " <" + email + ">" : ""));
sendPug(res, "register", {
registered: true,
registerName: name,
redirect: req.body.redirect
});
}
});
}
module.exports = {
/**
* Initializes auth callbacks
*/
init: function (app) {
2014-01-20 12:42:20 -06:00
app.get("/login", handleLoginPage);
app.post("/login", handleLogin);
2015-10-26 23:21:09 -07:00
app.post("/logout", handleLogout);
2014-01-20 12:42:20 -06:00
app.get("/register", handleRegisterPage);
app.post("/register", handleRegister);
}
};