diff --git a/luci-app-passwall2/Makefile b/luci-app-passwall2/Makefile
index b07c45b61..1609a0161 100644
--- a/luci-app-passwall2/Makefile
+++ b/luci-app-passwall2/Makefile
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall2
PKG_VERSION:=26.8.7
-PKG_RELEASE:=72
+PKG_RELEASE:=73
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \
diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua
index ad40219e4..fdffb931b 100644
--- a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua
+++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua
@@ -518,8 +518,39 @@ o = s:option(Flag, _n("use_mldsa65Verify"), translate("ML-DSA-65"))
o.default = "0"
o:depends({ [_n("tls")] = true, [_n("reality")] = true })
-o = s:option(Value, _n("cipherSuites"), translate("Cipher Suites"), '***' .. " " .. translate("Configures the list of supported cipher suites, separated by :"))
+o = s:option(DynamicList, _n("cipherSuites"), translate("Cipher Suites"), '***' .. " " .. translate("Configures the list of supported cipher suites."))
+o:value("TLS_AES_128_GCM_SHA256")
+o:value("TLS_AES_256_GCM_SHA384")
+o:value("TLS_CHACHA20_POLY1305_SHA256")
+o:value("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA")
+o:value("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA")
+o:value("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA")
+o:value("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA")
+o:value("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256")
+o:value("TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384")
+o:value("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256")
+o:value("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384")
+o:value("TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256")
+o:value("TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256")
o:depends({ [_n("tls")] = true, [_n("reality")] = false })
+function o.custom_write(self, section, value)
+ local t = {}
+ local t2 = {}
+ if type(value) == "table" then
+ local x
+ for _, x in ipairs(value) do
+ if x and #x > 0 then
+ if not t2[x] then
+ t2[x] = x
+ t[#t+1] = x
+ end
+ end
+ end
+ else
+ t = { value }
+ end
+ m:set(section, self.option:sub(1 + #option_prefix), t)
+end
o = s:option(TextValue, _n("reality_mldsa65Verify"), "ML-DSA-65 " .. translate("Public key"))
o.default = ""
diff --git a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua
index 934c3945a..9c3e39475 100644
--- a/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua
+++ b/luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua
@@ -574,8 +574,39 @@ o.validate = function(self, value)
return value
end
-o = s:option(Value, _n("cipherSuites"), translate("Cipher Suites"), '***' .. " " .. translate("Configures the list of supported cipher suites, separated by :"))
+o = s:option(DynamicList, _n("cipherSuites"), translate("Cipher Suites"), '***' .. " " .. translate("Configures the list of supported cipher suites."))
+o:value("TLS_AES_128_GCM_SHA256")
+o:value("TLS_AES_256_GCM_SHA384")
+o:value("TLS_CHACHA20_POLY1305_SHA256")
+o:value("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA")
+o:value("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA")
+o:value("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA")
+o:value("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA")
+o:value("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256")
+o:value("TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384")
+o:value("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256")
+o:value("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384")
+o:value("TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256")
+o:value("TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256")
o:depends({ [_n("tls")] = true })
+function o.custom_write(self, section, value)
+ local t = {}
+ local t2 = {}
+ if type(value) == "table" then
+ local x
+ for _, x in ipairs(value) do
+ if x and #x > 0 then
+ if not t2[x] then
+ t2[x] = x
+ t[#t+1] = x
+ end
+ end
+ end
+ else
+ t = { value }
+ end
+ m:set(section, self.option:sub(1 + #option_prefix), t)
+end
o = s:option(Flag, _n("ech"), translate("ECH"))
o.default = "0"
diff --git a/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua b/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua
index 238478723..c63b53c40 100644
--- a/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua
+++ b/luci-app-passwall2/luasrc/passwall2/util_sing-box.lua
@@ -96,6 +96,21 @@ local function get_log_level(s)
return s
end
+--[[
+local cipherSuites = {
+ "TLS_AES_128_GCM_SHA256", "TLS_AES_256_GCM_SHA384", "TLS_CHACHA20_POLY1305_SHA256",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"
+}
+local cipherSuites_lookup = {}
+for i, v in ipairs(cipherSuites) do
+ cipherSuites_lookup[v] = true
+end
+]]--
+
function parseDNS(str)
local result_dns_server
-- [proto]://[ip]
@@ -261,7 +276,7 @@ function gen_outbound(flag, node, tag, proxy_table)
fragment = fragment,
record_fragment = record_fragment,
certificate = (node.tls_certificate == "1" and node.tls_certificate_pem ~= "") and split(node.tls_certificate_pem, "\n") or nil,
- cipher_suites = (node.cipherSuites and node.cipherSuites ~= "") and api.split(node.cipherSuites, ":") or nil,
+ cipher_suites = (node.cipherSuites and #node.cipherSuites > 0) and node.cipherSuites or nil,
ech = (node.ech == "1") and (function()
local function get_ech_domain(s) --兼容xray "域名+DNS" 格式ech
local domain, dns = s:match("^([^+]+)%+(.+)$")
diff --git a/luci-app-passwall2/luasrc/passwall2/util_xray.lua b/luci-app-passwall2/luasrc/passwall2/util_xray.lua
index d3031ba90..530670c9c 100644
--- a/luci-app-passwall2/luasrc/passwall2/util_xray.lua
+++ b/luci-app-passwall2/luasrc/passwall2/util_xray.lua
@@ -36,6 +36,21 @@ local function get_log_level(s)
return s
end
+--[[
+local cipherSuites = {
+ "TLS_AES_128_GCM_SHA256", "TLS_AES_256_GCM_SHA384", "TLS_CHACHA20_POLY1305_SHA256",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
+ "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
+ "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
+ "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"
+}
+local cipherSuites_lookup = {}
+for i, v in ipairs(cipherSuites) do
+ cipherSuites_lookup[v] = true
+end
+]]--
+
function parseDNS(str)
local result_dns_server
-- [proto]://[ip]
@@ -195,7 +210,7 @@ function gen_outbound(flag, node, tag, proxy_table)
certificate = api.split(node.tls_certificate_pem, "\n"),
usage = "verify"
} or nil,
- cipherSuites = node.cipherSuites or nil
+ cipherSuites = (node.cipherSuites and #node.cipherSuites > 0) and table.concat(node.cipherSuites, ":") or nil,
} or nil,
realitySettings = (node.stream_security == "reality") and {
serverName = node.tls_serverName,
diff --git a/luci-app-passwall2/luasrc/view/passwall2/global/status_bottom.htm b/luci-app-passwall2/luasrc/view/passwall2/global/status_bottom.htm
index 0a5aea90f..1a07b84e9 100644
--- a/luci-app-passwall2/luasrc/view/passwall2/global/status_bottom.htm
+++ b/luci-app-passwall2/luasrc/view/passwall2/global/status_bottom.htm
@@ -38,12 +38,8 @@
text-align: right;
}
-#cbi-passwall2+.cbi-page-actions.control-group.fixed {
- bottom: 3.3rem;
-}
-
-footer{
-display:block !important;
+.pure-u-1-2, .pure-u-12-24 {
+ width: 50%;
}
@media screen and (max-width: 700px) {
diff --git a/luci-app-passwall2/po/fa/passwall2.po b/luci-app-passwall2/po/fa/passwall2.po
index 8d0f000b4..0cbfa1a05 100644
--- a/luci-app-passwall2/po/fa/passwall2.po
+++ b/luci-app-passwall2/po/fa/passwall2.po
@@ -2441,5 +2441,5 @@ msgstr "تنظیم نشده"
msgid "Cipher Suites"
msgstr "سوئیتهای رمزدار"
-msgid "Configures the list of supported cipher suites, separated by :"
-msgstr "فهرست مجموعههای رمز پشتیبانیشده را که با موارد زیر از هم جدا شدهاند، پیکربندی میکند:"
+msgid "Configures the list of supported cipher suites."
+msgstr "فهرست مجموعههای رمز پشتیبانیشده را پیکربندی میکند."
diff --git a/luci-app-passwall2/po/ru/passwall2.po b/luci-app-passwall2/po/ru/passwall2.po
index 0d3b7c3ab..205665bfe 100644
--- a/luci-app-passwall2/po/ru/passwall2.po
+++ b/luci-app-passwall2/po/ru/passwall2.po
@@ -2439,5 +2439,5 @@ msgstr "Не задано"
msgid "Cipher Suites"
msgstr "Наборы шифров"
-msgid "Configures the list of supported cipher suites, separated by :"
-msgstr "Задает список поддерживаемых наборов шифров, разделенных двоеточием (:)."
+msgid "Configures the list of supported cipher suites."
+msgstr "Задает список поддерживаемых наборов шифров."
diff --git a/luci-app-passwall2/po/zh-cn/passwall2.po b/luci-app-passwall2/po/zh-cn/passwall2.po
index 326e3f825..e6823a2e0 100644
--- a/luci-app-passwall2/po/zh-cn/passwall2.po
+++ b/luci-app-passwall2/po/zh-cn/passwall2.po
@@ -2427,5 +2427,5 @@ msgstr "未设置"
msgid "Cipher Suites"
msgstr "密码套件"
-msgid "Configures the list of supported cipher suites, separated by :"
-msgstr "配置支持的密码套件列表,以冒号 (:) 分隔。"
+msgid "Configures the list of supported cipher suites."
+msgstr "配置支持的密码套件列表。"
diff --git a/luci-app-passwall2/po/zh-tw/passwall2.po b/luci-app-passwall2/po/zh-tw/passwall2.po
index e6962d538..57fc9b651 100644
--- a/luci-app-passwall2/po/zh-tw/passwall2.po
+++ b/luci-app-passwall2/po/zh-tw/passwall2.po
@@ -2433,5 +2433,5 @@ msgstr "未設置"
msgid "Cipher Suites"
msgstr "密碼套件"
-msgid "Configures the list of supported cipher suites, separated by :"
-msgstr "配置支援的密碼套件列表,以冒號 (:) 分隔。"
+msgid "Configures the list of supported cipher suites."
+msgstr "配置支援的密碼套件列表。"
diff --git a/luci-app-ssr-plus/Makefile b/luci-app-ssr-plus/Makefile
index df86b9ba4..e2fb70335 100644
--- a/luci-app-ssr-plus/Makefile
+++ b/luci-app-ssr-plus/Makefile
@@ -4,7 +4,7 @@ LUCI_TITLE:=luci-app-ssr-plus
LUCI_PKGARCH:=all
PKG_NAME:=luci-app-ssr-plus
PKG_VERSION:=196
-PKG_RELEASE:=54
+PKG_RELEASE:=55
PKG_CONFIG_DEPENDS:= \
CONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \
diff --git a/luci-app-ssr-plus/luasrc/view/shadowsocksr/status_bottom.htm b/luci-app-ssr-plus/luasrc/view/shadowsocksr/status_bottom.htm
index fbc6886fc..b301122b3 100644
--- a/luci-app-ssr-plus/luasrc/view/shadowsocksr/status_bottom.htm
+++ b/luci-app-ssr-plus/luasrc/view/shadowsocksr/status_bottom.htm
@@ -38,12 +38,8 @@
text-align: right;
}
-#cbi-shadowsocksr+.cbi-page-actions.control-group.fixed {
- bottom: 3.3rem;
-}
-
-footer{
-display:block !important;
+.pure-u-1-2, .pure-u-12-24 {
+ width: 50%;
}
@media screen and (max-width: 700px) {