diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java index 6d805525c2..3251c8d228 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticQueryAdapter.java @@ -31,8 +31,8 @@ public class ElasticQueryAdapter { ElasticQueryAdapter(ElasticVersion version) { this.ignoreUnmapped = version == ElasticVersion.V2_4; - this.usePostV5Type = isV6(version); - this.versionDiscoveryUrl = isV6(version) ? "%s*" : "%s*/_aliases"; + this.usePostV5Type = version.isV6(); + this.versionDiscoveryUrl = version.isV6() ? "%s*" : "%s*/_aliases"; switch (version) { case V5_6: @@ -55,10 +55,6 @@ public class ElasticQueryAdapter { } } - private boolean isV6(ElasticVersion version) { - return version == ElasticVersion.V6_2 || version == ElasticVersion.V6_3; - } - void setIgnoreUnmapped(JsonObject properties) { if (ignoreUnmapped) { properties.addProperty("ignore_unmapped", true); diff --git a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java index 610a2125b5..3cae77566b 100644 --- a/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java +++ b/gerrit-elasticsearch/src/main/java/com/google/gerrit/elasticsearch/ElasticVersion.java @@ -54,6 +54,10 @@ public enum ElasticVersion { return Joiner.on(", ").join(ElasticVersion.values()); } + public boolean isV6() { + return version.startsWith("6."); + } + @Override public String toString() { return version; diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java index 92b1d9576e..b85b91e90f 100644 --- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java +++ b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticContainer.java @@ -45,7 +45,7 @@ public class ElasticContainer> extends Gener case V2_4: return "elasticsearch:2.4.6-alpine"; case V5_6: - return "docker.elastic.co/elasticsearch/elasticsearch:5.6.10"; + return "docker.elastic.co/elasticsearch/elasticsearch:5.6.11"; case V6_2: return "docker.elastic.co/elasticsearch/elasticsearch-oss:6.2.4"; case V6_3: diff --git a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticVersionTest.java b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticVersionTest.java index 860dca6b24..d4e5695d0e 100644 --- a/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticVersionTest.java +++ b/gerrit-elasticsearch/src/test/java/com/google/gerrit/elasticsearch/ElasticVersionTest.java @@ -46,4 +46,11 @@ public class ElasticVersionTest { "Invalid version: [4.0.0]. Supported versions: " + ElasticVersion.supportedVersions()); ElasticVersion.forVersion("4.0.0"); } + + @Test + public void version6() throws Exception { + assertThat(ElasticVersion.V6_2.isV6()).isTrue(); + assertThat(ElasticVersion.V6_3.isV6()).isTrue(); + assertThat(ElasticVersion.V5_6.isV6()).isFalse(); + } } diff --git a/gerrit-reviewdb/BUILD b/gerrit-reviewdb/BUILD index 35c1535dad..67801447b5 100644 --- a/gerrit-reviewdb/BUILD +++ b/gerrit-reviewdb/BUILD @@ -16,6 +16,7 @@ gwt_module( visibility = ["//visibility:public"], deps = [ "//gerrit-extension-api:client", + "//lib:guava", "//lib:gwtorm-client", "//lib:gwtorm-client_src", ], diff --git a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java index b7506e5134..75e35f09c4 100644 --- a/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java +++ b/gerrit-reviewdb/src/main/java/com/google/gerrit/reviewdb/client/Account.java @@ -18,11 +18,13 @@ import static com.google.gerrit.reviewdb.client.RefNames.REFS_DRAFT_COMMENTS; import static com.google.gerrit.reviewdb.client.RefNames.REFS_STARRED_CHANGES; import static com.google.gerrit.reviewdb.client.RefNames.REFS_USERS; +import com.google.common.annotations.GwtIncompatible; import com.google.gerrit.extensions.client.DiffPreferencesInfo; import com.google.gerrit.extensions.client.GeneralPreferencesInfo; import com.google.gwtorm.client.Column; import com.google.gwtorm.client.IntKey; import java.sql.Timestamp; +import java.util.regex.Pattern; /** * Information about a single user. @@ -46,15 +48,14 @@ import java.sql.Timestamp; * */ public final class Account { - public static final String USER_NAME_PATTERN_FIRST = "[a-zA-Z0-9]"; - public static final String USER_NAME_PATTERN_REST = "[a-zA-Z0-9._@-]"; - public static final String USER_NAME_PATTERN_LAST = "[a-zA-Z0-9]"; + private static final String USER_NAME_COMMON_PATTERN = "a-zA-Z0-9"; + public static final String USER_NAME_PATTERN_FIRST = "[" + USER_NAME_COMMON_PATTERN + "]"; + public static final String USER_NAME_PATTERN_REST = "[" + USER_NAME_COMMON_PATTERN + "._@-]"; + public static final String USER_NAME_PATTERN_LAST = USER_NAME_PATTERN_FIRST; /** Regular expression that {@link #userName} must match. */ public static final String USER_NAME_PATTERN = - "^" - + // - "(" + "^(" + // USER_NAME_PATTERN_FIRST + // @@ -67,9 +68,10 @@ public final class Account { + // USER_NAME_PATTERN_FIRST + // - ")" - + // - "$"; + ")$"; + + @GwtIncompatible("Unemulated class java.util.regex.Pattern") + public static final Pattern USER_NAME_PATTERN_COMPILED = Pattern.compile(USER_NAME_PATTERN); /** Key local to Gerrit to identify a user. */ public static class Id extends IntKey> { diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java index a1cca06967..745aebf087 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/AccountResolver.java @@ -14,6 +14,7 @@ package com.google.gerrit.server.account; +import static com.google.gerrit.reviewdb.client.Account.USER_NAME_PATTERN_COMPILED; import static java.util.stream.Collectors.toSet; import com.google.gerrit.reviewdb.client.Account; @@ -109,7 +110,7 @@ public class AccountResolver { return Collections.emptySet(); } - if (nameOrEmail.matches(Account.USER_NAME_PATTERN)) { + if (USER_NAME_PATTERN_COMPILED.matcher(nameOrEmail).matches()) { AccountState who = byId.getByUsername(nameOrEmail); if (who != null) { return Collections.singleton(who.getAccount().getId()); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java index 5b7aeadc8b..7e4c856792 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/ChangeUserName.java @@ -14,11 +14,11 @@ package com.google.gerrit.server.account; +import static com.google.gerrit.reviewdb.client.Account.USER_NAME_PATTERN_COMPILED; import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_USERNAME; import com.google.gerrit.common.Nullable; import com.google.gerrit.common.errors.NameAlreadyUsedException; -import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.IdentifiedUser; import com.google.gerrit.server.account.externalids.ExternalId; import com.google.gerrit.server.account.externalids.ExternalIds; @@ -32,7 +32,6 @@ import com.google.inject.assistedinject.Assisted; import java.io.IOException; import java.util.Collection; import java.util.concurrent.Callable; -import java.util.regex.Pattern; import org.eclipse.jgit.errors.ConfigInvalidException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,7 +39,6 @@ import org.slf4j.LoggerFactory; /** Operation to change the username of an account. */ public class ChangeUserName implements Callable { private static final Logger log = LoggerFactory.getLogger(ChangeUserName.class); - private static final Pattern USER_NAME_PATTERN = Pattern.compile(Account.USER_NAME_PATTERN); public static final String USERNAME_CANNOT_BE_CHANGED = "Username cannot be changed."; @@ -84,7 +82,7 @@ public class ChangeUserName implements Callable { ExternalIdsUpdate externalIdsUpdate = externalIdsUpdateFactory.create(); if (newUsername != null && !newUsername.isEmpty()) { - if (!USER_NAME_PATTERN.matcher(newUsername).matches()) { + if (!USER_NAME_PATTERN_COMPILED.matcher(newUsername).matches()) { throw new InvalidUserNameException(); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java index 11b7bd8a19..6447331bd8 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/CreateAccount.java @@ -14,6 +14,8 @@ package com.google.gerrit.server.account; +import static com.google.gerrit.reviewdb.client.Account.USER_NAME_PATTERN; +import static com.google.gerrit.reviewdb.client.Account.USER_NAME_PATTERN_COMPILED; import static com.google.gerrit.server.account.externalids.ExternalId.SCHEME_MAILTO; import com.google.gerrit.common.Nullable; @@ -120,9 +122,9 @@ public class CreateAccount implements RestModifyView groups = parseGroups(input.groups); diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/account/InvalidUserNameException.java b/gerrit-server/src/main/java/com/google/gerrit/server/account/InvalidUserNameException.java index d60b7af85f..cf7a9b8df9 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/account/InvalidUserNameException.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/account/InvalidUserNameException.java @@ -16,7 +16,10 @@ package com.google.gerrit.server.account; import com.google.gerrit.reviewdb.client.Account; -/** Error indicating the SSH user name does not match {@link Account#USER_NAME_PATTERN} pattern. */ +/** + * Error indicating the SSH user name does not match {@link Account#USER_NAME_PATTERN_COMPILED} + * pattern. + */ public class InvalidUserNameException extends Exception { private static final long serialVersionUID = 1L; diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java index 988b9df779..7b4d77e272 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/args4j/AccountIdHandler.java @@ -14,6 +14,8 @@ package com.google.gerrit.server.args4j; +import static com.google.gerrit.reviewdb.client.Account.USER_NAME_PATTERN_COMPILED; + import com.google.gerrit.extensions.client.AuthType; import com.google.gerrit.reviewdb.client.Account; import com.google.gerrit.server.account.AccountException; @@ -90,7 +92,7 @@ public class AccountIdHandler extends OptionHandler { } private Account.Id createAccountByLdap(String user) throws CmdLineException, IOException { - if (!user.matches(Account.USER_NAME_PATTERN)) { + if (!USER_NAME_PATTERN_COMPILED.matcher(user).matches()) { throw new CmdLineException(owner, "user \"" + user + "\" not found"); } diff --git a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java index b6bcb3b2fa..77e9552481 100644 --- a/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java +++ b/gerrit-server/src/main/java/com/google/gerrit/server/group/AddMembers.java @@ -14,6 +14,8 @@ package com.google.gerrit.server.group; +import static com.google.gerrit.reviewdb.client.Account.USER_NAME_PATTERN_COMPILED; + import com.google.common.base.Strings; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; @@ -181,7 +183,7 @@ public class AddMembers implements RestModifyView { } private Account createAccountByLdap(String user) throws IOException { - if (!user.matches(Account.USER_NAME_PATTERN)) { + if (!USER_NAME_PATTERN_COMPILED.matcher(user).matches()) { return null; }