mirror of
https://github.com/vector-im/element-ios.git
synced 2024-09-28 23:32:41 +00:00
Merge pull request #5937 from vector-im/andy/4858_resolve_alias
Enable joining a room via identifier from another home server
This commit is contained in:
commit
4e67b0b406
5 changed files with 111 additions and 26 deletions
|
@ -1487,7 +1487,7 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
|
||||||
// Ask the HS to resolve the room alias into a room id and then retry
|
// Ask the HS to resolve the room alias into a room id and then retry
|
||||||
self->universalLinkFragmentPending = fragment;
|
self->universalLinkFragmentPending = fragment;
|
||||||
MXKAccount* account = accountManager.activeAccounts.firstObject;
|
MXKAccount* account = accountManager.activeAccounts.firstObject;
|
||||||
[account.mxSession.matrixRestClient roomIDForRoomAlias:roomIdOrAlias success:^(NSString *roomId) {
|
[account.mxSession.matrixRestClient resolveRoomAlias:roomIdOrAlias success:^(MXRoomAliasResolution *resolution) {
|
||||||
|
|
||||||
// Note: the activity indicator will not disappear if the session is not ready
|
// Note: the activity indicator will not disappear if the session is not ready
|
||||||
[homeViewController stopActivityIndicator];
|
[homeViewController stopActivityIndicator];
|
||||||
|
@ -1495,34 +1495,20 @@ NSString *const AppDelegateUniversalLinkDidChangeNotification = @"AppDelegateUni
|
||||||
// Check that 'fragment' has not been cancelled
|
// Check that 'fragment' has not been cancelled
|
||||||
if ([self->universalLinkFragmentPending isEqualToString:fragment])
|
if ([self->universalLinkFragmentPending isEqualToString:fragment])
|
||||||
{
|
{
|
||||||
// Retry opening the link but with the returned room id
|
NSString *newFragment = resolution.deeplinkFragment;
|
||||||
NSString *newUniversalLinkFragment =
|
if (newFragment && ![newFragment isEqualToString:fragment])
|
||||||
[fragment stringByReplacingOccurrencesOfString:[MXTools encodeURIComponent:roomIdOrAlias]
|
|
||||||
withString:[MXTools encodeURIComponent:roomId]
|
|
||||||
];
|
|
||||||
|
|
||||||
// The previous operation can fail because of percent encoding
|
|
||||||
// TBH we are not clean on data inputs. For the moment, just give another try with no encoding
|
|
||||||
// TODO: Have a dedicated module and tests to handle universal links (matrix.to, email link, etc)
|
|
||||||
if ([newUniversalLinkFragment isEqualToString:fragment])
|
|
||||||
{
|
{
|
||||||
newUniversalLinkFragment =
|
self->universalLinkFragmentPendingRoomAlias = @{resolution.roomId: roomIdOrAlias};
|
||||||
[fragment stringByReplacingOccurrencesOfString:roomIdOrAlias
|
|
||||||
withString:[MXTools encodeURIComponent:roomId]];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (![newUniversalLinkFragment isEqualToString:fragment])
|
|
||||||
{
|
|
||||||
self->universalLinkFragmentPendingRoomAlias = @{roomId: roomIdOrAlias};
|
|
||||||
|
|
||||||
UniversalLinkParameters *newParameters = [[UniversalLinkParameters alloc] initWithFragment:newUniversalLinkFragment universalLinkURL:universalLinkURL presentationParameters:presentationParameters];
|
|
||||||
|
|
||||||
|
UniversalLinkParameters *newParameters = [[UniversalLinkParameters alloc] initWithFragment:newFragment
|
||||||
|
universalLinkURL:universalLinkURL
|
||||||
|
presentationParameters:presentationParameters];
|
||||||
[self handleUniversalLinkWithParameters:newParameters];
|
[self handleUniversalLinkWithParameters:newParameters];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Do not continue. Else we will loop forever
|
// Do not continue. Else we will loop forever
|
||||||
MXLogDebug(@"[AppDelegate] Universal link: Error: Cannot resolve alias in %@ to the room id %@", fragment, roomId);
|
MXLogDebug(@"[AppDelegate] Universal link: Error: Cannot resolve alias in %@ to the room id %@", fragment, resolution.roomId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -867,14 +867,13 @@
|
||||||
__weak typeof(self) weakSelf = self;
|
__weak typeof(self) weakSelf = self;
|
||||||
[self startActivityIndicator];
|
[self startActivityIndicator];
|
||||||
|
|
||||||
[self.mxSession.matrixRestClient roomIDForRoomAlias:roomIdOrAlias success:^(NSString *roomId) {
|
[self.mxSession.matrixRestClient resolveRoomAlias:roomIdOrAlias success:^(MXRoomAliasResolution *resolution) {
|
||||||
|
|
||||||
if (roomId && weakSelf)
|
if (roomId && weakSelf)
|
||||||
{
|
{
|
||||||
typeof(self) self = weakSelf;
|
typeof(self) self = weakSelf;
|
||||||
|
|
||||||
[self stopActivityIndicator];
|
[self stopActivityIndicator];
|
||||||
[self didSelectRoomId:roomId];
|
[self didSelectRoomId:resolution.roomId];
|
||||||
}
|
}
|
||||||
|
|
||||||
} failure:^(NSError *error) {
|
} failure:^(NSError *error) {
|
||||||
|
|
43
Riot/Modules/DeepLink/MXRoomAliasResolution+Deeplink.swift
Normal file
43
Riot/Modules/DeepLink/MXRoomAliasResolution+Deeplink.swift
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
//
|
||||||
|
// Copyright 2022 New Vector 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.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import MatrixSDK
|
||||||
|
|
||||||
|
@objc extension MXRoomAliasResolution {
|
||||||
|
|
||||||
|
/// Deeplink fragment using a room identifier and a list of servers aware of this identifier
|
||||||
|
///
|
||||||
|
/// For more details see
|
||||||
|
/// https://github.com/matrix-org/matrix-spec-proposals/blob/old_master/proposals/1704-matrix.to-permalinks.md
|
||||||
|
var deeplinkFragment: String? {
|
||||||
|
guard let roomId = roomId else {
|
||||||
|
MXLog.debug("[MXRoomAliasResolution]: Missing room identifier")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return MXTools.encodeURIComponent(
|
||||||
|
fragment(for: roomId)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func fragment(for roomId: String) -> String {
|
||||||
|
guard let servers = servers, !servers.isEmpty else {
|
||||||
|
return roomId
|
||||||
|
}
|
||||||
|
return roomId + "?via=" + servers.joined(separator: "&via=")
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
//
|
||||||
|
// Copyright 2022 New Vector 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.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import XCTest
|
||||||
|
@testable import Riot
|
||||||
|
|
||||||
|
class MXRoomAliasResolutionDeeplinkTests: XCTestCase {
|
||||||
|
func test_fragmentIsNilForInvalidResolution() {
|
||||||
|
let resolution = MXRoomAliasResolution()
|
||||||
|
XCTAssertNil(resolution.deeplinkFragment)
|
||||||
|
}
|
||||||
|
|
||||||
|
func test_fragmentDoesNotContainServers_ifNoServers() {
|
||||||
|
let resolution = MXRoomAliasResolution()
|
||||||
|
resolution.roomId = "!abc:matrix.org"
|
||||||
|
|
||||||
|
XCTAssertEqual(resolution.deeplinkFragment, "!abc%3Amatrix.org")
|
||||||
|
}
|
||||||
|
|
||||||
|
func test_fragmentContainsSingleServer() {
|
||||||
|
let resolution = MXRoomAliasResolution()
|
||||||
|
resolution.roomId = "xyz:element.io"
|
||||||
|
resolution.servers = [
|
||||||
|
"matrix.org"
|
||||||
|
]
|
||||||
|
|
||||||
|
XCTAssertEqual(resolution.deeplinkFragment, "xyz%3Aelement.io%3Fvia%3Dmatrix.org")
|
||||||
|
}
|
||||||
|
|
||||||
|
func test_fragmentContainsMultipleSerivers() {
|
||||||
|
let resolution = MXRoomAliasResolution()
|
||||||
|
resolution.roomId = "mno:server.com"
|
||||||
|
resolution.servers = [
|
||||||
|
"server.com",
|
||||||
|
"element.io",
|
||||||
|
"wikipedia.org",
|
||||||
|
"matrix.org"
|
||||||
|
]
|
||||||
|
|
||||||
|
XCTAssertEqual(resolution.deeplinkFragment, "mno%3Aserver.com%3Fvia%3Dserver.com%26via%3Delement.io%26via%3Dwikipedia.org%26via%3Dmatrix.org")
|
||||||
|
}
|
||||||
|
}
|
1
changelog.d/4858.bugfix
Normal file
1
changelog.d/4858.bugfix
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Room: Enable joining a room via identifier from another home server
|
Loading…
Reference in a new issue