diff --git a/database/model/model.go b/database/model/model.go
index 18211ef8..7d0a977c 100644
--- a/database/model/model.go
+++ b/database/model/model.go
@@ -106,3 +106,10 @@ type Client struct {
CreatedAt int64 `json:"created_at,omitempty"`
UpdatedAt int64 `json:"updated_at,omitempty"`
}
+
+type VLESSSettings struct {
+ Clients []Client `json:"clients"`
+ Decryption string `json:"decryption"`
+ Encryption string `json:"encryption"`
+ Fallbacks []any `json:"fallbacks"`
+}
diff --git a/sub/subController.go b/sub/subController.go
index 2f22ecab..3f053740 100644
--- a/sub/subController.go
+++ b/sub/subController.go
@@ -53,7 +53,6 @@ func (a *SUBController) initRouter(g *gin.RouterGroup) {
gJson := g.Group(a.subJsonPath)
gLink.GET(":subid", a.subs)
-
gJson.GET(":subid", a.subJsons)
}
@@ -85,7 +84,7 @@ func (a *SUBController) subs(c *gin.Context) {
// Add headers
c.Writer.Header().Set("Subscription-Userinfo", header)
c.Writer.Header().Set("Profile-Update-Interval", a.updateInterval)
- c.Writer.Header().Set("Profile-Title", "base64:" + base64.StdEncoding.EncodeToString([]byte(a.subTitle)))
+ c.Writer.Header().Set("Profile-Title", "base64:"+base64.StdEncoding.EncodeToString([]byte(a.subTitle)))
if a.subEncrypt {
c.String(200, base64.StdEncoding.EncodeToString([]byte(result)))
@@ -119,7 +118,7 @@ func (a *SUBController) subJsons(c *gin.Context) {
// Add headers
c.Writer.Header().Set("Subscription-Userinfo", header)
c.Writer.Header().Set("Profile-Update-Interval", a.updateInterval)
- c.Writer.Header().Set("Profile-Title", "base64:" + base64.StdEncoding.EncodeToString([]byte(a.subTitle)))
+ c.Writer.Header().Set("Profile-Title", "base64:"+base64.StdEncoding.EncodeToString([]byte(a.subTitle)))
c.String(200, jsonSub)
}
diff --git a/sub/subJsonService.go b/sub/subJsonService.go
index 680a01c0..def8b855 100644
--- a/sub/subJsonService.go
+++ b/sub/subJsonService.go
@@ -184,8 +184,14 @@ func (s *SubJsonService) getConfig(inbound *model.Inbound, client model.Client,
var newOutbounds []json_util.RawMessage
switch inbound.Protocol {
- case "vmess", "vless":
- newOutbounds = append(newOutbounds, s.genVnext(inbound, streamSettings, client))
+ case "vmess":
+ newOutbounds = append(newOutbounds, s.genVnext(inbound, streamSettings, client, ""))
+ case "vless":
+ var vlessSettings model.VLESSSettings
+ _ = json.Unmarshal([]byte(inbound.Settings), &vlessSettings)
+
+ newOutbounds = append(newOutbounds,
+ s.genVnext(inbound, streamSettings, client, vlessSettings.Encryption))
case "trojan", "shadowsocks":
newOutbounds = append(newOutbounds, s.genServer(inbound, streamSettings, client))
}
@@ -284,7 +290,7 @@ func (s *SubJsonService) realityData(rData map[string]any) map[string]any {
return rltyData
}
-func (s *SubJsonService) genVnext(inbound *model.Inbound, streamSettings json_util.RawMessage, client model.Client) json_util.RawMessage {
+func (s *SubJsonService) genVnext(inbound *model.Inbound, streamSettings json_util.RawMessage, client model.Client, encryption string) json_util.RawMessage {
outbound := Outbound{}
usersData := make([]UserVnext, 1)
@@ -295,7 +301,7 @@ func (s *SubJsonService) genVnext(inbound *model.Inbound, streamSettings json_ut
}
if inbound.Protocol == model.VLESS {
usersData[0].Flow = client.Flow
- usersData[0].Encryption = "none"
+ usersData[0].Encryption = encryption
}
vnextData := make([]VnextSetting, 1)
diff --git a/sub/subService.go b/sub/subService.go
index dfb0863e..e6e25e3a 100644
--- a/sub/subService.go
+++ b/sub/subService.go
@@ -313,6 +313,9 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string {
if inbound.Protocol != model.VLESS {
return ""
}
+ var vlessSettings model.VLESSSettings
+ _ = json.Unmarshal([]byte(inbound.Settings), &vlessSettings)
+
var stream map[string]any
json.Unmarshal([]byte(inbound.StreamSettings), &stream)
clients, _ := s.inboundService.GetClients(inbound)
@@ -327,6 +330,9 @@ func (s *SubService) genVlessLink(inbound *model.Inbound, email string) string {
port := inbound.Port
streamNetwork := stream["network"].(string)
params := make(map[string]string)
+ if vlessSettings.Encryption != "" {
+ params["encryption"] = vlessSettings.Encryption
+ }
params["type"] = streamNetwork
switch streamNetwork {
diff --git a/web/assets/js/model/inbound.js b/web/assets/js/model/inbound.js
index 11ecb68e..1fc8ea19 100644
--- a/web/assets/js/model/inbound.js
+++ b/web/assets/js/model/inbound.js
@@ -1861,14 +1861,15 @@ Inbound.VLESSSettings = class extends Inbound.Settings {
protocol,
vlesses = [new Inbound.VLESSSettings.VLESS()],
decryption = "none",
- fallbacks = []
+ encryption = "",
+ fallbacks = [],
) {
super(protocol);
this.vlesses = vlesses;
this.decryption = decryption;
+ this.encryption = encryption;
this.fallbacks = fallbacks;
this.selectedAuth = "X25519, not Post-Quantum";
- this.encryption = "";
}
addFallback() {
@@ -1883,13 +1884,11 @@ Inbound.VLESSSettings = class extends Inbound.Settings {
const obj = new Inbound.VLESSSettings(
Protocols.VLESS,
(json.clients || []).map(client => Inbound.VLESSSettings.VLESS.fromJson(client)),
- json.decryption || "none",
+ json.decryption,
+ json.encryption,
Inbound.VLESSSettings.Fallback.fromJson(json.fallbacks || [])
);
-
- obj.encryption = json.encryption || "";
obj.selectedAuth = json.selectedAuth || "X25519, not Post-Quantum";
-
return obj;
}
@@ -1910,6 +1909,9 @@ Inbound.VLESSSettings = class extends Inbound.Settings {
if (this.fallbacks && this.fallbacks.length > 0) {
json.fallbacks = Inbound.VLESSSettings.toJsonArray(this.fallbacks);
}
+ if (this.selectedAuth) {
+ json.selectedAuth = this.selectedAuth;
+ }
return json;
}
diff --git a/web/assets/js/model/outbound.js b/web/assets/js/model/outbound.js
index ee78795f..2d5660fb 100644
--- a/web/assets/js/model/outbound.js
+++ b/web/assets/js/model/outbound.js
@@ -813,7 +813,7 @@ class Outbound extends CommonClass {
var settings;
switch (protocol) {
case Protocols.VLESS:
- settings = new Outbound.VLESSSettings(address, port, userData, url.searchParams.get('flow') ?? '');
+ settings = new Outbound.VLESSSettings(address, port, userData, url.searchParams.get('flow') ?? '', url.searchParams.get('encryption') ?? 'none');
break;
case Protocols.Trojan:
settings = new Outbound.TrojanSettings(address, port, userData);
@@ -1046,13 +1046,13 @@ Outbound.VmessSettings = class extends CommonClass {
}
};
Outbound.VLESSSettings = class extends CommonClass {
- constructor(address, port, id, flow, encryption = 'none') {
+ constructor(address, port, id, flow, encryption) {
super();
this.address = address;
this.port = port;
this.id = id;
this.flow = flow;
- this.encryption = encryption
+ this.encryption = encryption;
}
static fromJson(json = {}) {
@@ -1071,7 +1071,7 @@ Outbound.VLESSSettings = class extends CommonClass {
vnext: [{
address: this.address,
port: this.port,
- users: [{ id: this.id, flow: this.flow, encryption: 'none', }],
+ users: [{ id: this.id, flow: this.flow, encryption: this.encryption }],
}],
};
}
diff --git a/web/controller/server.go b/web/controller/server.go
index 08ecae1f..b1174b8f 100644
--- a/web/controller/server.go
+++ b/web/controller/server.go
@@ -271,7 +271,7 @@ func (a *ServerController) getNewEchCert(c *gin.Context) {
func (a *ServerController) getNewVlessEnc(c *gin.Context) {
out, err := a.serverService.GetNewVlessEnc()
if err != nil {
- jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.getNewmlkem768Error"), err)
+ jsonMsg(c, I18nWeb(c, "pages.inbounds.toasts.getNewVlessEncError"), err)
return
}
jsonObj(c, out, nil)
diff --git a/web/html/form/outbound.html b/web/html/form/outbound.html
index c7a786b7..cfaaafd7 100644
--- a/web/html/form/outbound.html
+++ b/web/html/form/outbound.html
@@ -226,6 +226,11 @@
+
+
+
+
+
diff --git a/web/html/form/protocol/vless.html b/web/html/form/protocol/vless.html
index a0efa533..6f421731 100644
--- a/web/html/form/protocol/vless.html
+++ b/web/html/form/protocol/vless.html
@@ -18,27 +18,29 @@
-
+
-
+
X25519 (not Post-Quantum)
ML-KEM-768 (Post-Quantum)
-
+
+
Get New keys
+ Clear
+
-
+
diff --git a/web/html/form/tls_settings.html b/web/html/form/tls_settings.html
index 3a1802a3..82031bd7 100644
--- a/web/html/form/tls_settings.html
+++ b/web/html/form/tls_settings.html
@@ -5,13 +5,13 @@
{{ i18n "none" }}
- Reality
- TLS
+ Reality
+ TLS
-
+
@@ -121,7 +121,7 @@
-
+
{{template "form/realitySettings"}}
diff --git a/web/html/inbounds.html b/web/html/inbounds.html
index b0d9828f..b4d0c716 100644
--- a/web/html/inbounds.html
+++ b/web/html/inbounds.html
@@ -706,7 +706,7 @@
}, {
title: '{{ i18n "pages.inbounds.enable" }}',
align: 'center',
- width: 30,
+ width: 35,
scopedSlots: { customRender: 'enable' },
}, {
title: '{{ i18n "pages.inbounds.remark" }}',
@@ -770,8 +770,8 @@
const innerColumns = [
{ title: '{{ i18n "pages.inbounds.operate" }}', width: 65, scopedSlots: { customRender: 'actions' } },
- { title: '{{ i18n "pages.inbounds.enable" }}', width: 30, scopedSlots: { customRender: 'enable' } },
- { title: '{{ i18n "online" }}', width: 30, scopedSlots: { customRender: 'online' } },
+ { title: '{{ i18n "pages.inbounds.enable" }}', width: 35, scopedSlots: { customRender: 'enable' } },
+ { title: '{{ i18n "online" }}', width: 32, scopedSlots: { customRender: 'online' } },
{ title: '{{ i18n "pages.inbounds.client" }}', width: 80, scopedSlots: { customRender: 'client' } },
{ title: '{{ i18n "pages.inbounds.traffic" }}', width: 80, align: 'center', scopedSlots: { customRender: 'traffic' } },
{ title: '{{ i18n "pages.inbounds.allTimeTraffic" }}', width: 80, align: 'center', scopedSlots: { customRender: 'allTime' } },
diff --git a/web/html/modals/inbound_info_modal.html b/web/html/modals/inbound_info_modal.html
index 3807be34..b472d2a6 100644
--- a/web/html/modals/inbound_info_modal.html
+++ b/web/html/modals/inbound_info_modal.html
@@ -101,6 +101,12 @@
{{ i18n "security" }}
[[ inbound.stream.security ]]
+ Authentication |
+ [[ inbound.settings.selectedAuth ? inbound.settings.selectedAuth : '' ]]
+
+ {{ i18n "encryption" }}
+ [[ inbound.settings.encryption ? inbound.settings.encryption : '' ]]
+
{{ i18n "domainName" }}
[[ inbound.serverName ? inbound.serverName : '' ]]
diff --git a/web/html/modals/inbound_modal.html b/web/html/modals/inbound_modal.html
index fcdea7bb..a7a59c99 100644
--- a/web/html/modals/inbound_modal.html
+++ b/web/html/modals/inbound_modal.html
@@ -171,7 +171,6 @@
const auths = msg.obj.auths || [];
const selected = inModal.inbound.settings.selectedAuth;
-
const block = auths.find(a => a.label === selected);
if (!block) {
@@ -179,11 +178,12 @@
return;
}
- // ✅ server config field
inModal.inbound.settings.decryption = block.decryption;
-
- // ✅ UI-only field (not saved in config)
inModal.inbound.settings.encryption = block.encryption;
+ },
+ clearKeys() {
+ this.inbound.settings.decryption = 'none';
+ this.inbound.settings.encryption = '';
}
},
diff --git a/web/service/server.go b/web/service/server.go
index eff7ff4f..3078e88b 100644
--- a/web/service/server.go
+++ b/web/service/server.go
@@ -903,9 +903,10 @@ func (s *ServerService) GetNewVlessEnc() (any, error) {
if len(parts) == 2 && current != nil {
key := strings.Trim(parts[0], `" `)
val := strings.Trim(parts[1], `" `)
- if key == "decryption" {
+ switch key {
+ case "decryption":
current.Decryption = val
- } else if key == "encryption" {
+ case "encryption":
current.Encryption = val
}
}
diff --git a/web/translation/translate.ar_EG.toml b/web/translation/translate.ar_EG.toml
index 2a5a1859..4aa82b58 100644
--- a/web/translation/translate.ar_EG.toml
+++ b/web/translation/translate.ar_EG.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "خطأ في الحصول على حركات المرور"
"getNewX25519CertError" = "حدث خطأ أثناء الحصول على شهادة X25519."
"getNewmldsa65Error" = "حدث خطاء في الحصول على mldsa65."
-"getNewmlkem768Error" = "حدث خطأ أثناء الحصول على mlkem768."
+"getNewVlessEncError" = "حدث خطأ أثناء الحصول على VlessEnc."
[pages.inbounds.stream.general]
"request" = "طلب"
diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml
index 1356353f..951669d6 100644
--- a/web/translation/translate.en_US.toml
+++ b/web/translation/translate.en_US.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "Error getting traffics."
"getNewX25519CertError" = "Error while obtaining the X25519 certificate."
"getNewmldsa65Error" = "Error while obtaining mldsa65."
-"getNewmlkem768Error" = "Error while obtaining mlkem768."
+"getNewVlessEncError" = "Error while obtaining VlessEnc."
[pages.inbounds.stream.general]
"request" = "Request"
diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml
index e6d7c546..73b47e7e 100644
--- a/web/translation/translate.es_ES.toml
+++ b/web/translation/translate.es_ES.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "Error al obtener los tráficos"
"getNewX25519CertError" = "Error al obtener el certificado X25519."
"getNewmldsa65Error" = "Error al obtener el certificado mldsa65."
-"getNewmlkem768Error" = "Error al obtener el certificado mlkem768."
+"getNewVlessEncError" = "Error al obtener el certificado VlessEnc."
[pages.inbounds.stream.general]
"request" = "Pedido"
diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml
index e7d2de55..628c70ea 100644
--- a/web/translation/translate.fa_IR.toml
+++ b/web/translation/translate.fa_IR.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "خطا در دریافت ترافیکها"
"getNewX25519CertError" = "خطا در دریافت گواهی X25519."
"getNewmldsa65Error" = "خطا در دریافت گواهی mldsa65."
-"getNewmlkem768Error" = "خطا در دریافت گواهی mlkem768."
+"getNewVlessEncError" = "خطا در دریافت گواهی VlessEnc."
[pages.inbounds.stream.general]
"request" = "درخواست"
diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml
index 6674a98c..413788a4 100644
--- a/web/translation/translate.id_ID.toml
+++ b/web/translation/translate.id_ID.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "Gagal mendapatkan data lalu lintas"
"getNewX25519CertError" = "Terjadi kesalahan saat mendapatkan sertifikat X25519."
"getNewmldsa65Error" = "Terjadi kesalahan saat mendapatkan sertifikat mldsa65."
-"getNewmlkem768Error" = "Terjadi kesalahan saat mendapatkan sertifikat mlkem768."
+"getNewVlessEncError" = "Terjadi kesalahan saat mendapatkan sertifikat VlessEnc."
[pages.inbounds.stream.general]
"request" = "Permintaan"
diff --git a/web/translation/translate.ja_JP.toml b/web/translation/translate.ja_JP.toml
index a400a799..a763b75d 100644
--- a/web/translation/translate.ja_JP.toml
+++ b/web/translation/translate.ja_JP.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "トラフィックの取得中にエラーが発生しました"
"getNewX25519CertError" = "X25519証明書の取得中にエラーが発生しました。"
"getNewmldsa65Error" = "mldsa65証明書の取得中にエラーが発生しました。"
-"getNewmlkem768Error" = "mlkem768証明書の取得中にエラーが発生しました。"
+"getNewVlessEncError" = "VlessEnc証明書の取得中にエラーが発生しました。"
[pages.inbounds.stream.general]
"request" = "リクエスト"
diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml
index b6a68959..695c8ac5 100644
--- a/web/translation/translate.pt_BR.toml
+++ b/web/translation/translate.pt_BR.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "Erro ao obter tráfegos"
"getNewX25519CertError" = "Erro ao obter o certificado X25519."
"getNewmldsa65Error" = "Erro ao obter o certificado mldsa65."
-"getNewmlkem768Error" = "Erro ao obter o certificado mlkem768."
+"getNewVlessEncError" = "Erro ao obter o certificado VlessEnc."
[pages.inbounds.stream.general]
"request" = "Requisição"
diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml
index 2d25cb0c..3489a461 100644
--- a/web/translation/translate.ru_RU.toml
+++ b/web/translation/translate.ru_RU.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "Ошибка получения данных о трафике"
"getNewX25519CertError" = "Ошибка при получении сертификата X25519."
"getNewmldsa65Error" = "Ошибка при получении сертификата mldsa65."
-"getNewmlkem768Error" = "Ошибка при получении сертификата mlkem768."
+"getNewVlessEncError" = "Ошибка при получении сертификата VlessEnc."
[pages.inbounds.stream.general]
"request" = "Запрос"
diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml
index 2b815f87..16d8857e 100644
--- a/web/translation/translate.tr_TR.toml
+++ b/web/translation/translate.tr_TR.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "Trafik bilgisi alınırken hata oluştu"
"getNewX25519CertError" = "X25519 sertifikası alınırken hata oluştu."
"getNewmldsa65Error" = "mldsa65 sertifikası alınırken hata oluştu."
-"getNewmlkem768Error" = "mlkem768 sertifikası alınırken hata oluştu."
+"getNewVlessEncError" = "VlessEnc sertifikası alınırken hata oluştu."
[pages.inbounds.stream.general]
"request" = "İstek"
diff --git a/web/translation/translate.uk_UA.toml b/web/translation/translate.uk_UA.toml
index e92c6c77..7919fdb4 100644
--- a/web/translation/translate.uk_UA.toml
+++ b/web/translation/translate.uk_UA.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "Помилка отримання даних про трафік"
"getNewX25519CertError" = "Помилка при отриманні сертифіката X25519."
"getNewmldsa65Error" = "Помилка при отриманні сертифіката mldsa65."
-"getNewmlkem768Error" = "Помилка при отриманні сертифіката mlkem768."
+"getNewVlessEncError" = "Помилка при отриманні сертифіката VlessEnc."
[pages.inbounds.stream.general]
"request" = "Запит"
diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml
index 8d1d86e3..77c30648 100644
--- a/web/translation/translate.vi_VN.toml
+++ b/web/translation/translate.vi_VN.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "Lỗi khi lấy thông tin lưu lượng"
"getNewX25519CertError" = "Lỗi khi lấy chứng chỉ X25519."
"getNewmldsa65Error" = "Lỗi khi lấy chứng chỉ mldsa65."
-"getNewmlkem768Error" = "Lỗi khi lấy chứng chỉ mlkem768."
+"getNewVlessEncError" = "Lỗi khi lấy chứng chỉ VlessEnc."
[pages.inbounds.stream.general]
"request" = "Lời yêu cầu"
diff --git a/web/translation/translate.zh_CN.toml b/web/translation/translate.zh_CN.toml
index a41b46b4..796e3844 100644
--- a/web/translation/translate.zh_CN.toml
+++ b/web/translation/translate.zh_CN.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "获取流量数据时出错"
"getNewX25519CertError" = "获取X25519证书时出错。"
"getNewmldsa65Error" = "获取mldsa65证书时出错。"
-"getNewmlkem768Error" = "获取mlkem768证书时出错。"
+"getNewVlessEncError" = "获取VlessEnc证书时出错。"
[pages.inbounds.stream.general]
"request" = "请求"
diff --git a/web/translation/translate.zh_TW.toml b/web/translation/translate.zh_TW.toml
index a99877fc..f1bb558f 100644
--- a/web/translation/translate.zh_TW.toml
+++ b/web/translation/translate.zh_TW.toml
@@ -266,7 +266,7 @@
"trafficGetError" = "取得流量資料時發生錯誤"
"getNewX25519CertError" = "取得X25519憑證時發生錯誤。"
"getNewmldsa65Error" = "取得mldsa65憑證時發生錯誤。"
-"getNewmlkem768Error" = "取得mlkem768憑證時發生錯誤。"
+"getNewVlessEncError" = "取得VlessEnc憑證時發生錯誤。"
[pages.inbounds.stream.general]
"request" = "請求"