Adapt to changes in Gerrit core

SSH keys are now stored in git and no longer in the database.

Bug: Issue 4104
Change-Id: I94b39cb81ccd5b7dc235d8bd4c88dbe9292e38e3
Signed-off-by: Edwin Kempin <ekempin@google.com>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
index be953a9..d096a83 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AccountUtil.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.importer;
 
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.api.groups.GroupApi;
 import com.google.gerrit.extensions.common.AccountInfo;
@@ -23,27 +24,24 @@
 import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.extensions.restapi.TopLevelResource;
 import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.AccountSshKey;
 import com.google.gerrit.reviewdb.client.AuthType;
-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.AccountManager;
 import com.google.gerrit.server.account.AccountState;
 import com.google.gerrit.server.account.AuthRequest;
 import com.google.gerrit.server.account.CreateAccount;
+import com.google.gerrit.server.account.VersionedAuthorizedKeys;
 import com.google.gerrit.server.config.AuthConfig;
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.Singleton;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
-import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
 
@@ -57,7 +55,7 @@
   private final AccountManager accountManager;
   private final AuthType authType;
   private final com.google.gerrit.extensions.api.GerritApi gApi;
-  private final Provider<ReviewDb> db;
+  private final VersionedAuthorizedKeys.Accessor authorizedKeys;
 
   @Inject
   private CreateAccount.Factory createAccountFactory;
@@ -68,17 +66,17 @@
       AccountManager accountManager,
       AuthConfig authConfig,
       com.google.gerrit.extensions.api.GerritApi gApi,
-      Provider<ReviewDb> db) {
+      VersionedAuthorizedKeys.Accessor authorizedKeys) {
     this.accountCache = accountCache;
     this.accountManager = accountManager;
     this.authType = authConfig.getAuthType();
-    this.db = db;
     this.gApi = gApi;
+    this.authorizedKeys = authorizedKeys;
   }
 
   Account.Id resolveUser(GerritApi api, AccountInfo acc)
       throws NoSuchAccountException, IOException, OrmException,
