feat(xep): Allow setting a tag when using Bind2

This commit is contained in:
PapaTutuWawa 2023-04-01 13:15:46 +02:00
parent f2fe06104c
commit 4e01d32e90
2 changed files with 83 additions and 0 deletions

View File

@ -10,6 +10,9 @@ import 'package:moxxmpp/src/types/result.dart';
class Bind2Negotiator extends Sasl2FeatureNegotiator { class Bind2Negotiator extends Sasl2FeatureNegotiator {
Bind2Negotiator() : super(0, false, bind2Xmlns, bind2Negotiator); Bind2Negotiator() : super(0, false, bind2Xmlns, bind2Negotiator);
/// A tag to sent to the server when requesting Bind2.
String? tag;
@override @override
Future<Result<NegotiatorState, NegotiatorError>> negotiate( Future<Result<NegotiatorState, NegotiatorError>> negotiate(
XMLNode nonza, XMLNode nonza,
@ -23,6 +26,13 @@ class Bind2Negotiator extends Sasl2FeatureNegotiator {
XMLNode.xmlns( XMLNode.xmlns(
tag: 'bind', tag: 'bind',
xmlns: bind2Xmlns, xmlns: bind2Xmlns,
children: [
if (tag != null)
XMLNode(
tag: 'tag',
text: tag,
),
],
), ),
]; ];
} }

View File

@ -78,4 +78,77 @@ void main() {
expect(result.isType<NegotiatorError>(), false); expect(result.isType<NegotiatorError>(), false);
expect(conn.resource, 'random.resource'); expect(conn.resource, 'random.resource');
}); });
test('Test simple Bind2 negotiation with a provided tag', () async {
final fakeSocket = StubTCPSocket([
StringExpectation(
"<stream:stream xmlns='jabber:client' version='1.0' xmlns:stream='http://etherx.jabber.org/streams' to='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>
<bind xmlns="urn:xmpp:bind:0" />
</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><bind xmlns='urn:xmpp:bind:0'><tag>moxxmpp</tag></bind></authenticate>",
'''
<success xmlns='urn:xmpp:sasl:2'>
<authorization-identifier>polynomdivision@test.server/moxxmpp.random.resource</authorization-identifier>
</success>
''',
),
]);
final conn = XmppConnection(
TestingReconnectionPolicy(),
AlwaysConnectedConnectivityManager(),
fakeSocket,
)..setConnectionSettings(
ConnectionSettings(
jid: JID.fromString('polynomdivision@test.server'),
password: 'aaaa',
useDirectTLS: true,
),
);
await conn.registerManagers([
RosterManager(TestingRosterStateManager('', [])),
DiscoManager([]),
]);
await conn.registerFeatureNegotiators([
SaslPlainNegotiator(),
ResourceBindingNegotiator(),
Bind2Negotiator()
..tag = 'moxxmpp',
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.resource, 'moxxmpp.random.resource');
});
} }