|
|
|
@ -5,6 +5,7 @@ const Util = require("../common-util");
|
|
|
|
|
const nThen = require("nthen");
|
|
|
|
|
const Core = require("./core");
|
|
|
|
|
const Metadata = require("./metadata");
|
|
|
|
|
const HK = require("../hk-util");
|
|
|
|
|
|
|
|
|
|
Channel.clearOwnedChannel = function (Env, safeKey, channelId, cb, Server) {
|
|
|
|
|
if (typeof(channelId) !== 'string' || channelId.length !== 32) {
|
|
|
|
@ -228,7 +229,9 @@ Channel.isNewChannel = function (Env, channel, cb) {
|
|
|
|
|
|
|
|
|
|
Otherwise behaves the same as sending to a channel
|
|
|
|
|
*/
|
|
|
|
|
Channel.writePrivateMessage = function (Env, args, cb, Server) {
|
|
|
|
|
Channel.writePrivateMessage = function (Env, args, _cb, Server, netfluxId) {
|
|
|
|
|
var cb = Util.once(Util.mkAsync(_cb));
|
|
|
|
|
|
|
|
|
|
var channelId = args[0];
|
|
|
|
|
var msg = args[1];
|
|
|
|
|
|
|
|
|
@ -246,31 +249,52 @@ Channel.writePrivateMessage = function (Env, args, cb, Server) {
|
|
|
|
|
return void cb("NOT_IMPLEMENTED");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// historyKeeper expects something with an 'id' attribute
|
|
|
|
|
// it will fail unless you provide it, but it doesn't need anything else
|
|
|
|
|
var channelStruct = {
|
|
|
|
|
id: channelId,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// construct a message to store and broadcast
|
|
|
|
|
var fullMessage = [
|
|
|
|
|
0, // idk
|
|
|
|
|
null, // normally the netflux id, null isn't rejected, and it distinguishes messages written in this way
|
|
|
|
|
"MSG", // indicate that this is a MSG
|
|
|
|
|
channelId, // channel id
|
|
|
|
|
msg // the actual message content. Generally a string
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
// XXX RESTRICT respect allow lists
|
|
|
|
|
|
|
|
|
|
// historyKeeper already knows how to handle metadata and message validation, so we just pass it off here
|
|
|
|
|
// if the message isn't valid it won't be stored.
|
|
|
|
|
Env.historyKeeper.channelMessage(Server, channelStruct, fullMessage);
|
|
|
|
|
|
|
|
|
|
Server.getChannelUserList(channelId).forEach(function (userId) {
|
|
|
|
|
Server.send(userId, fullMessage);
|
|
|
|
|
});
|
|
|
|
|
nThen(function (w) {
|
|
|
|
|
Metadata.getMetadataRaw(Env, channelId, w(function (err, metadata) {
|
|
|
|
|
if (err) {
|
|
|
|
|
w.abort();
|
|
|
|
|
Env.Log.error('HK_WRITE_PRIVATE_MESSAGE', err);
|
|
|
|
|
return void cb('METADATA_ERR');
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!metadata || !metadata.restricted) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var session = HK.getNetfluxSession(Env, netfluxId);
|
|
|
|
|
var allowed = HK.listAllowedUsers(metadata);
|
|
|
|
|
|
|
|
|
|
if (HK.isUserSessionAllowed(allowed, session)) { return; }
|
|
|
|
|
|
|
|
|
|
cb();
|
|
|
|
|
w.abort();
|
|
|
|
|
cb('INSUFFICIENT_PERMISSIONS');
|
|
|
|
|
}));
|
|
|
|
|
}).nThen(function () {
|
|
|
|
|
// historyKeeper expects something with an 'id' attribute
|
|
|
|
|
// it will fail unless you provide it, but it doesn't need anything else
|
|
|
|
|
var channelStruct = {
|
|
|
|
|
id: channelId,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// construct a message to store and broadcast
|
|
|
|
|
var fullMessage = [
|
|
|
|
|
0, // idk
|
|
|
|
|
null, // normally the netflux id, null isn't rejected, and it distinguishes messages written in this way
|
|
|
|
|
"MSG", // indicate that this is a MSG
|
|
|
|
|
channelId, // channel id
|
|
|
|
|
msg // the actual message content. Generally a string
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// historyKeeper already knows how to handle metadata and message validation, so we just pass it off here
|
|
|
|
|
// if the message isn't valid it won't be stored.
|
|
|
|
|
Env.historyKeeper.channelMessage(Server, channelStruct, fullMessage);
|
|
|
|
|
|
|
|
|
|
Server.getChannelUserList(channelId).forEach(function (userId) {
|
|
|
|
|
Server.send(userId, fullMessage);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
cb();
|
|
|
|
|
});
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|