1 (function () { 2 var express = require('express'); 3 var jade = require('jade'); 4 var couchlib = require(__dirname + '/lib/couchlib.js'); 5 var filterlib = require(__dirname + '/lib/filterlib.js'); 6 var fbauth = require(__dirname + '/lib/fbauth.js'); 7 var lib = require(__dirname + '/lib/lib.js'); 8 9 exports.fbauth = fbauth; 10 exports.couchlib = couchlib; 11 exports.filterlib = filterlib; 12 exports.lib = lib; 13 14 var create = function (static_dir, session_key, register_code, base_navs, unauth_navs, authed_navs, couchdb_opts) { 15 var loadUser = function (req, res, next) { 16 if (typeof req.session.username != 'undefined' && req.session.username.length > 0) { 17 var cdb = couchlib.get_couchdb_schema(couchdb_opts, 'users'); 18 cdb.get(req.session.username, function (err, doc) { 19 if (err) { 20 req.user = false; 21 } else { 22 req.user = doc; 23 } 24 next(); 25 }); 26 } else { 27 req.user = false; 28 next(); 29 } 30 }; 31 exports.loadUser = loadUser; 32 33 var getNavs = function (req, res, next) { 34 req.navs = lib.clone(base_navs); 35 if (req.user == false) { 36 for(var i in unauth_navs) { 37 if(unauth_navs.hasOwnProperty(i)) { 38 req.navs[i] = unauth_navs[i]; 39 }; 40 }; 41 } else { 42 for(var i in authed_navs) { 43 if(authed_navs.hasOwnProperty(i)) { 44 req.navs[i] = authed_navs[i]; 45 }; 46 }; 47 } 48 next(); 49 }; 50 exports.getNavs = getNavs; 51 52 var app = express.createServer(); 53 app.configure(function() { 54 app.set('view engine', 'jade'); 55 app.use(express.cookieParser()); 56 app.use(express.bodyParser()); 57 app.use(express.static(static_dir)); 58 app.use(express.responseTime()); 59 app.use(express.session({secret: session_key})); 60 }); 61 62 app.get('/', loadUser, getNavs, function (req, res, next) { 63 res.render('index.jade', { locals: { navs: req.navs, news: [] } }); 64 }); 65 66 app.get('/about', loadUser, getNavs, function (req, res, next) { 67 res.render('about.jade', { locals: { navs: req.navs } }); 68 }); 69 70 var register_vars = function (navs, message, code, username, displayname, email) { 71 return {navs: navs, message: message, code: code, username: username, displayname: displayname, email: email}; 72 }; 73 74 app.get('/register', loadUser, getNavs, function (req, res, next) { 75 res.render('register.jade', { locals: register_vars(req.navs, '', '', '', '', '') }); 76 }); 77 78 app.post('/register', loadUser, getNavs, function (req, res, next) { 79 var code = filterlib.alphanumeric(req.body.code); 80 var username = filterlib.alphanumeric_lower(req.body.username); 81 var displayname = filterlib.alphanumeric(req.body.displayname); 82 var email = req.body.email; 83 var password = req.body.password; 84 var password2 = req.body.password2; 85 if (register_code.length > 0 && register_code != code) { 86 res.render('register.jade', { locals: register_vars(req.navs, 'Invalid code', '', username, displayname, email) }); 87 } else { 88 if (password != password2) { 89 res.render('register.jade', { locals: register_vars(req.navs, 'Both password fields should be the same.', code, username, displayname, email) }); 90 } else { 91 fbauth.check_for_user(couchdb_opts, username, function (err, exists) { 92 if (err) { 93 res.render('register.jade', { locals: register_vars(req.navs, 'Some error occured!', code, username, displayname, email) }); 94 } else if (exists == true) { 95 res.render('register.jade', { locals: register_vars(req.navs, 'User already exists, please choose a different username.', code, username, displayname, email) }); 96 } else { 97 fbauth.check_for_displayname(couchdb_opts, displayname, function (err, exists) { 98 if (err) { 99 res.render('register.jade', { locals: register_vars(req.navs, 'Some error occured!', code, username, displayname, email) }); 100 } else if (exists == true) { 101 res.render('register.jade', { locals: register_vars(req.navs, 'Display name already exists, please choose a different display name.', code, username, displayname, email) }); 102 } else { 103 fbauth.add_user(couchdb_opts, username, displayname, email, password, function (err, success) { 104 if (err) { 105 res.render('register.jade', { locals: register_vars(req.navs, 'Some error occured!', code, username, displayname, email) }); 106 } else { 107 if (success == true) { 108 req.session.username = username; 109 res.redirect('/'); 110 } else { 111 res.render('register.jade', { locals: register_vars(req.navs, 'Some error occured!', code, username, displayname, email) }); 112 } 113 } 114 }); 115 } 116 }); 117 } 118 }); 119 } 120 } 121 }); 122 123 app.get('/login', loadUser, getNavs, function (req, res, next) { 124 res.render('login.jade', { locals: { navs: req.navs, message: '' } }); 125 }); 126 127 app.post('/login', loadUser, getNavs, function (req, res, next) { 128 var username = filterlib.alphanumeric_lower(req.body.username); 129 var password = req.body.password; 130 fbauth.login_user(couchdb_opts, username, password, function (err, user) { 131 if (err) { 132 if (err.error == 'not_found') { 133 res.render('login.jade', { locals: { navs: req.navs, message: 'Invalid username or password.' } }); 134 } else { 135 if (err == 'invalid_username_password') { 136 res.render('login.jade', { locals: { navs: req.navs, message: 'Invalid username or password.' } }); 137 } else { 138 res.render('login.jade', { locals: { navs: req.navs, message: 'Some odd error occured, please tell someone about it.' } }); 139 } 140 } 141 } else { 142 req.session.username = username; 143 res.redirect('/'); 144 } 145 }); 146 }); 147 148 app.get('/logout', function (req, res, next) { 149 req.session.destroy(); 150 res.redirect('/'); 151 }); 152 153 return app; 154 }; 155 exports.create = create; 156 })(); 157