|
|
|
/*
|
|
|
|
* Copyright (c) 2005 Novell, Inc.
|
|
|
|
* All Rights Reserved.
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of version 2 of the GNU General Public License as
|
|
|
|
* published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, contact Novell, Inc.
|
|
|
|
*
|
|
|
|
* To contact Novell about this file by physical or electronic mail,
|
|
|
|
* you may find current contact information at www.novell.com
|
|
|
|
*
|
|
|
|
* Author : Rohit Kumar
|
|
|
|
* Email ID : rokumar@novell.com
|
|
|
|
* Date : 25th August 2005
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef RFBTIGHTPROTO_H
|
|
|
|
#define RFBTIGHTPROTO_H
|
|
|
|
|
|
|
|
#include <rfb/rfb.h>
|
|
|
|
#include <limits.h>
|
|
|
|
|
|
|
|
/* PATH_MAX is not defined in limits.h on some platforms */
|
|
|
|
#ifndef PATH_MAX
|
|
|
|
#define PATH_MAX 4096
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
#define rfbSecTypeTight 16
|
|
|
|
|
|
|
|
void rfbTightUsage(void);
|
|
|
|
int rfbTightProcessArgs(int argc, char *argv[]);
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* Negotiation of Tunneling Capabilities (protocol version 3.7t)
|
|
|
|
*
|
|
|
|
* If the chosen security type is rfbSecTypeTight, the server sends a list of
|
|
|
|
* supported tunneling methods ("tunneling" refers to any additional layer of
|
|
|
|
* data transformation, such as encryption or external compression.)
|
|
|
|
*
|
|
|
|
* nTunnelTypes specifies the number of following rfbCapabilityInfo structures
|
|
|
|
* that list all supported tunneling methods in the order of preference.
|
|
|
|
*
|
|
|
|
* NOTE: If nTunnelTypes is 0, that tells the client that no tunneling can be
|
|
|
|
* used, and the client should not send a response requesting a tunneling
|
|
|
|
* method.
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbTunnelingCapsMsg {
|
|
|
|
uint32_t nTunnelTypes;
|
|
|
|
/* followed by nTunnelTypes * rfbCapabilityInfo structures */
|
|
|
|
} rfbTunnelingCapsMsg;
|
|
|
|
|
|
|
|
#define sz_rfbTunnelingCapsMsg 4
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* Tunneling Method Request (protocol version 3.7t)
|
|
|
|
*
|
|
|
|
* If the list of tunneling capabilities sent by the server was not empty, the
|
|
|
|
* client should reply with a 32-bit code specifying a particular tunneling
|
|
|
|
* method. The following code should be used for no tunneling.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define rfbNoTunneling 0
|
|
|
|
#define sig_rfbNoTunneling "NOTUNNEL"
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* Negotiation of Authentication Capabilities (protocol version 3.7t)
|
|
|
|
*
|
|
|
|
* After setting up tunneling, the server sends a list of supported
|
|
|
|
* authentication schemes.
|
|
|
|
*
|
|
|
|
* nAuthTypes specifies the number of following rfbCapabilityInfo structures
|
|
|
|
* that list all supported authentication schemes in the order of preference.
|
|
|
|
*
|
|
|
|
* NOTE: If nAuthTypes is 0, that tells the client that no authentication is
|
|
|
|
* necessary, and the client should not send a response requesting an
|
|
|
|
* authentication scheme.
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbAuthenticationCapsMsg {
|
|
|
|
uint32_t nAuthTypes;
|
|
|
|
/* followed by nAuthTypes * rfbCapabilityInfo structures */
|
|
|
|
} rfbAuthenticationCapsMsg;
|
|
|
|
|
|
|
|
#define sz_rfbAuthenticationCapsMsg 4
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* Authentication Scheme Request (protocol version 3.7t)
|
|
|
|
*
|
|
|
|
* If the list of authentication capabilities sent by the server was not empty,
|
|
|
|
* the client should reply with a 32-bit code specifying a particular
|
|
|
|
* authentication scheme. The following codes are supported.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define rfbAuthNone 1
|
|
|
|
#define rfbAuthVNC 2
|
|
|
|
#define rfbAuthUnixLogin 129
|
|
|
|
#define rfbAuthExternal 130
|
|
|
|
|
|
|
|
#define sig_rfbAuthNone "NOAUTH__"
|
|
|
|
#define sig_rfbAuthVNC "VNCAUTH_"
|
|
|
|
#define sig_rfbAuthUnixLogin "ULGNAUTH"
|
|
|
|
#define sig_rfbAuthExternal "XTRNAUTH"
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* Structure used to describe protocol options such as tunneling methods,
|
|
|
|
* authentication schemes and message types (protocol version 3.7t).
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbCapabilityInfo {
|
|
|
|
|
|
|
|
uint32_t code; /* numeric identifier */
|
|
|
|
uint8_t vendorSignature[4]; /* vendor identification */
|
|
|
|
uint8_t nameSignature[8]; /* abbreviated option name */
|
|
|
|
|
|
|
|
} rfbCapabilityInfo;
|
|
|
|
|
|
|
|
#define sz_rfbCapabilityInfoVendor 4
|
|
|
|
#define sz_rfbCapabilityInfoName 8
|
|
|
|
#define sz_rfbCapabilityInfo 16
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Vendors known by TightVNC: standard VNC/RealVNC, TridiaVNC, and TightVNC.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define rfbStandardVendor "STDV"
|
|
|
|
#define rfbTridiaVncVendor "TRDV"
|
|
|
|
#define rfbTightVncVendor "TGHT"
|
|
|
|
|
|
|
|
|
|
|
|
/* It's a good idea to keep these values a bit greater than required. */
|
|
|
|
#define MAX_TIGHT_ENCODINGS 10
|
|
|
|
#define MAX_TUNNELING_CAPS 16
|
|
|
|
#define MAX_AUTH_CAPS 16
|
|
|
|
|
|
|
|
typedef struct _rfbClientFileDownload {
|
|
|
|
char fName[PATH_MAX];
|
|
|
|
int downloadInProgress;
|
|
|
|
unsigned long mTime;
|
|
|
|
int downloadFD;
|
|
|
|
pthread_t downloadThread;
|
|
|
|
} rfbClientFileDownload ;
|
|
|
|
|
|
|
|
typedef struct _rfbClientFileUpload {
|
|
|
|
char fName[PATH_MAX];
|
|
|
|
int uploadInProgress;
|
|
|
|
unsigned long mTime;
|
|
|
|
unsigned long fSize;
|
|
|
|
int uploadFD;
|
|
|
|
} rfbClientFileUpload ;
|
|
|
|
|
|
|
|
typedef struct _rfbClientFileTransfer {
|
|
|
|
rfbClientFileDownload rcfd;
|
|
|
|
rfbClientFileUpload rcfu;
|
|
|
|
} rfbClientFileTransfer;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct _rfbTightClientRec {
|
|
|
|
|
|
|
|
/* Lists of capability codes sent to clients. We remember these
|
|
|
|
lists to restrict clients from choosing those tunneling and
|
|
|
|
authentication types that were not advertised. */
|
|
|
|
|
|
|
|
int nAuthCaps;
|
|
|
|
uint32_t authCaps[MAX_AUTH_CAPS];
|
|
|
|
|
|
|
|
/* This is not useful while we don't support tunneling:
|
|
|
|
int nTunnelingCaps;
|
|
|
|
uint32_t tunnelingCaps[MAX_TUNNELING_CAPS]; */
|
|
|
|
|
|
|
|
rfbClientFileTransfer rcft;
|
|
|
|
|
|
|
|
} rfbTightClientRec, *rfbTightClientPtr;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Macro to fill in an rfbCapabilityInfo structure (protocol 3.7t).
|
|
|
|
* Normally, using macros is no good, but this macro saves us from
|
|
|
|
* writing constants twice -- it constructs signature names from codes.
|
|
|
|
* Note that "code_sym" argument should be a single symbol, not an expression.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#define SetCapInfo(cap_ptr, code_sym, vendor) \
|
|
|
|
{ \
|
|
|
|
rfbCapabilityInfo *pcap; \
|
|
|
|
pcap = (cap_ptr); \
|
|
|
|
pcap->code = Swap32IfLE(code_sym); \
|
|
|
|
memcpy(pcap->vendorSignature, (vendor), \
|
|
|
|
sz_rfbCapabilityInfoVendor); \
|
|
|
|
memcpy(pcap->nameSignature, sig_##code_sym, \
|
|
|
|
sz_rfbCapabilityInfoName); \
|
|
|
|
}
|
|
|
|
|
|
|
|
void rfbHandleSecTypeTight(rfbClientPtr cl);
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* Server Interaction Capabilities Message (protocol version 3.7t)
|
|
|
|
*
|
|
|
|
* In the protocol version 3.7t, the server informs the client what message
|
|
|
|
* types it supports in addition to ones defined in the protocol version 3.7.
|
|
|
|
* Also, the server sends the list of all supported encodings (note that it's
|
|
|
|
* not necessary to advertise the "raw" encoding since it MUST be supported in
|
|
|
|
* RFB 3.x protocols).
|
|
|
|
*
|
|
|
|
* This data immediately follows the server initialisation message.
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbInteractionCapsMsg {
|
|
|
|
uint16_t nServerMessageTypes;
|
|
|
|
uint16_t nClientMessageTypes;
|
|
|
|
uint16_t nEncodingTypes;
|
|
|
|
uint16_t pad; /* reserved, must be 0 */
|
|
|
|
/* followed by nServerMessageTypes * rfbCapabilityInfo structures */
|
|
|
|
/* followed by nClientMessageTypes * rfbCapabilityInfo structures */
|
|
|
|
} rfbInteractionCapsMsg;
|
|
|
|
|
|
|
|
#define sz_rfbInteractionCapsMsg 8
|
|
|
|
|
|
|
|
#define rfbFileListData 130
|
|
|
|
#define rfbFileDownloadData 131
|
|
|
|
#define rfbFileUploadCancel 132
|
|
|
|
#define rfbFileDownloadFailed 133
|
|
|
|
|
|
|
|
/* signatures for non-standard messages */
|
|
|
|
#define sig_rfbFileListData "FTS_LSDT"
|
|
|
|
#define sig_rfbFileDownloadData "FTS_DNDT"
|
|
|
|
#define sig_rfbFileUploadCancel "FTS_UPCN"
|
|
|
|
#define sig_rfbFileDownloadFailed "FTS_DNFL"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define rfbFileListRequest 130
|
|
|
|
#define rfbFileDownloadRequest 131
|
|
|
|
#define rfbFileUploadRequest 132
|
|
|
|
#define rfbFileUploadData 133
|
|
|
|
#define rfbFileDownloadCancel 134
|
|
|
|
#define rfbFileUploadFailed 135
|
|
|
|
#define rfbFileCreateDirRequest 136
|
|
|
|
|
|
|
|
/* signatures for non-standard messages */
|
|
|
|
#define sig_rfbFileListRequest "FTC_LSRQ"
|
|
|
|
#define sig_rfbFileDownloadRequest "FTC_DNRQ"
|
|
|
|
#define sig_rfbFileUploadRequest "FTC_UPRQ"
|
|
|
|
#define sig_rfbFileUploadData "FTC_UPDT"
|
|
|
|
#define sig_rfbFileDownloadCancel "FTC_DNCN"
|
|
|
|
#define sig_rfbFileUploadFailed "FTC_UPFL"
|
|
|
|
#define sig_rfbFileCreateDirRequest "FTC_FCDR"
|
|
|
|
|
|
|
|
|
|
|
|
/* signatures for basic encoding types */
|
|
|
|
#define sig_rfbEncodingRaw "RAW_____"
|
|
|
|
#define sig_rfbEncodingCopyRect "COPYRECT"
|
|
|
|
#define sig_rfbEncodingRRE "RRE_____"
|
|
|
|
#define sig_rfbEncodingCoRRE "CORRE___"
|
|
|
|
#define sig_rfbEncodingHextile "HEXTILE_"
|
|
|
|
#define sig_rfbEncodingZlib "ZLIB____"
|
|
|
|
#define sig_rfbEncodingTight "TIGHT___"
|
|
|
|
#define sig_rfbEncodingZlibHex "ZLIBHEX_"
|
|
|
|
|
|
|
|
|
|
|
|
/* signatures for "fake" encoding types */
|
|
|
|
#define sig_rfbEncodingCompressLevel0 "COMPRLVL"
|
|
|
|
#define sig_rfbEncodingXCursor "X11CURSR"
|
|
|
|
#define sig_rfbEncodingRichCursor "RCHCURSR"
|
|
|
|
#define sig_rfbEncodingPointerPos "POINTPOS"
|
|
|
|
#define sig_rfbEncodingLastRect "LASTRECT"
|
|
|
|
#define sig_rfbEncodingNewFBSize "NEWFBSIZ"
|
|
|
|
#define sig_rfbEncodingQualityLevel0 "JPEGQLVL"
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* FileListRequest
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbFileListRequestMsg {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t flags;
|
|
|
|
uint16_t dirNameSize;
|
|
|
|
/* Followed by char Dirname[dirNameSize] */
|
|
|
|
} rfbFileListRequestMsg;
|
|
|
|
|
|
|
|
#define sz_rfbFileListRequestMsg 4
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* FileDownloadRequest
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbFileDownloadRequestMsg {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t compressedLevel;
|
|
|
|
uint16_t fNameSize;
|
|
|
|
uint32_t position;
|
|
|
|
/* Followed by char Filename[fNameSize] */
|
|
|
|
} rfbFileDownloadRequestMsg;
|
|
|
|
|
|
|
|
#define sz_rfbFileDownloadRequestMsg 8
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* FileUploadRequest
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbFileUploadRequestMsg {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t compressedLevel;
|
|
|
|
uint16_t fNameSize;
|
|
|
|
uint32_t position;
|
|
|
|
/* Followed by char Filename[fNameSize] */
|
|
|
|
} rfbFileUploadRequestMsg;
|
|
|
|
|
|
|
|
#define sz_rfbFileUploadRequestMsg 8
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* FileUploadData
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbFileUploadDataMsg {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t compressedLevel;
|
|
|
|
uint16_t realSize;
|
|
|
|
uint16_t compressedSize;
|
|
|
|
/* Followed by File[compressedSize],
|
|
|
|
but if (realSize = compressedSize = 0) followed by uint32_t modTime */
|
|
|
|
} rfbFileUploadDataMsg;
|
|
|
|
|
|
|
|
#define sz_rfbFileUploadDataMsg 6
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* FileDownloadCancel
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbFileDownloadCancelMsg {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t unused;
|
|
|
|
uint16_t reasonLen;
|
|
|
|
/* Followed by reason[reasonLen] */
|
|
|
|
} rfbFileDownloadCancelMsg;
|
|
|
|
|
|
|
|
#define sz_rfbFileDownloadCancelMsg 4
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* FileUploadFailed
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbFileUploadFailedMsg {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t unused;
|
|
|
|
uint16_t reasonLen;
|
|
|
|
/* Followed by reason[reasonLen] */
|
|
|
|
} rfbFileUploadFailedMsg;
|
|
|
|
|
|
|
|
#define sz_rfbFileUploadFailedMsg 4
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* FileCreateDirRequest
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbFileCreateDirRequestMsg {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t unused;
|
|
|
|
uint16_t dNameLen;
|
|
|
|
/* Followed by dName[dNameLen] */
|
|
|
|
} rfbFileCreateDirRequestMsg;
|
|
|
|
|
|
|
|
#define sz_rfbFileCreateDirRequestMsg 4
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* Union of all client->server messages.
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef union _rfbClientToServerTightMsg {
|
|
|
|
rfbFileListRequestMsg flr;
|
|
|
|
rfbFileDownloadRequestMsg fdr;
|
|
|
|
rfbFileUploadRequestMsg fupr;
|
|
|
|
rfbFileUploadDataMsg fud;
|
|
|
|
rfbFileDownloadCancelMsg fdc;
|
|
|
|
rfbFileUploadFailedMsg fuf;
|
|
|
|
rfbFileCreateDirRequestMsg fcdr;
|
|
|
|
} rfbClientToServerTightMsg;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* FileListData
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbFileListDataMsg {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t flags;
|
|
|
|
uint16_t numFiles;
|
|
|
|
uint16_t dataSize;
|
|
|
|
uint16_t compressedSize;
|
|
|
|
/* Followed by SizeData[numFiles] */
|
|
|
|
/* Followed by Filenames[compressedSize] */
|
|
|
|
} rfbFileListDataMsg;
|
|
|
|
|
|
|
|
#define sz_rfbFileListDataMsg 8
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* FileDownloadData
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbFileDownloadDataMsg {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t compressLevel;
|
|
|
|
uint16_t realSize;
|
|
|
|
uint16_t compressedSize;
|
|
|
|
/* Followed by File[copressedSize],
|
|
|
|
but if (realSize = compressedSize = 0) followed by uint32_t modTime */
|
|
|
|
} rfbFileDownloadDataMsg;
|
|
|
|
|
|
|
|
#define sz_rfbFileDownloadDataMsg 6
|
|
|
|
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* FileUploadCancel
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbFileUploadCancelMsg {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t unused;
|
|
|
|
uint16_t reasonLen;
|
|
|
|
/* Followed by reason[reasonLen] */
|
|
|
|
} rfbFileUploadCancelMsg;
|
|
|
|
|
|
|
|
#define sz_rfbFileUploadCancelMsg 4
|
|
|
|
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
|
|
* FileDownloadFailed
|
|
|
|
*/
|
|
|
|
|
|
|
|
typedef struct _rfbFileDownloadFailedMsg {
|
|
|
|
uint8_t type;
|
|
|
|
uint8_t unused;
|
|
|
|
uint16_t reasonLen;
|
|
|
|
/* Followed by reason[reasonLen] */
|
|
|
|
} rfbFileDownloadFailedMsg;
|
|
|
|
|
|
|
|
#define sz_rfbFileDownloadFailedMsg 4
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|