UNPKG

sheercms

Version:

Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.

390 lines (353 loc) 11.9 kB
var logger = require('../logger'); var api = require('../api'); var auth = require('../auth'); var path_mod = require('path'); var cms = require('sheercms'); var config = require('../config'); var multiparty = require('multiparty'); var view = require('../view'); var utils = require('../utilities'); var async = require("async"); /* callback: (err) */ module.exports.init = function(server, callback) { //routes server.get('/cms/setup', checkInstall, routeIndex); server.post('/cms/setup/create-account', checkInstall, routeCreateAccount); server.post('/cms/setup/install-package', checkInstall, routeInstallPackage); setupRequiredEntities(function(err, updated) { if (callback) callback(null); }); }; function setupRequiredEntities(callback) { try { setupRoles(function (err, updated0) { try { if (err) { callback(err); } else { createAdmin(function (err, updated1) { try { if (err) { callback(err); } else { setupSysDocs(function (err, updated2) { if (err) { callback(err); } else { var updated = updated0 || updated1 || updated2; callback(null, updated); } }); } } catch(e) { logger.error(e); callback(e); } }); } } catch(e) { logger.error(e); callback(e); } }); } catch(e) { logger.error(e); callback(e); } } /* GET ~/cms/setup */ function routeIndex(req, res, next) { try { var model = { browserTitle: "Sheer Cliff CMS", title: "Sheer Cliff Setup Wizard" }; view.renderFile('setup', model, function (err, output) { if (err) { logger.error(err); res.send("Error rendering 'setup' view."); } else res.send(output); }); } catch(e) { logger.error(e); res.send(500, 'An error occurred during the site setup process.'); } } /* GET ~/cms/setup/create-account */ function routeCreateAccount(req, res, next) { var username = req.body.username; var password = req.body.password; try { logger.info("Creating account during setup: " + username); //see if the account already exists api.users.getUser(username, function(err, user) { try { if (err) { res.json({ success: false, message: "Error: " + err }); } else if (user) { //the account already exists var msg = "This account already exists: " + username; logger.warn(msg); res.json({ success: false, message: msg }); } else { //create the account var user = { username: username, password: password, confirmPassword: password, roles: ['cms', 'admin'], active: true, protected: true }; var admin = api.users.getMockAdmin(); api.users.createUser(user, admin, function (err, result) { if (err) { res.json({ success: false, message: "Error: " + err }); } else { res.json({ success: true, message: "User account created successfully!" }); } }); } } catch(e) { logger.error(e); res.json({ success: false, message: "Error creating the CMS account: " + username }); } }); } catch(e) { logger.error(e); res.json({ success: false, message: "Error creating the CMS account: " + username }); } } /* GET ~/cms/setup/install-package */ function routeInstallPackage(req, res, next) { var username = req.body.username; var pkgName = req.body.package; try { logger.info("Installing CMS package: " + pkgName + "; username=" + username); var opt = { name: null, path: null, username: username }; if (pkgName === 'starter') { opt.name = config.settings.packages.starter; opt.path = utils.resolvePath(path_mod.join(config.settings.packages.path, opt.name)); } else if (pkgName === 'none') { logger.info('User chose to skip the package installation in the setup wizard.'); completeSetup(function (err) { if (err) { res.json({ success: false, message: err.message, results: results }); } else { res.json({ success: true, message: "Package installion skipped.", results: [] }); } }); return; } else { var err = new Error('Package not found: ' + pkgName); logger.error(err); res.json({ success: false, message: err.message, results: null }); return; } var results = []; api.packages.installPackage(opt, function(result) { //onProgress //result: {package, item, value, total, status, message} results.push({ message: result.message, status: result.status }); }, function(err, pkg) { try { if (err) { res.json({ success: false, message: err.message, results: results }); } else { completeSetup(function (err) { if (err) { res.json({ success: false, message: err.message, results: results }); } else { res.json({ success: true, message: "Package installed successfully!", results: results }); } }); } } catch(e) { logger.error(e); res.json({ success: false, message: "Error installing CMS package during setup: " + pkgName }); } }); } catch(e) { logger.error(e); res.json({ success: false, message: "Error installing CMS package during setup: " + pkgName }); } } function completeSetup(callback) { logger.info("Completing CMS setup."); api.sysdocs.setInstalled(true, function(err) { callback(err); }); } function createAdmin(callback) { if (config.settings.setup_admin_user === true) { logger.info("Setup - looking for admin user..."); api.users.getUser("admin", function (err, user) { if (err) { if (callback) callback(err); } else if (user) { logger.info("Setup - admin user found."); if (callback) callback(null, false); } else { api.users.createAdminUser(function (err, adminUser) { if (err) { if (callback) callback(err); } else { if (callback) callback(null, true); } }); } }); } else { logger.info("Setup - Skipping admin user setup."); if (callback) callback(null, false); } } function setupSysDocs(callback) { var sysKeys = ['tags']; var updated = false; logger.info("Setup - looking for system documents..."); api.sysdocs.getAll(function(err, docs) { if (err) { if (callback) callback(err); } else { //now initialize each api group async.each(sysKeys, function (key, done) { //make sure there is a sysdoc with this key var found = false; for(var j = 0; j < docs.length; j++) { if (docs[j].key == key) { found = true; break; } } if (found == false) { //need to create this sysdoc logger.info("Setup - creating system document: " + key); api.sysdocs.save({key: key}, function(err) { if (err) done(err); else { updated = true; done(); } }); } else done(); }, function (err) { if (err) { if (callback) callback(err); } else { if (callback) callback(null, updated); } }); } }); } function setupRoles(callback) { logger.info("Setup - looking for required roles..."); api.users.getRoles(function(err, roles) { var reqRoles = ['admin', 'cms']; var updated = false; if (!roles) roles = []; async.each(reqRoles, function (name, done) { var found = false; for(var i = 0; i < roles.length; i++) { if (roles[i].name == name) { found = true; break; } } if (found === true) { done(); } else { //create the role logger.info("Creating core CMS role: " + name); api.users.createRole(name, "", "", true, function(err, role) { updated = true; done(err); }); } }, function (err) { if (err) { logger.error("Error creating the core CMS roles: " + err + "; stack=" + err.stack); callback(err); } else { callback(null, updated); } }); }); } function checkInstall(req, res, next) { if (config.settings && config.settings.check_install === true) { logger.debug('checking for CMS install'); api.sysdocs.isInstalled(function(err, installed) { if (installed === true) { logger.debug('The CMS is already installed.'); res.send(403, "The website is already installed."); } else { logger.info('The CMS is NOT installed.'); next(); } }); } else { //not installing res.send(403, "Access denied to the setup wizard due to configuration settings."); } }