diff options
Diffstat (limited to 'gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java')
-rw-r--r-- | gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java | 252 |
1 files changed, 0 insertions, 252 deletions
diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java deleted file mode 100644 index 6e0e512a20..0000000000 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java +++ /dev/null @@ -1,252 +0,0 @@ -// Copyright (C) 2013 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.google.gerrit.server.group; - -import com.google.common.base.Strings; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Lists; -import com.google.gerrit.common.data.GroupDescription; -import com.google.gerrit.common.errors.NoSuchGroupException; -import com.google.gerrit.extensions.client.AuthType; -import com.google.gerrit.extensions.common.AccountInfo; -import com.google.gerrit.extensions.restapi.AuthException; -import com.google.gerrit.extensions.restapi.DefaultInput; -import com.google.gerrit.extensions.restapi.MethodNotAllowedException; -import com.google.gerrit.extensions.restapi.ResourceNotFoundException; -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.client.AccountGroup; -import com.google.gerrit.reviewdb.server.ReviewDb; -import com.google.gerrit.server.account.AccountCache; -import com.google.gerrit.server.account.AccountException; -import com.google.gerrit.server.account.AccountLoader; -import com.google.gerrit.server.account.AccountManager; -import com.google.gerrit.server.account.AccountResolver; -import com.google.gerrit.server.account.AccountsCollection; -import com.google.gerrit.server.account.AuthRequest; -import com.google.gerrit.server.account.GroupControl; -import com.google.gerrit.server.account.externalids.ExternalId; -import com.google.gerrit.server.config.AuthConfig; -import com.google.gerrit.server.group.AddMembers.Input; -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.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.eclipse.jgit.errors.ConfigInvalidException; - -@Singleton -public class AddMembers implements RestModifyView<GroupResource, Input> { - public static class Input { - @DefaultInput String _oneMember; - - List<String> members; - - public static Input fromMembers(List<String> members) { - Input in = new Input(); - in.members = members; - return in; - } - - static Input init(Input in) { - if (in == null) { - in = new Input(); - } - if (in.members == null) { - in.members = Lists.newArrayListWithCapacity(1); - } - if (!Strings.isNullOrEmpty(in._oneMember)) { - in.members.add(in._oneMember); - } - return in; - } - } - - private final AccountManager accountManager; - private final AuthType authType; - private final AccountsCollection accounts; - private final AccountResolver accountResolver; - private final AccountCache accountCache; - private final AccountLoader.Factory infoFactory; - private final Provider<ReviewDb> db; - private final Provider<GroupsUpdate> groupsUpdateProvider; - - @Inject - AddMembers( - AccountManager accountManager, - AuthConfig authConfig, - AccountsCollection accounts, - AccountResolver accountResolver, - AccountCache accountCache, - AccountLoader.Factory infoFactory, - Provider<ReviewDb> db, - @UserInitiated Provider<GroupsUpdate> groupsUpdateProvider) { - this.accountManager = accountManager; - this.authType = authConfig.getAuthType(); - this.accounts = accounts; - this.accountResolver = accountResolver; - this.accountCache = accountCache; - this.infoFactory = infoFactory; - this.db = db; - this.groupsUpdateProvider = groupsUpdateProvider; - } - - @Override - public List<AccountInfo> apply(GroupResource resource, Input input) - throws AuthException, MethodNotAllowedException, UnprocessableEntityException, OrmException, - IOException, ConfigInvalidException, ResourceNotFoundException { - GroupDescription.Internal internalGroup = - resource.asInternalGroup().orElseThrow(MethodNotAllowedException::new); - input = Input.init(input); - - GroupControl control = resource.getControl(); - if (!control.canAddMember()) { - throw new AuthException("Cannot add members to group " + internalGroup.getName()); - } - - Set<Account.Id> newMemberIds = new HashSet<>(); - for (String nameOrEmailOrId : input.members) { - Account a = findAccount(nameOrEmailOrId); - if (!a.isActive()) { - throw new UnprocessableEntityException( - String.format("Account Inactive: %s", nameOrEmailOrId)); - } - newMemberIds.add(a.getId()); - } - - AccountGroup.UUID groupUuid = internalGroup.getGroupUUID(); - try { - addMembers(groupUuid, newMemberIds); - } catch (NoSuchGroupException e) { - throw new ResourceNotFoundException(String.format("Group %s not found", groupUuid)); - } - return toAccountInfoList(newMemberIds); - } - - Account findAccount(String nameOrEmailOrId) - throws AuthException, UnprocessableEntityException, OrmException, IOException, - ConfigInvalidException { - try { - return accounts.parse(nameOrEmailOrId).getAccount(); - } catch (UnprocessableEntityException e) { - // might be because the account does not exist or because the account is - // not visible - switch (authType) { - case HTTP_LDAP: - case CLIENT_SSL_CERT_LDAP: - case LDAP: - if (accountResolver.find(nameOrEmailOrId) == null) { - // account does not exist, try to create it - Account a = createAccountByLdap(nameOrEmailOrId); - if (a != null) { - return a; - } - } - break; - case CUSTOM_EXTENSION: - case DEVELOPMENT_BECOME_ANY_ACCOUNT: - case HTTP: - case LDAP_BIND: - case OAUTH: - case OPENID: - case OPENID_SSO: - default: - } - throw e; - } - } - - public void addMembers(AccountGroup.UUID groupUuid, Collection<? extends Account.Id> newMemberIds) - throws OrmException, IOException, NoSuchGroupException { - groupsUpdateProvider - .get() - .addGroupMembers(db.get(), groupUuid, ImmutableSet.copyOf(newMemberIds)); - } - - private Account createAccountByLdap(String user) throws IOException { - if (!ExternalId.isValidUsername(user)) { - return null; - } - - try { - AuthRequest req = AuthRequest.forUser(user); - req.setSkipAuthentication(true); - return accountCache.get(accountManager.authenticate(req).getAccountId()).getAccount(); - } catch (AccountException e) { - return null; - } - } - - private List<AccountInfo> toAccountInfoList(Set<Account.Id> accountIds) throws OrmException { - List<AccountInfo> result = new ArrayList<>(); - AccountLoader loader = infoFactory.create(true); - for (Account.Id accId : accountIds) { - result.add(loader.get(accId)); - } - loader.fill(); - return result; - } - - static class PutMember implements RestModifyView<GroupResource, PutMember.Input> { - static class Input {} - - private final AddMembers put; - private final String id; - - PutMember(AddMembers put, String id) { - this.put = put; - this.id = id; - } - - @Override - public AccountInfo apply(GroupResource resource, PutMember.Input input) - throws AuthException, MethodNotAllowedException, ResourceNotFoundException, OrmException, - IOException, ConfigInvalidException { - AddMembers.Input in = new AddMembers.Input(); - in._oneMember = id; - try { - List<AccountInfo> list = put.apply(resource, in); - if (list.size() == 1) { - return list.get(0); - } - throw new IllegalStateException(); - } catch (UnprocessableEntityException e) { - throw new ResourceNotFoundException(id); - } - } - } - - @Singleton - static class UpdateMember implements RestModifyView<MemberResource, PutMember.Input> { - private final GetMember get; - - @Inject - UpdateMember(GetMember get) { - this.get = get; - } - - @Override - public AccountInfo apply(MemberResource resource, PutMember.Input input) throws OrmException { - // Do nothing, the user is already a member. - return get.apply(resource); - } - } -} |