Diffstat (limited to 'noncore/comm/keypebble/krfblogin.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | noncore/comm/keypebble/krfblogin.cpp | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/noncore/comm/keypebble/krfblogin.cpp b/noncore/comm/keypebble/krfblogin.cpp index 0b4a757..2bbd110 100644 --- a/noncore/comm/keypebble/krfblogin.cpp +++ b/noncore/comm/keypebble/krfblogin.cpp | |||
@@ -1,148 +1,148 @@ | |||
1 | #include <assert.h> | 1 | #include <assert.h> |
2 | 2 | ||
3 | 3 | ||
4 | extern "C" { | 4 | extern "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 | 11 | ||
12 | // 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 |
13 | // wait for). | 13 | // wait for). |
14 | const int ServerVersionLength = 12; | 14 | const int ServerVersionLength = 12; |
15 | const int ClientVersionLength = 12; | 15 | const int ClientVersionLength = 12; |
16 | const int AuthSchemeLength = 4; | 16 | const int AuthSchemeLength = 4; |
17 | const int FailureReasonSizeLength = 4; | 17 | const int FailureReasonSizeLength = 4; |
18 | const int ChallengeLength = 16; | 18 | const int ChallengeLength = 16; |
19 | const int AuthResultLength = 4; | 19 | const int AuthResultLength = 4; |
20 | 20 | ||
21 | // Authentication results | 21 | // Authentication results |
22 | enum AuthResult { | 22 | enum AuthResult { |
23 | AuthOk, | 23 | AuthOk, |
24 | AuthFailed, | 24 | AuthFailed, |
25 | AuthTooMany | 25 | AuthTooMany |
26 | }; | 26 | }; |
27 | 27 | ||
28 | typedef unsigned char CARD8; | 28 | typedef unsigned char CARD8; |
29 | typedef unsigned short CARD16; | 29 | typedef unsigned short CARD16; |
30 | typedef unsigned long CARD32; | 30 | typedef unsigned long CARD32; |
31 | 31 | ||
32 | const int endianTest = 1; | 32 | const int endianTest = 1; |
33 | 33 | ||
34 | // Endian stuff | 34 | // Endian stuff |
35 | #define Swap16IfLE(s) \ | 35 | #define Swap16IfLE(s) \ |
36 | (*(char *)&endianTest ? ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) : (s)) | 36 | (*(char *)&endianTest ? ((((s) & 0xff) << 8) | (((s) >> 8) & 0xff)) : (s)) |
37 | 37 | ||
38 | #define Swap32IfLE(l) \ | 38 | #define Swap32IfLE(l) \ |
39 | (*(char *)&endianTest ? ((((l) & 0xff000000) >> 24) | \ | 39 | (*(char *)&endianTest ? ((((l) & 0xff000000) >> 24) | \ |
40 | (((l) & 0x00ff0000) >> 8) | \ | 40 | (((l) & 0x00ff0000) >> 8) | \ |
41 | (((l) & 0x0000ff00) << 8) | \ | 41 | (((l) & 0x0000ff00) << 8) | \ |
42 | (((l) & 0x000000ff) << 24)) : (l)) | 42 | (((l) & 0x000000ff) << 24)) : (l)) |
43 | 43 | ||
44 | KRFBLogin::KRFBLogin( KRFBConnection *con ) | 44 | KRFBLogin::KRFBLogin( KRFBConnection *con ) |
45 | : QObject( con, "RFB login manager" ) | 45 | : QObject( con, "RFB login manager" ) |
46 | { | 46 | { |
47 | assert( con ); | 47 | assert( con ); |
48 | this->con = con; | 48 | this->con = con; |
49 | currentState = AwaitingServerVersion; | 49 | currentState = AwaitingServerVersion; |
50 | 50 | ||
51 | connect( this, SIGNAL( error( const QString & ) ), | 51 | connect( this, SIGNAL( error(const QString&) ), |
52 | con, SIGNAL( error( const QString & ) ) ); | 52 | con, SIGNAL( error(const QString&) ) ); |
53 | 53 | ||
54 | 54 | ||
55 | qWarning( "Waiting for server version..." ); | 55 | qWarning( "Waiting for server version..." ); |
56 | 56 | ||
57 | static QString statusMsg = tr( "Waiting for server version..." ); | 57 | static QString statusMsg = tr( "Waiting for server version..." ); |
58 | emit status( statusMsg ); | 58 | emit status( statusMsg ); |
59 | 59 | ||
60 | // Kick off the state machine | 60 | // Kick off the state machine |
61 | connect( con, SIGNAL( gotEnoughData() ), SLOT( gotServerVersion() ) ); | 61 | connect( con, SIGNAL( gotEnoughData() ), SLOT( gotServerVersion() ) ); |
62 | con->waitForData( ServerVersionLength ); | 62 | con->waitForData( ServerVersionLength ); |
63 | } | 63 | } |
64 | 64 | ||
65 | KRFBLogin::~KRFBLogin() | 65 | KRFBLogin::~KRFBLogin() |
66 | { | 66 | { |
67 | 67 | ||
68 | } | 68 | } |
69 | 69 | ||
70 | KRFBLogin::State KRFBLogin::state() const | 70 | KRFBLogin::State KRFBLogin::state() const |
71 | { | 71 | { |
72 | return currentState; | 72 | return currentState; |
73 | } | 73 | } |
74 | 74 | ||
75 | void KRFBLogin::gotServerVersion() | 75 | void KRFBLogin::gotServerVersion() |
76 | { | 76 | { |
77 | qWarning( "Got server version" ); | 77 | qWarning( "Got server version" ); |
78 | 78 | ||
79 | disconnect( con, SIGNAL( gotEnoughData() ), | 79 | disconnect( con, SIGNAL( gotEnoughData() ), |
80 | this, SLOT( gotServerVersion() ) ); | 80 | this, SLOT( gotServerVersion() ) ); |
81 | 81 | ||
82 | // Read the server's version message | 82 | // Read the server's version message |
83 | char serverVersion[ ServerVersionLength + 1 ]; | 83 | char serverVersion[ ServerVersionLength + 1 ]; |
84 | con->read( serverVersion, ServerVersionLength ); | 84 | con->read( serverVersion, ServerVersionLength ); |
85 | serverVersion[ ServerVersionLength ] = '\0'; | 85 | serverVersion[ ServerVersionLength ] = '\0'; |
86 | 86 | ||
87 | QCString rfbString( serverVersion, ServerVersionLength + 1 ); | 87 | QCString rfbString( serverVersion, ServerVersionLength + 1 ); |
88 | versionString = rfbString; | 88 | versionString = rfbString; |
89 | 89 | ||
90 | 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" ); |
91 | 91 | ||
92 | if ( rfbString.find( regexp ) == -1 ) { | 92 | if ( rfbString.find( regexp ) == -1 ) { |
93 | static QString msg = tr( "Error: Invalid server version, %1" ).arg( rfbString ); | 93 | static QString msg = tr( "Error: Invalid server version, %1" ).arg( rfbString ); |
94 | 94 | ||
95 | qWarning( msg ); | 95 | qWarning( msg ); |
96 | emit error( msg ); | 96 | emit error( msg ); |
97 | currentState = Error; | 97 | currentState = Error; |
98 | return; | 98 | return; |
99 | } | 99 | } |
100 | 100 | ||
101 | // Calculate the actual version number | 101 | // Calculate the actual version number |
102 | serverMajor = (serverVersion[4] - '0') * 100 | 102 | serverMajor = (serverVersion[4] - '0') * 100 |
103 | + (serverVersion[5] - '0') * 10 | 103 | + (serverVersion[5] - '0') * 10 |
104 | + (serverVersion[6] - '0'); | 104 | + (serverVersion[6] - '0'); |
105 | serverMinor = (serverVersion[8] - '0') * 100 | 105 | serverMinor = (serverVersion[8] - '0') * 100 |
106 | + (serverVersion[9] - '0') * 10 | 106 | + (serverVersion[9] - '0') * 10 |
107 | + (serverVersion[10] - '0'); | 107 | + (serverVersion[10] - '0'); |
108 | 108 | ||
109 | qWarning("Server Version: %03d.%03d", serverMajor, serverMinor ); | 109 | qWarning("Server Version: %03d.%03d", serverMajor, serverMinor ); |
110 | 110 | ||
111 | if ( serverMajor != 3 ) { | 111 | if ( serverMajor != 3 ) { |
112 | QString msg = tr( "Error: Unsupported server version, %1" ) | 112 | QString msg = tr( "Error: Unsupported server version, %1" ) |
113 | .arg( rfbString ); | 113 | .arg( rfbString ); |
114 | 114 | ||
115 | qWarning( msg ); | 115 | qWarning( msg ); |
116 | emit error( msg ); | 116 | emit error( msg ); |
117 | currentState = Error; | 117 | currentState = Error; |
118 | return; | 118 | return; |
119 | } | 119 | } |
120 | 120 | ||
121 | if ( serverMinor != 3 ) { | 121 | if ( serverMinor != 3 ) { |
122 | qWarning( "Minor version mismatch: %d", serverMinor ); | 122 | qWarning( "Minor version mismatch: %d", serverMinor ); |
123 | } | 123 | } |
124 | 124 | ||
125 | // Setup for the next state | 125 | // Setup for the next state |
126 | sendClientVersion(); | 126 | sendClientVersion(); |
127 | 127 | ||
128 | connect( con, SIGNAL( gotEnoughData() ), SLOT( gotAuthScheme() ) ); | 128 | connect( con, SIGNAL( gotEnoughData() ), SLOT( gotAuthScheme() ) ); |
129 | con->waitForData( AuthSchemeLength ); | 129 | con->waitForData( AuthSchemeLength ); |
130 | } | 130 | } |
131 | 131 | ||
132 | void KRFBLogin::gotAuthScheme() | 132 | void KRFBLogin::gotAuthScheme() |
133 | { | 133 | { |
134 | disconnect( con, SIGNAL( gotEnoughData() ), | 134 | disconnect( con, SIGNAL( gotEnoughData() ), |
135 | this, SLOT( gotAuthScheme() ) ); | 135 | this, SLOT( gotAuthScheme() ) ); |
136 | 136 | ||
137 | // Got data | 137 | // Got data |
138 | CARD32 scheme; | 138 | CARD32 scheme; |
139 | con->read( &scheme, AuthSchemeLength ); | 139 | con->read( &scheme, AuthSchemeLength ); |
140 | scheme = Swap32IfLE( scheme ); | 140 | scheme = Swap32IfLE( scheme ); |
141 | 141 | ||
142 | static QString statusMsgOk = tr( "Logged in" ); | 142 | static QString statusMsgOk = tr( "Logged in" ); |
143 | 143 | ||
144 | switch ( scheme ) { | 144 | switch ( scheme ) { |
145 | case 0: | 145 | case 0: |
146 | qWarning( "Failed" ); | 146 | qWarning( "Failed" ); |
147 | // Handle failure | 147 | // Handle failure |
148 | connect( con, SIGNAL( gotEnoughData() ), SLOT( gotFailureReasonSize() ) ); | 148 | connect( con, SIGNAL( gotEnoughData() ), SLOT( gotFailureReasonSize() ) ); |