feat(tests): Add an integration test for SASL2

This commit is contained in:
2023-04-02 17:20:14 +02:00
parent 29f0419154
commit d977a74446
16 changed files with 318 additions and 14 deletions

View File

@@ -0,0 +1,43 @@
import 'package:moxxmpp/moxxmpp.dart';
import 'package:moxxmpp_socket_tcp/moxxmpp_socket_tcp.dart';
import 'package:test/test.dart';
void main() async {
final conn = XmppConnection(
TestingReconnectionPolicy(),
AlwaysConnectedConnectivityManager(),
TCPSocketWrapper(),
)..setConnectionSettings(
ConnectionSettings(
jid: JID.fromString('testuser@localhost'),
password: 'abc123',
useDirectTLS: false,
),
);
final csi = CSIManager();
await csi.setInactive(sendNonza: false);
await conn.registerManagers([
RosterManager(TestingRosterStateManager('', [])),
DiscoManager([]),
]);
await conn.registerFeatureNegotiators([
SaslPlainNegotiator(),
ResourceBindingNegotiator(),
FASTSaslNegotiator(),
Bind2Negotiator(),
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);
}

View File

@@ -9,6 +9,7 @@ import 'package:moxxmpp/src/connectivity.dart';
import 'package:moxxmpp/src/errors.dart';
import 'package:moxxmpp/src/events.dart';
import 'package:moxxmpp/src/iq.dart';
import 'package:moxxmpp/src/jid.dart';
import 'package:moxxmpp/src/managers/attributes.dart';
import 'package:moxxmpp/src/managers/base.dart';
import 'package:moxxmpp/src/managers/data.dart';
@@ -63,14 +64,15 @@ enum StanzaFromType {
/// Nonza describing the XMPP stream header.
class StreamHeaderNonza extends XMLNode {
StreamHeaderNonza(String serverDomain)
StreamHeaderNonza(JID jid)
: super(
tag: 'stream:stream',
attributes: <String, String>{
'xmlns': stanzaXmlns,
'version': '1.0',
'xmlns:stream': streamXmlns,
'to': serverDomain,
'to': jid.domain,
'from': jid.toBare().toString(),
'xml:lang': 'en',
},
closeTag: false,
@@ -1037,11 +1039,11 @@ class XmppConnection {
_socket.write(
XMLNode(
tag: 'xml',
attributes: <String, String>{'version': '1.0'},
attributes: {'version': '1.0'},
closeTag: false,
isDeclaration: true,
children: [
StreamHeaderNonza(_connectionSettings.jid.domain),
StreamHeaderNonza(_connectionSettings.jid),
],
).toXml(),
);
@@ -1156,13 +1158,16 @@ class XmppConnection {
}
final smManager = getStreamManagementManager();
String? host;
int? port;
String? host = _connectionSettings.host;
int? port = _connectionSettings.port;
if (smManager?.state.streamResumptionLocation != null) {
// TODO(Unknown): Maybe wrap this in a try catch?
final parsed = Uri.parse(smManager!.state.streamResumptionLocation!);
host = parsed.host;
port = parsed.port;
} else {
host = _connectionSettings.host;
port = _connectionSettings.port;
}
final result = await _socket.connect(

View File

@@ -8,6 +8,7 @@ import 'package:moxxmpp/src/negotiators/sasl/nonza.dart';
import 'package:moxxmpp/src/negotiators/sasl2.dart';
import 'package:moxxmpp/src/stringxml.dart';
import 'package:moxxmpp/src/types/result.dart';
import 'package:saslprep/saslprep.dart';
class SaslPlainAuthNonza extends SaslAuthNonza {
SaslPlainAuthNonza(String data)
@@ -86,8 +87,9 @@ class SaslPlainNegotiator extends Sasl2AuthenticationNegotiator {
@override
Future<String> getRawStep(String input) async {
final settings = attributes.getConnectionSettings();
final prep = Saslprep.saslprep(settings.password);
return base64.encode(
utf8.encode('\u0000${settings.jid.local}\u0000${settings.password}'),
utf8.encode('\u0000${settings.jid.local}\u0000${prep}'),
);
}

View File

@@ -1,3 +1,4 @@
import 'dart:convert';
import 'package:moxxmpp/src/jid.dart';
import 'package:moxxmpp/src/namespaces.dart';
import 'package:moxxmpp/src/negotiators/namespaces.dart';
@@ -245,7 +246,6 @@ class Sasl2Negotiator extends XmppFeatureNegotiatorBase {
attributes.sendNonza(authenticate);
return const Result(NegotiatorState.ready);
case Sasl2State.authenticateSent:
// TODO(PapaTutuWawa): Handle failure
if (nonza.tag == 'success') {
// Tell the dependent negotiators about the result
final negotiators = _featureNegotiators

View File

@@ -5,8 +5,13 @@ class ConnectionSettings {
required this.jid,
required this.password,
required this.useDirectTLS,
this.host,
this.port,
});
final JID jid;
final String password;
final bool useDirectTLS;
final String? host;
final int? port;
}

View File

@@ -243,6 +243,8 @@ class TCPSocketWrapper extends BaseSocketWrapper {
if (await _hostPortConnect(host, port)) {
_setupStreams();
return true;
} else {
return false;
}
}