fixed getAuthMethods - had to auth with none first

rename to testChannel in testexec to prevent confusion
stop write(1 in testexec to prevent printing the output
running testexec will disconnect after 3s, but keep result
read non blocking in testexec
added sshstate unused atm
This commit is contained in:
neon443
2025-06-25 11:55:21 +01:00
parent db36c56f29
commit 5d80c69152
4 changed files with 44 additions and 25 deletions

View File

@@ -25,6 +25,7 @@
A95FAA552DF4B62900DE2F5A /* LibSSH.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA502DF4B62100DE2F5A /* LibSSH.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A95FAA552DF4B62900DE2F5A /* LibSSH.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA502DF4B62100DE2F5A /* LibSSH.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
A95FAA562DF4B62A00DE2F5A /* openssl.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA512DF4B62100DE2F5A /* openssl.xcframework */; }; A95FAA562DF4B62A00DE2F5A /* openssl.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA512DF4B62100DE2F5A /* openssl.xcframework */; };
A95FAA572DF4B62A00DE2F5A /* openssl.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA512DF4B62100DE2F5A /* openssl.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; A95FAA572DF4B62A00DE2F5A /* openssl.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = A95FAA512DF4B62100DE2F5A /* openssl.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
A96C6A8A2E0C0B1100F377FE /* SSHState.swift in Sources */ = {isa = PBXBuildFile; fileRef = A96C6A892E0C0B1100F377FE /* SSHState.swift */; };
A98554552E05535F009051BD /* KeyManagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98554542E05535F009051BD /* KeyManagerView.swift */; }; A98554552E05535F009051BD /* KeyManagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98554542E05535F009051BD /* KeyManagerView.swift */; };
A98554592E0553AA009051BD /* KeyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98554582E0553AA009051BD /* KeyManager.swift */; }; A98554592E0553AA009051BD /* KeyManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = A98554582E0553AA009051BD /* KeyManager.swift */; };
A985545D2E055D4D009051BD /* ConnectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A985545C2E055D4D009051BD /* ConnectionView.swift */; }; A985545D2E055D4D009051BD /* ConnectionView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A985545C2E055D4D009051BD /* ConnectionView.swift */; };
@@ -93,6 +94,7 @@
A95FAA5A2DF4B79900DE2F5A /* ci_post_clone.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_post_clone.sh; sourceTree = "<group>"; }; A95FAA5A2DF4B79900DE2F5A /* ci_post_clone.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_post_clone.sh; sourceTree = "<group>"; };
A95FAA5B2DF4B7A000DE2F5A /* ci_pre_xcodebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_pre_xcodebuild.sh; sourceTree = "<group>"; }; A95FAA5B2DF4B7A000DE2F5A /* ci_pre_xcodebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_pre_xcodebuild.sh; sourceTree = "<group>"; };
A95FAA5C2DF4B7A300DE2F5A /* ci_prost_xcodebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_prost_xcodebuild.sh; sourceTree = "<group>"; }; A95FAA5C2DF4B7A300DE2F5A /* ci_prost_xcodebuild.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = ci_prost_xcodebuild.sh; sourceTree = "<group>"; };
A96C6A892E0C0B1100F377FE /* SSHState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SSHState.swift; sourceTree = "<group>"; };
A98554542E05535F009051BD /* KeyManagerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyManagerView.swift; sourceTree = "<group>"; }; A98554542E05535F009051BD /* KeyManagerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyManagerView.swift; sourceTree = "<group>"; };
A98554582E0553AA009051BD /* KeyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyManager.swift; sourceTree = "<group>"; }; A98554582E0553AA009051BD /* KeyManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyManager.swift; sourceTree = "<group>"; };
A985545C2E055D4D009051BD /* ConnectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionView.swift; sourceTree = "<group>"; }; A985545C2E055D4D009051BD /* ConnectionView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConnectionView.swift; sourceTree = "<group>"; };
@@ -225,6 +227,7 @@
children = ( children = (
A9C897EE2DF1A9A400EF9A5F /* SSHHandler.swift */, A9C897EE2DF1A9A400EF9A5F /* SSHHandler.swift */,
A9C4140B2E096DB7005E3047 /* SSHError.swift */, A9C4140B2E096DB7005E3047 /* SSHError.swift */,
A96C6A892E0C0B1100F377FE /* SSHState.swift */,
); );
path = SSH; path = SSH;
sourceTree = "<group>"; sourceTree = "<group>";
@@ -422,6 +425,7 @@
A985545F2E056EDD009051BD /* KeychainLayer.swift in Sources */, A985545F2E056EDD009051BD /* KeychainLayer.swift in Sources */,
A93143C62DF61FE300FCD5DB /* ViewModifiers.swift in Sources */, A93143C62DF61FE300FCD5DB /* ViewModifiers.swift in Sources */,
A98554632E0587DF009051BD /* HostsView.swift in Sources */, A98554632E0587DF009051BD /* HostsView.swift in Sources */,
A96C6A8A2E0C0B1100F377FE /* SSHState.swift in Sources */,
A92538C82DEE0742007E0A18 /* ContentView.swift in Sources */, A92538C82DEE0742007E0A18 /* ContentView.swift in Sources */,
A93143C02DF61B3200FCD5DB /* Host.swift in Sources */, A93143C02DF61B3200FCD5DB /* Host.swift in Sources */,
A9B15A9A2E0ABA0400F66E02 /* DialogView.swift in Sources */, A9B15A9A2E0ABA0400F66E02 /* DialogView.swift in Sources */,

