feat(tests): Add an integration test for SASL2
This commit is contained in:
43
packages/moxxmpp/integration_tests/sasl2_test.dart
Normal file
43
packages/moxxmpp/integration_tests/sasl2_test.dart
Normal 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);
|
||||
}
|
||||
@@ -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(
|
||||
|
||||
@@ -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}'),
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -243,6 +243,8 @@ class TCPSocketWrapper extends BaseSocketWrapper {
|
||||
if (await _hostPortConnect(host, port)) {
|
||||
_setupStreams();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user