From c90e18b55de81acf14623639254fd14d741f540e Mon Sep 17 00:00:00 2001 From: Sorunome Date: Tue, 15 Sep 2020 12:26:49 +0200 Subject: [PATCH] fix: Handle domains with port or ipv6 addresses correctly --- lib/src/utils/matrix_id_string_extension.dart | 16 ++++++++++++---- test/matrix_id_string_extension_test.dart | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/src/utils/matrix_id_string_extension.dart b/lib/src/utils/matrix_id_string_extension.dart index 685e12e..8e91d2c 100644 --- a/lib/src/utils/matrix_id_string_extension.dart +++ b/lib/src/utils/matrix_id_string_extension.dart @@ -3,6 +3,15 @@ extension MatrixIdExtension on String { static const int MAX_LENGTH = 255; + List _getParts() { + final s = substring(1); + final ix = s.indexOf(':'); + if (ix == -1) { + return [substring(1)]; + } + return [s.substring(0, ix), s.substring(ix + 1)]; + } + bool get isValidMatrixId { if (isEmpty ?? true) return false; if (length > MAX_LENGTH) return false; @@ -14,7 +23,7 @@ extension MatrixIdExtension on String { return true; } // all other matrix IDs have to have a domain - final parts = substring(1).split(':'); + final parts = _getParts(); // the localpart can be an empty string, e.g. for aliases if (parts.length != 2 || parts[1].isEmpty) { return false; @@ -24,10 +33,9 @@ extension MatrixIdExtension on String { String get sigil => isValidMatrixId ? substring(0, 1) : null; - String get localpart => - isValidMatrixId ? substring(1).split(':').first : null; + String get localpart => isValidMatrixId ? _getParts().first : null; - String get domain => isValidMatrixId ? substring(1).split(':')[1] : null; + String get domain => isValidMatrixId ? _getParts().last : null; bool equals(String other) => toLowerCase() == other?.toLowerCase(); } diff --git a/test/matrix_id_string_extension_test.dart b/test/matrix_id_string_extension_test.dart index 0ee37c3..01d59c8 100644 --- a/test/matrix_id_string_extension_test.dart +++ b/test/matrix_id_string_extension_test.dart @@ -43,6 +43,8 @@ void main() { expect(mxId.domain, 'example.com'); expect(mxId.equals('@Test:example.com'), true); expect(mxId.equals('@test:example.org'), false); + expect('@user:domain:8448'.localpart, 'user'); + expect('@user:domain:8448'.domain, 'domain:8448'); }); }); }