diff options
Diffstat (limited to 'bucky')
| -rw-r--r-- | bucky/app/api.js | 25 | ||||
| -rw-r--r-- | bucky/app/bucky.js | 1196 | ||||
| -rw-r--r-- | bucky/app/pages.js | 222 | ||||
| -rw-r--r-- | bucky/app/site.js | 5 | ||||
| -rw-r--r-- | bucky/bin/build-scripts.js | 43 | ||||
| -rw-r--r-- | bucky/db/index.js | 33 | ||||
| -rw-r--r-- | bucky/util/auth.js | 250 |
7 files changed, 950 insertions, 824 deletions
diff --git a/bucky/app/api.js b/bucky/app/api.js index 857849e..a2f85d0 100644 --- a/bucky/app/api.js +++ b/bucky/app/api.js @@ -98,6 +98,31 @@ function route(app) { function (req, res) { res.json({ threads: res.threads, + hootstream: res.hootstream, + hootbox: res.hootbox, + lastlog: res.lastlog, + mail: res.mail, + }); + } + ); + app.get( + "/api/stream", + bucky.ensureLastlog, + middleware.ensureAuthenticated, + // bucky.ensureLatestThreads, + bucky.ensureHootbox, + bucky.ensureHootstream, + privacy.filterPrivateThreads, + bucky.ensureCommentCountsForThreads, + bucky.ensureFileCountsForThreads, + bucky.ensureKeywordsForThreads, + bucky.bumpLastSeen, + bucky.checkMail, + function (req, res) { + res.json({ + threads: res.threads, + files: res.files, + comments: res.comments, hootbox: res.hootbox, lastlog: res.lastlog, mail: res.mail, diff --git a/bucky/app/bucky.js b/bucky/app/bucky.js index b9d9a16..5dc7244 100644 --- a/bucky/app/bucky.js +++ b/bucky/app/bucky.js @@ -1,87 +1,107 @@ -var _ = require('lodash') -var db = require('../db') -var util = require('../util/util') -var upload = require('../util/upload') - -var bucky = module.exports = { +var _ = require("lodash"); +var db = require("../db"); +var util = require("../util/util"); +var upload = require("../util/upload"); +var bucky = (module.exports = { /* INDEX */ - ensureLatestThreads: function (req, res, next){ - db.getLatestThreads().then(function(threads){ - res.threads = threads - res.threads_ids = res.threads.pluck("id").sort() - res.keywords = _.uniq(res.threads.pluck("keyword")) - next() - }) + ensureLatestThreads: function (req, res, next) { + db.getLatestThreads().then(function (threads) { + res.threads = threads; + res.threads_ids = res.threads.pluck("id").sort(); + res.keywords = _.uniq(res.threads.pluck("keyword")); + next(); + }); }, - ensureCommentCountsForThreads: function (req, res, next){ - db.getCommentCounts(res.threads_ids).then(function(counts){ - var lookup = {} - counts.forEach(function(c){ - lookup[c.thread] = c - }) - res.threads.forEach(function(thread){ + ensureCommentCountsForThreads: function (req, res, next) { + db.getCommentCounts(res.threads_ids).then(function (counts) { + var lookup = {}; + counts.forEach(function (c) { + lookup[c.thread] = c; + }); + res.threads.forEach(function (thread) { if (lookup[thread.id]) { - thread.set("comment_count", lookup[thread.id].count) + thread.set("comment_count", lookup[thread.id].count); } - }) - next() - }) + }); + next(); + }); }, - ensureFileCountsForThreads: function (req, res, next){ - db.getFileSizes(res.threads_ids).then(function(counts){ - var lookup = {} - counts.forEach(function(c){ - lookup[c.thread] = c - }) - res.threads.forEach(function(t){ - var c = lookup[t.id] - t.set("file_count", c ? c.count : 0) - t.set("size", c ? c.size : 0) - }) - next() - }) + ensureFileCountsForThreads: function (req, res, next) { + db.getFileSizes(res.threads_ids).then(function (counts) { + var lookup = {}; + counts.forEach(function (c) { + lookup[c.thread] = c; + }); + res.threads.forEach(function (t) { + var c = lookup[t.id]; + t.set("file_count", c ? c.count : 0); + t.set("size", c ? c.size : 0); + }); + next(); + }); }, - ensureKeywordsForThreads: function (req, res, next){ - db.getKeywords(res.keywords).then(function(keywords){ - var lookup = {} - keywords.forEach(function(k){ - lookup[k.get('keyword')] = k - }) - res.threads.forEach(function(t){ - var kw = t.get('keyword') - if (! kw) return - var k = lookup[kw] - if (! k) return - if (! t.get("color")) { - t.set("color", k.get("color")) + ensureKeywordsForThreads: function (req, res, next) { + db.getKeywords(res.keywords).then(function (keywords) { + var lookup = {}; + keywords.forEach(function (k) { + lookup[k.get("keyword")] = k; + }); + res.threads.forEach(function (t) { + var kw = t.get("keyword"); + if (!kw) return; + var k = lookup[kw]; + if (!k) return; + if (!t.get("color")) { + t.set("color", k.get("color")); } - }) - next() - }) + }); + next(); + }); }, - ensureHootbox: function (req, res, next){ - db.getCommentsForThread(1, 20, 0, "desc").then(function(hootbox){ - res.hootbox = hootbox - next() - }) + ensureHootbox: function (req, res, next) { + db.getCommentsForThread(1, 20, 0, "desc").then(function (hootbox) { + res.hootbox = hootbox; + next(); + }); + }, + ensureHootstream: function (req, res, next) { + Promise.all([ + db.getHootstreamFiles({ + limit: req.query.limit || 10, + offset: req.query.offset || 0, + }), + db.getHootstreamComments({ + limit: req.query.limit || 10, + offset: req.query.offset || 0, + }), + ]).then(([files, comments]) => { + db.getHootstreamThreads({ files, comments }).then((threads) => { + res.files = files; + res.comments = comments; + res.threads = threads; + res.threads_ids = res.threads.pluck("id").sort(); + res.keywords = _.uniq(res.threads.pluck("keyword")); + next(); + }); + }); }, - ensureLastlog: function (req, res, next){ - db.getLastlog(5).then(function(lastlog){ - res.lastlog = lastlog - next() - }) + ensureLastlog: function (req, res, next) { + db.getLastlog(5).then(function (lastlog) { + res.lastlog = lastlog; + next(); + }); }, - createThread: function (req, res, next){ - if (! req.body.title || ! req.body.title.length) { - res.json({ error: "no title" }) - return + createThread: function (req, res, next) { + if (!req.body.title || !req.body.title.length) { + res.json({ error: "no title" }); + return; } var data = { title: req.body.title, keyword: req.body.keyword, - username: req.user.get('username'), + username: req.user.get("username"), createdate: util.now(), lastmodified: util.now(), size: 0, @@ -89,666 +109,698 @@ var bucky = module.exports = { color: req.body.color, viewed: 0, revision: 0, - } - db.createThread(data).then(function(thread){ - res.thread = thread - next() - }) + }; + db.createThread(data).then(function (thread) { + res.thread = thread; + next(); + }); }, /* DETAILS */ - ensureThread: function (req, res, next){ - var id = req.params.id.replace(/\D/g, "") - if (! id) { - return res.sendStatus(404) + ensureThread: function (req, res, next) { + var id = req.params.id.replace(/\D/g, ""); + if (!id) { + return res.sendStatus(404); } - db.getThread(id).then(function(thread){ + db.getThread(id).then(function (thread) { if (thread) { - res.thread = thread - next() - } - else { - res.sendStatus(404) + res.thread = thread; + next(); + } else { + res.sendStatus(404); } - }) + }); }, - ensureThreadById: function (req, res, next){ - var id = req.params.thread_id.replace(/\D/g, "") - if (! id) { - return res.sendStatus(404) + ensureThreadById: function (req, res, next) { + var id = req.params.thread_id.replace(/\D/g, ""); + if (!id) { + return res.sendStatus(404); } - db.getThread(id).then(function(thread){ + db.getThread(id).then(function (thread) { if (thread) { - res.thread = thread - next() - } - else { - res.sendStatus(404) + res.thread = thread; + next(); + } else { + res.sendStatus(404); } - }) + }); }, - prepareThread: function (req, res, next){ - var thread = res.thread + prepareThread: function (req, res, next) { + var thread = res.thread; if (thread) { - var settings + var settings; try { - settings = JSON.parse(thread.get('settings') || '{}') - } catch(e) { - settings = {} + settings = JSON.parse(thread.get("settings") || "{}"); + } catch (e) { + settings = {}; } - res.thread.set("settings", settings) + res.thread.set("settings", settings); } - next() + next(); }, - ensureCommentThread: function (req, res, next){ - if (! res.comment) { - return res.sendStatus(404) + ensureCommentThread: function (req, res, next) { + if (!res.comment) { + return res.sendStatus(404); } - var id = res.comment.get('thread') - if (! id) { - return res.sendStatus(404) + var id = res.comment.get("thread"); + if (!id) { + return res.sendStatus(404); } - db.getThread(id).then(function(thread){ + db.getThread(id).then(function (thread) { if (thread) { - res.thread = thread - next() + res.thread = thread; + next(); + } else { + res.sendStatus(404); } - else { - res.sendStatus(404) - } - }) + }); }, - ensureKeywordForThread: function (req, res, next){ - var keyword = res.thread.get('keyword') - if (! keyword) return next() - db.getKeyword(keyword).then(function(keyword){ - res.keyword = keyword - next() - }) + ensureKeywordForThread: function (req, res, next) { + var keyword = res.thread.get("keyword"); + if (!keyword) return next(); + db.getKeyword(keyword).then(function (keyword) { + res.keyword = keyword; + next(); + }); }, - ensureCommentsForThread: function (req, res, next){ - db.getCommentsForThread(res.thread.get('id')).then(function(comments){ - res.comments = comments || [] - next() - }) + ensureCommentsForThread: function (req, res, next) { + db.getCommentsForThread(res.thread.get("id")).then(function (comments) { + res.comments = comments || []; + next(); + }); }, - ensureFilesForThread: function (req, res, next){ - db.getFilesForThread(res.thread.get('id')).then(function(files){ - res.files = files || [] - next() - }) + ensureFilesForThread: function (req, res, next) { + db.getFilesForThread(res.thread.get("id")).then(function (files) { + res.files = files || []; + next(); + }); }, - bumpViewCount: function(req, res, next) { - res.thread.set('viewed', res.thread.get('viewed') + 1) - res.thread.save().then( () => next() ) + bumpViewCount: function (req, res, next) { + res.thread.set("viewed", res.thread.get("viewed") + 1); + res.thread.save().then(() => next()); }, - bumpThreadRevisions: function (req, res, next){ + bumpThreadRevisions: function (req, res, next) { // don't bump the hootbox! - if (res.thread.get('id') == 1) { - return next() + if (res.thread.get("id") == 1) { + return next(); } - res.thread.set('revision', res.thread.get('revision')+1) - res.thread.set('lastmodified', util.now()) - res.thread.save().then( () => next() ) + res.thread.set("revision", res.thread.get("revision") + 1); + res.thread.set("lastmodified", util.now()); + res.thread.save().then(() => next()); }, - updateThreadSettings: function (req, res, next){ - var title = util.sanitize(req.body.title || "") - if (! title || ! title.length) { - return res.sendStatus(500) + updateThreadSettings: function (req, res, next) { + var title = util.sanitize(req.body.title || ""); + if (!title || !title.length) { + return res.sendStatus(500); } - var keyword = util.sanitize(req.body.keyword || "") - var privacy = parseInt(req.body.privacy) || 0 - var allowed = util.sanitize(req.body.allowed || "") - var settings - if (typeof req.body.settings === 'object') { + var keyword = util.sanitize(req.body.keyword || ""); + var privacy = parseInt(req.body.privacy) || 0; + var allowed = util.sanitize(req.body.allowed || ""); + var settings; + if (typeof req.body.settings === "object") { try { - settings = JSON.stringify(req.body.settings) - } catch(e) { - console.error("JSON error in thread settings!!!!") - return res.sendStatus(500) + settings = JSON.stringify(req.body.settings); + } catch (e) { + console.error("JSON error in thread settings!!!!"); + return res.sendStatus(500); } } - if (! settings) { - return res.sendStatus(500) + if (!settings) { + return res.sendStatus(500); } - res.thread.set('title', title) - res.thread.set('keyword', keyword) - res.thread.set('color', util.sanitize(req.body.color || 'blue')) - res.thread.set('revision', res.thread.get('revision')+1) - res.thread.set('settings', settings) - res.thread.set('privacy', privacy) - res.thread.set('allowed', allowed) - res.thread.save() - .then( () => next() ) - .catch(err => { - console.error(err) - next() - }) + res.thread.set("title", title); + res.thread.set("keyword", keyword); + res.thread.set("color", util.sanitize(req.body.color || "blue")); + res.thread.set("revision", res.thread.get("revision") + 1); + res.thread.set("settings", settings); + res.thread.set("privacy", privacy); + res.thread.set("allowed", allowed); + res.thread + .save() + .then(() => next()) + .catch((err) => { + console.error(err); + next(); + }); }, - buryThread: function (req, res, next){ - res.thread.set('lastmodified', util.now() - (14 * 86400)) - res.thread.save().then( () => next() ) + buryThread: function (req, res, next) { + res.thread.set("lastmodified", util.now() - 14 * 86400); + res.thread.save().then(() => next()); }, -// ensureInterestedUsers: function(req, res, next){ -// // given a thread, find people who might be interested in it -// // - other people who have been in threads with you -// // - other people who have posted on the keyword -// // for now though, just show the last 20 people who have logged in.. -// db.getLastlog(21).then( (users) => { -// res.interestedUsers = users -// next() -// }).catch( () => { -// res.interestedUsers = [] -// next() -// }) -// }, -// ensureThreadUsers: function(req, res, next) { -// db.getThreadUsers(res.thread.get('id')).then(thread_users => { -// res.thread_users = thread_users -// next() -// }) -// }, - checkUsernames: function(req, res, next) { - if (! req.body.usernames) return res.sendStatus(500) - db.checkUsernames(req.body.usernames).then( (users) => { - res.usernames = users.map(user => user.username) - next() - }).catch((err) => { - console.log(err) - res.usernames = [] - next() - }) + // ensureInterestedUsers: function(req, res, next){ + // // given a thread, find people who might be interested in it + // // - other people who have been in threads with you + // // - other people who have posted on the keyword + // // for now though, just show the last 20 people who have logged in.. + // db.getLastlog(21).then( (users) => { + // res.interestedUsers = users + // next() + // }).catch( () => { + // res.interestedUsers = [] + // next() + // }) + // }, + // ensureThreadUsers: function(req, res, next) { + // db.getThreadUsers(res.thread.get('id')).then(thread_users => { + // res.thread_users = thread_users + // next() + // }) + // }, + checkUsernames: function (req, res, next) { + if (!req.body.usernames) return res.sendStatus(500); + db.checkUsernames(req.body.usernames) + .then((users) => { + res.usernames = users.map((user) => user.username); + next(); + }) + .catch((err) => { + console.log(err); + res.usernames = []; + next(); + }); }, destroyThread: function (req, res, next) { - console.log(">>> destroying thread", res.thread.get('id')) + console.log(">>> destroying thread", res.thread.get("id")); var commentPromises = res.comments.map((comment) => { - return comment.destroy() - }) - var filePromises = db.destroyFiles(res.files) - var threadPromise = res.thread.destroy() - var promises = [ threadPromise ].concat(commentPromises).concat(filePromises) - Promise.all(promises).then( () => { - next() - }).catch( (err) => { - res.sendStatus(500) - }) + return comment.destroy(); + }); + var filePromises = db.destroyFiles(res.files); + var threadPromise = res.thread.destroy(); + var promises = [threadPromise].concat(commentPromises).concat(filePromises); + Promise.all(promises) + .then(() => { + next(); + }) + .catch((err) => { + res.sendStatus(500); + }); }, /* KEYWORDS */ - ensureKeyword: function (req, res, next){ - var keyword = req.params.keyword - if (! keyword) { - return res.sendStatus(404) + ensureKeyword: function (req, res, next) { + var keyword = req.params.keyword; + if (!keyword) { + return res.sendStatus(404); } - db.getKeyword(keyword).then(function(k){ - if (! k) { - return res.sendStatus(404) + db.getKeyword(keyword).then(function (k) { + if (!k) { + return res.sendStatus(404); } - res.keyword = k - next() - }) + res.keyword = k; + next(); + }); }, - ensureKeywords: function (req, res, next){ - db.getKeywords().then(function(k){ - if (! k) { - return res.sendStatus(404) + ensureKeywords: function (req, res, next) { + db.getKeywords().then(function (k) { + if (!k) { + return res.sendStatus(404); } - res.keywords = k - next() - }) + res.keywords = k; + next(); + }); }, - ensureLatestKeywordThreads: function (req, res, next){ - db.getLatestKeywordThreads().then(function(threads){ - res.threads = threads - next() - }) + ensureLatestKeywordThreads: function (req, res, next) { + db.getLatestKeywordThreads().then(function (threads) { + res.threads = threads; + next(); + }); }, - ensureThreadGroups: function (req, res, next){ - db.getThreadGroups().then(function(threadGroups){ - res.threadGroups = threadGroups - next() - }) + ensureThreadGroups: function (req, res, next) { + db.getThreadGroups().then(function (threadGroups) { + res.threadGroups = threadGroups; + next(); + }); }, - ensureThreadsForKeyword: function (req, res, next){ - var keyword = req.params.keyword - if (! keyword) { - res.sendStatus(404) + ensureThreadsForKeyword: function (req, res, next) { + var keyword = req.params.keyword; + if (!keyword) { + res.sendStatus(404); } - db.getThreadsForKeyword(keyword).then(function(threads){ - res.threads = threads - res.threads_ids = res.threads.pluck("id").sort() - res.keywords = _.uniq(res.threads.pluck("keyword")) - next() - }) + db.getThreadsForKeyword(keyword).then(function (threads) { + res.threads = threads; + res.threads_ids = res.threads.pluck("id").sort(); + res.keywords = _.uniq(res.threads.pluck("keyword")); + next(); + }); }, - ensureThreadsForUser: function (req, res, next){ - var username = res.user.username - var limit = parseInt(req.params.limit) || 10 - var offset = parseInt(req.params.offset) || 0 - if (! username) { - res.sendStatus(404) + ensureThreadsForUser: function (req, res, next) { + var username = res.user.username; + var limit = parseInt(req.params.limit) || 10; + var offset = parseInt(req.params.offset) || 0; + if (!username) { + res.sendStatus(404); } - db.getThreadsForUser(username, limit, offset).then(function(threads){ - res.threads = threads - res.threads_ids = res.threads.pluck("id").sort() - res.keywords = _.uniq(res.threads.pluck("keyword")) - next() - }) + db.getThreadsForUser(username, limit, offset).then(function (threads) { + res.threads = threads; + res.threads_ids = res.threads.pluck("id").sort(); + res.keywords = _.uniq(res.threads.pluck("keyword")); + next(); + }); }, - ensureTopThreadsForUser: function (req, res, next){ - var username = res.user.username - var limit = parseInt(req.params.limit) || 10 - var offset = parseInt(req.params.offset) || 0 - if (! username) { - res.sendStatus(404) + ensureTopThreadsForUser: function (req, res, next) { + var username = res.user.username; + var limit = parseInt(req.params.limit) || 10; + var offset = parseInt(req.params.offset) || 0; + if (!username) { + res.sendStatus(404); } - db.getTopThreadsForUser(username, limit, offset).then(function(top_threads){ - res.topThreads = top_threads - res.topThreads_ids = res.topThreads.pluck("id").sort() - res.topKeywords = _.uniq(res.topThreads.pluck("keyword")) - next() - }) + db.getTopThreadsForUser(username, limit, offset).then(function ( + top_threads + ) { + res.topThreads = top_threads; + res.topThreads_ids = res.topThreads.pluck("id").sort(); + res.topKeywords = _.uniq(res.topThreads.pluck("keyword")); + next(); + }); }, - ensureCommentsForUser: function (req, res, next){ - db.getCommentsForUser(res.user.username).then(function(comments){ - res.comments = comments || [] - next() - }) + ensureCommentsForUser: function (req, res, next) { + db.getCommentsForUser(res.user.username).then(function (comments) { + res.comments = comments || []; + next(); + }); }, - ensureFilesForUser: function (req, res, next){ - db.getFilesForUser(res.user.username).then(function(files){ - res.files = files || [] - next() - }) + ensureFilesForUser: function (req, res, next) { + db.getFilesForUser(res.user.username).then(function (files) { + res.files = files || []; + next(); + }); }, - createKeyword: function (req, res, next){ - if (! req.body.keyword || ! req.body.keyword.length) { - res.json({ error: "no keyword" }) - return + createKeyword: function (req, res, next) { + if (!req.body.keyword || !req.body.keyword.length) { + res.json({ error: "no keyword" }); + return; } var data = { keyword: req.body.keyword, - owner: req.user.get('username'), + owner: req.user.get("username"), createdate: util.now(), public: 1, - color: req.body.color || 'blue', - } - db.createKeyword(data).then(function(keyword){ - res.keyword = keyword - next() - }) + color: req.body.color || "blue", + }; + db.createKeyword(data).then(function (keyword) { + res.keyword = keyword; + next(); + }); }, /* POSTING */ - verifyFilesOrComment: function (req, res, next){ - var hasComment = req.body.comment && req.body.comment.length - var hasFile = req.files && req.files.length - if (! hasComment && ! hasFile) { - console.log(">>> no files or comment") - return res.sendStatus(400) + verifyFilesOrComment: function (req, res, next) { + var hasComment = req.body.comment && req.body.comment.length; + var hasFile = req.files && req.files.length; + if (!hasComment && !hasFile) { + console.log(">>> no files or comment"); + return res.sendStatus(400); } - next() + next(); }, /* COMMENTS */ - ensureComment: function (req, res, next){ - var id = req.params.id.replace(/\D/g, "") - if (! id) { - return res.sendStatus(404) + ensureComment: function (req, res, next) { + var id = req.params.id.replace(/\D/g, ""); + if (!id) { + return res.sendStatus(404); } - db.getCommentById(id).then(function(comment){ + db.getCommentById(id).then(function (comment) { if (comment) { - comment.set('comment', comment.get('comment').toString()) - res.comment = comment - next() + comment.set("comment", comment.get("comment").toString()); + res.comment = comment; + next(); + } else { + res.sendStatus(404); } - else { - res.sendStatus(404) - } - }) + }); }, - createOptionalComment: function(req, res, next){ - if (! req.body.comment || ! req.body.comment.length) { - return next() + createOptionalComment: function (req, res, next) { + if (!req.body.comment || !req.body.comment.length) { + return next(); } - bucky.createComment(req, res, next) + bucky.createComment(req, res, next); }, - createComment: function (req, res, next){ - if (! req.body.comment || ! req.body.comment.length) { - res.json({ error: "no comment" }) - return + createComment: function (req, res, next) { + if (!req.body.comment || !req.body.comment.length) { + res.json({ error: "no comment" }); + return; } var data = { - thread: res.thread.get('id'), + thread: res.thread.get("id"), parent_id: req.body.parent_id || -1, - username: req.user.get('username'), + username: req.user.get("username"), date: util.now(), comment: req.body.comment, - } - db.createComment(data).then(function(comment){ - res.comment = comment - next() - }) + }; + db.createComment(data).then(function (comment) { + res.comment = comment; + next(); + }); }, - updateComment: function(req, res, next){ - if (! req.body.comment || ! req.body.comment.length) { - return res.sendStatus(500) + updateComment: function (req, res, next) { + if (!req.body.comment || !req.body.comment.length) { + return res.sendStatus(500); } - res.comment.set('comment', req.body.comment) - res.comment.set('date', util.now()) - res.comment.save().then(() => { - next() - }).catch(err => { - res.sendStatus(500) - }) + res.comment.set("comment", req.body.comment); + res.comment.set("date", util.now()); + res.comment + .save() + .then(() => { + next(); + }) + .catch((err) => { + res.sendStatus(500); + }); }, - moveComment: function(req, res, next){ - res.comment.set('thread', res.thread.get('id')) - res.comment.save().then(() => { - next() - }).catch(err => { - res.sendStatus(500) - }) + moveComment: function (req, res, next) { + res.comment.set("thread", res.thread.get("id")); + res.comment + .save() + .then(() => { + next(); + }) + .catch((err) => { + res.sendStatus(500); + }); }, - destroyComment: function(req, res, next){ - res.comment.destroy().then(() => { - next() - }).catch(err => { - res.sendStatus(500) - }) + destroyComment: function (req, res, next) { + res.comment + .destroy() + .then(() => { + next(); + }) + .catch((err) => { + res.sendStatus(500); + }); }, /* FILES */ - ensureFile: function (req, res, next){ - var id = req.params.id.replace(/\D/g, "") - if (! id) { - return res.sendStatus(404) + ensureFile: function (req, res, next) { + var id = req.params.id.replace(/\D/g, ""); + if (!id) { + return res.sendStatus(404); } - db.getFileById(id).then(function(file){ + db.getFileById(id).then(function (file) { if (file) { - res.file = file - next() + res.file = file; + next(); + } else { + res.sendStatus(404); } - else { - res.sendStatus(404) - } - }) + }); }, - createOptionalFiles: function(req, res, next){ - if (! req.files || ! req.files.length) { - return next() + createOptionalFiles: function (req, res, next) { + if (!req.files || !req.files.length) { + return next(); } - bucky.createFiles(req, res, next) + bucky.createFiles(req, res, next); }, - createFiles: function (req, res, next){ - if (! req.files || ! req.files.length) { - res.json({ error: "no files" }) - return + createFiles: function (req, res, next) { + if (!req.files || !req.files.length) { + res.json({ error: "no files" }); + return; } - var thread_id = res.thread.get('id') - var dirname = process.env.S3_PATH + '/data/' + thread_id + '/' + var thread_id = res.thread.get("id"); + var dirname = process.env.S3_PATH + "/data/" + thread_id + "/"; var promises = req.files.map((file) => { - return new Promise( (resolve, reject) => { + return new Promise((resolve, reject) => { upload.put({ file: file, preserveFilename: true, dirname: dirname, - unacceptable: function(err){ - reject(err) + unacceptable: function (err) { + reject(err); }, - success: function(url){ - console.log("file >", url) + success: function (url) { + console.log("file >", url); var data = { - thread: res.thread.get('id'), - username: req.user.get('username'), + thread: res.thread.get("id"), + username: req.user.get("username"), filename: file.originalname, date: util.now(), size: file.size, privacy: false, storage: process.env.S3_BUCKET, - } - db.createFile(data).then(function(file){ - resolve(file) - }).catch( (err) => reject(err) ) - } - }) + }; + db.createFile(data) + .then(function (file) { + resolve(file); + }) + .catch((err) => reject(err)); + }, + }); + }); + }); + Promise.all(promises) + .then((values) => { + res.files = values; + next(); }) - }) - Promise.all(promises).then(values => { - res.files = values - next() - }).catch(err => { - console.log(err) - }) + .catch((err) => { + console.log(err); + }); }, - moveFile: function(req, res, next){ - db.moveFile(res.file, res.thread.get('id')).then(() => { - next() - }).catch(err => { - res.sendStatus(500) - }) + moveFile: function (req, res, next) { + db.moveFile(res.file, res.thread.get("id")) + .then(() => { + next(); + }) + .catch((err) => { + res.sendStatus(500); + }); }, - destroyFile: function(req, res, next){ - var filePromises = db.destroyFiles([res.file]) - Promise.all(filePromises).then( () => next() ) - .catch(err => { console.error(err); next() }) + destroyFile: function (req, res, next) { + var filePromises = db.destroyFiles([res.file]); + Promise.all(filePromises) + .then(() => next()) + .catch((err) => { + console.error(err); + next(); + }); }, - /* PROFILE / USER */ - ensureUser: function (req, res, next){ - var username = util.sanitizeName(req.params.username) - if (! username) { - return res.sendStatus(404) + ensureUser: function (req, res, next) { + var username = util.sanitizeName(req.params.username); + if (!username) { + return res.sendStatus(404); } - db.getUserByUsername(username).then(function(user){ + db.getUserByUsername(username).then(function (user) { if (user) { - res.user = user - next() - } - else { - res.sendStatus(404) + res.user = user; + next(); + } else { + res.sendStatus(404); } - }) + }); }, - ensureUserFromBody: function (req, res, next){ - var username = util.sanitizeName(req.body.username) - if (! username) { - return res.sendStatus(404) + ensureUserFromBody: function (req, res, next) { + var username = util.sanitizeName(req.body.username); + if (!username) { + return res.sendStatus(404); } - db.getUserByUsername(username).then(function(user){ + db.getUserByUsername(username).then(function (user) { if (user) { - res.user = user - next() + res.user = user; + next(); + } else { + console.log("no such user!!"); + res.sendStatus(404); } - else { - console.log('no such user!!') - res.sendStatus(404) - } - }) + }); }, - ensureUserlist: function (req, res, next){ - db.getUsers().then(function(users){ - if (! users) { - return res.sendStatus(404) + ensureUserlist: function (req, res, next) { + db.getUsers().then(function (users) { + if (!users) { + return res.sendStatus(404); } - res.users = users - next() - }) + res.users = users; + next(); + }); }, ensureUserThreadCounts: function (req, res, next) { - db.getUserThreadCounts().then(function(counts){ + db.getUserThreadCounts().then(function (counts) { if (!counts) { - return res.sendStatus(404) + return res.sendStatus(404); } - res.threadCounts = counts - next() - }) + res.threadCounts = counts; + next(); + }); }, ensureUserCommentCounts: function (req, res, next) { - db.getUserCommentCounts().then(function(counts){ + db.getUserCommentCounts().then(function (counts) { if (!counts) { - return res.sendStatus(404) + return res.sendStatus(404); } - res.commentCounts = counts - next() - }) + res.commentCounts = counts; + next(); + }); }, ensureUserFileCounts: function (req, res, next) { - db.getUserFileCounts().then(function(counts){ + db.getUserFileCounts().then(function (counts) { if (!counts) { - return res.sendStatus(404) + return res.sendStatus(404); } - res.fileCounts = counts - next() - }) + res.fileCounts = counts; + next(); + }); }, ensureUserStatistics: function (req, res, next) { - var stats = {} - res.threadCounts.forEach(function(user){ - stats[user.username] = stats[user.username] || {} - stats[user.username].threads = user.count - }) - res.commentCounts.forEach(function(user){ - stats[user.username] = stats[user.username] || {} - stats[user.username].comments = user.count - }) - res.fileCounts.forEach(function(user){ - stats[user.username] = stats[user.username] || {} - stats[user.username].files = user.count - stats[user.username].fileSize = user.size - }) - res.userStats = stats - next() + var stats = {}; + res.threadCounts.forEach(function (user) { + stats[user.username] = stats[user.username] || {}; + stats[user.username].threads = user.count; + }); + res.commentCounts.forEach(function (user) { + stats[user.username] = stats[user.username] || {}; + stats[user.username].comments = user.count; + }); + res.fileCounts.forEach(function (user) { + stats[user.username] = stats[user.username] || {}; + stats[user.username].files = user.count; + stats[user.username].fileSize = user.size; + }); + res.userStats = stats; + next(); }, - sanitizeUser: function(req, res, next) { - res.user = util.sanitizeUser(res.user) - next() + sanitizeUser: function (req, res, next) { + res.user = util.sanitizeUser(res.user); + next(); }, - bumpLastSeen: function(req, res, next) { - req.user.set('lastseen', util.now()) - req.user.save().then( () => next() ) + bumpLastSeen: function (req, res, next) { + req.user.set("lastseen", util.now()); + req.user.save().then(() => next()); }, - updateProfile: function(req, res, next) { - var user = res.user - "realname location email phone website twitter".split(" ").forEach( (field) => { - res.user.set(field, req.body[field]) - }) - next() + updateProfile: function (req, res, next) { + var user = res.user; + "realname location email phone website twitter" + .split(" ") + .forEach((field) => { + res.user.set(field, req.body[field]); + }); + next(); }, - uploadAvatar: function(req, res, next) { - if (! req.file) return next() - var dirname = '/bucky/profile/' + uploadAvatar: function (req, res, next) { + if (!req.file) return next(); + var dirname = "/bucky/profile/"; upload.put({ file: req.file, - filename: req.user.get('username') + '.jpg', + filename: req.user.get("username") + ".jpg", dirname: dirname, - unacceptable: function(err){ - res.sendStatus({ error: 'Problem uploading avatar.' }) + unacceptable: function (err) { + res.sendStatus({ error: "Problem uploading avatar." }); }, - success: function(url){ - console.log("avatar >", url) - res.user.set('avatar', url) - next() - } - }) + success: function (url) { + console.log("avatar >", url); + res.user.set("avatar", url); + next(); + }, + }); }, - saveUser: function(req, res, next){ - res.user.save().then( () => next() ) + saveUser: function (req, res, next) { + res.user.save().then(() => next()); }, /* MAIL */ - ensureMailboxes: function (req, res, next){ - var username = req.user.get('username') - var box = req.params.box - var mbox = username + "." + box - if (! box) { - res.sendStatus(404) + ensureMailboxes: function (req, res, next) { + var username = req.user.get("username"); + var box = req.params.box; + var mbox = username + "." + box; + if (!box) { + res.sendStatus(404); } - db.getMailboxes(username).then(function(boxes){ - if (! boxes) { - return res.sendStatus(404) + db.getMailboxes(username).then(function (boxes) { + if (!boxes) { + return res.sendStatus(404); } - if (! boxes.models.some(function(box){ return box.get('mbox') == mbox })) { - return res.sendStatus(404) + if ( + !boxes.models.some(function (box) { + return box.get("mbox") == mbox; + }) + ) { + return res.sendStatus(404); } - res.boxes = boxes - next() - }) + res.boxes = boxes; + next(); + }); }, - ensureMailboxCounts: function (req, res, next){ - db.getMailboxCounts(res.boxes.pluck("mbox")).then(function(counts){ - var lookup = {} - counts.forEach(function(c){ - lookup[c.mbox] = c - }) - res.boxes.forEach(function(box){ - var count = lookup[box.get('mbox')] ? lookup[box.get('mbox')].count : 0 - box.set("count", count) - }) - next() - }) + ensureMailboxCounts: function (req, res, next) { + db.getMailboxCounts(res.boxes.pluck("mbox")).then(function (counts) { + var lookup = {}; + counts.forEach(function (c) { + lookup[c.mbox] = c; + }); + res.boxes.forEach(function (box) { + var count = lookup[box.get("mbox")] ? lookup[box.get("mbox")].count : 0; + box.set("count", count); + }); + next(); + }); }, - ensureMessages: function (req, res, next){ - const limit = parseInt(req.query.limit) || 50 - const offset = parseInt(req.query.offset) || 0 - db.getMessages(req.user.get('username'), req.params.box, limit, offset).then(function(messages){ - res.messages = messages - res.query = { limit, offset } - next() - }) + ensureMessages: function (req, res, next) { + const limit = parseInt(req.query.limit) || 50; + const offset = parseInt(req.query.offset) || 0; + db.getMessages( + req.user.get("username"), + req.params.box, + limit, + offset + ).then(function (messages) { + res.messages = messages; + res.query = { limit, offset }; + next(); + }); }, - ensureMessage: function(req, res, next){ - db.getMessage(req.params.id).then(function(message){ - if (! message) { - return res.sendStatus(404) + ensureMessage: function (req, res, next) { + db.getMessage(req.params.id).then(function (message) { + if (!message) { + return res.sendStatus(404); } - var username = req.user.get('username') - if (username !== message.get('recipient') && username !== message.get('sender')) { - res.sendStatus(404) - return + var username = req.user.get("username"); + if ( + username !== message.get("recipient") && + username !== message.get("sender") + ) { + res.sendStatus(404); + return; } - res.message = message - next() - }) + res.message = message; + next(); + }); }, - checkMail: function(req, res, next){ - db.checkMail(req.user.get('username')).then(function(mail){ - res.mail = mail ? mail[0] : { count: 0 } - next() - }) + checkMail: function (req, res, next) { + db.checkMail(req.user.get("username")).then(function (mail) { + res.mail = mail ? mail[0] : { count: 0 }; + next(); + }); }, - markMessageUnread: function(req, res, next){ - if (res.message.get('unread')) { - res.message.set('unread', 0) - res.message.save().then(() => next()) + markMessageUnread: function (req, res, next) { + if (res.message.get("unread")) { + res.message.set("unread", 0); + res.message.save().then(() => next()); } else { - next() + next(); } }, - ensureRecipient: function(req, res, next){ - db.getUserByUsername(util.sanitizeName(req.body.username)).then( (user) => { - if (! user) { - res.send({ error: "No such recipient" }) - return + ensureRecipient: function (req, res, next) { + db.getUserByUsername(util.sanitizeName(req.body.username)).then((user) => { + if (!user) { + res.send({ error: "No such recipient" }); + return; } - next() - }) + next(); + }); }, - sendMessage: function(req, res, next){ - var recipient = util.sanitizeName(req.body.username) - var sender = req.user.get('username') - var subject = util.sanitize(req.body.subject) - var body = util.sanitize(req.body.body) - res.mail = { sender: sender, recipient: recipient } + sendMessage: function (req, res, next) { + var recipient = util.sanitizeName(req.body.username); + var sender = req.user.get("username"); + var subject = util.sanitize(req.body.subject); + var body = util.sanitize(req.body.body); + res.mail = { sender: sender, recipient: recipient }; var recipientMessage = { mbox: recipient + ".inbox", unread: true, @@ -757,7 +809,7 @@ var bucky = module.exports = { date: util.now(), subject: subject, body: body, - } + }; var senderMessage = { mbox: sender + ".outbox", unread: false, @@ -766,23 +818,23 @@ var bucky = module.exports = { date: util.now(), subject: subject, body: body, - } + }; Promise.all([ db.createMessage(recipientMessage), db.createMessage(senderMessage), - ]).then( () => next() ) + ]).then(() => next()); }, - deleteDraft: function(req, res, next){ - if (! req.body.draft_id) return next() - db.getMessage(req.body.draft_id).then( (message) => { - if (message.get('sender') === req.user.get('username')) { - return message.destroy().then( () => next() ) + deleteDraft: function (req, res, next) { + if (!req.body.draft_id) return next(); + db.getMessage(req.body.draft_id).then((message) => { + if (message.get("sender") === req.user.get("username")) { + return message.destroy().then(() => next()); } // erroneous draft message?? - next() - }) + next(); + }); }, - destroyMessage: function(req, res, next) { - res.message.destroy().then( () => next() ) + destroyMessage: function (req, res, next) { + res.message.destroy().then(() => next()); }, -} +}); diff --git a/bucky/app/pages.js b/bucky/app/pages.js index 5d8551e..94ae46e 100644 --- a/bucky/app/pages.js +++ b/bucky/app/pages.js @@ -1,137 +1,145 @@ -var middleware = require('../util/middleware') -var util = require('../util/util') +var middleware = require("../util/middleware"); +var util = require("../util/util"); -var fortune = require('../db/fortune') +var fortune = require("../db/fortune"); -module.exports = { route } +module.exports = { route }; -function route (app){ - app.get("/", +function route(app) { + app.get("/", middleware.ensureAuthenticated, function (req, res) { + res.redirect("/index"); + }); + app.get("/index", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/index", { + title: fortune("titles"), + hoot_text: fortune("hoots"), + }); + }); + app.get( + "/index/:keyword", middleware.ensureAuthenticated, - function(req, res){ - res.redirect('/index') - }) - app.get("/index", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/index", { - title: fortune("titles"), - hoot_text: fortune("hoots"), - }) - }) - app.get("/index/:keyword", - middleware.ensureAuthenticated, - function(req, res){ + function (req, res) { res.render("pages/index", { title: fortune("titles"), hoot_text: fortune("hoots"), - }) - }) - app.get("/keywords", + }); + } + ); + app.get("/stream", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/stream", { + title: fortune("titles"), + hoot_text: fortune("hoots"), + }); + }); + app.get("/keywords", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/keywords", { title: "Bucky's keywords" }); + }); + app.get("/details/:id", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/details", {}); + }); + app.get( + "/details/:id/settings", middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/keywords", {title: "Bucky's keywords"}) - }) - app.get("/details/:id", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/details", {}) - }) - app.get("/details/:id/settings", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/details", {}) - }) + function (req, res) { + res.render("pages/details", {}); + } + ); - app.get("/post/", + app.get("/post/", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/post", { title: "Start a new thread" }); + }); + app.get( + "/post/:keyword", middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/post", {title: "Start a new thread"}) - }) - app.get("/post/:keyword", + function (req, res) { + res.render("pages/post", { title: "Start a new thread" }); + } + ); + app.get( + "/comment/:id/edit", middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/post", {title: "Start a new thread"}) - }) - app.get("/comment/:id/edit", middleware.ensureAuthenticated, function(req, res){ - res.render("pages/comment_form", {title: "Edit comment"}) - }) + function (req, res) { + res.render("pages/comment_form", { title: "Edit comment" }); + } + ); - app.get("/profile", + app.get("/profile", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/profile", { + title: "profile for " + util.sanitize(req.user.get("username")), + }); + }); + app.get( + "/profile/:username", middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/profile", {title: "profile for " + util.sanitize(req.user.get('username'))}) - }) - app.get("/profile/:username", + function (req, res) { + res.render("pages/profile", { + title: "profile for " + util.sanitize(req.params.username), + }); + } + ); + app.get( + "/profile/:username/edit", middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/profile", {title: "profile for " + util.sanitize(req.params.username)}) - }) - app.get("/profile/:username/edit", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/profile_form", {title: "edit your profile"}) - }) + function (req, res) { + res.render("pages/profile_form", { title: "edit your profile" }); + } + ); - app.get("/users", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/users", {}) - }) - app.get("/users/all", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/users", {}) - }) + app.get("/users", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/users", {}); + }); + app.get("/users/all", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/users", {}); + }); - app.get("/search/", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/search", {title: "search" }) - }) + app.get("/search/", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/search", { title: "search" }); + }); - app.get("/mail/", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/mailbox", {title: "your inbox" }) - }) - app.get("/mail/compose", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/compose", { - title: "new message", - subject: fortune("subjects"), - verb: "wrote", - }) - }) - app.get("/mail/:box", - middleware.ensureAuthenticated, - function(req, res){ - res.render("pages/mailbox", { title: "your " + util.sanitize(req.params.box) }) - }) - app.get("/mail/compose/:username", + app.get("/mail/", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/mailbox", { title: "your inbox" }); + }); + app.get("/mail/compose", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/compose", { + title: "new message", + subject: fortune("subjects"), + verb: "wrote", + }); + }); + app.get("/mail/:box", middleware.ensureAuthenticated, function (req, res) { + res.render("pages/mailbox", { + title: "your " + util.sanitize(req.params.box), + }); + }); + app.get( + "/mail/compose/:username", middleware.ensureAuthenticated, - function(req, res){ + function (req, res) { res.render("pages/compose", { title: "new message", subject: fortune("subjects"), verb: "wrote", - }) - }) - app.get("/mail/read/:id", + }); + } + ); + app.get( + "/mail/read/:id", middleware.ensureAuthenticated, - function(req, res){ + function (req, res) { res.render("pages/message", { - title: "read message" - }) - }) - app.get("/mail/reply/:id", + title: "read message", + }); + } + ); + app.get( + "/mail/reply/:id", middleware.ensureAuthenticated, - function(req, res){ + function (req, res) { res.render("pages/compose", { title: "reply to message", subject: fortune("subjects"), verb: fortune("mail-verbs"), - }) - }) + }); + } + ); } diff --git a/bucky/app/site.js b/bucky/app/site.js index 69f0157..3627bac 100644 --- a/bucky/app/site.js +++ b/bucky/app/site.js @@ -42,7 +42,10 @@ site.init = function () { key: "bucky.sid", cookie: { secure: process.env.NODE_ENV === "production", - domain: "." + process.env.HOST_NAME, + domain: + process.env.HOST_NAME === "localhost" + ? process.env.HOST_NAME + : "." + process.env.HOST_NAME, maxAge: 43200000000, }, resave: true, diff --git a/bucky/bin/build-scripts.js b/bucky/bin/build-scripts.js index 43cb20e..b704129 100644 --- a/bucky/bin/build-scripts.js +++ b/bucky/bin/build-scripts.js @@ -1,33 +1,32 @@ -var fs = require('fs') -var UglifyJS = require("uglify-es") +var fs = require("fs"); +var UglifyJS = require("uglify-es"); -var index = fs.readFileSync('views/partials/scripts.ejs', "utf8") +var index = fs.readFileSync("views/partials/scripts.ejs", "utf8"); -var scripts = {} -index.split('\n') - .map(line => { - var pz = line.split('"') - if (pz.length < 3) return null - return 'public' + pz[1] - }) - .filter(fn => !! fn) - .forEach(fn => { - scripts[fn] = fs.readFileSync(fn, "utf8") +var scripts = {}; +index + .split("\n") + .map((line) => { + var pz = line.split('"'); + if (pz.length < 3) return null; + return "public" + pz[1]; }) + .filter((fn) => !!fn) + .forEach((fn) => { + scripts[fn] = fs.readFileSync(fn, "utf8"); + }); var result = UglifyJS.minify(scripts, { sourceMap: { filename: "app.js", - url: "app.js.map" - } -}) + url: "app.js.map", + }, +}); if (result.error) { - console.error(result.error) + console.error(result.error); } if (result.warnings) { - console.error(result.warnings) + console.error(result.warnings); } -fs.writeFileSync("public/assets/min/app.min.js", result.code, "utf8") -fs.writeFileSync("public/assets/min/app.min.js.map", result.map, "utf8") - - +fs.writeFileSync("public/assets/min/app.min.js", result.code, "utf8"); +fs.writeFileSync("public/assets/min/app.min.js.map", result.map, "utf8"); diff --git a/bucky/db/index.js b/bucky/db/index.js index 8ab29ff..36541f8 100644 --- a/bucky/db/index.js +++ b/bucky/db/index.js @@ -114,6 +114,38 @@ db.getLastlog = function (limit) { .limit(limit || 10); }; +/** HOOTSTREAM */ + +db.getHootstreamFiles = ({ limit, offset }) => + knex("files") + .join("threads", "threads.id", "=", "files.thread") + .select("files.*") + .where("threads.privacy", false) + .orderBy("files.id", "desc") + .offset(offset) + .limit(limit); +db.getHootstreamComments = ({ limit, offset }) => + knex("comments") + .join("threads", "threads.id", "=", "comments.thread") + .select("comments.*") + .where("threads.privacy", false) + .orderBy("comments.id", "desc") + .offset(offset) + .limit(limit); +db.getHootstreamThreads = ({ files, comments }) => + Thread.where((builder) => + builder.whereIn( + "id", + Array.from( + new Set( + [...comments, ...files] + .map((item) => item?.thread) + .filter((item) => !!item) + ) + ) + ) + ).fetchAll(); + /* THREADS */ db.getLatestThreads = function () { @@ -149,6 +181,7 @@ db.getThreadsById = function (ids) { return Thread.where("id", "in", ids).fetchAll(); }; db.createThread = function (data) { + console.log(data); return new db.Thread(data).save(); }; db.updateThread = function (data) {}; diff --git a/bucky/util/auth.js b/bucky/util/auth.js index d457704..2ca1b94 100644 --- a/bucky/util/auth.js +++ b/bucky/util/auth.js @@ -1,65 +1,61 @@ -var passport = require('passport') -var LocalStrategy = require('passport-local').Strategy -var crypto = require('crypto') -var crypt = require('unix-crypt-td-js') -var fs = require('fs') -var db = require('../db') -var util = require('./util') -var upload = require('./upload') +var passport = require("passport"); +var LocalStrategy = require("passport-local").Strategy; +var crypto = require("crypto"); +var crypt = require("unix-crypt-td-js"); +var fs = require("fs"); +var db = require("../db"); +var util = require("./util"); +var upload = require("./upload"); -var middleware = require('./middleware') +var middleware = require("./middleware"); -var auth = module.exports = { - - init: function(){ - passport.serializeUser(auth.serializeUser) - passport.deserializeUser(auth.deserializeUser) - passport.use(new LocalStrategy(auth.verifyLocalUser)) +var auth = (module.exports = { + init: function () { + passport.serializeUser(auth.serializeUser); + passport.deserializeUser(auth.deserializeUser); + passport.use(new LocalStrategy(auth.verifyLocalUser)); }, - route: function(app){ - app.get("/login", - function(req, res){ - res.render("pages/login", { - title: "login" - }) - }) - app.get("/signup", function(req, res){ + route: function (app) { + app.get("/login", function (req, res) { + res.render("pages/login", { + title: "login", + }); + }); + app.get("/signup", function (req, res) { res.render("pages/signup", { - title: "signup" - }) - }) - app.get("/logout", auth.logout) + title: "signup", + }); + }); + app.get("/logout", auth.logout); - app.put("/api/signup", + app.put( + "/api/signup", auth.checkIfUserExists, auth.createUser, passport.authenticate("local"), auth.createMailboxes, auth.uploadDefaultAvatar, - auth.login) - app.put("/api/login", - passport.authenticate("local"), - auth.login) - app.put("/api/checkin", - middleware.ensureAuthenticated, - auth.checkin - ) - }, + auth.login + ); + app.put("/api/login", passport.authenticate("local"), auth.login); + app.put("/api/checkin", middleware.ensureAuthenticated, auth.checkin); + }, checkIfUserExists: function (req, res, next) { - var username = util.sanitizeName(req.body.username) + var username = util.sanitizeName(req.body.username); db.getUserByUsername(username).then((user) => { if (user) { - return res.json({ error: "user exists" }) + console.log(user); + return res.json({ error: "user exists" }); } - next() - }) + next(); + }); }, createUser: function (req, res, next) { if (req.body.password !== req.body.password2) { - return res.json({ error: "passwords don't match" }) + return res.json({ error: "passwords don't match" }); } - var username = util.sanitizeName(req.body.username) + var username = util.sanitizeName(req.body.username); var data = { username: username, realname: util.sanitize(req.body.realname), @@ -68,137 +64,147 @@ var auth = module.exports = { firstseen: util.now(), lastseen: util.now(), // lastsession: util.now(), - } - db.createUser(data).then(() => next()) + }; + db.createUser(data).then(() => next()); }, createMailboxes: function (req, res, next) { - var username = req.user.get('username') + var username = req.user.get("username"); Promise.all([ db.createMailbox({ - mbox: username + '.inbox', + mbox: username + ".inbox", owner: username, editable: 0, }), db.createMailbox({ - mbox: username + '.outbox', + mbox: username + ".outbox", owner: username, editable: 0, }), db.createMailbox({ - mbox: username + '.drafts', + mbox: username + ".drafts", owner: username, editable: 1, }), - ]).then(() => next()) + ]).then(() => next()); }, - uploadDefaultAvatar: function(req, res, next){ - fs.readFile('public/assets/img/profile.jpg', (err, buf) => { + uploadDefaultAvatar: function (req, res, next) { + fs.readFile("public/assets/img/profile.jpg", (err, buf) => { if (err) throw err; - var username = req.user.get('username') + var username = req.user.get("username"); upload.put({ - file: { - buffer: buf, - size: buf.length, - mimetype: 'image/jpeg', - }, - dirname: '/bucky/profile/', - filename: username + '.jpg', - preserveFilename: true, - success: (url) => { - next() - }, - }) + file: { + buffer: buf, + size: buf.length, + mimetype: "image/jpeg", + }, + dirname: "/bucky/profile/", + filename: username + ".jpg", + preserveFilename: true, + success: (url) => { + next(); + }, + }); }); }, login: function (req, res) { if (req.isAuthenticated()) { - var returnTo = req.session.returnTo - delete req.session.returnTo - console.log(">> logged in", req.user.get('username')) + var returnTo = req.session.returnTo; + delete req.session.returnTo; + console.log(">> logged in", req.user.get("username")); return res.json({ status: "OK", user: util.sanitizeUser(req.user), returnTo: returnTo || "/index", - }) + }); } res.json({ - error: 'bad credentials', - }) + error: "bad credentials", + }); }, - serializeUser: function (user, done) { - done(null, user.id); - }, + serializeUser: function (user, done) { + done(null, user.id); + }, - deserializeUser: function (id, done) { - db.getUser(id).then(function(user){ - done(! user, user) - }) - }, + deserializeUser: function (id, done) { + db.getUser(id).then(function (user) { + done(!user, user); + }); + }, - makePassword: function(username, password) { - var salt = username.substr(0, 2) // lol - return crypt(password, salt) + makePassword: function (username, password) { + var salt = username.substr(0, 2); // lol + return crypt(password, salt); // var shasum = crypto.createHash('sha1') // shasum.update(password) // return shasum.digest('hex'); - }, + }, - validPassword: function(user, password){ - return user.get('password') === auth.makePassword(user.get('username'), password); + validPassword: function (user, password) { + return ( + user.get("password") === auth.makePassword(user.get("username"), password) + ); }, - changePassword: function(req, res, next) { - if (! req.body.oldpassword && ! req.body.newpassword) return next() + changePassword: function (req, res, next) { + if (!req.body.oldpassword && !req.body.newpassword) return next(); if (req.body.newpassword !== req.body.newpassword2) { - return res.send({ error: 'Passwords don\'t match.' }) + return res.send({ error: "Passwords don't match." }); } - if (! auth.validPassword(res.user, req.body.oldpassword)) { - return res.send({ error: 'Password is incorrect.' }) + if (!auth.validPassword(res.user, req.body.oldpassword)) { + return res.send({ error: "Password is incorrect." }); } - var username = req.user.get('username') - var newPassword = auth.makePassword(username, req.body.newpassword) - res.user.set('password', newPassword) - res.user.save().then(() => next()).catch(err => res.send({ error: err })) + var username = req.user.get("username"); + var newPassword = auth.makePassword(username, req.body.newpassword); + res.user.set("password", newPassword); + res.user + .save() + .then(() => next()) + .catch((err) => res.send({ error: err })); }, - changePasswordDangerously: function(req, res, next){ - if (! req.body.password && ! req.body.newpassword) return next() + changePasswordDangerously: function (req, res, next) { + if (!req.body.password && !req.body.newpassword) return next(); if (req.body.newpassword !== req.body.newpassword2) { - return res.send({ error: 'Passwords don\'t match.' }) + return res.send({ error: "Passwords don't match." }); } - if (! auth.validPassword(req.user, req.body.password)) { - return res.send({ error: 'Password is incorrect.' }) + if (!auth.validPassword(req.user, req.body.password)) { + return res.send({ error: "Password is incorrect." }); } - var username = res.user.get('username') - var newPassword = auth.makePassword(username, req.body.newpassword) - res.user.set('password', newPassword) - res.user.save().then(() => next()).catch(err => res.send({ error: err })) + var username = res.user.get("username"); + var newPassword = auth.makePassword(username, req.body.newpassword); + res.user.set("password", newPassword); + res.user + .save() + .then(() => next()) + .catch((err) => res.send({ error: err })); }, - verifyLocalUser: function (username, password, done) { + verifyLocalUser: function (username, password, done) { // handle passwords!! - db.getUserByUsername(username).then(function(user){ - - // if (err) { return done(err); } - if (! user) { return done("no user") } + db.getUserByUsername(username).then(function (user) { + // if (err) { return done(err); } + if (!user) { + return done("no user"); + } // return done(null, user) - if (! user || ! auth.validPassword(user, password)) { - return done(null, false, { error: { message: 'Bad username/password.' } }) - } - return done(null, user); - }) - }, + if (!user || !auth.validPassword(user, password)) { + return done(null, false, { + error: { message: "Bad username/password." }, + }); + } + return done(null, user); + }); + }, checkin: function (req, res) { - var user = util.sanitizeUser(req.user) - res.json({ user: user }) + var user = util.sanitizeUser(req.user); + res.json({ user: user }); }, - logout: function (req, res) { - req.logout(); - res.redirect('/'); - }, - -} + logout: function (req, res) { + req.logout(); + res.redirect("/"); + }, +}); |
