Annotation of embedaddon/curl/lib/vssh/ssh.h, revision 1.1
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 */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>