View File

@@ -91,6 +91,7 @@ class SSHHandler: @unchecked Sendable, ObservableObject {
func connect() throws(SSHError) { func connect() throws(SSHError) {
defer { defer {
try? authWithNone()
getAuthMethods() getAuthMethods()
self.host.key = getHostkey() self.host.key = getHostkey()
} }
@@ -169,25 +170,25 @@ class SSHHandler: @unchecked Sendable, ObservableObject {
var buffer: [CChar] = Array(repeating: 0, count: 256) var buffer: [CChar] = Array(repeating: 0, count: 256)
var nbytes: CInt var nbytes: CInt
let channel = ssh_channel_new(session) let testChannel = ssh_channel_new(session)
guard channel != nil else { guard testChannel != nil else {
withAnimation { testSuceeded = false } withAnimation { testSuceeded = false }
return return
} }
status = ssh_channel_open_session(channel) status = ssh_channel_open_session(testChannel)
guard status == SSH_OK else { guard status == SSH_OK else {
ssh_channel_free(channel) ssh_channel_free(testChannel)
logger.critical("session opening error") logger.critical("session opening error")
logSshGetError() logSshGetError()
withAnimation { testSuceeded = false } withAnimation { testSuceeded = false }
return return
} }
status = ssh_channel_request_exec(channel, "uptime") status = ssh_channel_request_exec(testChannel, "uptime")
guard status == SSH_OK else { guard status == SSH_OK else {
ssh_channel_close(channel) ssh_channel_close(testChannel)
ssh_channel_free(channel) ssh_channel_free(testChannel)
logger.critical("session opening error") logger.critical("session opening error")
logSshGetError() logSshGetError()
withAnimation { testSuceeded = false } withAnimation { testSuceeded = false }
@@ -195,36 +196,27 @@ class SSHHandler: @unchecked Sendable, ObservableObject {
} }
nbytes = ssh_channel_read( nbytes = ssh_channel_read(
channel, testChannel,
&buffer, &buffer,
UInt32(buffer.count), UInt32(buffer.count),
0 0
) )
while nbytes > 0 { while nbytes > 0 {
let written = write(1, buffer, Int(nbytes)) nbytes = ssh_channel_read_nonblocking(testChannel, &buffer, UInt32(buffer.count), 0)
guard written == Int(nbytes) else {
ssh_channel_close(channel)
ssh_channel_free(channel)
logger.critical("write error")
logSshGetError()
withAnimation { testSuceeded = false }
return
}
nbytes = ssh_channel_read(channel, &buffer, UInt32(buffer.count), 0)
} }
if nbytes < 0 { if nbytes < 0 {
ssh_channel_close(channel) ssh_channel_close(testChannel)
ssh_channel_free(channel) ssh_channel_free(testChannel)
logger.critical("didnt read?") logger.critical("didnt read?")
logSshGetError() logSshGetError()
withAnimation { testSuceeded = false } withAnimation { testSuceeded = false }
return return
} }
ssh_channel_send_eof(channel) ssh_channel_send_eof(testChannel)
ssh_channel_close(channel) ssh_channel_close(testChannel)
ssh_channel_free(channel) ssh_channel_free(testChannel)
print("testExec succeeded") print("testExec succeeded")
withAnimation { testSuceeded = true } withAnimation { testSuceeded = true }
return return
@@ -339,7 +331,6 @@ class SSHHandler: @unchecked Sendable, ObservableObject {
print(authMethod.0) print(authMethod.0)
} }
} }
print(recievedMethod)
} }
//MARK: shell //MARK: shell

View File

@@ -0,0 +1,17 @@
//
// SSHState.swift
// ShhShell
//
// Created by neon443 on 25/06/2025.
//
import Foundation
enum SSHState {
case idle
case connecting
case authorizing
case authorized
case shellOpen
// case unauthorized
}

View File

@@ -98,7 +98,14 @@ struct ConnectionView: View {
} else { } else {
handler.go() handler.go()
} }
withAnimation { handler.testExec() } handler.testExec()
DispatchQueue.main.asyncAfter(deadline: .now()+3) {
Task {
let result = handler.testSuceeded
await handler.disconnect()
handler.testSuceeded = result
}
}
} label: { } label: {
if let testResult = handler.testSuceeded { if let testResult = handler.testSuceeded {
Image(systemName: testResult ? "checkmark.circle" : "xmark.circle") Image(systemName: testResult ? "checkmark.circle" : "xmark.circle")