00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef KSSHPROCESS_H
00019 #define KSSHPROCESS_H
00020
00021 #include <sys/types.h>
00022 #include <sys/wait.h>
00023 #include <signal.h>
00024 #include <unistd.h>
00025
00026 #include <tqvaluelist.h>
00027
00028 #include <kdebug.h>
00029
00030 #include "process.h"
00031
00032 #define KSSHPROC 7120
00033
00104 class KSshProcess {
00105 public:
00117 class SshOpt {
00118 public:
00119 Q_UINT32 opt;
00120 TQString str;
00121 Q_INT32 num;
00122 bool boolean;
00123 };
00124
00128 typedef TQValueList<SshOpt> SshOptList;
00129 typedef TQValueListIterator<SshOpt> SshOptListIterator;
00130 typedef TQValueListConstIterator<SshOpt> SshOptListConstIterator;
00131
00136 enum SshVersion {
00137 OPENSSH_3_6,
00138 OPENSSH,
00139 SSH,
00140 SSH_VER_MAX,
00141 UNKNOWN_VER
00142 };
00143
00148
00149
00150 enum SshOptType {
00154 SSH_SUBSYSTEM,
00158 SSH_PORT,
00162 SSH_HOST,
00166 SSH_USERNAME,
00170 SSH_PASSWD,
00174 SSH_PROTOCOL,
00178 SSH_FORWARDX11,
00182 SSH_FORWARDAGENT,
00186 SSH_ESCAPE_CHAR,
00190 SSH_COMMAND,
00195 SSH_VERBOSE,
00200 SSH_OPTION,
00206 SSH_OTHER,
00207 SSH_OPT_MAX
00208 };
00209
00214 enum SshError {
00218 ERR_UNKNOWN_VERSION,
00222 ERR_CANNOT_LAUNCH,
00227 ERR_INTERACT,
00232 ERR_CMD_SUBSYS_CONFLICT,
00236 ERR_NEED_PASSWD,
00240 ERR_NEED_PASSPHRASE,
00244 ERR_NEED_USERNAME,
00248 ERR_TIMED_OUT,
00252 ERR_INTERNAL,
00256 ERR_DISCONNECTED,
00260 ERR_NO_OPTIONS,
00265 ERR_NEW_HOST_KEY,
00270 ERR_DIFF_HOST_KEY,
00275 ERR_HOST_KEY_REJECTED,
00279 ERR_INVALID_OPT,
00283 ERR_ACCEPTED_KEY,
00287 ERR_AUTH_FAILED,
00292 ERR_AUTH_FAILED_NEW_KEY,
00297 ERR_AUTH_FAILED_DIFF_KEY,
00301 ERR_CLOSED_BY_REMOTE_HOST,
00305 ERR_UNKNOWN,
00309 ERR_INVALID_STATE,
00310 ERR_MAX
00311 };
00312
00316 KSshProcess();
00317
00323 KSshProcess(TQString pathToSsh);
00324 ~KSshProcess();
00325
00336 bool setSshPath(TQString pathToSsh);
00337
00345 SshVersion version();
00346
00352
00353
00361 int error(TQString& msg);
00362
00367 int error() { return mError; }
00368
00369 TQString errorMsg() { return mErrorMsg; }
00370
00382 void kill(int signal = SIGKILL);
00383
00390 int pid() { return ssh.pid(); }
00391
00402 bool connected() { return mConnected; }
00403
00413 bool running() { return mRunning; }
00414
00418 void printArgs();
00419
00436 bool setOptions(const SshOptList& opts);
00437
00460 bool connect();
00461
00462
00469 void disconnect();
00470
00478 void acceptHostKey(bool accept);
00479
00485 void setPassword(TQString password);
00486
00492 int stdioFd() { return ssh.stdioFd(); }
00493
00499 int stderrFd() { return ssh.stderrFd(); }
00500
00506 int pty() { return ssh.fd(); }
00507 private:
00511 TQString mSshPath;
00512
00517 SshVersion mVersion;
00518
00522 TQString mPassword;
00523
00527 TQString mUsername;
00528
00532 TQString mHost;
00533
00537 bool mAcceptHostKey;
00538
00543 bool mConnected;
00544
00549 bool mRunning;
00550
00555 TQString mKeyFingerprint;
00556
00561 TQString mKnownHostsFile;
00562
00566 int mConnectState;
00567
00571 int mPort;
00572
00577 SshError mError;
00578
00583 TQString mErrorMsg;
00584
00590 MyPtyProcess ssh;
00591
00595 QCStringList mArgs;
00596 void init();
00597
00601 static void SIGCHLD_handler(int signo);
00602 void installSignalHandlers();
00603 void removeSignalHandlers();
00604
00605 TQString getLine();
00606
00607 static TQRegExp versionStrs[];
00608 static const char * const passwordPrompt[];
00609 static const char * const passphrasePrompt[];
00610 static const char * const authSuccessMsg[];
00611 static const char * const authFailedMsg[];
00612 static TQRegExp hostKeyMissingMsg[];
00613 static const char * const hostKeyChangedMsg[];
00614 static const char * const continuePrompt[];
00615 static const char * const hostKeyAcceptedMsg[];
00616 static const char * const tryAgainMsg[];
00617 static TQRegExp hostKeyVerifyFailedMsg[];
00618 static const char * const connectionClosedMsg[];
00619 static const char * const changeHostKeyOnDiskPrompt[];
00620 static TQRegExp keyFingerprintMsg[];
00621 static TQRegExp knownHostsFileMsg[];
00622 };
00623 #endif