Fix capability of serviceuser owners to delete auth tokens Change-Id: I8d17ec694fca8dcd24b0a3087f85a5b3aae01ce9
diff --git a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteToken.java b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteToken.java index 8662fa3..89a4df7 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteToken.java +++ b/src/main/java/com/googlesource/gerrit/plugins/serviceuser/DeleteToken.java
@@ -21,6 +21,7 @@ import com.google.gerrit.extensions.restapi.RestApiException; import com.google.gerrit.extensions.restapi.RestModifyView; import com.google.gerrit.server.CurrentUser; +import com.google.gerrit.server.account.AuthTokenAccessor; import com.google.gerrit.server.account.InvalidAuthTokenException; import com.google.gerrit.server.config.PluginConfig; import com.google.gerrit.server.config.PluginConfigFactory; @@ -30,14 +31,13 @@ import com.google.inject.Provider; import com.google.inject.Singleton; import com.googlesource.gerrit.plugins.serviceuser.email.ServiceUserOutgoingEmail; -import com.googlesource.gerrit.plugins.serviceuser.email.ServiceUserUpdatedEmailDecorator.Operation; import java.io.IOException; import org.eclipse.jgit.errors.ConfigInvalidException; @Singleton public class DeleteToken implements RestModifyView<ServiceUserResource.Token, Input> { private final PluginConfig config; - private final com.google.gerrit.server.restapi.account.DeleteToken deleteToken; + private final AuthTokenAccessor tokenAccessor; private final Provider<CurrentUser> self; private final PermissionBackend permissionBackend; private final ServiceUserOutgoingEmail.Factory outgoingEmailFactory; @@ -46,12 +46,12 @@ DeleteToken( @PluginName String pluginName, PluginConfigFactory pluginConfigFactory, - com.google.gerrit.server.restapi.account.DeleteToken deleteToken, + AuthTokenAccessor tokenAccessor, Provider<CurrentUser> self, PermissionBackend permissionBackend, ServiceUserOutgoingEmail.Factory outgoingEmailFactory) { this.config = pluginConfigFactory.getFromGerritConfig(pluginName); - this.deleteToken = deleteToken; + this.tokenAccessor = tokenAccessor; this.self = self; this.permissionBackend = permissionBackend; this.outgoingEmailFactory = outgoingEmailFactory; @@ -69,10 +69,7 @@ permissionBackend.user(self.get()).check(ADMINISTRATE_SERVER); } - Response<String> resp = deleteToken.apply(rsrc.getUser(), rsrc.getToken().id(), false); - if (resp.statusCode() == Response.none().statusCode()) { - outgoingEmailFactory.create(rsrc, Operation.DELETE_TOKEN).send(); - } - return resp; + tokenAccessor.deleteToken(rsrc.getUser().getAccountId(), rsrc.getToken().id()); + return Response.none(); } }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/serviceuser/DeleteTokenIT.java b/src/test/java/com/googlesource/gerrit/plugins/serviceuser/DeleteTokenIT.java new file mode 100644 index 0000000..92354d5 --- /dev/null +++ b/src/test/java/com/googlesource/gerrit/plugins/serviceuser/DeleteTokenIT.java
@@ -0,0 +1,63 @@ +// Copyright (C) 2025 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.googlesource.gerrit.plugins.serviceuser; + +import com.google.gerrit.acceptance.LightweightPluginDaemonTest; +import com.google.gerrit.acceptance.TestPlugin; +import com.google.gerrit.acceptance.UseSsh; +import com.google.gerrit.acceptance.config.GerritConfig; +import org.junit.Before; +import org.junit.Test; + +@UseSsh +@TestPlugin( + name = "serviceuser", + sysModule = "com.googlesource.gerrit.plugins.serviceuser.Module", + sshModule = "com.googlesource.gerrit.plugins.serviceuser.SshModule", + httpModule = "com.googlesource.gerrit.plugins.serviceuser.HttpModule") +public class DeleteTokenIT extends LightweightPluginDaemonTest { + private static final String SERVICEUSER_NAME = "testServiceuser"; + private static final String OWNER_GROUP_NAME = "testGroup"; + private static final String SERVICEUSER_TOKEN_ID = "token"; + private static final String SERVICEUSER_BASE_URL = "/config/server/serviceuser~serviceusers/"; + + @Before + public void setUp() throws Exception { + adminRestSession.put(SERVICEUSER_BASE_URL + SERVICEUSER_NAME).assertCreated(); + adminRestSession.put("/groups/" + OWNER_GROUP_NAME).assertCreated(); + + PutOwner.Input ownerInput = new PutOwner.Input(); + ownerInput.group = OWNER_GROUP_NAME; + adminRestSession + .put(SERVICEUSER_BASE_URL + SERVICEUSER_NAME + "/owner", ownerInput) + .assertCreated(); + + adminRestSession + .put(SERVICEUSER_BASE_URL + SERVICEUSER_NAME + "/tokens/" + SERVICEUSER_TOKEN_ID) + .assertCreated(); + } + + @Test + @GerritConfig(name = "plugin.serviceuser.allowHttpPassword", value = "true") + public void testDeleteToken() throws Exception { + userRestSession + .delete(SERVICEUSER_BASE_URL + SERVICEUSER_NAME + "/tokens/" + SERVICEUSER_TOKEN_ID) + .assertNotFound(); + adminRestSession.put("/groups/" + OWNER_GROUP_NAME + "/members/" + user.id()); + userRestSession + .delete(SERVICEUSER_BASE_URL + SERVICEUSER_NAME + "/tokens/" + SERVICEUSER_TOKEN_ID) + .assertNoContent(); + } +}