Commit f24922d1 authored by Rene Saarsoo's avatar Rene Saarsoo
Browse files

Implement authentication and login.

parent e11cfa47
Loading
Loading
Loading
Loading
+45 −2
Original line number Diff line number Diff line
@@ -57,11 +57,48 @@ app.configure(function() {
    app.use(express.logger('dev'));
});

// Authentication is disabled for now.
// Authentication

app.get('/auth/session', function(req, res) {
    if (req.session && req.session.user) {
        res.json({
            userName: req.session.user.username,
            external_id: req.session.user.external_id,
            mod: req.session.user.moderator
        });
    }
    else {
        res.json(false);
    }
});

app.post('/auth/login', services.forumAuth, function(req, res) {
    req.forumAuth.login(req.body.username, req.body.password, function(err, user) {
        if (err) {
            res.json({ success: false, reason: err });
            return;
        }

        req.session = req.session || {};
        req.session.user = user;

        res.json({
            userName: user.username,
            mod: user.moderator,
            sessionID: req.sessionID,
            success: true
        });
    });
});

app.post('/auth/logout', function(req, res) {
    req.session.user = null;
    res.json({ success: true });
});


// Requests for Comments

// Returns number of comments for each class/member,
app.get('/auth/:sdk/:version/comments_meta', services.comments, function(req, res) {
    req.comments.countsPerTarget(function(err, counts) {
@@ -85,5 +122,11 @@ app.get('/auth/:sdk/:version/comments', services.comments, function(req, res) {
    });
});

// Returns all subscriptions for logged in user
// For now does nothing.
app.get('/auth/:sdk/:version/subscriptions', function(req, res) {
    res.json({ subscriptions: [] });
});

app.listen(config.port);
console.log("Server started at port "+config.port+"...");

comments/forum_auth.js

0 → 100644
+72 −0
Original line number Diff line number Diff line
var crypto = require('crypto');

/**
 * Authentication with a Sencha Forum database
 */
function ForumAuth(db) {
    this.db = db;
}

ForumAuth.prototype = {
    /**
     * Attempts login with provided credentials.
     * @param {String} username
     * @param {String} password
     * @param {Function} callback Called when done.
     * @param {String} callback.err Error message when login failed.
     * @param {Object} callback.user The user that was logged in.
     */
    login: function(username, password, callback) {
        var sql = [
            "SELECT userid, membergroupids, email, username, password, salt",
            "FROM user",
            "WHERE username = ?"
        ];

        this.db.queryOne(sql, [username], function(err, user) {
            if (err) {
                callback(err);
                return;
            }

            if (!user) {
                callback("No such user");
                return;
            }

            if (!this.checkPassword(password, user.salt, user.password)) {
                callback("Invalid password");
                return;
            }

            callback(null, {
                username: user.username,
                external_id: user.userid,
                moderator: this.isModerator(user)
            });
        }.bind(this));
    },

    checkPassword: function(password, salt, saltedPassword) {
        password = crypto.createHash('md5').update(password).digest("hex") + salt;
        password = crypto.createHash('md5').update(password).digest("hex");

        return password == saltedPassword;
    },

    isModerator: function(user) {
        var COMMUNITY_SUPPORT_TEAM = 2;
        var DEV_TEAM = 19;

        if (typeof user.membergroupids === "string") {
            var ids = user.membergroupids.split(',').map(parseInt);
        }
        else {
            var ids = [];
        }

        return ids.indexOf(COMMUNITY_SUPPORT_TEAM) != -1 || ids.indexOf(DEV_TEAM) != -1;
    }
};

module.exports = ForumAuth;
+10 −0
Original line number Diff line number Diff line
var DbFacade = require('./db_facade');
var Comments = require('./comments');
var ForumAuth = require('./forum_auth');
var config = require('./config');

/**
@@ -14,5 +15,14 @@ module.exports = {
        var db = new DbFacade(config.mysql);
        req.comments = new Comments(db, req.params.sdk+"-"+req.params.version);
        next();
    },

    /**
     * Adds forumAuth service to request.
     */
    forumAuth: function(req, res, next) {
        var db = new DbFacade(config.forumDb);
        req.forumAuth = new ForumAuth(db);
        next();
    }
};