From 71fb748d7075644e609c9fe77e34897d086ce86f Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Sat, 6 Sep 2014 17:27:42 +0100 Subject: [PATCH 1/9] Bump version and changelog --- CHANGES.rst | 21 +++++++++++++++++++++ VERSION | 2 +- synapse/__init__.py | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 31eee891d..8824ece5a 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -1,3 +1,24 @@ +Changes in synapse 0.2.2 (2014-09-06) +===================================== + +Homeserver: + * When the server returns state events it now also includes the previous + content. + * Add support for inviting people when creating a new room. + * Make the homeserver inform the room via `m.room.aliases` when a new alias + is added for a room. + * Validate `m.room.power_level` events. + +Webclient: + * Add support for captchas on registration. + * Handle `m.room.aliases` events. + * Asynchronously send messages and show a local echo. + * Inform the UI when a message failed to send. + * Only autoscroll on receiving a new message if the user was already at the + bottom of the screen. + * Add support for ban/kick reasons. + * Fix bug where we occaisonally saw duplicated join messages. + Changes in synapse 0.2.1 (2014-09-03) ===================================== diff --git a/VERSION b/VERSION index 0c62199f1..ee1372d33 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.2.1 +0.2.2 diff --git a/synapse/__init__.py b/synapse/__init__.py index 440e63396..1ed9cdcdf 100644 --- a/synapse/__init__.py +++ b/synapse/__init__.py @@ -16,4 +16,4 @@ """ This is a reference implementation of a synapse home server. """ -__version__ = "0.2.1" +__version__ = "0.2.2" From de55ba218f6f7a67684e09f34153476e2274e341 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Sat, 6 Sep 2014 17:38:11 +0100 Subject: [PATCH 2/9] Fix race in presence handler where we evicted things from cache while handling a key therein --- synapse/handlers/presence.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/synapse/handlers/presence.py b/synapse/handlers/presence.py index c79bb6ff7..b2af09f09 100644 --- a/synapse/handlers/presence.py +++ b/synapse/handlers/presence.py @@ -796,11 +796,12 @@ class PresenceEventSource(object): updates = [] # TODO(paul): use a DeferredList ? How to limit concurrency. for observed_user in cachemap.keys(): - if not (from_key < cachemap[observed_user].serial): + cached = cachemap[observed_user] + if not (from_key < cached.serial): continue if (yield self.is_visible(observer_user, observed_user)): - updates.append((observed_user, cachemap[observed_user])) + updates.append((observed_user, cached)) # TODO(paul): limit From 929cb12e7e2ce4c7c952a81774967557e08ea92e Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Sat, 6 Sep 2014 09:47:30 -0700 Subject: [PATCH 3/9] https when loading recaptcha js --- webclient/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webclient/index.html b/webclient/index.html index baaaa8cef..81c7c7d06 100644 --- a/webclient/index.html +++ b/webclient/index.html @@ -11,7 +11,7 @@ - + From 92800afd95c665500b0aae38e47e0160c41cb3a2 Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Sat, 6 Sep 2014 09:53:39 -0700 Subject: [PATCH 4/9] Use the room_display_name when presenting on the home page, and not the room_alias which may not be set. --- webclient/home/home.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webclient/home/home.html b/webclient/home/home.html index c1f964383..7240e79f8 100644 --- a/webclient/home/home.html +++ b/webclient/home/home.html @@ -26,7 +26,7 @@
From 9be1b2cb238dbeaaa64814100260a57e44e2d30e Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Sat, 6 Sep 2014 09:57:13 -0700 Subject: [PATCH 5/9] Set the room_alias field when we encounter a new one, rather than only from local storage. --- webclient/components/matrix/matrix-service.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/webclient/components/matrix/matrix-service.js b/webclient/components/matrix/matrix-service.js index a1b9691f0..3c28c52fb 100644 --- a/webclient/components/matrix/matrix-service.js +++ b/webclient/components/matrix/matrix-service.js @@ -525,7 +525,6 @@ angular.module('matrixService', []) room_alias: undefined, room_display_name: undefined }; - var alias = this.getRoomIdToAliasMapping(room.room_id); if (alias) { // use the existing alias from storage @@ -539,6 +538,7 @@ angular.module('matrixService', []) // TODO: select the smarter alias from the array this.createRoomIdToAliasMapping(room.room_id, room.aliases[0]); result.room_display_name = room.aliases[0]; + result.room_alias = room.aliases[0]; } else if (room.membership === "invite" && "inviter" in room) { result.room_display_name = room.inviter + "'s room"; @@ -551,7 +551,6 @@ angular.module('matrixService', []) }, createRoomIdToAliasMapping: function(roomId, alias) { - //console.log("creating mapping between " + roomId + " and " + alias); roomIdToAlias[roomId] = alias; aliasToRoomId[alias] = roomId; // localStorage.setItem(MAPPING_PREFIX+roomId, alias); From 44bd5e04dd6639d399fdd81372c5d894cc387e48 Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 6 Sep 2014 10:13:38 -0700 Subject: [PATCH 6/9] disable broken event dup suppression, and fix echo for /me --- .../matrix/event-handler-service.js | 11 +++++-- webclient/room/room-controller.js | 30 ++++++++++--------- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/webclient/components/matrix/event-handler-service.js b/webclient/components/matrix/event-handler-service.js index cd4f2ccf2..d2bb31053 100644 --- a/webclient/components/matrix/event-handler-service.js +++ b/webclient/components/matrix/event-handler-service.js @@ -79,7 +79,8 @@ angular.module('eventHandlerService', []) initRoom(event.room_id); if (isLiveEvent) { - if (event.user_id === matrixService.config().user_id) { + if (event.user_id === matrixService.config().user_id && + (event.content.msgtype === "m.text" || event.content.msgtype === "m.emote") ) { // assume we've already echoed it // FIXME: track events by ID and ungrey the right message to show it's been delivered } @@ -162,11 +163,17 @@ angular.module('eventHandlerService', []) NAME_EVENT: NAME_EVENT, handleEvent: function(event, isLiveEvent) { + // FIXME: event duplication suppression is all broken as the code currently expect to handles + // events multiple times to get their side-effects... +/* if (eventMap[event.event_id]) { console.log("discarding duplicate event: " + JSON.stringify(event)); return; } - + else { + eventMap[event.event_id] = 1; + } +*/ if (event.type.indexOf('m.call.') === 0) { handleCallEvent(event, isLiveEvent); } diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js index c738b490e..e69adb9b4 100644 --- a/webclient/room/room-controller.js +++ b/webclient/room/room-controller.js @@ -302,7 +302,9 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput']) scrollToBottom(true); var promise; - var isCmd = false; + var cmd; + var args; + var echo = false; // Check for IRC style commands first var line = $scope.textInput; @@ -311,17 +313,16 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput']) line = line.replace(/\s+$/, ""); if (line[0] === "/" && line[1] !== "/") { - isCmd = true; - var bits = line.match(/^(\S+?)( +(.*))?$/); - var cmd = bits[1]; - var args = bits[3]; + cmd = bits[1]; + args = bits[3]; console.log("cmd: " + cmd + ", args: " + args); switch (cmd) { case "/me": promise = matrixService.sendEmoteMessage($scope.room_id, args); + echo = true; break; case "/nick": @@ -453,17 +454,20 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput']) } // By default send this as a message unless it's an IRC-style command - if (!promise && !isCmd) { - var message = $scope.textInput; - $scope.textInput = ""; - + if (!promise && !cmd) { + // Make the request + promise = matrixService.sendTextMessage($scope.room_id, line); + echo = true; + } + + if (echo) { // Echo the message to the room // To do so, create a minimalist fake text message event and add it to the in-memory list of room messages var echoMessage = { content: { - body: message, + body: (cmd === "/me" ? args : line), hsob_ts: new Date().getTime(), // fake a timestamp - msgtype: "m.text" + msgtype: (cmd === "/me" ? "m.emote" : "m.text"), }, room_id: $scope.room_id, type: "m.room.message", @@ -472,11 +476,9 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput']) // echo_msg_state: "messagePending" // Add custom field to indicate the state of this fake message to HTML }; + $scope.textInput = ""; $rootScope.events.rooms[$scope.room_id].messages.push(echoMessage); scrollToBottom(); - - // Make the request - promise = matrixService.sendTextMessage($scope.room_id, message); } if (promise) { From a9afb7cba306c9499ba656b72c73fb44ca8c5145 Mon Sep 17 00:00:00 2001 From: Erik Johnston Date: Sat, 6 Sep 2014 18:14:56 +0100 Subject: [PATCH 7/9] Remove disabled change from CHANGES --- CHANGES.rst | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGES.rst b/CHANGES.rst index 8824ece5a..b9b3e9d0e 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -17,7 +17,6 @@ Webclient: * Only autoscroll on receiving a new message if the user was already at the bottom of the screen. * Add support for ban/kick reasons. - * Fix bug where we occaisonally saw duplicated join messages. Changes in synapse 0.2.1 (2014-09-03) ===================================== From 9e0c3e78384d57a202d4b8e757a463acfdacb6f0 Mon Sep 17 00:00:00 2001 From: Kegan Dougal Date: Sat, 6 Sep 2014 10:14:57 -0700 Subject: [PATCH 8/9] Center recaptcha dialog. --- webclient/app.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/webclient/app.css b/webclient/app.css index e0ca2f77a..7698cb4fd 100755 --- a/webclient/app.css +++ b/webclient/app.css @@ -147,6 +147,10 @@ a:active { color: #000; } text-align: center; } +#recaptcha_area { + margin: auto +} + #loginForm { text-align: left; padding: 1em; From 41907209bbc7a98c461f5c30dab75bc58164a77e Mon Sep 17 00:00:00 2001 From: Matthew Hodgson Date: Sat, 6 Sep 2014 10:26:30 -0700 Subject: [PATCH 9/9] fix desktop notifs, which were broken in eab463fd --- webclient/components/matrix/presence-service.js | 2 +- webclient/room/room-controller.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/webclient/components/matrix/presence-service.js b/webclient/components/matrix/presence-service.js index 952c8ec8a..b487e3d3b 100644 --- a/webclient/components/matrix/presence-service.js +++ b/webclient/components/matrix/presence-service.js @@ -24,7 +24,7 @@ angular.module('mPresence', []) .service('mPresence', ['$timeout', 'matrixService', function ($timeout, matrixService) { // Time in ms after that a user is considered as unavailable/away - var UNAVAILABLE_TIME = 5 * 60000; // 5 mins + var UNAVAILABLE_TIME = 3 * 60000; // 3 mins // The current presence state var state = undefined; diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js index e69adb9b4..c702917fe 100644 --- a/webclient/room/room-controller.js +++ b/webclient/room/room-controller.js @@ -62,8 +62,8 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput']) scrollToBottom(); if (window.Notification) { - // Show notification when the user is idle - if (matrixService.presence.offline === mPresence.getState()) { + // Show notification when the window is hidden, or the user is idle + if (document.hidden || matrixService.presence.unavailable === mPresence.getState()) { var notification = new window.Notification( ($scope.members[event.user_id].displayname || event.user_id) + " (" + ($scope.room_alias || $scope.room_id) + ")", // FIXME: don't leak room_ids here