From 19830e74d96947d3296d0a91bf59f0af8b425404 Mon Sep 17 00:00:00 2001 From: elinuxhenrik Date: Fri, 3 Feb 2023 10:14:48 +0100 Subject: [PATCH] Add check for same invoker onboarded Issue-ID: NONRTRIC-814 Signed-off-by: elinuxhenrik Change-Id: I2fa51cf45e98cea19f996ea79d3e9f6c57d02e53 --- .../invokermanagement/invokermanagement.go | 13 ++++++++++ .../invokermanagement/invokermanagement_test.go | 28 +++++++++++++--------- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/capifcore/internal/invokermanagement/invokermanagement.go b/capifcore/internal/invokermanagement/invokermanagement.go index 5fa5ce6..5d4ba25 100644 --- a/capifcore/internal/invokermanagement/invokermanagement.go +++ b/capifcore/internal/invokermanagement/invokermanagement.go @@ -108,6 +108,10 @@ func (im *InvokerManager) PostOnboardedInvokers(ctx echo.Context) error { return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, "invalid format for invoker")) } + if im.isInvokerOnboarded(newInvoker) { + return sendCoreError(ctx, http.StatusForbidden, fmt.Sprintf(errMsg, "invoker already onboarded")) + } + if err := im.validateInvoker(newInvoker, ctx); err != nil { return sendCoreError(ctx, http.StatusBadRequest, fmt.Sprintf(errMsg, err)) } @@ -127,6 +131,15 @@ func (im *InvokerManager) PostOnboardedInvokers(ctx echo.Context) error { return nil } +func (im *InvokerManager) isInvokerOnboarded(newInvoker invokerapi.APIInvokerEnrolmentDetails) bool { + for _, invoker := range im.onboardedInvokers { + if newInvoker.OnboardingInformation.ApiInvokerPublicKey == invoker.OnboardingInformation.ApiInvokerPublicKey { + return true + } + } + return false +} + func (im *InvokerManager) prepareNewInvoker(newInvoker *invokerapi.APIInvokerEnrolmentDetails) { var apiList invokerapi.APIList = im.publishRegister.GetAllPublishedServices() newInvoker.ApiList = &apiList diff --git a/capifcore/internal/invokermanagement/invokermanagement_test.go b/capifcore/internal/invokermanagement/invokermanagement_test.go index e5fa008..4365eb3 100644 --- a/capifcore/internal/invokermanagement/invokermanagement_test.go +++ b/capifcore/internal/invokermanagement/invokermanagement_test.go @@ -87,20 +87,28 @@ func TestOnboardInvoker(t *testing.T) { assert.Equal(t, eventsapi.CAPIFEventAPIINVOKERONBOARDED, invokerEvent.Events) } + // Onboarding the same invoker should result in Forbidden + result = testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(newInvoker).Go(t, requestHandler) + + assert.Equal(t, http.StatusForbidden, result.Code()) + var problemDetails common29122.ProblemDetails + err = result.UnmarshalBodyToObject(&problemDetails) + assert.NoError(t, err, "error unmarshaling response") + assert.Equal(t, http.StatusForbidden, *problemDetails.Status) + assert.Contains(t, *problemDetails.Cause, "already onboarded") + // Onboard an invoker missing required NotificationDestination, should get 400 with problem details invalidInvoker := invokermanagementapi.APIInvokerEnrolmentDetails{ OnboardingInformation: invokermanagementapi.OnboardingInformation{ - ApiInvokerPublicKey: "key", + ApiInvokerPublicKey: "newKey", }, } result = testutil.NewRequest().Post("/onboardedInvokers").WithJsonBody(invalidInvoker).Go(t, requestHandler) assert.Equal(t, http.StatusBadRequest, result.Code()) - var problemDetails common29122.ProblemDetails err = result.UnmarshalBodyToObject(&problemDetails) assert.NoError(t, err, "error unmarshaling response") - badRequest := http.StatusBadRequest - assert.Equal(t, &badRequest, problemDetails.Status) + assert.Equal(t, http.StatusBadRequest, *problemDetails.Status) assert.Contains(t, *problemDetails.Cause, "missing") assert.Contains(t, *problemDetails.Cause, "NotificationDestination") @@ -114,7 +122,7 @@ func TestOnboardInvoker(t *testing.T) { assert.Equal(t, http.StatusBadRequest, result.Code()) err = result.UnmarshalBodyToObject(&problemDetails) assert.NoError(t, err, "error unmarshaling response") - assert.Equal(t, &badRequest, problemDetails.Status) + assert.Equal(t, http.StatusBadRequest, *problemDetails.Status) assert.Contains(t, *problemDetails.Cause, "missing") assert.Contains(t, *problemDetails.Cause, "OnboardingInformation.ApiInvokerPublicKey") } @@ -190,8 +198,7 @@ func TestUpdateInvoker(t *testing.T) { var problemDetails common29122.ProblemDetails err = result.UnmarshalBodyToObject(&problemDetails) assert.NoError(t, err, "error unmarshaling response") - badRequest := http.StatusBadRequest - assert.Equal(t, &badRequest, problemDetails.Status) + assert.Equal(t, http.StatusBadRequest, *problemDetails.Status) assert.Contains(t, *problemDetails.Cause, "missing") assert.Contains(t, *problemDetails.Cause, "NotificationDestination") @@ -203,7 +210,7 @@ func TestUpdateInvoker(t *testing.T) { assert.Equal(t, http.StatusBadRequest, result.Code()) err = result.UnmarshalBodyToObject(&problemDetails) assert.NoError(t, err, "error unmarshaling response") - assert.Equal(t, &badRequest, problemDetails.Status) + assert.Equal(t, http.StatusBadRequest, *problemDetails.Status) assert.Contains(t, *problemDetails.Cause, "missing") assert.Contains(t, *problemDetails.Cause, "OnboardingInformation.ApiInvokerPublicKey") @@ -216,7 +223,7 @@ func TestUpdateInvoker(t *testing.T) { assert.Equal(t, http.StatusBadRequest, result.Code()) err = result.UnmarshalBodyToObject(&problemDetails) assert.NoError(t, err, "error unmarshaling response") - assert.Equal(t, &badRequest, problemDetails.Status) + assert.Equal(t, http.StatusBadRequest, *problemDetails.Status) assert.Contains(t, *problemDetails.Cause, "not matching") assert.Contains(t, *problemDetails.Cause, "ApiInvokerId") @@ -228,8 +235,7 @@ func TestUpdateInvoker(t *testing.T) { assert.Equal(t, http.StatusNotFound, result.Code()) err = result.UnmarshalBodyToObject(&problemDetails) assert.NoError(t, err, "error unmarshaling response") - notFound := http.StatusNotFound - assert.Equal(t, ¬Found, problemDetails.Status) + assert.Equal(t, http.StatusNotFound, *problemDetails.Status) assert.Contains(t, *problemDetails.Cause, "not been onboarded") assert.Contains(t, *problemDetails.Cause, "invoker") } -- 2.16.6