summaryrefslogtreecommitdiff
path: root/server
diff options
context:
space:
mode:
Diffstat (limited to 'server')
-rw-r--r--server/index.js2
-rw-r--r--server/lib/api.js24
-rw-r--r--server/lib/auth.js6
-rw-r--r--server/lib/schemas/User.js8
-rw-r--r--server/lib/upload.js72
-rw-r--r--server/lib/util.js11
6 files changed, 121 insertions, 2 deletions
diff --git a/server/index.js b/server/index.js
index fc77660..34d5989 100644
--- a/server/index.js
+++ b/server/index.js
@@ -71,6 +71,8 @@ app.get('/auth/facebook', auth.login('facebook'));
app.get('/auth/facebook/callback', auth.loggedIn('facebook'));
app.get('/profile', views.profile)
app.get('/profile/edit', views.profile)
+app.get('/api/profile', middleware.ensureAuthenticated, api.profile.show)
+app.put('/api/profile', middleware.ensureAuthenticated, api.profile.update)
app.get('/project/new', views.modal);
diff --git a/server/lib/api.js b/server/lib/api.js
index d9934ab..9ff9f38 100644
--- a/server/lib/api.js
+++ b/server/lib/api.js
@@ -3,10 +3,32 @@
var passport = require('passport'),
_ = require('lodash'),
Entities = require('html-entities').XmlEntities,
- entities = new Entities();
+ entities = new Entities(),
+ crypto = require('crypto'),
+ _ = require('lodash'),
+ util = require('./util'),
+ config = require('../../config.json'),
+ User = require('./schemas/User');
var api = {
+
+ profile: {
+ show: function(req, res){
+ User.findOne({ _id: req.user._id }, function(err, user){
+ res.json(err || user)
+ })
+ },
+ update: function(req, res){
+ var data = req.cleanQuery(req.body)
+ if (data.new_password.length && req.user.checkPassword(data.old_password)) {
+ data.password = data.new_password
+ }
+ delete data.old_password
+ delete data.new_password
+ }
+ }
+
}
diff --git a/server/lib/auth.js b/server/lib/auth.js
index ede52b6..e7b7a75 100644
--- a/server/lib/auth.js
+++ b/server/lib/auth.js
@@ -5,6 +5,7 @@ var passport = require('passport'),
TwitterStrategy = require('passport-twitter').Strategy,
LocalStrategy = require('passport-local').Strategy,
passportSocketIo = require("passport.socketio"),
+ crypto = require('crypto'),
_ = require('lodash'),
util = require('./util'),
config = require('../../config.json'),
@@ -91,6 +92,10 @@ var auth = {
var username = util.trim(req.body.username)
var password = req.body.password
var email = util.trim(req.body.email)
+
+ var shasum = crypto.createHash('sha1')
+ shasum.update(password)
+ password = shasum.digest('hex');
User.findOne({ username: username }, function (err, user) {
if (user) {
@@ -156,6 +161,7 @@ var auth = {
username: profile.username || profile.displayName.toLowerCase().replace(/ /g,'-'),
displayName: profile.displayName,
photo: "http://graph.facebook.com/" + profile.id + "/picture?type=large",
+ facebookUrl: profile.username ? "https://facebook.com/" + profile.username : ""
};
User.findOne({facebook_id: profile.id}, function(err, data){
diff --git a/server/lib/schemas/User.js b/server/lib/schemas/User.js
index d78bfd2..24b0adf 100644
--- a/server/lib/schemas/User.js
+++ b/server/lib/schemas/User.js
@@ -4,6 +4,7 @@ var NONALPHANUMERICS_REGEX = new RegExp('[^-_a-zA-Z0-9]', 'g')
var mongoose = require('mongoose'),
_ = require('lodash'),
+ crypto = require('crypto'),
config = require('../../../config.json');
var UserSchema = new mongoose.Schema({
@@ -28,6 +29,8 @@ var UserSchema = new mongoose.Schema({
case 'assets':
case 'admin':
case 'terms':
+ case 'api':
+ case 'vvalls':
case 'assets':
case '':
return false
@@ -53,11 +56,14 @@ var UserSchema = new mongoose.Schema({
bio: { type: String, default: "" },
website: { type: String, default: "" },
twitterName: { type: String, default: "" },
+ facebookUrl: { type: String, default: "" },
isAdmin: { type: Boolean, default: false }
});
UserSchema.methods.validPassword = function (pw) {
- return this.password === pw
+ var shasum = crypto.createHash('sha1')
+ shasum.update(pw)
+ return this.password === shasum.digest('hex');
}
module.exports = exports = mongoose.model('user', UserSchema);
diff --git a/server/lib/upload.js b/server/lib/upload.js
new file mode 100644
index 0000000..5c130a2
--- /dev/null
+++ b/server/lib/upload.js
@@ -0,0 +1,72 @@
+
+var config = require('../../config.json'),
+ util = require('./util'),
+ knox = require('knox'),
+ moment = require('moment');
+
+var s3 = module.exports.s3 = knox.createClient({
+ key: process.env.OKFOCUS_S3_KEY,
+ secret: process.env.OKFOCUS_S3_SECRET,
+ bucket: 'vvalls'
+});
+
+var acceptableuploadTypes = {
+ 'image/gif': 'gif',
+ 'image/jpeg': 'jpg',
+ 'image/png': 'png'
+}
+
+module.exports.put = function (key, image, opt) {
+ var imageSize, imageType, filename
+ var err
+ var now = new Date()
+
+ var ts = moment().format('YYYYMMDD')
+
+ var extension = acceptableuploadTypes[image.type]
+ filename = (+now) + "-"
+ + image.name.replace(/\..*$/,"")
+ .replace(/[^0-9a-zA-Z]+/g,"-")
+ .substr(-64)
+ + "." + extension;
+
+ var remote_path = "/images/" + key + "/" + ts + "/" + filename
+
+ if (! extension) {
+ err = "unacceptable filetype"
+ }
+ else if (image.size < 10) {
+ err = "file too small"
+ }
+ else if (image.size > 2097152) { // 2mb limit
+ err = "file too large"
+ }
+
+ if (err) {
+ console.error(">>>", err)
+ opt.unacceptable && opt.unacceptable(err)
+ return
+ }
+
+ opt.acceptable && opt.acceptable(err)
+
+ console.log("upload > ", remote_path)
+ s3.putFile(image.path, remote_path, {
+ 'Content-Length': image.size,
+ 'Content-Type': image.type,
+ 'x-amz-acl': 'public-read'
+ }, function(err, s3res) {
+ if (err || s3res.statusCode !== 200) {
+ console.error(err);
+ s3res.resume()
+ return;
+ }
+
+ var image_url = s3res.url || s3res.req.url
+
+ opt.success && opt.success(image_url)
+ }).on('error', function(err, s3res){
+ console.error(err)
+ s3res && s3res.resume && s3res.resume()
+ })
+}
diff --git a/server/lib/util.js b/server/lib/util.js
index 45902f3..7a63507 100644
--- a/server/lib/util.js
+++ b/server/lib/util.js
@@ -5,4 +5,15 @@ var whitespaceTail = /\s+$/
var util = {}
util.trim = function (s){ return s.replace(whitespaceHead,"").replace(whitespaceTail,"") }
+util.cleanQuery = function (query) {
+ var update = _.extend({}, query);
+ delete update._id;
+ delete update.created_at;
+ delete update.modified_at;
+ delete update.modified_by;
+ delete update.created_by;
+ return update;
+}
+
+
module.exports = util