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)); + } }