var Ghost = require('../../ghost'), dataExport = require('../data/export'), dataImport = require('../data/import'), _ = require('underscore'), fs = require('fs-extra'), path = require('path'), when = require('when'), nodefn = require('when/node/function'), api = require('../api'), moment = require('moment'), errors = require('../errorHandling'), ghost = new Ghost(), dataProvider = ghost.dataProvider, adminNavbar, adminControllers, loginSecurity = []; // TODO: combine path/navClass to single "slug(?)" variable with no prefix adminNavbar = { content: { name: 'Content', navClass: 'content', key: 'admin.navbar.content', path: '/' }, add: { name: 'New Post', navClass: 'editor', key: 'admin.navbar.editor', path: '/editor/' }, settings: { name: 'Settings', navClass: 'settings', key: 'admin.navbar.settings', path: '/settings/' } }; // TODO: make this a util or helper function setSelected(list, name) { _.each(list, function (item, key) { item.selected = key === name; }); return list; } // TODO: this could be a separate module function getUniqueFileName(dir, name, ext, i, done) { var filename, append = ''; if (i) { append = '-' + i; } filename = path.join(dir, name + append + ext); fs.exists(filename, function (exists) { if (exists) { setImmediate(function () { i = i + 1; return getUniqueFileName(dir, name, ext, i, done); }); } else { return done(filename); } }); } adminControllers = { 'uploader': function (req, res) { var currentDate = moment(), month = currentDate.format("MMM"), year = currentDate.format("YYYY"), tmp_path = req.files.uploadimage.path, dir = path.join('content/images', year, month), ext = path.extname(req.files.uploadimage.name).toLowerCase(), basename = path.basename(req.files.uploadimage.name, ext); function renameFile(target_path) { // adds directories recursively fs.mkdirs(dir, function (err) { if (err) { errors.logError(err); } else { fs.copy(tmp_path, target_path, function (err) { if (err) { errors.logError(err); } else { // TODO: should delete temp file at tmp_path. Or just move the file instead of copy. // the src for the image must be in URI format, not a file system path, which in Windows uses \ var src = path.join('/', target_path).replace(new RegExp('\\' + path.sep, 'g'), '/'); res.send(src); } }); } }); } // TODO: is it better to use file type eg. image/png? if (ext === ".jpg" || ext === ".png" || ext === ".gif") { getUniqueFileName(dir, basename, ext, null, function (filename) { renameFile(filename); }); } else { res.send(404, "Invalid filetype"); } }, 'login': function (req, res) { res.render('login', { bodyClass: 'ghost-login', hideNavbar: true, adminNav: setSelected(adminNavbar, 'login') }); }, 'auth': function (req, res) { var currentTime = process.hrtime()[0], denied = ''; loginSecurity = _.filter(loginSecurity, function (ipTime) { return (ipTime.time + 2 > currentTime); }); denied = _.find(loginSecurity, function (ipTime) { return (ipTime.ip === req.connection.remoteAddress); }); if (!denied) { loginSecurity.push({ip: req.connection.remoteAddress, time: process.hrtime()[0]}); api.users.check({email: req.body.email, pw: req.body.password}).then(function (user) { req.session.user = user.id; res.json(200, {redirect: req.body.redirect ? '/ghost/' + decodeURIComponent(req.body.redirect) : '/ghost/'}); }, function (error) { res.json(401, {error: error.message}); }); } else { res.json(401, {error: 'Slow down, there are way too many login attempts!'}); } }, changepw: function (req, res) { api.users.changePassword({ currentUser: req.session.user, oldpw: req.body.password, newpw: req.body.newpassword, ne2pw: req.body.ne2password }).then(function () { res.json(200, {msg: 'Password changed successfully'}); }, function (error) { res.send(401, {error: error.message}); }); }, 'signup': function (req, res) { res.render('signup', { bodyClass: 'ghost-signup', hideNavbar: true, adminNav: setSelected(adminNavbar, 'login') }); }, 'doRegister': function (req, res) { var name = req.body.name, email = req.body.email, password = req.body.password; api.users.add({ name: name, email: email, password: password }).then(function (user) { api.settings.edit('email', email).then(function () { if (req.session.user === undefined) { req.session.user = user.id; } res.json(200, {redirect: '/ghost/'}); }); }).otherwise(function (error) { res.json(401, {error: error.message}); }); }, 'forgotten': function (req, res) { res.render('forgotten', { bodyClass: 'ghost-forgotten', hideNavbar: true, adminNav: setSelected(adminNavbar, 'login') }); }, 'resetPassword': function (req, res) { var email = req.body.email; api.users.forgottenPassword(email).then(function (user) { var message = { to: email, subject: 'Your new password', html: "
Hello!
" + "You've reset your password. Here's the new one: " + user.newPassword + "
" + "Ghost
" +
'' +
ghost.config().url + '