Allow admins to limit timeouts, retries and retry interval These new configs provide improved guardrails for admins against unreasonable values in the per-project plugin config. Change-Id: Icba6bf1d94f47ca09b992f2f5b85e39b216ba48d
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/Configuration.java index 44026fc..eb54ec2 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/Configuration.java +++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/Configuration.java
@@ -24,6 +24,10 @@ public class Configuration { public static final String THREAD_POOL_SIZE = "threadPoolSize"; public static final String ALLOWED_EVENT = "allowedEvent"; + public static final String MAX_ALLOWED_CONNECTION_TIMEOUT = "maxAllowedConnectionTimeout"; + public static final String MAX_ALLOWED_SOCKET_TIMEOUT = "maxAllowedSocketTimeout"; + public static final String MAX_ALLOWED_TRIES = "maxAllowedTries"; + public static final String MAX_ALLOWED_RETRY_INTERVAL = "maxAllowedRetryInterval"; public static final int DEFAULT_TIMEOUT_MS = 5000; public static final int DEFAULT_MAX_TRIES = 5; @@ -38,6 +42,10 @@ private final int threadPoolSize; private final boolean sslVerify; private final String[] allowedEvents; + private final int maxAllowedConnectionTimeout; + private final int maxAllowedSocketTimeout; + private final int maxAllowedTries; + private final int maxAllowedRetryInterval; @Inject protected Configuration(PluginConfigFactory config, @PluginName String pluginName) { @@ -49,6 +57,10 @@ threadPoolSize = cfg.getInt(THREAD_POOL_SIZE, DEFAULT_THREAD_POOL_SIZE); sslVerify = cfg.getBoolean(RemoteConfig.SSL_VERIFY, DEFAULT_SSL_VERIFY); allowedEvents = cfg.getStringList(ALLOWED_EVENT); + maxAllowedConnectionTimeout = cfg.getInt(MAX_ALLOWED_CONNECTION_TIMEOUT, 0); + maxAllowedSocketTimeout = cfg.getInt(MAX_ALLOWED_SOCKET_TIMEOUT, 0); + maxAllowedTries = cfg.getInt(MAX_ALLOWED_TRIES, 0); + maxAllowedRetryInterval = cfg.getInt(MAX_ALLOWED_RETRY_INTERVAL, 0); } public int getConnectionTimeout() { @@ -78,4 +90,20 @@ public String[] getAllowedEvents() { return allowedEvents; } + + public int getMaxAllowedConnectionTimeout() { + return maxAllowedConnectionTimeout; + } + + public int getMaxAllowedSocketTimeout() { + return maxAllowedSocketTimeout; + } + + public int getMaxAllowedTries() { + return maxAllowedTries; + } + + public int getMaxAllowedRetryInterval() { + return maxAllowedRetryInterval; + } }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/webhooks/RemoteConfig.java b/src/main/java/com/googlesource/gerrit/plugins/webhooks/RemoteConfig.java index 542a3a9..5b9686a 100644 --- a/src/main/java/com/googlesource/gerrit/plugins/webhooks/RemoteConfig.java +++ b/src/main/java/com/googlesource/gerrit/plugins/webhooks/RemoteConfig.java
@@ -68,19 +68,32 @@ } public int getConnectionTimeout() { - return config.getInt(REMOTE, name, CONNECTION_TIMEOUT, global.getConnectionTimeout()); + int connectionTimeout = + config.getInt(REMOTE, name, CONNECTION_TIMEOUT, global.getConnectionTimeout()); + return (global.getMaxAllowedConnectionTimeout() > 0) + ? Math.min(connectionTimeout, global.getMaxAllowedConnectionTimeout()) + : connectionTimeout; } public int getSocketTimeout() { - return config.getInt(REMOTE, name, SOCKET_TIMEOUT, global.getSocketTimeout()); + int socketTimeout = config.getInt(REMOTE, name, SOCKET_TIMEOUT, global.getSocketTimeout()); + return (global.getMaxAllowedSocketTimeout() > 0) + ? Math.min(socketTimeout, global.getMaxAllowedSocketTimeout()) + : socketTimeout; } public int getMaxTries() { - return config.getInt(REMOTE, name, MAX_TRIES, global.getMaxTries()); + int maxTries = config.getInt(REMOTE, name, MAX_TRIES, global.getMaxTries()); + return (global.getMaxAllowedTries() > 0) + ? Math.min(maxTries, global.getMaxAllowedTries()) + : maxTries; } public int getRetryInterval() { - return config.getInt(REMOTE, name, RETRY_INTERVAL, global.getRetryInterval()); + int retryInterval = config.getInt(REMOTE, name, RETRY_INTERVAL, global.getRetryInterval()); + return (global.getMaxAllowedRetryInterval() > 0) + ? Math.min(retryInterval, global.getMaxAllowedRetryInterval()) + : retryInterval; } public boolean getSslVerify() {
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md index 88f99f1..280b8e7 100644 --- a/src/main/resources/Documentation/config.md +++ b/src/main/resources/Documentation/config.md
@@ -71,6 +71,25 @@ Multiple event types can be provided. If not specified, then all event types are allowed. +@PLUGIN@.maxAllowedConnectionTimeout +: Maximum allowed value for the connection timeout. If a value greater than + this is configured in the @PLUGIN@.config, this value will be chosen + instead. + +@PLUGIN@.maxAllowedSocketTimeout +: Maximum allowed value for the socket timeout. If a value greater than + this is configured in the @PLUGIN@.config, this value will be chosen + instead. + +@PLUGIN@.maxAllowedTries +: Maximum allowed value for the retries. If a value greater than this is + configured in the @PLUGIN@.config, this value will be chosen instead. + +@PLUGIN@.maxAllowedRetryInterval +: Maximum allowed value for the retry interval. If a value greater than + this is configured in the @PLUGIN@.config, this value will be chosen + instead. + File '@PLUGIN@.config' ----------------------