* Switch to JSON/config.json based user groups, and user group membership
This commit is contained in:
parent
6f3137d522
commit
150bd5778a
|
@ -75,8 +75,9 @@ function getDefaultConfig() {
|
||||||
passwordMax : 128,
|
passwordMax : 128,
|
||||||
requireActivation : true, // require SysOp activation?
|
requireActivation : true, // require SysOp activation?
|
||||||
invalidUsernames : [],
|
invalidUsernames : [],
|
||||||
|
|
||||||
defaultGroups : [ 'users' ]
|
groups : [ 'users', 'sysops' ], // built in groups
|
||||||
|
defaultGroups : [ 'users' ] // default groups new users belong to
|
||||||
},
|
},
|
||||||
|
|
||||||
defaults : {
|
defaults : {
|
||||||
|
|
|
@ -53,20 +53,11 @@ function createUserTables() {
|
||||||
');'
|
');'
|
||||||
);
|
);
|
||||||
|
|
||||||
dbs.user.run(
|
|
||||||
'CREATE TABLE IF NOT EXISTS user_group (' +
|
|
||||||
' group_id INTEGER PRIMARY KEY,' +
|
|
||||||
' group_name VARCHAR NOT NULL,' +
|
|
||||||
' UNIQUE(group_name)' +
|
|
||||||
');'
|
|
||||||
);
|
|
||||||
|
|
||||||
dbs.user.run(
|
dbs.user.run(
|
||||||
'CREATE TABLE IF NOT EXISTS user_group_member (' +
|
'CREATE TABLE IF NOT EXISTS user_group_member (' +
|
||||||
' group_id INTEGER NOT NULL,' +
|
' group_name VARCHAR NOT NULL,' +
|
||||||
' user_id INTEGER NOT NULL,' +
|
' user_id INTEGER NOT NULL,' +
|
||||||
' UNIQUE(group_id, user_id),' +
|
' UNIQUE(group_name, user_id)' +
|
||||||
' FOREIGN KEY(group_id) REFERENCES user_group(group_id) ON DELETE CASCADE' +
|
|
||||||
');'
|
');'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -151,13 +142,4 @@ function createInitialMessageValues() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function createInitialUserValues() {
|
function createInitialUserValues() {
|
||||||
dbs.user.run(
|
|
||||||
'INSERT OR IGNORE INTO user_group ' +
|
|
||||||
'VALUES(1, "users");'
|
|
||||||
);
|
|
||||||
|
|
||||||
dbs.user.run(
|
|
||||||
'INSERT OR IGNORE INTO user_group ' +
|
|
||||||
'VALUES(2, "sysops");'
|
|
||||||
);
|
|
||||||
}
|
}
|
32
core/user.js
32
core/user.js
|
@ -22,7 +22,7 @@ function User() {
|
||||||
this.userId = 0;
|
this.userId = 0;
|
||||||
this.username = '';
|
this.username = '';
|
||||||
this.properties = {}; // name:value
|
this.properties = {}; // name:value
|
||||||
this.groups = {}; // id:name
|
this.groups = []; // group membership(s)
|
||||||
|
|
||||||
this.isValid = function() {
|
this.isValid = function() {
|
||||||
if(self.userId <= 0 || self.username.length < Config.users.usernameMin) {
|
if(self.userId <= 0 || self.username.length < Config.users.usernameMin) {
|
||||||
|
@ -47,8 +47,8 @@ function User() {
|
||||||
|
|
||||||
this.isSysOp = this.isRoot; // alias
|
this.isSysOp = this.isRoot; // alias
|
||||||
|
|
||||||
this.isGroupMember = function(groupIdOrName) {
|
this.isGroupMember = function(groupName) {
|
||||||
return _.isString(self.groups[groupIdOrName]);
|
return self.groups.indexOf(groupName) > -1;
|
||||||
};
|
};
|
||||||
|
|
||||||
this.getLegacySecurityLevel = function() {
|
this.getLegacySecurityLevel = function() {
|
||||||
|
@ -217,29 +217,13 @@ User.prototype.create = function(options, cb) {
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
function setInitialGroupMembership(callback) {
|
function setInitialGroupMembership(callback) {
|
||||||
userGroup.getGroupsByName(Config.users.defaultGroups, function defaultGroups(err, groups) {
|
self.groups = Config.users.defaultGroups;
|
||||||
if(err) {
|
|
||||||
callback(err);
|
if(1 === self.userId) { // root/SysOp?
|
||||||
} else {
|
self.groups.push('sysops');
|
||||||
self.groups = groups;
|
|
||||||
callback(null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
|
||||||
function setInitialSysOpGroupMembership(callback) {
|
|
||||||
if(1 !== self.userId) {
|
|
||||||
callback(null);
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
userGroup.getGroupsByName( [ 'sysops' ], function sysopGroups(err, groups) {
|
callback(null);
|
||||||
if(err) {
|
|
||||||
callback(err);
|
|
||||||
} else {
|
|
||||||
_.assign(self.groups, self.groups, groups);
|
|
||||||
callback(null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
function saveAll(callback) {
|
function saveAll(callback) {
|
||||||
self.persist(false, function persisted(err) {
|
self.persist(false, function persisted(err) {
|
||||||
|
|
|
@ -8,37 +8,24 @@ var async = require('async');
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
|
|
||||||
exports.getGroupsForUser = getGroupsForUser;
|
exports.getGroupsForUser = getGroupsForUser;
|
||||||
exports.getGroupsByName = getGroupsByName;
|
|
||||||
exports.addUserToGroup = addUserToGroup;
|
exports.addUserToGroup = addUserToGroup;
|
||||||
exports.addUserToGroups = addUserToGroups;
|
exports.addUserToGroups = addUserToGroups;
|
||||||
exports.removeUserFromGroup = removeUserFromGroup;
|
exports.removeUserFromGroup = removeUserFromGroup;
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// user_group
|
|
||||||
// group_id | group_name
|
|
||||||
//
|
|
||||||
//
|
|
||||||
// user_group_member
|
|
||||||
// group_id | user_id
|
|
||||||
//
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
function getGroupsForUser(userId, cb) {
|
function getGroupsForUser(userId, cb) {
|
||||||
var sql =
|
var sql =
|
||||||
'SELECT g.group_id, g.group_name ' +
|
'SELECT group_name ' +
|
||||||
'FROM user_group g, user_group_member gm ' +
|
'FROM user_group_member ' +
|
||||||
'WHERE g.group_id = gm.group_id AND gm.user_id = ?;';
|
'WHERE user_id=?;';
|
||||||
|
|
||||||
var groups = {}; // id:name
|
var groups = [];
|
||||||
|
|
||||||
userDb.each(sql, [ userId ], function dbRow(err, row) {
|
userDb.each(sql, [ userId ], function rowData(err, row) {
|
||||||
if(err) {
|
if(err) {
|
||||||
cb(err);
|
cb(err);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
groups[row.group_id] = row.group_name;
|
groups.push(row.group_name);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
function complete() {
|
function complete() {
|
||||||
|
@ -46,31 +33,11 @@ function getGroupsForUser(userId, cb) {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function getGroupsByName(groupNames, cb) {
|
function addUserToGroup(userId, groupName, cb) {
|
||||||
var sql =
|
|
||||||
'SELECT group_id, group_name ' +
|
|
||||||
'FROM user_group ' +
|
|
||||||
'WHERE group_name IN ("' + groupNames.join('","') + '");';
|
|
||||||
|
|
||||||
userDb.all(sql, function allRows(err, rows) {
|
|
||||||
if(err) {
|
|
||||||
cb(err);
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
var groups = {};
|
|
||||||
rows.forEach(function row(r) {
|
|
||||||
groups[r.group_id] = r.group_name;
|
|
||||||
});
|
|
||||||
cb(null, groups);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function addUserToGroup(userId, groupId, cb) {
|
|
||||||
userDb.run(
|
userDb.run(
|
||||||
'REPLACE INTO user_group_member (group_id, user_id) ' +
|
'REPLACE INTO user_group_member (group_name, user_id) ' +
|
||||||
'VALUES(?, ?);',
|
'VALUES(?, ?);',
|
||||||
[ groupId, userId ],
|
[ groupName, userId ],
|
||||||
function complete(err) {
|
function complete(err) {
|
||||||
cb(err);
|
cb(err);
|
||||||
}
|
}
|
||||||
|
@ -78,20 +45,19 @@ function addUserToGroup(userId, groupId, cb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
function addUserToGroups(userId, groups, cb) {
|
function addUserToGroups(userId, groups, cb) {
|
||||||
async.each(Object.keys(groups), function item(groupId, nextItem) {
|
|
||||||
addUserToGroup(userId, groupId, function added(err) {
|
async.each(groups, function item(groupName, next) {
|
||||||
nextItem(err);
|
addUserToGroup(userId, groupName, next);
|
||||||
});
|
|
||||||
}, function complete(err) {
|
}, function complete(err) {
|
||||||
cb(err);
|
cb(err);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function removeUserFromGroup(userId, groupId, cb) {
|
function removeUserFromGroup(userId, groupName, cb) {
|
||||||
userDb.run(
|
userDb.run(
|
||||||
'DELETE FROM user_group_member ' +
|
'DELETE FROM user_group_member ' +
|
||||||
'WHERE group_id = ? AND user_id = ?;',
|
'WHERE group_name=? AND user_id=?;',
|
||||||
[ groupId, userId ],
|
[ groupName, userId ],
|
||||||
function complete(err) {
|
function complete(err) {
|
||||||
cb(err);
|
cb(err);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue