1*1c60b9acSAndroid Build Coastguard Worker /* 2*1c60b9acSAndroid Build Coastguard Worker * libwebsockets - small server side websockets and web server implementation 3*1c60b9acSAndroid Build Coastguard Worker * 4*1c60b9acSAndroid Build Coastguard Worker * Copyright (C) 2010 - 2019 Andy Green <[email protected]> 5*1c60b9acSAndroid Build Coastguard Worker * 6*1c60b9acSAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a copy 7*1c60b9acSAndroid Build Coastguard Worker * of this software and associated documentation files (the "Software"), to 8*1c60b9acSAndroid Build Coastguard Worker * deal in the Software without restriction, including without limitation the 9*1c60b9acSAndroid Build Coastguard Worker * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10*1c60b9acSAndroid Build Coastguard Worker * sell copies of the Software, and to permit persons to whom the Software is 11*1c60b9acSAndroid Build Coastguard Worker * furnished to do so, subject to the following conditions: 12*1c60b9acSAndroid Build Coastguard Worker * 13*1c60b9acSAndroid Build Coastguard Worker * The above copyright notice and this permission notice shall be included in 14*1c60b9acSAndroid Build Coastguard Worker * all copies or substantial portions of the Software. 15*1c60b9acSAndroid Build Coastguard Worker * 16*1c60b9acSAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*1c60b9acSAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*1c60b9acSAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19*1c60b9acSAndroid Build Coastguard Worker * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*1c60b9acSAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21*1c60b9acSAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 22*1c60b9acSAndroid Build Coastguard Worker * IN THE SOFTWARE. 23*1c60b9acSAndroid Build Coastguard Worker */ 24*1c60b9acSAndroid Build Coastguard Worker 25*1c60b9acSAndroid Build Coastguard Worker #if !defined(__LWS_PLUGIN_SSH_H__) 26*1c60b9acSAndroid Build Coastguard Worker #define __LWS_PLUGIN_SSH_H__ 27*1c60b9acSAndroid Build Coastguard Worker 28*1c60b9acSAndroid Build Coastguard Worker #define LWS_CALLBACK_SSH_UART_SET_RXFLOW (LWS_CALLBACK_USER + 800) 29*1c60b9acSAndroid Build Coastguard Worker 30*1c60b9acSAndroid Build Coastguard Worker #define LWS_SSH_OPS_VERSION 2 31*1c60b9acSAndroid Build Coastguard Worker 32*1c60b9acSAndroid Build Coastguard Worker struct lws_ssh_pty { 33*1c60b9acSAndroid Build Coastguard Worker char term[16]; 34*1c60b9acSAndroid Build Coastguard Worker char *modes; 35*1c60b9acSAndroid Build Coastguard Worker uint32_t width_ch; 36*1c60b9acSAndroid Build Coastguard Worker uint32_t height_ch; 37*1c60b9acSAndroid Build Coastguard Worker uint32_t width_px; 38*1c60b9acSAndroid Build Coastguard Worker uint32_t height_px; 39*1c60b9acSAndroid Build Coastguard Worker uint32_t modes_len; 40*1c60b9acSAndroid Build Coastguard Worker }; 41*1c60b9acSAndroid Build Coastguard Worker 42*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_TTY_OP_END 0 /* Indicates end of options. */ 43*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VINTR 1 /* Interrupt character; 255 if none. Similarly 44*1c60b9acSAndroid Build Coastguard Worker * for the other characters. Not all of these 45*1c60b9acSAndroid Build Coastguard Worker * characters are supported on all systems. */ 46*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VQUIT 2 /* The quit character (sends SIGQUIT signal on 47*1c60b9acSAndroid Build Coastguard Worker * POSIX systems). */ 48*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VERASE 3 /* Erase the character to left of the cursor. */ 49*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VKILL 4 /* Kill the current input line. */ 50*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VEOF 5 /* End-of-file character (sends EOF from the 51*1c60b9acSAndroid Build Coastguard Worker * terminal). */ 52*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VEOL 6 /* End-of-line character in addition to 53*1c60b9acSAndroid Build Coastguard Worker * carriage return and/or linefeed. */ 54*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VEOL2 7 /* Additional end-of-line character. */ 55*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VSTART 8 /* Continues paused output (normally 56*1c60b9acSAndroid Build Coastguard Worker * control-Q). */ 57*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VSTOP 9 /* Pauses output (normally control-S). */ 58*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VSUSP 10 /* Suspends the current program. */ 59*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VDSUSP 11 /* Another suspend character. */ 60*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VREPRINT 12 /* Reprints the current input line. */ 61*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VWERASE 13 /* Erases a word left of cursor. */ 62*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VLNEXT 14 /* Enter the next character typed literally, 63*1c60b9acSAndroid Build Coastguard Worker * even if it is a special character */ 64*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VFLUSH 15 /* Character to flush output. */ 65*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VSWTCH 16 /* Switch to a different shell layer. */ 66*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VSTATUS 17 /* Prints system status line (load, command, 67*1c60b9acSAndroid Build Coastguard Worker * pid, etc). */ 68*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_VDISCARD 18 /* Toggles the flushing of terminal output. */ 69*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_IGNPAR 30 /* The ignore parity flag. The parameter 70*1c60b9acSAndroid Build Coastguard Worker * SHOULD be 0 if this flag is FALSE, 71*1c60b9acSAndroid Build Coastguard Worker * and 1 if it is TRUE. */ 72*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_PARMRK 31 /* Mark parity and framing errors. */ 73*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_INPCK 32 /* Enable checking of parity errors. */ 74*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ISTRIP 33 /* Strip 8th bit off characters. */ 75*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_INLCR 34 /* Map NL into CR on input. */ 76*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_IGNCR 35 /* Ignore CR on input. */ 77*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ICRNL 36 /* Map CR to NL on input. */ 78*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_IUCLC 37 /* Translate uppercase characters to lowercase. */ 79*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_IXON 38 /* Enable output flow control. */ 80*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_IXANY 39 /* Any char will restart after stop. */ 81*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_IXOFF 40 /* Enable input flow control. */ 82*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_IMAXBEL 41 /* Ring bell on input queue full. */ 83*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ISIG 50 /* Enable signals INTR, QUIT, [D]SUSP. */ 84*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ICANON 51 /* Canonicalize input lines. */ 85*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_XCASE 52 /* Enable input and output of uppercase 86*1c60b9acSAndroid Build Coastguard Worker * characters by preceding their lowercase 87*1c60b9acSAndroid Build Coastguard Worker * equivalents with "\". */ 88*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ECHO 53 /* Enable echoing. */ 89*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ECHOE 54 /* Visually erase chars. */ 90*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ECHOK 55 /* Kill character discards current line. */ 91*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ECHONL 56 /* Echo NL even if ECHO is off. */ 92*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_NOFLSH 57 /* Don't flush after interrupt. */ 93*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_TOSTOP 58 /* Stop background jobs from output. */ 94*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_IEXTEN 59 /* Enable extensions. */ 95*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ECHOCTL 60 /* Echo control characters as ^(Char). */ 96*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ECHOKE 61 /* Visual erase for line kill. */ 97*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_PENDIN 62 /* Retype pending input. */ 98*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_OPOST 70 /* Enable output processing. */ 99*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_OLCUC 71 /* Convert lowercase to uppercase. */ 100*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ONLCR 72 /* Map NL to CR-NL. */ 101*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_OCRNL 73 /* Translate carriage return to newline (out). */ 102*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ONOCR 74 /* Translate newline to CR-newline (out). */ 103*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_ONLRET 75 /* Newline performs a carriage return (out). */ 104*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_CS7 90 /* 7 bit mode. */ 105*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_CS8 91 /* 8 bit mode. */ 106*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_PARENB 92 /* Parity enable. */ 107*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_PARODD 93 /* Odd parity, else even. */ 108*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_TTY_OP_ISPEED 128 /* Specifies the input baud rate in 109*1c60b9acSAndroid Build Coastguard Worker * bits per second. */ 110*1c60b9acSAndroid Build Coastguard Worker #define SSHMO_TTY_OP_OSPEED 129 /* Specifies the output baud rate in 111*1c60b9acSAndroid Build Coastguard Worker * bits per second. */ 112*1c60b9acSAndroid Build Coastguard Worker 113*1c60b9acSAndroid Build Coastguard Worker /*! \defgroup ssh-base plugin: lws-ssh-base 114*1c60b9acSAndroid Build Coastguard Worker * \ingroup Protocols-and-Plugins 115*1c60b9acSAndroid Build Coastguard Worker * 116*1c60b9acSAndroid Build Coastguard Worker * ##Plugin lws-ssh-base 117*1c60b9acSAndroid Build Coastguard Worker * 118*1c60b9acSAndroid Build Coastguard Worker * This is the interface to customize the ssh server per-vhost. A pointer 119*1c60b9acSAndroid Build Coastguard Worker * to your struct lws_ssh_ops with the members initialized is passed in using 120*1c60b9acSAndroid Build Coastguard Worker * pvo when you create the vhost. The pvo is attached to the protocol name 121*1c60b9acSAndroid Build Coastguard Worker * 122*1c60b9acSAndroid Build Coastguard Worker * - "lws-ssh-base" - the ssh serving part 123*1c60b9acSAndroid Build Coastguard Worker * 124*1c60b9acSAndroid Build Coastguard Worker * - "lws-telnetd-base" - the telnet serving part 125*1c60b9acSAndroid Build Coastguard Worker * 126*1c60b9acSAndroid Build Coastguard Worker * This way you can have different instances of ssh servers wired up to 127*1c60b9acSAndroid Build Coastguard Worker * different IO and server keys per-vhost. 128*1c60b9acSAndroid Build Coastguard Worker * 129*1c60b9acSAndroid Build Coastguard Worker * See also ./READMEs/README-plugin-sshd-base.md 130*1c60b9acSAndroid Build Coastguard Worker */ 131*1c60b9acSAndroid Build Coastguard Worker ///@{ 132*1c60b9acSAndroid Build Coastguard Worker 133*1c60b9acSAndroid Build Coastguard Worker typedef void (*lws_ssh_finish_exec)(void *handle, int retcode); 134*1c60b9acSAndroid Build Coastguard Worker 135*1c60b9acSAndroid Build Coastguard Worker struct lws_ssh_ops { 136*1c60b9acSAndroid Build Coastguard Worker /** 137*1c60b9acSAndroid Build Coastguard Worker * channel_create() - Channel created 138*1c60b9acSAndroid Build Coastguard Worker * 139*1c60b9acSAndroid Build Coastguard Worker * \param wsi: raw wsi representing this connection 140*1c60b9acSAndroid Build Coastguard Worker * \param priv: pointer to void * you can allocate and attach to the 141*1c60b9acSAndroid Build Coastguard Worker * channel 142*1c60b9acSAndroid Build Coastguard Worker * 143*1c60b9acSAndroid Build Coastguard Worker * Called when new channel created, *priv should be set to any 144*1c60b9acSAndroid Build Coastguard Worker * allocation your implementation needs 145*1c60b9acSAndroid Build Coastguard Worker * 146*1c60b9acSAndroid Build Coastguard Worker * You probably want to save the wsi inside your priv struct. Calling 147*1c60b9acSAndroid Build Coastguard Worker * lws_callback_on_writable() on this wsi causes your ssh server 148*1c60b9acSAndroid Build Coastguard Worker * instance to call .tx_waiting() next time you can write something 149*1c60b9acSAndroid Build Coastguard Worker * to the client. 150*1c60b9acSAndroid Build Coastguard Worker */ 151*1c60b9acSAndroid Build Coastguard Worker int (*channel_create)(struct lws *wsi, void **priv); 152*1c60b9acSAndroid Build Coastguard Worker 153*1c60b9acSAndroid Build Coastguard Worker /** 154*1c60b9acSAndroid Build Coastguard Worker * channel_destroy() - Channel is being destroyed 155*1c60b9acSAndroid Build Coastguard Worker * 156*1c60b9acSAndroid Build Coastguard Worker * \param priv: void * you set when channel was created (or NULL) 157*1c60b9acSAndroid Build Coastguard Worker * 158*1c60b9acSAndroid Build Coastguard Worker * Called when channel destroyed, priv should be freed if you allocated 159*1c60b9acSAndroid Build Coastguard Worker * into it. 160*1c60b9acSAndroid Build Coastguard Worker */ 161*1c60b9acSAndroid Build Coastguard Worker int (*channel_destroy)(void *priv); 162*1c60b9acSAndroid Build Coastguard Worker 163*1c60b9acSAndroid Build Coastguard Worker /** 164*1c60b9acSAndroid Build Coastguard Worker * rx() - receive payload from peer 165*1c60b9acSAndroid Build Coastguard Worker * 166*1c60b9acSAndroid Build Coastguard Worker * \param priv: void * you set when this channel was created 167*1c60b9acSAndroid Build Coastguard Worker * \param wsi: struct lws * for the ssh connection 168*1c60b9acSAndroid Build Coastguard Worker * \param buf: pointer to start of received data 169*1c60b9acSAndroid Build Coastguard Worker * \param len: bytes of received data available at buf 170*1c60b9acSAndroid Build Coastguard Worker * 171*1c60b9acSAndroid Build Coastguard Worker * len bytes of payload from the peer arrived and is available at buf 172*1c60b9acSAndroid Build Coastguard Worker */ 173*1c60b9acSAndroid Build Coastguard Worker int (*rx)(void *priv, struct lws *wsi, const uint8_t *buf, uint32_t len); 174*1c60b9acSAndroid Build Coastguard Worker 175*1c60b9acSAndroid Build Coastguard Worker /** 176*1c60b9acSAndroid Build Coastguard Worker * tx_waiting() - report if data waiting to transmit on the channel 177*1c60b9acSAndroid Build Coastguard Worker * 178*1c60b9acSAndroid Build Coastguard Worker * \param priv: void * you set when this channel was created 179*1c60b9acSAndroid Build Coastguard Worker * 180*1c60b9acSAndroid Build Coastguard Worker * returns a bitmask of LWS_STDOUT and LWS_STDERR, with the bits set 181*1c60b9acSAndroid Build Coastguard Worker * if they have tx waiting to send, else 0 if nothing to send 182*1c60b9acSAndroid Build Coastguard Worker * 183*1c60b9acSAndroid Build Coastguard Worker * You should use one of the lws_callback_on_writable() family to 184*1c60b9acSAndroid Build Coastguard Worker * trigger the ssh protocol to ask if you have any tx waiting. 185*1c60b9acSAndroid Build Coastguard Worker * 186*1c60b9acSAndroid Build Coastguard Worker * Returning -1 from here will close the tcp connection to the client. 187*1c60b9acSAndroid Build Coastguard Worker */ 188*1c60b9acSAndroid Build Coastguard Worker int (*tx_waiting)(void *priv); 189*1c60b9acSAndroid Build Coastguard Worker 190*1c60b9acSAndroid Build Coastguard Worker /** 191*1c60b9acSAndroid Build Coastguard Worker * tx() - provide data to send on the channel 192*1c60b9acSAndroid Build Coastguard Worker * 193*1c60b9acSAndroid Build Coastguard Worker * \param priv: void * you set when this channel was created 194*1c60b9acSAndroid Build Coastguard Worker * \param stdch: LWS_STDOUT or LWS_STDERR 195*1c60b9acSAndroid Build Coastguard Worker * \param buf: start of the buffer to copy the transmit data into 196*1c60b9acSAndroid Build Coastguard Worker * \param len: max length of the buffer in bytes 197*1c60b9acSAndroid Build Coastguard Worker * 198*1c60b9acSAndroid Build Coastguard Worker * copy and consume up to len bytes into *buf, 199*1c60b9acSAndroid Build Coastguard Worker * return the actual copied count. 200*1c60b9acSAndroid Build Coastguard Worker * 201*1c60b9acSAndroid Build Coastguard Worker * You should use one of the lws_callback_on_writable() family to 202*1c60b9acSAndroid Build Coastguard Worker * trigger the ssh protocol to ask if you have any tx waiting. If you 203*1c60b9acSAndroid Build Coastguard Worker * do you will get calls here to fetch it, for each of LWS_STDOUT or 204*1c60b9acSAndroid Build Coastguard Worker * LWS_STDERR that were reported to be waiting by tx_waiting(). 205*1c60b9acSAndroid Build Coastguard Worker */ 206*1c60b9acSAndroid Build Coastguard Worker size_t (*tx)(void *priv, int stdch, uint8_t *buf, size_t len); 207*1c60b9acSAndroid Build Coastguard Worker 208*1c60b9acSAndroid Build Coastguard Worker /** 209*1c60b9acSAndroid Build Coastguard Worker * get_server_key() - retreive the secret keypair for this server 210*1c60b9acSAndroid Build Coastguard Worker * 211*1c60b9acSAndroid Build Coastguard Worker * \param wsi: the wsi representing the connection to the client 212*1c60b9acSAndroid Build Coastguard Worker * \param buf: start of the buffer to copy the keypair into 213*1c60b9acSAndroid Build Coastguard Worker * \param len: length of the buffer in bytes 214*1c60b9acSAndroid Build Coastguard Worker * 215*1c60b9acSAndroid Build Coastguard Worker * load the server key into buf, max len len. Returns length of buf 216*1c60b9acSAndroid Build Coastguard Worker * set to key, or 0 if no key or other error. If there is no key, 217*1c60b9acSAndroid Build Coastguard Worker * the error isn't fatal... the plugin will generate a random key and 218*1c60b9acSAndroid Build Coastguard Worker * store it using *get_server_key() for subsequent times. 219*1c60b9acSAndroid Build Coastguard Worker */ 220*1c60b9acSAndroid Build Coastguard Worker size_t (*get_server_key)(struct lws *wsi, uint8_t *buf, size_t len); 221*1c60b9acSAndroid Build Coastguard Worker 222*1c60b9acSAndroid Build Coastguard Worker /** 223*1c60b9acSAndroid Build Coastguard Worker * set_server_key() - store the secret keypair of this server 224*1c60b9acSAndroid Build Coastguard Worker * 225*1c60b9acSAndroid Build Coastguard Worker * \param wsi: the wsi representing the connection to the client 226*1c60b9acSAndroid Build Coastguard Worker * \param buf: start of the buffer containing the keypair 227*1c60b9acSAndroid Build Coastguard Worker * \param len: length of the keypair in bytes 228*1c60b9acSAndroid Build Coastguard Worker * 229*1c60b9acSAndroid Build Coastguard Worker * store the server key in buf, length len, to nonvolatile stg. 230*1c60b9acSAndroid Build Coastguard Worker * Return length stored, 0 for fail. 231*1c60b9acSAndroid Build Coastguard Worker */ 232*1c60b9acSAndroid Build Coastguard Worker size_t (*set_server_key)(struct lws *wsi, uint8_t *buf, size_t len); 233*1c60b9acSAndroid Build Coastguard Worker 234*1c60b9acSAndroid Build Coastguard Worker /** 235*1c60b9acSAndroid Build Coastguard Worker * set_env() - Set environment variable 236*1c60b9acSAndroid Build Coastguard Worker * 237*1c60b9acSAndroid Build Coastguard Worker * \param priv: void * you set when this channel was created 238*1c60b9acSAndroid Build Coastguard Worker * \param name: env var name 239*1c60b9acSAndroid Build Coastguard Worker * \param value: value to set env var to 240*1c60b9acSAndroid Build Coastguard Worker * 241*1c60b9acSAndroid Build Coastguard Worker * Client requested to set environment var. Return nonzero to fail. 242*1c60b9acSAndroid Build Coastguard Worker */ 243*1c60b9acSAndroid Build Coastguard Worker int (*set_env)(void *priv, const char *name, const char *value); 244*1c60b9acSAndroid Build Coastguard Worker 245*1c60b9acSAndroid Build Coastguard Worker /** 246*1c60b9acSAndroid Build Coastguard Worker * exec() - spawn command and wire up stdin/out/err to ssh channel 247*1c60b9acSAndroid Build Coastguard Worker * 248*1c60b9acSAndroid Build Coastguard Worker * \param priv: void * you set when this channel was created 249*1c60b9acSAndroid Build Coastguard Worker * \param wsi: the struct lws the connection belongs to 250*1c60b9acSAndroid Build Coastguard Worker * \param command: string containing path to app and arguments 251*1c60b9acSAndroid Build Coastguard Worker * \param finish: function to call to indicate the exec finished 252*1c60b9acSAndroid Build Coastguard Worker * \param finish_handle: opaque handle identifying this exec for use with \p finish 253*1c60b9acSAndroid Build Coastguard Worker * 254*1c60b9acSAndroid Build Coastguard Worker * Client requested to exec something. Return nonzero to fail. 255*1c60b9acSAndroid Build Coastguard Worker */ 256*1c60b9acSAndroid Build Coastguard Worker int (*exec)(void *priv, struct lws *wsi, const char *command, lws_ssh_finish_exec finish, void *finish_handle); 257*1c60b9acSAndroid Build Coastguard Worker 258*1c60b9acSAndroid Build Coastguard Worker /** 259*1c60b9acSAndroid Build Coastguard Worker * shell() - Spawn shell that is appropriate for user 260*1c60b9acSAndroid Build Coastguard Worker * 261*1c60b9acSAndroid Build Coastguard Worker * \param priv: void * you set when this channel was created 262*1c60b9acSAndroid Build Coastguard Worker * \param wsi: the struct lws the connection belongs to 263*1c60b9acSAndroid Build Coastguard Worker * \param finish: function to call to indicate the exec finished 264*1c60b9acSAndroid Build Coastguard Worker * \param finish_handle: opaque handle identifying this exec for use with \p finish 265*1c60b9acSAndroid Build Coastguard Worker * 266*1c60b9acSAndroid Build Coastguard Worker * Spawn the appropriate shell for this user. Return 0 for OK 267*1c60b9acSAndroid Build Coastguard Worker * or nonzero to fail. 268*1c60b9acSAndroid Build Coastguard Worker */ 269*1c60b9acSAndroid Build Coastguard Worker int (*shell)(void *priv, struct lws *wsi, lws_ssh_finish_exec finish, void *finish_handle); 270*1c60b9acSAndroid Build Coastguard Worker 271*1c60b9acSAndroid Build Coastguard Worker /** 272*1c60b9acSAndroid Build Coastguard Worker * pty_req() - Create a Pseudo-TTY as described in pty 273*1c60b9acSAndroid Build Coastguard Worker * 274*1c60b9acSAndroid Build Coastguard Worker * \param priv: void * you set when this channel was created 275*1c60b9acSAndroid Build Coastguard Worker * \param pty: pointer to struct describing the desired pty 276*1c60b9acSAndroid Build Coastguard Worker * 277*1c60b9acSAndroid Build Coastguard Worker * Client requested a pty. Return nonzero to fail. 278*1c60b9acSAndroid Build Coastguard Worker */ 279*1c60b9acSAndroid Build Coastguard Worker int (*pty_req)(void *priv, struct lws_ssh_pty *pty); 280*1c60b9acSAndroid Build Coastguard Worker 281*1c60b9acSAndroid Build Coastguard Worker /** 282*1c60b9acSAndroid Build Coastguard Worker * child_process_io() - Child process has IO 283*1c60b9acSAndroid Build Coastguard Worker * 284*1c60b9acSAndroid Build Coastguard Worker * \param priv: void * you set when this channel was created 285*1c60b9acSAndroid Build Coastguard Worker * \param wsi: the struct lws the connection belongs to 286*1c60b9acSAndroid Build Coastguard Worker * \param args: information related to the cgi IO events 287*1c60b9acSAndroid Build Coastguard Worker * 288*1c60b9acSAndroid Build Coastguard Worker * Child process has IO 289*1c60b9acSAndroid Build Coastguard Worker */ 290*1c60b9acSAndroid Build Coastguard Worker int (*child_process_io)(void *priv, struct lws *wsi, 291*1c60b9acSAndroid Build Coastguard Worker struct lws_cgi_args *args); 292*1c60b9acSAndroid Build Coastguard Worker 293*1c60b9acSAndroid Build Coastguard Worker /** 294*1c60b9acSAndroid Build Coastguard Worker * child_process_io() - Child process has terminated 295*1c60b9acSAndroid Build Coastguard Worker * 296*1c60b9acSAndroid Build Coastguard Worker * \param priv: void * you set when this channel was created 297*1c60b9acSAndroid Build Coastguard Worker * \param wsi: the struct lws the connection belongs to 298*1c60b9acSAndroid Build Coastguard Worker * 299*1c60b9acSAndroid Build Coastguard Worker * Child process has terminated 300*1c60b9acSAndroid Build Coastguard Worker */ 301*1c60b9acSAndroid Build Coastguard Worker int (*child_process_terminated)(void *priv, struct lws *wsi); 302*1c60b9acSAndroid Build Coastguard Worker 303*1c60b9acSAndroid Build Coastguard Worker /** 304*1c60b9acSAndroid Build Coastguard Worker * disconnect_reason() - Optional notification why connection is lost 305*1c60b9acSAndroid Build Coastguard Worker * 306*1c60b9acSAndroid Build Coastguard Worker * \param reason: one of the SSH_DISCONNECT_ constants 307*1c60b9acSAndroid Build Coastguard Worker * \param desc: UTF-8 description of reason 308*1c60b9acSAndroid Build Coastguard Worker * \param desc_lang: RFC3066 language for description 309*1c60b9acSAndroid Build Coastguard Worker * 310*1c60b9acSAndroid Build Coastguard Worker * The remote peer may tell us why it's going to disconnect. Handling 311*1c60b9acSAndroid Build Coastguard Worker * this is optional. 312*1c60b9acSAndroid Build Coastguard Worker */ 313*1c60b9acSAndroid Build Coastguard Worker void (*disconnect_reason)(uint32_t reason, const char *desc, 314*1c60b9acSAndroid Build Coastguard Worker const char *desc_lang); 315*1c60b9acSAndroid Build Coastguard Worker 316*1c60b9acSAndroid Build Coastguard Worker /** 317*1c60b9acSAndroid Build Coastguard Worker * is_pubkey_authorized() - check if auth pubkey is valid for user 318*1c60b9acSAndroid Build Coastguard Worker * 319*1c60b9acSAndroid Build Coastguard Worker * \param username: username the key attempted to authenticate 320*1c60b9acSAndroid Build Coastguard Worker * \param type: "ssh-rsa" 321*1c60b9acSAndroid Build Coastguard Worker * \param peer: start of Public key peer used to authenticate 322*1c60b9acSAndroid Build Coastguard Worker * \param peer_len: length of Public key at peer 323*1c60b9acSAndroid Build Coastguard Worker * 324*1c60b9acSAndroid Build Coastguard Worker * We confirmed the client has the private key for this public key... 325*1c60b9acSAndroid Build Coastguard Worker * but is that keypair something authorized for this username on this 326*1c60b9acSAndroid Build Coastguard Worker * server? 0 = OK, 1 = fail 327*1c60b9acSAndroid Build Coastguard Worker * 328*1c60b9acSAndroid Build Coastguard Worker * Normally this checks for a copy of the same public key stored 329*1c60b9acSAndroid Build Coastguard Worker * somewhere out of band, it's the same procedure as openssh does 330*1c60b9acSAndroid Build Coastguard Worker * when looking in ~/.ssh/authorized_keys 331*1c60b9acSAndroid Build Coastguard Worker */ 332*1c60b9acSAndroid Build Coastguard Worker int (*is_pubkey_authorized)(const char *username, 333*1c60b9acSAndroid Build Coastguard Worker const char *type, const uint8_t *peer, int peer_len); 334*1c60b9acSAndroid Build Coastguard Worker 335*1c60b9acSAndroid Build Coastguard Worker /** 336*1c60b9acSAndroid Build Coastguard Worker * banner() - copy the connection banner to buffer 337*1c60b9acSAndroid Build Coastguard Worker * 338*1c60b9acSAndroid Build Coastguard Worker * \param buf: start of the buffer to copy to 339*1c60b9acSAndroid Build Coastguard Worker * \param max_len: maximum number of bytes the buffer can hold 340*1c60b9acSAndroid Build Coastguard Worker * \param lang: start of the buffer to copy language descriptor to 341*1c60b9acSAndroid Build Coastguard Worker * \param max_lang_len: maximum number of bytes lang can hold 342*1c60b9acSAndroid Build Coastguard Worker * 343*1c60b9acSAndroid Build Coastguard Worker * Copy the text banner to be returned to client on connect, 344*1c60b9acSAndroid Build Coastguard Worker * before auth, into buf. The text should be in UTF-8. 345*1c60b9acSAndroid Build Coastguard Worker * if none wanted then leave .banner as NULL. 346*1c60b9acSAndroid Build Coastguard Worker * 347*1c60b9acSAndroid Build Coastguard Worker * lang should have a RFC3066 language descriptor like "en/US" 348*1c60b9acSAndroid Build Coastguard Worker * copied to it. 349*1c60b9acSAndroid Build Coastguard Worker * 350*1c60b9acSAndroid Build Coastguard Worker * Returns the number of bytes copies to buf. 351*1c60b9acSAndroid Build Coastguard Worker */ 352*1c60b9acSAndroid Build Coastguard Worker size_t (*banner)(char *buf, size_t max_len, char *lang, 353*1c60b9acSAndroid Build Coastguard Worker size_t max_lang_len); 354*1c60b9acSAndroid Build Coastguard Worker 355*1c60b9acSAndroid Build Coastguard Worker /** 356*1c60b9acSAndroid Build Coastguard Worker * SSH version string sent to client (required) 357*1c60b9acSAndroid Build Coastguard Worker * By convention a string like "SSH-2.0-Libwebsockets" 358*1c60b9acSAndroid Build Coastguard Worker */ 359*1c60b9acSAndroid Build Coastguard Worker const char *server_string; 360*1c60b9acSAndroid Build Coastguard Worker 361*1c60b9acSAndroid Build Coastguard Worker /** 362*1c60b9acSAndroid Build Coastguard Worker * set to the API version you support (current is in 363*1c60b9acSAndroid Build Coastguard Worker * LWS_SSH_OPS_VERSION) You should set it to an integer like 1, 364*1c60b9acSAndroid Build Coastguard Worker * that reflects the latest api at the time your code was written. If 365*1c60b9acSAndroid Build Coastguard Worker * the ops api_version is not equal to the LWS_SSH_OPS_VERSION of the 366*1c60b9acSAndroid Build Coastguard Worker * plugin, it will error out at runtime. 367*1c60b9acSAndroid Build Coastguard Worker */ 368*1c60b9acSAndroid Build Coastguard Worker char api_version; 369*1c60b9acSAndroid Build Coastguard Worker }; 370*1c60b9acSAndroid Build Coastguard Worker ///@} 371*1c60b9acSAndroid Build Coastguard Worker 372*1c60b9acSAndroid Build Coastguard Worker #endif 373*1c60b9acSAndroid Build Coastguard Worker 374