[ https://issues.apache.org/jira/browse/KNOX-3105?focusedWorklogId=959889&page=com.atlassian.jira.plugin.system.issuetabpanels:worklog-tabpanel#worklog-959889 ]
ASF GitHub Bot logged work on KNOX-3105: ---------------------------------------- Author: ASF GitHub Bot Created on: 04/Mar/25 06:22 Start Date: 04/Mar/25 06:22 Worklog Time Spent: 10m Work Description: smolnar82 commented on code in PR #1001: URL: https://github.com/apache/knox/pull/1001#discussion_r1978691497 ########## gateway-provider-security-authc-remote/src/main/java/org/apache/knox/gateway/filter/RemoteAuthFilter.java: ########## @@ -72,11 +72,14 @@ public class RemoteAuthFilter implements Filter { private static final String CONFIG_GROUP_HEADER = "remote.auth.group.header"; private static final String DEFAULT_CONFIG_USER_HEADER = "X-Knox-Actor-ID"; private static final String DEFAULT_CONFIG_GROUP_HEADER = "X-Knox-Actor-Groups-*"; + private static final String CONFIG_TRUSTSTORE_PATH = "remote.auth.truststore.path"; Review Comment: nit: the `remote.auth.` prefix could be a separate final constant (so that all properties could start like `REMOTE_AUTH_PREFIX + `) ########## gateway-provider-security-authc-remote/src/main/java/org/apache/knox/gateway/filter/RemoteAuthFilter.java: ########## @@ -203,12 +217,20 @@ private HttpURLConnection getHttpURLConnection(ServletContext servletContext) th KeystoreService keystoreService = services.getService(ServiceType.KEYSTORE_SERVICE); if (keystoreService != null) { try { - truststore = keystoreService.getTruststoreForHttpClient(); + // Try topology-specific truststore first if configured Review Comment: Given the updated logic, `getTrustStore` should be a separate private method. ########## gateway-provider-security-authc-remote/src/test/java/org/apache/knox/gateway/filter/RemoteAuthFilterTest.java: ########## @@ -65,22 +72,52 @@ public class RemoteAuthFilterTest { private HttpServletRequest requestMock; private HttpServletResponse responseMock; private TestFilterChain chainMock; + private GatewayServices gatewayServicesMock; + private KeystoreService keystoreServiceMock; + private ServletContext servletContextMock; + @Before - public void setUp() { - FilterConfig filterConfigMock = EasyMock.createNiceMock(FilterConfig.class); + public void createMocks() { requestMock = EasyMock.createMock(HttpServletRequest.class); responseMock = EasyMock.createMock(HttpServletResponse.class); + } + + private void setUp(String trustStorePath, String trustStorePass, String trustStoreType) { + // Reset existing mocks + EasyMock.reset(requestMock, responseMock); + + FilterConfig filterConfigMock = EasyMock.createNiceMock(FilterConfig.class); chainMock = new TestFilterChain(); - EasyMock.expect(filterConfigMock.getInitParameter("remote.auth.url")).andReturn("http://example.com/auth").anyTimes(); + // Create and configure Gateway Services mocks + gatewayServicesMock = EasyMock.createNiceMock(GatewayServices.class); + keystoreServiceMock = EasyMock.createNiceMock(KeystoreService.class); + servletContextMock = EasyMock.createNiceMock(ServletContext.class); + + // Set up Gateway Services expectations + EasyMock.expect(gatewayServicesMock.getService(ServiceType.KEYSTORE_SERVICE)) + .andReturn(keystoreServiceMock) + .anyTimes(); + EasyMock.expect(servletContextMock.getAttribute(GatewayServices.GATEWAY_SERVICES_ATTRIBUTE)) + .andReturn(gatewayServicesMock) + .anyTimes(); + + // Basic config + EasyMock.expect(filterConfigMock.getInitParameter("remote.auth.url")).andReturn("https://example.com/auth").anyTimes(); EasyMock.expect(filterConfigMock.getInitParameter("remote.auth.include.headers")).andReturn("Authorization").anyTimes(); EasyMock.expect(filterConfigMock.getInitParameter("remote.auth.cache.key")).andReturn("Authorization").anyTimes(); EasyMock.expect(filterConfigMock.getInitParameter("remote.auth.expire.after")).andReturn("5").anyTimes(); EasyMock.expect(filterConfigMock.getInitParameter("remote.auth.user.header")).andReturn(X_AUTHENTICATED_USER).anyTimes(); EasyMock.expect(filterConfigMock.getInitParameter("remote.auth.group.header")) .andReturn(X_AUTHENTICATED_GROUP + "," + X_AUTHENTICATED_GROUP_2 + ",X-Custom-Group-*").anyTimes(); - EasyMock.replay(filterConfigMock); + // Trust store config + EasyMock.expect(filterConfigMock.getInitParameter("remote.auth.truststore.path")).andReturn(trustStorePath).anyTimes(); Review Comment: If I were you, I'd set the property names' visibility to package level -> they can be used in the test class. E.g.: `EasyMock.expect(filterConfigMock.getInitParameter(CONFIG_TRUSTSTORE_PATH)).andReturn(trustStorePath).anyTimes();` Issue Time Tracking ------------------- Worklog Id: (was: 959889) Time Spent: 20m (was: 10m) > Add Topology Level Config for Truststore to RemoteAuthProvider > -------------------------------------------------------------- > > Key: KNOX-3105 > URL: https://issues.apache.org/jira/browse/KNOX-3105 > Project: Apache Knox > Issue Type: Improvement > Components: Server > Reporter: Larry McCay > Assignee: Larry McCay > Priority: Major > Fix For: 2.2.0 > > Time Spent: 20m > Remaining Estimate: 0h > > I originally had this topology level config only for the truststore and > password but decided that it should be configured at the gateway level. > However, it is much easier to use specific truststores for dev and testing > environments than adding a cert from one Knox to another's truststore which > may have other certs, etc. > This change will add the params for location and password with alias service > support of the password. -- This message was sent by Atlassian Jira (v8.20.10#820010)