Prevent NPE for corrupt accounts
If an account is encountered where the external IDs exist but not
the actual account entry, a NPE would result. Instead, prevent
the NPE and throw an UnloggedFailure, and also guard the DB access
from leaking resources with a try/finally.
Change-Id: Id6416bb6f365d6eaf552e3b7cf108e13cc69154b
diff --git a/src/main/java/com/googlesource/gerrit/plugins/adminconsole/ShowAccountCommand.java b/src/main/java/com/googlesource/gerrit/plugins/adminconsole/ShowAccountCommand.java
index 2d7bd75..5561707 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/adminconsole/ShowAccountCommand.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/adminconsole/ShowAccountCommand.java
@@ -102,6 +102,9 @@
for (Id id : idList) {
account = accountResolver.find(id.toString());
+ if (account == null) {
+ throw new UnloggedFailure("Account " + id.toString() + " does not exist.");
+ }
stdout.println("Full name: " + account.getFullName());
stdout.println("Account Id: " + id.toString());
stdout.println("Preferred Email: " + account.getPreferredEmail());
@@ -111,36 +114,38 @@
final ReviewDb db = schema.open();
- stdout.println("");
- stdout.println("External Ids:");
- stdout.println(String
- .format("%-50s %s", "Email Address:", "External Id:"));
- for (AccountExternalId accountExternalId : db.accountExternalIds()
- .byAccount(account.getId())) {
- stdout.println(String.format("%-50s %s",
- (accountExternalId.getEmailAddress() == null ? ""
- : accountExternalId.getEmailAddress()), accountExternalId
- .getExternalId()));
- }
-
- if (showKeys) {
+ try {
stdout.println("");
- stdout.println("Public Keys:");
- List<AccountSshKey> sshKeys =
- db.accountSshKeys().byAccount(account.getId()).toList();
- if (sshKeys == null || sshKeys.isEmpty()) {
- stdout.println("None");
- } else {
- stdout.println(String.format("%-9s %s", "Status:", "Key:"));
- for (AccountSshKey sshKey : sshKeys) {
- stdout.println(String.format("%-9s %s", (sshKey.isValid()
- ? "Active" : "Inactive"), sshKey.getSshPublicKey()));
+ stdout.println("External Ids:");
+ stdout.println(String
+ .format("%-50s %s", "Email Address:", "External Id:"));
+ for (AccountExternalId accountExternalId : db.accountExternalIds()
+ .byAccount(account.getId())) {
+ stdout.println(String.format("%-50s %s",
+ (accountExternalId.getEmailAddress() == null ? ""
+ : accountExternalId.getEmailAddress()), accountExternalId
+ .getExternalId()));
+ }
+
+ if (showKeys) {
+ stdout.println("");
+ stdout.println("Public Keys:");
+ List<AccountSshKey> sshKeys =
+ db.accountSshKeys().byAccount(account.getId()).toList();
+ if (sshKeys == null || sshKeys.isEmpty()) {
+ stdout.println("None");
+ } else {
+ stdout.println(String.format("%-9s %s", "Status:", "Key:"));
+ for (AccountSshKey sshKey : sshKeys) {
+ stdout.println(String.format("%-9s %s", (sshKey.isValid()
+ ? "Active" : "Inactive"), sshKey.getSshPublicKey()));
+ }
}
}
+ } finally {
+ db.close();
}
- db.close();
-
if (showGroups) {
stdout.println();
stdout.println("Member of groups"