From 505a32116e464cc5dc6b1b642d606210acbe2d8d Mon Sep 17 00:00:00 2001 From: gkc Date: Thu, 21 Mar 2024 10:20:10 +0000 Subject: [PATCH 1/8] feat: npt: use different session keys for each socket pair --- .../noports_core/lib/src/srv/srv_impl.dart | 197 +++++++++++------- packages/dart/noports_core/pubspec.yaml | 2 + packages/dart/sshnoports/pubspec.lock | 7 +- packages/dart/sshnoports/pubspec.yaml | 2 + packages/dart/sshnp_flutter/pubspec.lock | 9 +- 5 files changed, 128 insertions(+), 89 deletions(-) diff --git a/packages/dart/noports_core/lib/src/srv/srv_impl.dart b/packages/dart/noports_core/lib/src/srv/srv_impl.dart index 21affeffe..457d2cbed 100644 --- a/packages/dart/noports_core/lib/src/srv/srv_impl.dart +++ b/packages/dart/noports_core/lib/src/srv/srv_impl.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; +import 'package:at_chops/at_chops.dart'; import 'package:at_utils/at_utils.dart'; import 'package:cryptography/cryptography.dart'; import 'package:cryptography/dart.dart'; @@ -348,69 +349,64 @@ class SrvImplDart implements Srv { } } - @override - Future run() async { - DataTransformer? encrypter; - DataTransformer? decrypter; - - if (sessionAESKeyString != null && sessionIVString != null) { - final DartAesCtr algorithm = DartAesCtr.with256bits( - macAlgorithm: Hmac.sha256(), + DataTransformer createEncrypter(String aesKeyBase64, String ivBase64) { + final DartAesCtr algorithm = DartAesCtr.with256bits( + macAlgorithm: Hmac.sha256(), + ); + final SecretKey sessionAESKey = SecretKey(base64Decode(aesKeyBase64)); + final List sessionIV = base64Decode(ivBase64); + + return (Stream> stream) { + return algorithm.encryptStream( + stream, + secretKey: sessionAESKey, + nonce: sessionIV, + onMac: (mac) {}, ); - final SecretKey sessionAESKey = - SecretKey(base64Decode(sessionAESKeyString!)); - final List sessionIV = base64Decode(sessionIVString!); + }; + } - encrypter = (Stream> stream) { - return algorithm.encryptStream( - stream, - secretKey: sessionAESKey, - nonce: sessionIV, - onMac: (mac) {}, - ); - }; - decrypter = (Stream> stream) { - return algorithm.decryptStream( - stream, - secretKey: sessionAESKey, - nonce: sessionIV, - mac: Mac.empty, - ); - }; - } + DataTransformer createDecrypter(String aesKeyBase64, String ivBase64) { + final DartAesCtr algorithm = DartAesCtr.with256bits( + macAlgorithm: Hmac.sha256(), + ); + final SecretKey sessionAESKey = SecretKey(base64Decode(aesKeyBase64)); + final List sessionIV = base64Decode(ivBase64); + + return (Stream> stream) { + return algorithm.decryptStream( + stream, + secretKey: sessionAESKey, + nonce: sessionIV, + mac: Mac.empty, + ); + }; + } + @override + Future run() async { try { var hosts = await InternetAddress.lookup(streamingHost); late SocketConnector sc; if (bindLocalPort) { if (multi) { - sc = await _runClientSideMulti( - hosts: hosts, - encrypter: encrypter, - decrypter: decrypter, - ); + if (sessionAESKeyString == null || sessionIVString == null) { + throw ArgumentError('Symmetric session encryption key required'); + } + sc = await _runClientSideMulti(hosts: hosts); } else { - sc = await _runClientSideSingle( - hosts: hosts, - encrypter: encrypter, - decrypter: decrypter, - ); + sc = await _runClientSideSingle(hosts: hosts); } } else { // daemon side if (multi) { - sc = await _runDaemonSideMulti( - hosts: hosts, - encrypter: encrypter, - decrypter: decrypter, - ); + if (sessionAESKeyString == null || sessionIVString == null) { + throw ArgumentError('Symmetric session encryption key required'); + } + sc = await _runDaemonSideMulti(hosts: hosts); } else { - sc = await _runDaemonSideSingle( - hosts: hosts, - encrypter: encrypter, - decrypter: decrypter, - ); + sc = await _runDaemonSideSingle(hosts: hosts); } } @@ -433,9 +429,13 @@ class SrvImplDart implements Srv { Future _runClientSideSingle({ required List hosts, - required DataTransformer? encrypter, - required DataTransformer? decrypter, }) async { + DataTransformer? encrypter; + DataTransformer? decrypter; + if (sessionAESKeyString != null && sessionIVString != null) { + encrypter = createEncrypter(sessionAESKeyString!, sessionIVString!); + decrypter = createDecrypter(sessionAESKeyString!, sessionIVString!); + } // client side SocketConnector sc = await SocketConnector.serverToSocket( portA: localPort, @@ -460,81 +460,109 @@ class SrvImplDart implements Srv { Future _runClientSideMulti({ required List hosts, - required DataTransformer? encrypter, - required DataTransformer? decrypter, }) async { // client side - SocketConnector? sc; + SocketConnector? socketConnector; - Socket controlSocket = await Socket.connect(streamingHost, streamingPort, + Socket sessionControlSocket = await Socket.connect( + streamingHost, streamingPort, timeout: Duration(seconds: 1)); // Authenticate the control socket if (rvdAuthString != null) { logger.info( '_runClientSideMulti authenticating control socket connection to rvd'); - controlSocket.writeln(rvdAuthString); + sessionControlSocket.writeln(rvdAuthString); } - controlSocket.listen((event) { + DataTransformer controlEncrypter = + createEncrypter(sessionAESKeyString!, sessionIVString!); + DataTransformer controlDecrypter = + createDecrypter(sessionAESKeyString!, sessionIVString!); + + // Listen to stream which is decrypting the socket stream + // Write to a stream controller which encrypts and writes to the socket + Stream> controlStream = controlDecrypter(sessionControlSocket); + StreamController controlSink = StreamController(); + controlEncrypter(controlSink.stream).listen(sessionControlSocket.add); + + controlStream.listen((event) { String response = String.fromCharCodes(event).trim(); logger.info( '_runClientSideMulti Received control socket response: [$response]'); }, onError: (e) { logger.severe('_runClientSideMulti controlSocket error: $e'); - sc?.close(); + socketConnector?.close(); }, onDone: () { logger.info('_runClientSideMulti controlSocket done'); - sc?.close(); + socketConnector?.close(); }); - sc = await SocketConnector.serverToSocket( + socketConnector = await SocketConnector.serverToSocket( portA: localPort, addressB: hosts[0], portB: streamingPort, verbose: false, - transformAtoB: encrypter, - transformBtoA: decrypter, multi: multi, - onConnect: (Socket sideA, Socket sideB) { + beforeJoining: (Side sideA, Side sideB) { // For some bizarro reason, we can't write to stderr in this callback // when the Srv has been started via SrvImplExec. Thus it is very // important that the srv binary never have a logger root level of // anything below 'warning' logger.info('_runClientSideMulti Sending connect request'); - controlSocket.writeln('connect'); + + String socketAESKey = + AtChopsUtil.generateSymmetricKey(EncryptionKeyType.aes256).key; + String socketIV = + base64Encode(AtChopsUtil.generateRandomIV(16).ivBytes); + controlSink.add( + Uint8List.fromList('connect:$socketAESKey:$socketIV'.codeUnits)); // Authenticate the sideB socket (to the rvd) if (rvdAuthString != null) { logger .info('_runClientSideMulti authenticating new connection to rvd'); - sideB.writeln(rvdAuthString); + sideB.socket.writeln(rvdAuthString); } + sideA.transformer = createEncrypter(socketAESKey, socketIV); + sideB.transformer = createDecrypter(socketAESKey, socketIV); }, ); // upon socketConnector.done, destroy the control socket, and complete - unawaited(sc.done.whenComplete(() { + unawaited(socketConnector.done.whenComplete(() { logger.info('_runClientSideMulti sc.done'); - controlSocket.destroy(); + sessionControlSocket.destroy(); })); - return sc; + return socketConnector; } Future _runDaemonSideMulti({ required List hosts, - required DataTransformer? encrypter, - required DataTransformer? decrypter, }) async { SocketConnector sc = SocketConnector(); // - create control socket and listen for requests // - for each request, create a socketToSocket connection - Socket controlSocket = await Socket.connect(streamingHost, streamingPort, + Socket sessionControlSocket = await Socket.connect( + streamingHost, streamingPort, timeout: Duration(seconds: 1)); + // Authenticate the control socket if (rvdAuthString != null) { - logger.info('authenticating control socket connection to rvd'); - controlSocket.writeln(rvdAuthString); + logger.info( + '_runClientSideMulti authenticating control socket connection to rvd'); + sessionControlSocket.writeln(rvdAuthString); } - controlSocket.listen((event) async { + DataTransformer controlEncrypter = + createEncrypter(sessionAESKeyString!, sessionIVString!); + DataTransformer controlDecrypter = + createDecrypter(sessionAESKeyString!, sessionIVString!); + + // Listen to stream which is decrypting the socket stream + // Write to a stream controller which encrypts and writes to the socket + Stream> controlStream = controlDecrypter(sessionControlSocket); + StreamController controlSink = StreamController(); + controlEncrypter(controlSink.stream).listen(sessionControlSocket.add); + + controlStream.listen((event) async { if (event.isEmpty) { logger.info('Empty control message (Uint8List) received'); return; @@ -544,9 +572,14 @@ class SrvImplDart implements Srv { logger.info('Empty control message (String) received'); return; } - switch (request) { + List args = request.split(":"); + switch (args.first) { case 'connect': - logger.info('Control socket received request: [$request];' + if (args.length != 3) { + logger.severe('Unknown request to control socket: [$request]'); + return; + } + logger.info('Control socket received ${args.first} request - ' ' creating new socketToSocket connection'); await SocketConnector.socketToSocket( connector: sc, @@ -556,8 +589,8 @@ class SrvImplDart implements Srv { addressB: hosts[0], portB: streamingPort, verbose: false, - transformAtoB: encrypter, - transformBtoA: decrypter); + transformAtoB: createEncrypter(args[1], args[2]), + transformBtoA: createDecrypter(args[1], args[2])); if (rvdAuthString != null) { stderr.writeln('authenticating new socket connection to rvd'); sc.connections.last.sideB.socket.writeln(rvdAuthString); @@ -577,7 +610,7 @@ class SrvImplDart implements Srv { // upon socketConnector.done, destroy the control socket, and complete unawaited(sc.done.whenComplete(() { - controlSocket.destroy(); + sessionControlSocket.destroy(); })); return sc; @@ -585,9 +618,13 @@ class SrvImplDart implements Srv { Future _runDaemonSideSingle({ required List hosts, - required DataTransformer? encrypter, - required DataTransformer? decrypter, }) async { + DataTransformer? encrypter; + DataTransformer? decrypter; + if (sessionAESKeyString != null && sessionIVString != null) { + encrypter = createEncrypter(sessionAESKeyString!, sessionIVString!); + decrypter = createDecrypter(sessionAESKeyString!, sessionIVString!); + } SocketConnector socketConnector = await SocketConnector.socketToSocket( addressA: (await InternetAddress.lookup(localHost ?? 'localhost'))[0], portA: localPort, diff --git a/packages/dart/noports_core/pubspec.yaml b/packages/dart/noports_core/pubspec.yaml index d85de93ee..240313ab4 100644 --- a/packages/dart/noports_core/pubspec.yaml +++ b/packages/dart/noports_core/pubspec.yaml @@ -25,6 +25,8 @@ dependencies: uuid: ^3.0.7 dependency_overrides: + socket_connector: + path: /Users/gary/dev/atsign/repos/socket_connector args: git: ref: gkc/show-aliases-in-usage diff --git a/packages/dart/sshnoports/pubspec.lock b/packages/dart/sshnoports/pubspec.lock index 836f02c75..a3bb94e48 100644 --- a/packages/dart/sshnoports/pubspec.lock +++ b/packages/dart/sshnoports/pubspec.lock @@ -716,10 +716,9 @@ packages: socket_connector: dependency: "direct main" description: - name: socket_connector - sha256: a614741652395393bc8e06987a0569bac116b2112645cc846015949dcf66aebd - url: "https://pub.dev" - source: hosted + path: "/Users/gary/dev/atsign/repos/socket_connector" + relative: false + source: path version: "2.1.0" source_map_stack_trace: dependency: transitive diff --git a/packages/dart/sshnoports/pubspec.yaml b/packages/dart/sshnoports/pubspec.yaml index 442ffe8e6..3920c8f49 100644 --- a/packages/dart/sshnoports/pubspec.yaml +++ b/packages/dart/sshnoports/pubspec.yaml @@ -16,6 +16,8 @@ dependencies: at_utils: 3.0.16 dependency_overrides: + socket_connector: + path: /Users/gary/dev/atsign/repos/socket_connector args: git: ref: gkc/show-aliases-in-usage diff --git a/packages/dart/sshnp_flutter/pubspec.lock b/packages/dart/sshnp_flutter/pubspec.lock index 056d0d564..7dc28c5a6 100644 --- a/packages/dart/sshnp_flutter/pubspec.lock +++ b/packages/dart/sshnp_flutter/pubspec.lock @@ -792,11 +792,10 @@ packages: noports_core: dependency: "direct main" description: - name: noports_core - sha256: "616afc599117dd9881aaf59893cbaacf1234a4e2e16e415e3a08b2d4b45eac05" - url: "https://pub.dev" - source: hosted - version: "6.0.2" + path: "../noports_core" + relative: true + source: path + version: "6.0.5" openssh_ed25519: dependency: transitive description: From 883afee220b267864f3793060f6427efaf91d982 Mon Sep 17 00:00:00 2001 From: gkc Date: Thu, 21 Mar 2024 11:20:42 +0000 Subject: [PATCH 2/8] chore: fixed typo in log message --- packages/dart/noports_core/lib/src/srv/srv_impl.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/dart/noports_core/lib/src/srv/srv_impl.dart b/packages/dart/noports_core/lib/src/srv/srv_impl.dart index 457d2cbed..d590ed4fe 100644 --- a/packages/dart/noports_core/lib/src/srv/srv_impl.dart +++ b/packages/dart/noports_core/lib/src/srv/srv_impl.dart @@ -548,7 +548,7 @@ class SrvImplDart implements Srv { // Authenticate the control socket if (rvdAuthString != null) { logger.info( - '_runClientSideMulti authenticating control socket connection to rvd'); + '_runDaemonSideMulti authenticating control socket connection to rvd'); sessionControlSocket.writeln(rvdAuthString); } DataTransformer controlEncrypter = From e445dc946e156dd54ef9feced5241207f2edfb85 Mon Sep 17 00:00:00 2001 From: gkc Date: Thu, 21 Mar 2024 11:21:13 +0000 Subject: [PATCH 3/8] build: sshnoports: added at_cli_commons dependency (required by npt binary) --- packages/dart/sshnoports/pubspec.lock | 8 ++++++++ packages/dart/sshnoports/pubspec.yaml | 1 + 2 files changed, 9 insertions(+) diff --git a/packages/dart/sshnoports/pubspec.lock b/packages/dart/sshnoports/pubspec.lock index a3bb94e48..b83ea7c88 100644 --- a/packages/dart/sshnoports/pubspec.lock +++ b/packages/dart/sshnoports/pubspec.lock @@ -74,6 +74,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.0" + at_cli_commons: + dependency: "direct main" + description: + name: at_cli_commons + sha256: "9165a0547ee36024f5d013cbb455197ef6f1f8a2c93620b1c49cb2eeead92157" + url: "https://pub.dev" + source: hosted + version: "1.0.4" at_client: dependency: transitive description: diff --git a/packages/dart/sshnoports/pubspec.yaml b/packages/dart/sshnoports/pubspec.yaml index 3920c8f49..c2d3fcc9b 100644 --- a/packages/dart/sshnoports/pubspec.yaml +++ b/packages/dart/sshnoports/pubspec.yaml @@ -10,6 +10,7 @@ dependencies: noports_core: path: "../noports_core" at_onboarding_cli: 1.4.3 + at_cli_commons: ^1.0.4 args: 2.4.2 socket_connector: ^2.1.0 dartssh2: 2.8.2 From d9bd6a9b7d926870dfa0cbe7fc2fa4b07fab044c Mon Sep 17 00:00:00 2001 From: gkc Date: Thu, 21 Mar 2024 13:10:43 +0000 Subject: [PATCH 4/8] chore: fixed lint, ran melos bootstrap --- packages/dart/noports_core/lib/src/srv/srv_impl.dart | 4 ++-- packages/dart/sshnoports/lib/src/version.dart | 2 +- packages/dart/sshnoports/pubspec.lock | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/dart/noports_core/lib/src/srv/srv_impl.dart b/packages/dart/noports_core/lib/src/srv/srv_impl.dart index d590ed4fe..c265fc1e7 100644 --- a/packages/dart/noports_core/lib/src/srv/srv_impl.dart +++ b/packages/dart/noports_core/lib/src/srv/srv_impl.dart @@ -445,12 +445,12 @@ class SrvImplDart implements Srv { transformAtoB: encrypter, transformBtoA: decrypter, multi: multi, - onConnect: (Socket sideA, Socket sideB) async { + beforeJoining: (Side sideA, Side sideB) async { // Authenticate the sideB socket (to the rvd) if (rvdAuthString != null) { logger.info( '_runClientSideSingle authenticating new connection to rvd'); - sideB.writeln(rvdAuthString); + sideB.socket.writeln(rvdAuthString); } }, ); diff --git a/packages/dart/sshnoports/lib/src/version.dart b/packages/dart/sshnoports/lib/src/version.dart index 92869f2ba..d603e0da8 100644 --- a/packages/dart/sshnoports/lib/src/version.dart +++ b/packages/dart/sshnoports/lib/src/version.dart @@ -1,2 +1,2 @@ // Generated code. Do not modify. -const packageVersion = '5.2.0'; +const packageVersion = '5.1.0'; diff --git a/packages/dart/sshnoports/pubspec.lock b/packages/dart/sshnoports/pubspec.lock index e6e763800..608d2645f 100644 --- a/packages/dart/sshnoports/pubspec.lock +++ b/packages/dart/sshnoports/pubspec.lock @@ -719,7 +719,7 @@ packages: path: "/Users/gary/dev/atsign/repos/socket_connector" relative: false source: path - version: "2.1.0" + version: "2.2.0" source_map_stack_trace: dependency: transitive description: From 7f80cbe9ad5cac52d7e91bfb0ea0e3343507a14b Mon Sep 17 00:00:00 2001 From: gkc Date: Thu, 21 Mar 2024 13:15:10 +0000 Subject: [PATCH 5/8] build: updated socket_connector dependency to a socket_connector branch. Temporary, until it has been published --- packages/dart/noports_core/pubspec.yaml | 4 +++- packages/dart/sshnoports/pubspec.lock | 8 +++++--- packages/dart/sshnoports/pubspec.yaml | 4 +++- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/dart/noports_core/pubspec.yaml b/packages/dart/noports_core/pubspec.yaml index 3cc7aaaeb..08983a61a 100644 --- a/packages/dart/noports_core/pubspec.yaml +++ b/packages/dart/noports_core/pubspec.yaml @@ -26,7 +26,9 @@ dependencies: dependency_overrides: socket_connector: - path: /Users/gary/dev/atsign/repos/socket_connector + git: + ref: gkc/enhance-server-to-socket + url: https://github.com/atsign-foundation/socket_connector args: git: ref: gkc/show-aliases-in-usage diff --git a/packages/dart/sshnoports/pubspec.lock b/packages/dart/sshnoports/pubspec.lock index 608d2645f..1f233e22b 100644 --- a/packages/dart/sshnoports/pubspec.lock +++ b/packages/dart/sshnoports/pubspec.lock @@ -716,9 +716,11 @@ packages: socket_connector: dependency: "direct main" description: - path: "/Users/gary/dev/atsign/repos/socket_connector" - relative: false - source: path + path: "." + ref: "gkc/enhance-server-to-socket" + resolved-ref: "88fddf55787a25f085f4d56b8eff5db3108df800" + url: "https://github.com/atsign-foundation/socket_connector" + source: git version: "2.2.0" source_map_stack_trace: dependency: transitive diff --git a/packages/dart/sshnoports/pubspec.yaml b/packages/dart/sshnoports/pubspec.yaml index dc09deaf9..f694db415 100644 --- a/packages/dart/sshnoports/pubspec.yaml +++ b/packages/dart/sshnoports/pubspec.yaml @@ -18,7 +18,9 @@ dependencies: dependency_overrides: socket_connector: - path: /Users/gary/dev/atsign/repos/socket_connector + git: + ref: gkc/enhance-server-to-socket + url: https://github.com/atsign-foundation/socket_connector args: git: ref: gkc/show-aliases-in-usage From e51bd80f339214fbdc10811f3f64129131958cdb Mon Sep 17 00:00:00 2001 From: gkc Date: Thu, 21 Mar 2024 13:43:43 +0000 Subject: [PATCH 6/8] test: e2e_all: Made the cleanup safer --- .../scripts/common/cleanup_tmp_files.sh | 15 ++++++++++++--- tests/e2e_all/scripts/main.sh | 18 ++++++++---------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/tests/e2e_all/scripts/common/cleanup_tmp_files.sh b/tests/e2e_all/scripts/common/cleanup_tmp_files.sh index 5e44c8ea8..d1b752ea2 100755 --- a/tests/e2e_all/scripts/common/cleanup_tmp_files.sh +++ b/tests/e2e_all/scripts/common/cleanup_tmp_files.sh @@ -14,10 +14,19 @@ localLogInfo() { if [[ "$silent" == "true" ]]; then return; fi logInfo "$1" } + +safeRemoveDir() { + dirToRemove="$1" + if grep -q "e2e_all/runtime" <<< "$dirToRemove" || grep -q "e2e_all/${commitId}" <<< "$dirToRemove" + then + localLogInfo "rm -rf ${dirToRemove:fubar}" + rm -rf "${dirToRemove:fubar}" + fi +} echo localLogInfo "" localLogInfo "Cleaning up" -outputDir=$(getOutputDir) -localLogInfo "rm -rf ${outputDir}" -rm -rf "${outputDir}" +safeRemoveDir "$(getOutputDir)" + +safeRemoveDir "$testRuntimeDir" diff --git a/tests/e2e_all/scripts/main.sh b/tests/e2e_all/scripts/main.sh index 375f7e474..3596ff8f9 100755 --- a/tests/e2e_all/scripts/main.sh +++ b/tests/e2e_all/scripts/main.sh @@ -159,8 +159,6 @@ cd "$commitId" || exit 1 # should now be in /tests/e2e_all/runtime/$c testRuntimeDir="$(pwd)" export testRuntimeDir -"$testScriptsDir/common/cleanup_tmp_files.sh" -s - logInfo " --> will execute setup_binaries, start_daemons and tests [$testsToRun] with " logInfo " testRootDir: $testRootDir" logInfo " testRuntimeDir: $testRuntimeDir" @@ -223,19 +221,19 @@ restoreAuthorizedKeys reportFile=$(getReportFile) -logInfo "" -logInfo "Tests completed. Report follows. (Can also be found at ${reportFile}) : " -echo -cat "$reportFile" -logInfo "" -logInfo "" - echo logInfo "Calling common/cleanup_tmp_files.sh" "$testScriptsDir/common/cleanup_tmp_files.sh" retCode=$? if test "$retCode" != 0; then - logError "cleanup_tmp_files failed with exit status $retCode" + log "cleanup_tmp_files failed with exit status $retCode" fi +logInfo "" +logInfo "Tests completed. Report follows. (Can also be found at ${reportFile}) : " +echo +cat "$reportFile" +logInfo "" +logInfo "" + exit $testExitStatus From 7fa8c74b5ffde649fbec5fbd63f39586c4577306 Mon Sep 17 00:00:00 2001 From: gkc Date: Thu, 21 Mar 2024 13:47:04 +0000 Subject: [PATCH 7/8] test: e2e_all: Made the cleanup safer --- tests/e2e_all/scripts/common/cleanup_tmp_files.sh | 2 -- tests/e2e_all/scripts/main.sh | 2 ++ 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/e2e_all/scripts/common/cleanup_tmp_files.sh b/tests/e2e_all/scripts/common/cleanup_tmp_files.sh index d1b752ea2..ff3bf4381 100755 --- a/tests/e2e_all/scripts/common/cleanup_tmp_files.sh +++ b/tests/e2e_all/scripts/common/cleanup_tmp_files.sh @@ -28,5 +28,3 @@ localLogInfo "" localLogInfo "Cleaning up" safeRemoveDir "$(getOutputDir)" - -safeRemoveDir "$testRuntimeDir" diff --git a/tests/e2e_all/scripts/main.sh b/tests/e2e_all/scripts/main.sh index 3596ff8f9..6c649a1b7 100755 --- a/tests/e2e_all/scripts/main.sh +++ b/tests/e2e_all/scripts/main.sh @@ -159,6 +159,8 @@ cd "$commitId" || exit 1 # should now be in /tests/e2e_all/runtime/$c testRuntimeDir="$(pwd)" export testRuntimeDir +"$testScriptsDir/common/cleanup_tmp_files.sh" -s + logInfo " --> will execute setup_binaries, start_daemons and tests [$testsToRun] with " logInfo " testRootDir: $testRootDir" logInfo " testRuntimeDir: $testRuntimeDir" From b8c876a64d8a4fd0f60b27893dbf1a248239368b Mon Sep 17 00:00:00 2001 From: gkc Date: Thu, 21 Mar 2024 15:24:26 +0000 Subject: [PATCH 8/8] test: added end-to-end test for npt build: upgraded at_cli_commons dependency to 1.0.5 --- packages/dart/noports_core/pubspec.yaml | 6 +- packages/dart/sshnoports/bin/npt.dart | 7 +-- packages/dart/sshnoports/pubspec.lock | 13 ++-- packages/dart/sshnoports/pubspec.yaml | 8 +-- packages/dart/sshnp_flutter/pubspec.lock | 4 +- .../common/common_functions.include.sh | 11 ++++ tests/e2e_all/scripts/tests/npt_to_port_22 | 63 +++++++++++++++++++ tests/e2e_all/scripts/tests/shared/sshnp | 2 - 8 files changed, 88 insertions(+), 26 deletions(-) create mode 100755 tests/e2e_all/scripts/tests/npt_to_port_22 diff --git a/packages/dart/noports_core/pubspec.yaml b/packages/dart/noports_core/pubspec.yaml index 08983a61a..436494e3e 100644 --- a/packages/dart/noports_core/pubspec.yaml +++ b/packages/dart/noports_core/pubspec.yaml @@ -21,14 +21,10 @@ dependencies: openssh_ed25519: ^1.1.0 path: ^1.9.0 posix: ^6.0.1 - socket_connector: ^2.1.0 + socket_connector: ^2.2.0 uuid: ^3.0.7 dependency_overrides: - socket_connector: - git: - ref: gkc/enhance-server-to-socket - url: https://github.com/atsign-foundation/socket_connector args: git: ref: gkc/show-aliases-in-usage diff --git a/packages/dart/sshnoports/bin/npt.dart b/packages/dart/sshnoports/bin/npt.dart index 18535ecd9..10e765b55 100644 --- a/packages/dart/sshnoports/bin/npt.dart +++ b/packages/dart/sshnoports/bin/npt.dart @@ -11,7 +11,6 @@ import 'package:at_utils/at_logger.dart'; import 'package:at_cli_commons/at_cli_commons.dart' as cli; import 'package:noports_core/npt.dart'; import 'package:noports_core/sshnp_foundation.dart'; -import 'package:sshnoports/src/extended_arg_parser.dart'; // local packages import 'package:sshnoports/src/print_version.dart'; @@ -144,13 +143,13 @@ void main(List args) async { defaultsTo: false, negatable: false, help: 'Print usage'); parser.addFlag( - outputExecutionCommandFlag, + 'exit-when-connected', abbr: 'x', help: 'Instead of running the srv in the same process,' ' fork the srv,' ' print the local port to stdout,' ' and exit this program.', - defaultsTo: DefaultExtendedArgs.outputExecutionCommand, + defaultsTo: false, negatable: false, ); @@ -171,7 +170,7 @@ void main(List args) async { String rootDomain = parsedArgs['root-domain']; perSessionStorage = parsedArgs['per-session-storage']; int localPort = int.parse(parsedArgs['local-port']); - bool inline = !parsedArgs[outputExecutionCommandFlag]; + bool inline = !parsedArgs['exit-when-connected']; // Windows will not let us delete files in use so // We will point storage to temp directory and let OS clean up diff --git a/packages/dart/sshnoports/pubspec.lock b/packages/dart/sshnoports/pubspec.lock index 1f233e22b..75fbcb817 100644 --- a/packages/dart/sshnoports/pubspec.lock +++ b/packages/dart/sshnoports/pubspec.lock @@ -78,10 +78,10 @@ packages: dependency: "direct main" description: name: at_cli_commons - sha256: "9165a0547ee36024f5d013cbb455197ef6f1f8a2c93620b1c49cb2eeead92157" + sha256: "6360c1a05a358240e7ffb264e9ae089a95db0367f4ae3649c30c18763c398ea0" url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" at_client: dependency: transitive description: @@ -716,11 +716,10 @@ packages: socket_connector: dependency: "direct main" description: - path: "." - ref: "gkc/enhance-server-to-socket" - resolved-ref: "88fddf55787a25f085f4d56b8eff5db3108df800" - url: "https://github.com/atsign-foundation/socket_connector" - source: git + name: socket_connector + sha256: "3c641546699aa58e9ab8be9841627a30af3c1ffcf4461ca5d00d7c56392ab63a" + url: "https://pub.dev" + source: hosted version: "2.2.0" source_map_stack_trace: dependency: transitive diff --git a/packages/dart/sshnoports/pubspec.yaml b/packages/dart/sshnoports/pubspec.yaml index f694db415..e34c93a8f 100644 --- a/packages/dart/sshnoports/pubspec.yaml +++ b/packages/dart/sshnoports/pubspec.yaml @@ -10,17 +10,13 @@ dependencies: noports_core: path: "../noports_core" at_onboarding_cli: 1.4.3 - at_cli_commons: ^1.0.4 + at_cli_commons: ^1.0.5 args: 2.4.2 - socket_connector: ^2.1.0 + socket_connector: ^2.2.0 dartssh2: 2.8.2 at_utils: 3.0.16 dependency_overrides: - socket_connector: - git: - ref: gkc/enhance-server-to-socket - url: https://github.com/atsign-foundation/socket_connector args: git: ref: gkc/show-aliases-in-usage diff --git a/packages/dart/sshnp_flutter/pubspec.lock b/packages/dart/sshnp_flutter/pubspec.lock index d667e5a5c..4080ec919 100644 --- a/packages/dart/sshnp_flutter/pubspec.lock +++ b/packages/dart/sshnp_flutter/pubspec.lock @@ -1149,10 +1149,10 @@ packages: dependency: "direct main" description: name: socket_connector - sha256: a614741652395393bc8e06987a0569bac116b2112645cc846015949dcf66aebd + sha256: "3c641546699aa58e9ab8be9841627a30af3c1ffcf4461ca5d00d7c56392ab63a" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.2.0" source_span: dependency: transitive description: diff --git a/tests/e2e_all/scripts/common/common_functions.include.sh b/tests/e2e_all/scripts/common/common_functions.include.sh index e7cde55eb..82b202821 100644 --- a/tests/e2e_all/scripts/common/common_functions.include.sh +++ b/tests/e2e_all/scripts/common/common_functions.include.sh @@ -19,6 +19,17 @@ getBaseSshnpCommand() { echo "$l1" "$l2" "$l3" } +getBaseNptCommand() { + if (( $# != 1 )); then + logErrorAndExit "getBaseNptCommand requires 1 argument (clientBinaryPath)" + fi + clientBinaryPath="$1" + l1="$clientBinaryPath/npt -f $clientAtSign -d $deviceName" + l2=" -t $daemonAtSign -r $srvAtSign" + l3=" --root-domain $atDirectoryHost" + echo "$l1" "$l2" "$l3" +} + getTestSshCommand() { testSshCommand="$1" diff --git a/tests/e2e_all/scripts/tests/npt_to_port_22 b/tests/e2e_all/scripts/tests/npt_to_port_22 new file mode 100755 index 000000000..ac72614fb --- /dev/null +++ b/tests/e2e_all/scripts/tests/npt_to_port_22 @@ -0,0 +1,63 @@ +#!/bin/bash + +scriptName=$(basename -- "$0") + +if test -z "$testScriptsDir" ; then + echo -e " ${RED}check_env: testScriptsDir is not set${NC}" && exit 1 +fi + +source "$testScriptsDir/common/common_functions.include.sh" +source "$testScriptsDir/common/check_env.include.sh" || exit $? + +daemonVersion="$1" +clientVersion="$2" +additionalFlags="--remote-port 22 --exit-when-connected" + +# If client has already been released +# then it has already have been tested against all released daemon versions +# So only test it against the 'current' daemon +# i.e. if client != current and daemon != current then exit 50 + +if ! grep -q "current" <<< "$clientVersion" && ! grep -q "current" <<< "$daemonVersion" ; then + logInfoAndReport " N/A because released client $(getVersionDescription "$clientVersion") has already been tested against released daemon $(getVersionDescription "$daemonVersion")" + exit 50 +fi + +# Require a v5.1+ client to test v5.1+ features +if [[ $(versionIsLessThan "$clientVersion" "d:5.1.0") == "true" ]] \ + || \ + [[ $(versionIsLessThan "$daemonVersion" "d:5.1.0") == "true" ]]; then + logInfoAndReport " N/A because npt requires client and daemon versions >= v5.1.x" + exit 50 # test rig interprets this exit status as 'test was not applicable' +fi + +deviceName=$(getDeviceNameWithFlags "$commitId" "$daemonVersion" ) + +clientBinaryPath=$(getPathToBinariesForTypeAndVersion "$clientVersion") + +baseNptCommand=$(getBaseNptCommand "$clientBinaryPath") + +# Let's put together the npt command we will execute +nptCommand="$baseNptCommand $additionalFlags" + +# 1. Execute the npt command - its output is the port that npt is using +echo "$(iso8601Date) | Executing $nptCommand" | tee -a "$(getReportFile)" +nptPort=$($nptCommand) + +# 2. Check the exit status +nptExitStatus=$? +if (( nptExitStatus != 0 )); then + exit $nptExitStatus +fi + +# 3. Execute an ssh +sshCommand="ssh -p $nptPort -o StrictHostKeyChecking=accept-new -o IdentitiesOnly=yes" +sshCommand="${sshCommand} ${remoteUsername}@localhost -i $identityFilename" + +echo "$(iso8601Date) | Executing $sshCommand" | tee -a "$(getReportFile)" + +# shellcheck disable=SC2091 +$(getTestSshCommand "$sshCommand") + +# 4. Exit with the exit status of the ssh command +exit $? diff --git a/tests/e2e_all/scripts/tests/shared/sshnp b/tests/e2e_all/scripts/tests/shared/sshnp index d06cc820c..71dd9acd7 100755 --- a/tests/e2e_all/scripts/tests/shared/sshnp +++ b/tests/e2e_all/scripts/tests/shared/sshnp @@ -38,10 +38,8 @@ fi additionalSshnpFlags=" --ssh-client ${sshClient}" -# logInfo "Daemon version : $d_type : $d_major.$d_minor.$d_patch" deviceName=$(getDeviceNameWithFlags "$commitId" "$daemonVersion" ) -# logInfo "Client version : $c_type : $c_major.$c_minor.$c_patch" clientBinaryPath=$(getPathToBinariesForTypeAndVersion "$clientVersion") baseSshnpCommand=$(getBaseSshnpCommand "$clientBinaryPath")