diff --git a/internal/central/pkg/handlers/admin_central.go b/internal/central/pkg/handlers/admin_central.go index 86218326e4..ea5d1be9c9 100644 --- a/internal/central/pkg/handlers/admin_central.go +++ b/internal/central/pkg/handlers/admin_central.go @@ -195,7 +195,11 @@ func (h adminCentralHandler) Delete(w http.ResponseWriter, r *http.Request) { Action: func() (i interface{}, serviceError *errors.ServiceError) { id := mux.Vars(r)["id"] ctx := r.Context() - err := h.service.RegisterCentralDeprovisionJob(ctx, id) + centralRequest, err := h.service.Get(ctx, id) + if err != nil { + return nil, err + } + err = h.service.RegisterCentralDeprovisionJob(ctx, centralRequest) h.telemetry.TrackDeletionRequested(ctx, id, true, err.AsError()) return nil, err }, diff --git a/internal/central/pkg/handlers/central.go b/internal/central/pkg/handlers/central.go index edf1d6fcde..8a476ddd88 100644 --- a/internal/central/pkg/handlers/central.go +++ b/internal/central/pkg/handlers/central.go @@ -108,7 +108,7 @@ func (h centralHandler) Delete(w http.ResponseWriter, r *http.Request) { if err != nil { return nil, err } - err = h.service.RegisterCentralDeprovisionJob(ctx, id) + err = h.service.RegisterCentralDeprovisionJob(ctx, centralRequest) if !centralRequest.Internal { h.telemetry.TrackDeletionRequested(ctx, id, false, err.AsError()) } diff --git a/internal/central/pkg/services/central.go b/internal/central/pkg/services/central.go index 501a87171e..c2dd4eb0b7 100644 --- a/internal/central/pkg/services/central.go +++ b/internal/central/pkg/services/central.go @@ -103,7 +103,7 @@ type CentralService interface { ChangeCentralCNAMErecords(centralRequest *dbapi.CentralRequest, action CentralRoutesAction) (*route53.ChangeResourceRecordSetsOutput, *errors.ServiceError) GetCNAMERecordStatus(centralRequest *dbapi.CentralRequest) (*CNameRecordStatus, error) DetectInstanceType(centralRequest *dbapi.CentralRequest) types.CentralInstanceType - RegisterCentralDeprovisionJob(ctx context.Context, id string) *errors.ServiceError + RegisterCentralDeprovisionJob(ctx context.Context, centralRequest *dbapi.CentralRequest) *errors.ServiceError // DeprovisionCentralForUsers registers all centrals for deprovisioning given the list of owners DeprovisionCentralForUsers(users []string) *errors.ServiceError DeprovisionExpiredCentrals() *errors.ServiceError @@ -482,8 +482,8 @@ func (k *centralService) GetByID(id string) (*dbapi.CentralRequest, *errors.Serv } // RegisterCentralDeprovisionJob registers a central deprovision job in the central table -func (k *centralService) RegisterCentralDeprovisionJob(ctx context.Context, id string) *errors.ServiceError { - if id == "" { +func (k *centralService) RegisterCentralDeprovisionJob(ctx context.Context, centralRequest *dbapi.CentralRequest) *errors.ServiceError { + if centralRequest.ID == "" { return errors.Validation("id is undefined") } @@ -493,29 +493,27 @@ func (k *centralService) RegisterCentralDeprovisionJob(ctx context.Context, id s return errors.NewWithCause(errors.ErrorUnauthenticated, err, "user not authenticated") } - dbConn := k.connectionFactory.New() - + isAuthorizedToDelete := false if auth.GetIsAdminFromContext(ctx) { - dbConn = dbConn.Where("id = ?", id) + isAuthorizedToDelete = true } else if claims.IsOrgAdmin() { orgID, _ := claims.GetOrgID() - dbConn = dbConn.Where("id = ?", id).Where("organisation_id = ?", orgID) + isAuthorizedToDelete = centralRequest.OrganisationID == orgID } else { user, _ := claims.GetUsername() - dbConn = dbConn.Where("id = ?", id).Where("owner = ? ", user) + isAuthorizedToDelete = centralRequest.Owner == user } - var centralRequest dbapi.CentralRequest - if err := dbConn.First(¢ralRequest).Error; err != nil { - return services.HandleGetError("CentralResource", "id", id, err) + if !isAuthorizedToDelete { + return errors.Unauthorized("user not authorized to delete central") } - metrics.IncreaseCentralTotalOperationsCountMetric(constants.CentralOperationDeprovision) + metrics.IncreaseCentralTotalOperationsCountMetric(constants.CentralOperationDeprovision) deprovisionStatus := constants.CentralRequestStatusDeprovision - if executed, err := k.UpdateStatus(id, deprovisionStatus); executed { + if executed, err := k.UpdateStatus(centralRequest.ID, deprovisionStatus); executed { if err != nil { - return services.HandleGetError("CentralResource", "id", id, err) + return services.HandleGetError("CentralResource", "id", centralRequest.ID, err) } metrics.IncreaseCentralSuccessOperationsCountMetric(constants.CentralOperationDeprovision) metrics.UpdateCentralRequestsStatusSinceCreatedMetric(deprovisionStatus, centralRequest.ID, centralRequest.ClusterID, time.Since(centralRequest.CreatedAt)) diff --git a/internal/central/pkg/services/centralservice_moq.go b/internal/central/pkg/services/centralservice_moq.go index 81dda7af58..c1321f5f21 100644 --- a/internal/central/pkg/services/centralservice_moq.go +++ b/internal/central/pkg/services/centralservice_moq.go @@ -85,7 +85,7 @@ var _ CentralService = &CentralServiceMock{} // PrepareCentralRequestFunc: func(centralRequest *dbapi.CentralRequest) *serviceError.ServiceError { // panic("mock out the PrepareCentralRequest method") // }, -// RegisterCentralDeprovisionJobFunc: func(ctx context.Context, id string) *serviceError.ServiceError { +// RegisterCentralDeprovisionJobFunc: func(ctx context.Context, centralRequest *dbapi.CentralRequest) *serviceError.ServiceError { // panic("mock out the RegisterCentralDeprovisionJob method") // }, // RegisterCentralJobFunc: func(ctx context.Context, centralRequest *dbapi.CentralRequest) *serviceError.ServiceError { @@ -180,7 +180,7 @@ type CentralServiceMock struct { PrepareCentralRequestFunc func(centralRequest *dbapi.CentralRequest) *serviceError.ServiceError // RegisterCentralDeprovisionJobFunc mocks the RegisterCentralDeprovisionJob method. - RegisterCentralDeprovisionJobFunc func(ctx context.Context, id string) *serviceError.ServiceError + RegisterCentralDeprovisionJobFunc func(ctx context.Context, centralRequest *dbapi.CentralRequest) *serviceError.ServiceError // RegisterCentralJobFunc mocks the RegisterCentralJob method. RegisterCentralJobFunc func(ctx context.Context, centralRequest *dbapi.CentralRequest) *serviceError.ServiceError @@ -334,8 +334,8 @@ type CentralServiceMock struct { RegisterCentralDeprovisionJob []struct { // Ctx is the ctx argument value. Ctx context.Context - // ID is the id argument value. - ID string + // CentralRequest is the centralRequest argument value. + CentralRequest *dbapi.CentralRequest } // RegisterCentralJob holds details about calls to the RegisterCentralJob method. RegisterCentralJob []struct { @@ -1104,21 +1104,21 @@ func (mock *CentralServiceMock) PrepareCentralRequestCalls() []struct { } // RegisterCentralDeprovisionJob calls RegisterCentralDeprovisionJobFunc. -func (mock *CentralServiceMock) RegisterCentralDeprovisionJob(ctx context.Context, id string) *serviceError.ServiceError { +func (mock *CentralServiceMock) RegisterCentralDeprovisionJob(ctx context.Context, centralRequest *dbapi.CentralRequest) *serviceError.ServiceError { if mock.RegisterCentralDeprovisionJobFunc == nil { panic("CentralServiceMock.RegisterCentralDeprovisionJobFunc: method is nil but CentralService.RegisterCentralDeprovisionJob was just called") } callInfo := struct { - Ctx context.Context - ID string + Ctx context.Context + CentralRequest *dbapi.CentralRequest }{ - Ctx: ctx, - ID: id, + Ctx: ctx, + CentralRequest: centralRequest, } mock.lockRegisterCentralDeprovisionJob.Lock() mock.calls.RegisterCentralDeprovisionJob = append(mock.calls.RegisterCentralDeprovisionJob, callInfo) mock.lockRegisterCentralDeprovisionJob.Unlock() - return mock.RegisterCentralDeprovisionJobFunc(ctx, id) + return mock.RegisterCentralDeprovisionJobFunc(ctx, centralRequest) } // RegisterCentralDeprovisionJobCalls gets all the calls that were made to RegisterCentralDeprovisionJob. @@ -1126,12 +1126,12 @@ func (mock *CentralServiceMock) RegisterCentralDeprovisionJob(ctx context.Contex // // len(mockedCentralService.RegisterCentralDeprovisionJobCalls()) func (mock *CentralServiceMock) RegisterCentralDeprovisionJobCalls() []struct { - Ctx context.Context - ID string + Ctx context.Context + CentralRequest *dbapi.CentralRequest } { var calls []struct { - Ctx context.Context - ID string + Ctx context.Context + CentralRequest *dbapi.CentralRequest } mock.lockRegisterCentralDeprovisionJob.RLock() calls = mock.calls.RegisterCentralDeprovisionJob