Skip to content

Commit f33806a

Browse files
committed
security(http): 同步出站请求 host 白名单守卫(JDK 17 / Jackson 2 适配)+ 移除孤儿 README.zh_CN.md
1 parent 59ff450 commit f33806a

14 files changed

Lines changed: 498 additions & 315 deletions

‎README.zh_CN.md‎

Lines changed: 0 additions & 314 deletions
This file was deleted.

‎src/main/java/io/github/easy4j/hermes/HermesClient.java‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,9 @@ private void copyHttpConfig(HermesHttpClientConfig src) {
314314
}
315315

316316
private static void copyHttpConfig(HermesHttpClientConfig src, HermesHttpClientConfig target) {
317+
// 把测试用的 host 白名单旁路标志也复制过来——门面内部快照在 copy 期间
318+
// 会经 setter 重新校验 URL,漏掉此标志会让 MockWebServer 测试抛 IAE。
319+
target.markUnsafeBaseUrlOverriddenForTest(src.isUnsafeBaseUrlOverriddenForTest());
317320
target.setMode(src.getMode());
318321
target.setEnabled(src.isEnabled());
319322
target.setStartupCheckEnabled(src.isStartupCheckEnabled());

‎src/main/java/io/github/easy4j/hermes/HermesClientConfig.java‎

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,19 @@
1212
@Data
1313
public class HermesClientConfig {
1414

15+
/**
16+
* <p>仅供测试代码使用——将内部 {@link HermesHttpClientConfig} 的
17+
* unsafe bypass 标志一并打开,使 {@link HermesClient} 复制配置时也能放行
18+
* localhost / MockWebServer 地址。生产代码不应调用此方法。</p>
19+
*
20+
* @return 当前配置(链式)
21+
* @since 1.0.0
22+
*/
23+
public HermesClientConfig markUnsafeBaseUrlOverriddenForTest() {
24+
this.http.markUnsafeBaseUrlOverriddenForTest(true);
25+
return this;
26+
}
27+
1528
/** 客户端所有通信通道共享的调试配置。 */
1629
private final HermesDebugConfig debug = new HermesDebugConfig();
1730

‎src/main/java/io/github/easy4j/hermes/HermesHttpClientConfig.java‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,13 @@ public HermesHttpClientConfig(HermesDebugConfig debug) {
5757
*/
5858
private String baseUrl = HermesApiConstants.DEFAULT_SERVER_URL;
5959

60+
/**
61+
* 仅供测试代码使用——调用 {@link #markUnsafeBaseUrlOverriddenForTest(boolean)}
62+
* 打开后,{@link #setBaseUrl(String)} 跳过 {@link io.github.easy4j.hermes.util.EndpointGuard}
63+
* 的 host 白名单校验。生产代码不应设置此字段。
64+
*/
65+
private boolean unsafeBaseUrlOverriddenForTest;
66+
6067
/**
6168
* Bearer 鉴权密钥;为空时不发送 Authorization 请求头。
6269
*/
@@ -173,6 +180,35 @@ public HermesHttpClientConfig(HermesDebugConfig debug) {
173180
* @return 配置的 API key;未配置时返回空字符串
174181
* @since 1.0.0
175182
*/
183+
184+
/**
185+
* <p>设置基础 URL 并强制 host 白名单校验:仅接受 {@code http} / {@code https},
186+
* 拒绝 localhost、环回、私有与保留地址。测试可经
187+
* {@link #markUnsafeBaseUrlOverriddenForTest(boolean)} 放行。</p>
188+
*
189+
* @param baseUrl 服务基础 URL
190+
* @return 当前配置(链式)
191+
* @since 1.0.0
192+
*/
193+
public HermesHttpClientConfig setBaseUrl(String baseUrl) {
194+
if (!this.unsafeBaseUrlOverriddenForTest) {
195+
this.baseUrl = io.github.easy4j.hermes.util.EndpointGuard.require(baseUrl);
196+
} else {
197+
this.baseUrl = baseUrl;
198+
}
199+
return this;
200+
}
201+
202+
/**
203+
* <p>仅供测试代码使用——绕开 host 白名单。</p>
204+
*
205+
* @param value true 跳过下一次 setter 调用的 host 校验
206+
* @since 1.0.0
207+
*/
208+
public void markUnsafeBaseUrlOverriddenForTest(boolean value) {
209+
this.unsafeBaseUrlOverriddenForTest = value;
210+
}
211+
176212
public String resolveApiKey() {
177213
return Objects.toString(apiKey, "");
178214
}

0 commit comments

Comments
 (0)