-      RestApiException {
+      RestApiException, ConfigInvalidException, InvalidSshKeyException {
     if (acc.username == null) {
       throw new NoSuchAccountException(String.format(
           "User %s <%s> (%s) doesn't have a username and cannot be looked up.",
@@ -112,8 +110,8 @@
   }
 
   private Account.Id createAccountByLdapAndAddSshKeys(GerritApi api,
-      AccountInfo acc) throws NoSuchAccountException, IOException,
-      OrmException, RestApiException {
+      AccountInfo acc) throws NoSuchAccountException, IOException, OrmException,
+          RestApiException, ConfigInvalidException, InvalidSshKeyException {
     if (!acc.username.matches(Account.USER_NAME_PATTERN)) {
       throw new NoSuchAccountException(String.format("User %s not found",
           acc.username));
@@ -131,26 +129,17 @@
   }
 
   private void addSshKeys(GerritApi api, AccountInfo acc)
-      throws BadRequestException, IOException, OrmException {
+      throws BadRequestException, IOException, OrmException,
+      ConfigInvalidException, InvalidSshKeyException {
     List<SshKeyInfo> sshKeys = api.getSshKeys(acc.username);
     AccountState a = accountCache.getByUsername(acc.username);
-    db.get().accountSshKeys().upsert(toAccountSshKey(a, sshKeys));
-  }
-
-  private static Collection<AccountSshKey> toAccountSshKey(AccountState a,
-      List<SshKeyInfo> sshKeys) {
-    Collection<AccountSshKey> result = new HashSet<>();
-    int index = 1;
     for (SshKeyInfo sshKeyInfo : sshKeys) {
-      result.add(new AccountSshKey(
-          new AccountSshKey.Id(a.getAccount().getId(), index++),
-          sshKeyInfo.sshPublicKey));
+      authorizedKeys.addKey(a.getAccount().getId(), sshKeyInfo.sshPublicKey);
     }
-    return result;
   }
 
   private Account.Id createLocalUser(AccountInfo acc)
-      throws OrmException, RestApiException {
+      throws OrmException, RestApiException, IOException, ConfigInvalidException {
     CreateAccount.Input input = new CreateAccount.Input();
     log.info(String.format("User '%s' not found", acc.username));
     String username = acc.username;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
index 31d6014..05c869b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/AddApprovalsStep.java
@@ -17,6 +17,7 @@
 import com.google.common.base.MoreObjects;
 import com.google.gerrit.common.TimeUtil;
 import com.google.gerrit.common.data.LabelType;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.common.AccountInfo;
 import com.google.gerrit.extensions.common.ApprovalInfo;
@@ -35,6 +36,7 @@
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -80,8 +82,9 @@
     this.resume = resume;
   }
 
-  void add(GerritApi api) throws OrmException, NoSuchChangeException, IOException,
-      NoSuchAccountException, RestApiException{
+  void add(GerritApi api) throws OrmException, NoSuchChangeException,
+      IOException, NoSuchAccountException, RestApiException,
+      ConfigInvalidException, InvalidSshKeyException {
     if (resume) {
       db.patchSetApprovals().delete(
           db.patchSetApprovals().byChange(change.getId()));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java
index 6598f30..87456a2 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/CopyProject.java
@@ -15,6 +15,7 @@
 package com.googlesource.gerrit.plugins.importer;
 
 import com.google.common.base.Strings;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.annotations.RequiresCapability;
@@ -38,6 +39,7 @@
 import com.googlesource.gerrit.plugins.importer.CopyProject.Input;
 
 import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 import java.io.IOException;
 import java.io.PrintWriter;
@@ -71,7 +73,7 @@
   public ImportStatistic apply(ProjectResource rsrc, Input input)
       throws RestApiException, OrmException, IOException, ValidationException,
       GitAPIException, NoSuchChangeException, NoSuchAccountException,
-      UpdateException {
+      UpdateException, ConfigInvalidException, InvalidSshKeyException {
     if (Strings.isNullOrEmpty(input.name)) {
       throw new BadRequestException("name is required");
     }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java b/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java
index 1352f61..40b321b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/GerritApi.java
@@ -24,6 +24,8 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
 import java.io.IOException;
 import java.util.List;
 import java.util.regex.Matcher;
@@ -72,7 +74,7 @@
       throws BadRequestException, IOException, OrmException;
 
   public List<SshKeyInfo> getSshKeys(String userId) throws BadRequestException,
-      IOException, OrmException;
+      IOException, OrmException, ConfigInvalidException;
 
   public Version getVersion() throws BadRequestException, IOException;
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/GroupCommand.java b/src/main/java/com/googlesource/gerrit/plugins/importer/GroupCommand.java
index b78913e..ffe1d57 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/GroupCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/GroupCommand.java
@@ -17,6 +17,7 @@
 import static java.nio.charset.StandardCharsets.UTF_8;
 
 import com.google.common.base.Strings;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.annotations.RequiresCapability;
 import com.google.gerrit.extensions.restapi.RestApiException;
@@ -27,6 +28,7 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
 
@@ -66,7 +68,7 @@
 
   @Override
   protected void run() throws UnloggedFailure, OrmException, IOException,
-      NoSuchAccountException {
+      NoSuchAccountException, ConfigInvalidException, InvalidSshKeyException {
     ImportGroup.Input input = new ImportGroup.Input();
     input.from = url;
     input.user = user;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
index 7825d97..24ee5f9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroup.java
@@ -16,6 +16,7 @@
 
 import static com.google.gerrit.reviewdb.client.AccountGroup.isInternalGroup;
 
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.annotations.RequiresCapability;
 import com.google.gerrit.extensions.common.AccountInfo;
@@ -49,6 +50,7 @@
 
 import com.googlesource.gerrit.plugins.importer.ImportGroup.Input;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Config;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -115,7 +117,7 @@
   @Override
   public Response<String> apply(ConfigResource rsrc, Input input)
       throws NoSuchAccountException, OrmException, IOException,
-      RestApiException {
+      RestApiException, ConfigInvalidException, InvalidSshKeyException {
     GroupInfo groupInfo;
     this.api = apiFactory.create(input.from, input.user, input.pass);
     groupInfo = api.getGroup(group.get());
@@ -127,7 +129,7 @@
 
   private void validate(Input input, GroupInfo groupInfo)
       throws IOException, OrmException, NoSuchAccountException,
-      RestApiException {
+      RestApiException, ConfigInvalidException, InvalidSshKeyException {
     if (!isInternalGroup(new AccountGroup.UUID(groupInfo.id))) {
       throw new MethodNotAllowedException(String.format(
           "Group with name %s is not an internal group and cannot be imported",
@@ -182,7 +184,8 @@
   }
 
   private CreateGroupArgs toCreateGroupArgs(GroupInfo groupInfo)
-      throws IOException, OrmException, NoSuchAccountException, RestApiException {
+      throws IOException, OrmException, NoSuchAccountException,
+      RestApiException, ConfigInvalidException, InvalidSshKeyException {
     CreateGroupArgs args = new CreateGroupArgs();
     args.setGroupName(groupInfo.name);
     args.groupDescription = groupInfo.description;
@@ -198,8 +201,9 @@
     return args;
   }
 
-  private AccountGroup createGroup(Input input, GroupInfo info) throws OrmException,
-      NoSuchAccountException, IOException, RestApiException {
+  private AccountGroup createGroup(Input input, GroupInfo info)
+      throws OrmException, NoSuchAccountException, IOException,
+      RestApiException, ConfigInvalidException, InvalidSshKeyException {
     String uniqueName = getUniqueGroupName(info.name);
     if (!info.name.equals(uniqueName)) {
       log.warn(String.format("Group %s with UUID %s is imported with name %s",
@@ -277,7 +281,8 @@
   }
 
   private void addMembers(AccountGroup.Id groupId, List<AccountInfo> members)
-      throws OrmException, NoSuchAccountException, IOException, RestApiException {
+      throws OrmException, NoSuchAccountException, IOException,
+      RestApiException, ConfigInvalidException, InvalidSshKeyException {
     List<AccountGroupMember> memberships = new ArrayList<>();
     for (AccountInfo member : members) {
       Account.Id userId = accountUtil.resolveUser(api, member);
@@ -292,10 +297,10 @@
     }
   }
 
-  private void addGroups(Input input, AccountGroup.Id groupId,
-      String groupName, List<GroupInfo> includedGroups)
-      throws NoSuchAccountException, OrmException,
-      IOException, RestApiException {
+  private void addGroups(Input input, AccountGroup.Id groupId, String groupName,
+      List<GroupInfo> includedGroups)
+          throws NoSuchAccountException, OrmException, IOException,
+          RestApiException, ConfigInvalidException, InvalidSshKeyException {
     List<AccountGroupById> includeList = new ArrayList<>();
     for (GroupInfo includedGroup : includedGroups) {
       if (isInternalGroup(new AccountGroup.UUID(includedGroup.id))) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
index bae0813..0e9fece 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportGroupsStep.java
@@ -16,6 +16,7 @@
 
 import static com.google.gerrit.reviewdb.client.AccountGroup.isInternalGroup;
 
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.restapi.MethodNotAllowedException;
 import com.google.gerrit.extensions.restapi.ResourceConflictException;
@@ -30,6 +31,7 @@
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.ProgressMonitor;
 
 import java.io.IOException;
@@ -76,7 +78,7 @@
   }
 
   void importGroups() throws NoSuchAccountException, OrmException, IOException,
-      RestApiException {
+      RestApiException, ConfigInvalidException, InvalidSshKeyException {
     ProjectConfig projectConfig = projectCache.get(project).getConfig();
     Set<AccountGroup.UUID> groupUUIDs = projectConfig.getAllGroupUUIDs();
     pm.beginTask("Import Groups", groupUUIDs.size());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
index 0e7d44a..5d8931d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ImportProject.java
@@ -18,6 +18,7 @@
 import static java.lang.String.format;
 
 import com.google.common.base.Strings;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.annotations.RequiresCapability;
 import com.google.gerrit.extensions.restapi.BadRequestException;
@@ -42,6 +43,7 @@
 import com.googlesource.gerrit.plugins.importer.ImportProject.Input;
 
 import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.internal.storage.file.LockFile;
 import org.eclipse.jgit.lib.NullProgressMonitor;
 import org.eclipse.jgit.lib.ProgressMonitor;
@@ -165,7 +167,7 @@
   public ImportStatistic apply(ConfigResource rsrc, Input input)
       throws RestApiException, OrmException, IOException, ValidationException,
       GitAPIException, NoSuchChangeException, NoSuchAccountException,
-      UpdateException {
+      UpdateException, ConfigInvalidException, InvalidSshKeyException {
     if (input == null) {
       input = new Input();
     }
@@ -181,7 +183,7 @@
   public ResumeImportStatistic resume(String user, String pass, boolean force,
       File importStatus) throws RestApiException, OrmException, IOException,
       GitAPIException, NoSuchChangeException, NoSuchAccountException,
-      UpdateException {
+      UpdateException, ConfigInvalidException, InvalidSshKeyException {
     LockFile lockFile = lockForImport();
     try {
       ImportProjectInfo info = ImportJson.parse(importStatus);
@@ -204,7 +206,8 @@
   private ResumeImportStatistic apply(LockFile lockFile, Input input,
       ImportProjectInfo info) throws RestApiException, OrmException,
       IOException, GitAPIException, NoSuchChangeException,
-      NoSuchAccountException, UpdateException {
+      NoSuchAccountException, UpdateException, ConfigInvalidException,
+      InvalidSshKeyException {
     boolean resume = info != null;
     api = apiFactory.create(input.from, input.user, input.pass);
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java b/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java
index d02c46c..a5dd841 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/LocalApi.java
@@ -34,6 +34,8 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
 import java.io.IOException;
 import java.util.List;
 import java.util.Map;
@@ -120,7 +122,7 @@
 
   @Override
   public List<SshKeyInfo> getSshKeys(String userId) throws BadRequestException,
-      IOException, OrmException {
+      IOException, OrmException, ConfigInvalidException {
     try {
       AccountResource rsrc =
           accounts.parse(TopLevelResource.INSTANCE,
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java
index f31e160..48e0212 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ProjectCommand.java
@@ -15,6 +15,7 @@
 package com.googlesource.gerrit.plugins.importer;
 
 import com.google.common.base.Strings;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.annotations.RequiresCapability;
 import com.google.gerrit.extensions.restapi.RestApiException;
@@ -29,6 +30,7 @@
 import com.google.inject.Inject;
 
 import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.kohsuke.args4j.Argument;
 import org.kohsuke.args4j.Option;
 
@@ -69,9 +71,10 @@
   private ImportProject.Factory importProjectFactory;
 
   @Override
-  protected void run() throws OrmException, IOException, UnloggedFailure,
-      ValidationException, GitAPIException, NoSuchChangeException,
-      NoSuchAccountException, UpdateException {
+  protected void run()
+      throws OrmException, IOException, UnloggedFailure, ValidationException,
+      GitAPIException, NoSuchChangeException, NoSuchAccountException,
+      UpdateException, ConfigInvalidException, InvalidSshKeyException {
     ImportProject.Input input = new ImportProject.Input();
     input.from = url;
     input.name = name;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
index 788f83b..dcb0a66 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayChangesStep.java
@@ -17,6 +17,7 @@
 import com.google.common.collect.Iterators;
 import com.google.gerrit.common.Nullable;
 import com.google.gerrit.common.data.GlobalCapability;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.client.ChangeStatus;
 import com.google.gerrit.extensions.common.ChangeInfo;
@@ -37,6 +38,7 @@
 import com.google.inject.Provider;
 import com.google.inject.assistedinject.Assisted;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ProgressMonitor;
 import org.eclipse.jgit.lib.Repository;
@@ -132,7 +134,7 @@
 
   void replay() throws IOException, OrmException,
       NoSuchAccountException, NoSuchChangeException, RestApiException,
-      UpdateException {
+      UpdateException, ConfigInvalidException, InvalidSshKeyException {
     int start = 0;
     int limit = GlobalCapability.DEFAULT_MAX_QUERY_LIMIT;
     pm.beginTask("Replay Changes", ProgressMonitor.UNKNOWN);
@@ -166,7 +168,8 @@
 
   private void replayChange(RevWalk rw, ChangeInfo c)
       throws IOException, OrmException, NoSuchAccountException,
-      NoSuchChangeException, RestApiException, IllegalArgumentException, UpdateException {
+      NoSuchChangeException, RestApiException, IllegalArgumentException,
+      UpdateException, ConfigInvalidException, InvalidSshKeyException {
     if (c.status == ChangeStatus.DRAFT) {
       // no import of draft changes
       return;
@@ -222,8 +225,9 @@
     }
   }
 
-  private Change createChange(ChangeInfo c) throws OrmException,
-      NoSuchAccountException, IOException, RestApiException {
+  private Change createChange(ChangeInfo c)
+      throws OrmException, NoSuchAccountException, IOException,
+      RestApiException, ConfigInvalidException, InvalidSshKeyException {
     Change.Id changeId = new Change.Id(sequences.nextChangeId());
 
     Change change =
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java
index 0015cc0..49f969c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayInlineCommentsStep.java
@@ -21,6 +21,7 @@
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 import com.google.gerrit.common.TimeUtil;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.client.Side;
 import com.google.gerrit.extensions.common.ChangeInfo;
@@ -44,6 +45,7 @@
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -102,8 +104,9 @@
     this.resume = resume;
   }
 
-  void replay() throws RestApiException, OrmException, IOException,
-      NoSuchChangeException, NoSuchAccountException {
+  void replay()
+      throws RestApiException, OrmException, IOException, NoSuchChangeException,
+      NoSuchAccountException, ConfigInvalidException, InvalidSshKeyException {
     for (PatchSet ps : db.patchSets().byChange(change.getId())) {
       Iterable<CommentInfo> comments = api.getComments(
           changeInfo._number, ps.getRevision().get());
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
index e5a8975..dfdf892 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayMessagesStep.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.importer;
 
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.ChangeMessageInfo;
@@ -32,6 +33,8 @@
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
+
 import java.io.IOException;
 import java.sql.Timestamp;
 import java.util.Collections;
@@ -74,8 +77,9 @@
     this.resume = resume;
   }
 
-  void replay(GerritApi api) throws NoSuchAccountException, NoSuchChangeException,
-      OrmException, IOException, RestApiException {
+  void replay(GerritApi api) throws NoSuchAccountException,
+      NoSuchChangeException, OrmException, IOException, RestApiException,
+      ConfigInvalidException, InvalidSshKeyException {
     for (ChangeMessageInfo msg : changeInfo.messages) {
       ChangeMessage.Key msgKey = new ChangeMessage.Key(change.getId(), msg.id);
       if (resume && db.changeMessages().get(msgKey) != null) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
index 20559b6..e5cd3dc 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ReplayRevisionsStep.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.importer;
 
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.common.ChangeInfo;
 import com.google.gerrit.extensions.common.RevisionInfo;
@@ -28,6 +29,7 @@
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 
+import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.RefUpdate;
@@ -78,8 +80,9 @@
     this.changeInfo = changeInfo;
   }
 
-  void replay(GerritApi api) throws IOException, OrmException,
-      NoSuchAccountException, RestApiException {
+  void replay(GerritApi api)
+      throws IOException, OrmException, NoSuchAccountException,
+      RestApiException, ConfigInvalidException, InvalidSshKeyException {
     List<RevisionInfo> revisions = new ArrayList<>(changeInfo.revisions.values());
     sortRevisionInfoByNumber(revisions);
     List<PatchSet> patchSets = new ArrayList<>();
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java
index e040133..748bf4c 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeCopyProject.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.importer;
 
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.annotations.RequiresCapability;
@@ -38,6 +39,7 @@
 import com.googlesource.gerrit.plugins.importer.ResumeCopyProject.Input;
 
 import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 import java.io.IOException;
 import java.io.Writer;
@@ -80,7 +82,7 @@
   public ResumeImportStatistic apply(ProjectResource rsrc, Input input)
       throws RestApiException, IOException, OrmException, ValidationException,
       GitAPIException, NoSuchChangeException, NoSuchAccountException,
-      UpdateException {
+      UpdateException, ConfigInvalidException, InvalidSshKeyException {
     ImportProjectResource projectResource =
         projectsCollection.parse(new ConfigResource(),
             IdString.fromDecoded(rsrc.getName()));
diff --git a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java
index b5793b5..881b6ff 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/importer/ResumeProjectImport.java
@@ -15,6 +15,7 @@
 package com.googlesource.gerrit.plugins.importer;
 
 import com.google.common.base.Strings;
+import com.google.gerrit.common.errors.InvalidSshKeyException;
 import com.google.gerrit.common.errors.NoSuchAccountException;
 import com.google.gerrit.extensions.annotations.PluginName;
 import com.google.gerrit.extensions.annotations.RequiresCapability;
@@ -38,6 +39,7 @@
 import com.googlesource.gerrit.plugins.importer.ResumeProjectImport.Input;
 
 import org.eclipse.jgit.api.errors.GitAPIException;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 import java.io.IOException;
 import java.io.Writer;
@@ -94,7 +96,7 @@
   public ResumeImportStatistic apply(ImportProjectResource rsrc, Input input)
       throws RestApiException, IOException, OrmException, ValidationException,
       GitAPIException, NoSuchChangeException, NoSuchAccountException,
-      UpdateException {
+      UpdateException, ConfigInvalidException, InvalidSshKeyException {
     if (copy) {
       input.validateResumeCopy();
     } else {
@@ -129,9 +131,9 @@
 
     @Override
     public ResumeImportStatistic apply(ProjectResource rsrc, Input input)
-        throws RestApiException, IOException, OrmException,
-        ValidationException, GitAPIException, NoSuchChangeException,
-        NoSuchAccountException, UpdateException {
+        throws RestApiException, IOException, OrmException, ValidationException,
+        GitAPIException, NoSuchChangeException, NoSuchAccountException,
+        UpdateException, ConfigInvalidException, InvalidSshKeyException {
       ImportProjectResource projectResource =
           projectsCollection.parse(new ConfigResource(),
               IdString.fromDecoded(rsrc.getName()));