Allow configuring Zookeeper authentication
This change enables authentication when the plugin connects to
Zookeeper cluster.
Bug: Issue 340582184
Change-Id: I4f15a73dbdfbe87b6e887d64e702755260e15f05
diff --git a/src/main/java/com/googlesource/gerrit/plugins/validation/dfsrefdb/zookeeper/ZookeeperConfig.java b/src/main/java/com/googlesource/gerrit/plugins/validation/dfsrefdb/zookeeper/ZookeeperConfig.java
index aa62862..b6abb40 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/validation/dfsrefdb/zookeeper/ZookeeperConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/validation/dfsrefdb/zookeeper/ZookeeperConfig.java
@@ -20,12 +20,16 @@
import com.google.gerrit.extensions.annotations.PluginName;
import com.google.gerrit.server.config.PluginConfigFactory;
import com.google.inject.Inject;
+import java.util.List;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.framework.api.ACLProvider;
import org.apache.curator.retry.BoundedExponentialBackoffRetry;
+import org.apache.zookeeper.ZooDefs;
+import org.apache.zookeeper.data.ACL;
import org.eclipse.jgit.lib.Config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -52,6 +56,8 @@
public static final String SUBSECTION = "zookeeper";
public static final String KEY_CONNECT_STRING = "connectString";
+ public static final String KEY_USERNAME = "username";
+ public static final String KEY_PASSWORD = "password";
public static final String KEY_SESSION_TIMEOUT_MS = "sessionTimeoutMs";
public static final String KEY_CONNECTION_TIMEOUT_MS = "connectionTimeoutMs";
public static final String KEY_RETRY_POLICY_BASE_SLEEP_TIME_MS = "retryPolicyBaseSleepTimeMs";
@@ -69,8 +75,9 @@
public final String KEY_CAS_RETRY_POLICY_MAX_SLEEP_TIME_MS = "casRetryPolicyMaxSleepTimeMs";
public final String KEY_CAS_RETRY_POLICY_MAX_RETRIES = "casRetryPolicyMaxRetries";
public final String TRANSACTION_LOCK_TIMEOUT_KEY = "transactionLockTimeoutMs";
-
private final String connectionString;
+ private Optional<String> zkUsername;
+ private Optional<String> zkPassword;
private final String root;
private final int sessionTimeoutMs;
private final int connectionTimeoutMs;
@@ -100,6 +107,8 @@
public ZookeeperConfig(Config zkConfig) {
connectionString =
getString(zkConfig, SECTION, SUBSECTION, KEY_CONNECT_STRING, DEFAULT_ZK_CONNECT);
+ zkUsername = getOptionalString(zkConfig, SECTION, SUBSECTION, KEY_USERNAME);
+ zkPassword = getOptionalString(zkConfig, SECTION, SUBSECTION, KEY_PASSWORD);
root = getString(zkConfig, SECTION, SUBSECTION, KEY_ROOT_NODE, "gerrit/multi-site");
sessionTimeoutMs =
getInt(zkConfig, SECTION, SUBSECTION, KEY_SESSION_TIMEOUT_MS, defaultSessionTimeoutMs);
@@ -200,21 +209,45 @@
}
if (build == null) {
- this.build =
+ CuratorFrameworkFactory.Builder builder =
CuratorFrameworkFactory.builder()
.connectString(connectionString)
.sessionTimeoutMs(sessionTimeoutMs)
.connectionTimeoutMs(connectionTimeoutMs)
.retryPolicy(
new BoundedExponentialBackoffRetry(baseSleepTimeMs, maxSleepTimeMs, maxRetries))
- .namespace(root)
- .build();
+ .namespace(root);
+ if (zkUsername.isPresent() != zkPassword.isPresent()) {
+ throw new IllegalArgumentException(
+ "Only one between password or username for Zookeeper was set, please set both to successfully authenticate");
+ } else {
+ zkUsername
+ .flatMap(usr -> zkPassword.map(pwd -> usr + ":" + pwd))
+ .ifPresent(auth -> configureAuth(builder, auth));
+ }
+ this.build = builder.build();
this.build.start();
}
-
return this.build;
}
+ private void configureAuth(CuratorFrameworkFactory.Builder builder, String authString) {
+ builder
+ .authorization("digest", authString.getBytes())
+ .aclProvider(
+ new ACLProvider() {
+ @Override
+ public List<ACL> getDefaultAcl() {
+ return ZooDefs.Ids.CREATOR_ALL_ACL;
+ }
+
+ @Override
+ public List<ACL> getAclForPath(String path) {
+ return ZooDefs.Ids.CREATOR_ALL_ACL;
+ }
+ });
+ }
+
public Long getZkInterProcessLockTimeOut() {
return transactionLockTimeOut;
}
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 00a2468..fadf623 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -112,3 +112,11 @@
```ref-database.zookeeper.sslTrustStorePassword```
: Optional configuration for the password to the ssl trust store.
+
+```ref-database.zookeeper.username```
+: Optional, if authentication is required, configuration for the username to the zookeeper node.
+
+```ref-database.zookeeper.password```
+: Optional, if authentication is required, configuration for the password to the zookeeper node.
+
+