• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 */
60  } rfbTunnelingCapsMsg;
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 */
93  } rfbAuthenticationCapsMsg;
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  
126  } rfbCapabilityInfo;
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];
148  	int downloadInProgress;
149  	unsigned long mTime;
150  	int downloadFD;
151  } rfbClientFileDownload ;
152  
153  typedef struct _rfbClientFileUpload {
154  	char fName[PATH_MAX];
155  	int uploadInProgress;
156  	unsigned long mTime;
157  	unsigned long fSize;
158  	int uploadFD;
159  } rfbClientFileUpload ;
160  
161  typedef struct _rfbClientFileTransfer {
162  	rfbClientFileDownload rcfd;
163  	rfbClientFileUpload rcfu;
164  } 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  
173      int nAuthCaps;
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  
180      rfbClientFileTransfer rcft;
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 {
218      uint16_t nServerMessageTypes;
219      uint16_t nClientMessageTypes;
220      uint16_t nEncodingTypes;
221      uint16_t pad;			/* reserved, must be 0 */
222      /* followed by nServerMessageTypes * rfbCapabilityInfo structures */
223      /* followed by nClientMessageTypes * rfbCapabilityInfo structures */
224  } rfbInteractionCapsMsg;
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] */
289  } rfbFileListRequestMsg;
290  
291  #define sz_rfbFileListRequestMsg 4
292  
293  /*-----------------------------------------------------------------------------
294   * FileDownloadRequest
295   */
296  
297  typedef struct _rfbFileDownloadRequestMsg {
298      uint8_t type;
299      uint8_t compressedLevel;
300      uint16_t fNameSize;
301      uint32_t position;
302      /* Followed by char Filename[fNameSize] */
303  } rfbFileDownloadRequestMsg;
304  
305  #define sz_rfbFileDownloadRequestMsg 8
306  
307  /*-----------------------------------------------------------------------------
308   * FileUploadRequest
309   */
310  
311  typedef struct _rfbFileUploadRequestMsg {
312      uint8_t type;
313      uint8_t compressedLevel;
314      uint16_t fNameSize;
315      uint32_t position;
316      /* Followed by char Filename[fNameSize] */
317  } rfbFileUploadRequestMsg;
318  
319  #define sz_rfbFileUploadRequestMsg 8
320  
321  
322  /*-----------------------------------------------------------------------------
323   * FileUploadData
324   */
325  
326  typedef struct _rfbFileUploadDataMsg {
327      uint8_t type;
328      uint8_t compressedLevel;
329      uint16_t realSize;
330      uint16_t compressedSize;
331      /* Followed by File[compressedSize],
332         but if (realSize = compressedSize = 0) followed by uint32_t modTime  */
333  } rfbFileUploadDataMsg;
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] */
346  } rfbFileDownloadCancelMsg;
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] */
359  } rfbFileUploadFailedMsg;
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] */
372  } rfbFileCreateDirRequestMsg;
373  
374  #define sz_rfbFileCreateDirRequestMsg 4
375  
376  
377  /*-----------------------------------------------------------------------------
378   * Union of all client->server messages.
379   */
380  
381  typedef union _rfbClientToServerTightMsg {
382      rfbFileListRequestMsg flr;
383      rfbFileDownloadRequestMsg fdr;
384      rfbFileUploadRequestMsg fupr;
385      rfbFileUploadDataMsg fud;
386      rfbFileDownloadCancelMsg fdc;
387      rfbFileUploadFailedMsg fuf;
388      rfbFileCreateDirRequestMsg fcdr;
389  } 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] */
405  } rfbFileListDataMsg;
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  */
420  } rfbFileDownloadDataMsg;
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] */
434  } rfbFileUploadCancelMsg;
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] */
447  } rfbFileDownloadFailedMsg;
448  
449  #define sz_rfbFileDownloadFailedMsg 4
450  
451  
452  
453  
454  #endif
455  
456  
457