diff options
| author | Julie Lala <jules@okfoc.us> | 2014-06-04 00:31:01 -0400 |
|---|---|---|
| committer | Julie Lala <jules@okfoc.us> | 2014-06-04 00:31:01 -0400 |
| commit | 80e1fcbc52870366f2e885fe82724960929765c9 (patch) | |
| tree | d380e04e8d784c40606bdaad82dcd37d0e260de5 /server | |
| parent | 5fb0ad045820de96848e1bde8e2dba8a6853dd4d (diff) | |
| parent | 90142bd07f926ef8a7f3ea86a563ec0ca648ca5d (diff) | |
Merge branch 'master' of github.com:okfocus/vvalls
Diffstat (limited to 'server')
| -rw-r--r-- | server/index.js | 99 | ||||
| -rw-r--r-- | server/lib/api.js | 13 | ||||
| -rw-r--r-- | server/lib/auth.js | 53 | ||||
| -rw-r--r-- | server/lib/middleware.js | 22 | ||||
| -rw-r--r-- | server/lib/schemas/User.js | 66 | ||||
| -rw-r--r-- | server/lib/views.js | 11 |
6 files changed, 264 insertions, 0 deletions
diff --git a/server/index.js b/server/index.js new file mode 100644 index 0000000..601dbba --- /dev/null +++ b/server/index.js @@ -0,0 +1,99 @@ +/* jshint node: true */ +var ejs = require('ejs'); +ejs.open = '[['; +ejs.close = ']]'; + +var config = require('../config.json'), + http = require('http'), + express = require('express'), + MongoStore = require('connect-mongo')(express), + TwitterStrategy = require('passport-twitter').Strategy, + passport = require('passport'), + passportSocketIo = require("passport.socketio"), + path = require('path'), + mongoose = require('mongoose'); + +var io = websocket.listen(config.socketPort) + +var app = express(); +var DATABASE_URI = process.env.MONGOLAB_URI || ('mongodb://' + config.hostName + '/vvalls') + +mongoose.connect(DATABASE_URI); +var SessionStore = new MongoStore({ mongoose_connection: mongoose.connection }) + +// Configure things +app.set('port', config.port); +app.set('views', path.join(__dirname, '../views')); +app.set('view engine', 'ejs'); +app.use(express.static(path.join(__dirname, '../public'))); +app.use(express.logger('dev')); +app.use(express.json()); +app.use(express.urlencoded()); +app.use(express.cookieParser()); +app.use(express.session({ + key: 'posthang.sid', + secret: '1337machine', + cookie: { domain: '.' + config.hostName, maxAge: 43200000 }, + store: SessionStore +})); +app.use(express.bodyParser()); +app.use(express.query()); +app.use(express.methodOverride()); +app.use(passport.initialize()); +app.use(passport.session()); +// app.use('/api', middleware.ensureAuthenticated, mers({conn: mongoose.connection}).rest()); +app.use(app.router); +app.get('env') === 'development' && app.use(express.errorHandler()); + + +// Configure user authentication +passport.serializeUser(auth.serializeUser); +passport.deserializeUser(auth.deserializeUser); +passport.use(new TwitterStrategy({ + consumerKey: process.env.VVALLS_TWITTER_KEY || '0L5blfBIapqhpons8bCXdIoGM', + consumerSecret: process.env.VVALLS_TWITTER_SECRET || '5EKW7m7inoODqYSKbp7cadBKFp1FghBl4MBDoXNcUjKtodZfuP', + callbackURL: 'http://' + config.host + '/auth/twitter/callback' +}, api.insertUser)); + +// Essential middleware +// app.all('*', middleware.enableCORS); + +// Initialize views +app.get('/login', views.login); +app.get('/logout', auth.logout); +app.get('/auth/twitter', auth.login('twitter')); +app.get('/auth/twitter/callback', auth.loggedIn('twitter')); + + + + +io.set('authorization', passportSocketIo.authorize({ + cookieParser: express.cookieParser, + passport: passport, + key: 'posthang.sid', // the name of the cookie where express/connect stores its session_id + secret: '1337machine', // the session_secret to parse the cookie + store: SessionStore, // we NEED to use a sessionstore. no memorystore please + success: onAuthorizeSuccess, // *optional* callback on success - read more below + fail: onAuthorizeFail, // *optional* callback on fail/error - read more below +})); + +function onAuthorizeSuccess (data, accept) { + // console.error('successful connection to socket.io'); + accept(null, true); +} +function onAuthorizeFail(data, message, error, accept){ + if (error) { + throw new Error(message); + } + // console.log(data) + console.error('failed connection to socket.io:', message); + + // We use this callback to log all of our failed connections. + accept(null, false); +} + + +http.createServer(app).listen(app.get('port'), function () { + console.log('Express server listening on port ' + app.get('port')); +}); + diff --git a/server/lib/api.js b/server/lib/api.js new file mode 100644 index 0000000..d9934ab --- /dev/null +++ b/server/lib/api.js @@ -0,0 +1,13 @@ +/* jshint node: true */ + +var passport = require('passport'), + _ = require('lodash'), + Entities = require('html-entities').XmlEntities, + entities = new Entities(); + + +var api = { +} + + +module.exports = api diff --git a/server/lib/auth.js b/server/lib/auth.js new file mode 100644 index 0000000..93fe223 --- /dev/null +++ b/server/lib/auth.js @@ -0,0 +1,53 @@ +/* jshint node: true */ + +var passport = require('passport'), + _ = require('lodash'), + config = require('../../config.json'), + User = require('./schemas/User'); + +var entities = new Entities(); + +var auth = { + + login: function (method) { + return passport.authenticate(method); + }, + + logout: function (req, res) { + req.logout(); + res.redirect('/'); + }, + + serializeUser: function (user, done) { + done(null, user.twitter_id); + }, + + deserializeUser: function (id, done) { + User.findOne({ twitter_id: id }, "_id displayName username photo", function (err, user) { + done(err, user); + }); + }, + + insertUser: function (accessToken, refreshToken, profile, done) { + process.nextTick(function () { + var userData = { + username: profile.username, + displayName: profile.displayName, + photo: profile.photos[0].value + }; + User.update({twitter_id: profile.id}, userData, {upsert: true}, function (userData, profile, err) { + return done(err, _.merge(userData, {twitter_id: profile.id})); + }.bind(this, userData, profile)); + }); + }, + + loggedIn: function () { + return passport.authenticate('twitter', { + successReturnToOrRedirect: '/', + failureRedirect: '/login' + }); + }, + +} + +module.exports = auth diff --git a/server/lib/middleware.js b/server/lib/middleware.js new file mode 100644 index 0000000..dea8019 --- /dev/null +++ b/server/lib/middleware.js @@ -0,0 +1,22 @@ + +/* jshint node: true */ + +var passport = require('passport'), + _ = require('lodash'), + config = require('../../config.json'), + User = require('./schemas/User'); + + +var middleware = { + + enableCORS: function (req, res, next) { + res.header('Access-Control-Allow-Credentials', true); + // TODO Check https vs. http + res.header('Access-Control-Allow-Origin', '*'); + res.header('Access-Control-Allow-Headers', 'X-Requested-With'); + next(); + }, + +} + +module.exports = middleware diff --git a/server/lib/schemas/User.js b/server/lib/schemas/User.js new file mode 100644 index 0000000..93c0cd3 --- /dev/null +++ b/server/lib/schemas/User.js @@ -0,0 +1,66 @@ +/* jshint node: true */ + +var NONALPHANUMERICS_REGEX = new RegExp('[^-_a-zA-Z0-9]', 'g') + +var mongoose = require('mongoose'), + _ = require('lodash'), + config = require('../../../config.json'); + +var UserSchema = new mongoose.Schema({ + twitter_id: String, + displayName: String, + username: { + type: String, + required: true, + validate: [function (val) { + val = val.replace(NONALPHANUMERICS_REGEX, "") + this.username = val.toLowerCase() + switch (val) { + case 'login': + case 'logout': + case 'profile': + case 'auth': + case 'upload': + case 'about': + case 'settings': + case 'admin': + case 'terms': + case '': + return false + } + if (! this.displayName) { this.displayName = val; } + return true + }, "{PATH} is not an acceptable name"] + }, + email: { + type: String, + default: "", + }, + emailVerified: { + type: Boolean, + default: false, + }, + password: { + type: String, + validate: [function (val) { + if (! val.length) return true + return true + }, "{PATH} is not an acceptable password"] + }, + photo: { + type: String, + required: true + }, + bio: { + type: String, + default: "" + }, + links: [ + { type: String, default: "" } + ], + isAdmin: { type: Boolean, default: false } +}); + + +module.exports = exports = mongoose.model('user', UserSchema); +exports.schema = UserSchema; diff --git a/server/lib/views.js b/server/lib/views.js new file mode 100644 index 0000000..7f3d1a0 --- /dev/null +++ b/server/lib/views.js @@ -0,0 +1,11 @@ +/* jshint node: true */ + +var User = require('./schemas/User'), + config = require('../../config'), + _ = require('lodash'); + +exports.login = function (req, res) { + res.render('login', { + config: config + }); +}; |
