1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.shardingsphere.db.protocol.mysql.packet.handshake;
19
20 import lombok.Getter;
21 import lombok.RequiredArgsConstructor;
22 import lombok.Setter;
23 import org.apache.shardingsphere.db.protocol.mysql.constant.MySQLAuthenticationMethod;
24 import org.apache.shardingsphere.db.protocol.mysql.constant.MySQLCapabilityFlag;
25 import org.apache.shardingsphere.db.protocol.mysql.packet.MySQLPacket;
26 import org.apache.shardingsphere.db.protocol.mysql.packet.command.admin.MySQLComSetOptionPacket;
27 import org.apache.shardingsphere.db.protocol.mysql.payload.MySQLPacketPayload;
28
29
30
31
32
33
34 @RequiredArgsConstructor
35 @Getter
36 @Setter
37 public final class MySQLHandshakeResponse41Packet extends MySQLPacket {
38
39 private final int maxPacketSize;
40
41 private final int characterSet;
42
43 private final String username;
44
45 private byte[] authResponse;
46
47 private int capabilityFlags;
48
49 private String database;
50
51 private String authPluginName;
52
53 private int multiStatementsOption;
54
55 public MySQLHandshakeResponse41Packet(final MySQLPacketPayload payload) {
56 capabilityFlags = payload.readInt4();
57 multiStatementsOption = readMultiStatementsOption(capabilityFlags);
58 maxPacketSize = payload.readInt4();
59 characterSet = payload.readInt1();
60 payload.skipReserved(23);
61 username = payload.readStringNul();
62 authResponse = readAuthResponse(payload);
63 database = readDatabase(payload);
64 authPluginName = readAuthPluginName(payload);
65 }
66
67 private int readMultiStatementsOption(final int capabilityFlags) {
68 return 0 == (capabilityFlags & MySQLCapabilityFlag.CLIENT_MULTI_STATEMENTS.getValue()) ? MySQLComSetOptionPacket.MYSQL_OPTION_MULTI_STATEMENTS_OFF
69 : MySQLComSetOptionPacket.MYSQL_OPTION_MULTI_STATEMENTS_ON;
70 }
71
72 private byte[] readAuthResponse(final MySQLPacketPayload payload) {
73 if (0 != (capabilityFlags & MySQLCapabilityFlag.CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA.getValue())) {
74 return payload.readStringLenencByBytes();
75 }
76 if (0 != (capabilityFlags & MySQLCapabilityFlag.CLIENT_SECURE_CONNECTION.getValue())) {
77 int length = payload.readInt1();
78 return payload.readStringFixByBytes(length);
79 }
80 return payload.readStringNulByBytes();
81 }
82
83 private String readDatabase(final MySQLPacketPayload payload) {
84 return 0 == (capabilityFlags & MySQLCapabilityFlag.CLIENT_CONNECT_WITH_DB.getValue()) ? null : payload.readStringNul();
85 }
86
87 private String readAuthPluginName(final MySQLPacketPayload payload) {
88 return 0 == (capabilityFlags & MySQLCapabilityFlag.CLIENT_PLUGIN_AUTH.getValue()) ? null : payload.readStringNul();
89 }
90
91
92
93
94
95
96 public void setDatabase(final String database) {
97 this.database = database;
98 capabilityFlags |= MySQLCapabilityFlag.CLIENT_CONNECT_WITH_DB.getValue();
99 }
100
101
102
103
104
105
106 public void setAuthPluginName(final MySQLAuthenticationMethod authenticationMethod) {
107 authPluginName = authenticationMethod.getMethodName();
108 capabilityFlags |= MySQLCapabilityFlag.CLIENT_PLUGIN_AUTH.getValue();
109 }
110
111 @Override
112 protected void write(final MySQLPacketPayload payload) {
113 payload.writeInt4(capabilityFlags);
114 payload.writeInt4(maxPacketSize);
115 payload.writeInt1(characterSet);
116 payload.writeReserved(23);
117 payload.writeStringNul(username);
118 writeAuthResponse(payload);
119 writeDatabase(payload);
120 writeAuthPluginName(payload);
121 }
122
123 private void writeAuthResponse(final MySQLPacketPayload payload) {
124 if (0 != (capabilityFlags & MySQLCapabilityFlag.CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA.getValue())) {
125 payload.writeStringLenenc(new String(authResponse));
126 } else if (0 != (capabilityFlags & MySQLCapabilityFlag.CLIENT_SECURE_CONNECTION.getValue())) {
127 payload.writeInt1(authResponse.length);
128 payload.writeBytes(authResponse);
129 } else {
130 payload.writeStringNul(new String(authResponse));
131 }
132 }
133
134 private void writeDatabase(final MySQLPacketPayload payload) {
135 if (0 != (capabilityFlags & MySQLCapabilityFlag.CLIENT_CONNECT_WITH_DB.getValue())) {
136 payload.writeStringNul(database);
137 }
138 }
139
140 private void writeAuthPluginName(final MySQLPacketPayload payload) {
141 if (0 != (capabilityFlags & MySQLCapabilityFlag.CLIENT_PLUGIN_AUTH.getValue())) {
142 payload.writeStringNul(authPluginName);
143 }
144 }
145 }