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));
 }
Exemplo n.º 3
0
        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...
            }
        }