ne7ssh.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef NE7SSH_H
00018 #define NE7SSH_H
00019
00020 #include <botan/build.h>
00021
00022
00023
00024
00025 #if BOTAN_VERSION_MAJOR > 1
00026 # error Unsupported Botan Version
00027 #endif
00028
00029 #define BOTAN_PRE_15 (BOTAN_VERSION_MINOR < 5)
00030 #define BOTAN_PRE_18 (BOTAN_VERSION_MINOR < 8)
00031
00032 #if !BOTAN_PRE_18 && !BOTAN_PRE_15
00033 # include <botan/auto_rng.h>
00034 #endif
00035
00036 #include <stdlib.h>
00037 #include <string>
00038 #include <fcntl.h>
00039 #if !defined(WIN32) && !defined(__MINGW32__)
00040 # include <pthread.h>
00041 # include <sys/select.h>
00042 # include <unistd.h>
00043 typedef pthread_t ne7ssh_thread_t;
00044 #else
00045 #include <windows.h>
00046 typedef HANDLE ne7ssh_thread_t;
00047 #endif
00048
00049 #include "ne7ssh_types.h"
00050 #include "ne7ssh_error.h"
00051 #include "ne7ssh_mutex.h"
00052
00053 #define SSH2_MSG_DISCONNECT 1
00054 #define SSH2_MSG_IGNORE 2
00055
00056 #define SSH2_MSG_KEXINIT 20
00057 #define SSH2_MSG_NEWKEYS 21
00058
00059 #define SSH2_MSG_KEXDH_INIT 30
00060 #define SSH2_MSG_KEXDH_REPLY 31
00061
00062 #define SSH2_MSG_SERVICE_REQUEST 5
00063 #define SSH2_MSG_SERVICE_ACCEPT 6
00064
00065 #define SSH2_MSG_USERAUTH_REQUEST 50
00066 #define SSH2_MSG_USERAUTH_FAILURE 51
00067 #define SSH2_MSG_USERAUTH_SUCCESS 52
00068 #define SSH2_MSG_USERAUTH_BANNER 53
00069 #define SSH2_MSG_USERAUTH_PK_OK 60
00070
00071 #define SSH2_MSG_CHANNEL_OPEN 90
00072 #define SSH2_MSG_CHANNEL_OPEN_CONFIRMATION 91
00073 #define SSH2_MSG_CHANNEL_OPEN_FAILURE 92
00074 #define SSH2_MSG_CHANNEL_WINDOW_ADJUST 93
00075 #define SSH2_MSG_CHANNEL_DATA 94
00076 #define SSH2_MSG_CHANNEL_EXTENDED_DATA 95
00077 #define SSH2_MSG_CHANNEL_EOF 96
00078 #define SSH2_MSG_CHANNEL_CLOSE 97
00079 #define SSH2_MSG_CHANNEL_REQUEST 98
00080 #define SSH2_MSG_CHANNEL_SUCCESS 99
00081 #define SSH2_MSG_CHANNEL_FAILURE 100
00082
00083 class ne7ssh_connection;
00084
00086 typedef struct {
00088 ne7ssh_connection **conns;
00090 uint32 count;
00091 } connStruct;
00092
00094 namespace Botan
00095 {
00096 class LibraryInitializer;
00097 }
00098
00099 class Ne7SftpSubsystem;
00100
00104 class SSH_EXPORT ne7ssh
00105 {
00106 private:
00107
00108 static Ne7ssh_Mutex mut;
00109 Botan::LibraryInitializer *init;
00110 ne7ssh_connection **connections;
00111 uint32 conCount;
00112 static bool running;
00113 static bool selectActive;
00114 connStruct allConns;
00115
00116
00122 static void *selectThread (void*);
00123
00128 uint32 getChannelNo ();
00129 ne7ssh_thread_t select_thread;
00130 bool connected;
00131
00136 static bool lock ();
00137
00142 static bool unlock ();
00143 static Ne7sshError* errs;
00144
00145 public:
00146 #if !BOTAN_PRE_18 && !BOTAN_PRE_15
00147 static Botan::AutoSeeded_RNG *rng;
00148 #endif
00149 static const char* SSH_VERSION;
00150 static const char* KEX_ALGORITHMS;
00151 static const char* HOSTKEY_ALGORITHMS;
00152 static const char* MAC_ALGORITHMS;
00153 static const char* CIPHER_ALGORITHMS;
00154 static const char* COMPRESSION_ALGORITHMS;
00155 static char* PREFERED_CIPHER;
00156 static char* PREFERED_MAC;
00157
00161 ne7ssh();
00165 ~ne7ssh();
00166
00177 int connectWithPassword (const char* host, const int port, const char* username, const char* password, bool shell = true, const int timeout = 0);
00178
00191 int connectWithKey (const char* host, const int port, const char* username, const char* privKeyFileName, bool shell = true, const int timeout = 0);
00192
00198
00199
00200 connStruct* getConnetions () { return &allConns; }
00201
00207
00208
00215 bool send (const char* data, int channel);
00216
00224 bool sendCmd (const char* cmd, int channel, int timeout);
00225
00231 bool close (int channel);
00232
00238 void setCount (uint32 count) { conCount = count; }
00239
00245 const char* read (int channel, bool do_lock=true);
00246
00252 void* readBinary (int channel);
00253
00259 int getReceivedSize (int channel, bool do_lock=true);
00260
00268 bool waitFor (int channel, const char* str, uint32 timeout=0);
00269
00276 void setOptions (const char* prefCipher, const char* prefHmac);
00277
00278
00288 bool generateKeyPair (const char* type, const char* fqdn, const char* privKeyFileName, const char* pubKeyFileName, uint16 keySize = 0);
00289
00296 bool initSftp (Ne7SftpSubsystem& _sftp, int channel);
00297
00302 static Ne7sshError* errors();
00303
00304 static bool isSelectActive() { return selectActive; }
00305 static void selectDead() { selectActive = false; }
00306 };
00307
00308 class Ne7sshSftp;
00309
00313 class SSH_EXPORT Ne7SftpSubsystem
00314 {
00315 private:
00316 bool inited;
00317 Ne7sshSftp* sftp;
00318
00323 bool errorNotInited ();
00324
00325 public:
00327 typedef struct
00328 {
00329 uint64_t size;
00330 uint32_t owner;
00331 uint32_t group;
00332 uint32_t permissions;
00333 uint32_t atime;
00334 uint32_t mtime;
00335 } fileAttrs;
00336
00338 enum writeMode { READ, OVERWRITE, APPEND };
00339
00343 Ne7SftpSubsystem ();
00344
00349 Ne7SftpSubsystem (class Ne7sshSftp* _sftp);
00350
00354 ~Ne7SftpSubsystem();
00355
00361 bool setTimeout (uint32 _timeout);
00362
00369 uint32 openFile (const char* filename, uint8 mode);
00370
00376 uint32 openDir (const char* dirname);
00377
00384 bool readFile (uint32 fileID, uint64 offset = 0);
00385
00394 bool writeFile (uint32 fileID, const uint8* data, uint32 len, uint64 offset = 0);
00395
00401 bool closeFile (uint32 fileID);
00402
00410 bool getFileAttrs (fileAttrs& attrs, const char* filename, bool followSymLinks = true);
00411
00412
00419 bool get (const char* remoteFile, FILE* localFile);
00420
00427 bool put (FILE* localFile, const char* remoteFile);
00428
00434 bool rm (const char* remoteFile);
00435
00442 bool mv (const char* oldFile, const char* newFile);
00443
00449 bool mkdir (const char* remoteDir);
00450
00456 bool rmdir (const char* remoteDir);
00457
00464 const char* ls (const char* remoteDir, bool longNames=false);
00465
00471 bool cd (const char* remoteDir);
00472
00479 bool chmod (const char* remoteFile, const char* mode);
00480
00488 bool chown (const char* remoteFile, uint32_t uid, uint32_t gid = 0);
00489
00495 bool isFile (const char* remoteFile);
00496
00502 bool isDir (const char* remoteFile);
00503 };
00504
00505 #endif