xref: /aosp_15_r20/external/libwebsockets/plugins/ssh-base/include/lws-plugin-ssh.h (revision 1c60b9aca93fdbc9b5f19b2d2194c91294b22281)
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