All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.google.gerrit.acceptance.AccountCreator Maven / Gradle / Ivy

// 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.acceptance;

import static com.google.common.base.Preconditions.checkNotNull;
import static java.nio.charset.StandardCharsets.US_ASCII;

import com.google.gerrit.common.Nullable;
import com.google.gerrit.common.errors.NoSuchGroupException;
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.Sequences;
import com.google.gerrit.server.account.AccountsUpdate;
import com.google.gerrit.server.account.GroupCache;
import com.google.gerrit.server.account.VersionedAuthorizedKeys;
import com.google.gerrit.server.account.externalids.ExternalId;
import com.google.gerrit.server.account.externalids.ExternalIdsUpdate;
import com.google.gerrit.server.group.GroupsUpdate;
import com.google.gerrit.server.group.InternalGroup;
import com.google.gerrit.server.group.ServerInitiated;
import com.google.gerrit.server.ssh.SshKeyCache;
import com.google.gwtorm.server.SchemaFactory;
import com.google.inject.Inject;
import com.google.inject.Provider;
import com.google.inject.Singleton;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.KeyPair;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

@Singleton
public class AccountCreator {
  private final Map accounts;

  private final SchemaFactory reviewDbProvider;
  private final Sequences sequences;
  private final AccountsUpdate.Server accountsUpdate;
  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
  private final GroupCache groupCache;
  private final Provider groupsUpdateProvider;
  private final SshKeyCache sshKeyCache;
  private final ExternalIdsUpdate.Server externalIdsUpdate;
  private final boolean sshEnabled;

  @Inject
  AccountCreator(
      SchemaFactory schema,
      Sequences sequences,
      AccountsUpdate.Server accountsUpdate,
      VersionedAuthorizedKeys.Accessor authorizedKeys,
      GroupCache groupCache,
      @ServerInitiated Provider groupsUpdateProvider,
      SshKeyCache sshKeyCache,
      ExternalIdsUpdate.Server externalIdsUpdate,
      @SshEnabled boolean sshEnabled) {
    accounts = new HashMap<>();
    reviewDbProvider = schema;
    this.sequences = sequences;
    this.accountsUpdate = accountsUpdate;
    this.authorizedKeys = authorizedKeys;
    this.groupCache = groupCache;
    this.groupsUpdateProvider = groupsUpdateProvider;
    this.sshKeyCache = sshKeyCache;
    this.externalIdsUpdate = externalIdsUpdate;
    this.sshEnabled = sshEnabled;
  }

  public synchronized TestAccount create(
      @Nullable String username,
      @Nullable String email,
      @Nullable String fullName,
      String... groupNames)
      throws Exception {

    TestAccount account = accounts.get(username);
    if (account != null) {
      return account;
    }
    try (ReviewDb db = reviewDbProvider.open()) {
      Account.Id id = new Account.Id(sequences.nextAccountId());

      List extIds = new ArrayList<>(2);
      String httpPass = null;
      if (username != null) {
        httpPass = "http-pass";
        extIds.add(ExternalId.createUsername(username, id, httpPass));
      }

      if (email != null) {
        extIds.add(ExternalId.createEmail(id, email));
      }
      externalIdsUpdate.create().insert(extIds);

      accountsUpdate
          .create()
          .insert(
              id,
              a -> {
                a.setFullName(fullName);
                a.setPreferredEmail(email);
              });

      if (groupNames != null) {
        for (String n : groupNames) {
          AccountGroup.NameKey k = new AccountGroup.NameKey(n);
          Optional group = groupCache.get(k);
          if (!group.isPresent()) {
            throw new NoSuchGroupException(n);
          }
          groupsUpdateProvider.get().addGroupMember(db, group.get().getGroupUUID(), id);
        }
      }

      KeyPair sshKey = null;
      if (sshEnabled && username != null) {
        sshKey = genSshKey();
        authorizedKeys.addKey(id, publicKey(sshKey, email));
        sshKeyCache.evict(username);
      }

      account = new TestAccount(id, username, email, fullName, sshKey, httpPass);
      if (username != null) {
        accounts.put(username, account);
      }
      return account;
    }
  }

  public TestAccount create(@Nullable String username, String group) throws Exception {
    return create(username, null, username, group);
  }

  public TestAccount create() throws Exception {
    return create(null);
  }

  public TestAccount create(@Nullable String username) throws Exception {
    return create(username, null, username, (String[]) null);
  }

  public TestAccount admin() throws Exception {
    return create("admin", "[email protected]", "Administrator", "Administrators");
  }

  public TestAccount admin2() throws Exception {
    return create("admin2", "[email protected]", "Administrator2", "Administrators");
  }

  public TestAccount user() throws Exception {
    return create("user", "[email protected]", "User");
  }

  public TestAccount user2() throws Exception {
    return create("user2", "[email protected]", "User2");
  }

  public TestAccount get(String username) {
    return checkNotNull(accounts.get(username), "No TestAccount created for %s", username);
  }

  public static KeyPair genSshKey() throws JSchException {
    JSch jsch = new JSch();
    return KeyPair.genKeyPair(jsch, KeyPair.RSA);
  }

  public static String publicKey(KeyPair sshKey, String comment)
      throws UnsupportedEncodingException {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    sshKey.writePublicKey(out, comment);
    return out.toString(US_ASCII.name()).trim();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy