sheercms
Version:
Sheer Cliff CMS is a simple and powerful content management system (CMS) for Node JS.
390 lines (353 loc) • 11.9 kB
JavaScript
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.");
}
}