parent
55d2ef9c25
commit
763c93857d
@ -6,67 +6,38 @@ class JID {
|
||||
const JID(this.local, this.domain, this.resource);
|
||||
|
||||
factory JID.fromString(String jid) {
|
||||
// 0: Parsing either the local or domain part
|
||||
// 1: Parsing the domain part
|
||||
// 2: Parsing the resource
|
||||
var state = 0;
|
||||
var buffer = '';
|
||||
var local_ = '';
|
||||
var domain_ = '';
|
||||
var resource_ = '';
|
||||
|
||||
for (var i = 0; i < jid.length; i++) {
|
||||
final c = jid[i];
|
||||
final eol = i == jid.length - 1;
|
||||
|
||||
switch (state) {
|
||||
case 0: {
|
||||
if (c == '@') {
|
||||
local_ = buffer;
|
||||
buffer = '';
|
||||
state = 1;
|
||||
} else if (c == '/') {
|
||||
domain_ = buffer;
|
||||
buffer = '';
|
||||
state = 2;
|
||||
} else if (eol) {
|
||||
domain_ = buffer + c;
|
||||
} else {
|
||||
buffer += c;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 1: {
|
||||
if (c == '/') {
|
||||
domain_ = buffer;
|
||||
buffer = '';
|
||||
state = 2;
|
||||
} else if (eol) {
|
||||
domain_ = buffer;
|
||||
// Algorithm taken from here: https://blog.samwhited.com/2021/02/xmpp-addresses/
|
||||
var localPart = '';
|
||||
var domainPart = '';
|
||||
var resourcePart = '';
|
||||
|
||||
if (c != ' ') {
|
||||
domain_ = domain_ + c;
|
||||
}
|
||||
} else if (c != ' ') {
|
||||
buffer += c;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 2: {
|
||||
if (eol) {
|
||||
resource_ = buffer;
|
||||
final slashParts = jid.split('/');
|
||||
if (slashParts.length == 1) {
|
||||
resourcePart = '';
|
||||
} else {
|
||||
resourcePart = slashParts.sublist(1).join('/');
|
||||
|
||||
if (c != ' ') {
|
||||
resource_ = resource_ + c;
|
||||
}
|
||||
} else if (c != ''){
|
||||
buffer += c;
|
||||
}
|
||||
}
|
||||
}
|
||||
assert(resourcePart.isNotEmpty, 'Resource part cannot be there and empty');
|
||||
}
|
||||
|
||||
return JID(local_, domain_, resource_);
|
||||
final atParts = slashParts.first.split('@');
|
||||
if (atParts.length == 1) {
|
||||
localPart = '';
|
||||
domainPart = atParts.first;
|
||||
} else {
|
||||
localPart = atParts.first;
|
||||
domainPart = atParts.sublist(1).join('@');
|
||||
|
||||
assert(localPart.isNotEmpty, 'Local part cannot be there and empty');
|
||||
}
|
||||
|
||||
return JID(
|
||||
localPart,
|
||||
domainPart.endsWith('.') ?
|
||||
domainPart.substring(0, domainPart.length - 1) :
|
||||
domainPart,
|
||||
resourcePart,
|
||||
);
|
||||
}
|
||||
final String local;
|
||||
final String domain;
|
||||
|
@ -3,39 +3,43 @@ import 'package:test/test.dart';
|
||||
|
||||
void main() {
|
||||
test('Parse a full JID', () {
|
||||
final jid = JID.fromString('test@server/abc');
|
||||
final jid = JID.fromString('test@server/abc');
|
||||
|
||||
expect(jid.local, 'test');
|
||||
expect(jid.domain, 'server');
|
||||
expect(jid.resource, 'abc');
|
||||
expect(jid.toString(), 'test@server/abc');
|
||||
expect(jid.local, 'test');
|
||||
expect(jid.domain, 'server');
|
||||
expect(jid.resource, 'abc');
|
||||
expect(jid.toString(), 'test@server/abc');
|
||||
});
|
||||
|
||||
test('Parse a bare JID', () {
|
||||
final jid = JID.fromString('test@server');
|
||||
final jid = JID.fromString('test@server');
|
||||
|
||||
expect(jid.local, 'test');
|
||||
expect(jid.domain, 'server');
|
||||
expect(jid.resource, '');
|
||||
expect(jid.toString(), 'test@server');
|
||||
expect(jid.local, 'test');
|
||||
expect(jid.domain, 'server');
|
||||
expect(jid.resource, '');
|
||||
expect(jid.toString(), 'test@server');
|
||||
});
|
||||
|
||||
test('Parse a JID with no local part', () {
|
||||
final jid = JID.fromString('server/abc');
|
||||
final jid = JID.fromString('server/abc');
|
||||
|
||||
expect(jid.local, '');
|
||||
expect(jid.domain, 'server');
|
||||
expect(jid.resource, 'abc');
|
||||
expect(jid.toString(), 'server/abc');
|
||||
expect(jid.local, '');
|
||||
expect(jid.domain, 'server');
|
||||
expect(jid.resource, 'abc');
|
||||
expect(jid.toString(), 'server/abc');
|
||||
});
|
||||
|
||||
test('Equality', () {
|
||||
expect(JID.fromString('hallo@welt/abc') == JID('hallo', 'welt', 'abc'), true);
|
||||
expect(JID.fromString('hallo@welt') == JID('hallo', 'welt', 'a'), false);
|
||||
expect(JID.fromString('hallo@welt/abc') == JID('hallo', 'welt', 'abc'), true);
|
||||
expect(JID.fromString('hallo@welt') == JID('hallo', 'welt', 'a'), false);
|
||||
});
|
||||
|
||||
test('Whitespaces', () {
|
||||
expect(JID.fromString('hallo@welt ') == JID('hallo', 'welt', ''), true);
|
||||
expect(JID.fromString('hallo@welt/abc ') == JID('hallo', 'welt', 'abc'), true);
|
||||
test('Dot suffix at domain part', () {
|
||||
expect(JID.fromString('hallo@welt.example.') == JID('hallo', 'welt.example', ''), true);
|
||||
expect(JID.fromString('hallo@welt.example./test') == JID('hallo', 'welt.example', 'test'), true);
|
||||
});
|
||||
|
||||
test('Parse resource with a slash', () {
|
||||
expect(JID.fromString('hallo@welt.example./test/welt') == JID('hallo', 'welt.example', 'test/welt'), true);
|
||||
});
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user