Move auth-headers set creation out of the SamlWebFilter

Define an annotated binding in the Module that provides injection of the
@AuthHeaders Set<String>.

Change-Id: I928a793479b4c65265f911f84b3bdea8b2d9694f
diff --git a/src/main/java/com/googlesource/gerrit/plugins/saml/AuthHeaders.java b/src/main/java/com/googlesource/gerrit/plugins/saml/AuthHeaders.java
new file mode 100644
index 0000000..e4e6848
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/saml/AuthHeaders.java
@@ -0,0 +1,24 @@
+// Copyright (C) 2024 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.googlesource.gerrit.plugins.saml;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import com.google.inject.BindingAnnotation;
+import java.lang.annotation.Retention;
+
+@Retention(RUNTIME)
+@BindingAnnotation
+public @interface AuthHeaders {}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/saml/Module.java b/src/main/java/com/googlesource/gerrit/plugins/saml/Module.java
index 4e43958..f39daad 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/saml/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/saml/Module.java
@@ -14,7 +14,14 @@
 
 package com.googlesource.gerrit.plugins.saml;
 
+import com.google.common.collect.Sets;
+import com.google.gerrit.server.config.AuthConfig;
 import com.google.inject.AbstractModule;
+import com.google.inject.Provides;
+import com.google.inject.ProvisionException;
+import com.google.inject.Singleton;
+import java.util.HashSet;
+import java.util.Set;
 import org.pac4j.saml.client.SAML2Client;
 
 public class Module extends AbstractModule {
@@ -22,4 +29,27 @@
   protected void configure() {
     bind(SAML2Client.class).toProvider(SamlClientProvider.class);
   }
+
+  @Provides
+  @Singleton
+  @AuthHeaders
+  public Set<String> getAuthHeaders(AuthConfig auth) {
+    HashSet<String> authHeaders =
+        Sets.newHashSet(
+            auth.getLoginHttpHeader().toUpperCase(),
+            auth.getHttpEmailHeader().toUpperCase(),
+            auth.getHttpExternalIdHeader().toUpperCase());
+
+    if (authHeaders.contains("") || authHeaders.contains(null)) {
+      throw new ProvisionException("All authentication headers must be set.");
+    }
+
+    if (authHeaders.size() != 3) {
+      throw new ProvisionException(
+          "Unique values for httpUserNameHeader, "
+              + "httpEmailHeader and httpExternalIdHeader are required.");
+    }
+
+    return authHeaders;
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/saml/SamlWebFilter.java b/src/main/java/com/googlesource/gerrit/plugins/saml/SamlWebFilter.java
index ecc1de5..aca8a40 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/saml/SamlWebFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/saml/SamlWebFilter.java
@@ -16,7 +16,6 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Iterators;
-import com.google.common.collect.Sets;
 import com.google.gerrit.entities.Account;
 import com.google.gerrit.extensions.api.GerritApi;
 import com.google.gerrit.extensions.api.accounts.Accounts;
@@ -35,6 +34,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Objects;
+import java.util.Set;
 import javax.servlet.Filter;
 import javax.servlet.FilterChain;
 import javax.servlet.FilterConfig;
@@ -69,7 +69,7 @@
   private final SAML2Client saml2Client;
   private final SamlConfig samlConfig;
   private final AuthConfig auth;
-  private final HashSet<String> authHeaders;
+  private final Set<String> authHeaders;
   private final SamlMembership samlMembership;
   private final GerritApi gApi;
   private final Accounts accounts;
@@ -80,6 +80,7 @@
       AuthConfig auth,
       SamlConfig samlConfig,
       SamlMembership samlMembership,
+      @AuthHeaders Set<String> authHeaders,
       GerritApi gApi,
       Accounts accounts,
       SAML2Client saml2Client,
@@ -89,21 +90,7 @@
     this.samlMembership = samlMembership;
     log.debug("Max Authentication Lifetime: " + samlConfig.getMaxAuthLifetimeAttr());
     this.saml2Client = saml2Client;
-
-    this.authHeaders =
-        Sets.newHashSet(
-            auth.getLoginHttpHeader().toUpperCase(),
-            auth.getHttpEmailHeader().toUpperCase(),
-            auth.getHttpExternalIdHeader().toUpperCase());
-    if (authHeaders.contains("") || authHeaders.contains(null)) {
-      throw new RuntimeException("All authentication headers must be set.");
-    }
-    if (authHeaders.size() != 3) {
-      throw new RuntimeException(
-          "Unique values for httpUserNameHeader, "
-              + "httpEmailHeader and httpExternalIdHeader are required.");
-    }
-
+    this.authHeaders = authHeaders;
     this.gApi = gApi;
     this.accounts = accounts;
     this.oneOffRequestContext = oneOffRequestContext;
diff --git a/src/test/java/com/googlesource/gerrit/plugins/saml/SamlWebFilterIT.java b/src/test/java/com/googlesource/gerrit/plugins/saml/SamlWebFilterIT.java
index 9ef428d..9442c3a 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/saml/SamlWebFilterIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/saml/SamlWebFilterIT.java
@@ -26,6 +26,7 @@
 import com.google.gerrit.testing.ConfigSuite;
 import com.google.gerrit.util.http.testutil.FakeHttpServletRequest;
 import com.google.gerrit.util.http.testutil.FakeHttpServletResponse;
+import com.google.inject.Module;
 import java.io.IOException;
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
@@ -79,6 +80,11 @@
     assertThat(account.name).isEqualTo(samlDisplayName);
   }
 
+  @Override
+  public Module createModule() {
+    return new com.googlesource.gerrit.plugins.saml.Module();
+  }
+
   private static class FakeHttpServletRequestWithSession extends FakeHttpServletRequest {
     HttpSession session;