File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / curl / lib / vssh / ssh.h
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Jun 3 10:01:15 2020 UTC (5 years ago) by misho
Branches: curl, MAIN
CVS tags: v7_70_0p4, HEAD
curl

    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>