From 4a0914cb1e271ab4f076cb1bd68c9f07cc025e92 Mon Sep 17 00:00:00 2001
From: Ali Golzar <57574919+aliglzr@users.noreply.github.com>
Date: Sun, 31 Aug 2025 20:03:50 +0330
Subject: [PATCH 01/11] feat: add "Last Online" column to client list and modal
(Closes #3402) (#3405)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* feat: persist client last online and expose API
* feat(ui): show client last online in table and info modal
* i18n: add “Last Online” across locales
* chore: format timestamps as HH:mm:ss
---
web/assets/js/util/date-util.js | 2 +-
web/controller/api.go | 1 +
web/controller/inbound.go | 5 +++++
web/html/component/aClientTable.html | 17 +++++++++++------
web/html/inbounds.html | 18 ++++++++++++++++++
web/html/modals/inbound_info_modal.html | 6 ++++++
web/service/inbound.go | 15 +++++++++++++++
web/translation/translate.ar_EG.toml | 1 +
web/translation/translate.en_US.toml | 1 +
web/translation/translate.es_ES.toml | 1 +
web/translation/translate.fa_IR.toml | 1 +
web/translation/translate.id_ID.toml | 1 +
web/translation/translate.ja_JP.toml | 1 +
web/translation/translate.pt_BR.toml | 1 +
web/translation/translate.ru_RU.toml | 1 +
web/translation/translate.tr_TR.toml | 1 +
web/translation/translate.uk_UA.toml | 1 +
web/translation/translate.vi_VN.toml | 1 +
web/translation/translate.zh_CN.toml | 1 +
web/translation/translate.zh_TW.toml | 1 +
xray/client_traffic.go | 1 +
21 files changed, 71 insertions(+), 7 deletions(-)
diff --git a/web/assets/js/util/date-util.js b/web/assets/js/util/date-util.js
index 9b4b0f81..bbca1272 100644
--- a/web/assets/js/util/date-util.js
+++ b/web/assets/js/util/date-util.js
@@ -134,7 +134,7 @@ class DateUtil {
}
static formatMillis(millis) {
- return moment(millis).format('YYYY-M-D H:m:s');
+ return moment(millis).format('YYYY-M-D HH:mm:ss');
}
static firstDayOfMonth() {
diff --git a/web/controller/api.go b/web/controller/api.go
index 636035ba..32af934e 100644
--- a/web/controller/api.go
+++ b/web/controller/api.go
@@ -47,6 +47,7 @@ func (a *APIController) initRouter(g *gin.RouterGroup) {
{"POST", "/resetAllClientTraffics/:id", a.inboundController.resetAllClientTraffics},
{"POST", "/delDepletedClients/:id", a.inboundController.delDepletedClients},
{"POST", "/onlines", a.inboundController.onlines},
+ {"POST", "/lastOnline", a.inboundController.lastOnline},
{"POST", "/updateClientTraffic/:email", a.inboundController.updateClientTraffic},
}
diff --git a/web/controller/inbound.go b/web/controller/inbound.go
index 851b4b6f..9ff2f302 100644
--- a/web/controller/inbound.go
+++ b/web/controller/inbound.go
@@ -340,6 +340,11 @@ func (a *InboundController) onlines(c *gin.Context) {
jsonObj(c, a.inboundService.GetOnlineClients(), nil)
}
+func (a *InboundController) lastOnline(c *gin.Context) {
+ data, err := a.inboundService.GetClientsLastOnline()
+ jsonObj(c, data, err)
+}
+
func (a *InboundController) updateClientTraffic(c *gin.Context) {
email := c.Param("email")
diff --git a/web/html/component/aClientTable.html b/web/html/component/aClientTable.html
index 53ec27a3..a7279e50 100644
--- a/web/html/component/aClientTable.html
+++ b/web/html/component/aClientTable.html
@@ -33,12 +33,17 @@
-
- {{ i18n "online" }}
-
-
- {{ i18n "offline" }}
-
+
+
+ {{ i18n "lastOnline" }}: [[ formatLastOnline(client.email) ]]
+
+
+ {{ i18n "online" }}
+
+
+ {{ i18n "offline" }}
+
+
diff --git a/web/html/inbounds.html b/web/html/inbounds.html
index 1621807e..dfccdd70 100644
--- a/web/html/inbounds.html
+++ b/web/html/inbounds.html
@@ -807,6 +807,7 @@
defaultKey: '',
clientCount: [],
onlineClients: [],
+ lastOnlineMap: {},
isRefreshEnabled: localStorage.getItem("isRefreshEnabled") === "true" ? true : false,
refreshing: false,
refreshInterval: Number(localStorage.getItem("refreshInterval")) || 5000,
@@ -835,6 +836,7 @@
return;
}
+ await this.getLastOnlineMap();
await this.getOnlineUsers();
this.setInbounds(msg.obj);
@@ -849,6 +851,11 @@
}
this.onlineClients = msg.obj != null ? msg.obj : [];
},
+ async getLastOnlineMap() {
+ const msg = await HttpUtil.post('/panel/api/inbounds/lastOnline');
+ if (!msg.success || !msg.obj) return;
+ this.lastOnlineMap = msg.obj || {}
+ },
async getDefaultSettings() {
const msg = await HttpUtil.post('/panel/setting/defaultSettings');
if (!msg.success) {
@@ -1493,6 +1500,17 @@
isClientOnline(email) {
return this.onlineClients.includes(email);
},
+ getLastOnline(email) {
+ return this.lastOnlineMap[email] || null
+ },
+ formatLastOnline(email) {
+ const ts = this.getLastOnline(email)
+ if (!ts) return '-'
+ if (this.datepicker === 'gregorian') {
+ return DateUtil.formatMillis(ts)
+ }
+ return DateUtil.convertToJalalian(moment(ts))
+ },
isRemovable(dbInboundId) {
return this.getInboundClients(this.dbInbounds.find(row => row.id === dbInboundId)).length > 1;
},
diff --git a/web/html/modals/inbound_info_modal.html b/web/html/modals/inbound_info_modal.html
index fe7d7a82..a15172f3 100644
--- a/web/html/modals/inbound_info_modal.html
+++ b/web/html/modals/inbound_info_modal.html
@@ -217,6 +217,12 @@
+
{{ i18n "comment" }} |
diff --git a/web/service/inbound.go b/web/service/inbound.go
index 0621cdea..b494d502 100644
--- a/web/service/inbound.go
+++ b/web/service/inbound.go
@@ -967,6 +967,7 @@ func (s *InboundService) addClientTraffic(tx *gorm.DB, traffics []*xray.ClientTr
// Add user in onlineUsers array on traffic
if traffics[traffic_index].Up+traffics[traffic_index].Down > 0 {
onlineClients = append(onlineClients, traffics[traffic_index].Email)
+ dbClientTraffics[dbTraffic_index].LastOnline = time.Now().UnixMilli()
}
break
}
@@ -2187,6 +2188,20 @@ func (s *InboundService) GetOnlineClients() []string {
return p.GetOnlineClients()
}
+func (s *InboundService) GetClientsLastOnline() (map[string]int64, error) {
+ db := database.GetDB()
+ var rows []xray.ClientTraffic
+ err := db.Model(&xray.ClientTraffic{}).Select("email, last_online").Find(&rows).Error
+ if err != nil && err != gorm.ErrRecordNotFound {
+ return nil, err
+ }
+ result := make(map[string]int64, len(rows))
+ for _, r := range rows {
+ result[r.Email] = r.LastOnline
+ }
+ return result, nil
+}
+
func (s *InboundService) FilterAndSortClientEmails(emails []string) ([]string, []string, error) {
db := database.GetDB()
diff --git a/web/translation/translate.ar_EG.toml b/web/translation/translate.ar_EG.toml
index bbf68822..dd5618cb 100644
--- a/web/translation/translate.ar_EG.toml
+++ b/web/translation/translate.ar_EG.toml
@@ -50,6 +50,7 @@
"fail" = "فشل"
"comment" = "تعليق"
"success" = "تم بنجاح"
+"lastOnline" = "آخر متصل"
"getVersion" = "جيب النسخة"
"install" = "تثبيت"
"clients" = "عملاء"
diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml
index 1531fe30..89f127a8 100644
--- a/web/translation/translate.en_US.toml
+++ b/web/translation/translate.en_US.toml
@@ -50,6 +50,7 @@
"fail" = "Failed"
"comment" = "Comment"
"success" = "Successfully"
+"lastOnline" = "Last Online"
"getVersion" = "Get Version"
"install" = "Install"
"clients" = "Clients"
diff --git a/web/translation/translate.es_ES.toml b/web/translation/translate.es_ES.toml
index 6a2b8958..070b6b57 100644
--- a/web/translation/translate.es_ES.toml
+++ b/web/translation/translate.es_ES.toml
@@ -50,6 +50,7 @@
"fail" = "Falló"
"comment" = "Comentario"
"success" = "Éxito"
+"lastOnline" = "Última conexión"
"getVersion" = "Obtener versión"
"install" = "Instalar"
"clients" = "Clientes"
diff --git a/web/translation/translate.fa_IR.toml b/web/translation/translate.fa_IR.toml
index fb6d9f02..5c949928 100644
--- a/web/translation/translate.fa_IR.toml
+++ b/web/translation/translate.fa_IR.toml
@@ -50,6 +50,7 @@
"fail" = "ناموفق"
"comment" = "توضیحات"
"success" = "موفق"
+"lastOnline" = "آخرین فعالیت"
"getVersion" = "دریافت نسخه"
"install" = "نصب"
"clients" = "کاربران"
diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml
index d0d77dc3..4dc8e378 100644
--- a/web/translation/translate.id_ID.toml
+++ b/web/translation/translate.id_ID.toml
@@ -50,6 +50,7 @@
"fail" = "Gagal"
"comment" = "Komentar"
"success" = "Berhasil"
+"lastOnline" = "Terakhir online"
"getVersion" = "Dapatkan Versi"
"install" = "Instal"
"clients" = "Klien"
diff --git a/web/translation/translate.ja_JP.toml b/web/translation/translate.ja_JP.toml
index 3f89cf0c..54479232 100644
--- a/web/translation/translate.ja_JP.toml
+++ b/web/translation/translate.ja_JP.toml
@@ -50,6 +50,7 @@
"fail" = "失敗"
"comment" = "コメント"
"success" = "成功"
+"lastOnline" = "最終オンライン"
"getVersion" = "バージョン取得"
"install" = "インストール"
"clients" = "クライアント"
diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml
index 3755c61e..a3aac778 100644
--- a/web/translation/translate.pt_BR.toml
+++ b/web/translation/translate.pt_BR.toml
@@ -50,6 +50,7 @@
"fail" = "Falhou"
"comment" = "Comentário"
"success" = "Com Sucesso"
+"lastOnline" = "Última vez online"
"getVersion" = "Obter Versão"
"install" = "Instalar"
"clients" = "Clientes"
diff --git a/web/translation/translate.ru_RU.toml b/web/translation/translate.ru_RU.toml
index 8efc4673..718edb51 100644
--- a/web/translation/translate.ru_RU.toml
+++ b/web/translation/translate.ru_RU.toml
@@ -50,6 +50,7 @@
"fail" = "Ошибка"
"comment" = "Комментарий"
"success" = "Успешно"
+"lastOnline" = "Был(а) в сети"
"getVersion" = "Узнать версию"
"install" = "Установка"
"clients" = "Клиенты"
diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml
index a298dd30..047d9d57 100644
--- a/web/translation/translate.tr_TR.toml
+++ b/web/translation/translate.tr_TR.toml
@@ -50,6 +50,7 @@
"fail" = "Başarısız"
"comment" = "Yorum"
"success" = "Başarılı"
+"lastOnline" = "Son çevrimiçi"
"getVersion" = "Sürümü Al"
"install" = "Yükle"
"clients" = "Müşteriler"
diff --git a/web/translation/translate.uk_UA.toml b/web/translation/translate.uk_UA.toml
index 02ed7352..3dc5b3e7 100644
--- a/web/translation/translate.uk_UA.toml
+++ b/web/translation/translate.uk_UA.toml
@@ -50,6 +50,7 @@
"fail" = "Помилка"
"comment" = "Коментар"
"success" = "Успішно"
+"lastOnline" = "Був(ла) онлайн"
"getVersion" = "Отримати версію"
"install" = "Встановити"
"clients" = "Клієнти"
diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml
index 3f61874f..aa0009eb 100644
--- a/web/translation/translate.vi_VN.toml
+++ b/web/translation/translate.vi_VN.toml
@@ -50,6 +50,7 @@
"fail" = "Thất bại"
"comment" = "Bình luận"
"success" = "Thành công"
+"lastOnline" = "Lần online gần nhất"
"getVersion" = "Lấy phiên bản"
"install" = "Cài đặt"
"clients" = "Các khách hàng"
diff --git a/web/translation/translate.zh_CN.toml b/web/translation/translate.zh_CN.toml
index bf19cfdb..01844f13 100644
--- a/web/translation/translate.zh_CN.toml
+++ b/web/translation/translate.zh_CN.toml
@@ -50,6 +50,7 @@
"fail" = "失败"
"comment" = "评论"
"success" = "成功"
+"lastOnline" = "上次在线"
"getVersion" = "获取版本"
"install" = "安装"
"clients" = "客户端"
diff --git a/web/translation/translate.zh_TW.toml b/web/translation/translate.zh_TW.toml
index dfd284d2..f3121c69 100644
--- a/web/translation/translate.zh_TW.toml
+++ b/web/translation/translate.zh_TW.toml
@@ -50,6 +50,7 @@
"fail" = "失敗"
"comment" = "評論"
"success" = "成功"
+"lastOnline" = "上次上線"
"getVersion" = "獲取版本"
"install" = "安裝"
"clients" = "客戶端"
diff --git a/xray/client_traffic.go b/xray/client_traffic.go
index 883de2cc..fe527d55 100644
--- a/xray/client_traffic.go
+++ b/xray/client_traffic.go
@@ -11,4 +11,5 @@ type ClientTraffic struct {
ExpiryTime int64 `json:"expiryTime" form:"expiryTime"`
Total int64 `json:"total" form:"total"`
Reset int `json:"reset" form:"reset" gorm:"default:0"`
+ LastOnline int64 `json:"lastOnline" form:"lastOnline" gorm:"default:0"`
}
From ed2a0a0bcf99d1636b8ae7c1689d348d78b334c1 Mon Sep 17 00:00:00 2001
From: Ali Golzar
Date: Tue, 2 Sep 2025 02:27:44 +0330
Subject: [PATCH 02/11] fix: prevent client `updated_at` from resetting when
parent inbound is updated
---
web/service/inbound.go | 14 +++++++++++++-
1 file changed, 13 insertions(+), 1 deletion(-)
diff --git a/web/service/inbound.go b/web/service/inbound.go
index b494d502..a4592160 100644
--- a/web/service/inbound.go
+++ b/web/service/inbound.go
@@ -349,6 +349,7 @@ func (s *InboundService) UpdateInbound(inbound *model.Inbound) (*model.Inbound,
var oldSettings map[string]any
_ = json.Unmarshal([]byte(oldInbound.Settings), &oldSettings)
emailToCreated := map[string]int64{}
+ emailToUpdated := map[string]int64{}
if oldSettings != nil {
if oc, ok := oldSettings["clients"].([]any); ok {
for _, it := range oc {
@@ -360,6 +361,12 @@ func (s *InboundService) UpdateInbound(inbound *model.Inbound) (*model.Inbound,
case int64:
emailToCreated[email] = v
}
+ switch v := m["updated_at"].(type) {
+ case float64:
+ emailToUpdated[email] = int64(v)
+ case int64:
+ emailToUpdated[email] = v
+ }
}
}
}
@@ -379,7 +386,12 @@ func (s *InboundService) UpdateInbound(inbound *model.Inbound) (*model.Inbound,
m["created_at"] = now
}
}
- m["updated_at"] = now
+ // Preserve client's updated_at if present; do not bump on parent inbound update
+ if _, hasUpdated := m["updated_at"]; !hasUpdated {
+ if v, ok4 := emailToUpdated[email]; ok4 && v > 0 {
+ m["updated_at"] = v
+ }
+ }
nSlice[i] = m
}
}
From d7882c25d14d8cbadb6a310f500311a19b75c386 Mon Sep 17 00:00:00 2001
From: MHSanaei
Date: Thu, 4 Sep 2025 12:07:39 +0200
Subject: [PATCH 03/11] removed domainMatcher
---
web/html/modals/xray_rule_modal.html | 9 ---------
1 file changed, 9 deletions(-)
diff --git a/web/html/modals/xray_rule_modal.html b/web/html/modals/xray_rule_modal.html
index 336a9d81..32a3f80c 100644
--- a/web/html/modals/xray_rule_modal.html
+++ b/web/html/modals/xray_rule_modal.html
@@ -1,11 +1,6 @@
{{define "modals/ruleModal"}}
-
-
- [[ dm ]]
-
-
@@ -123,7 +118,6 @@
confirm: null,
rule: {
type: "field",
- domainMatcher: "",
domain: "",
ip: "",
port: "",
@@ -157,7 +151,6 @@
this.confirm = confirm;
this.visible = true;
if (isEdit) {
- this.rule.domainMatcher = rule.domainMatcher;
this.rule.domain = rule.domain ? rule.domain.join(',') : [];
this.rule.ip = rule.ip ? rule.ip.join(',') : [];
this.rule.port = rule.port;
@@ -172,7 +165,6 @@
this.rule.balancerTag = rule.balancerTag ? rule.balancerTag : "";
} else {
this.rule = {
- domainMatcher: "",
domain: "",
ip: "",
port: "",
@@ -214,7 +206,6 @@
rule = {};
newRule = {};
rule.type = "field";
- rule.domainMatcher = value.domainMatcher;
rule.domain = value.domain.length > 0 ? value.domain.split(',') : [];
rule.ip = value.ip.length > 0 ? value.ip.split(',') : [];
rule.port = value.port;
From da6b89fdcd2270aa116297d9ff620b6331f39df9 Mon Sep 17 00:00:00 2001
From: "Danil S." <135337715+shishkevichd@users.noreply.github.com>
Date: Thu, 4 Sep 2025 17:11:52 +0700
Subject: [PATCH 04/11] chore: login improvements (#3408)
- added client-side form validation
- now with slow internet otp input does not appear later than all input
---
web/html/login.html | 159 +++++++++++++++++++++++++-------------------
1 file changed, 89 insertions(+), 70 deletions(-)
diff --git a/web/html/login.html b/web/html/login.html
index b6dfc299..968aa0bc 100644
--- a/web/html/login.html
+++ b/web/html/login.html
@@ -466,71 +466,83 @@
-
+
-
-
-
-
-
- {{ i18n "pages.settings.language" }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {{ i18n "pages.login.hello" }}
- {{ i18n "pages.login.title" }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- [[ loading ? '' : '{{ i18n "login" }}' ]]
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+ {{ i18n "pages.settings.language" }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ i18n "pages.login.hello" }}
+ {{ i18n "pages.login.title" }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ [[ loadingStates.spinning ? '' : '{{ i18n "login" }}' ]]
+
+
+
+
+
+
+
+
+
@@ -544,7 +556,10 @@
el: '#app',
data: {
themeSwitcher,
- loading: false,
+ loadingStates: {
+ fetched: false,
+ spinning: false
+ },
user: {
username: "",
password: "",
@@ -559,19 +574,23 @@
},
methods: {
async login() {
- this.loading = true;
+ this.loadingStates.spinning = true;
+
const msg = await HttpUtil.post('/login', this.user);
- this.loading = false;
+
if (msg.success) {
location.href = basePath + 'panel/';
}
+
+ this.loadingStates.spinning = false;
},
async getTwoFactorEnable() {
- this.loading = true;
const msg = await HttpUtil.post('/getTwoFactorEnable');
- this.loading = false;
+
if (msg.success) {
this.twoFactorEnable = msg.obj;
+ this.loadingStates.fetched = true;
+
return msg.obj;
}
},
@@ -615,4 +634,4 @@
}
});
-{{ template "page/body_end" .}}
+{{ template "page/body_end" .}}
\ No newline at end of file
From b008ff4ad236f20f0937dd02e747ca6581e776f3 Mon Sep 17 00:00:00 2001
From: Sanaei
Date: Sun, 7 Sep 2025 22:35:38 +0200
Subject: [PATCH 05/11] Vlessenc (#3426)
* mlkem768
* VlessEnc
---
database/model/model.go | 7 ++++
sub/subController.go | 5 +--
sub/subJsonService.go | 14 +++++--
sub/subService.go | 6 +++
web/assets/js/model/inbound.js | 45 +++++++++++++++++-----
web/assets/js/model/outbound.js | 8 ++--
web/controller/server.go | 10 +++++
web/html/form/outbound.html | 5 +++
web/html/form/protocol/vless.html | 24 +++++++++++-
web/html/form/tls_settings.html | 8 ++--
web/html/inbounds.html | 6 +--
web/html/modals/inbound_info_modal.html | 6 +++
web/html/modals/inbound_modal.html | 48 ++++++++++++++++++------
web/service/server.go | 50 +++++++++++++++++++++++++
web/translation/translate.ar_EG.toml | 1 +
web/translation/translate.en_US.toml | 1 +
web/translation/translate.es_ES.toml | 1 +
web/translation/translate.fa_IR.toml | 1 +
web/translation/translate.id_ID.toml | 1 +
web/translation/translate.ja_JP.toml | 1 +
web/translation/translate.pt_BR.toml | 1 +
web/translation/translate.ru_RU.toml | 1 +
web/translation/translate.tr_TR.toml | 1 +
web/translation/translate.uk_UA.toml | 1 +
web/translation/translate.vi_VN.toml | 3 +-
web/translation/translate.zh_CN.toml | 1 +
web/translation/translate.zh_TW.toml | 1 +
27 files changed, 215 insertions(+), 42 deletions(-)
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 c91dbd11..1fc8ea19 100644
--- a/web/assets/js/model/inbound.js
+++ b/web/assets/js/model/inbound.js
@@ -1301,6 +1301,7 @@ class Inbound extends XrayCommonClass {
const security = forceTls == 'same' ? this.stream.security : forceTls;
const params = new Map();
params.set("type", this.stream.network);
+ params.set("encryption", this.settings.encryption);
switch (type) {
case "tcp":
const tcp = this.stream.tcp;
@@ -1859,13 +1860,16 @@ Inbound.VLESSSettings = class extends Inbound.Settings {
constructor(
protocol,
vlesses = [new Inbound.VLESSSettings.VLESS()],
- decryption = 'none',
- fallbacks = []
+ decryption = "none",
+ encryption = "",
+ fallbacks = [],
) {
super(protocol);
this.vlesses = vlesses;
this.decryption = decryption;
+ this.encryption = encryption;
this.fallbacks = fallbacks;
+ this.selectedAuth = "X25519, not Post-Quantum";
}
addFallback() {
@@ -1876,22 +1880,43 @@ Inbound.VLESSSettings = class extends Inbound.Settings {
this.fallbacks.splice(index, 1);
}
- // decryption should be set to static value
static fromJson(json = {}) {
- return new Inbound.VLESSSettings(
+ const obj = new Inbound.VLESSSettings(
Protocols.VLESS,
- json.clients.map(client => Inbound.VLESSSettings.VLESS.fromJson(client)),
- json.decryption || 'none',
- Inbound.VLESSSettings.Fallback.fromJson(json.fallbacks),);
+ (json.clients || []).map(client => Inbound.VLESSSettings.VLESS.fromJson(client)),
+ json.decryption,
+ json.encryption,
+ Inbound.VLESSSettings.Fallback.fromJson(json.fallbacks || [])
+ );
+ obj.selectedAuth = json.selectedAuth || "X25519, not Post-Quantum";
+ return obj;
}
+
toJson() {
- return {
+ const json = {
clients: Inbound.VLESSSettings.toJsonArray(this.vlesses),
- decryption: this.decryption,
- fallbacks: Inbound.VLESSSettings.toJsonArray(this.fallbacks),
};
+
+ if (this.decryption) {
+ json.decryption = this.decryption;
+ }
+
+ if (this.encryption) {
+ json.encryption = this.encryption;
+ }
+
+ if (this.fallbacks && this.fallbacks.length > 0) {
+ json.fallbacks = Inbound.VLESSSettings.toJsonArray(this.fallbacks);
+ }
+ if (this.selectedAuth) {
+ json.selectedAuth = this.selectedAuth;
+ }
+
+ return json;
}
+
+
};
Inbound.VLESSSettings.VLESS = class extends XrayCommonClass {
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 2d2f741e..b1174b8f 100644
--- a/web/controller/server.go
+++ b/web/controller/server.go
@@ -55,6 +55,7 @@ func (a *ServerController) initRouter(g *gin.RouterGroup) {
g.POST("/getNewX25519Cert", a.getNewX25519Cert)
g.POST("/getNewmldsa65", a.getNewmldsa65)
g.POST("/getNewEchCert", a.getNewEchCert)
+ g.POST("/getNewVlessEnc", a.getNewVlessEnc)
}
func (a *ServerController) refreshStatus() {
@@ -266,3 +267,12 @@ func (a *ServerController) getNewEchCert(c *gin.Context) {
}
jsonObj(c, cert, nil)
}
+
+func (a *ServerController) getNewVlessEnc(c *gin.Context) {
+ out, err := a.serverService.GetNewVlessEnc()
+ if err != nil {
+ 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 3cebda6e..6f421731 100644
--- a/web/html/form/protocol/vless.html
+++ b/web/html/form/protocol/vless.html
@@ -18,7 +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 dfccdd70..81ef1b39 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 a15172f3..4110c244 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 b77e74e2..a7a59c99 100644
--- a/web/html/modals/inbound_modal.html
+++ b/web/html/modals/inbound_modal.html
@@ -1,9 +1,7 @@
{{define "modals/inboundModal"}}
-
+
{{template "form/inbound"}}
-{{end}}
+{{end}}
\ No newline at end of file
diff --git a/web/service/server.go b/web/service/server.go
index 2dc83d77..3078e88b 100644
--- a/web/service/server.go
+++ b/web/service/server.go
@@ -871,3 +871,53 @@ func (s *ServerService) GetNewEchCert(sni string) (interface{}, error) {
"echConfigList": configList,
}, nil
}
+
+type AuthBlock struct {
+ Label string `json:"label"`
+ Decryption string `json:"decryption"`
+ Encryption string `json:"encryption"`
+}
+
+func (s *ServerService) GetNewVlessEnc() (any, error) {
+ cmd := exec.Command(xray.GetBinaryPath(), "vlessenc")
+ var out bytes.Buffer
+ cmd.Stdout = &out
+ if err := cmd.Run(); err != nil {
+ return nil, err
+ }
+
+ lines := strings.Split(out.String(), "\n")
+
+ var blocks []AuthBlock
+ var current *AuthBlock
+
+ for _, line := range lines {
+ line = strings.TrimSpace(line)
+ if strings.HasPrefix(line, "Authentication:") {
+ if current != nil {
+ blocks = append(blocks, *current)
+ }
+ current = &AuthBlock{Label: strings.TrimSpace(strings.TrimPrefix(line, "Authentication:"))}
+ } else if strings.HasPrefix(line, `"decryption"`) || strings.HasPrefix(line, `"encryption"`) {
+ parts := strings.SplitN(line, ":", 2)
+ if len(parts) == 2 && current != nil {
+ key := strings.Trim(parts[0], `" `)
+ val := strings.Trim(parts[1], `" `)
+ switch key {
+ case "decryption":
+ current.Decryption = val
+ case "encryption":
+ current.Encryption = val
+ }
+ }
+ }
+ }
+
+ if current != nil {
+ blocks = append(blocks, *current)
+ }
+
+ return map[string]any{
+ "auths": blocks,
+ }, nil
+}
diff --git a/web/translation/translate.ar_EG.toml b/web/translation/translate.ar_EG.toml
index dd5618cb..9f11a30c 100644
--- a/web/translation/translate.ar_EG.toml
+++ b/web/translation/translate.ar_EG.toml
@@ -267,6 +267,7 @@
"trafficGetError" = "خطأ في الحصول على حركات المرور"
"getNewX25519CertError" = "حدث خطأ أثناء الحصول على شهادة X25519."
"getNewmldsa65Error" = "حدث خطاء في الحصول على mldsa65."
+"getNewVlessEncError" = "حدث خطأ أثناء الحصول على VlessEnc."
[pages.inbounds.stream.general]
"request" = "طلب"
diff --git a/web/translation/translate.en_US.toml b/web/translation/translate.en_US.toml
index 89f127a8..f802dd6d 100644
--- a/web/translation/translate.en_US.toml
+++ b/web/translation/translate.en_US.toml
@@ -267,6 +267,7 @@
"trafficGetError" = "Error getting traffics."
"getNewX25519CertError" = "Error while obtaining the X25519 certificate."
"getNewmldsa65Error" = "Error while obtaining mldsa65."
+"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 070b6b57..80ddd98a 100644
--- a/web/translation/translate.es_ES.toml
+++ b/web/translation/translate.es_ES.toml
@@ -267,6 +267,7 @@
"trafficGetError" = "Error al obtener los tráficos"
"getNewX25519CertError" = "Error al obtener el certificado X25519."
"getNewmldsa65Error" = "Error al obtener el certificado mldsa65."
+"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 5c949928..778dd528 100644
--- a/web/translation/translate.fa_IR.toml
+++ b/web/translation/translate.fa_IR.toml
@@ -267,6 +267,7 @@
"trafficGetError" = "خطا در دریافت ترافیکها"
"getNewX25519CertError" = "خطا در دریافت گواهی X25519."
"getNewmldsa65Error" = "خطا در دریافت گواهی mldsa65."
+"getNewVlessEncError" = "خطا در دریافت گواهی VlessEnc."
[pages.inbounds.stream.general]
"request" = "درخواست"
diff --git a/web/translation/translate.id_ID.toml b/web/translation/translate.id_ID.toml
index 4dc8e378..2a5b568b 100644
--- a/web/translation/translate.id_ID.toml
+++ b/web/translation/translate.id_ID.toml
@@ -267,6 +267,7 @@
"trafficGetError" = "Gagal mendapatkan data lalu lintas"
"getNewX25519CertError" = "Terjadi kesalahan saat mendapatkan sertifikat X25519."
"getNewmldsa65Error" = "Terjadi kesalahan saat mendapatkan sertifikat mldsa65."
+"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 54479232..7af0a339 100644
--- a/web/translation/translate.ja_JP.toml
+++ b/web/translation/translate.ja_JP.toml
@@ -267,6 +267,7 @@
"trafficGetError" = "トラフィックの取得中にエラーが発生しました"
"getNewX25519CertError" = "X25519証明書の取得中にエラーが発生しました。"
"getNewmldsa65Error" = "mldsa65証明書の取得中にエラーが発生しました。"
+"getNewVlessEncError" = "VlessEnc証明書の取得中にエラーが発生しました。"
[pages.inbounds.stream.general]
"request" = "リクエスト"
diff --git a/web/translation/translate.pt_BR.toml b/web/translation/translate.pt_BR.toml
index a3aac778..f61f8995 100644
--- a/web/translation/translate.pt_BR.toml
+++ b/web/translation/translate.pt_BR.toml
@@ -267,6 +267,7 @@
"trafficGetError" = "Erro ao obter tráfegos"
"getNewX25519CertError" = "Erro ao obter o certificado X25519."
"getNewmldsa65Error" = "Erro ao obter o certificado mldsa65."
+"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 718edb51..060b7334 100644
--- a/web/translation/translate.ru_RU.toml
+++ b/web/translation/translate.ru_RU.toml
@@ -267,6 +267,7 @@
"trafficGetError" = "Ошибка получения данных о трафике"
"getNewX25519CertError" = "Ошибка при получении сертификата X25519."
"getNewmldsa65Error" = "Ошибка при получении сертификата mldsa65."
+"getNewVlessEncError" = "Ошибка при получении сертификата VlessEnc."
[pages.inbounds.stream.general]
"request" = "Запрос"
diff --git a/web/translation/translate.tr_TR.toml b/web/translation/translate.tr_TR.toml
index 047d9d57..ac10bf65 100644
--- a/web/translation/translate.tr_TR.toml
+++ b/web/translation/translate.tr_TR.toml
@@ -267,6 +267,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."
+"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 3dc5b3e7..4005f14f 100644
--- a/web/translation/translate.uk_UA.toml
+++ b/web/translation/translate.uk_UA.toml
@@ -267,6 +267,7 @@
"trafficGetError" = "Помилка отримання даних про трафік"
"getNewX25519CertError" = "Помилка при отриманні сертифіката X25519."
"getNewmldsa65Error" = "Помилка при отриманні сертифіката mldsa65."
+"getNewVlessEncError" = "Помилка при отриманні сертифіката VlessEnc."
[pages.inbounds.stream.general]
"request" = "Запит"
diff --git a/web/translation/translate.vi_VN.toml b/web/translation/translate.vi_VN.toml
index aa0009eb..66ed38ce 100644
--- a/web/translation/translate.vi_VN.toml
+++ b/web/translation/translate.vi_VN.toml
@@ -266,7 +266,8 @@
"resetInboundClientTrafficSuccess" = "Đã đặt lại lưu lượng"
"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 tôi mldsa65."
+"getNewmldsa65Error" = "Lỗi khi lấy chứng chỉ mldsa65."
+"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 01844f13..5875add9 100644
--- a/web/translation/translate.zh_CN.toml
+++ b/web/translation/translate.zh_CN.toml
@@ -267,6 +267,7 @@
"trafficGetError" = "获取流量数据时出错"
"getNewX25519CertError" = "获取X25519证书时出错。"
"getNewmldsa65Error" = "获取mldsa65证书时出错。"
+"getNewVlessEncError" = "获取VlessEnc证书时出错。"
[pages.inbounds.stream.general]
"request" = "请求"
diff --git a/web/translation/translate.zh_TW.toml b/web/translation/translate.zh_TW.toml
index f3121c69..6843e9ee 100644
--- a/web/translation/translate.zh_TW.toml
+++ b/web/translation/translate.zh_TW.toml
@@ -267,6 +267,7 @@
"trafficGetError" = "取得流量資料時發生錯誤"
"getNewX25519CertError" = "取得X25519憑證時發生錯誤。"
"getNewmldsa65Error" = "取得mldsa65憑證時發生錯誤。"
+"getNewVlessEncError" = "取得VlessEnc憑證時發生錯誤。"
[pages.inbounds.stream.general]
"request" = "請求"
From e5126806d7d6a9759ebfae84ab7d50adb13347e4 Mon Sep 17 00:00:00 2001
From: mhsanaei
Date: Sun, 7 Sep 2025 22:45:20 +0200
Subject: [PATCH 06/11] xray core v25.9.5
---
.github/workflows/release.yml | 2 +-
DockerInit.sh | 2 +-
go.mod | 21 +++++++++---------
go.sum | 42 ++++++++++++++++++-----------------
4 files changed, 35 insertions(+), 32 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 435391df..cecdc807 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -84,7 +84,7 @@ jobs:
cd x-ui/bin
# Download dependencies
- Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.8.29/"
+ Xray_URL="https://github.com/XTLS/Xray-core/releases/download/v25.9.5/"
if [ "${{ matrix.platform }}" == "amd64" ]; then
wget -q ${Xray_URL}Xray-linux-64.zip
unzip Xray-linux-64.zip
diff --git a/DockerInit.sh b/DockerInit.sh
index 10d4c121..d08eaf61 100755
--- a/DockerInit.sh
+++ b/DockerInit.sh
@@ -27,7 +27,7 @@ case $1 in
esac
mkdir -p build/bin
cd build/bin
-wget -q "https://github.com/XTLS/Xray-core/releases/download/v25.8.29/Xray-linux-${ARCH}.zip"
+wget -q "https://github.com/XTLS/Xray-core/releases/download/v25.9.5/Xray-linux-${ARCH}.zip"
unzip "Xray-linux-${ARCH}.zip"
rm -f "Xray-linux-${ARCH}.zip" geoip.dat geosite.dat
mv xray "xray-linux-${FNAME}"
diff --git a/go.mod b/go.mod
index bd265bf9..9277a466 100644
--- a/go.mod
+++ b/go.mod
@@ -14,10 +14,10 @@ require (
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7
github.com/pelletier/go-toml/v2 v2.2.4
github.com/robfig/cron/v3 v3.0.1
- github.com/shirou/gopsutil/v4 v4.25.7
+ github.com/shirou/gopsutil/v4 v4.25.8
github.com/valyala/fasthttp v1.65.0
github.com/xlzd/gotp v0.1.0
- github.com/xtls/xray-core v1.250803.1-0.20250829143322-81b7cd718ad5
+ github.com/xtls/xray-core v1.250905.0
go.uber.org/atomic v1.11.0
golang.org/x/crypto v0.41.0
golang.org/x/text v0.28.0
@@ -28,7 +28,8 @@ require (
require (
github.com/andybalholm/brotli v1.2.0 // indirect
- github.com/bytedance/sonic v1.14.0 // indirect
+ github.com/bytedance/gopkg v0.1.3 // indirect
+ github.com/bytedance/sonic v1.14.1 // indirect
github.com/bytedance/sonic/loader v0.3.0 // indirect
github.com/cloudflare/circl v1.6.1 // indirect
github.com/cloudwego/base64x v0.1.6 // indirect
@@ -67,8 +68,8 @@ require (
github.com/refraction-networking/utls v1.8.0 // indirect
github.com/riobard/go-bloom v0.0.0-20200614022211-cdc8013cb5b3 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
- github.com/sagernet/sing v0.7.5 // indirect
- github.com/sagernet/sing-shadowsocks v0.2.8 // indirect
+ github.com/sagernet/sing v0.7.7 // indirect
+ github.com/sagernet/sing-shadowsocks v0.2.9 // indirect
github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771 // indirect
github.com/tklauser/go-sysconf v0.3.15 // indirect
github.com/tklauser/numcpus v0.10.0 // indirect
@@ -79,16 +80,16 @@ require (
github.com/valyala/fastjson v1.6.4 // indirect
github.com/vishvananda/netlink v1.3.1 // indirect
github.com/vishvananda/netns v0.0.5 // indirect
- github.com/xtls/reality v0.0.0-20250828044527-046fad5ab64f // indirect
+ github.com/xtls/reality v0.0.0-20250904214705-431b6ff8c67c // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.uber.org/mock v0.6.0 // indirect
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect
- golang.org/x/arch v0.20.0 // indirect
+ golang.org/x/arch v0.21.0 // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/net v0.43.0 // indirect
- golang.org/x/sync v0.16.0 // indirect
- golang.org/x/sys v0.35.0 // indirect
- golang.org/x/time v0.12.0 // indirect
+ golang.org/x/sync v0.17.0 // indirect
+ golang.org/x/sys v0.36.0 // indirect
+ golang.org/x/time v0.13.0 // indirect
golang.org/x/tools v0.36.0 // indirect
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect
golang.zx2c4.com/wireguard v0.0.0-20250521234502-f333402bd9cb // indirect
diff --git a/go.sum b/go.sum
index a285204d..d5ece387 100644
--- a/go.sum
+++ b/go.sum
@@ -2,8 +2,10 @@ github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ=
github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
-github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ=
-github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
+github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M=
+github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM=
+github.com/bytedance/sonic v1.14.1 h1:FBMC0zVz5XUmE4z9wF4Jey0An5FueFvOsTKKKtwIl7w=
+github.com/bytedance/sonic v1.14.1/go.mod h1:gi6uhQLMbTdeP0muCnrjHLeCUPyb70ujhnNlhOylAFc=
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
@@ -132,14 +134,14 @@ github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
-github.com/sagernet/sing v0.7.5 h1:gNMwZCLPqR+4e0g6dwi0sSsrvOmoMjpZgqxKsuJZatc=
-github.com/sagernet/sing v0.7.5/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
-github.com/sagernet/sing-shadowsocks v0.2.8 h1:PURj5PRoAkqeHh2ZW205RWzN9E9RtKCVCzByXruQWfE=
-github.com/sagernet/sing-shadowsocks v0.2.8/go.mod h1:lo7TWEMDcN5/h5B8S0ew+r78ZODn6SwVaFhvB6H+PTI=
+github.com/sagernet/sing v0.7.7 h1:o46FzVZS+wKbBMEkMEdEHoVZxyM9jvfRpKXc7pEgS/c=
+github.com/sagernet/sing v0.7.7/go.mod h1:ARkL0gM13/Iv5VCZmci/NuoOlePoIsW0m7BWfln/Hak=
+github.com/sagernet/sing-shadowsocks v0.2.9 h1:Paep5zCszRKsEn8587O0MnhFWKJwDW1Y4zOYYlIxMkM=
+github.com/sagernet/sing-shadowsocks v0.2.9/go.mod h1:TE/Z6401Pi8tgr0nBZcM/xawAI6u3F6TTbz4nH/qw+8=
github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771 h1:emzAzMZ1L9iaKCTxdy3Em8Wv4ChIAGnfiz18Cda70g4=
github.com/seiflotfy/cuckoofilter v0.0.0-20240715131351-a2f2c23f1771/go.mod h1:bR6DqgcAl1zTcOX8/pE2Qkj9XO00eCNqmKb7lXP8EAg=
-github.com/shirou/gopsutil/v4 v4.25.7 h1:bNb2JuqKuAu3tRlPv5piSmBZyMfecwQ+t/ILq+1JqVM=
-github.com/shirou/gopsutil/v4 v4.25.7/go.mod h1:XV/egmwJtd3ZQjBpJVY5kndsiOO4IRqy9TQnmm6VP7U=
+github.com/shirou/gopsutil/v4 v4.25.8 h1:NnAsw9lN7587WHxjJA9ryDnqhJpFH6A+wagYWTOH970=
+github.com/shirou/gopsutil/v4 v4.25.8/go.mod h1:q9QdMmfAOVIw7a+eF86P7ISEU6ka+NLgkUxlopV4RwI=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@@ -172,10 +174,10 @@ github.com/vishvananda/netns v0.0.5 h1:DfiHV+j8bA32MFM7bfEunvT8IAqQ/NzSJHtcmW5zd
github.com/vishvananda/netns v0.0.5/go.mod h1:SpkAiCQRtJ6TvvxPnOSyH3BMl6unz3xZlaprSwhNNJM=
github.com/xlzd/gotp v0.1.0 h1:37blvlKCh38s+fkem+fFh7sMnceltoIEBYTVXyoa5Po=
github.com/xlzd/gotp v0.1.0/go.mod h1:ndLJ3JKzi3xLmUProq4LLxCuECL93dG9WASNLpHz8qg=
-github.com/xtls/reality v0.0.0-20250828044527-046fad5ab64f h1:o1Kryl9qEYYzNep9RId9DM1kBn8tBrcK5UJnti/l0NI=
-github.com/xtls/reality v0.0.0-20250828044527-046fad5ab64f/go.mod h1:XxvnCCgBee4WWE0bc4E+a7wbk8gkJ/rS0vNVNtC5qp0=
-github.com/xtls/xray-core v1.250803.1-0.20250829143322-81b7cd718ad5 h1:rBqCVgic8yIUVHB4h26K8JNuwJuNj45egsdXxwEvA7E=
-github.com/xtls/xray-core v1.250803.1-0.20250829143322-81b7cd718ad5/go.mod h1:WB/73DmN9Vs7lxtx4Xc/D0Ub1VUu06hAh1mMh8JN2uM=
+github.com/xtls/reality v0.0.0-20250904214705-431b6ff8c67c h1:LHLhQY3mKXSpTcQAkjFR4/6ar3rXjQryNeM7khK3AHU=
+github.com/xtls/reality v0.0.0-20250904214705-431b6ff8c67c/go.mod h1:XxvnCCgBee4WWE0bc4E+a7wbk8gkJ/rS0vNVNtC5qp0=
+github.com/xtls/xray-core v1.250905.0 h1:VNL3l/6fcwyeYXJTRbf+TYqPfJYkk0Wmmz7qoQNkxY8=
+github.com/xtls/xray-core v1.250905.0/go.mod h1:WB/73DmN9Vs7lxtx4Xc/D0Ub1VUu06hAh1mMh8JN2uM=
github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU=
github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
@@ -198,28 +200,28 @@ go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y=
go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU=
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba h1:0b9z3AuHCjxk0x/opv64kcgZLBseWJUpBw5I82+2U4M=
go4.org/netipx v0.0.0-20231129151722-fdeea329fbba/go.mod h1:PLyyIXexvUFg3Owu6p/WfdlivPbZJsZdgWZlrGope/Y=
-golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c=
-golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk=
+golang.org/x/arch v0.21.0 h1:iTC9o7+wP6cPWpDWkivCvQFGAHDQ59SrSxsLPcnkArw=
+golang.org/x/arch v0.21.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A=
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
-golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
-golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug=
+golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
-golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k=
+golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
-golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
-golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI=
+golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4=
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 h1:B82qJJgjvYKsXS9jeunTOisW56dUokqW/FOteYJJ/yg=
From dbec28b91529d16241f4917d694288d14c2a28d2 Mon Sep 17 00:00:00 2001
From: mhsanaei
Date: Sun, 7 Sep 2025 22:55:37 +0200
Subject: [PATCH 07/11] remove unsupported cipher method
---
web/assets/js/model/inbound.js | 2 --
1 file changed, 2 deletions(-)
diff --git a/web/assets/js/model/inbound.js b/web/assets/js/model/inbound.js
index 1fc8ea19..c922beb5 100644
--- a/web/assets/js/model/inbound.js
+++ b/web/assets/js/model/inbound.js
@@ -11,10 +11,8 @@ const Protocols = {
const SSMethods = {
AES_256_GCM: 'aes-256-gcm',
- AES_128_GCM: 'aes-128-gcm',
CHACHA20_POLY1305: 'chacha20-poly1305',
CHACHA20_IETF_POLY1305: 'chacha20-ietf-poly1305',
- XCHACHA20_POLY1305: 'xchacha20-poly1305',
XCHACHA20_IETF_POLY1305: 'xchacha20-ietf-poly1305',
BLAKE3_AES_128_GCM: '2022-blake3-aes-128-gcm',
BLAKE3_AES_256_GCM: '2022-blake3-aes-256-gcm',
From 7b039d219efb0b49432f986330b8ae5cd4602e7c Mon Sep 17 00:00:00 2001
From: mhsanaei
Date: Sun, 7 Sep 2025 22:55:46 +0200
Subject: [PATCH 08/11] v2.6.8
---
.github/workflows/release.yml | 2 ++
config/version | 2 +-
x-ui.service | 7 -------
3 files changed, 3 insertions(+), 8 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index cecdc807..84198bbc 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -7,6 +7,8 @@ on:
push:
branches:
- main
+ tags:
+ - "v*.*.*"
paths:
- '.github/workflows/release.yml'
- '**.js'
diff --git a/config/version b/config/version
index ba5c9fca..4484c2b2 100644
--- a/config/version
+++ b/config/version
@@ -1 +1 @@
-2.6.7
\ No newline at end of file
+2.6.8
\ No newline at end of file
diff --git a/x-ui.service b/x-ui.service
index 3b375c3e..e911ef56 100644
--- a/x-ui.service
+++ b/x-ui.service
@@ -10,13 +10,6 @@ WorkingDirectory=/usr/local/x-ui/
ExecStart=/usr/local/x-ui/x-ui
Restart=on-failure
RestartSec=5s
-ProtectHome=tmpfs
-ProtectKernelModules=true
-ProtectControlGroups=true
-ProtectKernelLogs=true
-ProtectHostname=true
-ProtectClock=true
-MemoryDenyWriteExecute=true
[Install]
WantedBy=multi-user.target
From 9fcd0387ca7bffe023274a39293d562d4dc2c84b Mon Sep 17 00:00:00 2001
From: mhsanaei
Date: Mon, 8 Sep 2025 01:06:03 +0200
Subject: [PATCH 09/11] Update release.yml
---
.github/workflows/release.yml | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 84198bbc..53e13c0b 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -10,7 +10,6 @@ on:
tags:
- "v*.*.*"
paths:
- - '.github/workflows/release.yml'
- '**.js'
- '**.css'
- '**.html'
@@ -137,10 +136,13 @@ jobs:
- name: Upload files to GH release
uses: svenstaro/upload-release-action@v2
- if: github.event_name == 'release' && github.event.action == 'published'
+ if: |
+ (github.event_name == 'release' && github.event.action == 'published') ||
+ (github.event_name == 'push' && startsWith(github.ref, 'refs/tags/'))
with:
repo_token: ${{ secrets.GITHUB_TOKEN }}
tag: ${{ github.ref }}
file: x-ui-linux-${{ matrix.platform }}.tar.gz
asset_name: x-ui-linux-${{ matrix.platform }}.tar.gz
+ overwrite: true
prerelease: true
From 5420e643cf71eb1cb1e14ad224ac88f10e47d58c Mon Sep 17 00:00:00 2001
From: mhsanaei
Date: Mon, 8 Sep 2025 10:08:55 +0200
Subject: [PATCH 10/11] minor change
---
web/assets/js/model/inbound.js | 9 +++++----
web/html/form/protocol/vless.html | 1 +
web/html/modals/inbound_modal.html | 3 ++-
3 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/web/assets/js/model/inbound.js b/web/assets/js/model/inbound.js
index c922beb5..c2467c36 100644
--- a/web/assets/js/model/inbound.js
+++ b/web/assets/js/model/inbound.js
@@ -1859,15 +1859,16 @@ Inbound.VLESSSettings = class extends Inbound.Settings {
protocol,
vlesses = [new Inbound.VLESSSettings.VLESS()],
decryption = "none",
- encryption = "",
+ encryption = "none",
fallbacks = [],
+ selectedAuth = undefined,
) {
super(protocol);
this.vlesses = vlesses;
this.decryption = decryption;
this.encryption = encryption;
this.fallbacks = fallbacks;
- this.selectedAuth = "X25519, not Post-Quantum";
+ this.selectedAuth = selectedAuth;
}
addFallback() {
@@ -1884,9 +1885,9 @@ Inbound.VLESSSettings = class extends Inbound.Settings {
(json.clients || []).map(client => Inbound.VLESSSettings.VLESS.fromJson(client)),
json.decryption,
json.encryption,
- Inbound.VLESSSettings.Fallback.fromJson(json.fallbacks || [])
+ Inbound.VLESSSettings.Fallback.fromJson(json.fallbacks || []),
+ json.selectedAuth
);
- obj.selectedAuth = json.selectedAuth || "X25519, not Post-Quantum";
return obj;
}
diff --git a/web/html/form/protocol/vless.html b/web/html/form/protocol/vless.html
index 6f421731..69e74285 100644
--- a/web/html/form/protocol/vless.html
+++ b/web/html/form/protocol/vless.html
@@ -22,6 +22,7 @@
+ None
X25519 (not Post-Quantum)
ML-KEM-768 (Post-Quantum)
diff --git a/web/html/modals/inbound_modal.html b/web/html/modals/inbound_modal.html
index a7a59c99..60af57cb 100644
--- a/web/html/modals/inbound_modal.html
+++ b/web/html/modals/inbound_modal.html
@@ -183,7 +183,8 @@
},
clearKeys() {
this.inbound.settings.decryption = 'none';
- this.inbound.settings.encryption = '';
+ this.inbound.settings.encryption = 'none';
+ this.inbound.settings.selectedAuth = undefined;
}
},
From 3edf79e589ae765562f7360b589029ec8f198bc8 Mon Sep 17 00:00:00 2001
From: mhsanaei
Date: Mon, 8 Sep 2025 14:33:04 +0200
Subject: [PATCH 11/11] actions/setup-go@v6
---
.github/workflows/release.yml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 53e13c0b..96ef2d7b 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -39,7 +39,7 @@ jobs:
uses: actions/checkout@v5
- name: Setup Go
- uses: actions/setup-go@v5
+ uses: actions/setup-go@v6
with:
go-version-file: go.mod
check-latest: true
|