Fix feature request #4445: add Hysteria2 client allow insecure support

This commit is contained in:
diamond261 2026-05-17 16:14:59 +08:00
parent 5310680dbd
commit 0dddc51441
5 changed files with 24 additions and 4 deletions

View file

@ -179,6 +179,7 @@ type Client struct {
Flow string `json:"flow,omitempty"` // Flow control (XTLS) Flow string `json:"flow,omitempty"` // Flow control (XTLS)
Reverse *ClientReverse `json:"reverse,omitempty"` // VLESS simple reverse proxy settings Reverse *ClientReverse `json:"reverse,omitempty"` // VLESS simple reverse proxy settings
Auth string `json:"auth,omitempty"` // Auth password (Hysteria) Auth string `json:"auth,omitempty"` // Auth password (Hysteria)
AllowInsecure bool `json:"allowInsecure,omitempty"` // Per-client TLS insecure flag (Hysteria2)
Email string `json:"email"` // Client email identifier Email string `json:"email"` // Client email identifier
LimitIP int `json:"limitIp"` // IP limit for this client LimitIP int `json:"limitIp"` // IP limit for this client
TotalGB int64 `json:"totalGB" form:"totalGB"` // Total traffic limit in GB TotalGB int64 `json:"totalGB" form:"totalGB"` // Total traffic limit in GB

View file

@ -2224,7 +2224,7 @@ export class Inbound extends XrayCommonClass {
return url.toString(); return url.toString();
} }
genHysteriaLink(address = '', port = this.port, remark = '', clientAuth) { genHysteriaLink(address = '', port = this.port, remark = '', clientAuth, clientAllowInsecure) {
const protocol = this.settings.version == 2 ? "hysteria2" : "hysteria"; const protocol = this.settings.version == 2 ? "hysteria2" : "hysteria";
const link = `${protocol}://${clientAuth}@${address}:${port}`; const link = `${protocol}://${clientAuth}@${address}:${port}`;
@ -2232,7 +2232,7 @@ export class Inbound extends XrayCommonClass {
params.set("security", "tls"); params.set("security", "tls");
if (this.stream.tls.settings.fingerprint?.length > 0) params.set("fp", this.stream.tls.settings.fingerprint); if (this.stream.tls.settings.fingerprint?.length > 0) params.set("fp", this.stream.tls.settings.fingerprint);
if (this.stream.tls.alpn?.length > 0) params.set("alpn", this.stream.tls.alpn); if (this.stream.tls.alpn?.length > 0) params.set("alpn", this.stream.tls.alpn);
if (this.stream.tls.settings.allowInsecure) params.set("insecure", "1"); if (clientAllowInsecure ?? this.stream.tls.settings.allowInsecure) params.set("insecure", "1");
if (this.stream.tls.settings.echConfigList?.length > 0) params.set("ech", this.stream.tls.settings.echConfigList); if (this.stream.tls.settings.echConfigList?.length > 0) params.set("ech", this.stream.tls.settings.echConfigList);
if (this.stream.tls.sni?.length > 0) params.set("sni", this.stream.tls.sni); if (this.stream.tls.sni?.length > 0) params.set("sni", this.stream.tls.sni);
@ -2343,7 +2343,13 @@ export class Inbound extends XrayCommonClass {
case Protocols.TROJAN: case Protocols.TROJAN:
return this.genTrojanLink(address, port, forceTls, remark, client.password); return this.genTrojanLink(address, port, forceTls, remark, client.password);
case Protocols.HYSTERIA: case Protocols.HYSTERIA:
return this.genHysteriaLink(address, port, remark, client.auth.length > 0 ? client.auth : this.stream.hysteria.auth); return this.genHysteriaLink(
address,
port,
remark,
client.auth.length > 0 ? client.auth : this.stream.hysteria.auth,
client.allowInsecure,
);
default: return ''; default: return '';
} }
} }
@ -2952,15 +2958,18 @@ Inbound.HysteriaSettings = class extends Inbound.Settings {
Inbound.HysteriaSettings.Hysteria = class extends Inbound.ClientBase { Inbound.HysteriaSettings.Hysteria = class extends Inbound.ClientBase {
constructor( constructor(
auth = RandomUtil.randomSeq(10), auth = RandomUtil.randomSeq(10),
allowInsecure = false,
email, limitIp, totalGB, expiryTime, enable, tgId, subId, comment, reset, created_at, updated_at, email, limitIp, totalGB, expiryTime, enable, tgId, subId, comment, reset, created_at, updated_at,
) { ) {
super(email, limitIp, totalGB, expiryTime, enable, tgId, subId, comment, reset, created_at, updated_at); super(email, limitIp, totalGB, expiryTime, enable, tgId, subId, comment, reset, created_at, updated_at);
this.auth = auth; this.auth = auth;
this.allowInsecure = allowInsecure;
} }
toJson() { toJson() {
return { return {
auth: this.auth, auth: this.auth,
allowInsecure: this.allowInsecure,
...this._clientBaseToJson(), ...this._clientBaseToJson(),
}; };
} }
@ -2968,6 +2977,7 @@ Inbound.HysteriaSettings.Hysteria = class extends Inbound.ClientBase {
static fromJson(json = {}) { static fromJson(json = {}) {
return new Inbound.HysteriaSettings.Hysteria( return new Inbound.HysteriaSettings.Hysteria(
json.auth, json.auth,
json.allowInsecure ?? false,
...Inbound.ClientBase.commonArgsFromJson(json), ...Inbound.ClientBase.commonArgsFromJson(json),
); );
} }

View file

@ -271,6 +271,9 @@ const title = computed(() =>
</template> </template>
<a-input v-model:value="client.auth" /> <a-input v-model:value="client.auth" />
</a-form-item> </a-form-item>
<a-form-item v-if="protocol === Protocols.HYSTERIA" label="Allow Insecure">
<a-switch v-model:checked="client.allowInsecure" />
</a-form-item>
<a-form-item v-if="isVmessOrVless"> <a-form-item v-if="isVmessOrVless">
<template #label> <template #label>

View file

@ -1690,6 +1690,9 @@ watch(() => inbound.value?.protocol, () => stampAdvancedTextFor('stream'));
<a-form-item label="Session Resumption"> <a-form-item label="Session Resumption">
<a-switch v-model:checked="inbound.stream.tls.enableSessionResumption" /> <a-switch v-model:checked="inbound.stream.tls.enableSessionResumption" />
</a-form-item> </a-form-item>
<a-form-item label="Allow Insecure">
<a-switch v-model:checked="inbound.stream.tls.settings.allowInsecure" />
</a-form-item>
<!-- Cert array file path or inline content per row --> <!-- Cert array file path or inline content per row -->

View file

@ -446,6 +446,7 @@ func (s *SubService) genHysteriaLink(inbound *model.Inbound, email string) strin
} }
} }
auth := clients[clientIndex].Auth auth := clients[clientIndex].Auth
clientAllowInsecure := clients[clientIndex].AllowInsecure
params := make(map[string]string) params := make(map[string]string)
params["security"] = "tls" params["security"] = "tls"
@ -467,7 +468,9 @@ func (s *SubService) genHysteriaLink(inbound *model.Inbound, email string) strin
if fpValue, ok := searchKey(tlsSettings, "fingerprint"); ok { if fpValue, ok := searchKey(tlsSettings, "fingerprint"); ok {
params["fp"], _ = fpValue.(string) params["fp"], _ = fpValue.(string)
} }
if insecure, ok := searchKey(tlsSettings, "allowInsecure"); ok { if clientAllowInsecure {
params["insecure"] = "1"
} else if insecure, ok := searchKey(tlsSettings, "allowInsecure"); ok {
if insecure.(bool) { if insecure.(bool) {
params["insecure"] = "1" params["insecure"] = "1"
} }