#ifndef ORBITHUB_SSH_SESSION_BACKEND_H #define ORBITHUB_SSH_SESSION_BACKEND_H #include "session_backend.h" #include #include #include class SshSessionBackend : public SessionBackend { Q_OBJECT public: explicit SshSessionBackend(const Profile& profile, QObject* parent = nullptr); ~SshSessionBackend() override; public slots: void connectSession(const SessionConnectOptions& options) override; void disconnectSession() override; void reconnectSession(const SessionConnectOptions& options) override; void sendInput(const QString& input) override; void confirmHostKey(bool trustHost) override; private slots: void onProcessStarted(); void onProcessErrorOccurred(QProcess::ProcessError error); void onProcessFinished(int exitCode, QProcess::ExitStatus exitStatus); void onReadyReadStandardOutput(); void onReadyReadStandardError(); void onConnectedProbeTimeout(); private: QProcess* m_process; QTimer* m_connectedProbeTimer; SessionState m_state; bool m_userInitiatedDisconnect; bool m_reconnectPending; SessionConnectOptions m_reconnectOptions; SessionConnectOptions m_activeOptions; QString m_lastRawError; QString m_askPassScriptPath; bool m_waitingForPasswordPrompt; bool m_waitingForHostKeyConfirmation; bool m_passwordSubmitted; void setState(SessionState state, const QString& message); bool startSshProcess(const SessionConnectOptions& options); bool configureAskPass(const SessionConnectOptions& options, QProcessEnvironment& environment, QString& error); void cleanupAskPassScript(); QString mapSshError(const QString& rawError) const; QString knownHostsFileForNullDevice() const; }; #endif