Exemplo n.º 1
0
        private static PayloadWriter CreateCapabilitiesPayload(ProtocolCapabilities serverCapabilities, ConnectionSettings cs, bool useCompression, ProtocolCapabilities additionalCapabilities = 0)
        {
            var writer = new PayloadWriter();

            writer.WriteInt32((int)(
                                  ProtocolCapabilities.Protocol41 |
                                  ProtocolCapabilities.LongPassword |
                                  ProtocolCapabilities.SecureConnection |
                                  (serverCapabilities & ProtocolCapabilities.PluginAuth) |
                                  (serverCapabilities & ProtocolCapabilities.PluginAuthLengthEncodedClientData) |
                                  ProtocolCapabilities.MultiStatements |
                                  ProtocolCapabilities.MultiResults |
                                  ProtocolCapabilities.LocalFiles |
                                  (string.IsNullOrWhiteSpace(cs.Database) ? 0 : ProtocolCapabilities.ConnectWithDatabase) |
                                  (cs.UseAffectedRows ? 0 : ProtocolCapabilities.FoundRows) |
                                  (useCompression ? ProtocolCapabilities.Compress : ProtocolCapabilities.None) |
                                  (serverCapabilities & ProtocolCapabilities.ConnectionAttributes) |
                                  (serverCapabilities & ProtocolCapabilities.DeprecateEof) |
                                  additionalCapabilities));
            writer.WriteInt32(0x4000_0000);
            writer.WriteByte((byte)CharacterSet.Utf8Mb4Binary);
            writer.Write(new byte[23]);

            return(writer);
        }
Exemplo n.º 2
0
        public static PayloadData Create(string databaseName)
        {
            var writer = new PayloadWriter();

            writer.WriteByte((byte)CommandKind.InitDatabase);
            writer.Write(Encoding.UTF8.GetBytes(databaseName));

            return(writer.ToPayloadData());
        }
Exemplo n.º 3
0
        public static PayloadData Create(string user, byte[] authResponse, string schemaName, byte[] connectionAttributes)
        {
            var writer = new PayloadWriter();

            writer.WriteByte((byte)CommandKind.ChangeUser);
            writer.WriteNullTerminatedString(user);
            writer.WriteByte(checked ((byte)authResponse.Length));
            writer.Write(authResponse);
            writer.WriteNullTerminatedString(schemaName ?? "");
            writer.WriteByte((byte)CharacterSet.Utf8Mb4Binary);
            writer.WriteByte(0);
            writer.WriteNullTerminatedString("mysql_native_password");
            if (connectionAttributes != null)
            {
                writer.Write(connectionAttributes);
            }

            return(writer.ToPayloadData());
        }
Exemplo n.º 4
0
        /// <summary>
        /// Return a random outpoint and a random payload.
        /// </summary>
        private (Outpoint, Memory <byte>) MakeRandomRawTxo(int lowLimit, int upLimit)
        {
            var content = new byte[Outpoint.TotalSizeInBytes].AsMemory();
            var temp    = new byte[Outpoint.KeySizeInBytes - 4];

            _rand.NextBytes(temp);
            temp.CopyTo(content);

            var index = _rand.Next(0, 20);

            BitConverter.GetBytes(index).CopyTo(content.Slice(Outpoint.KeySizeInBytes - 4, 4));

            var payloadLength = _rand.Next(lowLimit, upLimit);

            BitConverter.GetBytes(payloadLength).CopyTo(content.Slice(Outpoint.KeySizeInBytes, 4));

            var payload = new byte[payloadLength];

            _rand.NextBytes(payload);

            var numberOfEvents = _rand.Next(1, 5);

            // write data length inside payload

            BitConverter.TryWriteBytes(payload.AsSpan(sizeof(ulong), sizeof(int)),
                                       payloadLength - sizeof(ulong) - sizeof(int) - BlockEvent.SizeInBytes * numberOfEvents);

            var writer = new PayloadWriter(payload.AsSpan(payloadLength - BlockEvent.SizeInBytes * numberOfEvents));

            for (var i = 0; i < numberOfEvents; ++i)
            {
                var ev = new BlockEvent((uint)_rand.Next(0, 1_000_000));
                writer.Write(ev);
            }

            return(Outpoint.Create(content.Span), payload);
        }
Exemplo n.º 5
0
        private static byte[] CreateConnectionAttributes()
        {
            var attributesWriter = new PayloadWriter();

            attributesWriter.WriteLengthEncodedString("_client_name");
            attributesWriter.WriteLengthEncodedString("MySqlConnector");
            attributesWriter.WriteLengthEncodedString("_client_version");
            attributesWriter.WriteLengthEncodedString(typeof(ServerSession).GetTypeInfo().Assembly.GetCustomAttribute <AssemblyInformationalVersionAttribute>().InformationalVersion);
            try
            {
                Utility.GetOSDetails(out var os, out var osDescription, out var architecture);
                if (os != null)
                {
                    attributesWriter.WriteLengthEncodedString("_os");
                    attributesWriter.WriteLengthEncodedString(os);
                }
                attributesWriter.WriteLengthEncodedString("_os_details");
                attributesWriter.WriteLengthEncodedString(osDescription);
                attributesWriter.WriteLengthEncodedString("_platform");
                attributesWriter.WriteLengthEncodedString(architecture);
            }
            catch (PlatformNotSupportedException)
            {
            }
            using (var process = Process.GetCurrentProcess())
            {
                attributesWriter.WriteLengthEncodedString("_pid");
                attributesWriter.WriteLengthEncodedString(process.Id.ToString(CultureInfo.InvariantCulture));
            }
            var connectionAttributes = attributesWriter.ToBytes();

            var writer = new PayloadWriter();

            writer.WriteLengthEncodedInteger((ulong)connectionAttributes.Length);
            writer.Write(connectionAttributes);
            return(writer.ToBytes());
        }