diff --git a/automation/automation/jwt_handler.go b/automation/automation/jwt_handler.go index d5c2cde96..fe66517cf 100644 --- a/automation/automation/jwt_handler.go +++ b/automation/automation/jwt_handler.go @@ -45,7 +45,7 @@ func (h jwtHandler) generate(ctx context.Context, args *jwtGenerateArgs) (res *j } for k, v := range args.headerVars { - auxp[k] = v.Get() + auxh[k] = v.Get() } for k, v := range args.payloadVars { @@ -85,7 +85,7 @@ func (h jwtHandler) generate(ctx context.Context, args *jwtGenerateArgs) (res *j return } } else { - secret = args.secretString + secret = []byte(args.secretString) } } diff --git a/automation/automation/jwt_handler_test.go b/automation/automation/jwt_handler_test.go new file mode 100644 index 000000000..9e4943708 --- /dev/null +++ b/automation/automation/jwt_handler_test.go @@ -0,0 +1,115 @@ +package automation + +import ( + "context" + "errors" + "testing" + + "github.com/cortezaproject/corteza-server/pkg/expr" + "github.com/stretchr/testify/require" +) + +func TestJwtHandler(t *testing.T) { + type ( + tf struct { + name string + exp string + err error + params *jwtGenerateArgs + } + ) + + var ( + handler = &jwtHandler{} + tcc = []tf{ + { + name: "proxy processer with auth headers", + exp: "eyJhbGciOiJSUzI1NiIsImtleSI6InZhbHVlIiwidHlwIjoiSldUIn0.eyJrZXkiOiJ2YWx1ZSIsInNjb3BlIjpbInNjb3BlIiwic2NvcGUyIl19.OnnLBsJdrZwAPeMjYIJPlZPW7bZdp-JbgNKFrRPnPXcuQVAUxK-R69-kDZbdsRZFOaU-AC52Tz4Ft3-SzADgFroSpoNjpEdJwbaKANlG_pm2b8-1pXSc0YzhY7DqBs4iae2pI0FGpeT_dza6kp9TL3NQfgqjx05Q3Gz5-3Kk32MD3zIvpUXgwkPbb4XLJxiY2Ra1dRWVI5Guk4GyLA19b7Z-DrHg1GE9mDy_NwZZD994Iri9e5zmcAikRtfHO7guPtBKVwhvt3u37wXtRgEYMyFQAn2ZSZaTytK8161Y-TOcdLVlqy4OfasaVt1pP0aNI9GGz5R-OVCOghW7TqZ6YQ", + err: nil, + params: &jwtGenerateArgs{ + Scope: `scope scope2`, + headerVars: must(expr.CastToVars(map[string]interface{}{"key": "value"})), + payloadVars: must(expr.CastToVars(map[string]interface{}{"key": "value"})), + secretString: prKey, + hasHeader: true, + hasPayload: true, + hasSecret: true}, + }, + { + name: "proxy processer with auth headers", + exp: "", + err: errors.New("could not generate JWT, payload missing"), + params: &jwtGenerateArgs{ + hasHeader: true, + hasPayload: false, + hasSecret: true}, + }, + { + name: "proxy processer with auth headers", + exp: "", + err: errors.New("could not generate JWT, secret or cert missing"), + params: &jwtGenerateArgs{ + hasHeader: true, + hasPayload: true, + hasSecret: false}, + }, + } + ) + + for _, tc := range tcc { + t.Run(tc.name, func(t *testing.T) { + var ( + req = require.New(t) + ctx = context.Background() + ) + + res, err := handler.generate(ctx, tc.params) + + if tc.err == nil { + req.NoError(err) + } else { + req.EqualError(err, tc.err.Error()) + } + + if res != nil { + req.Equal(tc.exp, res.Token) + } + }) + } +} + +const prKey string = `-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCn2MSVSyMzdZ5Q +cD0KMZAuhAmWE06qS/agpkG9OmvxsBAXjS8/2oaLCtmpF7Sx7XEJOaVUz8caty0L +Qjpovv5ZNqY0S/A+KahayTVXvNhjtwVb4kSYv8Tfv1H72CJAsHEi++DuFJ3uJyW5 +zAblXpY96dCLKd4R6BOwQSAqpqAgCBJX3NiM1CtB6zvdYcGPxUJmFOxUSdU779WY +IloTDCi9lY/SWgt5tHb38jiCv8uZ9B+sgD6PXXqjnOnji+XXJb3zGrmyeSBvhgF+ +bqlMcOXaufikzdq8v6wrW6zPsdDCYqtbpyku0pVz5JuN/czItS4fFGaQ+hjYnnq4 +nU5YKGhjAgMBAAECggEAPlzd/ZJjS9VhswVgyI7NwVqxrR8TVVbQFbRwLHyuaqg9 +8mI0sgbhgnvPj3INYyaTnxfaA/8HPTfd9pbu2MhN/Ju/eSLV6mLT+JdVyHmT9Mil +pxQU5KQr4+5T6bzOTTbBcnwfgJYMb9X/wF68GTDhpbNgFrTBm+mclxo7d11dlUiQ +bdA2KBhIM54kKcWEO90AP2FiC/cRSbv8afHVb0Fxy1SBAGVDSscUaEwgyHkRf6H7 +Mmt4xhfBwLZZk5pVa97pZsas7L0sm4BtyYSs4elJesuo3DTpezZSzWHNreJcCL00 +v7pm9ZWv9PYeUcQqSw6Ws2fhsydiN93o8s/fPpF0IQKBgQDQqvKPjGo3HLRnBmpc +nhUVQgjdh/QobJCGBjdxR/C3NkcatNLONddhefqovfb2jITdHmRKW+7XgRq/q457 +mZ2JPvvryiWcVqf6D91tSoFYrVg5nU1zr6nTga1BpTH00/eNEXxjMAAguPj3m7Sw +3BP7L8yZZI1pOOjzVzuISEDlGwKBgQDN62ZXzRqorn5t+mDywTAJ2qAyZzoDAtUP +CjANOKBCECqE9cOW1qBDJcaEF7G+xyB22CMciOELjGXWw6ZwFWjc23tDCEkoHoia +5IWvwNs5ncdPCuOm3aay9w2dx9Idy+Eq5Vpe4XDlnZvEfzjwXX3gbQ5YS9kbNE2r +XtmgD/BmWQKBgBNKqrBA0BUWT0tzGWRErThQ6ZbpmdYe62Gos3mCqCuYFgzPCOpN +qgL2DwmIvotexG3ZAHardzJvWjS8PKkKs7jbnNjY0I9ap58D1nnjOIAlTpHNDDsU +04OdapI2Hp8+9ZUSN8jHyEs+Lq5ds9/iCOrhKW5JEJXY0BinSPa5j15fAoGBAM2I +dqCQollXwe34CaiD13UeeOOWUTsMKqlWW9v2d085X5dSzyTRmSksnVbfZ5SqoOa+ +mV0z6pxiSIvywUACvqYjlIa10H9w6pzgF+fzMV3y9CsbDVtSxb7ABSFFf54qD9eH +EYq+rrchd4bMDYMtbiUB9V2AZ3VV4Wh5xfKTtjoRAoGAec/nBmX/oHiG/3T2LEmo +bTT+/eXc4LUzgHvFG6HW40PI8T2TfMTUGQH+90zkraryUF5PNoUF58tooDAcMWXm +DPEHFHeWn8T4obfuUjTw1mwj7Xjzr40HDitjIQa0bvBVwdYyEgiEw1CaeaUpq9Z8 +ElGWoRHT87pfoZjbdPz7a4Y= +-----END PRIVATE KEY-----` + +func must(v map[string]expr.TypedValue, err error) map[string]expr.TypedValue { + if err != nil { + panic(err) + } + return v +}