mirror of
https://github.com/oxen-io/session-open-group-server-legacy.git
synced 2023-12-13 21:10:18 +01:00
remove comments meant for logging, implement moderator removal, cleanup
This commit is contained in:
parent
67be61dc7d
commit
091e4798e4
11 changed files with 101 additions and 140 deletions
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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: {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
}
|
};
|
||||||
|
|
20
logic.js
20
logic.js
|
@ -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;
|
||||||
|
|
|
@ -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')
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
83
storage.js
83
storage.js
|
@ -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;
|
||||||
|
|
Loading…
Reference in a new issue