-
-
Notifications
You must be signed in to change notification settings - Fork 65
/
auth.ts
66 lines (64 loc) · 2.37 KB
/
auth.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import { BufferWriter } from "../../buffer.ts";
import ServerCapabilities from "../../consttants/capabilities.ts";
import { auth } from "../../auth/mysql_native_password.ts";
import { HandshakeBody } from "../parsers/handshake.ts";
import { Charset } from "../../consttants/charset.ts";
/** @ignore */
export function buildAuth(
packet: HandshakeBody,
params: { username: string; password: string; db: string }
): Uint8Array {
let clientParam: number =
(params.db ? ServerCapabilities.CLIENT_CONNECT_WITH_DB : 0) |
ServerCapabilities.CLIENT_PLUGIN_AUTH |
ServerCapabilities.CLIENT_LONG_PASSWORD |
ServerCapabilities.CLIENT_PROTOCOL_41 |
ServerCapabilities.CLIENT_TRANSACTIONS |
ServerCapabilities.CLIENT_MULTI_RESULTS |
ServerCapabilities.CLIENT_SECURE_CONNECTION;
if (packet.serverCapabilities & ServerCapabilities.CLIENT_LONG_FLAG) {
clientParam |= ServerCapabilities.CLIENT_LONG_FLAG;
}
if (
packet.serverCapabilities &
ServerCapabilities.CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA
) {
clientParam |= ServerCapabilities.CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA;
}
if (packet.serverCapabilities & ServerCapabilities.CLIENT_DEPRECATE_EOF) {
clientParam |= ServerCapabilities.CLIENT_DEPRECATE_EOF;
}
if (packet.serverCapabilities & ServerCapabilities.CLIENT_PLUGIN_AUTH) {
const writer = new BufferWriter(new Uint8Array(1000));
writer
.writeUint32(clientParam)
.writeUint32(265 * 256 * 256 - 1)
.write(Charset.UTF8_GENERAL_CI)
.skip(23)
.writeNullTerminatedString(params.username);
if (params.password) {
const authData = auth(params.password, packet.seed);
if (
clientParam &
ServerCapabilities.CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA ||
clientParam & ServerCapabilities.CLIENT_SECURE_CONNECTION
) {
// request lenenc-int length of auth-response and string[n] auth-response
writer.write(authData.length);
writer.writeBuffer(authData);
} else {
writer.writeBuffer(authData);
writer.write(0);
}
} else {
writer.write(0);
}
if (clientParam & ServerCapabilities.CLIENT_CONNECT_WITH_DB) {
writer.writeNullTerminatedString(params.db);
}
if (clientParam & ServerCapabilities.CLIENT_PLUGIN_AUTH) {
writer.writeNullTerminatedString(packet.authPluginName);
}
return writer.wroteData;
}
}