diff --git a/historyKeeper.js b/historyKeeper.js index 170de6233..a5a371936 100644 --- a/historyKeeper.js +++ b/historyKeeper.js @@ -999,8 +999,20 @@ module.exports.create = function (cfg) { } // unauthenticated RPC calls have a different message format - if (msg[0] === "WRITE_PRIVATE_MESSAGE" && output) { - historyKeeperBroadcast(ctx, output.channel, output.message); + if (msg[0] === "WRITE_PRIVATE_MESSAGE" && output && output.channel) { + // this is an inline reimplementation of historyKeeperBroadcast + // because if we use that directly it will bypass signature validation + // which opens up the user to malicious behaviour + let chan = ctx.channels[output.channel]; + if (chan && chan.length) { + chan.forEach(function (user) { + sendMsg(ctx, user, output.message); + //[0, null, 'MSG', user.id, JSON.stringify(output.message)]); + }); + } + // rpc and anonRpc expect their responses to be of a certain length + // and we've already used the output of the rpc call, so overwrite it + output = [null, null, null]; } // finally, send a response to the client that sent the RPC diff --git a/www/common/outer/mailbox.js b/www/common/outer/mailbox.js index 440158c80..898324691 100644 --- a/www/common/outer/mailbox.js +++ b/www/common/outer/mailbox.js @@ -85,6 +85,9 @@ proxy.mailboxes = { if (!keys) { return void cb({error: "missing asymmetric encryption keys"}); } if (!user || !user.channel || !user.curvePublic) { return void cb({error: "no notification channel"}); } + var anonRpc = Util.find(ctx, [ 'store', 'anon_rpc', ]); + if (!anonRpc) { return void cb({error: "anonymous rpc session not ready"}); } + var crypto = Crypto.Mailbox.createEncryptor(keys); var network = ctx.store.network; @@ -94,29 +97,16 @@ proxy.mailboxes = { }); var ciphertext = crypto.encrypt(text, user.curvePublic); - network.join(user.channel).then(function (wc) { - wc.bcast(ciphertext).then(function () { - cb(); - - // If we've just sent a message to one of our mailboxes, we have to trigger the handler manually - // (the server won't send back our message to us) - // If it isn't one of our mailboxes, we can close it now - var box; - if (Object.keys(ctx.boxes).some(function (t) { - var _box = ctx.boxes[t]; - if (_box.channel === user.channel) { - box = _box; - return true; - } - })) { - var hash = ciphertext.slice(0, 64); - box.onMessage(text, null, null, null, hash, user.curvePublic); - } else { - wc.leave(); - } - }); - }, function (err) { - cb({error: err}); + anonRpc.send("WRITE_PRIVATE_MESSAGE", [ + user.channel, + ciphertext + ], function (err, response) { + if (err) { + return void cb({ + error: err, + }); + } + return void cb(); }); }; diff --git a/www/common/translations/messages.de.json b/www/common/translations/messages.de.json index c00d44a32..20f50c4cf 100644 --- a/www/common/translations/messages.de.json +++ b/www/common/translations/messages.de.json @@ -1143,5 +1143,11 @@ "register_emailWarning0": "Anscheinend hast du deine E-Mail-Adresse als Benutzername angegeben.", "register_emailWarning1": "Wenn du möchtest, kannst du dies tun. Allerdings wird sie nicht an unseren Server gesendet.", "register_emailWarning2": "Du kannst dein Passwort nicht wie bei vielen anderen Diensten mit der E-Mail-Adresse zurücksetzen.", - "register_emailWarning3": "Wenn du dies verstanden hast und die E-Mail-Adresse dennoch als Benutzername verwenden möchtest, klicke auf OK." + "register_emailWarning3": "Wenn du dies verstanden hast und die E-Mail-Adresse dennoch als Benutzername verwenden möchtest, klicke auf OK.", + "owner_unknownUser": "Unbekannter Benutzer", + "owner_removeButton": "Ausgewählte Eigentümer entfernen", + "owner_removeConfirm": "Bist du sicher, dass die Eigentümerschaft der ausgewählten Benutzer entfernen möchtest? Sie werden über diese Aktion informiert.", + "owner_removeMeConfirm": "Du bist dabei, deine Rechte als Eigentümer aufzugeben. Diese Aktion kannst du nicht rückgängig machen. Bist du sicher?", + "owner_openModalButton": "Eigentümer verwalten", + "owner_add": "{0} möchte ein Eigentümer des Pads {1} sein. Bist du damit einverstanden?" } diff --git a/www/common/translations/messages.fr.json b/www/common/translations/messages.fr.json index 99efb1346..c55977f6f 100644 --- a/www/common/translations/messages.fr.json +++ b/www/common/translations/messages.fr.json @@ -1141,8 +1141,8 @@ "features_emailRequired": "Adresse email requise", "register_emailWarning0": "Il semble que vous ayez entré votre adresse email à la place du nom d'utilisateur.", "register_emailWarning1": "Vous pouvez continuer, mais ces données ne sont pas nécessaires et ne seront pas envoyées à notre serveur.", - "register_emailWarning2": "Vous ne pourrez pas réinitialiser votre mot de passe en utilisant votre adresse email comme sur beaucoup d'autres services", - "register_emailWarning3": "Si vous souhaitez tout de même utiliser votre adresse email comme nom d'utilisateur, appuyez sur OK", + "register_emailWarning2": "Vous ne pourrez pas réinitialiser votre mot de passe en utilisant votre adresse email comme sur beaucoup d'autres services.", + "register_emailWarning3": "Si vous souhaitez tout de même utiliser votre adresse email comme nom d'utilisateur, appuyez sur OK.", "owner_removeText": "Supprimer un propriétaire existant", "owner_removePendingText": "Annuler une offre en attente", "owner_addText": "Proposer à un ami d'être co-propriétaire de ce document",