diff options
author | Erik Johnston <erik@matrix.org> | 2014-10-27 10:20:44 +0000 |
---|---|---|
committer | Erik Johnston <erik@matrix.org> | 2014-10-27 10:20:44 +0000 |
commit | bb4a20174cb9128a1d9d5b7bd3d11d98b070edb6 (patch) | |
tree | f7ea571aedd4f1c8ae74a7c9ba3356a6c2107351 /webclient | |
parent | It doesn't want a dict (diff) | |
parent | Add log message if we can't enable ECC. Require pyopenssl>=0.14 since 0.13 do... (diff) | |
download | synapse-bb4a20174cb9128a1d9d5b7bd3d11d98b070edb6.tar.xz |
Merge branch 'develop' of github.com:matrix-org/synapse into federation_authorization
Conflicts: synapse/federation/transport.py synapse/handlers/message.py
Diffstat (limited to 'webclient')
-rw-r--r-- | webclient/app-filter.js | 57 | ||||
-rw-r--r-- | webclient/components/matrix/event-handler-service.js | 6 | ||||
-rw-r--r-- | webclient/recents/recents-filter.js | 4 | ||||
-rw-r--r-- | webclient/recents/recents.html | 10 | ||||
-rw-r--r-- | webclient/room/room-controller.js | 4 | ||||
-rw-r--r-- | webclient/room/room.html | 15 |
6 files changed, 73 insertions, 23 deletions
diff --git a/webclient/app-filter.js b/webclient/app-filter.js index fc16492ef3..39ea1d637d 100644 --- a/webclient/app-filter.js +++ b/webclient/app-filter.js @@ -1,12 +1,12 @@ /* Copyright 2014 OpenMarket Ltd - + Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - + http://www.apache.org/licenses/LICENSE-2.0 - + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -80,4 +80,53 @@ angular.module('matrixWebClient') return function(text) { return $sce.trustAsHtml(text); }; -}]); \ No newline at end of file +}]) +// Exactly the same as ngSanitize's linky but instead of pushing sanitized +// text in the addText function, we just push the raw text. +.filter('unsanitizedLinky', ['$sanitize', function($sanitize) { + var LINKY_URL_REGEXP = + /((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"]/, + MAILTO_REGEXP = /^mailto:/; + + return function(text, target) { + if (!text) return text; + var match; + var raw = text; + var html = []; + var url; + var i; + while ((match = raw.match(LINKY_URL_REGEXP))) { + // We can not end in these as they are sometimes found at the end of the sentence + url = match[0]; + // if we did not match ftp/http/mailto then assume mailto + if (match[2] == match[3]) url = 'mailto:' + url; + i = match.index; + addText(raw.substr(0, i)); + addLink(url, match[0].replace(MAILTO_REGEXP, '')); + raw = raw.substring(i + match[0].length); + } + addText(raw); + return $sanitize(html.join('')); + + function addText(text) { + if (!text) { + return; + } + html.push(text); + } + + function addLink(url, text) { + html.push('<a '); + if (angular.isDefined(target)) { + html.push('target="'); + html.push(target); + html.push('" '); + } + html.push('href="'); + html.push(url); + html.push('">'); + addText(text); + html.push('</a>'); + } + }; +}]); diff --git a/webclient/components/matrix/event-handler-service.js b/webclient/components/matrix/event-handler-service.js index e990d42d05..112b3ad96c 100644 --- a/webclient/components/matrix/event-handler-service.js +++ b/webclient/components/matrix/event-handler-service.js @@ -148,10 +148,10 @@ function(matrixService, $rootScope, $q, $timeout, mPresence) { // ts is later. var latestData = true; if (!isLiveEvent) { - var eventTs = event.ts; + var eventTs = event.origin_server_ts; var storedEvent = $rootScope.events.rooms[event.room_id][event.type]; if (storedEvent) { - if (storedEvent.ts > eventTs) { + if (storedEvent.origin_server_ts > eventTs) { // ignore it, we have a newer one already. latestData = false; } @@ -256,7 +256,7 @@ function(matrixService, $rootScope, $q, $timeout, mPresence) { // could be a membership change, display name change, etc. // Find out which one. var memberChanges = undefined; - if (event.content.prev !== event.content.membership) { + if (event.prev_content && (event.prev_content.membership !== event.content.membership)) { memberChanges = "membership"; } else if (event.prev_content && (event.prev_content.displayname !== event.content.displayname)) { diff --git a/webclient/recents/recents-filter.js b/webclient/recents/recents-filter.js index 468a746b18..ef8d9897f7 100644 --- a/webclient/recents/recents-filter.js +++ b/webclient/recents/recents-filter.js @@ -59,9 +59,9 @@ angular.module('RecentsController') return 1; } else { - return lastMsgRoomB.ts - lastMsgRoomA.ts; + return lastMsgRoomB.origin_server_ts - lastMsgRoomA.origin_server_ts; } }); return filtered; }; -}]); \ No newline at end of file +}]); diff --git a/webclient/recents/recents.html b/webclient/recents/recents.html index 9cbdcd357a..a52b215c7e 100644 --- a/webclient/recents/recents.html +++ b/webclient/recents/recents.html @@ -18,7 +18,7 @@ Declaring it in this way ensures the data-binding --> {{ lastMsg = eventHandlerService.getLastMessage(room.room_id, true);"" }} - {{ (lastMsg.ts) | date:'MMM d HH:mm' }} + {{ (lastMsg.origin_server_ts) | date:'MMM d HH:mm' }} <img ng-click="leave(room.room_id); $event.stopPropagation();" src="img/close.png" width="10" height="10" style="margin-bottom: -1px; margin-left: 2px;" alt="close"/> </td> @@ -42,12 +42,12 @@ <span ng-if="lastMsg.user_id === lastMsg.state_key"> {{lastMsg.state_key | mUserDisplayName: room.room_id }} left </span> - <span ng-if="lastMsg.user_id !== lastMsg.state_key"> + <span ng-if="lastMsg.user_id !== lastMsg.state_key && lastMsg.prev_content"> {{ lastMsg.user_id | mUserDisplayName: room.room_id }} - {{ {"join": "kicked", "ban": "unbanned"}[lastMsg.content.prev] }} + {{ {"invite": "kicked", "join": "kicked", "ban": "unbanned"}[lastMsg.prev_content.membership] }} {{ lastMsg.state_key | mUserDisplayName: room.room_id }} </span> - <span ng-if="'join' === lastMsg.content.prev && lastMsg.content.reason"> + <span ng-if="lastMsg.prev_content && 'join' === lastMsg.prev_content.membership && lastMsg.content.reason"> : {{ lastMsg.content.reason }} </span> </span> @@ -55,7 +55,7 @@ {{ lastMsg.user_id | mUserDisplayName: room.room_id }} {{ {"invite": "invited", "ban": "banned"}[lastMsg.content.membership] }} {{ lastMsg.state_key | mUserDisplayName: room.room_id }} - <span ng-if="'ban' === lastMsg.content.prev && lastMsg.content.reason"> + <span ng-if="lastMsg.prev_content && 'ban' === lastMsg.prev_content.membership && lastMsg.content.reason"> : {{ lastMsg.content.reason }} </span> </span> diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js index d8c62c231e..a1d2e87039 100644 --- a/webclient/room/room-controller.js +++ b/webclient/room/room-controller.js @@ -603,9 +603,9 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput']) var echoMessage = { content: { body: (cmd === "/me" ? args : input), - hsob_ts: new Date().getTime(), // fake a timestamp msgtype: (cmd === "/me" ? "m.emote" : "m.text"), }, + origin_server_ts: new Date().getTime(), // fake a timestamp room_id: $scope.room_id, type: "m.room.message", user_id: $scope.state.user_id, @@ -640,7 +640,7 @@ angular.module('RoomController', ['ngSanitize', 'matrixFilter', 'mFileInput']) if (echoMessage) { // Mark the message as unsent for the rest of the page life - echoMessage.content.hsob_ts = "Unsent"; + echoMessage.origin_server_ts = "Unsent"; echoMessage.echo_msg_state = "messageUnSent"; } }); diff --git a/webclient/room/room.html b/webclient/room/room.html index b99413cbbf..ce2c581903 100644 --- a/webclient/room/room.html +++ b/webclient/room/room.html @@ -68,7 +68,6 @@ ng-hide="state.permission_denied" ng-style="{ 'visibility': state.messages_visibility }" keep-scroll> - <!-- FIXME: need to have better timestamp semantics than the (msg.content.hsob_ts || msg.ts) hack below --> <table id="messageTable" infinite-scroll="paginateMore()"> <tr ng-repeat="msg in events.rooms[room_id].messages" ng-class="(events.rooms[room_id].messages[$index + 1].user_id !== msg.user_id ? 'differentUser' : '') + (msg.user_id === state.user_id ? ' mine' : '')" scroll-item> @@ -76,7 +75,7 @@ <div class="sender" ng-hide="events.rooms[room_id].messages[$index - 1].user_id === msg.user_id"> {{ msg.user_id | mUserDisplayName: room_id }}</div> <div class="timestamp" ng-class="msg.echo_msg_state"> - {{ (msg.content.hsob_ts || msg.ts) | date:'MMM d HH:mm' }} + {{ (msg.origin_server_ts) | date:'MMM d HH:mm' }} </div> </td> <td class="avatar"> @@ -92,11 +91,11 @@ <span ng-if="msg.user_id === msg.state_key"> {{ members[msg.state_key].displayname || msg.state_key }} left </span> - <span ng-if="msg.user_id !== msg.state_key"> + <span ng-if="msg.user_id !== msg.state_key && msg.prev_content"> {{ members[msg.user_id].displayname || msg.user_id }} - {{ {"join": "kicked", "ban": "unbanned"}[msg.content.prev] }} + {{ {"invite": "kicked", "join": "kicked", "ban": "unbanned"}[msg.prev_content.membership] }} {{ members[msg.state_key].displayname || msg.state_key }} - <span ng-if="'join' === msg.content.prev && msg.content.reason"> + <span ng-if="'join' === msg.prev_content.membership && msg.content.reason"> : {{ msg.content.reason }} </span> </span> @@ -106,7 +105,7 @@ {{ members[msg.user_id].displayname || msg.user_id }} {{ {"invite": "invited", "ban": "banned"}[msg.content.membership] }} {{ members[msg.state_key].displayname || msg.state_key }} - <span ng-if="'ban' === msg.content.prev && msg.content.reason"> + <span ng-if="msg.prev_content && 'ban' === msg.prev_content.membership && msg.content.reason"> : {{ msg.content.reason }} </span> </span> @@ -121,7 +120,9 @@ <span ng-show='msg.content.msgtype === "m.text"' class="message" ng-class="containsBingWord(msg.content.body) && msg.user_id != state.user_id ? msg.echo_msg_state + ' messageBing' : msg.echo_msg_state" - ng-bind-html="((msg.content.msgtype === 'm.text') ? msg.content.body : '') | linky:'_blank'"/> + ng-bind-html="(msg.content.msgtype === 'm.text' && msg.type === 'm.room.message' && msg.content.format === 'org.matrix.custom.html') ? + (msg.content.formatted_body | unsanitizedLinky) : + (msg.content.msgtype === 'm.text' && msg.type === 'm.room.message') ? (msg.content.body | linky:'_blank') : '' "/> <span ng-show='msg.type === "m.call.invite" && msg.user_id == state.user_id'>Outgoing Call{{ isWebRTCSupported ? '' : ' (But your browser does not support VoIP)' }}</span> <span ng-show='msg.type === "m.call.invite" && msg.user_id != state.user_id'>Incoming Call{{ isWebRTCSupported ? '' : ' (But your browser does not support VoIP)' }}</span> |