| // 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 java.io.ByteArrayOutputStream; |
| import java.io.UnsupportedEncodingException; |
| import java.util.Collections; |
| |
| import javax.inject.Inject; |
| |
| import com.google.gerrit.reviewdb.client.Account; |
| import com.google.gerrit.reviewdb.client.AccountExternalId; |
| import com.google.gerrit.reviewdb.client.AccountGroup; |
| import com.google.gerrit.reviewdb.client.AccountGroupMember; |
| import com.google.gerrit.reviewdb.client.AccountSshKey; |
| import com.google.gerrit.reviewdb.server.ReviewDb; |
| import com.google.gerrit.server.account.AccountByEmailCache; |
| import com.google.gerrit.server.account.AccountCache; |
| import com.google.gerrit.server.account.GroupCache; |
| import com.google.gerrit.server.ssh.SshKeyCache; |
| import com.google.gerrit.server.util.TimeUtil; |
| import com.google.gwtorm.server.OrmException; |
| import com.google.gwtorm.server.SchemaFactory; |
| |
| import com.jcraft.jsch.JSch; |
| import com.jcraft.jsch.JSchException; |
| import com.jcraft.jsch.KeyPair; |
| |
| public class AccountCreator { |
| |
| private SchemaFactory<ReviewDb> reviewDbProvider; |
| private GroupCache groupCache; |
| private SshKeyCache sshKeyCache; |
| private AccountCache accountCache; |
| private AccountByEmailCache byEmailCache; |
| |
| @Inject |
| AccountCreator(SchemaFactory<ReviewDb> schema, GroupCache groupCache, |
| SshKeyCache sshKeyCache, AccountCache accountCache, |
| AccountByEmailCache byEmailCache) { |
| reviewDbProvider = schema; |
| this.groupCache = groupCache; |
| this.sshKeyCache = sshKeyCache; |
| this.accountCache = accountCache; |
| this.byEmailCache = byEmailCache; |
| } |
| |
| public TestAccount create(String username, String email, String fullName, |
| String... groups) |
| throws OrmException, UnsupportedEncodingException, JSchException { |
| ReviewDb db = reviewDbProvider.open(); |
| try { |
| Account.Id id = new Account.Id(db.nextAccountId()); |
| KeyPair sshKey = genSshKey(); |
| AccountSshKey key = |
| new AccountSshKey(new AccountSshKey.Id(id, 1), publicKey(sshKey, email)); |
| AccountExternalId extUser = |
| new AccountExternalId(id, new AccountExternalId.Key( |
| AccountExternalId.SCHEME_USERNAME, username)); |
| String httpPass = "http-pass"; |
| extUser.setPassword(httpPass); |
| db.accountExternalIds().insert(Collections.singleton(extUser)); |
| |
| if (email != null) { |
| AccountExternalId extMailto = new AccountExternalId(id, getEmailKey(email)); |
| extMailto.setEmailAddress(email); |
| db.accountExternalIds().insert(Collections.singleton(extMailto)); |
| } |
| |
| Account a = new Account(id, TimeUtil.nowTs()); |
| a.setFullName(fullName); |
| a.setPreferredEmail(email); |
| db.accounts().insert(Collections.singleton(a)); |
| |
| db.accountSshKeys().insert(Collections.singleton(key)); |
| |
| if (groups != null) { |
| for (String n : groups) { |
| AccountGroup.NameKey k = new AccountGroup.NameKey(n); |
| AccountGroup g = groupCache.get(k); |
| AccountGroupMember m = |
| new AccountGroupMember(new AccountGroupMember.Key(id, g.getId())); |
| db.accountGroupMembers().insert(Collections.singleton(m)); |
| } |
| } |
| |
| sshKeyCache.evict(username); |
| accountCache.evictByUsername(username); |
| byEmailCache.evict(email); |
| |
| return new TestAccount(id, username, email, fullName, sshKey, httpPass); |
| } finally { |
| db.close(); |
| } |
| } |
| |
| public TestAccount create(String username, String group) |
| throws OrmException, UnsupportedEncodingException, JSchException { |
| return create(username, null, username, group); |
| } |
| |
| public TestAccount create(String username) |
| throws UnsupportedEncodingException, OrmException, JSchException { |
| return create(username, null, username, (String[]) null); |
| } |
| |
| public TestAccount admin() |
| throws UnsupportedEncodingException, OrmException, JSchException { |
| return create("admin", "admin@example.com", "Administrator", |
| "Administrators"); |
| } |
| |
| public TestAccount admin2() |
| throws UnsupportedEncodingException, OrmException, JSchException { |
| return create("admin2", "admin2@example.com", "Administrator2", |
| "Administrators"); |
| } |
| |
| public TestAccount user() |
| throws UnsupportedEncodingException, OrmException, JSchException { |
| return create("user", "user@example.com", "User"); |
| } |
| |
| public TestAccount user2() |
| throws UnsupportedEncodingException, OrmException, JSchException { |
| return create("user2", "user2@example.com", "User2"); |
| } |
| |
| private AccountExternalId.Key getEmailKey(String email) { |
| return new AccountExternalId.Key(AccountExternalId.SCHEME_MAILTO, email); |
| } |
| |
| private static KeyPair genSshKey() throws JSchException { |
| JSch jsch = new JSch(); |
| return KeyPair.genKeyPair(jsch, KeyPair.RSA); |
| } |
| |
| private static String publicKey(KeyPair sshKey, String comment) |
| throws UnsupportedEncodingException { |
| ByteArrayOutputStream out = new ByteArrayOutputStream(); |
| sshKey.writePublicKey(out, comment); |
| return out.toString("ASCII"); |
| } |
| } |