fix: Properly handle url encoding in matrix.to URLs

This commit is contained in:
Sorunome 2020-12-27 11:46:53 +01:00
commit e5dad936ce
3 changed files with 107 additions and 76 deletions

View file

@ -1,24 +1,33 @@
import '../app_config.dart';
extension MatrixIdentifierStringExtension on String {
/// Separates room identifiers with an event id and possibly a query parameter into its components.
MatrixIdentifierStringExtensionResults parseIdentifierIntoParts() {
final match = RegExp(r'^([#!][^:]*:[^\/?]*)(?:\/(\$[^?]*))?(?:\?(.*))?$')
.firstMatch(this);
final isUrl = startsWith(AppConfig.inviteLinkPrefix);
var s = this;
if (isUrl) {
// as we decode a component we may only call it on the url part *before* the "query" part
final parts = replaceFirst(AppConfig.inviteLinkPrefix, '').split('?');
s = Uri.decodeComponent(parts.removeAt(0)) + '?' + parts.join('?');
}
final match = RegExp(r'^([#!@+][^:]*:[^\/?]*)(?:\/(\$[^?]*))?(?:\?(.*))?$')
.firstMatch(s);
if (match == null) {
return null;
}
return MatrixIdentifierStringExtensionResults(
roomIdOrAlias: match.group(1),
eventId: match.group(2),
queryString: match.group(3),
primaryIdentifier: match.group(1),
secondaryIdentifier: match.group(2),
queryString: match.group(3)?.isNotEmpty ?? false ? match.group(3) : null,
);
}
}
class MatrixIdentifierStringExtensionResults {
final String roomIdOrAlias;
final String eventId;
final String primaryIdentifier;
final String secondaryIdentifier;
final String queryString;
MatrixIdentifierStringExtensionResults(
{this.roomIdOrAlias, this.eventId, this.queryString});
{this.primaryIdentifier, this.secondaryIdentifier, this.queryString});
}