* Some work on User creation/persistance
* Fix some MCI parsing from menu.json * Add 'options' to menu entries
This commit is contained in:
parent
2bac8e006e
commit
85a72935fa
|
@ -4,6 +4,7 @@
|
||||||
var PluginModule = require('./plugin_module.js').PluginModule;
|
var PluginModule = require('./plugin_module.js').PluginModule;
|
||||||
var theme = require('./theme.js');
|
var theme = require('./theme.js');
|
||||||
var Log = require('./logger.js').log;
|
var Log = require('./logger.js').log;
|
||||||
|
var ansi = require('./ansi_term.js');
|
||||||
|
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
|
@ -15,6 +16,7 @@ function MenuModule(options) {
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
this.menuConfig = options.menuConfig;
|
this.menuConfig = options.menuConfig;
|
||||||
|
this.menuConfig.options = options.menuConfig.options || {};
|
||||||
this.menuMethods = {};
|
this.menuMethods = {};
|
||||||
this.viewControllers = [];
|
this.viewControllers = [];
|
||||||
|
|
||||||
|
@ -76,6 +78,10 @@ MenuModule.prototype.addViewController = function(vc) {
|
||||||
};
|
};
|
||||||
|
|
||||||
MenuModule.prototype.beforeArt = function() {
|
MenuModule.prototype.beforeArt = function() {
|
||||||
|
if(this.menuConfig.options.clearScreen) {
|
||||||
|
this.client.term.write(ansi.resetScreen());
|
||||||
|
}
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MenuModule.prototype.mciReady = function(mciMap) {
|
MenuModule.prototype.mciReady = function(mciMap) {
|
||||||
|
|
112
core/user.js
112
core/user.js
|
@ -5,6 +5,7 @@ var userDb = require('./database.js').dbs.user;
|
||||||
var crypto = require('crypto');
|
var crypto = require('crypto');
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
var async = require('async');
|
var async = require('async');
|
||||||
|
var _ = require('lodash');
|
||||||
|
|
||||||
exports.User = User;
|
exports.User = User;
|
||||||
exports.getUserIdAndName = getUserIdAndName;
|
exports.getUserIdAndName = getUserIdAndName;
|
||||||
|
@ -114,9 +115,10 @@ User.prototype.authenticate = function(username, password, cb) {
|
||||||
],
|
],
|
||||||
function complete(err) {
|
function complete(err) {
|
||||||
if(!err) {
|
if(!err) {
|
||||||
self.userId = cachedInfo.userId;
|
self.userId = cachedInfo.userId;
|
||||||
self.username = cachedInfo.username;
|
self.username = cachedInfo.username;
|
||||||
self.properties = cachedInfo.properties;
|
self.properties = cachedInfo.properties;
|
||||||
|
self.authenticated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
cb(err);
|
cb(err);
|
||||||
|
@ -144,6 +146,110 @@ function getUserIdAndName(username, cb) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
User.prototype.create = function(options, cb) {
|
||||||
|
assert(0 === this.userId);
|
||||||
|
assert(this.username.length > 0); // :TODO: Min username length? Max?
|
||||||
|
assert(_.isObject(options));
|
||||||
|
assert(_.isString(options.password));
|
||||||
|
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
async.series(
|
||||||
|
[
|
||||||
|
function beginTransaction(callback) {
|
||||||
|
userDb.run('BEGIN;', function transBegin(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
function createUserRec(callback) {
|
||||||
|
userDb.run(
|
||||||
|
'INSERT INTO user (user_name) ' +
|
||||||
|
'VALUES (?);',
|
||||||
|
[ self.username ],
|
||||||
|
function userInsert(err) {
|
||||||
|
if(err) {
|
||||||
|
callback(err);
|
||||||
|
} else {
|
||||||
|
self.userId = this.lastID;
|
||||||
|
callback(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
},
|
||||||
|
function genAuthCredentials(callback) {
|
||||||
|
generatePasswordDerivedKeySalt(options.password, function dkAndSalt(err, info) {
|
||||||
|
if(err) {
|
||||||
|
callback(err);
|
||||||
|
} else {
|
||||||
|
self.properties.pw_pbkdf2_salt = info.salt;
|
||||||
|
self.properties.pw_pbkdf2_dk = info.dk;
|
||||||
|
callback(null);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
},
|
||||||
|
function saveAll(callback) {
|
||||||
|
// :TODO: persist all data - props/etc.
|
||||||
|
callback(null);
|
||||||
|
}
|
||||||
|
],
|
||||||
|
function complete(err) {
|
||||||
|
if(err) {
|
||||||
|
var originalError = err;
|
||||||
|
userDb.run('ROLLBACK;', function rollback(err) {
|
||||||
|
assert(!err);
|
||||||
|
cb(originalError);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
userDb.run('COMMIT;', function commited(err) {
|
||||||
|
cb(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
User.prototype.persist = function(useTransaction, cb) {
|
||||||
|
assert(this.userId > 0);
|
||||||
|
|
||||||
|
async.series(
|
||||||
|
[
|
||||||
|
function beginTransaction(callback) {
|
||||||
|
if(useTransaction) {
|
||||||
|
userDb.run('BEGIN;', function transBegin(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
callback(null);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
function saveProps(callback) {
|
||||||
|
persistProperties(this, function persisted(err) {
|
||||||
|
callback(err);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
],
|
||||||
|
function complete(err) {
|
||||||
|
if(err) {
|
||||||
|
if(useTransaction) {
|
||||||
|
userDb.run('ROLLBACK;', function rollback(err) {
|
||||||
|
cb(err);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
cb(err);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if(useTransaction) {
|
||||||
|
userDb.run('COMMIT;', function commited(err) {
|
||||||
|
cb(err);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
cb(null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
function createNew(user, cb) {
|
function createNew(user, cb) {
|
||||||
assert(user.username && user.username.length > 1, 'Invalid userName');
|
assert(user.username && user.username.length > 1, 'Invalid userName');
|
||||||
|
|
||||||
|
|
|
@ -216,6 +216,8 @@ ViewController.prototype.loadFromMCIMapAndConfig = function(options, cb) {
|
||||||
var initialFocusId;
|
var initialFocusId;
|
||||||
var formConfig;
|
var formConfig;
|
||||||
|
|
||||||
|
var mciRegEx = /([A-Z]{2})([0-9]{1,2})/;
|
||||||
|
|
||||||
// :TODO: remove all the passing of fromConfig - use local
|
// :TODO: remove all the passing of fromConfig - use local
|
||||||
// :TODO: break all of this up ... a lot
|
// :TODO: break all of this up ... a lot
|
||||||
|
|
||||||
|
@ -256,7 +258,8 @@ ViewController.prototype.loadFromMCIMapAndConfig = function(options, cb) {
|
||||||
function applyFormConfig(callback) {
|
function applyFormConfig(callback) {
|
||||||
if(formConfig) {
|
if(formConfig) {
|
||||||
async.each(Object.keys(formConfig.mci), function onMciConf(mci, eachCb) {
|
async.each(Object.keys(formConfig.mci), function onMciConf(mci, eachCb) {
|
||||||
var viewId = parseInt(mci[2]); // :TODO: what about auto-generated ID's? Do they simply not apply to menu configs?
|
var mciMatch = mci.match(mciRegEx); // :TODO: what about auto-generated IDs? Do they simply not apply to menu configs?
|
||||||
|
var viewId = parseInt(mciMatch[2]);
|
||||||
var view = self.getView(viewId);
|
var view = self.getView(viewId);
|
||||||
var mciConf = formConfig.mci[mci];
|
var mciConf = formConfig.mci[mci];
|
||||||
|
|
||||||
|
|
|
@ -42,8 +42,6 @@ ApplyModule.prototype.enter = function(client) {
|
||||||
|
|
||||||
ApplyModule.prototype.beforeArt = function() {
|
ApplyModule.prototype.beforeArt = function() {
|
||||||
ApplyModule.super_.prototype.beforeArt.call(this);
|
ApplyModule.super_.prototype.beforeArt.call(this);
|
||||||
|
|
||||||
this.client.term.write(ansi.resetScreen());
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ApplyModule.prototype.mciReady = function(mciMap) {
|
ApplyModule.prototype.mciReady = function(mciMap) {
|
||||||
|
|
|
@ -72,7 +72,7 @@ LoginModule.prototype.enter = function(client) {
|
||||||
LoginModule.prototype.beforeArt = function() {
|
LoginModule.prototype.beforeArt = function() {
|
||||||
LoginModule.super_.prototype.beforeArt.call(this);
|
LoginModule.super_.prototype.beforeArt.call(this);
|
||||||
|
|
||||||
this.client.term.write(ansi.resetScreen());
|
//this.client.term.write(ansi.resetScreen());
|
||||||
};
|
};
|
||||||
|
|
||||||
LoginModule.prototype.mciReady = function(mciMap) {
|
LoginModule.prototype.mciReady = function(mciMap) {
|
||||||
|
|
|
@ -14,6 +14,8 @@
|
||||||
"normal" : ...,
|
"normal" : ...,
|
||||||
"focus" : ...
|
"focus" : ...
|
||||||
}
|
}
|
||||||
|
|
||||||
|
..note that script/methods should be part of a *theme* - or at least checked first with fallback
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
@ -48,6 +50,9 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"options" : {
|
||||||
|
"clearScreen" : true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"login" : {
|
"login" : {
|
||||||
|
@ -86,6 +91,9 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"options" : {
|
||||||
|
"clearScreen" : true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"logoff" : {
|
"logoff" : {
|
||||||
|
@ -97,14 +105,23 @@
|
||||||
"module" : "apply",
|
"module" : "apply",
|
||||||
"form" : {
|
"form" : {
|
||||||
"0" : {
|
"0" : {
|
||||||
"ET1ET2ET3ET4ET5ET6ET7ET8ET9TL10TL11TL12" : {
|
"BN13BN14ET1ET2ET3ET4ET5ET6ET7ET8ET9TL10TL11TL12" : {
|
||||||
"mci" : {
|
"mci" : {
|
||||||
"ET1" : {
|
"ET1" : {
|
||||||
"focus" : true
|
"focus" : true
|
||||||
|
},
|
||||||
|
"BN13" : {
|
||||||
|
"text" : "Apply"
|
||||||
|
},
|
||||||
|
"BN14" : {
|
||||||
|
"text" : "Cancel"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"options" : {
|
||||||
|
"clearScreen" : true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -27,8 +27,6 @@ StandardMenuModule.prototype.enter = function(client) {
|
||||||
|
|
||||||
StandardMenuModule.prototype.beforeArt = function() {
|
StandardMenuModule.prototype.beforeArt = function() {
|
||||||
StandardMenuModule.super_.prototype.beforeArt.call(this);
|
StandardMenuModule.super_.prototype.beforeArt.call(this);
|
||||||
|
|
||||||
this.client.term.write(ansi.resetScreen()); // :TODO: this should be optional
|
|
||||||
};
|
};
|
||||||
|
|
||||||
StandardMenuModule.prototype.mciReady = function(mciMap) {
|
StandardMenuModule.prototype.mciReady = function(mciMap) {
|
||||||
|
|
Loading…
Reference in New Issue