diff --git a/pkg/clients/docker/docker_client.go b/pkg/clients/docker/docker_client.go index feb32b364..8b077e1d1 100755 --- a/pkg/clients/docker/docker_client.go +++ b/pkg/clients/docker/docker_client.go @@ -537,8 +537,8 @@ func (idc *internalDockerClient) AddNetworkToCompose(dockerComposefilePath, newC &yaml.Node{ Kind: yaml.MappingNode, Content: []*yaml.Node{ - &yaml.Node{Kind: yaml.ScalarNode, Value: "external"}, - &yaml.Node{Kind: yaml.ScalarNode, Value: "true"}, + {Kind: yaml.ScalarNode, Value: "external"}, + {Kind: yaml.ScalarNode, Value: "true"}, }, }, ) @@ -560,7 +560,7 @@ func (idc *internalDockerClient) AddNetworkToCompose(dockerComposefilePath, newC &yaml.Node{ Kind: yaml.SequenceNode, Content: []*yaml.Node{ - &yaml.Node{Kind: yaml.ScalarNode, Value: "keploy-network"}, + {Kind: yaml.ScalarNode, Value: "keploy-network"}, }, }, ) diff --git a/pkg/graph/service.go b/pkg/graph/service.go index c9b8621f6..43526f72f 100644 --- a/pkg/graph/service.go +++ b/pkg/graph/service.go @@ -7,4 +7,4 @@ import ( type graphInterface interface { Serve(path string, proxyPort uint32, mongoPassword, testReportPath string, generateTestReport bool, Delay uint64, pid, port uint32, lang string, passThroughPorts []uint, apiTimeout uint64, appCmd string, enableTele bool, testFilters map[string][]string) stopGraphqlServer(http *http.Server) -} \ No newline at end of file +} diff --git a/pkg/hooks/ringBufReader.go b/pkg/hooks/ringBufReader.go index 5029a6140..e114c99dd 100755 --- a/pkg/hooks/ringBufReader.go +++ b/pkg/hooks/ringBufReader.go @@ -105,7 +105,6 @@ func socketDataEventCallback(reader *ringbuf.Reader, connectionFactory *connecti continue } - data := record.RawSample if len(data) < eventAttributesSize { logger.Debug(fmt.Sprintf("Buffer's for SocketDataEvent is smaller (%d) than the minimum required (%d)", len(data), eventAttributesSize)) diff --git a/pkg/models/config.go b/pkg/models/config.go index f1ae1ab57..7236e129a 100644 --- a/pkg/models/config.go +++ b/pkg/models/config.go @@ -51,7 +51,6 @@ test: coverageReportPath: "" ` - type Config struct { Record Record `json:"record" yaml:"record"` Test Test `json:"test" yaml:"test"` @@ -103,7 +102,7 @@ type Test struct { BypassEndpointsRegistry []string `json:"bypassEndpointsRegistry" yaml:"bypassEndpointsRegistry"` WithCoverage bool `json:"withCoverage" yaml:"withCoverage"` // boolean to capture the coverage in test CoverageReportPath string `json:"coverageReportPath" yaml:"coverageReportPath"` // directory path to store the coverage files - GenerateTestReport bool `json:"generateTestReport" yaml:"generateTestReport"` + GenerateTestReport bool `json:"generateTestReport" yaml:"generateTestReport"` IgnoreOrdering bool `json:"ignoreOrdering" yaml:"ignoreOrdering"` Stubs Stubs `json:"stubs" yaml:"stubs"` } diff --git a/pkg/models/mock.go b/pkg/models/mock.go index fa3544dfb..bde675447 100755 --- a/pkg/models/mock.go +++ b/pkg/models/mock.go @@ -55,4 +55,4 @@ const ( type GenericPayload struct { Origin OriginType `json:"Origin,omitempty" yaml:"origin" bson:"origin,omitempty"` Message []OutputBinary `json:"Message,omitempty" yaml:"message" bson:"message,omitempty"` -} \ No newline at end of file +} diff --git a/pkg/models/mysql.go b/pkg/models/mysql.go index 0960e9d9d..9998fa4a4 100644 --- a/pkg/models/mysql.go +++ b/pkg/models/mysql.go @@ -197,4 +197,4 @@ type AuthSwitchRequestPacket struct { StatusTag byte `json:"status_tag,omitempty" yaml:"status_tag,omitempty,flow" bson:"status_tag,omitempty"` PluginName string `json:"plugin_name,omitempty" yaml:"plugin_name,omitempty,flow" bson:"plugin_name,omitempty"` PluginAuthData string `json:"plugin_authdata,omitempty" yaml:"plugin_authdata,omitempty,flow" bson:"plugin_authdata,omitempty"` -} \ No newline at end of file +} diff --git a/pkg/models/postgres.go b/pkg/models/postgres.go index f93b48b5f..22bd02ba2 100755 --- a/pkg/models/postgres.go +++ b/pkg/models/postgres.go @@ -46,7 +46,7 @@ type Frontend struct { PacketTypes []string `json:"header,omitempty" yaml:"header,omitempty,flow"` Identfier string `json:"identifier,omitempty" yaml:"identifier,omitempty"` Length uint32 `json:"length,omitempty" yaml:"length,omitempty"` - Payload string `json:"payload,omitempty" yaml:"payload,omitempty"` + Payload string `json:"payload,omitempty" yaml:"payload,omitempty"` AuthenticationOk pgproto3.AuthenticationOk `json:"authentication_ok,omitempty" yaml:"authentication_ok,omitempty"` AuthenticationCleartextPassword pgproto3.AuthenticationCleartextPassword `json:"authentication_cleartext_password,omitempty" yaml:"authentication_cleartext_password,omitempty"` AuthenticationMD5Password pgproto3.AuthenticationMD5Password `json:"authentication_md5_password,omitempty" yaml:"authentication_md5_password,omitempty"` diff --git a/pkg/models/testcase.go b/pkg/models/testcase.go index 40c7a2fc5..0609ee464 100755 --- a/pkg/models/testcase.go +++ b/pkg/models/testcase.go @@ -53,4 +53,4 @@ type TestCase struct { func (tc *TestCase) GetKind() string { return string(tc.Kind) -} \ No newline at end of file +} diff --git a/pkg/platform/yaml/testReport.go b/pkg/platform/yaml/testReport.go index b2aaca6e2..7c3bf36ea 100755 --- a/pkg/platform/yaml/testReport.go +++ b/pkg/platform/yaml/testReport.go @@ -98,13 +98,13 @@ func (fe *TestReport) Write(ctx context.Context, path string, doc platform.KindS data = append(data, d...) validatedPath, err := util.ValidatePath(filepath.Join(path, readDock.Name+".yaml")) - if err != nil { - return fmt.Errorf("%s failed to validate path: %s", Emoji, err.Error()) - } - - err = os.WriteFile(validatedPath, data, os.ModePerm) - if err != nil { - return fmt.Errorf("%s failed to write test report in yaml file. error: %s", Emoji, err.Error()) - } + if err != nil { + return fmt.Errorf("%s failed to validate path: %s", Emoji, err.Error()) + } + + err = os.WriteFile(validatedPath, data, os.ModePerm) + if err != nil { + return fmt.Errorf("%s failed to write test report in yaml file. error: %s", Emoji, err.Error()) + } return nil } diff --git a/pkg/proxy/integrations/postgresParser/postgres_parser.go b/pkg/proxy/integrations/postgresParser/postgres_parser.go index 78781d976..f83d7a0f3 100755 --- a/pkg/proxy/integrations/postgresParser/postgres_parser.go +++ b/pkg/proxy/integrations/postgresParser/postgres_parser.go @@ -1,3 +1,4 @@ +// Package postgresparser provides functionality for parsing and processing PostgreSQL requests and responses. package postgresparser import ( @@ -61,10 +62,16 @@ func (p *PostgresParser) OutgoingType(buffer []byte) bool { func (p *PostgresParser) ProcessOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, ctx context.Context) { switch models.GetMode() { case models.MODE_RECORD: - encodePostgresOutgoing(requestBuffer, clientConn, destConn, p.hooks, p.logger, ctx) + err := encodePostgresOutgoing(requestBuffer, clientConn, destConn, p.hooks, p.logger, ctx) + if err != nil { + p.logger.Error("failed to encode the outgoing postgres call", zap.Error(err)) + } case models.MODE_TEST: logger := p.logger.With(zap.Any("Client IP Address", clientConn.RemoteAddr().String()), zap.Any("Client ConnectionID", util.GetNextID()), zap.Any("Destination ConnectionID", util.GetNextID())) - decodePostgresOutgoing(requestBuffer, clientConn, destConn, p.hooks, logger, ctx) + err := decodePostgresOutgoing(requestBuffer, clientConn, destConn, p.hooks, logger, ctx) + if err != nil { + logger.Error("failed to decode the outgoing postgres call", zap.Error(err)) + } default: p.logger.Info("Invalid mode detected while intercepting outgoing http call", zap.Any("mode", models.GetMode())) } @@ -134,7 +141,10 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, defer utils.HandlePanic() - ReadBuffConn(clientConn, clientBufferChannel, errChannel, logger, h) + err := ReadBuffConn(clientConn, clientBufferChannel, errChannel, logger, h) + if err != nil { + logger.Error("failed to read the packet message in proxy for pg dependency", zap.Error(err)) + } }() // read response from destination go func() { @@ -143,7 +153,10 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, defer utils.HandlePanic() - ReadBuffConn(destConn, destBufferChannel, errChannel, logger, h) + err := ReadBuffConn(destConn, destBufferChannel, errChannel, logger, h) + if err != nil { + logger.Error("failed to read the packet message in proxy for pg dependency", zap.Error(err)) + } }() isPreviousChunkRequest := false @@ -161,7 +174,7 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, if !isPreviousChunkRequest && len(pgRequests) > 0 && len(pgResponses) > 0 { metadata := make(map[string]string) metadata["type"] = "config" - h.AppendMocks(&models.Mock{ + err := h.AppendMocks(&models.Mock{ Version: models.GetVersion(), Name: "mocks", Kind: models.Postgres, @@ -173,11 +186,20 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, Metadata: metadata, }, }, ctx) + if err != nil { + logger.Error("failed to append the mocks", zap.Error(err)) + } pgRequests = []models.Backend{} pgResponses = []models.Frontend{} - clientConn.Close() - destConn.Close() + err = clientConn.Close() + if err != nil { + logger.Error("failed to close the client connection", zap.Error(err)) + } + err = destConn.Close() + if err != nil { + logger.Error("failed to close the destination connection", zap.Error(err)) + } return nil } case buffer := <-clientBufferChannel: @@ -193,7 +215,7 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, if !isPreviousChunkRequest && len(pgRequests) > 0 && len(pgResponses) > 0 { metadata := make(map[string]string) metadata["type"] = "config" - h.AppendMocks(&models.Mock{ + err := h.AppendMocks(&models.Mock{ Version: models.GetVersion(), Name: "mocks", Kind: models.Postgres, @@ -205,6 +227,9 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, Metadata: metadata, }, }, ctx) + if err != nil { + logger.Error("failed to append the mocks", zap.Error(err)) + } pgRequests = []models.Backend{} pgResponses = []models.Frontend{} } @@ -253,7 +278,7 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, i += (5 + pg.BackendWrapper.BodyLen) } - pg_mock := &models.Backend{ + pgMock := &models.Backend{ PacketTypes: pg.BackendWrapper.PacketTypes, Identfier: "ClientRequest", Length: uint32(len(requestBuffer)), @@ -284,25 +309,25 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, MsgType: pg.BackendWrapper.MsgType, AuthType: pg.BackendWrapper.AuthType, } - after_encoded, err := PostgresDecoderBackend(*pg_mock) + afterEncoded, err := PostgresDecoderBackend(*pgMock) if err != nil { logger.Debug("failed to decode the response message in proxy for postgres dependency", zap.Error(err)) } - if len(after_encoded) != len(buffer) && pg_mock.PacketTypes[0] != "p" { - logger.Debug("the length of the encoded buffer is not equal to the length of the original buffer", zap.Any("after_encoded", len(after_encoded)), zap.Any("buffer", len(buffer))) - pg_mock.Payload = bufStr + if len(afterEncoded) != len(buffer) && pgMock.PacketTypes[0] != "p" { + logger.Debug("the length of the encoded buffer is not equal to the length of the original buffer", zap.Any("afterEncoded", len(afterEncoded)), zap.Any("buffer", len(buffer))) + pgMock.Payload = bufStr } - pgRequests = append(pgRequests, *pg_mock) + pgRequests = append(pgRequests, *pgMock) } if isStartupPacket(buffer) { - pg_mock := &models.Backend{ + pgMock := &models.Backend{ Identfier: "StartupRequest", Payload: bufStr, } - pgRequests = append(pgRequests, *pg_mock) + pgRequests = append(pgRequests, *pgMock) } } isPreviousChunkRequest = true @@ -348,7 +373,7 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, pg.FrontendWrapper.CommandComplete = *msg.(*pgproto3.CommandComplete) pg.FrontendWrapper.CommandCompletes = append(pg.FrontendWrapper.CommandCompletes, pg.FrontendWrapper.CommandComplete) } - if pg.FrontendWrapper.DataRow.RowValues != nil { + if pg.FrontendWrapper.MsgType == 'D' && pg.FrontendWrapper.DataRow.RowValues != nil { // Create a new slice for each DataRow valuesCopy := make([]string, len(pg.FrontendWrapper.DataRow.RowValues)) copy(valuesCopy, pg.FrontendWrapper.DataRow.RowValues) @@ -356,7 +381,6 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, row := pgproto3.DataRow{ RowValues: valuesCopy, // Use the copy of the values } - // fmt.Println("row is ", row) dataRows = append(dataRows, row) } } @@ -369,7 +393,7 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, } // from here take the msg and append its readabable form to the pgResponses - pg_mock := &models.Frontend{ + pgMock := &models.Frontend{ PacketTypes: pg.FrontendWrapper.PacketTypes, Identfier: "ServerResponse", Length: uint32(len(requestBuffer)), @@ -409,23 +433,24 @@ func encodePostgresOutgoing(requestBuffer []byte, clientConn, destConn net.Conn, AuthType: pg.FrontendWrapper.AuthType, } - after_encoded, err := PostgresDecoderFrontend(*pg_mock) + afterEncoded, err := PostgresDecoderFrontend(*pgMock) if err != nil { logger.Debug("failed to decode the response message in proxy for postgres dependency", zap.Error(err)) } - if (len(after_encoded) != len(buffer) && pg_mock.PacketTypes[0] != "R") || len(pg_mock.DataRows) > 0 { - logger.Debug("the length of the encoded buffer is not equal to the length of the original buffer", zap.Any("after_encoded", len(after_encoded)), zap.Any("buffer", len(buffer))) - pg_mock.Payload = bufStr + + if (len(afterEncoded) != len(buffer) && pgMock.PacketTypes[0] != "R") || len(pgMock.DataRows) > 0 { + logger.Debug("the length of the encoded buffer is not equal to the length of the original buffer", zap.Any("afterEncoded", len(afterEncoded)), zap.Any("buffer", len(buffer))) + pgMock.Payload = bufStr } - pgResponses = append(pgResponses, *pg_mock) + pgResponses = append(pgResponses, *pgMock) } if bufStr == "Tg==" || len(buffer) <= 5 { - pg_mock := &models.Frontend{ + pgMock := &models.Frontend{ Payload: bufStr, } - pgResponses = append(pgResponses, *pg_mock) + pgResponses = append(pgResponses, *pgMock) } } diff --git a/pkg/proxy/integrations/postgresParser/postgres_transcoder.go b/pkg/proxy/integrations/postgresParser/postgres_transcoder.go index 7c6001b33..052f9bba1 100644 --- a/pkg/proxy/integrations/postgresParser/postgres_transcoder.go +++ b/pkg/proxy/integrations/postgresParser/postgres_transcoder.go @@ -5,7 +5,6 @@ import ( "encoding/binary" "errors" "fmt" - "strings" "github.com/jackc/pgproto3/v2" "go.keploy.io/server/pkg/models" @@ -28,26 +27,26 @@ func NewFrontend() *FrontendWrapper { return &FrontendWrapper{} } -func checkScram(encoded []byte, log *zap.Logger) bool { - // encoded, err := PostgresDecoder(packet) - - // check if payload contains SCRAM-SHA-256 - messageType := encoded[0] - log.Debug("Message Type: %c\n", zap.String("messageType", string(messageType))) - if messageType == 'N' { - return false - } - // Print the message payload (for simplicity, the payload is printed as a string) - payload := string(encoded[5:]) - if messageType == 'R' { - if strings.Contains(payload, "SCRAM-SHA") { - log.Debug("scram packet") - return true - } - } - - return false -} +// func checkScram(encoded []byte, log *zap.Logger) bool { +// // encoded, err := PostgresDecoder(packet) + +// // check if payload contains SCRAM-SHA-256 +// messageType := encoded[0] +// log.Debug("Message Type: %c\n", zap.String("messageType", string(messageType))) +// if messageType == 'N' { +// return false +// } +// // Print the message payload (for simplicity, the payload is printed as a string) +// payload := string(encoded[5:]) +// if messageType == 'R' { +// if strings.Contains(payload, "SCRAM-SHA") { +// log.Debug("scram packet") +// return true +// } +// } + +// return false +// } func isStartupPacket(packet []byte) bool { protocolVersion := binary.BigEndian.Uint32(packet[4:8]) @@ -55,27 +54,28 @@ func isStartupPacket(packet []byte) bool { return protocolVersion == 196608 // 3.0 in PostgreSQL } -func isRegularPacket(packet []byte) bool { - messageType := packet[0] - return messageType == 'Q' || messageType == 'P' || messageType == 'D' || messageType == 'C' || messageType == 'E' -} +// func isRegularPacket(packet []byte) bool { +// messageType := packet[0] +// return messageType == 'Q' || messageType == 'P' || messageType == 'D' || messageType == 'C' || messageType == 'E' +// } const ( - AuthTypeOk = 0 - AuthTypeCleartextPassword = 3 - AuthTypeMD5Password = 5 - AuthTypeSCMCreds = 6 - AuthTypeGSS = 7 - AuthTypeGSSCont = 8 - AuthTypeSSPI = 9 - AuthTypeSASL = 10 - AuthTypeSASLContinue = 11 - AuthTypeSASLFinal = 12 + AuthTypeOk = 0 // AuthTypeOk is the code for the OK message. + AuthTypeCleartextPassword = 3 // AuthTypeCleartextPassword is the code for the Cleartext Password message. + AuthTypeMD5Password = 5 // AuthTypeMD5Password is the code for the MD5 Password message. + AuthTypeSCMCreds = 6 // AuthTypeSCMCreds is the code for the SCM Credentials message. + AuthTypeGSS = 7 // AuthTypeGSS is the code for the GSS message. + AuthTypeGSSCont = 8 // AuthTypeGSSCont is the code for the GSS Continue message. + AuthTypeSSPI = 9 // AuthTypeSSPI is the code for the SSPI message. + AuthTypeSASL = 10 // AuthTypeSASL is the code for the SASL message. + AuthTypeSASLContinue = 11 // AuthTypeSASLContinue is the code for the SASL Continue message. + AuthTypeSASLFinal = 12 // AuthTypeSASLFinal is the code for the SASL Final message. ) -const ProtocolVersionNumber uint32 = 196608 // Replace with actual version number if different +// ProtocolVersionNumber represents the version number of the protocol. +const ProtocolVersionNumber uint32 = 196608 -// PG Response Packet Transcoder +// TranslateToReadableBackend - PG Response Packet Transcoder func (b *BackendWrapper) TranslateToReadableBackend(msgBody []byte) (pgproto3.FrontendMessage, error) { // fmt.Println("msgType", b.BackendWrapper.MsgType) @@ -256,7 +256,7 @@ func parseAuthType(buffer []byte) (int32, error) { reader := bytes.NewReader(buffer) // Skip the message type (1 byte) as you know it's 'R' - reader.Seek(1, 0) + _, _ = reader.Seek(1, 0) // Read the length of the message (4 bytes) var length int32 diff --git a/pkg/proxy/integrations/postgresParser/utils.go b/pkg/proxy/integrations/postgresParser/utils.go index 030bd41a0..d0c763b57 100755 --- a/pkg/proxy/integrations/postgresParser/utils.go +++ b/pkg/proxy/integrations/postgresParser/utils.go @@ -2,11 +2,11 @@ package postgresparser import ( "encoding/base64" - "encoding/binary" "math" "errors" "fmt" + "github.com/jackc/pgproto3/v2" "go.keploy.io/server/pkg/hooks" "go.keploy.io/server/pkg/models" @@ -307,7 +307,7 @@ func PostgresEncoder(buffer []byte) string { return encoded } -func findBinaryStreamMatch(tcsMocks []*models.Mock, requestBuffers [][]byte, logger *zap.Logger, h *hooks.Hook, isSorted bool) int { +func findBinaryStreamMatch(tcsMocks []*models.Mock, requestBuffers [][]byte, logger *zap.Logger, isSorted bool) int { mxSim := -1.0 mxIdx := -1 @@ -370,16 +370,16 @@ func CheckValidEncode(tcsMocks []*models.Mock, h *hooks.Hook, log *zap.Logger) { if err != nil { log.Debug("Error in decoding") } - actual_encode, err := PostgresDecoder(reqBuff.Payload) + actualEncode, err := PostgresDecoder(reqBuff.Payload) if err != nil { log.Debug("Error in decoding") } - if len(encode) != len(actual_encode) { + if len(encode) != len(actualEncode) { log.Debug("Not Equal Length of buffer in request", zap.Any("payload", reqBuff.Payload)) - log.Debug("Length of encode", zap.Int("length", len(encode)), zap.Int("length", len(actual_encode))) + log.Debug("Length of encode", zap.Int("length", len(encode)), zap.Int("length", len(actualEncode))) log.Debug("Encode via readable", zap.Any("encode", encode)) - log.Debug("Actual Encode", zap.Any("actual_encode", actual_encode)) + log.Debug("Actual Encode", zap.Any("actual_encode", actualEncode)) log.Debug("Payload", zap.Any("payload", reqBuff.Payload)) continue } @@ -391,15 +391,15 @@ func CheckValidEncode(tcsMocks []*models.Mock, h *hooks.Hook, log *zap.Logger) { if err != nil { log.Debug("Error in decoding") } - actual_encode, err := PostgresDecoder(resBuff.Payload) + actualEncode, err := PostgresDecoder(resBuff.Payload) if err != nil { log.Debug("Error in decoding") } - if len(encode) != len(actual_encode) { + if len(encode) != len(actualEncode) { log.Debug("Not Equal Length of buffer in response") - log.Debug("Length of encode", zap.Any("length", len(encode)), zap.Any("length", len(actual_encode))) + log.Debug("Length of encode", zap.Any("length", len(encode)), zap.Any("length", len(actualEncode))) log.Debug("Encode via readable", zap.Any("encode", encode)) - log.Debug("Actual Encode", zap.Any("actual_encode", actual_encode)) + log.Debug("Actual Encode", zap.Any("actual_encode", actualEncode)) log.Debug("Payload", zap.Any("payload", resBuff.Payload)) continue } @@ -409,34 +409,6 @@ func CheckValidEncode(tcsMocks []*models.Mock, h *hooks.Hook, log *zap.Logger) { h.SetTcsMocks(tcsMocks) } -func IfBeginOnlyQuery(reqBuff []byte, logger *zap.Logger, expectedPgReq *models.Backend, h *hooks.Hook) (*models.Backend, bool) { - actualreq := decodePgRequest(reqBuff, logger, h) - if actualreq == nil { - return nil, false - } - actualPgReq := *actualreq - - if len(actualPgReq.Parses) > 0 && len(expectedPgReq.Parses) > 0 && len(expectedPgReq.Parses) == len(actualPgReq.Parses) { - - if expectedPgReq.Parses[0].Query == "BEGIN READ ONLY" || expectedPgReq.Parses[0].Query == "BEGIN" { - expectedPgReq.Parses = expectedPgReq.Parses[1:] - if expectedPgReq.PacketTypes[0] == "P" { - expectedPgReq.PacketTypes = expectedPgReq.PacketTypes[1:] - } - } - - if actualPgReq.Parses[0].Query == "BEGIN READ ONLY" || actualPgReq.Parses[0].Query == "BEGIN" { - actualPgReq.Parses = actualPgReq.Parses[1:] - if actualPgReq.PacketTypes[0] == "P" { - actualPgReq.PacketTypes = actualPgReq.PacketTypes[1:] - } - } - return &actualPgReq, true - } - - return nil, false -} - func matchingReadablePG(requestBuffers [][]byte, logger *zap.Logger, h *hooks.Hook) (bool, []models.Frontend, error) { for { tcsMocks, err := h.GetConfigMocks() @@ -454,91 +426,93 @@ func matchingReadablePG(requestBuffers [][]byte, logger *zap.Logger, h *hooks.Ho } if sortFlag { - if mock.TestModeInfo.IsFiltered == false { + if !mock.TestModeInfo.IsFiltered { sortFlag = false } else { sortedTcsMocks = append(sortedTcsMocks, mock) } } + initMock := *mock if len(mock.Spec.PostgresRequests) == len(requestBuffers) { for requestIndex, reqBuff := range requestBuffers { bufStr := base64.StdEncoding.EncodeToString(reqBuff) - encoded, err := PostgresDecoderBackend(mock.Spec.PostgresRequests[requestIndex]) + encodedMock, err := PostgresDecoderBackend(mock.Spec.PostgresRequests[requestIndex]) if err != nil { logger.Debug("Error while decoding postgres request", zap.Error(err)) } - if mock.Spec.PostgresRequests[requestIndex].Identfier == "StartupRequest" { - logger.Debug("CHANGING TO MD5 for Response") - mock.Spec.PostgresResponses[requestIndex].AuthType = 5 - continue - } else { - if len(encoded) > 0 && encoded[0] == 'p' { - logger.Debug("CHANGING TO MD5 for Request and Response") - mock.Spec.PostgresRequests[requestIndex].PasswordMessage.Password = "md5fe4f2f657f01fa1dd9d111d5391e7c07" - - mock.Spec.PostgresResponses[requestIndex].PacketTypes = []string{"R", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "K", "Z"} - mock.Spec.PostgresResponses[requestIndex].AuthType = 0 - mock.Spec.PostgresResponses[requestIndex].BackendKeyData = pgproto3.BackendKeyData{ - ProcessID: 2613, - SecretKey: 824670820, - } - mock.Spec.PostgresResponses[requestIndex].ReadyForQuery.TxStatus = 73 - mock.Spec.PostgresResponses[requestIndex].ParameterStatusCombined = []pgproto3.ParameterStatus{ - { - Name: "application_name", - Value: "", - }, - { - Name: "client_encoding", - Value: "UTF8", - }, - { - Name: "DateStyle", - Value: "ISO, MDY", - }, - { - Name: "integer_datetimes", - Value: "on", - }, - { - Name: "IntervalStyle", - Value: "postgres", - }, - { - Name: "is_superuser", - Value: "UTF8", - }, - { - Name: "server_version", - Value: "13.12 (Debian 13.12-1.pgdg120+1)", - }, - { - Name: "session_authorization", - Value: "keploy-user", - }, - { - Name: "standard_conforming_strings", - Value: "on", - }, - { - Name: "TimeZone", - Value: "Etc/UTC", - }, - { - Name: "TimeZone", - Value: "Etc/UTC", - }, - } - } - } - if bufStr == "AAAACATSFi8=" { + switch { + case bufStr == "AAAACATSFi8=": ssl := models.Frontend{ Payload: "Tg==", } return true, []models.Frontend{ssl}, nil + case mock.Spec.PostgresRequests[requestIndex].Identfier == "StartupRequest" && isStartupPacket(reqBuff) && mock.Spec.PostgresRequests[requestIndex].Payload != "AAAACATSFi8=" && mock.Spec.PostgresResponses[requestIndex].AuthType == 10: + logger.Debug("CHANGING TO MD5 for Response", zap.String("mock", mock.Name), zap.String("Req", bufStr)) + initMock.Spec.PostgresResponses[requestIndex].AuthType = 5 + return true, initMock.Spec.PostgresResponses, nil + case len(encodedMock) > 0 && encodedMock[0] == 'p' && mock.Spec.PostgresRequests[requestIndex].PacketTypes[0] == "p" && reqBuff[0] == 'p': + logger.Debug("CHANGING TO MD5 for Request and Response", zap.String("mock", mock.Name), zap.String("Req", bufStr)) + + initMock.Spec.PostgresRequests[requestIndex].PasswordMessage.Password = "md5fe4f2f657f01fa1dd9d111d5391e7c07" + + initMock.Spec.PostgresResponses[requestIndex].PacketTypes = []string{"R", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "S", "K", "Z"} + initMock.Spec.PostgresResponses[requestIndex].AuthType = 0 + initMock.Spec.PostgresResponses[requestIndex].BackendKeyData = pgproto3.BackendKeyData{ + ProcessID: 2613, + SecretKey: 824670820, + } + initMock.Spec.PostgresResponses[requestIndex].ReadyForQuery.TxStatus = 73 + initMock.Spec.PostgresResponses[requestIndex].ParameterStatusCombined = []pgproto3.ParameterStatus{ + { + Name: "application_name", + Value: "", + }, + { + Name: "client_encoding", + Value: "UTF8", + }, + { + Name: "DateStyle", + Value: "ISO, MDY", + }, + { + Name: "integer_datetimes", + Value: "on", + }, + { + Name: "IntervalStyle", + Value: "postgres", + }, + { + Name: "is_superuser", + Value: "UTF8", + }, + { + Name: "server_version", + Value: "13.12 (Debian 13.12-1.pgdg120+1)", + }, + { + Name: "session_authorization", + Value: "keploy-user", + }, + { + Name: "standard_conforming_strings", + Value: "on", + }, + { + Name: "TimeZone", + Value: "Etc/UTC", + }, + { + Name: "TimeZone", + Value: "Etc/UTC", + }, + } + return true, initMock.Spec.PostgresResponses, nil } + } } } @@ -552,7 +526,7 @@ func matchingReadablePG(requestBuffers [][]byte, logger *zap.Logger, h *hooks.Ho // give more priority to sorted like if you find more than 0.5 in sorted then return that if len(sortedTcsMocks) > 0 { isSorted = true - idx = findBinaryStreamMatch(sortedTcsMocks, requestBuffers, logger, h, isSorted) + idx = findBinaryStreamMatch(sortedTcsMocks, requestBuffers, logger, isSorted) if idx != -1 { isMatched = true matchedMock = tcsMocks[idx] @@ -562,7 +536,7 @@ func matchingReadablePG(requestBuffers [][]byte, logger *zap.Logger, h *hooks.Ho if !isMatched { isSorted = false - idx = findBinaryStreamMatch(tcsMocks, requestBuffers, logger, h, isSorted) + idx = findBinaryStreamMatch(tcsMocks, requestBuffers, logger, isSorted) if idx != -1 { isMatched = true matchedMock = tcsMocks[idx] @@ -588,85 +562,6 @@ func matchingReadablePG(requestBuffers [][]byte, logger *zap.Logger, h *hooks.Ho return false, nil, nil } -func decodePgRequest(buffer []byte, logger *zap.Logger, h *hooks.Hook) *models.Backend { - - pg := NewBackend() - - if !isStartupPacket(buffer) && len(buffer) > 5 { - bufferCopy := buffer - for i := 0; i < len(bufferCopy)-5; { - logger.Debug("Inside the if condition") - pg.BackendWrapper.MsgType = buffer[i] - pg.BackendWrapper.BodyLen = int(binary.BigEndian.Uint32(buffer[i+1:])) - 4 - if len(buffer) < (i + pg.BackendWrapper.BodyLen + 5) { - logger.Error("failed to translate the postgres request message due to shorter network packet buffer") - break - } - msg, err := pg.TranslateToReadableBackend(buffer[i:(i + pg.BackendWrapper.BodyLen + 5)]) - if err != nil && buffer[i] != 112 { - logger.Error("failed to translate the request message to readable", zap.Error(err)) - } - if pg.BackendWrapper.MsgType == 'p' { - pg.BackendWrapper.PasswordMessage = *msg.(*pgproto3.PasswordMessage) - } - - if pg.BackendWrapper.MsgType == 'P' { - pg.BackendWrapper.Parse = *msg.(*pgproto3.Parse) - pg.BackendWrapper.Parses = append(pg.BackendWrapper.Parses, pg.BackendWrapper.Parse) - } - - if pg.BackendWrapper.MsgType == 'B' { - pg.BackendWrapper.Bind = *msg.(*pgproto3.Bind) - pg.BackendWrapper.Binds = append(pg.BackendWrapper.Binds, pg.BackendWrapper.Bind) - } - - if pg.BackendWrapper.MsgType == 'E' { - pg.BackendWrapper.Execute = *msg.(*pgproto3.Execute) - pg.BackendWrapper.Executes = append(pg.BackendWrapper.Executes, pg.BackendWrapper.Execute) - } - - pg.BackendWrapper.PacketTypes = append(pg.BackendWrapper.PacketTypes, string(pg.BackendWrapper.MsgType)) - - i += (5 + pg.BackendWrapper.BodyLen) - } - - pg_mock := &models.Backend{ - PacketTypes: pg.BackendWrapper.PacketTypes, - Identfier: "ClientRequest", - Length: uint32(len(buffer)), - // Payload: bufStr, - Bind: pg.BackendWrapper.Bind, - Binds: pg.BackendWrapper.Binds, - PasswordMessage: pg.BackendWrapper.PasswordMessage, - CancelRequest: pg.BackendWrapper.CancelRequest, - Close: pg.BackendWrapper.Close, - CopyData: pg.BackendWrapper.CopyData, - CopyDone: pg.BackendWrapper.CopyDone, - CopyFail: pg.BackendWrapper.CopyFail, - Describe: pg.BackendWrapper.Describe, - Execute: pg.BackendWrapper.Execute, - Executes: pg.BackendWrapper.Executes, - Flush: pg.BackendWrapper.Flush, - FunctionCall: pg.BackendWrapper.FunctionCall, - GssEncRequest: pg.BackendWrapper.GssEncRequest, - Parse: pg.BackendWrapper.Parse, - Parses: pg.BackendWrapper.Parses, - Query: pg.BackendWrapper.Query, - SSlRequest: pg.BackendWrapper.SSlRequest, - StartupMessage: pg.BackendWrapper.StartupMessage, - SASLInitialResponse: pg.BackendWrapper.SASLInitialResponse, - SASLResponse: pg.BackendWrapper.SASLResponse, - Sync: pg.BackendWrapper.Sync, - Terminate: pg.BackendWrapper.Terminate, - MsgType: pg.BackendWrapper.MsgType, - AuthType: pg.BackendWrapper.AuthType, - } - return pg_mock - } - - return nil -} - func FuzzyCheck(encoded, reqBuff []byte) float64 { k := util.AdaptiveK(len(reqBuff), 3, 8, 5) shingles1 := util.CreateShingles(encoded, k) diff --git a/pkg/service/generateConfig/generateConfig.go b/pkg/service/generateConfig/generateConfig.go index f461afd05..82792ad4f 100644 --- a/pkg/service/generateConfig/generateConfig.go +++ b/pkg/service/generateConfig/generateConfig.go @@ -19,7 +19,7 @@ type generatorConfig struct { } type GenerateConfigOptions struct { - ConfigStr string + ConfigStr string } func NewGeneratorConfig(logger *zap.Logger) GeneratorConfig { @@ -33,9 +33,9 @@ func (g *generatorConfig) GenerateConfig(filePath string, options GenerateConfig var node yaml.Node data := []byte(models.DefaultConfig) - if options.ConfigStr != ""{ - data = []byte(options.ConfigStr) - } + if options.ConfigStr != "" { + data = []byte(options.ConfigStr) + } if err := yaml.Unmarshal(data, &node); err != nil { g.logger.Fatal("Unmarshalling failed %s", zap.Error(err))