diff options
Diffstat (limited to 'server/lib')
| -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 |
5 files changed, 165 insertions, 0 deletions
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 + }); +}; |
