public static HandshakeV10 Parse(ref PacketReader reader) { var handshakeV10 = new HandshakeV10(); handshakeV10.ProtocolVersion = reader.ReadByte(); handshakeV10.ServerVersion = reader.ReadNullTerminatedString(); handshakeV10.ConnectionId = reader.ReadUInt32(); handshakeV10.AuthPluginData = reader.ReadBytes(8); reader.ReadNext(1); var capabilityFlagsLow = reader.ReadUInt16(); handshakeV10.CapabilityFlags = (CapabilitiesFlags)capabilityFlagsLow; if (reader.Remaining > 0) { handshakeV10.CharacterSet = (CharacterSet)reader.ReadByte(); handshakeV10.StatusFlags = reader.ReadBytes(2); var capabilityFlagsHigh = reader.ReadUInt16(); handshakeV10.CapabilityFlags |= (CapabilitiesFlags)(capabilityFlagsHigh << 16); int pluginDataLength = 0; if ((handshakeV10.CapabilityFlags & CapabilitiesFlags.PluginAuth) != 0) { pluginDataLength = reader.ReadByte(); } else { reader.ReadNext(1); } reader.ReadNext(10); if ((handshakeV10.CapabilityFlags & CapabilitiesFlags.SecureConnection) != 0) { var part2 = reader.ReadBytes(Math.Max(13, pluginDataLength - 8)); var temp = new byte[handshakeV10.AuthPluginData.Length + part2.Length]; Buffer.BlockCopy(handshakeV10.AuthPluginData, 0, temp, 0, handshakeV10.AuthPluginData.Length); Buffer.BlockCopy(part2, 0, temp, handshakeV10.AuthPluginData.Length, part2.Length); handshakeV10.AuthPluginData = temp; } if ((handshakeV10.CapabilityFlags & CapabilitiesFlags.PluginAuth) != 0) { handshakeV10.AuthPluginName = reader.ReadNullTerminatedString(); } } return(handshakeV10); }
public static HandshakeV10 ReadHandshakeV10(ref PacketReader reader) { return(HandshakeV10.Parse(ref reader)); }
public static void WriteHandshakeResponse41(ref PacketWriter writer, MySqlConnectionOptions options, HandshakeV10 initialHandshake) { // writer.WriteInt32((int)CapabilitiesFlags.Protocol41); // TODO:other flags // currently this code is borrowed from async MySQLConnector writer.WriteInt32((int)( CapabilitiesFlags.Protocol41 | CapabilitiesFlags.LongPassword | CapabilitiesFlags.SecureConnection | (initialHandshake.CapabilityFlags & CapabilitiesFlags.PluginAuth) | (initialHandshake.CapabilityFlags & CapabilitiesFlags.PluginAuthLenencClientData) | CapabilitiesFlags.MultiStatements | CapabilitiesFlags.MultiResults | CapabilitiesFlags.PSMultiResults | CapabilitiesFlags.LocalFiles | (string.IsNullOrWhiteSpace(options.Database) ? 0 : CapabilitiesFlags.ConnectWithDB) // | //(cs.UseAffectedRows ? 0 : CapabilitiesFlags.FoundRows) | //(cs.UseCompression ? CapabilitiesFlags.Compress : CapabilitiesFlags.None) | //additionalCapabilities )); writer.WriteInt32(0x40000000); // TODO:max packet size writer.WriteByte((byte)CharacterSet.utf8mb4_bin); writer.WriteBytes(Empty23Bytes); writer.WriteNullTerminatedString(options.UserId); if (initialHandshake.CapabilityFlags.HasFlag(CapabilitiesFlags.PluginAuthLenencClientData)) { var auth = CraeateNative41AuthResponse(initialHandshake.AuthPluginData, options.Password); writer.WriteByte((byte)auth.Length); writer.WriteBytes(auth); } else { writer.WriteByte(1); } if (initialHandshake.CapabilityFlags.HasFlag(CapabilitiesFlags.ConnectWithDB)) { writer.WriteNullTerminatedString(options.Database); } if (initialHandshake.CapabilityFlags.HasFlag(CapabilitiesFlags.PluginAuth)) { writer.WriteNullTerminatedString(initialHandshake.AuthPluginName); } if (initialHandshake.CapabilityFlags.HasFlag(CapabilitiesFlags.ConnectAttrs)) { // TODO:other attributes... } }