summaryrefslogtreecommitdiff
path: root/noncore/comm/keypebble/krfblogin.cpp
Unidiff
Diffstat (limited to 'noncore/comm/keypebble/krfblogin.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r--noncore/comm/keypebble/krfblogin.cpp1
1 files changed, 0 insertions, 1 deletions
diff --git a/noncore/comm/keypebble/krfblogin.cpp b/noncore/comm/keypebble/krfblogin.cpp
index 0d2a205..0b4a757 100644
--- a/noncore/comm/keypebble/krfblogin.cpp
+++ b/noncore/comm/keypebble/krfblogin.cpp
@@ -1,107 +1,106 @@
1#include <assert.h> 1#include <assert.h>
2 2
3 3
4extern "C" { 4extern "C" {
5#include "vncauth.h" 5#include "vncauth.h"
6} 6}
7 7
8#include "krfblogin.h" 8#include "krfblogin.h"
9#include "krfbconnection.h" 9#include "krfbconnection.h"
10#include <qtimer.h> 10#include <qtimer.h>
11#include <qregexp.h>
12 11
13// The length of the various messages (used to decide how many bytes to 12// The length of the various messages (used to decide how many bytes to
14// wait for). 13// wait for).
15const int ServerVersionLength = 12; 14const int ServerVersionLength = 12;
16const int ClientVersionLength = 12; 15const int ClientVersionLength = 12;
17const int AuthSchemeLength = 4; 16const int AuthSchemeLength = 4;
18const int FailureReasonSizeLength = 4; 17const int FailureReasonSizeLength = 4;
19const int ChallengeLength = 16; 18const int ChallengeLength = 16;
20const int AuthResultLength = 4; 19const int AuthResultLength = 4;
21 20
22// Authentication results 21// Authentication results
23enum AuthResult { 22enum AuthResult {
24 AuthOk, 23 AuthOk,
25 AuthFailed, 24 AuthFailed,
26 AuthTooMany 25 AuthTooMany
27}; 26};
28 27
29typedef unsigned char CARD8; 28typedef unsigned char CARD8;
30typedef unsigned short CARD16; 29typedef unsigned short CARD16;
31typedef unsigned long CARD32; 30typedef unsigned long CARD32;
32 31
33const int endianTest = 1; 32const int endianTest = 1;
34 33
35// Endian stuff 34// Endian stuff
36#define Swap16IfLE(s) \ 35#define Swap16IfLE(s) \
37 (*(char *)&endianTest ? ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) : (s)) 36 (*(char *)&endianTest ? ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) : (s))
38 37
39#define Swap32IfLE(l) \ 38#define Swap32IfLE(l) \
40 (*(char *)&endianTest ? ((((l) & 0xff000000) >> 24) | \ 39 (*(char *)&endianTest ? ((((l) & 0xff000000) >> 24) | \
41 (((l) & 0x00ff0000) >> 8) | \ 40 (((l) & 0x00ff0000) >> 8) | \
42 (((l) & 0x0000ff00) << 8) | \ 41 (((l) & 0x0000ff00) << 8) | \
43 (((l) & 0x000000ff) << 24)) : (l)) 42 (((l) & 0x000000ff) << 24)) : (l))
44 43
45KRFBLogin::KRFBLogin( KRFBConnection *con ) 44KRFBLogin::KRFBLogin( KRFBConnection *con )
46 : QObject( con, "RFB login manager" ) 45 : QObject( con, "RFB login manager" )
47{ 46{
48 assert( con ); 47 assert( con );
49 this->con = con; 48 this->con = con;
50 currentState = AwaitingServerVersion; 49 currentState = AwaitingServerVersion;
51 50
52 connect( this, SIGNAL( error( const QString & ) ), 51 connect( this, SIGNAL( error( const QString & ) ),
53 con, SIGNAL( error( const QString & ) ) ); 52 con, SIGNAL( error( const QString & ) ) );
54 53
55 54
56 qWarning( "Waiting for server version..." ); 55 qWarning( "Waiting for server version..." );
57 56
58 static QString statusMsg = tr( "Waiting for server version..." ); 57 static QString statusMsg = tr( "Waiting for server version..." );
59 emit status( statusMsg ); 58 emit status( statusMsg );
60 59
61 // Kick off the state machine 60 // Kick off the state machine
62 connect( con, SIGNAL( gotEnoughData() ), SLOT( gotServerVersion() ) ); 61 connect( con, SIGNAL( gotEnoughData() ), SLOT( gotServerVersion() ) );
63 con->waitForData( ServerVersionLength ); 62 con->waitForData( ServerVersionLength );
64} 63}
65 64
66KRFBLogin::~KRFBLogin() 65KRFBLogin::~KRFBLogin()
67{ 66{
68 67
69} 68}
70 69
71KRFBLogin::State KRFBLogin::state() const 70KRFBLogin::State KRFBLogin::state() const
72{ 71{
73 return currentState; 72 return currentState;
74} 73}
75 74
76void KRFBLogin::gotServerVersion() 75void KRFBLogin::gotServerVersion()
77{ 76{
78 qWarning( "Got server version" ); 77 qWarning( "Got server version" );
79 78
80 disconnect( con, SIGNAL( gotEnoughData() ), 79 disconnect( con, SIGNAL( gotEnoughData() ),
81 this, SLOT( gotServerVersion() ) ); 80 this, SLOT( gotServerVersion() ) );
82 81
83 // Read the server's version message 82 // Read the server's version message
84 char serverVersion[ ServerVersionLength + 1 ]; 83 char serverVersion[ ServerVersionLength + 1 ];
85 con->read( serverVersion, ServerVersionLength ); 84 con->read( serverVersion, ServerVersionLength );
86 serverVersion[ ServerVersionLength ] = '\0'; 85 serverVersion[ ServerVersionLength ] = '\0';
87 86
88 QCString rfbString( serverVersion, ServerVersionLength + 1 ); 87 QCString rfbString( serverVersion, ServerVersionLength + 1 );
89 versionString = rfbString; 88 versionString = rfbString;
90 89
91 QRegExp regexp( "RFB [0-9][0-9][0-9]\\.[0-9][0-9][0-9]\n" ); 90 QRegExp regexp( "RFB [0-9][0-9][0-9]\\.[0-9][0-9][0-9]\n" );
92 91
93 if ( rfbString.find( regexp ) == -1 ) { 92 if ( rfbString.find( regexp ) == -1 ) {
94 static QString msg = tr( "Error: Invalid server version, %1" ).arg( rfbString ); 93 static QString msg = tr( "Error: Invalid server version, %1" ).arg( rfbString );
95 94
96 qWarning( msg ); 95 qWarning( msg );
97 emit error( msg ); 96 emit error( msg );
98 currentState = Error; 97 currentState = Error;
99 return; 98 return;
100 } 99 }
101 100
102 // Calculate the actual version number 101 // Calculate the actual version number
103 serverMajor = (serverVersion[4] - '0') * 100 102 serverMajor = (serverVersion[4] - '0') * 100
104 + (serverVersion[5] - '0') * 10 103 + (serverVersion[5] - '0') * 10
105 + (serverVersion[6] - '0'); 104 + (serverVersion[6] - '0');
106 serverMinor = (serverVersion[8] - '0') * 100 105 serverMinor = (serverVersion[8] - '0') * 100
107 + (serverVersion[9] - '0') * 10 106 + (serverVersion[9] - '0') * 10