diff --git a/Riot/AppDelegate.m b/Riot/AppDelegate.m index de048f57a..e7547f2a4 100644 --- a/Riot/AppDelegate.m +++ b/Riot/AppDelegate.m @@ -1969,8 +1969,9 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN { // Retry opening the link but with the returned room id NSString *newUniversalLinkFragment = - [fragment stringByReplacingOccurrencesOfString:[roomIdOrAlias stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] - withString:[roomId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + [fragment stringByReplacingOccurrencesOfString:[MXTools encodeURIComponent:roomIdOrAlias] + withString:[MXTools encodeURIComponent:roomId] + ]; universalLinkFragmentPendingRoomAlias = @{roomId: roomIdOrAlias}; @@ -2202,7 +2203,7 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN NSMutableArray *pathParams2 = [NSMutableArray arrayWithArray:pathParams]; for (NSInteger i = 0; i < pathParams.count; i++) { - pathParams2[i] = [pathParams2[i] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + pathParams2[i] = [pathParams2[i] stringByRemovingPercentEncoding]; } pathParams = pathParams2; @@ -2222,7 +2223,7 @@ NSString *const kAppDelegateNetworkStatusDidChangeNotification = @"kAppDelegateN if (value.length) { value = [value stringByReplacingOccurrencesOfString:@"+" withString:@" "]; - value = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + value = [value stringByRemovingPercentEncoding]; queryParams[key] = value; } diff --git a/Riot/Managers/Widgets/Widget.m b/Riot/Managers/Widgets/Widget.m index 0ac7714af..3831d9a02 100644 --- a/Riot/Managers/Widgets/Widget.m +++ b/Riot/Managers/Widgets/Widget.m @@ -61,9 +61,10 @@ NSString *avatarUrl = self.mxSession.myUser.avatarUrl ? self.mxSession.myUser.avatarUrl : @""; // Escape everything to build a valid URL string - userId = [userId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - displayName = [displayName stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; - avatarUrl = [avatarUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + // We can't know where the values escaped here will be inserted in the URL, so the alphanumeric charset is used + userId = [MXTools encodeURIComponent:userId]; + displayName = [MXTools encodeURIComponent:displayName]; + avatarUrl = [MXTools encodeURIComponent:avatarUrl]; NSString *widgetUrl = _url; widgetUrl = [widgetUrl stringByReplacingOccurrencesOfString:@"$matrix_user_id" withString:userId]; @@ -86,7 +87,8 @@ if (dataString) { - NSString *value = [dataString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + // same question as above + NSString *value = [MXTools encodeURIComponent:dataString]; widgetUrl = [widgetUrl stringByReplacingOccurrencesOfString:paramKey withString:value]; diff --git a/Riot/Modules/Common/Recents/RecentsViewController.m b/Riot/Modules/Common/Recents/RecentsViewController.m index 1fd5962de..c798e8428 100644 --- a/Riot/Modules/Common/Recents/RecentsViewController.m +++ b/Riot/Modules/Common/Recents/RecentsViewController.m @@ -1252,7 +1252,7 @@ if (roomIdOrAlias.length) { // Open the room or preview it - NSString *fragment = [NSString stringWithFormat:@"/room/%@", [roomIdOrAlias stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + NSString *fragment = [NSString stringWithFormat:@"/room/%@", [MXTools encodeURIComponent:roomIdOrAlias]]; [[AppDelegate theDelegate] handleUniversalLinkFragment:fragment]; } [tableView deselectRowAtIndexPath:indexPath animated:NO]; diff --git a/Riot/Modules/Communities/Home/GroupHomeViewController.m b/Riot/Modules/Communities/Home/GroupHomeViewController.m index 2acae23b5..81b82c83e 100644 --- a/Riot/Modules/Communities/Home/GroupHomeViewController.m +++ b/Riot/Modules/Communities/Home/GroupHomeViewController.m @@ -779,7 +779,7 @@ // When a link refers to a room alias/id, a user id or an event id, the non-ASCII characters (like '#' in room alias) has been escaped // to be able to convert it into a legal URL string. - NSString *absoluteURLString = [URL.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + NSString *absoluteURLString = [URL.absoluteString stringByRemovingPercentEncoding]; // If the link can be open it by the app, let it do if ([Tools isUniversalLink:URL]) @@ -869,7 +869,8 @@ shouldInteractWithURL = NO; // Open the group or preview it - NSString *fragment = [NSString stringWithFormat:@"/group/%@", [absoluteURLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + NSString *fragment = [NSString stringWithFormat:@"/group/%@", + [MXTools encodeURIComponent:absoluteURLString]]; [[AppDelegate theDelegate] handleUniversalLinkFragment:fragment]; } diff --git a/Riot/Modules/Integrations/IntegrationManagerViewController.m b/Riot/Modules/Integrations/IntegrationManagerViewController.m index 99897bf7b..b8dd28448 100644 --- a/Riot/Modules/Integrations/IntegrationManagerViewController.m +++ b/Riot/Modules/Integrations/IntegrationManagerViewController.m @@ -104,20 +104,20 @@ NSString *const kIntegrationManagerAddIntegrationScreen = @"add_integ"; { url = [NSMutableString stringWithFormat:@"%@?scalar_token=%@&room_id=%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"integrationsUiUrl"], - [scalarToken stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding], - [roomId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding] + [MXTools encodeURIComponent:scalarToken], + [MXTools encodeURIComponent:roomId] ]; if (screen) { [url appendString:@"&screen="]; - [url appendString:[screen stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + [url appendString:[MXTools encodeURIComponent:screen]]; } if (widgetId) { [url appendString:@"&integ_id="]; - [url appendString:[widgetId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + [url appendString:[MXTools encodeURIComponent:widgetId]]; } } diff --git a/Riot/Modules/Room/RoomViewController.m b/Riot/Modules/Room/RoomViewController.m index 73627f544..91dcc9552 100644 --- a/Riot/Modules/Room/RoomViewController.m +++ b/Riot/Modules/Room/RoomViewController.m @@ -2756,7 +2756,7 @@ // When a link refers to a room alias/id, a user id or an event id, the non-ASCII characters (like '#' in room alias) has been escaped // to be able to convert it into a legal URL string. - NSString *absoluteURLString = [url.absoluteString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; + NSString *absoluteURLString = [url.absoluteString stringByRemovingPercentEncoding]; // If the link can be open it by the app, let it do if ([Tools isUniversalLink:url]) @@ -2805,7 +2805,7 @@ NSString *roomIdOrAlias = absoluteURLString; // Open the room or preview it - NSString *fragment = [NSString stringWithFormat:@"/room/%@", [roomIdOrAlias stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + NSString *fragment = [NSString stringWithFormat:@"/room/%@", [MXTools encodeURIComponent:roomIdOrAlias]]; [[AppDelegate theDelegate] handleUniversalLinkFragment:fragment]; } // Preview the clicked group @@ -2814,7 +2814,7 @@ shouldDoAction = NO; // Open the group or preview it - NSString *fragment = [NSString stringWithFormat:@"/group/%@", [absoluteURLString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + NSString *fragment = [NSString stringWithFormat:@"/group/%@", [MXTools encodeURIComponent:absoluteURLString]]; [[AppDelegate theDelegate] handleUniversalLinkFragment:fragment]; } else if ([absoluteURLString hasPrefix:kEventFormatterOnReRequestKeysLinkAction]) @@ -3961,7 +3961,7 @@ else if (customizedRoomDataSource.roomState.isObsolete) { NSString *replacementRoomId = customizedRoomDataSource.roomState.tombStoneContent.replacementRoomId; - NSString *roomLinkFragment = [NSString stringWithFormat:@"/room/%@", [replacementRoomId stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; + NSString *roomLinkFragment = [NSString stringWithFormat:@"/room/%@", [MXTools encodeURIComponent:replacementRoomId]]; [roomActivitiesView displayRoomReplacementWithRoomLinkTappedHandler:^{ [[AppDelegate theDelegate] handleUniversalLinkFragment:roomLinkFragment];