cleaned up webserver a bit, moved over authentication stuff into its own file, got rid of unused routes, user routes still need to be moved out but am waiting for baris to finish

v1.18.x
psychobunny 12 years ago
parent 5e901a76aa
commit a4e8f9e706

@ -67,7 +67,7 @@ var templates = {};
loadTemplates([
'header', 'footer', 'register', 'home', 'topic','account', 'category', 'users', 'accountedit',
'login', 'reset', 'reset_code', 'account',
'confirm',
'confirm', '403',
'emails/reset', 'emails/reset_plaintext', 'emails/email_confirm', 'emails/email_confirm_plaintext',
'admin/index', 'admin/categories', 'admin/users', 'admin/topics', 'admin/settings', 'admin/themes', 'admin/twitter', 'admin/facebook', 'admin/gplus'
]);

@ -0,0 +1,157 @@
(function(Auth) {
var passport = require('passport'),
passportLocal = require('passport-local').Strategy,
passportTwitter = require('passport-twitter').Strategy,
passportGoogle = require('passport-google-oauth').OAuth2Strategy,
passportFacebook = require('passport-facebook').Strategy,
login_strategies = [],
user_module = require('./../user.js'),
config = require('./../../config.js');
passport.use(new passportLocal(function(user, password, next) {
user_module.loginViaLocal(user, password, function(login) {
if (login.status === 'ok') next(null, login.user);
else next(null, false, login);
});
}));
if (config.twitter && config.twitter.key && config.twitter.key.length > 0 && config.twitter.secret.length > 0) {
passport.use(new passportTwitter({
consumerKey: config.twitter.key,
consumerSecret: config.twitter.secret,
callbackURL: config.url + 'auth/twitter/callback'
}, function(token, tokenSecret, profile, done) {
user_module.loginViaTwitter(profile.id, profile.username, function(err, user) {
if (err) { return done(err); }
done(null, user);
});
}));
login_strategies.push('twitter');
}
if (config.google && config.google.id.length > 0 && config.google.secret.length > 0) {
passport.use(new passportGoogle({
clientID: config.google.id,
clientSecret: config.google.secret,
callbackURL: config.url + 'auth/google/callback'
}, function(accessToken, refreshToken, profile, done) {
user_module.loginViaGoogle(profile.id, profile.displayName, profile.emails[0].value, function(err, user) {
if (err) { return done(err); }
done(null, user);
});
}));
login_strategies.push('google');
}
if (config.facebook && config.facebook.app_id.length > 0 && config.facebook.secret.length > 0) {
passport.use(new passportFacebook({
clientID: config.facebook.app_id,
clientSecret: config.facebook.secret,
callbackURL: config.url + 'auth/facebook/callback'
}, function(accessToken, refreshToken, profile, done) {
user_module.loginViaFacebook(profile.id, profile.displayName, profile.emails[0].value, function(err, user) {
if (err) { return done(err); }
done(null, user);
});
}));
login_strategies.push('facebook');
}
passport.serializeUser(function(user, done) {
done(null, user.uid);
});
passport.deserializeUser(function(uid, done) {
done(null, {
uid: uid
});
});
Auth.initialize = function(app) {
app.use(passport.initialize());
app.use(passport.session());
}
Auth.get_login_strategies = function() {
return login_strategies;
}
Auth.create_routes = function(app) {
app.get('/logout', function(req, res) {
console.log('info: [Auth] Session ' + req.sessionID + ' logout (uid: ' + global.uid + ')');
user_module.logout(req.sessionID, function(logout) {
req.logout();
res.send(templates['header'] + templates['logout'] + templates['footer']);
});
});
if (login_strategies.indexOf('twitter') !== -1) {
app.get('/auth/twitter', passport.authenticate('twitter'));
app.get('/auth/twitter/callback', passport.authenticate('twitter', {
successRedirect: '/',
failureRedirect: '/login'
}));
}
if (login_strategies.indexOf('google') !== -1) {
app.get('/auth/google', passport.authenticate('google', { scope: 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email' }));
app.get('/auth/google/callback', passport.authenticate('google', {
successRedirect: '/',
failureRedirect: '/login'
}));
}
if (login_strategies.indexOf('facebook') !== -1) {
app.get('/auth/facebook', passport.authenticate('facebook', { scope: 'email' }));
app.get('/auth/facebook/callback', passport.authenticate('facebook', {
successRedirect: '/',
failureRedirect: '/login'
}));
}
app.get('/reset/:code', function(req, res) {
res.send(templates['header'] + templates['reset_code'].parse({ reset_code: req.params.code }) + templates['footer']);
});
app.get('/reset', function(req, res) {
res.send(templates['header'] + templates['reset'] + templates['footer']);
});
app.get('/register', function(req, res) {
res.send(templates['header'] + templates['register'] + templates['footer']);
});
app.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login'
}));
app.post('/register', function(req, res) {
user_module.create(req.body.username, req.body.password, req.body.email, function(err, uid) {
if (err === null) {
req.login({
uid: uid
}, function() {
res.redirect('/');
});
} else {
res.redirect('/register');
}
});
});
}
}(exports));

