summaryrefslogtreecommitdiffstats
path: root/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java
diff options
context:
space:
mode:
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java')
-rw-r--r--gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java63
1 files changed, 31 insertions, 32 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java
index a0e084ccf1..2c59156176 100644
--- a/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java
+++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/DeleteExternalIds.java
@@ -14,70 +14,70 @@
package com.google.gerrit.server.account;
-import static com.google.gerrit.server.account.ExternalId.SCHEME_USERNAME;
+import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME;
import static java.util.stream.Collectors.toMap;
+import static java.util.stream.Collectors.toSet;
-import com.google.gerrit.extensions.restapi.AuthException;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.ResourceConflictException;
import com.google.gerrit.extensions.restapi.Response;
import com.google.gerrit.extensions.restapi.RestApiException;
import com.google.gerrit.extensions.restapi.RestModifyView;
import com.google.gerrit.extensions.restapi.UnprocessableEntityException;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.server.ReviewDb;
import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.externalids.ExternalId;
+import com.google.gerrit.server.account.externalids.ExternalIds;
+import com.google.gerrit.server.permissions.GlobalPermission;
+import com.google.gerrit.server.permissions.PermissionBackend;
+import com.google.gerrit.server.permissions.PermissionBackendException;
import com.google.gwtorm.server.OrmException;
import com.google.inject.Inject;
import com.google.inject.Provider;
+import com.google.inject.Singleton;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.eclipse.jgit.errors.ConfigInvalidException;
+@Singleton
public class DeleteExternalIds implements RestModifyView<AccountResource, List<String>> {
- private final AccountByEmailCache accountByEmailCache;
- private final AccountCache accountCache;
- private final ExternalIdsUpdate.User externalIdsUpdateFactory;
+ private final PermissionBackend permissionBackend;
+ private final AccountManager accountManager;
+ private final ExternalIds externalIds;
private final Provider<CurrentUser> self;
- private final Provider<ReviewDb> dbProvider;
@Inject
DeleteExternalIds(
- AccountByEmailCache accountByEmailCache,
- AccountCache accountCache,
- ExternalIdsUpdate.User externalIdsUpdateFactory,
- Provider<CurrentUser> self,
- Provider<ReviewDb> dbProvider) {
- this.accountByEmailCache = accountByEmailCache;
- this.accountCache = accountCache;
- this.externalIdsUpdateFactory = externalIdsUpdateFactory;
+ PermissionBackend permissionBackend,
+ AccountManager accountManager,
+ ExternalIds externalIds,
+ Provider<CurrentUser> self) {
+ this.permissionBackend = permissionBackend;
+ this.accountManager = accountManager;
+ this.externalIds = externalIds;
this.self = self;
- this.dbProvider = dbProvider;
}
@Override
- public Response<?> apply(AccountResource resource, List<String> externalIds)
- throws RestApiException, IOException, OrmException, ConfigInvalidException {
+ public Response<?> apply(AccountResource resource, List<String> extIds)
+ throws RestApiException, IOException, OrmException, ConfigInvalidException,
+ PermissionBackendException {
if (!self.get().hasSameAccountId(resource.getUser())) {
- throw new AuthException("not allowed to delete external IDs");
+ permissionBackend.user(self).check(GlobalPermission.ACCESS_DATABASE);
}
- if (externalIds == null || externalIds.size() == 0) {
+ if (extIds == null || extIds.size() == 0) {
throw new BadRequestException("external IDs are required");
}
- Account.Id accountId = resource.getUser().getAccountId();
Map<ExternalId.Key, ExternalId> externalIdMap =
- dbProvider.get().accountExternalIds().byAccount(resource.getUser().getAccountId()).toList()
- .stream()
- .map(ExternalId::from)
+ externalIds.byAccount(resource.getUser().getAccountId()).stream()
.collect(toMap(i -> i.key(), i -> i));
List<ExternalId> toDelete = new ArrayList<>();
ExternalId.Key last = resource.getUser().getLastLoginExternalIdKey();
- for (String externalIdStr : externalIds) {
+ for (String externalIdStr : extIds) {
ExternalId id = externalIdMap.get(ExternalId.Key.parse(externalIdStr));
if (id == null) {
@@ -94,12 +94,11 @@ public class DeleteExternalIds implements RestModifyView<AccountResource, List<S
}
}
- if (!toDelete.isEmpty()) {
- externalIdsUpdateFactory.create().delete(dbProvider.get(), toDelete);
- accountCache.evict(accountId);
- for (ExternalId e : toDelete) {
- accountByEmailCache.evict(e.email());
- }
+ try {
+ accountManager.unlink(
+ resource.getUser().getAccountId(), toDelete.stream().map(e -> e.key()).collect(toSet()));
+ } catch (AccountException e) {
+ throw new ResourceConflictException(e.getMessage());
}
return Response.none();