summaryrefslogtreecommitdiff
path: root/server/lib
diff options
context:
space:
mode:
Diffstat (limited to 'server/lib')
-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
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
+ });
+};