diff --git a/api/http/handler/extensions/upgrade.go b/api/http/handler/extensions/data.go similarity index 51% rename from api/http/handler/extensions/upgrade.go rename to api/http/handler/extensions/data.go index b0f37f5d7..8c950e608 100644 --- a/api/http/handler/extensions/upgrade.go +++ b/api/http/handler/extensions/data.go @@ -59,3 +59,59 @@ func (handler *Handler) upgradeRBACData() error { return handler.AuthorizationService.UpdateUsersAuthorizations() } + +func updateUserAccessPolicyToNoRole(policies portainer.UserAccessPolicies, key portainer.UserID) { + tmp := policies[key] + tmp.RoleID = 0 + policies[key] = tmp +} + +func updateTeamAccessPolicyToNoRole(policies portainer.TeamAccessPolicies, key portainer.TeamID) { + tmp := policies[key] + tmp.RoleID = 0 + policies[key] = tmp +} + +func (handler *Handler) downgradeRBACData() error { + endpointGroups, err := handler.EndpointGroupService.EndpointGroups() + if err != nil { + return err + } + + for _, endpointGroup := range endpointGroups { + for key := range endpointGroup.UserAccessPolicies { + updateUserAccessPolicyToNoRole(endpointGroup.UserAccessPolicies, key) + } + + for key := range endpointGroup.TeamAccessPolicies { + updateTeamAccessPolicyToNoRole(endpointGroup.TeamAccessPolicies, key) + } + + err := handler.EndpointGroupService.UpdateEndpointGroup(endpointGroup.ID, &endpointGroup) + if err != nil { + return err + } + } + + endpoints, err := handler.EndpointService.Endpoints() + if err != nil { + return err + } + + for _, endpoint := range endpoints { + for key := range endpoint.UserAccessPolicies { + updateUserAccessPolicyToNoRole(endpoint.UserAccessPolicies, key) + } + + for key := range endpoint.TeamAccessPolicies { + updateTeamAccessPolicyToNoRole(endpoint.TeamAccessPolicies, key) + } + + err := handler.EndpointService.UpdateEndpoint(endpoint.ID, &endpoint) + if err != nil { + return err + } + } + + return handler.AuthorizationService.UpdateUsersAuthorizations() +} diff --git a/api/http/handler/extensions/extension_delete.go b/api/http/handler/extensions/extension_delete.go index 6f59afc2b..3f9853016 100644 --- a/api/http/handler/extensions/extension_delete.go +++ b/api/http/handler/extensions/extension_delete.go @@ -29,6 +29,13 @@ func (handler *Handler) extensionDelete(w http.ResponseWriter, r *http.Request) return &httperror.HandlerError{http.StatusInternalServerError, "Unable to delete extension", err} } + if extensionID == portainer.RBACExtension { + err = handler.downgradeRBACData() + if err != nil { + return &httperror.HandlerError{http.StatusInternalServerError, "An error occured during database update", err} + } + } + err = handler.ExtensionService.DeleteExtension(extensionID) if err != nil { return &httperror.HandlerError{http.StatusInternalServerError, "Unable to delete the extension from the database", err}