コード例 #1
0
        private MemoryStream modifyDataRow(DataRowMessage dataRow, RowDescriptionMessage rowDescription)
        {
            Func <string, string> maskingFunction;
            var ms = new MemoryStream();

            ms.Write(EndianHelpers.ToBigE(dataRow.NumFields));

            int i = 0;

            foreach (var f in dataRow.DataRowFields)
            {
                uint   tableOid    = rowDescription.FieldDescriptions[i].ObjectId;
                string columnName  = rowDescription.FieldDescriptions[i].FieldName;
                uint   dataTypeOid = rowDescription.FieldDescriptions[i].DataTypeObjectId;

                //If the column vale is null or we are preserving keyed column values and the column is either a primary or foreign key.
                if (f.ColumnValueLength == -1 || (_state._maskingModel.PreserveKeys && _state.isColumnKeyed(tableOid, columnName)))
                {
                    ms.Write(EndianHelpers.ToBigE(f.ColumnValueLength));
                    ms.Write(f.ColumnValue);
                }
                else
                {
                    maskingFunction = getMaskingFunction(tableOid, dataTypeOid, columnName);
                    string rowValue  = System.Text.Encoding.UTF8.GetString(f.ColumnValue);
                    byte[] newBytes  = System.Text.Encoding.UTF8.GetBytes(maskingFunction(rowValue));
                    byte[] newLength = EndianHelpers.ToBigE(newBytes.Length);
                    ms.Write(newLength);
                    ms.Write(newBytes);
                }
                i++;
            }
            return(ms);
        }
コード例 #2
0
ファイル: TcpProxy.cs プロジェクト: superf0sh/masquerade
        private void OnDataReceiveFromClient(IAsyncResult result)
        {
            var state = (State)result.AsyncState;

            try
            {
                var bytesRead = state.ClientSocket.EndReceive(result);

                if (bytesRead > 0)
                {
                    //here we check to see if front end has sent an SSLRequest message.
                    //TODO: Currently, we assume the SSLRequest will come in a single buffer read.  If the message were to come in two or more reads we would miss it.
                    if (EndianHelpers.SwapEndianness(BitConverter.ToUInt32(state.ClientBuffer, 0)) == 8 && EndianHelpers.SwapEndianness(BitConverter.ToUInt32(state.ClientBuffer, 4)) == 80877103)
                    {
                        Console.WriteLine("Client has made SSLRequest.  This is not supported.");
                        _inProcessOfNegotiatingSSL = true;
                    }

                    //do nothing for now. Add logic here to parse FrontEnd requests.
                    state.DatabaseSocket.Send(state.ClientBuffer, bytesRead, SocketFlags.None);
                    state.ClientSocket.BeginReceive(state.ClientBuffer, 0, state.ClientBuffer.Length, 0, OnDataReceiveFromClient, state);
                }
            }
            catch
            {
                state.ClientSocket.Close();
                state.DatabaseSocket.Close();
                _resetStatemachine();
            }
        }
コード例 #3
0
        private void handleRowDescription(byte[] buffer, int offset, int messageLength)
        {
            ushort numFields = EndianHelpers.SwapEndianness(BitConverter.ToUInt16(buffer, offset));

            offset += 2;
            currentRowDescription                   = new RowDescriptionMessage();
            currentRowDescription.NumFields         = numFields;
            currentRowDescription.FieldDescriptions = new List <RowDescriptionField>();
            for (int i = 0; i < numFields; i++)
            {
                RowDescriptionField df = new RowDescriptionField();
                int z = offset;
                while (buffer[z] != 0)
                {
                    z++;
                }

                string fieldName = Encoding.ASCII.GetString(buffer, offset, z - offset);
                offset       = z + 1; //we add 1 because string will end with a null.
                df.FieldName = fieldName;

                uint objectId = EndianHelpers.SwapEndianness(BitConverter.ToUInt32(buffer, offset));
                offset     += 4;
                df.ObjectId = objectId;

                ushort attrId = EndianHelpers.SwapEndianness(BitConverter.ToUInt16(buffer, offset));
                offset   += 2;
                df.AttrId = attrId;

                uint dataTypeObjectId = EndianHelpers.SwapEndianness(BitConverter.ToUInt32(buffer, offset));
                offset += 4;
                df.DataTypeObjectId = dataTypeObjectId;

                ushort dataTypeSize = EndianHelpers.SwapEndianness(BitConverter.ToUInt16(buffer, offset));
                offset         += 2;
                df.DataTypeSize = dataTypeSize;

                uint typeModifier = EndianHelpers.SwapEndianness(BitConverter.ToUInt32(buffer, offset));
                offset         += 4;
                df.TypeModifier = typeModifier;

                ushort formatCode = EndianHelpers.SwapEndianness(BitConverter.ToUInt16(buffer, offset));
                offset       += 2;
                df.FormatCode = formatCode;

                currentRowDescription.FieldDescriptions.Add(df);
            }
            var shouldModify = _shouldModifyTable(currentRowDescription.FieldDescriptions.First().ObjectId);

            currentRowDescription.ShouldModify = shouldModify;
        }
コード例 #4
0
        private byte[] handleDataRow(byte[] buffer, int messageLength)
        {
            var dataRow = new DataRowMessage();

            int    offset    = 5; //1 byte for message type and 4 bytes for the int32 that states the length.
            ushort numFields = EndianHelpers.SwapEndianness(BitConverter.ToUInt16(buffer, 5));

            dataRow.NumFields = numFields;
            if (numFields != 0)
            {
                dataRow.DataRowFields = new List <DataRowField>(numFields);
            }
            offset += 2;
            for (int i = 0; i < numFields; i++)
            {
                var dataRowField      = new DataRowField();
                int columnValueLength = IPAddress.NetworkToHostOrder(BitConverter.ToInt32(buffer, offset));
                dataRowField.ColumnValueLength = columnValueLength;
                offset += 4;
                if (columnValueLength != -1)
                {
                    dataRowField.ColumnValue = new byte[columnValueLength];
                    Buffer.BlockCopy(buffer, offset, dataRowField.ColumnValue, 0, columnValueLength);
                    var colValue = Encoding.ASCII.GetString(buffer, offset, columnValueLength);
                    offset += columnValueLength;
                }
                dataRow.DataRowFields.Add(dataRowField);
            }
            var modifiedResultStream = _modifyDataRow(dataRow, currentRowDescription);

            modifiedResultStream.Seek(0, SeekOrigin.Begin);
            var message = new byte[modifiedResultStream.Length + 5];

            message[0] = buffer[0];

            var newLength = EndianHelpers.ToBigE((int)modifiedResultStream.Length + 4);

            message[1] = newLength[0];
            message[2] = newLength[1];
            message[3] = newLength[2];
            message[4] = newLength[3];
            modifiedResultStream.Read(message, 5, (int)modifiedResultStream.Length);
            return(message);
        }
コード例 #5
0
 private int getMessageLength(byte[] buffer)
 {
     return((int)EndianHelpers.SwapEndianness(BitConverter.ToUInt32(buffer)));
 }