Update On Wed Dec 3 19:42:53 CET 2025

This commit is contained in:
github-action[bot]
2025-12-03 19:42:54 +01:00
parent e535633874
commit 2ab53f64a3
315 changed files with 8927 additions and 6561 deletions

View File

@@ -123,19 +123,19 @@ const health_checkurls = [
];
const inbound_type = [
['http', _('HTTP')],
['socks', _('SOCKS')],
['mixed', _('Mixed')],
['shadowsocks', _('Shadowsocks')],
['mieru', _('Mieru')],
['sudoku', _('Sudoku')],
['vmess', _('VMess')],
['vless', _('VLESS')],
['trojan', _('Trojan')],
['anytls', _('AnyTLS')],
['tuic', _('TUIC')],
['hysteria2', _('Hysteria2')],
//['tunnel', _('Tunnel')]
['http', _('HTTP') + ' - ' + _('TCP')],
['socks', _('SOCKS') + ' - ' + _('TCP')],
['mixed', _('Mixed') + ' - ' + _('TCP')],
['shadowsocks', _('Shadowsocks') + ' - ' + _('TCP/UDP')],
['mieru', _('Mieru') + ' - ' + _('TCP/UDP')],
['sudoku', _('Sudoku') + ' - ' + _('TCP')],
['vmess', _('VMess') + ' - ' + _('TCP')],
['vless', _('VLESS') + ' - ' + _('TCP')],
['trojan', _('Trojan') + ' - ' + _('TCP')],
['anytls', _('AnyTLS') + ' - ' + _('TCP')],
['tuic', _('TUIC') + ' - ' + _('UDP')],
['hysteria2', _('Hysteria2') + ' - ' + _('UDP')],
//['tunnel', _('Tunnel') + ' - ' + _('TCP/UDP')]
];
const ip_version = [
@@ -154,23 +154,23 @@ const load_balance_strategy = [
];
const outbound_type = [
['direct', _('DIRECT')],
['http', _('HTTP')],
['socks5', _('SOCKS5')],
['ss', _('Shadowsocks')],
['direct', _('DIRECT') + ' - ' + _('TCP/UDP')],
['http', _('HTTP') + ' - ' + _('TCP')],
['socks5', _('SOCKS5') + ' - ' + _('TCP')],
['ss', _('Shadowsocks') + ' - ' + _('TCP/UDP')],
//['ssr', _('ShadowsocksR')], // Deprecated
['mieru', _('Mieru')],
['sudoku', _('Sudoku')],
['snell', _('Snell')],
['vmess', _('VMess')],
['vless', _('VLESS')],
['trojan', _('Trojan')],
['anytls', _('AnyTLS')],
//['hysteria', _('Hysteria')],
['hysteria2', _('Hysteria2')],
['tuic', _('TUIC')],
['wireguard', _('WireGuard')],
['ssh', _('SSH')]
['mieru', _('Mieru') + ' - ' + _('TCP/UDP')],
['sudoku', _('Sudoku') + ' - ' + _('TCP')],
['snell', _('Snell') + ' - ' + _('TCP')],
['vmess', _('VMess') + ' - ' + _('TCP')],
['vless', _('VLESS') + ' - ' + _('TCP')],
['trojan', _('Trojan') + ' - ' + _('TCP')],
['anytls', _('AnyTLS') + ' - ' + _('TCP')],
//['hysteria', _('Hysteria') + ' - ' + _('UDP')],
['hysteria2', _('Hysteria2') + ' - ' + _('UDP')],
['tuic', _('TUIC') + ' - ' + _('UDP')],
['wireguard', _('WireGuard') + ' - ' + _('UDP')],
['ssh', _('SSH') + ' - ' + _('TCP')]
];
const preset_outbound = {

View File

@@ -7,16 +7,15 @@
'require fchomo as hm';
const CBIDummyCopyValue = form.Value.extend({
__name__: 'CBI.DummyCopyValue',
const CBICopyValue = form.Value.extend({
__name__: 'CBI.CopyValue',
readonly: true,
renderWidget: function(section_id, option_index, cfgvalue) {
renderWidget(section_id, option_index, cfgvalue) {
let node = form.Value.prototype.renderWidget.call(this, section_id, option_index, cfgvalue);
node.classList.add('control-group');
node.firstChild.style.width = '30em';
node.appendChild(E('button', {
class: 'cbi-button cbi-button-add',
@@ -37,6 +36,18 @@ const CBIDummyCopyValue = form.Value.extend({
}, section_id)
}, [ _('Copy') ]));
return node;
}
});
const CBIDummyCopyValue = CBICopyValue.extend({
__name__: 'CBI.DummyCopyValue',
renderWidget(/* ... */) {
let node = CBICopyValue.prototype.renderWidget.apply(this, arguments);
node.firstChild.style.width = '30em';
return node;
},
@@ -314,12 +325,67 @@ return view.extend({
o.modalonly = true;
/* Sudoku fields */
o = s.taboption('field_general', form.Value, 'sudoku_key', _('Key'),
const sudoku_keytypes = [
['sudoku-keypair', _('sudoku-keypair')],
['uuid', _('UUID')]
]
o = s.taboption('field_general', hm.GenValue, 'sudoku_key', _('Key'),
_('The ED25519 master public key or UUID generated by Sudoku.'));
o.hm_options = {
type: sudoku_keytypes[0][0],
callback: function(result) {
if (result.uuid)
return [
[this.option, result.uuid],
['sudoku_client_key', result.uuid]
]
else
return [
[this.option, result.public_key],
['sudoku_client_key', result.private_key]
]
}
}
o.renderWidget = function(section_id, option_index, cfgvalue) {
let node = form.Value.prototype.renderWidget.call(this, section_id, option_index, cfgvalue);
const cbid = this.cbid(section_id) + '._keytype_select';
const selected = this.hm_options.type;
let selectEl = E('select', {
id: cbid,
class: 'cbi-input-select',
style: 'width: 10em',
});
sudoku_keytypes.forEach(([k, v]) => {
selectEl.appendChild(E('option', {
'value': k,
'selected': (k === selected) ? '' : null
}, [ v ]));
});
node.appendChild(E('div', { 'class': 'control-group' }, [
selectEl,
E('button', {
class: 'cbi-button cbi-button-add',
click: ui.createHandlerFn(this, () => {
this.hm_options.type = document.getElementById(cbid).value;
return hm.handleGenKey.call(this, this.hm_options);
})
}, [ _('Generate') ])
]));
return node;
}
o.rmempty = false;
o.depends('type', 'sudoku');
o.modalonly = true;
o = s.taboption('field_general', CBICopyValue, 'sudoku_client_key', _('Client key'));
o.depends('type', 'sudoku');
o.modalonly = true;
o = s.taboption('field_general', form.ListValue, 'sudoku_aead_method', _('Chipher'));
o.default = hm.sudoku_cipher_methods[0][0];
hm.sudoku_cipher_methods.forEach((res) => {
@@ -348,12 +414,6 @@ return view.extend({
o.depends('type', 'sudoku');
o.modalonly = true;
o = s.taboption('field_general', form.Value, 'sudoku_seed', _('Seed'),
_('Keep consistent with the %s.').format(_('Key')));
o.rmempty = false;
o.depends('type', 'sudoku');
o.modalonly = true;
o = s.taboption('field_general', form.Value, 'sudoku_handshake_timeout', _('Handshake timeout'));
o.datatype = 'uinteger';
o.placeholder = 5;
@@ -825,7 +885,7 @@ return view.extend({
o.depends({tls: '1', type: /^(http|socks|mixed|vmess|vless|trojan|anytls|hysteria2|tuic)$/});
o.modalonly = true;
o = s.taboption('field_tls', form.Value, 'tls_ech_config', _('ECH config'),
o = s.taboption('field_tls', CBICopyValue, 'tls_ech_config', _('ECH config'),
_('This ECH parameter needs to be added to the HTTPS record of the domain.'));
o.placeholder = 'AEn+DQBFKwAgACABWIHUGj4u+PIggYXcR5JF0gYk3dCRioBW8uJq9H4mKAAIAAEAAQABAANAEnB1YmxpYy50bHMtZWNoLmRldgAA';
o.depends({tls: '1', type: /^(http|socks|mixed|vmess|vless|trojan|anytls|hysteria2|tuic)$/});
@@ -859,7 +919,7 @@ return view.extend({
o.depends('tls_reality', '1');
o.modalonly = true;
o = s.taboption('field_tls', form.Value, 'tls_reality_public_key', _('REALITY public key'));
o = s.taboption('field_tls', CBICopyValue, 'tls_reality_public_key', _('REALITY public key'));
o.depends('tls_reality', '1');
o.modalonly = true;

View File

@@ -442,6 +442,10 @@ msgstr ""
msgid "Client fingerprint"
msgstr ""
#: htdocs/luci-static/resources/view/fchomo/server.js:374
msgid "Client key"
msgstr ""
#: htdocs/luci-static/resources/view/fchomo/global.js:176
msgid "Client status"
msgstr ""

View File

@@ -453,6 +453,10 @@ msgstr "客户端认证类型"
msgid "Client fingerprint"
msgstr "客户端指纹"
#: htdocs/luci-static/resources/view/fchomo/server.js:374
msgid "Client key"
msgstr "客户端密钥"
#: htdocs/luci-static/resources/view/fchomo/global.js:176
msgid "Client status"
msgstr "客户端状态"

View File

@@ -453,6 +453,10 @@ msgstr "客戶端認證類型"
msgid "Client fingerprint"
msgstr "客戶端指紋"
#: htdocs/luci-static/resources/view/fchomo/server.js:374
msgid "Client key"
msgstr "客戶端密鑰"
#: htdocs/luci-static/resources/view/fchomo/global.js:176
msgid "Client status"
msgstr "客戶端狀態"

View File

@@ -112,7 +112,6 @@ uci.foreach(uciconf, uciserver, (cfg) => {
"padding-min": strToInt(cfg.sudoku_padding_min),
"padding-max": strToInt(cfg.sudoku_padding_max),
"table-type": cfg.sudoku_table_type,
seed: cfg.sudoku_seed,
"handshake-timeout": strToInt(cfg.sudoku_handshake_timeout) ?? null,
/* Tuic */

View File

@@ -44,7 +44,7 @@ const methods = {
args: { type: 'type', params: 'params' },
call: function(req) {
/* https://github.com/MetaCubeX/mihomo/blob/Alpha/component/generator/cmd.go */
if (!(req.args?.type in ['uuid', 'reality-keypair', 'wg-keypair', 'ech-keypair', 'vless-mlkem768', 'vless-x25519']))
if (!(req.args?.type in ['uuid', 'reality-keypair', 'wg-keypair', 'ech-keypair', 'vless-mlkem768', 'vless-x25519', 'sudoku-keypair']))
return { result: false, error: 'illegal type' };
const type = req.args?.type;
@@ -55,7 +55,7 @@ const methods = {
for (let line = fd.read('line'); length(line); line = fd.read('line')) {
if (type === 'uuid')
result.uuid = trim(line);
else if (type in ['reality-keypair', 'wg-keypair']) {
else if (type in ['reality-keypair', 'wg-keypair', 'sudoku-keypair']) {
let priv = match(trim(line), /PrivateKey: (.*)/);
if (priv)
result.private_key = priv[1];

View File

@@ -79,6 +79,7 @@ config router_access_control
list 'cgroup' 'services/sysntpd'
list 'cgroup' 'services/tailscale'
list 'cgroup' 'services/zerotier'
option 'dns' '0'
option 'proxy' '0'
config router_access_control

View File

@@ -195,6 +195,7 @@ config router_access_control
list 'cgroup' 'services/sysntpd'
list 'cgroup' 'services/tailscale'
list 'cgroup' 'services/zerotier'
option 'dns' '0'
option 'proxy' '0'
config router_access_control

View File

@@ -21,13 +21,13 @@ define Download/geoip
HASH:=2445b44d9ae3ab9a867c9d1e0e244646c4c378622e14b9afaf3658ecf46a40b9
endef
GEOSITE_VER:=20251202060244
GEOSITE_VER:=20251203115157
GEOSITE_FILE:=dlc.dat.$(GEOSITE_VER)
define Download/geosite
URL:=https://github.com/v2fly/domain-list-community/releases/download/$(GEOSITE_VER)/
URL_FILE:=dlc.dat
FILE:=$(GEOSITE_FILE)
HASH:=b925be67555a8b31a713759aa999babb674dcce5f803e67ab5b726efad2e8e92
HASH:=0a14ebf9162fd0e3486b15a40025b9c807d2d38dd4379830edbbb113ee75ea80
endef
GEOSITE_IRAN_VER:=202512010051

View File

@@ -1,12 +1,12 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=xray-core
PKG_VERSION:=25.12.1
PKG_VERSION:=25.12.2
PKG_RELEASE:=1
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/XTLS/Xray-core/tar.gz/v$(PKG_VERSION)?
PKG_HASH:=f1ab22b87e9e446d5e96cb00a8593b85826cc8a1bbc960e0eb0081293d6a32ab
PKG_HASH:=e39c40b85decddea0b59719dae33df26aa149ac6fc673e7db9266e731cc2b3ad
PKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>
PKG_LICENSE:=MPL-2.0