|
|
|
@ -71,7 +71,7 @@ Data.setMetadata = function (Env, safeKey, data, cb, Server) {
|
|
|
|
|
if (Meta.commands.indexOf(command) === -1) { return void cb('UNSUPPORTED_COMMAND'); }
|
|
|
|
|
|
|
|
|
|
queueMetadata(channel, function (next) {
|
|
|
|
|
Data.getMetadata(Env, channel, function (err, metadata) {
|
|
|
|
|
Data.getMetadataRaw(Env, channel, function (err, metadata) {
|
|
|
|
|
if (err) {
|
|
|
|
|
cb(err);
|
|
|
|
|
return void next();
|
|
|
|
@ -133,34 +133,70 @@ Data.setMetadata = function (Env, safeKey, data, cb, Server) {
|
|
|
|
|
return void next();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// chainpad-server@4.0.3 supports a removeFromChannel method
|
|
|
|
|
// Server.removeFromChannel(channelName, userId);
|
|
|
|
|
// this lets us kick users from restricted channels
|
|
|
|
|
|
|
|
|
|
// XXX RESTRICT
|
|
|
|
|
// if the metadata changes and includes an allowed list
|
|
|
|
|
// kick any current users from the channel
|
|
|
|
|
// if they aren't on it.
|
|
|
|
|
|
|
|
|
|
// review Server.channelBroadcast as used for EEXPIRED
|
|
|
|
|
// send them to the user in question, from historyKeeper
|
|
|
|
|
|
|
|
|
|
// send the message back to the person who changed it
|
|
|
|
|
// since we know they're allowed to see it
|
|
|
|
|
cb(void 0, metadata);
|
|
|
|
|
next();
|
|
|
|
|
|
|
|
|
|
const metadata_cache = Env.metadata_cache;
|
|
|
|
|
const channel_cache = Env.channel_cache;
|
|
|
|
|
|
|
|
|
|
// update the cached metadata
|
|
|
|
|
metadata_cache[channel] = metadata;
|
|
|
|
|
|
|
|
|
|
// as well as the metadata that's attached to the index...
|
|
|
|
|
// XXX determine if we actually need this...
|
|
|
|
|
var index = Util.find(channel_cache, [channel, 'index']);
|
|
|
|
|
if (index && typeof(index) === 'object') { index.metadata = metadata; }
|
|
|
|
|
|
|
|
|
|
Server.channelBroadcast(channel, JSON.stringify(metadata), Env.historyKeeper.id);
|
|
|
|
|
// it's easy to check if the channel is restricted
|
|
|
|
|
const isRestricted = metadata.restricted;
|
|
|
|
|
// and these values will be used in any case
|
|
|
|
|
const s_metadata = JSON.stringify(metadata);
|
|
|
|
|
const hk_id = Env.historyKeeper.id;
|
|
|
|
|
|
|
|
|
|
if (!isRestricted) {
|
|
|
|
|
// pre-allow-list behaviour
|
|
|
|
|
// if it's not restricted, broadcast the new metadata to everyone
|
|
|
|
|
return void Server.channelBroadcast(channel, s_metadata, hk_id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// otherwise derive the list of users (unsafeKeys) that are allowed to stay
|
|
|
|
|
const allowed = HK.listAllowedUsers(metadata);
|
|
|
|
|
// anyone who is not allowed will get the same error message
|
|
|
|
|
const s_error = JSON.stringify({
|
|
|
|
|
error: 'ERESTRICTED',
|
|
|
|
|
channel: channel,
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// iterate over the channel's userlist
|
|
|
|
|
const toRemove = [];
|
|
|
|
|
Server.getChannelUserList(channel).forEach(function (userId) {
|
|
|
|
|
const session = HK.getNetfluxSession(Env, userId);
|
|
|
|
|
|
|
|
|
|
// if the user is allowed to remain, send them the metadata
|
|
|
|
|
if (HK.isUserSessionAllowed(allowed, session)) {
|
|
|
|
|
return void Server.send(userId, [
|
|
|
|
|
0,
|
|
|
|
|
hk_id,
|
|
|
|
|
'MSG',
|
|
|
|
|
userId,
|
|
|
|
|
s_metadata
|
|
|
|
|
], function () {});
|
|
|
|
|
}
|
|
|
|
|
// otherwise they are not in the list.
|
|
|
|
|
// send them an error and kick them out!
|
|
|
|
|
Server.send(userId, [
|
|
|
|
|
0,
|
|
|
|
|
hk_id,
|
|
|
|
|
'MSG',
|
|
|
|
|
userId,
|
|
|
|
|
s_error
|
|
|
|
|
], function () {});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Server.removeFromChannel(channel, toRemove);
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|