Return to ssh.h CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / lib / vssh |
1.1 ! misho 1: #ifndef HEADER_CURL_SSH_H ! 2: #define HEADER_CURL_SSH_H ! 3: /*************************************************************************** ! 4: * _ _ ____ _ ! 5: * Project ___| | | | _ \| | ! 6: * / __| | | | |_) | | ! 7: * | (__| |_| | _ <| |___ ! 8: * \___|\___/|_| \_\_____| ! 9: * ! 10: * Copyright (C) 1998 - 2020, Daniel Stenberg, <daniel@haxx.se>, et al. ! 11: * ! 12: * This software is licensed as described in the file COPYING, which ! 13: * you should have received as part of this distribution. The terms ! 14: * are also available at https://curl.haxx.se/docs/copyright.html. ! 15: * ! 16: * You may opt to use, copy, modify, merge, publish, distribute and/or sell ! 17: * copies of the Software, and permit persons to whom the Software is ! 18: * furnished to do so, under the terms of the COPYING file. ! 19: * ! 20: * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY ! 21: * KIND, either express or implied. ! 22: * ! 23: ***************************************************************************/ ! 24: ! 25: #include "curl_setup.h" ! 26: ! 27: #if defined(HAVE_LIBSSH2_H) ! 28: #include <libssh2.h> ! 29: #include <libssh2_sftp.h> ! 30: #elif defined(HAVE_LIBSSH_LIBSSH_H) ! 31: #include <libssh/libssh.h> ! 32: #include <libssh/sftp.h> ! 33: #elif defined(USE_WOLFSSH) ! 34: #include <wolfssh/ssh.h> ! 35: #include <wolfssh/wolfsftp.h> ! 36: #endif ! 37: ! 38: /**************************************************************************** ! 39: * SSH unique setup ! 40: ***************************************************************************/ ! 41: typedef enum { ! 42: SSH_NO_STATE = -1, /* Used for "nextState" so say there is none */ ! 43: SSH_STOP = 0, /* do nothing state, stops the state machine */ ! 44: ! 45: SSH_INIT, /* First state in SSH-CONNECT */ ! 46: SSH_S_STARTUP, /* Session startup */ ! 47: SSH_HOSTKEY, /* verify hostkey */ ! 48: SSH_AUTHLIST, ! 49: SSH_AUTH_PKEY_INIT, ! 50: SSH_AUTH_PKEY, ! 51: SSH_AUTH_PASS_INIT, ! 52: SSH_AUTH_PASS, ! 53: SSH_AUTH_AGENT_INIT, /* initialize then wait for connection to agent */ ! 54: SSH_AUTH_AGENT_LIST, /* ask for list then wait for entire list to come */ ! 55: SSH_AUTH_AGENT, /* attempt one key at a time */ ! 56: SSH_AUTH_HOST_INIT, ! 57: SSH_AUTH_HOST, ! 58: SSH_AUTH_KEY_INIT, ! 59: SSH_AUTH_KEY, ! 60: SSH_AUTH_GSSAPI, ! 61: SSH_AUTH_DONE, ! 62: SSH_SFTP_INIT, ! 63: SSH_SFTP_REALPATH, /* Last state in SSH-CONNECT */ ! 64: ! 65: SSH_SFTP_QUOTE_INIT, /* First state in SFTP-DO */ ! 66: SSH_SFTP_POSTQUOTE_INIT, /* (Possibly) First state in SFTP-DONE */ ! 67: SSH_SFTP_QUOTE, ! 68: SSH_SFTP_NEXT_QUOTE, ! 69: SSH_SFTP_QUOTE_STAT, ! 70: SSH_SFTP_QUOTE_SETSTAT, ! 71: SSH_SFTP_QUOTE_SYMLINK, ! 72: SSH_SFTP_QUOTE_MKDIR, ! 73: SSH_SFTP_QUOTE_RENAME, ! 74: SSH_SFTP_QUOTE_RMDIR, ! 75: SSH_SFTP_QUOTE_UNLINK, ! 76: SSH_SFTP_QUOTE_STATVFS, ! 77: SSH_SFTP_GETINFO, ! 78: SSH_SFTP_FILETIME, ! 79: SSH_SFTP_TRANS_INIT, ! 80: SSH_SFTP_UPLOAD_INIT, ! 81: SSH_SFTP_CREATE_DIRS_INIT, ! 82: SSH_SFTP_CREATE_DIRS, ! 83: SSH_SFTP_CREATE_DIRS_MKDIR, ! 84: SSH_SFTP_READDIR_INIT, ! 85: SSH_SFTP_READDIR, ! 86: SSH_SFTP_READDIR_LINK, ! 87: SSH_SFTP_READDIR_BOTTOM, ! 88: SSH_SFTP_READDIR_DONE, ! 89: SSH_SFTP_DOWNLOAD_INIT, ! 90: SSH_SFTP_DOWNLOAD_STAT, /* Last state in SFTP-DO */ ! 91: SSH_SFTP_CLOSE, /* Last state in SFTP-DONE */ ! 92: SSH_SFTP_SHUTDOWN, /* First state in SFTP-DISCONNECT */ ! 93: SSH_SCP_TRANS_INIT, /* First state in SCP-DO */ ! 94: SSH_SCP_UPLOAD_INIT, ! 95: SSH_SCP_DOWNLOAD_INIT, ! 96: SSH_SCP_DOWNLOAD, ! 97: SSH_SCP_DONE, ! 98: SSH_SCP_SEND_EOF, ! 99: SSH_SCP_WAIT_EOF, ! 100: SSH_SCP_WAIT_CLOSE, ! 101: SSH_SCP_CHANNEL_FREE, /* Last state in SCP-DONE */ ! 102: SSH_SESSION_DISCONNECT, /* First state in SCP-DISCONNECT */ ! 103: SSH_SESSION_FREE, /* Last state in SCP/SFTP-DISCONNECT */ ! 104: SSH_QUIT, ! 105: SSH_LAST /* never used */ ! 106: } sshstate; ! 107: ! 108: /* this struct is used in the HandleData struct which is part of the ! 109: Curl_easy, which means this is used on a per-easy handle basis. ! 110: Everything that is strictly related to a connection is banned from this ! 111: struct. */ ! 112: struct SSHPROTO { ! 113: char *path; /* the path we operate on */ ! 114: }; ! 115: ! 116: /* ssh_conn is used for struct connection-oriented data in the connectdata ! 117: struct */ ! 118: struct ssh_conn { ! 119: const char *authlist; /* List of auth. methods, managed by libssh2 */ ! 120: ! 121: /* common */ ! 122: const char *passphrase; /* pass-phrase to use */ ! 123: char *rsa_pub; /* path name */ ! 124: char *rsa; /* path name */ ! 125: bool authed; /* the connection has been authenticated fine */ ! 126: sshstate state; /* always use ssh.c:state() to change state! */ ! 127: sshstate nextstate; /* the state to goto after stopping */ ! 128: CURLcode actualcode; /* the actual error code */ ! 129: struct curl_slist *quote_item; /* for the quote option */ ! 130: char *quote_path1; /* two generic pointers for the QUOTE stuff */ ! 131: char *quote_path2; ! 132: ! 133: bool acceptfail; /* used by the SFTP_QUOTE (continue if ! 134: quote command fails) */ ! 135: char *homedir; /* when doing SFTP we figure out home dir in the ! 136: connect phase */ ! 137: size_t readdir_len, readdir_totalLen, readdir_currLen; ! 138: char *readdir_line; ! 139: char *readdir_linkPath; ! 140: /* end of READDIR stuff */ ! 141: ! 142: int secondCreateDirs; /* counter use by the code to see if the ! 143: second attempt has been made to change ! 144: to/create a directory */ ! 145: char *slash_pos; /* used by the SFTP_CREATE_DIRS state */ ! 146: ! 147: int orig_waitfor; /* default READ/WRITE bits wait for */ ! 148: ! 149: #if defined(USE_LIBSSH) ! 150: /* our variables */ ! 151: unsigned kbd_state; /* 0 or 1 */ ! 152: ssh_key privkey; ! 153: ssh_key pubkey; ! 154: int auth_methods; ! 155: ssh_session ssh_session; ! 156: ssh_scp scp_session; ! 157: sftp_session sftp_session; ! 158: sftp_file sftp_file; ! 159: sftp_dir sftp_dir; ! 160: ! 161: unsigned sftp_recv_state; /* 0 or 1 */ ! 162: int sftp_file_index; /* for async read */ ! 163: sftp_attributes readdir_attrs; /* used by the SFTP readdir actions */ ! 164: sftp_attributes readdir_link_attrs; /* used by the SFTP readdir actions */ ! 165: sftp_attributes quote_attrs; /* used by the SFTP_QUOTE state */ ! 166: ! 167: const char *readdir_filename; /* points within readdir_attrs */ ! 168: const char *readdir_longentry; ! 169: char *readdir_tmp; ! 170: #elif defined(USE_LIBSSH2) ! 171: char *readdir_filename; ! 172: char *readdir_longentry; ! 173: ! 174: LIBSSH2_SFTP_ATTRIBUTES quote_attrs; /* used by the SFTP_QUOTE state */ ! 175: ! 176: /* Here's a set of struct members used by the SFTP_READDIR state */ ! 177: LIBSSH2_SFTP_ATTRIBUTES readdir_attrs; ! 178: LIBSSH2_SESSION *ssh_session; /* Secure Shell session */ ! 179: LIBSSH2_CHANNEL *ssh_channel; /* Secure Shell channel handle */ ! 180: LIBSSH2_SFTP *sftp_session; /* SFTP handle */ ! 181: LIBSSH2_SFTP_HANDLE *sftp_handle; ! 182: ! 183: #ifdef HAVE_LIBSSH2_AGENT_API ! 184: LIBSSH2_AGENT *ssh_agent; /* proxy to ssh-agent/pageant */ ! 185: struct libssh2_agent_publickey *sshagent_identity, ! 186: *sshagent_prev_identity; ! 187: #endif ! 188: ! 189: /* note that HAVE_LIBSSH2_KNOWNHOST_API is a define set in the libssh2.h ! 190: header */ ! 191: #ifdef HAVE_LIBSSH2_KNOWNHOST_API ! 192: LIBSSH2_KNOWNHOSTS *kh; ! 193: #endif ! 194: #elif defined(USE_WOLFSSH) ! 195: WOLFSSH *ssh_session; ! 196: WOLFSSH_CTX *ctx; ! 197: word32 handleSz; ! 198: byte handle[WOLFSSH_MAX_HANDLE]; ! 199: curl_off_t offset; ! 200: #endif /* USE_LIBSSH */ ! 201: }; ! 202: ! 203: #if defined(USE_LIBSSH) ! 204: ! 205: #define CURL_LIBSSH_VERSION ssh_version(0) ! 206: ! 207: #elif defined(USE_LIBSSH2) ! 208: ! 209: /* Feature detection based on version numbers to better work with ! 210: non-configure platforms */ ! 211: ! 212: #if !defined(LIBSSH2_VERSION_NUM) || (LIBSSH2_VERSION_NUM < 0x001000) ! 213: # error "SCP/SFTP protocols require libssh2 0.16 or later" ! 214: #endif ! 215: ! 216: #if LIBSSH2_VERSION_NUM >= 0x010000 ! 217: #define HAVE_LIBSSH2_SFTP_SEEK64 1 ! 218: #endif ! 219: ! 220: #if LIBSSH2_VERSION_NUM >= 0x010100 ! 221: #define HAVE_LIBSSH2_VERSION 1 ! 222: #endif ! 223: ! 224: #if LIBSSH2_VERSION_NUM >= 0x010205 ! 225: #define HAVE_LIBSSH2_INIT 1 ! 226: #define HAVE_LIBSSH2_EXIT 1 ! 227: #endif ! 228: ! 229: #if LIBSSH2_VERSION_NUM >= 0x010206 ! 230: #define HAVE_LIBSSH2_KNOWNHOST_CHECKP 1 ! 231: #define HAVE_LIBSSH2_SCP_SEND64 1 ! 232: #endif ! 233: ! 234: #if LIBSSH2_VERSION_NUM >= 0x010208 ! 235: #define HAVE_LIBSSH2_SESSION_HANDSHAKE 1 ! 236: #endif ! 237: ! 238: #ifdef HAVE_LIBSSH2_VERSION ! 239: /* get it run-time if possible */ ! 240: #define CURL_LIBSSH2_VERSION libssh2_version(0) ! 241: #else ! 242: /* use build-time if run-time not possible */ ! 243: #define CURL_LIBSSH2_VERSION LIBSSH2_VERSION ! 244: #endif ! 245: ! 246: #endif /* USE_LIBSSH2 */ ! 247: ! 248: #ifdef USE_SSH ! 249: ! 250: extern const struct Curl_handler Curl_handler_scp; ! 251: extern const struct Curl_handler Curl_handler_sftp; ! 252: ! 253: /* generic SSH backend functions */ ! 254: CURLcode Curl_ssh_init(void); ! 255: void Curl_ssh_cleanup(void); ! 256: size_t Curl_ssh_version(char *buffer, size_t buflen); ! 257: #else ! 258: /* for non-SSH builds */ ! 259: #define Curl_ssh_cleanup() ! 260: #endif ! 261: ! 262: #endif /* HEADER_CURL_SSH_H */