544 lines
20 KiB
Dart
544 lines
20 KiB
Dart
import 'package:collection/collection.dart';
|
|
import 'package:moxlib/moxlib.dart';
|
|
import 'package:moxxmpp/moxxmpp.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import '../helpers/logging.dart';
|
|
import '../helpers/xmpp.dart';
|
|
|
|
class ExampleNegotiator extends Sasl2FeatureNegotiator {
|
|
ExampleNegotiator()
|
|
: super(0, false, 'invalid:example:dont:use', 'testNegotiator');
|
|
|
|
String? value;
|
|
|
|
@override
|
|
Future<Result<NegotiatorState, NegotiatorError>> negotiate(
|
|
XMLNode nonza,
|
|
) async {
|
|
return const Result(NegotiatorState.done);
|
|
}
|
|
|
|
@override
|
|
bool canInlineFeature(List<XMLNode> features) {
|
|
return features.firstWhereOrNull(
|
|
(child) => child.xmlns == 'invalid:example:dont:use',
|
|
) !=
|
|
null;
|
|
}
|
|
|
|
@override
|
|
Future<void> postRegisterCallback() async {
|
|
attributes
|
|
.getNegotiatorById<Sasl2Negotiator>(sasl2Negotiator)!
|
|
.registerNegotiator(this);
|
|
}
|
|
|
|
@override
|
|
Future<List<XMLNode>> onSasl2FeaturesReceived(XMLNode nonza) async {
|
|
return [
|
|
XMLNode.xmlns(
|
|
tag: 'test-data-request',
|
|
xmlns: 'invalid:example:dont:use',
|
|
),
|
|
];
|
|
}
|
|
|
|
@override
|
|
Future<Result<bool, NegotiatorError>> onSasl2Success(XMLNode nonza) async {
|
|
final child =
|
|
nonza.firstTag('test-data', xmlns: 'invalid:example:dont:use');
|
|
if (child == null) {
|
|
return const Result(true);
|
|
}
|
|
|
|
value = child.innerText();
|
|
return const Result(true);
|
|
}
|
|
}
|
|
|
|
void main() {
|
|
initLogger();
|
|
|
|
test('Test simple SASL2 negotiation', () async {
|
|
final fakeSocket = StubTCPSocket([
|
|
StringExpectation(
|
|
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='test.server' from='polynomdivision@test.server' xml:lang='en'>",
|
|
'''
|
|
<stream:stream
|
|
xmlns="jabber:client"
|
|
version="1.0"
|
|
xmlns:stream="http://etherx.jabber.org/streams"
|
|
from="test.server"
|
|
xml:lang="en">
|
|
<stream:features xmlns="http://etherx.jabber.org/streams">
|
|
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
|
|
<mechanism>PLAIN</mechanism>
|
|
</mechanisms>
|
|
<authentication xmlns='urn:xmpp:sasl:2'>
|
|
<mechanism>PLAIN</mechanism>
|
|
</authentication>
|
|
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
|
|
<required/>
|
|
</bind>
|
|
</stream:features>''',
|
|
),
|
|
StanzaExpectation(
|
|
"<authenticate xmlns='urn:xmpp:sasl:2' mechanism='PLAIN'><user-agent id='d4565fa7-4d72-4749-b3d3-740edbf87770'><software>moxxmpp</software><device>PapaTutuWawa's awesome device</device></user-agent><initial-response>AHBvbHlub21kaXZpc2lvbgBhYWFh</initial-response></authenticate>",
|
|
'''
|
|
<success xmlns='urn:xmpp:sasl:2'>
|
|
<authorization-identifier>polynomdivision@test.server</authorization-identifier>
|
|
</success>
|
|
''',
|
|
),
|
|
StanzaExpectation(
|
|
"<iq xmlns='jabber:client' type='set' id='aaaa'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind' /></iq>",
|
|
'''
|
|
'<iq xmlns="jabber:client" type="result" id="a"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>polynomdivision@test.server/MU29eEZn</jid></bind></iq>',
|
|
''',
|
|
adjustId: true,
|
|
ignoreId: true,
|
|
),
|
|
]);
|
|
final conn = XmppConnection(
|
|
TestingReconnectionPolicy(),
|
|
AlwaysConnectedConnectivityManager(),
|
|
ClientToServerNegotiator(),
|
|
fakeSocket,
|
|
)..connectionSettings = ConnectionSettings(
|
|
jid: JID.fromString('polynomdivision@test.server'),
|
|
password: 'aaaa',
|
|
);
|
|
await conn.registerManagers([
|
|
PresenceManager(),
|
|
RosterManager(TestingRosterStateManager('', [])),
|
|
DiscoManager([]),
|
|
]);
|
|
await conn.registerFeatureNegotiators([
|
|
SaslPlainNegotiator(),
|
|
ResourceBindingNegotiator(),
|
|
Sasl2Negotiator()
|
|
..userAgent = const UserAgent(
|
|
id: 'd4565fa7-4d72-4749-b3d3-740edbf87770',
|
|
software: 'moxxmpp',
|
|
device: "PapaTutuWawa's awesome device",
|
|
),
|
|
]);
|
|
|
|
final result = await conn.connect(
|
|
waitUntilLogin: true,
|
|
shouldReconnect: false,
|
|
enableReconnectOnSuccess: false,
|
|
);
|
|
expect(result.isType<NegotiatorError>(), false);
|
|
});
|
|
|
|
test('Test SCRAM-SHA-1 SASL2 negotiation with a valid signature', () async {
|
|
final fakeSocket = StubTCPSocket([
|
|
StringExpectation(
|
|
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='server' from='user@server' xml:lang='en'>",
|
|
'''
|
|
<stream:stream
|
|
xmlns="jabber:client"
|
|
version="1.0"
|
|
xmlns:stream="http://etherx.jabber.org/streams"
|
|
from="server"
|
|
xml:lang="en">
|
|
<stream:features xmlns="http://etherx.jabber.org/streams">
|
|
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
|
|
<mechanism>PLAIN</mechanism>
|
|
<mechanism>SCRAM-SHA-256</mechanism>
|
|
</mechanisms>
|
|
<authentication xmlns='urn:xmpp:sasl:2'>
|
|
<mechanism>PLAIN</mechanism>
|
|
<mechanism>SCRAM-SHA-256</mechanism>
|
|
</authentication>
|
|
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
|
|
<required/>
|
|
</bind>
|
|
</stream:features>''',
|
|
),
|
|
StanzaExpectation(
|
|
"<authenticate xmlns='urn:xmpp:sasl:2' mechanism='SCRAM-SHA-256'><user-agent id='d4565fa7-4d72-4749-b3d3-740edbf87770'><software>moxxmpp</software><device>PapaTutuWawa's awesome device</device></user-agent><initial-response>biwsbj11c2VyLHI9ck9wck5HZndFYmVSV2diTkVrcU8=</initial-response></authenticate>",
|
|
'''
|
|
<challenge xmlns='urn:xmpp:sasl:2'>cj1yT3ByTkdmd0ViZVJXZ2JORWtxTyVodllEcFdVYTJSYVRDQWZ1eEZJbGopaE5sRiRrMCxzPVcyMlphSjBTTlk3c29Fc1VFamI2Z1E9PSxpPTQwOTY=</challenge>
|
|
''',
|
|
),
|
|
StanzaExpectation(
|
|
'<response xmlns="urn:xmpp:sasl:2">Yz1iaXdzLHI9ck9wck5HZndFYmVSV2diTkVrcU8laHZZRHBXVWEyUmFUQ0FmdXhGSWxqKWhObEYkazAscD1kSHpiWmFwV0lrNGpVaE4rVXRlOXl0YWc5empmTUhnc3FtbWl6N0FuZFZRPQ==</response>',
|
|
'<success xmlns="urn:xmpp:sasl:2"><additional-data>dj02cnJpVFJCaTIzV3BSUi93dHVwK21NaFVaVW4vZEI1bkxUSlJzamw5NUc0PQ==</additional-data><authorization-identifier>user@server</authorization-identifier></success>',
|
|
),
|
|
StanzaExpectation(
|
|
"<iq xmlns='jabber:client' type='set' id='aaaa'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind' /></iq>",
|
|
'''
|
|
'<iq xmlns="jabber:client" type="result" id="a"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>polynomdivision@test.server/MU29eEZn</jid></bind></iq>',
|
|
''',
|
|
adjustId: true,
|
|
ignoreId: true,
|
|
),
|
|
]);
|
|
final conn = XmppConnection(
|
|
TestingReconnectionPolicy(),
|
|
AlwaysConnectedConnectivityManager(),
|
|
ClientToServerNegotiator(),
|
|
fakeSocket,
|
|
)..connectionSettings = ConnectionSettings(
|
|
jid: JID.fromString('user@server'),
|
|
password: 'pencil',
|
|
);
|
|
await conn.registerManagers([
|
|
PresenceManager(),
|
|
RosterManager(TestingRosterStateManager('', [])),
|
|
DiscoManager([]),
|
|
]);
|
|
await conn.registerFeatureNegotiators([
|
|
SaslPlainNegotiator(),
|
|
SaslScramNegotiator(
|
|
10,
|
|
'n=user,r=rOprNGfwEbeRWgbNEkqO',
|
|
'rOprNGfwEbeRWgbNEkqO',
|
|
ScramHashType.sha256,
|
|
),
|
|
ResourceBindingNegotiator(),
|
|
Sasl2Negotiator()
|
|
..userAgent = const UserAgent(
|
|
id: 'd4565fa7-4d72-4749-b3d3-740edbf87770',
|
|
software: 'moxxmpp',
|
|
device: "PapaTutuWawa's awesome device",
|
|
),
|
|
]);
|
|
|
|
final result = await conn.connect(
|
|
waitUntilLogin: true,
|
|
shouldReconnect: false,
|
|
enableReconnectOnSuccess: false,
|
|
);
|
|
expect(result.isType<XmppError>(), false);
|
|
});
|
|
|
|
test('Test SCRAM-SHA-1 SASL2 negotiation with a valid signature', () async {
|
|
final fakeSocket = StubTCPSocket([
|
|
StringExpectation(
|
|
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='server' from='user@server' xml:lang='en'>",
|
|
'''
|
|
<stream:stream
|
|
xmlns="jabber:client"
|
|
version="1.0"
|
|
xmlns:stream="http://etherx.jabber.org/streams"
|
|
from="server"
|
|
xml:lang="en">
|
|
<stream:features xmlns="http://etherx.jabber.org/streams">
|
|
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
|
|
<mechanism>PLAIN</mechanism>
|
|
<mechanism>SCRAM-SHA-1</mechanism>
|
|
</mechanisms>
|
|
<authentication xmlns='urn:xmpp:sasl:2'>
|
|
<mechanism>PLAIN</mechanism>
|
|
<mechanism>SCRAM-SHA-1</mechanism>
|
|
</authentication>
|
|
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
|
|
<required/>
|
|
</bind>
|
|
</stream:features>''',
|
|
),
|
|
StanzaExpectation(
|
|
"<authenticate xmlns='urn:xmpp:sasl:2' mechanism='SCRAM-SHA-1'><user-agent id='d4565fa7-4d72-4749-b3d3-740edbf87770'><software>moxxmpp</software><device>PapaTutuWawa's awesome device</device></user-agent><initial-response>biwsbj11c2VyLHI9ZnlrbytkMmxiYkZnT05Sdjlxa3hkYXdM</initial-response></authenticate>",
|
|
'''
|
|
<challenge xmlns='urn:xmpp:sasl:2'>cj1meWtvK2QybGJiRmdPTlJ2OXFreGRhd0wzcmZjTkhZSlkxWlZ2V1ZzN2oscz1RU1hDUitRNnNlazhiZjkyLGk9NDA5Ng==</challenge>
|
|
''',
|
|
),
|
|
StanzaExpectation(
|
|
'<response xmlns="urn:xmpp:sasl:2">Yz1iaXdzLHI9ZnlrbytkMmxiYkZnT05Sdjlxa3hkYXdMM3JmY05IWUpZMVpWdldWczdqLHA9djBYOHYzQnoyVDBDSkdiSlF5RjBYK0hJNFRzPQ==</response>',
|
|
'<success xmlns="urn:xmpp:sasl:2"><additional-data>dj1ybUY5cHFWOFM3c3VBb1pXamE0ZEpSa0ZzS1E9</additional-data><authorization-identifier>user@server</authorization-identifier></success>',
|
|
),
|
|
StanzaExpectation(
|
|
"<iq xmlns='jabber:client' type='set' id='aaaa'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind' /></iq>",
|
|
'''
|
|
'<iq xmlns="jabber:client" type="result" id="a"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>polynomdivision@test.server/MU29eEZn</jid></bind></iq>',
|
|
''',
|
|
adjustId: true,
|
|
ignoreId: true,
|
|
),
|
|
]);
|
|
final conn = XmppConnection(
|
|
TestingReconnectionPolicy(),
|
|
AlwaysConnectedConnectivityManager(),
|
|
ClientToServerNegotiator(),
|
|
fakeSocket,
|
|
)..connectionSettings = ConnectionSettings(
|
|
jid: JID.fromString('user@server'),
|
|
password: 'pencil',
|
|
);
|
|
await conn.registerManagers([
|
|
PresenceManager(),
|
|
RosterManager(TestingRosterStateManager('', [])),
|
|
DiscoManager([]),
|
|
]);
|
|
await conn.registerFeatureNegotiators([
|
|
SaslPlainNegotiator(),
|
|
SaslScramNegotiator(
|
|
10,
|
|
'n=user,r=fyko+d2lbbFgONRv9qkxdawL',
|
|
'fyko+d2lbbFgONRv9qkxdawL',
|
|
ScramHashType.sha1,
|
|
),
|
|
ResourceBindingNegotiator(),
|
|
Sasl2Negotiator()
|
|
..userAgent = const UserAgent(
|
|
id: 'd4565fa7-4d72-4749-b3d3-740edbf87770',
|
|
software: 'moxxmpp',
|
|
device: "PapaTutuWawa's awesome device",
|
|
),
|
|
]);
|
|
|
|
final result = await conn.connect(
|
|
waitUntilLogin: true,
|
|
shouldReconnect: false,
|
|
enableReconnectOnSuccess: false,
|
|
);
|
|
expect(result.isType<NegotiatorError>(), false);
|
|
});
|
|
|
|
test('Test SCRAM-SHA-1 SASL2 negotiation with an invalid signature',
|
|
() async {
|
|
final fakeSocket = StubTCPSocket([
|
|
StringExpectation(
|
|
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='server' from='user@server' xml:lang='en'>",
|
|
'''
|
|
<stream:stream
|
|
xmlns="jabber:client"
|
|
version="1.0"
|
|
xmlns:stream="http://etherx.jabber.org/streams"
|
|
from="server"
|
|
xml:lang="en">
|
|
<stream:features xmlns="http://etherx.jabber.org/streams">
|
|
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
|
|
<mechanism>PLAIN</mechanism>
|
|
<mechanism>SCRAM-SHA-256</mechanism>
|
|
</mechanisms>
|
|
<authentication xmlns='urn:xmpp:sasl:2'>
|
|
<mechanism>PLAIN</mechanism>
|
|
<mechanism>SCRAM-SHA-256</mechanism>
|
|
</authentication>
|
|
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
|
|
<required/>
|
|
</bind>
|
|
</stream:features>''',
|
|
),
|
|
StanzaExpectation(
|
|
"<authenticate xmlns='urn:xmpp:sasl:2' mechanism='SCRAM-SHA-256'><user-agent id='d4565fa7-4d72-4749-b3d3-740edbf87770'><software>moxxmpp</software><device>PapaTutuWawa's awesome device</device></user-agent><initial-response>biwsbj11c2VyLHI9ck9wck5HZndFYmVSV2diTkVrcU8=</initial-response></authenticate>",
|
|
'''
|
|
<challenge xmlns='urn:xmpp:sasl:2'>cj1yT3ByTkdmd0ViZVJXZ2JORWtxTyVodllEcFdVYTJSYVRDQWZ1eEZJbGopaE5sRiRrMCxzPVcyMlphSjBTTlk3c29Fc1VFamI2Z1E9PSxpPTQwOTY=</challenge>
|
|
''',
|
|
),
|
|
StanzaExpectation(
|
|
'<response xmlns="urn:xmpp:sasl:2">Yz1iaXdzLHI9ck9wck5HZndFYmVSV2diTkVrcU8laHZZRHBXVWEyUmFUQ0FmdXhGSWxqKWhObEYkazAscD1kSHpiWmFwV0lrNGpVaE4rVXRlOXl0YWc5empmTUhnc3FtbWl6N0FuZFZRPQ==</response>',
|
|
'<success xmlns="urn:xmpp:sasl:2"><additional-data>dj1zbUY5cHFWOFM3c3VBb1pXamE0ZEpSa0ZzS1E9</additional-data><authorization-identifier>user@server</authorization-identifier></success>',
|
|
),
|
|
]);
|
|
final conn = XmppConnection(
|
|
TestingReconnectionPolicy(),
|
|
AlwaysConnectedConnectivityManager(),
|
|
ClientToServerNegotiator(),
|
|
fakeSocket,
|
|
)..connectionSettings = ConnectionSettings(
|
|
jid: JID.fromString('user@server'),
|
|
password: 'pencil',
|
|
);
|
|
await conn.registerManagers([
|
|
PresenceManager(),
|
|
RosterManager(TestingRosterStateManager('', [])),
|
|
DiscoManager([]),
|
|
]);
|
|
await conn.registerFeatureNegotiators([
|
|
SaslPlainNegotiator(),
|
|
SaslScramNegotiator(
|
|
10,
|
|
'n=user,r=rOprNGfwEbeRWgbNEkqO',
|
|
'rOprNGfwEbeRWgbNEkqO',
|
|
ScramHashType.sha256,
|
|
),
|
|
ResourceBindingNegotiator(),
|
|
Sasl2Negotiator()
|
|
..userAgent = const UserAgent(
|
|
id: 'd4565fa7-4d72-4749-b3d3-740edbf87770',
|
|
software: 'moxxmpp',
|
|
device: "PapaTutuWawa's awesome device",
|
|
),
|
|
]);
|
|
|
|
final result = await conn.connect(
|
|
waitUntilLogin: true,
|
|
shouldReconnect: false,
|
|
enableReconnectOnSuccess: false,
|
|
);
|
|
expect(result.isType<NegotiatorError>(), true);
|
|
expect(result.get<NegotiatorError>() is InvalidServerSignatureError, true);
|
|
});
|
|
|
|
test('Test simple SASL2 inlining', () async {
|
|
final fakeSocket = StubTCPSocket([
|
|
StringExpectation(
|
|
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='test.server' from='polynomdivision@test.server' xml:lang='en'>",
|
|
'''
|
|
<stream:stream
|
|
xmlns="jabber:client"
|
|
version="1.0"
|
|
xmlns:stream="http://etherx.jabber.org/streams"
|
|
from="test.server"
|
|
xml:lang="en">
|
|
<stream:features xmlns="http://etherx.jabber.org/streams">
|
|
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
|
|
<mechanism>PLAIN</mechanism>
|
|
</mechanisms>
|
|
<authentication xmlns='urn:xmpp:sasl:2'>
|
|
<mechanism>PLAIN</mechanism>
|
|
<inline>
|
|
<test-feature xmlns="invalid:example:dont:use" />
|
|
</inline>
|
|
</authentication>
|
|
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
|
|
<required/>
|
|
</bind>
|
|
</stream:features>''',
|
|
),
|
|
StanzaExpectation(
|
|
"<authenticate xmlns='urn:xmpp:sasl:2' mechanism='PLAIN'><user-agent id='d4565fa7-4d72-4749-b3d3-740edbf87770'><software>moxxmpp</software><device>PapaTutuWawa's awesome device</device></user-agent><initial-response>AHBvbHlub21kaXZpc2lvbgBhYWFh</initial-response><test-data-request xmlns='invalid:example:dont:use' /></authenticate>",
|
|
'''
|
|
<success xmlns='urn:xmpp:sasl:2'>
|
|
<authorization-identifier>polynomdivision@test.server</authorization-identifier>
|
|
<test-data xmlns='invalid:example:dont:use'>Hello World</test-data>
|
|
</success>
|
|
''',
|
|
),
|
|
StanzaExpectation(
|
|
"<iq xmlns='jabber:client' type='set' id='aaaa'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind' /></iq>",
|
|
'''
|
|
'<iq xmlns="jabber:client" type="result" id="a"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>polynomdivision@test.server/MU29eEZn</jid></bind></iq>',
|
|
''',
|
|
adjustId: true,
|
|
ignoreId: true,
|
|
),
|
|
]);
|
|
final conn = XmppConnection(
|
|
TestingReconnectionPolicy(),
|
|
AlwaysConnectedConnectivityManager(),
|
|
ClientToServerNegotiator(),
|
|
fakeSocket,
|
|
)..connectionSettings = ConnectionSettings(
|
|
jid: JID.fromString('polynomdivision@test.server'),
|
|
password: 'aaaa',
|
|
);
|
|
await conn.registerManagers([
|
|
PresenceManager(),
|
|
RosterManager(TestingRosterStateManager('', [])),
|
|
DiscoManager([]),
|
|
]);
|
|
await conn.registerFeatureNegotiators([
|
|
SaslPlainNegotiator(),
|
|
ResourceBindingNegotiator(),
|
|
ExampleNegotiator(),
|
|
Sasl2Negotiator()
|
|
..userAgent = const UserAgent(
|
|
id: 'd4565fa7-4d72-4749-b3d3-740edbf87770',
|
|
software: 'moxxmpp',
|
|
device: "PapaTutuWawa's awesome device",
|
|
),
|
|
]);
|
|
|
|
final result = await conn.connect(
|
|
waitUntilLogin: true,
|
|
shouldReconnect: false,
|
|
enableReconnectOnSuccess: false,
|
|
);
|
|
expect(result.isType<NegotiatorError>(), false);
|
|
|
|
expect(
|
|
conn.getNegotiatorById<ExampleNegotiator>('testNegotiator')!.value,
|
|
'Hello World',
|
|
);
|
|
});
|
|
|
|
test('Test simple SASL2 inlining 2', () async {
|
|
final fakeSocket = StubTCPSocket([
|
|
StringExpectation(
|
|
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='test.server' from='polynomdivision@test.server' xml:lang='en'>",
|
|
'''
|
|
<stream:stream
|
|
xmlns="jabber:client"
|
|
version="1.0"
|
|
xmlns:stream="http://etherx.jabber.org/streams"
|
|
from="test.server"
|
|
xml:lang="en">
|
|
<stream:features xmlns="http://etherx.jabber.org/streams">
|
|
<mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
|
|
<mechanism>PLAIN</mechanism>
|
|
</mechanisms>
|
|
<authentication xmlns='urn:xmpp:sasl:2'>
|
|
<mechanism>PLAIN</mechanism>
|
|
<inline>
|
|
<resume xmlns="urn:xmpp:sm:3" />
|
|
</inline>
|
|
</authentication>
|
|
<bind xmlns="urn:ietf:params:xml:ns:xmpp-bind">
|
|
<required/>
|
|
</bind>
|
|
</stream:features>''',
|
|
),
|
|
StanzaExpectation(
|
|
"<authenticate xmlns='urn:xmpp:sasl:2' mechanism='PLAIN'><user-agent id='d4565fa7-4d72-4749-b3d3-740edbf87770'><software>moxxmpp</software><device>PapaTutuWawa's awesome device</device></user-agent><initial-response>AHBvbHlub21kaXZpc2lvbgBhYWFh</initial-response></authenticate>",
|
|
'''
|
|
<success xmlns='urn:xmpp:sasl:2'>
|
|
<authorization-identifier>polynomdivision@test.server</authorization-identifier>
|
|
</success>
|
|
''',
|
|
),
|
|
StanzaExpectation(
|
|
"<iq xmlns='jabber:client' type='set' id='aaaa'><bind xmlns='urn:ietf:params:xml:ns:xmpp-bind' /></iq>",
|
|
'''
|
|
'<iq xmlns="jabber:client" type="result" id="a"><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><jid>polynomdivision@test.server/MU29eEZn</jid></bind></iq>',
|
|
''',
|
|
adjustId: true,
|
|
ignoreId: true,
|
|
),
|
|
]);
|
|
final conn = XmppConnection(
|
|
TestingReconnectionPolicy(),
|
|
AlwaysConnectedConnectivityManager(),
|
|
ClientToServerNegotiator(),
|
|
fakeSocket,
|
|
)..connectionSettings = ConnectionSettings(
|
|
jid: JID.fromString('polynomdivision@test.server'),
|
|
password: 'aaaa',
|
|
);
|
|
await conn.registerManagers([
|
|
PresenceManager(),
|
|
RosterManager(TestingRosterStateManager('', [])),
|
|
DiscoManager([]),
|
|
]);
|
|
await conn.registerFeatureNegotiators([
|
|
SaslPlainNegotiator(),
|
|
ResourceBindingNegotiator(),
|
|
ExampleNegotiator(),
|
|
Sasl2Negotiator()
|
|
..userAgent = const UserAgent(
|
|
id: 'd4565fa7-4d72-4749-b3d3-740edbf87770',
|
|
software: 'moxxmpp',
|
|
device: "PapaTutuWawa's awesome device",
|
|
),
|
|
]);
|
|
|
|
final result = await conn.connect(
|
|
waitUntilLogin: true,
|
|
shouldReconnect: false,
|
|
enableReconnectOnSuccess: false,
|
|
);
|
|
expect(result.isType<NegotiatorError>(), false);
|
|
|
|
expect(
|
|
conn.getNegotiatorById<ExampleNegotiator>('testNegotiator')!.value,
|
|
null,
|
|
);
|
|
});
|
|
}
|