fix: Handle domains with port or ipv6 addresses correctly
This commit is contained in:
parent
cb1ec86b32
commit
c90e18b55d
|
@ -3,6 +3,15 @@ extension MatrixIdExtension on String {
|
|||
|
||||
static const int MAX_LENGTH = 255;
|
||||
|
||||
List<String> _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();
|
||||
}
|
||||
|
|
|
@ -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');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue