From bb41d78d4f0877f40adfa298b3ab938103ffa242 Mon Sep 17 00:00:00 2001 From: Tom Kay Date: Thu, 27 Oct 2022 12:08:25 +0100 Subject: [PATCH 1/6] replace with interface type --- v1/connector/connector.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v1/connector/connector.go b/v1/connector/connector.go index c74b3fb..df9edfd 100644 --- a/v1/connector/connector.go +++ b/v1/connector/connector.go @@ -26,7 +26,7 @@ const ( type Connector struct { ProcessingState ProcessingState `json:"processingState,omitempty" yaml:"processingState,omitempty"` Library string `json:"library" yaml:"library" validate:"required,oneof=sandbox authorize braintree qualpay stripe paysafe worldpay paypal-websitepaymentspro paypal-expresscheckout vindicia chargehive maxmind cybersource paysafe-accountupdater bottomline checkout kount clearhaus trust-payments cwams yapstone"` - Configuration []byte `json:"configuration" yaml:"configuration" validate:"required"` + Configuration interface{} `json:"configuration" yaml:"configuration" validate:"required"` ConfigID string `json:"configId,omitempty" yaml:"configId,omitempty"` ConfigAuth string `json:"configAuth,omitempty" yaml:"configAuth,omitempty"` EnablePCIB bool `json:"enablePCIB,omitempty" yaml:"enablePCIB,omitempty"` From 6bcc22014d1d3773d788de8f528088c4c3851ff1 Mon Sep 17 00:00:00 2001 From: Tom Kay Date: Fri, 28 Oct 2022 11:28:44 +0100 Subject: [PATCH 2/6] clean up template generator --- connectorconfig/connector.go | 14 ++++++++++- utils/clean.go | 5 +--- utils/clean_test.go | 37 +++++++++++++++++++++------ utils/generate.go | 49 ++++++++++++++++++------------------ utils/validate_test.go | 18 +++---------- 5 files changed, 73 insertions(+), 50 deletions(-) diff --git a/connectorconfig/connector.go b/connectorconfig/connector.go index e70df6b..ffc62e0 100644 --- a/connectorconfig/connector.go +++ b/connectorconfig/connector.go @@ -1,6 +1,7 @@ package connectorconfig import ( + "encoding/base64" "encoding/json" "strings" @@ -23,7 +24,18 @@ func getCreds(c *connector.Connector, strict bool) (Credentials, error) { return credentials, err } - reader := strings.NewReader(string(c.Configuration)) + str, isStr := c.Configuration.(string) + if !isStr { + s, _ := json.Marshal(c.Configuration) + str = string(s) + } else { + // check base64 + s, err := base64.StdEncoding.DecodeString(str) + if err == nil { + str = string(s) + } + } + reader := strings.NewReader(str) dec := json.NewDecoder(reader) if strict { dec.DisallowUnknownFields() diff --git a/utils/clean.go b/utils/clean.go index e29cb44..0549eb4 100644 --- a/utils/clean.go +++ b/utils/clean.go @@ -44,10 +44,7 @@ func Clean(input []byte, version string, pretty bool) (modified bool, output []b return } - c.Configuration, err = json.Marshal(cred) - if err != nil { - return - } + c.Configuration = cred def.Spec = c } diff --git a/utils/clean_test.go b/utils/clean_test.go index 4552a05..404c994 100644 --- a/utils/clean_test.go +++ b/utils/clean_test.go @@ -11,41 +11,53 @@ import ( // TestClean ensures that an additional fields in main struct and serialized config are removed func TestClean(t *testing.T) { configuration.Initialise() - rawJson := []byte(`{"Kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","cats":"dogs","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":"eyJhcGlMb2dpbklkIjoiQ0hBTkdFLU1FIiwidHJhbnNhY3Rpb25LZXkiOiJDSEFOR0UtTUUiLCJlbnZpcm9ubWVudCI6InNhbmRib3giLCAiZ2FyeSI6IndhcyBoZXJlIn0="}}`) + rawJson := []byte(`{"Kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","cats":"dogs","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":{"apiLoginId":"CHANGE-ME","transactionKey":"CHANGE-ME","environment":"sandbox", "gary":"was here"}}}`) fmt.Printf("Before %v\n", string(rawJson)) modified, output, err := Clean(rawJson, "v1", false) fmt.Printf("After %v\nModified: %t, Error: %v\n", string(output), modified, err) assert.Equal(t, modified, true) assert.Equal(t, err, nil) - assert.Equal(t, string(output), string([]byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":"eyJhcGlMb2dpbklkIjoiQ0hBTkdFLU1FIiwidHJhbnNhY3Rpb25LZXkiOiJDSEFOR0UtTUUiLCJlbnZpcm9ubWVudCI6InNhbmRib3gifQ=="}}`))) + assert.Equal(t, string(output), `{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":{"apiLoginId":"CHANGE-ME","transactionKey":"CHANGE-ME","environment":"sandbox"}}}`) } // test that a good input returns modified = false func TestCleanNoChanges(t *testing.T) { configuration.Initialise() - rawJson := []byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":"eyJhcGlMb2dpbklkIjoiQ0hBTkdFLU1FIiwidHJhbnNhY3Rpb25LZXkiOiJDSEFOR0UtTUUiLCJlbnZpcm9ubWVudCI6InNhbmRib3gifQ=="}}`) + rawJson := []byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":{"apiLoginId":"CHANGE-ME","transactionKey":"CHANGE-ME","environment":"sandbox"}}}`) fmt.Printf("Before %v\n", string(rawJson)) modified, output, err := Clean(rawJson, "v1", false) fmt.Printf("After %v\nModified: %t, Error: %v\n", string(output), modified, err) assert.Equal(t, modified, false) assert.Equal(t, err, nil) - assert.Equal(t, string(output), string([]byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":"eyJhcGlMb2dpbklkIjoiQ0hBTkdFLU1FIiwidHJhbnNhY3Rpb25LZXkiOiJDSEFOR0UtTUUiLCJlbnZpcm9ubWVudCI6InNhbmRib3gifQ=="}}`))) + assert.Equal(t, string(output), `{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":{"apiLoginId":"CHANGE-ME","transactionKey":"CHANGE-ME","environment":"sandbox"}}}`) } // test that a good input in a different order modified = false -func TestCleanReOrder(t *testing.T) { +func TestCleanReOrderB64(t *testing.T) { configuration.Initialise() rawJson := []byte(`{"kind":"Connector","metadata":{"name":"change-me","projectId":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":"eyJhcGlMb2dpbklkIjoiQ0hBTkdFLU1FIiwidHJhbnNhY3Rpb25LZXkiOiJDSEFOR0UtTUUiLCJlbnZpcm9ubWVudCI6InNhbmRib3gifQ=="}}`) fmt.Printf("Before %v\n", string(rawJson)) modified, output, err := Clean(rawJson, "v1", false) fmt.Printf("After %v\nModified: %t, Error: %v\n", string(output), modified, err) + assert.Equal(t, modified, true) + assert.Equal(t, err, nil) + assert.Equal(t, string(output), `{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":{"apiLoginId":"CHANGE-ME","transactionKey":"CHANGE-ME","environment":"sandbox"}}}`) +} + +// test that a good input in a different order modified = false +func TestCleanReOrderJson(t *testing.T) { + configuration.Initialise() + rawJson := []byte(`{"kind":"Connector","metadata":{"name":"change-me","projectId":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":{"apiLoginId":"CHANGE-ME","transactionKey":"CHANGE-ME","environment":"sandbox"}}}`) + fmt.Printf("Before %v\n", string(rawJson)) + modified, output, err := Clean(rawJson, "v1", false) + fmt.Printf("After %v\nModified: %t, Error: %v\n", string(output), modified, err) assert.Equal(t, modified, false) assert.Equal(t, err, nil) - assert.Equal(t, string(output), string([]byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":"eyJhcGlMb2dpbklkIjoiQ0hBTkdFLU1FIiwidHJhbnNhY3Rpb25LZXkiOiJDSEFOR0UtTUUiLCJlbnZpcm9ubWVudCI6InNhbmRib3gifQ=="}}`))) + assert.Equal(t, string(output), `{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":{"apiLoginId":"CHANGE-ME","transactionKey":"CHANGE-ME","environment":"sandbox"}}}`) } // test for invalid json input -func TestCleanError(t *testing.T) { +func TestCleanErrorB64(t *testing.T) { configuration.Initialise() rawJson := []byte(`{"Kind":::"Connector","metadasdfta":{"name":"change-me","displayName":"","description":"","annotaions":null,"labels":null},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":"eyJhcGlMb2dpbklkIjoiQ0hBTkdFLU1FIiwidHJhbnNhY3Rpb25LZXkiOiJDSEFOR0UtTUUiLCJlbnZpcm9ubWVudCI6InNhbmRib3gifQ=="}}`) fmt.Printf("Before %v\n", string(rawJson)) @@ -54,3 +66,14 @@ func TestCleanError(t *testing.T) { assert.Equal(t, modified, false) assert.NotEqual(t, err, nil) } + +// test for invalid json input +func TestCleanErrorJson(t *testing.T) { + configuration.Initialise() + rawJson := []byte(`{"Kind":::"Connector","metadasdfta":{"name":"change-me","displayName":"","description":"","annotaions":null,"labels":null},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"authorize","configuration":{"apiLoginId":"CHANGE-ME","transactionKey":"CHANGE-ME","environment":"sandbox"}}}`) + fmt.Printf("Before %v\n", string(rawJson)) + modified, output, err := Clean(rawJson, "v1", false) + fmt.Printf("After %v\nModified: %t, Error: %v\n", string(output), modified, err) + assert.Equal(t, modified, false) + assert.NotEqual(t, err, nil) +} diff --git a/utils/generate.go b/utils/generate.go index 862da35..9692b7d 100644 --- a/utils/generate.go +++ b/utils/generate.go @@ -130,25 +130,25 @@ func Generate(conf Template, version string, pretty bool) ([]byte, error) { func buildSpec(conf Template) (object.Specification, error) { switch conf { case confConnAuthorize: - j, _ := json.Marshal(connectorconfig.AuthorizeCredentials{APILoginID: &chg, TransactionKey: &chg, Environment: "sandbox"}) + j := connectorconfig.AuthorizeCredentials{APILoginID: &chg, TransactionKey: &chg, Environment: "sandbox"} return connector.Connector{Library: string(connectorconfig.LibraryAuthorize), Configuration: j}, nil case confConnBrainTree: - j, _ := json.Marshal(connectorconfig.BraintreeCredentials{PublicKey: &chg, PrivateKey: &chg, MerchantID: chg, MerchantAccountID: chg, Currency: "USD", Environment: "sandbox"}) + j := connectorconfig.BraintreeCredentials{PublicKey: &chg, PrivateKey: &chg, MerchantID: chg, MerchantAccountID: chg, Currency: "USD", Environment: "sandbox"} return connector.Connector{Library: string(connectorconfig.LibraryBraintree), Configuration: j}, nil case confConnChargeHive: - j, _ := json.Marshal(connectorconfig.ChargeHiveCredentials{}) + j := connectorconfig.ChargeHiveCredentials{} return connector.Connector{Library: string(connectorconfig.LibraryChargeHive), Configuration: j}, nil case confConnCyberSource: - j, _ := json.Marshal(connectorconfig.CyberSourceCredentials{MerchantID: chg, TransactionKey: &chg, Environment: "test"}) + j := connectorconfig.CyberSourceCredentials{MerchantID: chg, TransactionKey: &chg, Environment: "test"} return connector.Connector{Library: string(connectorconfig.LibraryCyberSource), Configuration: j}, nil case confConnMaxMind: - j, _ := json.Marshal(connectorconfig.MaxMindCredentials{AccountID: chg, LicenceKey: &chg, ServiceType: 0}) + j := connectorconfig.MaxMindCredentials{AccountID: chg, LicenceKey: &chg, ServiceType: 0} return connector.Connector{Library: string(connectorconfig.LibraryMaxMind), Configuration: j}, nil case confConnPayPalExpress: - j, _ := json.Marshal(connectorconfig.PayPalExpressCheckoutCredentials{APIUsername: &chg, APIPassword: &chg, APISignature: &chg, SupportedCurrencies: []string{"USD"}, Environment: "sandbox"}) + j := connectorconfig.PayPalExpressCheckoutCredentials{APIUsername: &chg, APIPassword: &chg, APISignature: &chg, SupportedCurrencies: []string{"USD"}, Environment: "sandbox"} return connector.Connector{Library: string(connectorconfig.LibraryPayPalExpressCheckout), Configuration: j}, nil case confConnPayPalWPP: - j, _ := json.Marshal(connectorconfig.PayPalWebsitePaymentsProCredentials{ + j := connectorconfig.PayPalWebsitePaymentsProCredentials{ APIUsername: &chg, APIPassword: &chg, APISignature: &chg, @@ -161,10 +161,10 @@ func buildSpec(conf Template) (object.Specification, error) { CardinalAPIKey: &chg, CardinalOrgUnitID: &chg, Environment: "sandbox", - }) + } return connector.Connector{Library: string(connectorconfig.LibraryPayPalWebsitePaymentsPro), Configuration: j}, nil case confConnPaysafe: - j, _ := json.Marshal(connectorconfig.PaySafeCredentials{ + j := connectorconfig.PaySafeCredentials{ Acquirer: chg, AccountID: chg, APIUsername: &chg, @@ -174,22 +174,23 @@ func buildSpec(conf Template) (object.Specification, error) { UseVault: new(bool), SingleUseTokenPassword: new(string), SingleUseTokenUsername: "", - }) + MerchantURL: "https://test.com", + } return connector.Connector{Library: string(connectorconfig.LibraryPaySafe), Configuration: j}, nil case confConnQualPay: - j, _ := json.Marshal(connectorconfig.QualpayCredentials{APIKey: &chg, MerchantID: 1, Environment: "test"}) + j := connectorconfig.QualpayCredentials{APIKey: &chg, MerchantID: 1, Environment: "test"} return connector.Connector{Library: string(connectorconfig.LibraryQualPay), Configuration: j}, nil case confConnSandbox: - j, _ := json.Marshal(connectorconfig.SandboxCredentials{Mode: "dynamic"}) + j := connectorconfig.SandboxCredentials{Mode: "dynamic"} return connector.Connector{Library: string(connectorconfig.LibrarySandbox), Configuration: j}, nil case confConnStripe: - j, _ := json.Marshal(connectorconfig.StripeCredentials{APIKey: &chg}) + j := connectorconfig.StripeCredentials{APIKey: &chg} return connector.Connector{Library: string(connectorconfig.LibraryStripe), Configuration: j}, nil case confConnVindicia: - j, _ := json.Marshal(connectorconfig.VindiciaCredentials{Login: chg, Password: &chg, HMACKey: &chg, PGPPrivateKey: &chg, Environment: "development", ConnectorPool: []connectorconfig.ConnectorAttempt{{ConnectorID: "", DivisionNumber: "", Weight: 0}}}) + j := connectorconfig.VindiciaCredentials{Login: chg, Password: &chg, HMACKey: &chg, PGPPrivateKey: &chg, Environment: "development", ConnectorPool: []connectorconfig.ConnectorAttempt{{ConnectorID: "", DivisionNumber: "", Weight: 0}}} return connector.Connector{Library: string(connectorconfig.LibraryVindicia), Configuration: j}, nil case confConnWorldPay: - j, _ := json.Marshal(connectorconfig.WorldpayCredentials{ + j := connectorconfig.WorldpayCredentials{ Username: &chg, Password: &chg, MerchantID: chg, @@ -225,36 +226,36 @@ func buildSpec(conf Template) (object.Specification, error) { GoogleCardGateway: connectorconfig.GoogleCardGatewayVANTIV, GoogleCardMerchantId: chg, }, - }) + } return connector.Connector{Library: string(connectorconfig.LibraryWorldpay), Configuration: j}, nil case confClearhaus: - j, _ := json.Marshal(connectorconfig.ClearhausCredentials{ + j := connectorconfig.ClearhausCredentials{ APIKey: chg, Environment: connectorconfig.ClearhausEnvironmentTest, - }) + } return connector.Connector{Library: string(connectorconfig.LibraryClearhaus), Configuration: j}, nil case confTrustPayments: - j, _ := json.Marshal(connectorconfig.TrustPaymentsCredentials{ + j := connectorconfig.TrustPaymentsCredentials{ Username: chg, Password: chg, SiteRef: chg, Region: connectorconfig.TrustPaymentsRegionUS, Environment: connectorconfig.TrustPaymentsEnvironmentTest, - }) + } return connector.Connector{Library: string(connectorconfig.LibraryTrustPayments), Configuration: j}, nil case confCWAMS: - j, _ := json.Marshal(connectorconfig.CWAMSCredentials{ + j := connectorconfig.CWAMSCredentials{ SecurityKey: chg, TestMode: true, - }) + } return connector.Connector{Library: string(connectorconfig.LibraryCWAMS), Configuration: j}, nil case confYapstone: - j, _ := json.Marshal(connectorconfig.YapstoneCredentials{ + j := connectorconfig.YapstoneCredentials{ ClientID: chg, ClientSecret: chg, Environment: connectorconfig.YapstoneEnvironmentTest, - }) + } return connector.Connector{Library: string(connectorconfig.LibraryYapstone), Configuration: j}, nil case confConnectorPool: return connector.Pool{Restriction: "unrestricted", Connectors: []connector.PoolItem{{ConnectorID: chg}}}, nil diff --git a/utils/validate_test.go b/utils/validate_test.go index c243c05..92c3622 100644 --- a/utils/validate_test.go +++ b/utils/validate_test.go @@ -1,8 +1,6 @@ package utils import ( - "encoding/json" - "fmt" "testing" "github.com/chargehive/configuration" @@ -11,7 +9,7 @@ import ( // test for additional unknown fields func TestChargeLabelVariables(t *testing.T) { - rawJson := []byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.label.unsubscribed","operator":"Equal","values":["True"]}]},"spec":{"library":"paysafe","configuration":"eyJhY3F1aXJlciI6ImNoYW5nZS1tZSIsImFjY291bnRJRCI6ImNoYW5nZS1tZSIsImFwaVVzZXJuYW1lIjoiY2hhbmdlLW1lIiwiYXBpUGFzc3dvcmQiOiJjaGFuZ2UtbWUiLCJlbnZpcm9ubWVudCI6Ik1PQ0siLCJjb3VudHJ5IjoiIiwiY3VycmVuY3kiOiJVU0QiLCJ1c2VWYXVsdCI6ZmFsc2UsInNpbmdsZVVzZVRva2VuUGFzc3dvcmQiOiIiLCJzaW5nbGVVc2VUb2tlblVzZXJuYW1lIjoiIn0="}}`) + rawJson := []byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.label.unsubscribed","operator":"Equal","values":["True"]}]},"spec":{"library":"paysafe","configuration":"eyJhY3F1aXJlciI6ImNoYW5nZS1tZSIsImFjY291bnRJRCI6ImNoYW5nZS1tZSIsImFwaVVzZXJuYW1lIjoiY2hhbmdlLW1lIiwiYXBpUGFzc3dvcmQiOiJjaGFuZ2UtbWUiLCJlbnZpcm9ubWVudCI6Ik1PQ0siLCJjb3VudHJ5IjoiIiwiY3VycmVuY3kiOiJVU0QiLCJ1c2VWYXVsdCI6ZmFsc2UsInNpbmdsZVVzZVRva2VuUGFzc3dvcmQiOiIiLCJzaW5nbGVVc2VUb2tlblVzZXJuYW1lIjoiIiwibWVyY2hhbnRVUkwiOiJodHRwOi8vdGVzdC5jb20ifQ=="}}`) configuration.Initialise() errs := Validate(rawJson, "v1") // _ = PrettyPrint(errs) @@ -64,26 +62,18 @@ func TestEmptyFields(t *testing.T) { configuration.Initialise() // "singleUseTokenPassword":"","singleUseTokenUsername":"" - rawJson := []byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"paysafe","configuration":"eyJhY3F1aXJlciI6ImNoYW5nZS1tZSIsImFjY291bnRJRCI6ImNoYW5nZS1tZSIsImFwaVVzZXJuYW1lIjoiY2hhbmdlLW1lIiwiYXBpUGFzc3dvcmQiOiJjaGFuZ2UtbWUiLCJlbnZpcm9ubWVudCI6Ik1PQ0siLCJjb3VudHJ5IjoiIiwiY3VycmVuY3kiOiJVU0QiLCJ1c2VWYXVsdCI6ZmFsc2UsInNpbmdsZVVzZVRva2VuUGFzc3dvcmQiOiIiLCJzaW5nbGVVc2VUb2tlblVzZXJuYW1lIjoiIn0="}}`) + rawJson := []byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"paysafe","configuration":"eyJhY3F1aXJlciI6ImNoYW5nZS1tZSIsImFjY291bnRJRCI6ImNoYW5nZS1tZSIsImFwaVVzZXJuYW1lIjoiY2hhbmdlLW1lIiwiYXBpUGFzc3dvcmQiOiJjaGFuZ2UtbWUiLCJlbnZpcm9ubWVudCI6Ik1PQ0siLCJjb3VudHJ5IjoiIiwiY3VycmVuY3kiOiJVU0QiLCJ1c2VWYXVsdCI6ZmFsc2UsInNpbmdsZVVzZVRva2VuUGFzc3dvcmQiOiIiLCJzaW5nbGVVc2VUb2tlblVzZXJuYW1lIjoiIiwibWVyY2hhbnRVcmwiOiJodHRwOi8vdGVzdC5jb20ifQ=="}}`) errs := Validate(rawJson, "v1") assert.Equal(t, len(errs), 0) // "singleUseTokenUsername":"" - rawJson = []byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"paysafe","configuration":"eyJhY3F1aXJlciI6ImNoYW5nZS1tZSIsImFjY291bnRJRCI6ImNoYW5nZS1tZSIsImFwaVVzZXJuYW1lIjoiY2hhbmdlLW1lIiwiYXBpUGFzc3dvcmQiOiJjaGFuZ2UtbWUiLCJlbnZpcm9ubWVudCI6Ik1PQ0siLCJjb3VudHJ5IjoiIiwiY3VycmVuY3kiOiJVU0QiLCJ1c2VWYXVsdCI6ZmFsc2UsInNpbmdsZVVzZVRva2VuVXNlcm5hbWUiOiIifQ=="}}`) + rawJson = []byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"paysafe","configuration":"eyJhY3F1aXJlciI6ImNoYW5nZS1tZSIsImFjY291bnRJRCI6ImNoYW5nZS1tZSIsImFwaVVzZXJuYW1lIjoiY2hhbmdlLW1lIiwiYXBpUGFzc3dvcmQiOiJjaGFuZ2UtbWUiLCJlbnZpcm9ubWVudCI6Ik1PQ0siLCJjb3VudHJ5IjoiIiwiY3VycmVuY3kiOiJVU0QiLCJ1c2VWYXVsdCI6ZmFsc2UsInNpbmdsZVVzZVRva2VuVXNlcm5hbWUiOiIiLCJtZXJjaGFudFVybCI6Imh0dHA6Ly90ZXN0LmNvbSJ9"}}`) errs = Validate(rawJson, "v1") assert.Equal(t, 1, len(errs)) assert.Equal(t, errs["PaySafeCredentials.SingleUseTokenPassword"], "SingleUseTokenPassword is a required field") // "singleUseTokenPassword":"" - rawJson = []byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"paysafe","configuration":"eyJhY3F1aXJlciI6ImNoYW5nZS1tZSIsImFjY291bnRJRCI6ImNoYW5nZS1tZSIsImFwaVVzZXJuYW1lIjoiY2hhbmdlLW1lIiwiYXBpUGFzc3dvcmQiOiJjaGFuZ2UtbWUiLCJlbnZpcm9ubWVudCI6Ik1PQ0siLCJjb3VudHJ5IjoiIiwiY3VycmVuY3kiOiJVU0QiLCJ1c2VWYXVsdCI6ZmFsc2UsInNpbmdsZVVzZVRva2VuUGFzc3dvcmQiOiIifQ=="}}`) + rawJson = []byte(`{"kind":"Connector","metadata":{"projectId":"change-me","name":"change-me","displayName":"","description":"","annotations":null,"labels":null,"disabled":false},"specVersion":"v1","selector":{"priority":50,"expressions":[{"key":"charge.amount.currency","operator":"Equal","conversion":"","values":["GBP"]}]},"spec":{"library":"paysafe","configuration":"eyJhY3F1aXJlciI6ImNoYW5nZS1tZSIsImFjY291bnRJRCI6ImNoYW5nZS1tZSIsImFwaVVzZXJuYW1lIjoiY2hhbmdlLW1lIiwiYXBpUGFzc3dvcmQiOiJjaGFuZ2UtbWUiLCJlbnZpcm9ubWVudCI6Ik1PQ0siLCJjb3VudHJ5IjoiIiwiY3VycmVuY3kiOiJVU0QiLCJ1c2VWYXVsdCI6ZmFsc2UsInNpbmdsZVVzZVRva2VuUGFzc3dvcmQiOiIiLCJtZXJjaGFudFVybCI6Imh0dHA6Ly90ZXN0LmNvbSJ9"}}`) errs = Validate(rawJson, "v1") assert.Equal(t, 0, len(errs)) } - -func PrettyPrint(v interface{}) (err error) { - b, err := json.MarshalIndent(v, "", " ") - if err == nil { - fmt.Println(string(b)) - } - return -} From 40136b32331d8f17721b781c78afd25f81e9788a Mon Sep 17 00:00:00 2001 From: Tom Kay Date: Fri, 28 Oct 2022 11:38:51 +0100 Subject: [PATCH 3/6] getConfigJSON helper --- v1/connector/connector.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/v1/connector/connector.go b/v1/connector/connector.go index df9edfd..5ca9687 100644 --- a/v1/connector/connector.go +++ b/v1/connector/connector.go @@ -38,6 +38,11 @@ func (Connector) GetKind() object.Kind { return KindConnector } // GetVersion returns the Connector version func (Connector) GetVersion() string { return "v1" } +func (c Connector) GetConfigurationJSON() []byte { + j, _ := json.Marshal(c.Configuration) + return j +} + // NewDefinition returns a new connector definition func NewDefinition(d *object.Definition) (*Definition, error) { if _, ok := d.Spec.(*Connector); ok { From 8e0303abe17fb8c6cae8e192fcd0142fd90c9895 Mon Sep 17 00:00:00 2001 From: Tom Kay Date: Fri, 28 Oct 2022 11:50:00 +0100 Subject: [PATCH 4/6] decode string cfg --- v1/connector/connector.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/v1/connector/connector.go b/v1/connector/connector.go index 5ca9687..46ed639 100644 --- a/v1/connector/connector.go +++ b/v1/connector/connector.go @@ -1,6 +1,7 @@ package connector import ( + "encoding/base64" "encoding/json" "errors" @@ -39,7 +40,16 @@ func (Connector) GetKind() object.Kind { return KindConnector } func (Connector) GetVersion() string { return "v1" } func (c Connector) GetConfigurationJSON() []byte { - j, _ := json.Marshal(c.Configuration) + var j []byte + s, ok := c.Configuration.(string) + if ok { + dec, err := base64.StdEncoding.DecodeString(s) + if err != nil { + s = string(dec) + } + return []byte(s) + } + j, _ = json.Marshal(c.Configuration) return j } From 251ec8f60f846c8741fcbacbc9c285b27f74bb0c Mon Sep 17 00:00:00 2001 From: Tom Kay Date: Fri, 28 Oct 2022 11:53:47 +0100 Subject: [PATCH 5/6] err == nil --- v1/connector/connector.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/v1/connector/connector.go b/v1/connector/connector.go index 46ed639..aa2b087 100644 --- a/v1/connector/connector.go +++ b/v1/connector/connector.go @@ -44,7 +44,7 @@ func (c Connector) GetConfigurationJSON() []byte { s, ok := c.Configuration.(string) if ok { dec, err := base64.StdEncoding.DecodeString(s) - if err != nil { + if err == nil { s = string(dec) } return []byte(s) From 32367d03db1f19c7303dc7447803121c2983be90 Mon Sep 17 00:00:00 2001 From: Tom Kay Date: Fri, 28 Oct 2022 13:11:56 +0100 Subject: [PATCH 6/6] cleanup --- connectorconfig/connector.go | 15 +-------------- v1/connector/connector.go | 14 +++++++++----- 2 files changed, 10 insertions(+), 19 deletions(-) diff --git a/connectorconfig/connector.go b/connectorconfig/connector.go index ffc62e0..9adb8b4 100644 --- a/connectorconfig/connector.go +++ b/connectorconfig/connector.go @@ -1,7 +1,6 @@ package connectorconfig import ( - "encoding/base64" "encoding/json" "strings" @@ -23,19 +22,7 @@ func getCreds(c *connector.Connector, strict bool) (Credentials, error) { if err != nil { return credentials, err } - - str, isStr := c.Configuration.(string) - if !isStr { - s, _ := json.Marshal(c.Configuration) - str = string(s) - } else { - // check base64 - s, err := base64.StdEncoding.DecodeString(str) - if err == nil { - str = string(s) - } - } - reader := strings.NewReader(str) + reader := strings.NewReader(string(c.GetConfigurationJSON())) dec := json.NewDecoder(reader) if strict { dec.DisallowUnknownFields() diff --git a/v1/connector/connector.go b/v1/connector/connector.go index aa2b087..3278381 100644 --- a/v1/connector/connector.go +++ b/v1/connector/connector.go @@ -40,16 +40,20 @@ func (Connector) GetKind() object.Kind { return KindConnector } func (Connector) GetVersion() string { return "v1" } func (c Connector) GetConfigurationJSON() []byte { - var j []byte - s, ok := c.Configuration.(string) - if ok { + if u, ok := c.Configuration.([]uint8); ok { + dec, err := base64.StdEncoding.DecodeString(string(u)) + if err == nil { + return dec + } + return u + } else if s, ok := c.Configuration.(string); ok { dec, err := base64.StdEncoding.DecodeString(s) if err == nil { - s = string(dec) + return dec } return []byte(s) } - j, _ = json.Marshal(c.Configuration) + j, _ := json.Marshal(c.Configuration) return j }