remove comments meant for logging, implement moderator removal, cleanup

This commit is contained in:
Ryan Tharp 2019-11-08 23:32:18 +00:00
parent 67be61dc7d
commit 091e4798e4
11 changed files with 101 additions and 140 deletions

View File

@ -2,10 +2,6 @@
const overlay = require('../../lib.overlay'); const overlay = require('../../lib.overlay');
const handlers = require('./dialect_moderation_handlers'); const handlers = require('./dialect_moderation_handlers');
//
// helpers
//
module.exports = (app, prefix) => { module.exports = (app, prefix) => {
// set cache based on dispatcher object // set cache based on dispatcher object
cache = app.dispatcher.cache; cache = app.dispatcher.cache;
@ -31,9 +27,12 @@ module.exports = (app, prefix) => {
// single mod delete, deprecated // single mod delete, deprecated
app.delete(prefix + '/loki/v1/moderation/messages', handlers.modDeleteMultipleHandler); app.delete(prefix + '/loki/v1/moderation/messages', handlers.modDeleteMultipleHandler);
// create moderator
app.post(prefix + '/loki/v1/moderators/:id', handlers.addGlobalModerator); app.post(prefix + '/loki/v1/moderators/:id', handlers.addGlobalModerator);
// remove moderator
app.delete(prefix + '/loki/v1/moderators/:id', handlers.removeGlobalModerator); app.delete(prefix + '/loki/v1/moderators/:id', handlers.removeGlobalModerator);
// blacklist userid
app.post(prefix + '/loki/v1/moderation/blacklist/:id', handlers.blacklistUserFromServerHandler); app.post(prefix + '/loki/v1/moderation/blacklist/:id', handlers.blacklistUserFromServerHandler);
} }

View File

@ -36,7 +36,6 @@ const getChannelModeratorsHandler = async (req, res) => {
const getDeletesHandler = (req, res) => { const getDeletesHandler = (req, res) => {
const numId = parseInt(req.params.id); const numId = parseInt(req.params.id);
//console.log('numId', numId)
cache.getChannelDeletions(numId, req.apiParams, (interactions, err, meta) => { cache.getChannelDeletions(numId, req.apiParams, (interactions, err, meta) => {
const items = interactions.map(interaction => ({ const items = interactions.map(interaction => ({
delete_at: interaction.datetime, delete_at: interaction.datetime,
@ -52,9 +51,8 @@ const getDeletesHandler = (req, res) => {
}; };
const deleteMultipleHandler = (req, res) => { const deleteMultipleHandler = (req, res) => {
//console.log('dialect_moderation_handler::deleteMultipleHandler - ids', req.query.ids);
if (!req.query.ids) { if (!req.query.ids) {
console.log('moderation message mass delete ids empty'); console.warn('user message mass delete ids empty');
res.status(422).type('application/json').end(JSON.stringify({ res.status(422).type('application/json').end(JSON.stringify({
error: 'ids missing', error: 'ids missing',
})); }));
@ -68,16 +66,14 @@ const deleteMultipleHandler = (req, res) => {
ids = [ ids ]; ids = [ ids ];
} }
if (ids.length > 200) { if (ids.length > 200) {
console.log('moderation message mass delete too many ids, 200<', ids.length); console.warn('user message mass delete too many ids, 200<', ids.length);
res.status(422).type('application/json').end(JSON.stringify({ res.status(422).type('application/json').end(JSON.stringify({
error: 'too many ids', error: 'too many ids',
})); }));
return; return;
} }
dialect.validUser(req.token, res, async usertoken => { dialect.validUser(req.token, res, async usertoken => {
//console.log('dialect_moderation_handler::deleteMultipleHandler - validUser');
const [ code, err, messages ] = await helpers.getMessages(ids); const [ code, err, messages ] = await helpers.getMessages(ids);
//console.log('dialect_moderation_handler::deleteMultipleHandler - getMessages', code);
if (err) { if (err) {
console.error('dialect_moderation_handler::deleteMultipleHandler - getMessages err', err) console.error('dialect_moderation_handler::deleteMultipleHandler - getMessages err', err)
const resObj = { const resObj = {
@ -120,13 +116,12 @@ const deleteMultipleHandler = (req, res) => {
datas.push(msg); datas.push(msg);
return; return;
} }
//console.log('dialect_moderation_handler::deleteMultipleHandler - nuking', msg.id);
// we're allowed to nuke it & carry out deletion // we're allowed to nuke it & carry out deletion
const resObj = await helpers.deleteMessage(msg); const resObj = await helpers.deleteMessage(msg);
metas.push(resObj.meta); metas.push(resObj.meta);
datas.push(resObj.data); datas.push(resObj.data);
})); }));
//console.log('dialect_moderation_handler::deleteMultipleHandler - calling back');
resObj = { resObj = {
meta: { meta: {
code: code, code: code,
@ -142,9 +137,7 @@ const deleteMultipleHandler = (req, res) => {
const modDeleteSingleHandler = (req, res) => { const modDeleteSingleHandler = (req, res) => {
helpers.validGlobal(req.token, res, async (usertoken, access_list) => { helpers.validGlobal(req.token, res, async (usertoken, access_list) => {
const numId = parseInt(req.params.id); const numId = parseInt(req.params.id);
//console.log('dialect_moderation_handlers::modDeleteSingleHandler - modTryDeleteMessages');
resObj = await helpers.modTryDeleteMessages([numId], access_list); resObj = await helpers.modTryDeleteMessages([numId], access_list);
//console.log('dialect_moderation_handlers::modDeleteSingleHandler - Sending response');
dialect.sendResponse(resObj, res); dialect.sendResponse(resObj, res);
}); });
}; };
@ -217,7 +210,7 @@ const removeGlobalModerator = (req, res) => {
data: [] data: []
} }
helpers.validGlobal(req.token, res, async (usertoken, access_list) => { helpers.validGlobal(req.token, res, async (usertoken, access_list) => {
// res.data = await storage.removeServerModerator(usertoken.userid);
dialect.sendResponse(resObj, res); dialect.sendResponse(resObj, res);
}); });
}; };
@ -236,9 +229,7 @@ const blacklistUserFromServerHandler = (req, res) => {
data: [] data: []
} }
helpers.validGlobal(req.token, res, async (usertoken, access_list) => { helpers.validGlobal(req.token, res, async (usertoken, access_list) => {
//console.log('blacklistUserFromServerHandler validGlobal')
const result = await logic.blacklistUserFromServer(req.params.id); const result = await logic.blacklistUserFromServer(req.params.id);
//console.log('blacklistUserFromServerHandler result', result)
dialect.sendResponse(resObj, res); dialect.sendResponse(resObj, res);
}); });
} }

View File

@ -6,10 +6,10 @@ const setup = (utilties) => {
({ config, cache, dispatcher, dialect } = utilties); ({ config, cache, dispatcher, dialect } = utilties);
}; };
// not currently used
const getUser = (userid) => { const getUser = (userid) => {
return new Promise((res, rej) => { return new Promise((res, rej) => {
cache.getUser(userid, (user, err) => { cache.getUser(userid, (user, err) => {
//console.log('getUser', user)
if (user) { if (user) {
res(user); res(user);
} else { } else {
@ -27,16 +27,15 @@ const getUsers = (userids) => {
let next200 = userids.splice(0, 200); let next200 = userids.splice(0, 200);
while(next200.length) { while(next200.length) {
requests++; requests++;
// allow them to overlap // allow them to overlap
cache.getUsers(next200, {}, (users, err) => { cache.getUsers(next200, {}, (users, err) => {
if (err) { if (err) {
return rej(err); return rej(err);
} }
// console.log('getUsers', users)
results = results.concat(users); results = results.concat(users);
responses++; responses++;
if (requests === responses) { if (requests === responses) {
// console.log('results', results);
return res(results); return res(results);
} }
}); });
@ -46,15 +45,12 @@ const getUsers = (userids) => {
}; };
const validGlobal = (token, res, cb) => { const validGlobal = (token, res, cb) => {
//console.log('dialect_moderation_helpers::validGlobal', token)
dialect.validUser(token, res, async (usertoken) => { dialect.validUser(token, res, async (usertoken) => {
if (usertoken === undefined) { if (usertoken === undefined) {
// should have already been handled by dialect.validUser // should have already been handled by dialect.validUser
return; return;
} }
//console.log('usertoken', usertoken);
const list = await config.getUserAccess(usertoken.userid); const list = await config.getUserAccess(usertoken.userid);
//console.log('list', list);
if (!list) { if (!list) {
// not even on the list // not even on the list
const resObj={ const resObj={
@ -101,9 +97,7 @@ const deleteMessage = (msg) => {
const getMessages = (ids) => { const getMessages = (ids) => {
return new Promise(function(resolve, rej) { return new Promise(function(resolve, rej) {
//console.log('dialect_moderation_helpers::getMessage starting', ids)
cache.getMessage(ids, (messages, getErr) => { cache.getMessage(ids, (messages, getErr) => {
//console.log('dialect_moderation_helpers::getMessage returned')
// handle errors // handle errors
if (getErr) { if (getErr) {
console.error('getMessage err', getErr); console.error('getMessage err', getErr);
@ -163,7 +157,6 @@ const modTryDeleteMessages = async (ids, access_list) => {
return resObj; return resObj;
} }
} }
//console.log('tryDeleteMessage message', message)
// carry out deletion // carry out deletion
const resObj = await deleteMessage(message); const resObj = await deleteMessage(message);

View File

@ -11,7 +11,6 @@ const setup = (utilties) => {
const getChallengeHandler = async (req, res) => { const getChallengeHandler = async (req, res) => {
const { pubKey } = req.query; const { pubKey } = req.query;
//console.log('dialect_tokens_handler::getChallengeHandler', pubKey)
if (!pubKey) { if (!pubKey) {
console.log('get_challenge pubKey missing'); console.log('get_challenge pubKey missing');
res.status(422).type('application/json').end(JSON.stringify({ res.status(422).type('application/json').end(JSON.stringify({
@ -41,7 +40,6 @@ const getChallengeHandler = async (req, res) => {
const submitChallengeHandler = async (req, res) => { const submitChallengeHandler = async (req, res) => {
const { pubKey, token } = req.body; const { pubKey, token } = req.body;
//console.log('dialect_tokens_handler::submitChallengeHandler', pubKey)
if (!pubKey) { if (!pubKey) {
console.log('submit_challenge pubKey missing'); console.log('submit_challenge pubKey missing');
res.status(422).type('application/json').end(JSON.stringify({ res.status(422).type('application/json').end(JSON.stringify({
@ -79,21 +77,13 @@ const submitChallengeHandler = async (req, res) => {
}; };
const getTokenInfoHandler = async (req, res) => { const getTokenInfoHandler = async (req, res) => {
// console.log('dialect_tokens_handler::getTokenInfoHandler')
const usertoken = await dialect.validUser(req.token, res); const usertoken = await dialect.validUser(req.token, res);
if (usertoken === undefined) { if (usertoken === undefined) {
// should have already been handled by dialect.validUser // should have already been handled by dialect.validUser
return; return;
} }
//console.log('usertoken', JSON.stringify(usertoken))
let resObj = {} let resObj = {}
try { try {
//console.log('dialect_tokens_handler::getTokenInfoHandler - getperms', usertoken.userid)
// do we want server permissions?
// or do we want a list of channel permissions?
//const [err, perms] = await logic.getAllPermissionsByUserId(usertoken.userid);
//console.log('dialect_tokens_handler::getTokenInfoHandler - got perms')
//console.log('perms', perms)
const modStatus = await config.getUserAccess(usertoken.userid); const modStatus = await config.getUserAccess(usertoken.userid);
resObj={ resObj={
meta: { meta: {

View File

@ -61,15 +61,12 @@ const deleteTempStorageForToken = (pubKey, token) => {
} }
const checkTempStorageForToken = (token) => { const checkTempStorageForToken = (token) => {
//console.log('searching for', token)
// check temp storage // check temp storage
for(var pubKey in tempDB) { for(var pubKey in tempDB) {
const found = tempDB[pubKey].find(tempObjs => { const found = tempDB[pubKey].find(tempObjs => {
const tempToken = tempObjs.token; const tempToken = tempObjs.token;
//console.log('pubKey', pubKey, 'token', tempToken);
if (tempToken === token) return true; if (tempToken === token) return true;
}) })
//console.log('pubKey', pubKey, 'found', found);
if (found) { if (found) {
return true; return true;
} }
@ -107,7 +104,6 @@ const findToken = (token) => {
return rej(err); return rej(err);
} }
// report back existence // report back existence
//console.log('backend has token', usertoken?true:false, token);
res(usertoken?true:false); res(usertoken?true:false);
}); });
}); });
@ -126,11 +122,9 @@ const generateString = () => {
} }
const createToken = (pubKey) => { const createToken = (pubKey) => {
//console.log('dialect_tokens_helpers::createToken', pubKey)
return new Promise((res, rej) => { return new Promise((res, rej) => {
findOrCreateUser(pubKey) findOrCreateUser(pubKey)
.then(async user => { .then(async user => {
//console.log('Creating token for', user.id)
// generate new random token and make sure it's not in use // generate new random token and make sure it's not in use
let inUse = true; let inUse = true;
while(inUse) { while(inUse) {
@ -146,30 +140,25 @@ const createToken = (pubKey) => {
} }
const findOrCreateUser = (pubKey) => { const findOrCreateUser = (pubKey) => {
//console.log('dialect_tokens_helpers::findOrCreateUser', pubKey)
return new Promise((res, rej) => { return new Promise((res, rej) => {
cache.getUserID(pubKey, (user, err) => { cache.getUserID(pubKey, (user, err) => {
if (err) { if (err) {
rej(err); rej(err);
return; return;
} }
//console.log('findOrCreateUser', pubKey, 'new', user === null);
if (user === null) { if (user === null) {
// create user // create user
// "password" (2nd) parameter is not saved/used // "password" (2nd) parameter is not saved/used
//console.log('calling addUser')
cache.addUser(pubKey, '', (newUser, err2) => { cache.addUser(pubKey, '', (newUser, err2) => {
if (err2) { if (err2) {
console.error('addUser err', err2); console.error('addUser err', err2);
rej(err2); rej(err2);
} else { } else {
//console.log('passing back newly created', newUser)
res(newUser); res(newUser);
} }
}) })
} else { } else {
// we have this user // we have this user
//console.log('findOrCreateUser', user)
res(user); res(user);
} }
}); });
@ -242,7 +231,6 @@ const confirmToken = (pubKey, token) => {
if (!userObj) { if (!userObj) {
return rej('user'); return rej('user');
} }
console.log('confirming token for user', userObj.id, 'for', pubKey);
// promote token to usable for user // promote token to usable for user
cache.addUnconstrainedAPIUserToken(userObj.id, 'messenger', ADN_SCOPES, token, TOKEN_TTL_MINS, (tokenObj, err) => { cache.addUnconstrainedAPIUserToken(userObj.id, 'messenger', ADN_SCOPES, token, TOKEN_TTL_MINS, (tokenObj, err) => {
if (err) { if (err) {
@ -250,7 +238,6 @@ const confirmToken = (pubKey, token) => {
return rej('tokenCreation'); return rej('tokenCreation');
} }
// if no, err we assume everything is fine... // if no, err we assume everything is fine...
//console.log('addUnconstrainedAPIUserToken result', tokenObj)
// ok token is now registered // ok token is now registered
// remove from temp storage // remove from temp storage
deleteTempStorageForToken(pubKey, token); deleteTempStorageForToken(pubKey, token);

View File

@ -9,8 +9,8 @@ const logic = require('./logic');
const dialect = require('./lib.dialect'); const dialect = require('./lib.dialect');
// Look for a config file // Look for a config file
const disk_config = config.getDiskConfig() const disk_config = config.getDiskConfig();
storage.start(disk_config) storage.start(disk_config);
const setup = (cache, dispatcher) => { const setup = (cache, dispatcher) => {
config.setup({ cache, storage }); config.setup({ cache, storage });
@ -21,4 +21,4 @@ const setup = (cache, dispatcher) => {
module.exports = { module.exports = {
setup setup
} };

View File

@ -1,22 +1,22 @@
const funcs = [] const funcs = [];
funcs.push(require('./logic/permissions.js')) funcs.push(require('./logic/permissions.js'));
let storage let storage;
let cache let cache;
function setup(configObject) { function setup(configObject) {
({ storage, cache, config } = configObject) ({ storage, cache, config } = configObject);
funcs.forEach((func) => { funcs.forEach((func) => {
func.start(configObject) func.start(configObject);
}); });
} }
let functions = {} let functions = {};
funcs.forEach((func) => { funcs.forEach((func) => {
functions = Object.assign(functions, func) functions = Object.assign(functions, func);
}); });
module.exports = functions module.exports = functions;
// override all those starts // override all those starts
module.exports.setup = setup module.exports.setup = setup;

View File

@ -1,11 +1,11 @@
// have to generalize these since almost every system needs to check permissions // have to generalize these since almost every system needs to check permissions
let storage let storage;
let cache let cache;
module.exports = { module.exports = {
start: (configObject) => { start: (configObject) => {
({ storage, cache } = configObject) ({ storage, cache } = configObject);
}, },
// maybe only needed in dialog_token // maybe only needed in dialog_token
passesWhitelist: async (pubKey) => { passesWhitelist: async (pubKey) => {
@ -36,6 +36,7 @@ module.exports = {
// by default everyone is allowed // by default everyone is allowed
return true; return true;
}, },
// FIXME: should return a promise
getPermissionsByUser: (pubKey, entity, entityId) => { getPermissionsByUser: (pubKey, entity, entityId) => {
// get userID // get userID
const ref = this; const ref = this;
@ -44,7 +45,6 @@ module.exports = {
}) })
}, },
getEntityPermissionsByUserId: async (userid, entity, entityId) => { getEntityPermissionsByUserId: async (userid, entity, entityId) => {
//console.log('logic:::permissions::getPermissionsByUserId(', userid, entity, entityId, ')');
if (userid === undefined) { if (userid === undefined) {
console.warn('logic:::permissions::getPermissionsByUserId - no userid'); console.warn('logic:::permissions::getPermissionsByUserId - no userid');
return [ 'no userid' ]; return [ 'no userid' ];
@ -60,9 +60,9 @@ module.exports = {
// get user roles // get user roles
let roles let roles
try { try {
console.log('logic:::permissions::getPermissionsByUserId - ', userid) console.log('logic:::permissions::getPermissionsByUserId - ', userid);
roles = await storage.getRolesByUserId(userid, (err, roles) => { roles = await storage.getRolesByUserId(userid, (err, roles) => {
console.log('roles', roles) console.log('roles', roles);
// get roles permissions by entity // get roles permissions by entity
// get user permissions by entity // get user permissions by entity
// collapse it down... // collapse it down...
@ -97,7 +97,7 @@ module.exports = {
// get channel roles // get channel roles
try { try {
const roles = await storage.getRolesByChannelId(channelid, (err, roles) => { const roles = await storage.getRolesByChannelId(channelid, (err, roles) => {
console.log('channel roles', roles) console.log('channel roles', roles);
// get roles permissions by entity // get roles permissions by entity
// get user permissions by entity // get user permissions by entity
// collapse it down... // collapse it down...
@ -105,7 +105,7 @@ module.exports = {
} catch(e) { } catch(e) {
console.error('getPermissionsByChannelId failure', e); console.error('getPermissionsByChannelId failure', e);
} }
console.log('roles return', roles) console.log('roles return', roles);
// we need to return a list of users that fit these permissions? // we need to return a list of users that fit these permissions?
}, },
whoHasThisPerm: (entity, entityId, permission) => { whoHasThisPerm: (entity, entityId, permission) => {
@ -113,7 +113,6 @@ module.exports = {
}, },
getModeratorsByChannelId: async (channelId, cb) => { getModeratorsByChannelId: async (channelId, cb) => {
const mods = await storage.getModeratorsByChannelId(channelId); const mods = await storage.getModeratorsByChannelId(channelId);
console.log('logic:::permissions::getModeratorsByChannelId - mods', mods);
return mods; return mods;
}, },
addGlobalModerator: async userid => { addGlobalModerator: async userid => {
@ -136,7 +135,6 @@ module.exports = {
function removeAllTokens(username) { function removeAllTokens(username) {
return new Promise( async (resolve, rej) => { return new Promise( async (resolve, rej) => {
cache.getAPITokenByUsername(username, (usertoken, err, meta) => { cache.getAPITokenByUsername(username, (usertoken, err, meta) => {
//console.log('getAPITokenByUsername');
if (err) console.error('logic:::permissions::blacklistUserFromServer - getAPITokenByUsername err', err); if (err) console.error('logic:::permissions::blacklistUserFromServer - getAPITokenByUsername err', err);
if (usertoken) { if (usertoken) {
cache.delAPIUserToken(usertoken.token, async (delToken, err) => { cache.delAPIUserToken(usertoken.token, async (delToken, err) => {
@ -162,26 +160,20 @@ module.exports = {
} }
// mark the database as such, so they can't get any new tokens // mark the database as such, so they can't get any new tokens
const result = await storage.blacklistUserFromServer(userid); const result = await storage.blacklistUserFromServer(userid);
//console.log('logic::permission:blacklistUserFromServer - result', result)
if (!result) { if (!result) {
console.warn('logic:::permissions::blacklistUserFromServer - failed to blacklist'); console.warn('logic:::permissions::blacklistUserFromServer - failed to blacklist');
return false; return false;
} }
// get username, so we can query token by username // get username, so we can query token by username
//console.log('logic::permission:blacklistUserFromServer - lookup', userid)
const user = await getUserPromise(userid); const user = await getUserPromise(userid);
const username = user.username; const username = user.username;
//console.log('logic:::permissions::blacklistUserFromServer -', userid, 'is', username)
if (username !== null ) { if (username !== null ) {
//console.log('checkForToken')
// expire all their tokens they have // expire all their tokens they have
await removeAllTokens(username) await removeAllTokens(username)
//console.log('all tokens removed for', username);
} else { } else {
console.error('logic:::permissions::blacklistUserFromServer - null username for', userid) console.error('logic:::permissions::blacklistUserFromServer - null username for', userid)
} }
return true; return true;
//console.log('logic::permission:blacklistUserFromServer - wait')
}, },
} }

View File

@ -74,9 +74,10 @@ const getRolesByUserId = (user_id, cb) => {
module.exports = { module.exports = {
start: start, start: start,
addRolePermissions: (role) => { // is this even needed?
addRolePermissions: async (role) => {
const perm = new permissionModel(role); const perm = new permissionModel(role);
perm.save(); await perm.save();
}, },
getRolesByChannelId: (channel_id, cb) => { getRolesByChannelId: (channel_id, cb) => {
return permissionModel.find({ return permissionModel.find({
@ -85,8 +86,8 @@ module.exports = {
}, },
getRolesByUserId, getRolesByUserId,
getUsers, getUsers,
getRoles: async (cb) => { getRoles: (cb) => {
return await permissionModel.find({ return permissionModel.find({
where: { entity_type: 'role' } where: { entity_type: 'role' }
}, cb); }, cb);
}, },
@ -112,21 +113,46 @@ module.exports = {
permission.object = 'server'; permission.object = 'server';
permission.object_id = 0; permission.object_id = 0;
permission.moderator = 1; permission.moderator = 1;
permission.moderator.ord = 0; permission.ord = 0;
//console.log('starting mod save');
await permission.save(); await permission.save();
//console.log('starting mod saved');
return; return;
} }
}); });
}, },
removeServerModerator: async user_id => {
if (user_id === undefined) {
console.error('role_permissions:removeServerModerator given a user_id that is undefined');
return;
}
const criteria = {
entity_type: 'user', entityid: user_id,
object: 'server', object_id,
moderator: 1
};
permissionModel.find({ where: criteria }, async (err, permissions) => {
if (err) {
console.error('role_permissions:removeServerModerator err', err);
return;
}
if (!permissions || !permissions.length) {
console.warn('role_permissions:removeServerModerator no roles that match', criteria);
return;
}
await Promise.all(permissions.map(perm => {
return new Promise((resolve, rej) => {
perm.destroy(function() {
resolve();
});
});
}));
});
},
isGlobalModerator: async user_id => { isGlobalModerator: async user_id => {
if (user_id === undefined) { if (user_id === undefined) {
console.error('role_permissions:isGlobalModerator given a user_id that is undefined'); console.error('role_permissions:isGlobalModerator given a user_id that is undefined');
return; return;
} }
const userPerms = await getRolesByUserId(user_id); const userPerms = await getRolesByUserId(user_id);
//console.log('isBlacklisted userPerms', userPerms);
if (!userPerms || !userPerms.length) { if (!userPerms || !userPerms.length) {
// no entries at all // no entries at all
// FIXME: look up server default // FIXME: look up server default
@ -175,7 +201,6 @@ module.exports = {
console.error('role_permissions:blacklistUserFromServer given a user_id that is undefined'); console.error('role_permissions:blacklistUserFromServer given a user_id that is undefined');
return; return;
} }
console.log('blacklistUserFromServer user_id', user_id)
const permission = new permissionModel; const permission = new permissionModel;
permission.entity_type = 'user'; permission.entity_type = 'user';
permission.entity_id = user_id; permission.entity_id = user_id;
@ -193,7 +218,6 @@ module.exports = {
return; return;
} }
const userPerms = await getRolesByUserId(user_id); const userPerms = await getRolesByUserId(user_id);
//console.log('isBlacklisted userPerms', userPerms);
if (!userPerms || !userPerms.length) { if (!userPerms || !userPerms.length) {
// no entries at all // no entries at all
// FIXME: look up server default // FIXME: look up server default

View File

@ -8,9 +8,8 @@ const config = require('./config');
const app = express(); const app = express();
// Look for a config file // Look for a config file
const disk_config = config.getDiskConfig() const disk_config = config.getDiskConfig();
//console.log('disk_config', disk_config)
const overlay_port = parseInt(disk_config.api.port) || 8080; const overlay_port = parseInt(disk_config.api.port) || 8080;
const config_path = path.join('./server/config.json'); const config_path = path.join('./server/config.json');
@ -91,17 +90,14 @@ app.all('/*', (req, res, next) => {
const pageParams = {}; const pageParams = {};
pageParams.since_id = false; pageParams.since_id = false;
if (req.query.since_id) { if (req.query.since_id) {
//console.log("Overriding since_id to "+req.query.since_id);
pageParams.since_id = parseInt(req.query.since_id); pageParams.since_id = parseInt(req.query.since_id);
} }
pageParams.before_id=false; pageParams.before_id=false;
if (req.query.before_id) { if (req.query.before_id) {
//console.log("Overriding before_id to "+req.query.before_id);
pageParams.before_id = parseInt(req.query.before_id); pageParams.before_id = parseInt(req.query.before_id);
} }
pageParams.count=20; pageParams.count=20;
if (req.query.count) { if (req.query.count) {
//console.log("Overriding count to "+req.query.count);
pageParams.count = Math.min(Math.max(req.query.count, -200), 200); pageParams.count = Math.min(Math.max(req.query.count, -200), 200);
} }
// stream marker supported endpoints only // stream marker supported endpoints only

View File

@ -1,100 +1,89 @@
const funcs = [] const funcs = [];
funcs.push(require('./models/users.js')) funcs.push(require('./models/users.js'));
funcs.push(require('./models/challenges.js')) funcs.push(require('./models/challenges.js'));
funcs.push(require('./models/roles.js')) funcs.push(require('./models/roles.js'));
funcs.push(require('./models/user_roles.js')) funcs.push(require('./models/user_roles.js'));
funcs.push(require('./models/role_permissions.js')) funcs.push(require('./models/role_permissions.js'));
const Schema = require('caminte').Schema const Schema = require('caminte').Schema
memoryUpdate = function (model, filter, data, callback) { memoryUpdate = function (model, filter, data, callback) {
'use strict'; 'use strict';
if ('function' === typeof filter) { if ('function' === typeof filter) {
return filter(new Error('Get parametrs undefined'), null) return filter(new Error('Get parametrs undefined'), null);
} }
if ('function' === typeof data) { if ('function' === typeof data) {
return data(new Error('Set parametrs undefined'), null) return data(new Error('Set parametrs undefined'), null);
} }
filter = filter.where ? filter.where : filter filter = filter.where ? filter.where : filter;
var mem = this var mem = this;
//console.log('memoryUpdate - model', model, 'fitler', filter, 'data', data, 'callback', callback)
// filter input to make sure it only contains valid fields // filter input to make sure it only contains valid fields
var cleanData = this.toDatabase(model, data) var cleanData = this.toDatabase(model, data);
if (data.id) { if (data.id) {
// should find one and only one // should find one and only one
this.exists(model, data.id, function (err, exists) { this.exists(model, data.id, function (err, exists) {
if (exists) { if (exists) {
mem.save(model, Object.assign(exists, cleanData), callback) mem.save(model, Object.assign(exists, cleanData), callback);
} else { } else {
callback(err, cleanData) callback(err, cleanData);
} }
}) })
} else { } else {
//console.log('memoryUpdate - not implemented, search by?', filter, data)
this.all(model, filter, function(err, nodes) { this.all(model, filter, function(err, nodes) {
//console.log('memoryUpdate - records', nodes) var count = nodes.length;
var count = nodes.length
if (!count) { if (!count) {
return callback(false, cleanData) return callback(false, cleanData);
} }
nodes.forEach(function(node) { nodes.forEach(function(node) {
mem.cache[model][node.id] = Object.assign(node, cleanData) mem.cache[model][node.id] = Object.assign(node, cleanData);
if (--count === 0) { if (--count === 0) {
callback(false, cleanData) callback(false, cleanData);
} }
}) });
}) });
} }
} }
function start(config) { function start(config) {
/** schema data backend type */ // schema backend type
const schemaType = 'memory' const schemaType = 'memory';
const options = {} const options = {};
const schema = new Schema(schemaType, options) const schema = new Schema(schemaType, options);
if (schemaType === 'memory') { if (schemaType === 'memory') {
schema.adapter.update = memoryUpdate schema.adapter.update = memoryUpdate;
} }
if (schemaType==='mysql') { if (schemaType==='mysql') {
//console.log('MySQL is active')
//charset: "utf8_general_ci" / utf8mb4_general_ci //charset: "utf8_general_ci" / utf8mb4_general_ci
// run a query "set names utf8" // run a query "set names utf8"
schemaData.client.changeUser({ charset: 'utf8mb4' }, function(err) { schema.client.changeUser({ charset: 'utf8mb4' }, function(err) {
if (err) console.error('Couldnt set UTF8mb4', err) if (err) console.error('Couldnt set UTF8mb4', err);
//console.log('Set charset to utf8mb4 on Data') });
})
schemaToken.client.changeUser({ charset: 'utf8mb4' }, function(err) {
if (err) console.error('Couldnt set UTF8mb4', err)
//console.log('Set charset to utf8mb4 on Token')
})
// to enable emojis we may need to run these // to enable emojis we may need to run these
// alter table post MODIFY `text` text CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; // alter table X MODIFY `Y` type CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
} }
var modelOptions = { var modelOptions = {
schema: schema, schema: schema,
} };
funcs.forEach((func) => { funcs.forEach((func) => {
func.start(modelOptions) func.start(modelOptions);
}); });
if (schemaType=='mysql' || schemaType=='sqlite3') { if (schemaType=='mysql' || schemaType=='sqlite3') {
//schemaData.automigrate(function() {}) //schema.automigrate(function() {});
//schemaToken.automigrate(function() {})
// don't lose data // don't lose data
schemaData.autoupdate(function() {}) schema.autoupdate(function() {});
schemaToken.autoupdate(function() {})
} }
} }
let functions = {} let functions = {};
funcs.forEach((func) => { funcs.forEach((func) => {
functions = Object.assign(functions, func) functions = Object.assign(functions, func);
}); });
module.exports = functions module.exports = functions;
// override all those starts // override all those starts
module.exports.start = start module.exports.start = start;