summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
authorJulie Lala <jules@okfoc.us>2014-06-04 00:31:01 -0400
committerJulie Lala <jules@okfoc.us>2014-06-04 00:31:01 -0400
commit80e1fcbc52870366f2e885fe82724960929765c9 (patch)
treed380e04e8d784c40606bdaad82dcd37d0e260de5 /server
parent5fb0ad045820de96848e1bde8e2dba8a6853dd4d (diff)
parent90142bd07f926ef8a7f3ea86a563ec0ca648ca5d (diff)
Merge branch 'master' of github.com:okfocus/vvalls
Diffstat (limited to 'server')
-rw-r--r--server/index.js99
-rw-r--r--server/lib/api.js13
-rw-r--r--server/lib/auth.js53
-rw-r--r--server/lib/middleware.js22
-rw-r--r--server/lib/schemas/User.js66
-rw-r--r--server/lib/views.js11
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
+ });
+};