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();
+  }
+}