@ -6,77 +6,12 @@ var express = require('express'),
config = require('../config.js'),
redis = require('redis'),
redisServer = redis.createClient(config.redis.port, config.redis.host, config.redis.options),
passport = require('passport'),
passportLocal = require('passport-local').Strategy,
passportTwitter = require('passport-twitter').Strategy,
passportGoogle = require('passport-google-oauth').OAuth2Strategy,
passportFacebook = require('passport-facebook').Strategy,
user = require('./user.js'),
utils = require('./utils.js'),
admin = require('./routes/admin.js'),
login_strategies = [];
passport.use(new passportLocal(function(user, password, next) {
global.modules.user.loginViaLocal(user, password, function(login) {
if (login.status === 'ok') next(null, login.user);
else next(null, false, login);
});
}));
if (config.twitter && config.twitter.key && config.twitter.key.length > 0 && config.twitter.secret.length > 0) {
passport.use(new passportTwitter({
consumerKey: config.twitter.key,
consumerSecret: config.twitter.secret,
callbackURL: config.url + 'auth/twitter/callback'
}, function(token, tokenSecret, profile, done) {
global.modules.user.loginViaTwitter(profile.id, profile.username, function(err, user) {
if (err) { return done(err); }
done(null, user);
});
}));
login_strategies.push('twitter');
}
if (config.google && config.google.id.length > 0 && config.google.secret.length > 0) {
passport.use(new passportGoogle({
clientID: config.google.id,
clientSecret: config.google.secret,
callbackURL: config.url + 'auth/google/callback'
}, function(accessToken, refreshToken, profile, done) {
global.modules.user.loginViaGoogle(profile.id, profile.displayName, profile.emails[0].value, function(err, user) {
if (err) { return done(err); }
done(null, user);
});
}));
login_strategies.push('google');
}
if (config.facebook && config.facebook.app_id.length > 0 && config.facebook.secret.length > 0) {
passport.use(new passportFacebook({
clientID: config.facebook.app_id,
clientSecret: config.facebook.secret,
callbackURL: config.url + 'auth/facebook/callback'
}, function(accessToken, refreshToken, profile, done) {
global.modules.user.loginViaFacebook(profile.id, profile.displayName, profile.emails[0].value, function(err, user) {
if (err) { return done(err); }
done(null, user);
});
}));
auth = require('./routes/authentication.js');
login_strategies.push('facebook');
}
passport.serializeUser(function(user, done) {
done(null, user.uid);
});
passport.deserializeUser(function(uid, done) {
done(null, {
uid: uid
});
});
(function(app) {
var templates = global.templates;
@ -96,8 +31,9 @@ passport.deserializeUser(function(uid, done) {
secret: config.secret,
key: 'express.sid'
}));
app.use(passport.initialize());
app.use(passport.session());
auth.initialize(app);
app.use(function(req, res, next) {
// Don't bother with session handling for API requests
if (/^\/api\//.test(req.url)) return next();
@ -112,26 +48,19 @@ passport.deserializeUser(function(uid, done) {
next();
});
// Dunno wtf this does
// app.use(express.logger({ format: '\x1b[1m:method\x1b[0m \x1b[33m:url\x1b[0m :response-time ms' }));
// Useful if you want to use app.put and app.delete (instead of app.post all the time)
// app.use(express.methodOverride());
auth.create_routes(app);
admin.create_routes(app);
app.get('/403', function(req, res) {
res.send(templates['header'] + templates['403'] + templates['footer']);
});
function create_route(url, tpl) { // to remove
app.create_route = function(url, tpl) { // to remove
return '<script>templates.ready(function(){ajaxify.go("' + url + '", null, "' + tpl + '");});</script>';
}
app.create_route = create_route;
};
// Basic Routes (entirely client-side parsed, goal is to move the rest of the crap in this file into this one section)
(function() {
var routes = ['', 'login', 'register', 'account', 'latest', 'popular', 'active'];
var routes = ['', 'login', 'register', 'account', 'latest', 'popular', 'active', '403'];
for (var i=0, ii=routes.length; i<ii; i++) {
(function(route) {
@ -143,7 +72,7 @@ passport.deserializeUser(function(uid, done) {
return;
}
res.send(templates['header'] + create_route(route) + templates['footer']);
res.send(templates['header'] + app.create_route(route) + templates['footer']);
});
}(routes[i]));
}
@ -163,14 +92,9 @@ passport.deserializeUser(function(uid, done) {
app.get('/confirm/:code', function(req, res) {
res.send(templates['header'] + '<script>templates.ready(function(){ajaxify.go("confirm/' + req.params.code + '");});</script>' + templates['footer']);
});
admin.create_routes(app);
// These functions are called via ajax once the initial page is loaded to populate templates with data
function api_method(req, res) {
function api_method(req, res) {
switch(req.params.method) {
case 'home' :
global.modules.categories.get(function(data) {
@ -179,6 +103,7 @@ passport.deserializeUser(function(uid, done) {
break;
case 'login' :
var data = {},
login_strategies = auth.get_login_strategies(),
num_strategies = login_strategies.length;
if (num_strategies == 0) {
@ -270,71 +195,9 @@ passport.deserializeUser(function(uid, done) {
app.get('/api/:method/:id*', api_method);
app.post('/login', passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login'
}));
app.get('/logout', function(req, res) {
console.log('info: [Auth] Session ' + res.sessionID + ' logout (uid: ' + global.uid + ')');
global.modules.user.logout(req.sessionID, function(logout) {
req.logout();
res.send(templates['header'] + templates['logout'] + templates['footer']);
});
});
if (login_strategies.indexOf('twitter') !== -1) {
app.get('/auth/twitter', passport.authenticate('twitter'));
app.get('/auth/twitter/callback', passport.authenticate('twitter', {
successRedirect: '/',
failureRedirect: '/login'
}));
}
if (login_strategies.indexOf('google') !== -1) {
app.get('/auth/google', passport.authenticate('google', { scope: 'https://www.googleapis.com/auth/userinfo.profile https://www.googleapis.com/auth/userinfo.email' }));
app.get('/auth/google/callback', passport.authenticate('google', {
successRedirect: '/',
failureRedirect: '/login'
}));
}
if (login_strategies.indexOf('facebook') !== -1) {
app.get('/auth/facebook', passport.authenticate('facebook', { scope: 'email' }));
app.get('/auth/facebook/callback', passport.authenticate('facebook', {
successRedirect: '/',
failureRedirect: '/login'
}));
}
app.get('/reset/:code', function(req, res) {
res.send(templates['header'] + templates['reset_code'].parse({ reset_code: req.params.code }) + templates['footer']);
});
app.get('/reset', function(req, res) {
res.send(templates['header'] + templates['reset'] + templates['footer']);
});
app.get('/register', function(req, res) {
res.send(templates['header'] + templates['register'] + templates['footer']);
});
app.post('/register', function(req, res) {
global.modules.user.create(req.body.username, req.body.password, req.body.email, function(err, uid) {
if (err === null) {
req.login({
uid: uid
}, function() {
res.redirect('/');
});
} else {
res.redirect('/register');
}
});
});
// TODO move user related logic into another file vvvvvvvvvvvvvvvvvvvv
app.post('/edituser', function(req, res){
@ -350,24 +213,6 @@ passport.deserializeUser(function(uid, done) {
});
app.get('/baristest', function(req, res) {
/*user.getUserField(req.user.uid, 'email', function(data) {
console.log(" I GOT FIELD " +data);
});*/
/* user.getUserData(req.user.uid, function(data) {
console.log(" USER DATA : " + JSON.stringify(data));
});*/
// user.getUserFields(req.user.uid, ['email','username'], function(data) {
/*user.getUserFields(req.user.uid, ['username','email'], function(data) {
console.log(" I GOT FIELDS " +JSON.stringify(data));
});*/
user.get_usernames_by_uids(["17","1"], function(data){
console.log("I GOT "+JSON.stringify(data));
});
});
//to baris, move this into account.js or sth later - just moved this out here for you to utilize client side tpl parsing
//I didn't want to change too much so you should probably sort out the params etc
function get_account_fn(req, res, callback) {
@ -421,7 +266,7 @@ passport.deserializeUser(function(uid, done) {
user.getUserList(function(data){
res.send(templates['header'] + create_route("users", "users") + templates['footer']);
res.send(templates['header'] + app.create_route("users", "users") + templates['footer']);
});
@ -435,7 +280,7 @@ passport.deserializeUser(function(uid, done) {
user.getUserField(req.user.uid, 'username', function(username) {
if(req.params.uid && username === req.params.uid)
res.send(templates['header'] + create_route('users/'+req.params.uid+'/edit','accountedit') + templates['footer']);
res.send(templates['header'] + app.create_route('users/'+req.params.uid+'/edit','accountedit') + templates['footer']);
else
return res.redirect('/403');
});
@ -460,7 +305,7 @@ passport.deserializeUser(function(uid, done) {
user.getUserData(uid, function(data) {
if(data) {
res.send(templates['header'] + create_route('users/'+data.username, 'account') + templates['footer']);
res.send(templates['header'] + app.create_route('users/'+data.username, 'account') + templates['footer']);
}
else {
res.redirect('/403');
@ -469,11 +314,7 @@ passport.deserializeUser(function(uid, done) {
});
}
app.get('/test', function(req, res) {
global.modules.topics.delete(1, 1);
res.send();
});
// TODO move user related logic into another file ^^^^^^^^^^^^^^^^^^^^^^^
}(WebServer));
server.listen(config.port);

Loading…
Cancel
Save