Loading comments/app.js +45 −2 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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; comments/services.js +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'); /** Loading @@ -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(); } }; Loading
comments/app.js +45 −2 Original line number Diff line number Diff line Loading @@ -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) { Loading @@ -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;
comments/services.js +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'); /** Loading @@ -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(); } };