Filter out partial name matches in OWNERS file
Make sure that the result of the account ids resolved from
the OWNERS file lookup does not include any partial matches.
Change-Id: Ic0dfe6f269ea4a60bb82efb3145495b730bfc327
diff --git a/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java b/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
index 67e7888..c5a5989 100644
--- a/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
+++ b/owners-common/src/main/java/com/vmware/gerrit/owners/common/AccountsImpl.java
@@ -14,28 +14,34 @@
package com.vmware.gerrit.owners.common;
-import java.util.Collections;
-import java.util.Set;
+import com.google.gerrit.reviewdb.client.Account;
+import com.google.gerrit.reviewdb.client.Account.Id;
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.account.AccountCache;
+import com.google.gerrit.server.account.AccountResolver;
+import com.google.gerrit.server.account.AccountState;
+import com.google.gwtorm.server.OrmException;
+import com.google.inject.Inject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import com.google.gerrit.reviewdb.client.Account;
-import com.google.gerrit.reviewdb.client.Account.Id;
-import com.google.gerrit.reviewdb.server.ReviewDb;
-import com.google.gerrit.server.account.AccountResolver;
-import com.google.gwtorm.server.OrmException;
-import com.google.inject.Inject;
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
public class AccountsImpl implements Accounts {
private static final Logger log = LoggerFactory.getLogger(AccountsImpl.class);
private ReviewDb db;
private AccountResolver resolver;
+ private final AccountCache byId;
@Inject
- public AccountsImpl(AccountResolver resolver, ReviewDb db) {
+ public AccountsImpl(AccountResolver resolver, AccountCache byId,
+ ReviewDb db) {
this.resolver = resolver;
+ this.byId = byId;
this.db = db;
}
@@ -43,7 +49,9 @@
public Set<Account.Id> find(String nameOrEmail) {
Set<Id> accountIds = Collections.emptySet();
try {
- accountIds = resolver.findAll(db, nameOrEmail);
+ accountIds = resolver.findAll(db, nameOrEmail).stream()
+ .filter(id -> isFullMatch(id, nameOrEmail))
+ .collect(Collectors.toSet());
} catch (OrmException e) {
log.error("Error trying to resolve user " + nameOrEmail, e);
}
@@ -52,4 +60,12 @@
}
return accountIds;
}
+
+ private boolean isFullMatch(Account.Id id, String nameOrEmail) {
+ AccountState account = byId.get(id);
+ return account.getAccount().getFullName().trim()
+ .equalsIgnoreCase(nameOrEmail)
+ || account.getExternalIds().stream().anyMatch(extId -> extId
+ .getSchemeRest().trim().equalsIgnoreCase(nameOrEmail));
+ }
}