From 7c5ab63fd82eee3c597cd54bae76557af497b0d5 Mon Sep 17 00:00:00 2001
From: Richard van der Hoff <richard@matrix.org>
Date: Thu, 26 May 2016 17:14:33 +0100
Subject: js group demo: use a remoteOps object

To make sure that we don't sneakily use methods which we wouldn't be able to
for remote users, expose an interface object which contains the remote
interface.
---
 javascript/demo/group_demo.js | 51 +++++++++++++++++++++++++++++--------------
 1 file changed, 35 insertions(+), 16 deletions(-)

(limited to 'javascript/demo')

diff --git a/javascript/demo/group_demo.js b/javascript/demo/group_demo.js
index c8939d3..bd54ea0 100644
--- a/javascript/demo/group_demo.js
+++ b/javascript/demo/group_demo.js
@@ -24,8 +24,9 @@ function DemoUser(name) {
     this.olmAccount = new Olm.Account();
     this.olmAccount.create();
 
-    /* a list of the people in our chat */
-    this.peers = [];
+    /* the people in our chat, indexed by their Curve25519 identity key.
+     */
+    this.peers = {};
 
     /* for each peer, a one-to-one session - indexed by id key and created on
      * demand */
@@ -41,6 +42,18 @@ function DemoUser(name) {
     /* a list of pending tasks */
     this.tasks = [];
     this.taskWorker = undefined;
+
+    /* the operations our peers are allowed to do on us */
+    var publicOps = [
+        "getIdKey", "getOneTimeKey",
+        "receiveOneToOne", "receiveGroup",
+    ];
+
+    this.remoteOps = {};
+    for (var i=0; i<publicOps.length; i++) {
+        var op = publicOps[i];
+        this.remoteOps[op] = this[op].bind(this);
+    }
 }
 
 DemoUser.prototype._progress = function(message) {
@@ -121,8 +134,9 @@ DemoUser.prototype.addTask = function(description, task, callback) {
     }
 };
 
-DemoUser.prototype.addPeer = function(peer) {
-    this.peers.push(peer);
+DemoUser.prototype.addPeer = function(peerOps) {
+    var id = peerOps.getIdKey();
+    this.peers[id] = peerOps;
 };
 
 DemoUser.prototype.getIdKey = function() {
@@ -158,14 +172,15 @@ DemoUser.prototype.getOneTimeKey = function() {
 /**
  * retrieve, or initiate, a one-to-one session to a given peer
  */
-DemoUser.prototype.getPeerSession = function(peer, callback) {
+DemoUser.prototype.getPeerSession = function(peerId, callback) {
     var self = this;
-    var peerId = peer.getIdKey();
+
     if (this.peerSessions[peerId]) {
         callback(this.peerSessions[peerId]);
         return;
     }
 
+    var peer = this.peers[peerId];
     this.addTask("get peer keys", function(done) {
         key = peer.getOneTimeKey();
         done(key);
@@ -182,9 +197,9 @@ DemoUser.prototype.getPeerSession = function(peer, callback) {
 /**
  * encrypt a one-to-one message and prepare it for sending to a peer
  */
-DemoUser.prototype.sendToPeer = function(peer, message, callback) {
+DemoUser.prototype.sendToPeer = function(peerId, message, callback) {
     var self = this;
-    this.getPeerSession(peer, function(session) {
+    this.getPeerSession(peerId, function(session) {
         self.addTask("encrypt one-to-one message", function(done) {
             var encrypted = session.encrypt(message);
             var packet = {
@@ -194,7 +209,7 @@ DemoUser.prototype.sendToPeer = function(peer, message, callback) {
             var json = JSON.stringify(packet);
 
             var el = buttonAndTextElement("send", json, function(ev) {
-                peer.receiveOneToOne(json);
+                self.peers[peerId].receiveOneToOne(json);
             });
             self.cipherOutputDiv.appendChild(el);
             done();
@@ -285,8 +300,10 @@ DemoUser.prototype.getGroupSession = function() {
     };
     var jsonmsg = JSON.stringify(keymsg);
 
-    for (var i = 0; i < this.peers.length; i++) {
-        var peer = this.peers[i];
+    for (var peer in this.peers) {
+        if (!this.peers.hasOwnProperty(peer)) {
+            continue;
+        }
         this.sendToPeer(peer, jsonmsg);
     }
 
@@ -376,9 +393,11 @@ DemoUser.prototype.encrypt = function(message) {
         var json = JSON.stringify(packet);
 
         var el = buttonAndTextElement("send", json, function(ev) {
-            for (var i = 0; i < self.peers.length; i++) {
-                var peer = self.peers[i];
-                peer.receiveGroup(json);
+            for (var peer in self.peers) {
+                if (!self.peers.hasOwnProperty(peer)) {
+                    continue;
+                }
+                self.peers[peer].receiveGroup(json);
             }
         });
         self.groupOutputDiv.appendChild(el);
@@ -413,8 +432,8 @@ function startDemo() {
     initUserDiv(user2, document.getElementById("user2"));
     user2.generateKeys();
 
-    user1.addPeer(user2);
-    user2.addPeer(user1);
+    user1.addPeer(user2.remoteOps);
+    user2.addPeer(user1.remoteOps);
 }
 
 
-- 
cgit v1.2.3-70-g09d2