var passport = require('passport'); var LocalStrategy = require('passport-local').Strategy; var crypto = require('crypto'); var db = require('../db'); var util = require('./util'); var crypt = require('unix-crypt-td-js') var middleware = require('./middleware') var auth = module.exports = { init: function(){ passport.serializeUser(auth.serializeUser) passport.deserializeUser(auth.deserializeUser) passport.use(new LocalStrategy(auth.verifyLocalUser)) }, route: function(app){ app.get("/login", function(req, res){ res.render("pages/login", { title: "login" }) }) app.get("/signup", function(req, res){ res.render("pages/signup", { title: "signup" }) }) app.get("/logout", auth.logout) app.put("/api/signup", function (req, res, next) { var username = util.sanitizeName(req.body.username) db.getUserByUsername(username).then((user) => { if (user) { return res.json({ error: "user exists" }) } next() }) }, function (req, res, next) { if (req.body.password !== req.body.password2) { return res.json({ error: "passwords don't match" }) } var username = util.sanitizeName(req.body.username) var data = { username: username, realname: util.sanitizeName(req.body.realname), password: auth.makePassword(username, req.body.password), grass: util.sanitizeName(req.body.grass), firstseen: util.now(), lastseen: util.now(), // lastsession: util.now(), } db.createUser(data).then(() => next()) }, passport.authenticate("local"), function (req, res, next) { var username = req.user.get('username') Promise.all([ db.createMailbox({ mbox: username + '.inbox', owner: username, editable: 0, }), db.createMailbox({ mbox: username + '.outbox', owner: username, editable: 0, }), db.createMailbox({ mbox: username + '.drafts', owner: username, editable: 1, }), ]).then(() => next()) }, auth.login) app.put("/api/login", passport.authenticate("local"), auth.login) app.put("/api/checkin", middleware.ensureAuthenticated, auth.checkin ) }, login: function (req, res) { if (req.isAuthenticated()) { var returnTo = req.session.returnTo delete req.session.returnTo console.log(">> logged in", req.user.get('username')) return res.json({ status: "OK", user: util.sanitizeUser(req.user), returnTo: returnTo || "/index", }) } res.json({ error: 'bad credentials', }) }, serializeUser: function (user, done) { done(null, user.id); }, deserializeUser: function (id, done) { db.getUser(id).then(function(user){ done(! user, user) }) }, makePassword: function(username, pw) { var salt = username.substr(0, 2) // lol return crypt(pw, salt) // var shasum = crypto.createHash('sha1') // shasum.update(pw) // return shasum.digest('hex'); }, validPassword: function(user, pw){ return user.get('password') === auth.makePassword(user.get('username'), pw); }, verifyLocalUser: function (username, password, done) { // handle passwords!! db.getUserByUsername(username).then(function(user){ // if (err) { return done(err); } if (! user) { return done("no user") } return done(null, user) if (! user || ! auth.validPassword(user, password)) { return done(null, false, { error: { message: 'Bad username/password.' } }) } return done(null, user); }) }, checkin: function (req, res) { var user = util.sanitizeUser(req.user) res.json(user) }, logout: function (req, res) { req.logout(); res.redirect('/'); }, }