LibVNCServer/LibVNCClient
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
rfbtightproto.h
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2005 Novell, Inc.
3  * All Rights Reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, contact Novell, Inc.
16  *
17  * To contact Novell about this file by physical or electronic mail,
18  * you may find current contact information at www.novell.com
19  *
20  * Author : Rohit Kumar
21  * Email ID : rokumar@novell.com
22  * Date : 25th August 2005
23  */
24 
25 #ifndef RFBTIGHTPROTO_H
26 #define RFBTIGHTPROTO_H
27 
28 #include <rfb/rfb.h>
29 #include <limits.h>
30 
31 /* PATH_MAX is not defined in limits.h on some platforms */
32 #ifndef PATH_MAX
33 #define PATH_MAX 4096
34 #endif
35 
36 
37 #define rfbSecTypeTight 16
38 
39 void rfbTightUsage(void);
40 int rfbTightProcessArgs(int argc, char *argv[]);
41 
42 /*-----------------------------------------------------------------------------
43  * Negotiation of Tunneling Capabilities (protocol version 3.7t)
44  *
45  * If the chosen security type is rfbSecTypeTight, the server sends a list of
46  * supported tunneling methods ("tunneling" refers to any additional layer of
47  * data transformation, such as encryption or external compression.)
48  *
49  * nTunnelTypes specifies the number of following rfbCapabilityInfo structures
50  * that list all supported tunneling methods in the order of preference.
51  *
52  * NOTE: If nTunnelTypes is 0, that tells the client that no tunneling can be
53  * used, and the client should not send a response requesting a tunneling
54  * method.
55  */
56 
57 typedef struct _rfbTunnelingCapsMsg {
58  uint32_t nTunnelTypes;
59  /* followed by nTunnelTypes * rfbCapabilityInfo structures */
61 
62 #define sz_rfbTunnelingCapsMsg 4
63 
64 /*-----------------------------------------------------------------------------
65  * Tunneling Method Request (protocol version 3.7t)
66  *
67  * If the list of tunneling capabilities sent by the server was not empty, the
68  * client should reply with a 32-bit code specifying a particular tunneling
69  * method. The following code should be used for no tunneling.
70  */
71 
72 #define rfbNoTunneling 0
73 #define sig_rfbNoTunneling "NOTUNNEL"
74 
75 
76 /*-----------------------------------------------------------------------------
77  * Negotiation of Authentication Capabilities (protocol version 3.7t)
78  *
79  * After setting up tunneling, the server sends a list of supported
80  * authentication schemes.
81  *
82  * nAuthTypes specifies the number of following rfbCapabilityInfo structures
83  * that list all supported authentication schemes in the order of preference.
84  *
85  * NOTE: If nAuthTypes is 0, that tells the client that no authentication is
86  * necessary, and the client should not send a response requesting an
87  * authentication scheme.
88  */
89 
90 typedef struct _rfbAuthenticationCapsMsg {
91  uint32_t nAuthTypes;
92  /* followed by nAuthTypes * rfbCapabilityInfo structures */
94 
95 #define sz_rfbAuthenticationCapsMsg 4
96 
97 /*-----------------------------------------------------------------------------
98  * Authentication Scheme Request (protocol version 3.7t)
99  *
100  * If the list of authentication capabilities sent by the server was not empty,
101  * the client should reply with a 32-bit code specifying a particular
102  * authentication scheme. The following codes are supported.
103  */
104 
105 #define rfbAuthNone 1
106 #define rfbAuthVNC 2
107 #define rfbAuthUnixLogin 129
108 #define rfbAuthExternal 130
109 
110 #define sig_rfbAuthNone "NOAUTH__"
111 #define sig_rfbAuthVNC "VNCAUTH_"
112 #define sig_rfbAuthUnixLogin "ULGNAUTH"
113 #define sig_rfbAuthExternal "XTRNAUTH"
114 
115 /*-----------------------------------------------------------------------------
116  * Structure used to describe protocol options such as tunneling methods,
117  * authentication schemes and message types (protocol version 3.7t).
118  */
119 
120 typedef struct _rfbCapabilityInfo {
121 
122  uint32_t code; /* numeric identifier */
123  uint8_t vendorSignature[4]; /* vendor identification */
124  uint8_t nameSignature[8]; /* abbreviated option name */
125 
127 
128 #define sz_rfbCapabilityInfoVendor 4
129 #define sz_rfbCapabilityInfoName 8
130 #define sz_rfbCapabilityInfo 16
131 
132 /*
133  * Vendors known by TightVNC: standard VNC/RealVNC, TridiaVNC, and TightVNC.
134  */
135 
136 #define rfbStandardVendor "STDV"
137 #define rfbTridiaVncVendor "TRDV"
138 #define rfbTightVncVendor "TGHT"
139 
140 
141 /* It's a good idea to keep these values a bit greater than required. */
142 #define MAX_TIGHT_ENCODINGS 10
143 #define MAX_TUNNELING_CAPS 16
144 #define MAX_AUTH_CAPS 16
145 
146 typedef struct _rfbClientFileDownload {
147  char fName[PATH_MAX];
149  unsigned long mTime;
152 
153 typedef struct _rfbClientFileUpload {
154  char fName[PATH_MAX];
156  unsigned long mTime;
157  unsigned long fSize;
158  int uploadFD;
160 
161 typedef struct _rfbClientFileTransfer {
165 
166 
167 typedef struct _rfbTightClientRec {
168 
169  /* Lists of capability codes sent to clients. We remember these
170  lists to restrict clients from choosing those tunneling and
171  authentication types that were not advertised. */
172 
174  uint32_t authCaps[MAX_AUTH_CAPS];
175 
176  /* This is not useful while we don't support tunneling:
177  int nTunnelingCaps;
178  uint32_t tunnelingCaps[MAX_TUNNELING_CAPS]; */
179 
181 
182 } rfbTightClientRec, *rfbTightClientPtr;
183 
184 /*
185  * Macro to fill in an rfbCapabilityInfo structure (protocol 3.7t).
186  * Normally, using macros is no good, but this macro saves us from
187  * writing constants twice -- it constructs signature names from codes.
188  * Note that "code_sym" argument should be a single symbol, not an expression.
189  */
190 
191 #define SetCapInfo(cap_ptr, code_sym, vendor) \
192 { \
193  rfbCapabilityInfo *pcap; \
194  pcap = (cap_ptr); \
195  pcap->code = Swap32IfLE(code_sym); \
196  memcpy(pcap->vendorSignature, (vendor), \
197  sz_rfbCapabilityInfoVendor); \
198  memcpy(pcap->nameSignature, sig_##code_sym, \
199  sz_rfbCapabilityInfoName); \
200 }
201 
202 void rfbHandleSecTypeTight(rfbClientPtr cl);
203 
204 
205 /*-----------------------------------------------------------------------------
206  * Server Interaction Capabilities Message (protocol version 3.7t)
207  *
208  * In the protocol version 3.7t, the server informs the client what message
209  * types it supports in addition to ones defined in the protocol version 3.7.
210  * Also, the server sends the list of all supported encodings (note that it's
211  * not necessary to advertise the "raw" encoding sinse it MUST be supported in
212  * RFB 3.x protocols).
213  *
214  * This data immediately follows the server initialisation message.
215  */
216 
217 typedef struct _rfbInteractionCapsMsg {
220  uint16_t nEncodingTypes;
221  uint16_t pad; /* reserved, must be 0 */
222  /* followed by nServerMessageTypes * rfbCapabilityInfo structures */
223  /* followed by nClientMessageTypes * rfbCapabilityInfo structures */
225 
226 #define sz_rfbInteractionCapsMsg 8
227 
228 #define rfbFileListData 130
229 #define rfbFileDownloadData 131
230 #define rfbFileUploadCancel 132
231 #define rfbFileDownloadFailed 133
232 
233 /* signatures for non-standard messages */
234 #define sig_rfbFileListData "FTS_LSDT"
235 #define sig_rfbFileDownloadData "FTS_DNDT"
236 #define sig_rfbFileUploadCancel "FTS_UPCN"
237 #define sig_rfbFileDownloadFailed "FTS_DNFL"
238 
239 
240 
241 #define rfbFileListRequest 130
242 #define rfbFileDownloadRequest 131
243 #define rfbFileUploadRequest 132
244 #define rfbFileUploadData 133
245 #define rfbFileDownloadCancel 134
246 #define rfbFileUploadFailed 135
247 #define rfbFileCreateDirRequest 136
248 
249 /* signatures for non-standard messages */
250 #define sig_rfbFileListRequest "FTC_LSRQ"
251 #define sig_rfbFileDownloadRequest "FTC_DNRQ"
252 #define sig_rfbFileUploadRequest "FTC_UPRQ"
253 #define sig_rfbFileUploadData "FTC_UPDT"
254 #define sig_rfbFileDownloadCancel "FTC_DNCN"
255 #define sig_rfbFileUploadFailed "FTC_UPFL"
256 #define sig_rfbFileCreateDirRequest "FTC_FCDR"
257 
258 
259 /* signatures for basic encoding types */
260 #define sig_rfbEncodingRaw "RAW_____"
261 #define sig_rfbEncodingCopyRect "COPYRECT"
262 #define sig_rfbEncodingRRE "RRE_____"
263 #define sig_rfbEncodingCoRRE "CORRE___"
264 #define sig_rfbEncodingHextile "HEXTILE_"
265 #define sig_rfbEncodingZlib "ZLIB____"
266 #define sig_rfbEncodingTight "TIGHT___"
267 #define sig_rfbEncodingZlibHex "ZLIBHEX_"
268 
269 
270 /* signatures for "fake" encoding types */
271 #define sig_rfbEncodingCompressLevel0 "COMPRLVL"
272 #define sig_rfbEncodingXCursor "X11CURSR"
273 #define sig_rfbEncodingRichCursor "RCHCURSR"
274 #define sig_rfbEncodingPointerPos "POINTPOS"
275 #define sig_rfbEncodingLastRect "LASTRECT"
276 #define sig_rfbEncodingNewFBSize "NEWFBSIZ"
277 #define sig_rfbEncodingQualityLevel0 "JPEGQLVL"
278 
279 
280 /*-----------------------------------------------------------------------------
281  * FileListRequest
282  */
283 
284 typedef struct _rfbFileListRequestMsg {
285  uint8_t type;
286  uint8_t flags;
287  uint16_t dirNameSize;
288  /* Followed by char Dirname[dirNameSize] */
290 
291 #define sz_rfbFileListRequestMsg 4
292 
293 /*-----------------------------------------------------------------------------
294  * FileDownloadRequest
295  */
296 
297 typedef struct _rfbFileDownloadRequestMsg {
298  uint8_t type;
300  uint16_t fNameSize;
301  uint32_t position;
302  /* Followed by char Filename[fNameSize] */
304 
305 #define sz_rfbFileDownloadRequestMsg 8
306 
307 /*-----------------------------------------------------------------------------
308  * FileUploadRequest
309  */
310 
311 typedef struct _rfbFileUploadRequestMsg {
312  uint8_t type;
314  uint16_t fNameSize;
315  uint32_t position;
316  /* Followed by char Filename[fNameSize] */
318 
319 #define sz_rfbFileUploadRequestMsg 8
320 
321 
322 /*-----------------------------------------------------------------------------
323  * FileUploadData
324  */
325 
326 typedef struct _rfbFileUploadDataMsg {
327  uint8_t type;
329  uint16_t realSize;
330  uint16_t compressedSize;
331  /* Followed by File[compressedSize],
332  but if (realSize = compressedSize = 0) followed by uint32_t modTime */
334 
335 #define sz_rfbFileUploadDataMsg 6
336 
337 /*-----------------------------------------------------------------------------
338  * FileDownloadCancel
339  */
340 
341 typedef struct _rfbFileDownloadCancelMsg {
342  uint8_t type;
343  uint8_t unused;
344  uint16_t reasonLen;
345  /* Followed by reason[reasonLen] */
347 
348 #define sz_rfbFileDownloadCancelMsg 4
349 
350 /*-----------------------------------------------------------------------------
351  * FileUploadFailed
352  */
353 
354 typedef struct _rfbFileUploadFailedMsg {
355  uint8_t type;
356  uint8_t unused;
357  uint16_t reasonLen;
358  /* Followed by reason[reasonLen] */
360 
361 #define sz_rfbFileUploadFailedMsg 4
362 
363 /*-----------------------------------------------------------------------------
364  * FileCreateDirRequest
365  */
366 
367 typedef struct _rfbFileCreateDirRequestMsg {
368  uint8_t type;
369  uint8_t unused;
370  uint16_t dNameLen;
371  /* Followed by dName[dNameLen] */
373 
374 #define sz_rfbFileCreateDirRequestMsg 4
375 
376 
377 /*-----------------------------------------------------------------------------
378  * Union of all client->server messages.
379  */
380 
381 typedef union _rfbClientToServerTightMsg {
390 
391 
392 
393 /*-----------------------------------------------------------------------------
394  * FileListData
395  */
396 
397 typedef struct _rfbFileListDataMsg {
398  uint8_t type;
399  uint8_t flags;
400  uint16_t numFiles;
401  uint16_t dataSize;
402  uint16_t compressedSize;
403  /* Followed by SizeData[numFiles] */
404  /* Followed by Filenames[compressedSize] */
406 
407 #define sz_rfbFileListDataMsg 8
408 
409 /*-----------------------------------------------------------------------------
410  * FileDownloadData
411  */
412 
413 typedef struct _rfbFileDownloadDataMsg {
414  uint8_t type;
415  uint8_t compressLevel;
416  uint16_t realSize;
417  uint16_t compressedSize;
418  /* Followed by File[copressedSize],
419  but if (realSize = compressedSize = 0) followed by uint32_t modTime */
421 
422 #define sz_rfbFileDownloadDataMsg 6
423 
424 
425 /*-----------------------------------------------------------------------------
426  * FileUploadCancel
427  */
428 
429 typedef struct _rfbFileUploadCancelMsg {
430  uint8_t type;
431  uint8_t unused;
432  uint16_t reasonLen;
433  /* Followed by reason[reasonLen] */
435 
436 #define sz_rfbFileUploadCancelMsg 4
437 
438 /*-----------------------------------------------------------------------------
439  * FileDownloadFailed
440  */
441 
442 typedef struct _rfbFileDownloadFailedMsg {
443  uint8_t type;
444  uint8_t unused;
445  uint16_t reasonLen;
446  /* Followed by reason[reasonLen] */
448 
449 #define sz_rfbFileDownloadFailedMsg 4
450 
451 
452 
453 
454 #endif
455 
456