From 43772d0b15f749e2e4356097560cca3c86e1e4e6 Mon Sep 17 00:00:00 2001 From: Emmanuel ROHEE Date: Mon, 18 Aug 2014 17:40:05 +0200 Subject: [PATCH] Support urlencoded room aliases in room URL --- webclient/app.js | 4 +-- webclient/room/room-controller.js | 42 ++++++++++++++++++++----------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/webclient/app.js b/webclient/app.js index 193c11d46..a3d1505f8 100644 --- a/webclient/app.js +++ b/webclient/app.js @@ -33,13 +33,13 @@ matrixWebClient.config(['$routeProvider', '$provide', '$httpProvider', templateUrl: 'login/login.html', controller: 'LoginController' }). - when('/room/:room_id', { + when('/room/:room_id_or_alias', { templateUrl: 'room/room.html', controller: 'RoomController' }). when('/room/', { // room URL with room alias in it (ex: http://127.0.0.1:8000/#/room/#public:localhost:8080) will come here. // The reason is that 2nd hash key breaks routeProvider parameters cutting so that the URL will not match with - // the previous '/room/:room_id' URL rule + // the previous '/room/:room_id_or_alias' URL rule templateUrl: 'room/room.html', controller: 'RoomController' }). diff --git a/webclient/room/room-controller.js b/webclient/room/room-controller.js index 999c48f02..d130a28fd 100644 --- a/webclient/room/room-controller.js +++ b/webclient/room/room-controller.js @@ -109,8 +109,8 @@ angular.module('RoomController', ['ngSanitize']) 'use strict'; var MESSAGES_PER_PAGINATION = 30; - // Room ids. Checked, computed and resolved in onInit - $scope.room_id = $routeParams.room_id; + // Room ids. Computed and resolved in onInit + $scope.room_id = undefined; $scope.room_alias = undefined; $scope.state = { @@ -347,27 +347,39 @@ angular.module('RoomController', ['ngSanitize']) console.log("onInit"); // Does the room ID provided in the URL? - if ($scope.room_id) { - // Yes, we can start right now + var room_id_or_alias; + if ($routeParams.room_id_or_alias) { + room_id_or_alias = decodeURIComponent($routeParams.room_id_or_alias); + } + + if (room_id_or_alias && '!' === room_id_or_alias[0]) { + // Yes. We can start right now + $scope.room_id = room_id_or_alias; $scope.room_alias = matrixService.getRoomIdToAliasMapping($scope.room_id); onInit2(); } else { - // No, the URL contains the room alias. Get this alias. - // ie: extract #public:localhost:8080 from http://127.0.0.1:8000/#/room/#public:localhost:8080 - if (3 === location.hash.split("#").length) { - $scope.room_alias = "#" + location.hash.split("#")[2]; + // No. The URL contains the room alias. Get this alias. + if (room_id_or_alias) { + // The room alias was passed urlencoded, use it as is + $scope.room_alias = room_id_or_alias; } - else { - // In case of issue, go to the default page - console.log("Error: cannot extract room alias"); - $location.path("/"); - return; + else { + // Else get the room alias by hand from the URL + // ie: extract #public:localhost:8080 from http://127.0.0.1:8000/#/room/#public:localhost:8080 + if (3 === location.hash.split("#").length) { + $scope.room_alias = "#" + location.hash.split("#")[2]; + } + else { + // In case of issue, go to the default page + console.log("Error: cannot extract room alias"); + $location.path("/"); + return; + } } - console.log("Resolving alias: " + $scope.room_alias); - // Need a room ID required in Matrix API requests + console.log("Resolving alias: " + $scope.room_alias); matrixService.resolveRoomAlias($scope.room_alias).then(function(response) { $scope.room_id = response.data.room_id; console.log(" -> Room ID: " + $scope.room_id);