package DBProxy.MySQL.Protocol; import java.util.ArrayList; public class Handshake extends Packet { public long protocolVersion = 0x0a; public String serverVersion = ""; public long connectionId = 0; public String challenge1 = ""; public long capabilityFlags = Flags.CLIENT_PROTOCOL_41; public long characterSet = 0; public long statusFlags = 0; public String challenge2 = ""; public long authPluginDataLength = 0; public String authPluginName = ""; public void setCapabilityFlag(long flag) { this.capabilityFlags |= flag; } public void removeCapabilityFlag(long flag) { this.capabilityFlags &= ~flag; } public void toggleCapabilityFlag(long flag) { this.capabilityFlags ^= flag; } public boolean hasCapabilityFlag(long flag) { return ((this.capabilityFlags & flag) == flag); } public void setStatusFlag(long flag) { this.statusFlags |= flag; } public void removeStatusFlag(long flag) { this.statusFlags &= ~flag; } public void toggleStatusFlag(long flag) { this.statusFlags ^= flag; } public boolean hasStatusFlag(long flag) { return ((this.statusFlags & flag) == flag); } public ArrayList<byte[]> getPayload() { ArrayList<byte[]> payload = new ArrayList<byte[]>(); payload.add( Proto.build_fixed_int(1, this.protocolVersion)); payload.add( Proto.build_null_str(this.serverVersion)); payload.add( Proto.build_fixed_int(4, this.connectionId)); payload.add( Proto.build_fixed_str(8, this.challenge1)); payload.add( Proto.build_filler(1)); payload.add( Proto.build_fixed_int(2, this.capabilityFlags >> 16)); payload.add( Proto.build_fixed_int(1, this.characterSet)); payload.add( Proto.build_fixed_int(2, this.statusFlags)); payload.add( Proto.build_fixed_int(2, this.capabilityFlags & 0xffff)); if (this.hasCapabilityFlag(Flags.CLIENT_SECURE_CONNECTION)) { payload.add( Proto.build_fixed_int(1, this.authPluginDataLength)); } else { payload.add( Proto.build_filler(1)); } payload.add( Proto.build_fixed_str(10, "")); if (this.hasCapabilityFlag(Flags.CLIENT_SECURE_CONNECTION)) { payload.add( Proto.build_fixed_str(Math.max(13, this.authPluginDataLength - 8), this.challenge2)); } if (this.hasCapabilityFlag(Flags.CLIENT_PLUGIN_AUTH)) { payload.add( Proto.build_null_str(this.authPluginName)); } return payload; } public static Handshake loadFromPacket(byte[] packet) { Handshake obj = new Handshake(); Proto proto = new Proto(packet, 3); obj.sequenceId = proto.get_fixed_int(1); obj.protocolVersion = proto.get_fixed_int(1); obj.serverVersion = proto.get_null_str(); obj.connectionId = proto.get_fixed_int(4); obj.challenge1 = proto.get_fixed_str(8); proto.get_filler(1); obj.capabilityFlags = proto.get_fixed_int(2) << 16; if (proto.has_remaining_data()) { obj.characterSet = proto.get_fixed_int(1); obj.statusFlags = proto.get_fixed_int(2); obj.setCapabilityFlag(proto.get_fixed_int(2)); if (obj.hasCapabilityFlag(Flags.CLIENT_PLUGIN_AUTH)) { obj.authPluginDataLength = proto.get_fixed_int(1); } else { proto.get_filler(1); } proto.get_filler(10); if (obj.hasCapabilityFlag(Flags.CLIENT_SECURE_CONNECTION)) { obj.challenge2 = proto.get_fixed_str(Math.max(13, obj.authPluginDataLength - 8)); } if (obj.hasCapabilityFlag(Flags.CLIENT_PLUGIN_AUTH)) { obj.authPluginName = proto.get_null_str(); } } return obj; } }