VeNCrypt should handle classical types
VeNCrypt is a superset of the original security types, so it should be fine to send any of the classical values here as well.
This commit is contained in:
87
core/rfb.js
87
core/rfb.js
@@ -1524,48 +1524,66 @@ export default class RFB extends EventTargetMixin {
|
||||
subtypes.push(this._sock.rQshift32());
|
||||
}
|
||||
|
||||
if (subtypes.indexOf(securityTypePlain) != -1) {
|
||||
// 0x100 = 256
|
||||
this._sock.send([0, 0, 1, 0]);
|
||||
this._rfbVeNCryptState = 4;
|
||||
} else {
|
||||
return this._fail("VeNCrypt Plain subtype not offered by server");
|
||||
}
|
||||
}
|
||||
// Look for a matching security type in the order that the
|
||||
// server prefers
|
||||
this._rfbAuthScheme = -1;
|
||||
for (let type of subtypes) {
|
||||
// Avoid getting in to a loop
|
||||
if (type === securityTypeVeNCrypt) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// negotiated Plain subtype, server waits for password
|
||||
if (this._rfbVeNCryptState == 4) {
|
||||
if (this._rfbCredentials.username === undefined ||
|
||||
this._rfbCredentials.password === undefined) {
|
||||
this.dispatchEvent(new CustomEvent(
|
||||
"credentialsrequired",
|
||||
{ detail: { types: ["username", "password"] } }));
|
||||
return false;
|
||||
if (this._isSupportedSecurityType(type)) {
|
||||
this._rfbAuthScheme = type;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const user = encodeUTF8(this._rfbCredentials.username);
|
||||
const pass = encodeUTF8(this._rfbCredentials.password);
|
||||
if (this._rfbAuthScheme === -1) {
|
||||
return this._fail("Unsupported security types (types: " + subtypes + ")");
|
||||
}
|
||||
|
||||
this._sock.send([
|
||||
(user.length >> 24) & 0xFF,
|
||||
(user.length >> 16) & 0xFF,
|
||||
(user.length >> 8) & 0xFF,
|
||||
user.length & 0xFF
|
||||
]);
|
||||
this._sock.send([
|
||||
(pass.length >> 24) & 0xFF,
|
||||
(pass.length >> 16) & 0xFF,
|
||||
(pass.length >> 8) & 0xFF,
|
||||
pass.length & 0xFF
|
||||
]);
|
||||
this._sock.sendString(user);
|
||||
this._sock.sendString(pass);
|
||||
this._sock.send([this._rfbAuthScheme >> 24,
|
||||
this._rfbAuthScheme >> 16,
|
||||
this._rfbAuthScheme >> 8,
|
||||
this._rfbAuthScheme]);
|
||||
|
||||
this._rfbInitState = "SecurityResult";
|
||||
this._rfbVeNCryptState == 4;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
_negotiatePlainAuth() {
|
||||
if (this._rfbCredentials.username === undefined ||
|
||||
this._rfbCredentials.password === undefined) {
|
||||
this.dispatchEvent(new CustomEvent(
|
||||
"credentialsrequired",
|
||||
{ detail: { types: ["username", "password"] } }));
|
||||
return false;
|
||||
}
|
||||
|
||||
const user = encodeUTF8(this._rfbCredentials.username);
|
||||
const pass = encodeUTF8(this._rfbCredentials.password);
|
||||
|
||||
this._sock.send([
|
||||
(user.length >> 24) & 0xFF,
|
||||
(user.length >> 16) & 0xFF,
|
||||
(user.length >> 8) & 0xFF,
|
||||
user.length & 0xFF
|
||||
]);
|
||||
this._sock.send([
|
||||
(pass.length >> 24) & 0xFF,
|
||||
(pass.length >> 16) & 0xFF,
|
||||
(pass.length >> 8) & 0xFF,
|
||||
pass.length & 0xFF
|
||||
]);
|
||||
this._sock.sendString(user);
|
||||
this._sock.sendString(pass);
|
||||
|
||||
this._rfbInitState = "SecurityResult";
|
||||
return true;
|
||||
}
|
||||
|
||||
_negotiateStdVNCAuth() {
|
||||
if (this._sock.rQwait("auth challenge", 16)) { return false; }
|
||||
|
||||
@@ -1877,6 +1895,9 @@ export default class RFB extends EventTargetMixin {
|
||||
case securityTypeVeNCrypt:
|
||||
return this._negotiateVeNCryptAuth();
|
||||
|
||||
case securityTypePlain:
|
||||
return this._negotiatePlainAuth();
|
||||
|
||||
case securityTypeUnixLogon:
|
||||
return this._negotiateTightUnixAuth();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user