Skip to content

Commit 54e9eb1

Browse files
authored
[feat][client] Support forward proxy for the ZTS server in pulsar-client-auth-athenz (apache#23947)
1 parent e6cfd2b commit 54e9eb1

File tree

3 files changed

+64
-3
lines changed

3 files changed

+64
-3
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ flexible messaging model and an intuitive client API.</description>
152152
<jetty.version>9.4.56.v20240826</jetty.version>
153153
<conscrypt.version>2.5.2</conscrypt.version>
154154
<jersey.version>2.42</jersey.version>
155-
<athenz.version>1.10.50</athenz.version>
155+
<athenz.version>1.10.62</athenz.version>
156156
<prometheus.version>0.16.0</prometheus.version>
157157
<vertx.version>4.5.10</vertx.version>
158158
<rocksdb.version>7.9.2</rocksdb.version>

pulsar-client-auth-athenz/src/main/java/org/apache/pulsar/client/impl/auth/AuthenticationAthenz.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public class AuthenticationAthenz implements Authentication, EncodedAuthenticati
6363
private transient KeyRefresher keyRefresher = null;
6464
private transient ZTSClient ztsClient = null;
6565
private String ztsUrl = null;
66+
private String ztsProxyUrl = null;
6667
private String tenantDomain;
6768
private String tenantService;
6869
private String providerDomain;
@@ -193,6 +194,9 @@ private void setAuthParams(Map<String, String> authParams) {
193194
if (isNotBlank(authParams.get("ztsUrl"))) {
194195
this.ztsUrl = authParams.get("ztsUrl");
195196
}
197+
if (isNotBlank(authParams.get("ztsProxyUrl"))) {
198+
this.ztsProxyUrl = authParams.get("ztsProxyUrl");
199+
}
196200
}
197201

198202
@Override
@@ -219,11 +223,11 @@ private ZTSClient getZtsClient() throws InterruptedException, IOException, KeyRe
219223
}
220224
final SSLContext sslContext = Utils.buildSSLContext(keyRefresher.getKeyManagerProxy(),
221225
keyRefresher.getTrustManagerProxy());
222-
ztsClient = new ZTSClient(ztsUrl, sslContext);
226+
ztsClient = new ZTSClient(ztsUrl, ztsProxyUrl, sslContext);
223227
} else {
224228
ServiceIdentityProvider siaProvider = new SimpleServiceIdentityProvider(tenantDomain, tenantService,
225229
privateKey, keyId);
226-
ztsClient = new ZTSClient(ztsUrl, tenantDomain, tenantService, siaProvider);
230+
ztsClient = new ZTSClient(ztsUrl, ztsProxyUrl, tenantDomain, tenantService, siaProvider);
227231
}
228232
ztsClient.setPrefetchAutoEnable(this.autoPrefetchEnabled);
229233
}

pulsar-client-auth-athenz/src/test/java/org/apache/pulsar/client/impl/auth/AuthenticationAthenzTest.java

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,18 @@
1818
*/
1919
package org.apache.pulsar.client.impl.auth;
2020

21+
import static org.mockito.ArgumentMatchers.any;
22+
import static org.mockito.ArgumentMatchers.anyBoolean;
23+
import static org.mockito.ArgumentMatchers.anyInt;
24+
import static org.mockito.Mockito.mock;
25+
import static org.mockito.Mockito.when;
2126
import static org.testng.Assert.assertEquals;
2227
import static org.testng.Assert.assertFalse;
28+
import static org.testng.Assert.assertNull;
2329
import static org.testng.Assert.assertTrue;
2430
import static org.testng.Assert.fail;
31+
import org.mockito.MockedConstruction;
32+
import org.mockito.Mockito;
2533
import org.testng.annotations.Test;
2634
import org.apache.pulsar.common.util.ObjectMapperFactory;
2735
import static org.apache.pulsar.common.util.Codec.encode;
@@ -287,4 +295,53 @@ public void testRoleHeaderSetting() throws Exception {
287295
assertEquals(auth2.getAuthData().getHttpHeaders().iterator().next().getKey(), "Test-Role-Header");
288296
auth2.close();
289297
}
298+
299+
@Test
300+
public void testZtsProxyUrlSetting() throws Exception {
301+
final String ztsProxyUrl = "https://example.com:4443/";
302+
final String paramsStr = new String(Files.readAllBytes(Paths.get("./src/test/resources/authParams.json")));
303+
final ObjectMapper jsonMapper = ObjectMapperFactory.create();
304+
final Map<String, String> authParamsMap = jsonMapper.readValue(paramsStr, new TypeReference<HashMap<String, String>>() { });
305+
306+
try (MockedConstruction<ZTSClient> mockedZTSClient = Mockito.mockConstruction(ZTSClient.class, (mock, context) -> {
307+
final String actualZtsProxyUrl = (String) context.arguments().get(1);
308+
assertNull(actualZtsProxyUrl);
309+
310+
when(mock.getRoleToken(any(), any(), anyInt(), anyInt(), anyBoolean())).thenReturn(mock(RoleToken.class));
311+
})) {
312+
authParamsMap.remove("ztsProxyUrl");
313+
final AuthenticationAthenz auth1 = new AuthenticationAthenz();
314+
auth1.configure(jsonMapper.writeValueAsString(authParamsMap));
315+
auth1.getAuthData();
316+
317+
assertEquals(mockedZTSClient.constructed().size(), 1);
318+
319+
auth1.close();
320+
321+
authParamsMap.put("ztsProxyUrl", "");
322+
final AuthenticationAthenz auth2 = new AuthenticationAthenz();
323+
auth2.configure(jsonMapper.writeValueAsString(authParamsMap));
324+
auth2.getAuthData();
325+
326+
assertEquals(mockedZTSClient.constructed().size(), 2);
327+
328+
auth2.close();
329+
}
330+
331+
try (MockedConstruction<ZTSClient> mockedZTSClient = Mockito.mockConstruction(ZTSClient.class, (mock, context) -> {
332+
final String actualZtsProxyUrl = (String) context.arguments().get(1);
333+
assertEquals(actualZtsProxyUrl, ztsProxyUrl);
334+
335+
when(mock.getRoleToken(any(), any(), anyInt(), anyInt(), anyBoolean())).thenReturn(mock(RoleToken.class));
336+
})) {
337+
authParamsMap.put("ztsProxyUrl", ztsProxyUrl);
338+
final AuthenticationAthenz auth3 = new AuthenticationAthenz();
339+
auth3.configure(jsonMapper.writeValueAsString(authParamsMap));
340+
auth3.getAuthData();
341+
342+
assertEquals(mockedZTSClient.constructed().size(), 1);
343+
344+
auth3.close();
345+
}
346+
}
290347
}

0 commit comments

Comments
 (0)