🏅 Sync 2026-04-20 20:27:29

This commit is contained in:
github-actions[bot] committed 2026-04-20 20:27:29 +08:00
1 parent 03109ea917
commit ede68af29e
24 files changed
+2286 -2110

No files matched your search

@@ -55,6 +55,13 @@ const congestion_controller = [
['bbr', _('bbr')],
];
const bbr_profiles = [
['', _('Keep default')],
['standard', _('Standard')],
['conservative', _('Conservative')],
['aggressive', _('Aggressive')],
];
const stunserver = [
['stun.fitauto.ru:3478'],
['stun.hot-chilli.net:3478'],
@@ -1715,6 +1722,7 @@ return baseclass.extend({
monospacefonts,
checkurls,
congestion_controller,
bbr_profiles,
stunserver,
dashrepos,
dashrepos_urlparams,
@@ -235,6 +235,11 @@ function renderListeners(s, uciconfig, isClient) {
o.depends('type', 'mieru');
o.modalonly = true;
o = s.taboption('field_general', form.Flag, 'mieru_user_hint_is_mandatory', _('User-hint is mandatory'),);
o.default = o.disabled;
o.depends('type', 'mieru');
o.modalonly = true;
o = s.taboption('field_general', form.Value, 'mieru_traffic_pattern', _('Traffic pattern'),
_('A base64 string is used to fine-tune network behavior.<br/>Please refer to the <a target="_blank" href="%s" rel="noreferrer noopener">document</a>.')
.format('https://github.com/enfein/mieru/blob/main/docs/traffic-pattern.md'));
@@ -545,6 +550,15 @@ function renderListeners(s, uciconfig, isClient) {
o.depends({type: /^(tuic|trusttunnel)$/});
o.modalonly = true;
o = s.taboption('field_general', form.ListValue, 'bbr_profile', _('BBR profile'));
o.default = hm.bbr_profiles[0][0];
hm.bbr_profiles.forEach((res) => {
o.value.apply(o, res);
})
o.depends({congestion_controller: 'bbr'});
o.depends({type: 'hysteria2'});
o.modalonly = true;
o = s.taboption('field_general', form.MultiValue, 'network', _('Network type'));
o.value('tcp', _('TCP'));
o.value('udp', _('UDP'));
@@ -1025,6 +1039,12 @@ function renderListeners(s, uciconfig, isClient) {
o.depends({transport_enabled: '1', transport_type: 'xhttp'});
o.modalonly = true;
o = s.taboption('field_transport', form.Value, 'transport_xhttp_sc_max_buffered_posts', _('Max buffered posts'));
o.datatype = 'uinteger';
o.placeholder = '30';
o.depends({transport_enabled: '1', transport_type: 'xhttp'});
o.modalonly = true;
o = s.taboption('field_transport', form.Value, 'transport_xhttp_sc_stream_up_server_secs', _('stream-up server seconds'));
o.placeholder = '20-80';
o.depends({transport_enabled: '1', transport_type: 'xhttp'});
@@ -278,7 +278,7 @@ return view.extend({
so = ss.taboption('field_general', form.Value, 'hysteria_hop_interval', _('Port hop interval'),
_('In seconds. <code>%s</code> will be used if empty.').format('30'));
so.datatype = 'uinteger';
so.placeholder = '15 OR 15-30';
so.depends('type', 'hysteria2');
so.modalonly = true;
@@ -862,6 +862,15 @@ return view.extend({
so.depends({type: /^(tuic|masque|trusttunnel)$/});
so.modalonly = true;
so = ss.taboption('field_general', form.ListValue, 'bbr_profile', _('BBR profile'));
so.default = hm.bbr_profiles[0][0];
hm.bbr_profiles.forEach((res) => {
so.value.apply(so, res);
})
so.depends({congestion_controller: 'bbr'});
so.depends({type: 'hysteria2'});
so.modalonly = true;
so = ss.taboption('field_general', form.Flag, 'udp', _('UDP'));
so.default = so.disabled;
so.depends({type: /^(direct|socks5|ss|mieru|vmess|vless|trojan|anytls|trusttunnel|masque|wireguard)$/});
@@ -964,7 +973,7 @@ return view.extend({
return true;
}
so.depends({type: /^(http|socks5|vmess|vless|trojan|anytls|hysteria|hysteria2|tuic|trusttunnel)$/});
so.depends({type: /^(http|socks5|vmess|vless|trojan|anytls|hysteria|hysteria2|tuic|masque|trusttunnel)$/});
so.modalonly = true;
so = ss.taboption('field_tls', form.Flag, 'tls_disable_sni', _('Disable SNI'),
@@ -1000,11 +1009,16 @@ return view.extend({
def_alpn = ['h3'];
break;
case 'vmess':
case 'vless':
case 'trojan':
case 'anytls':
def_alpn = ['h2', 'http/1.1'];
break;
case 'vless':
def_alpn = ['h3', 'h2', 'http/1.1'];
break;
case 'masque':
def_alpn = ['h2'];
break;
case 'trusttunnel':
def_alpn = ['h3', 'h2'];
break;
@@ -1017,7 +1031,7 @@ return view.extend({
return true;
}
so.depends({tls: '1', type: /^(vmess|vless|trojan|anytls|hysteria|hysteria2|tuic|trusttunnel)$/});
so.depends({tls: '1', type: /^(vmess|vless|trojan|anytls|hysteria|hysteria2|tuic|masque|trusttunnel)$/});
so.depends({type: 'ss', plugin: 'shadow-tls'});
so.modalonly = true;
@@ -1267,6 +1281,13 @@ return view.extend({
so.depends({transport_enabled: '1', transport_type: 'xhttp'});
so.modalonly = true;
so = ss.taboption('field_transport', form.Value, 'transport_xhttp_sc_min_posts_interval_ms', _('Min posts interval'),
_('In milliseconds.'));
so.datatype = 'uinteger';
so.placeholder = '30';
so.depends({transport_enabled: '1', transport_type: 'xhttp'});
so.modalonly = true;
so = ss.taboption('field_transport', form.Flag, 'transport_xhttp_xmux', _('XMUX'));
so.default = so.disabled;
so.depends({transport_enabled: '1', transport_type: 'xhttp'});
@@ -1297,6 +1318,12 @@ return view.extend({
so.depends('transport_xhttp_xmux', '1');
so.modalonly = true;
so = ss.taboption('field_transport', form.Value, 'transport_xhttp_xmux_keep_alive_period', _('XMUX: ') + _('Keep-alive period'));
so.datatype = 'uinteger';
so.placeholder = '0';
so.depends('transport_xhttp_xmux', '1');
so.modalonly = true;
/* Multiplex fields */ // TCP protocol only
so = ss.taboption('field_general', form.Flag, 'smux_enabled', _('Multiplex'));
so.default = so.disabled;
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff
@@ -506,7 +506,7 @@ uci.foreach(uciconf, ucinode, (cfg) => {
/* Hysteria / Hysteria2 */
ports: isEmpty(cfg.hysteria_ports) ? null : join(',', cfg.hysteria_ports),
"hop-interval": strToInt(cfg.hysteria_hop_interval),
"hop-interval": strToInt(cfg.hysteria_hop_interval), // @DEBUG ERROR data type *utils.IntRanges[uint16]
up: cfg.hysteria_up_mbps ? cfg.hysteria_up_mbps + ' Mbps' : null,
down: cfg.hysteria_down_mbps ? cfg.hysteria_down_mbps + ' Mbps' : null,
obfs: cfg.hysteria_obfs_type,
@@ -608,6 +608,7 @@ uci.foreach(uciconf, ucinode, (cfg) => {
/* Extra fields */
"congestion-controller": cfg.congestion_controller,
"bbr-profile": cfg.bbr_profile,
udp: strToBool(cfg.udp),
"udp-over-tcp": strToBool(cfg.uot),
"udp-over-tcp-version": cfg.uot_version,
@@ -669,13 +670,16 @@ uci.foreach(uciconf, ucinode, (cfg) => {
mode: cfg.transport_xhttp_mode,
"no-grpc-header": strToBool(cfg.transport_xhttp_no_grpc_header),
"x-padding-bytes": cfg.transport_xhttp_x_padding_bytes,
// @bypassing CDN's potential detection /* https://github.com/MetaCubeX/mihomo/commit/2337d70d86fa15efe7b69ee54bff6139ebfabcf6 */
"sc-max-each-post-bytes": strToInt(cfg.transport_xhttp_sc_max_each_post_bytes) || null,
"sc-min-posts-interval-ms": strToInt(cfg.transport_xhttp_sc_min_posts_interval_ms) || null,
"reuse-settings": cfg.transport_xhttp_xmux ? {
"max-concurrency": cfg.transport_xhttp_xmux_max_concurrency,
"max-connections": cfg.transport_xhttp_xmux_max_connections,
"c-max-reuse-times": cfg.transport_xhttp_xmux_max_reuse_times,
"h-max-request-times": cfg.transport_xhttp_xmux_max_request_times,
"h-max-reusable-secs": cfg.transport_xhttp_xmux_max_reusable_secs
"h-max-reusable-secs": cfg.transport_xhttp_xmux_max_reusable_secs,
"h-keep-alive-period": strToInt(cfg.transport_xhttp_xmux_keep_alive_period)
} : null
} : null
} : {}),
@@ -259,6 +259,7 @@ export function parseListener(cfg, isClient, label) {
/* Mieru */
transport: cfg.mieru_transport,
"traffic-pattern": cfg.mieru_traffic_pattern,
"user-hint-is-mandatory": strToBool(cfg.mieru_user_hint_is_mandatory),
/* Sudoku */
key: cfg.sudoku_key,
@@ -321,6 +322,7 @@ export function parseListener(cfg, isClient, label) {
/* Extra fields */
"congestion-controller": cfg.congestion_controller,
"bbr-profile": cfg.bbr_profile,
network: cfg.network,
udp: strToBool(cfg.udp),
@@ -352,6 +354,7 @@ export function parseListener(cfg, isClient, label) {
host: cfg.transport_host,
mode: cfg.transport_xhttp_mode,
"no-sse-header": strToBool(cfg.transport_xhttp_no_sse_header),
"sc-max-buffered-posts": strToInt(cfg.transport_xhttp_sc_max_buffered_posts) || null,
"sc-stream-up-server-secs": cfg.transport_xhttp_sc_stream_up_server_secs,
"sc-max-each-post-bytes": strToInt(cfg.transport_xhttp_sc_max_each_post_bytes) || null,
} : null
+1 -1
View File
@@ -10,6 +10,6 @@ LUCI_PKGARCH:=all
LUCI_DEPENDS:=+appfilter +kmod-oaf +luci-compat
PKG_NAME:=luci-app-oaf
PKG_VERSION:=6.1.4
PKG_RELEASE:=2
PKG_RELEASE:=3
include $(TOPDIR)/feeds/luci/luci.mk
# call BuildPackage - OpenWrt buildroot signature
@@ -1194,17 +1194,24 @@
const hostname = user.hostname || "";
const displayName = nickname || hostname || "--";
if (user.online != 1) {
if (user.online == 0) {
tr.style.color = '#A9A9A9';
}
let onlineStatusHtml = '<span style="opacity: 0.5;"><%:Offline%></span>';
if (user.online == 2) {
onlineStatusHtml = '<span style="color: #1a73e8;"><%:Active%></span>';
} else if (user.online == 1) {
onlineStatusHtml = '<span style="color: green;"><%:Online%></span>';
}
tr.innerHTML = `
<td>
<div>${displayName}</div>
<div style="font-size: 12px; opacity: 0.5;">${user.mac}</div>
</td>
<td>${user.ip || '--'}</td>
<td>${user.online == 1 ? '<span style="color: green;"><%:Online%></span>' : '<span style="opacity: 0.5;"><%:Offline%></span>'}</td>
<td>${onlineStatusHtml}</td>
`;
tbody.appendChild(tr);
});
+1 -1
View File
@@ -8,7 +8,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall
PKG_VERSION:=26.4.15
PKG_RELEASE:=84
PKG_RELEASE:=85
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \
@@ -1072,11 +1072,13 @@ start_socks() {
[ "$log" == "0" ] && log_file=""
local http_port=$(config_n_get $id http_port 0)
local http_config_file="HTTP2SOCKS_${id}.json"
run_socks flag=$id node=$node bind=$bind socks_port=$port config_file=$config_file http_port=$http_port http_config_file=$http_config_file log_file=$log_file
set_cache_var "socks_${id}" "$node"
#自动切换逻辑
local enable_autoswitch=$(config_n_get $id enable_autoswitch 0)
[ "$enable_autoswitch" = "1" ] && [ -z "$(config_n_get $id autoswitch_backup_node)" ] && enable_autoswitch=0
local no_rec=0
[ "$enable_autoswitch" = "1" ] && no_rec=1
NO_REC_PROCESS=$no_rec $APP_PATH/app.sh run_socks flag=$id node=$node bind=$bind socks_port=$port config_file=$config_file http_port=$http_port http_config_file=$http_config_file log_file=$log_file
set_cache_var "socks_${id}" "$node"
#自动切换逻辑
[ "$enable_autoswitch" = "1" ] && $APP_PATH/socks_auto_switch.sh ${id} > /dev/null 2>&1 &
done
}
@@ -93,10 +93,10 @@ test_auto_switch() {
test_node ${main_node}
[ $? -eq 0 ] && {
#主节点正常,切换到主节点
echolog "Socks切换检测:${id}主节点【$(config_n_get $main_node type):[$(config_n_get $main_node remarks)]】正常,切换到主节点!"
$APP_FILE socks_node_switch flag=${id} new_node=${main_node}
echolog "Socks切换检测:端口[${socks_port}] 主节点【$(config_n_get $main_node type):[$(config_n_get $main_node remarks)]】正常,切换到主节点!"
NO_REC_PROCESS=1 $APP_FILE socks_node_switch flag=${id} new_node=${main_node}
[ $? -eq 0 ] && {
echolog "Socks切换检测:${id}节点切换完毕!"
echolog "Socks切换检测:端口[${socks_port}] 节点切换完毕!"
}
return 0
}
@@ -123,7 +123,7 @@ test_auto_switch() {
new_node=$([ "$now_node" = "$main_node" ] && echo "$b_nodes" || echo "$main_node")
msg="切换到$([ "$now_node" = "$main_node" ] && echo 备用节点 || echo 主节点)检测!"
fi
echolog "Socks切换检测:${id}【$(config_n_get $now_node type):[$(config_n_get $now_node remarks)]】异常,$msg"
echolog "Socks切换检测:端口[${socks_port}]【$(config_n_get $now_node type):[$(config_n_get $now_node remarks)]】异常,$msg"
test_node ${new_node}
if [ $? -eq 0 ]; then
# [ "$restore_switch" = "0" ] && {
@@ -131,10 +131,10 @@ test_auto_switch() {
# [ -z "$(echo $b_nodes | grep $main_node)" ] && uci add_list $CONFIG.${id}.autoswitch_backup_node=$main_node
# uci commit $CONFIG
# }
echolog "Socks切换检测:${id}【$(config_n_get $new_node type):[$(config_n_get $new_node remarks)]】正常,切换到此节点!"
$APP_FILE socks_node_switch flag=${id} new_node=${new_node}
echolog "Socks切换检测:端口[${socks_port}]【$(config_n_get $new_node type):[$(config_n_get $new_node remarks)]】正常,切换到此节点!"
NO_REC_PROCESS=1 $APP_FILE socks_node_switch flag=${id} new_node=${new_node}
[ $? -eq 0 ] && {
echolog "Socks切换检测:${id}节点切换完毕!"
echolog "Socks切换检测:端口[${socks_port}] 节点切换完毕!"
}
return 0
else
@@ -49,7 +49,30 @@ local core_has = {
["hysteria2"] = has_hysteria2
}
-- 判断是否过滤节点关键字
local function is_filter_keyword(mode, discard_list, keep_list, value)
local function is_filter_keyword(sub_cfg, value)
local mode = DEFAULT_FILTER_KEYWORD_MODE
local discard_list = DEFAULT_FILTER_KEYWORD_DISCARD_LIST
local keep_list = DEFAULT_FILTER_KEYWORD_KEEP_LIST
if sub_cfg then
local filter_keyword_mode = sub_cfg.filter_keyword_mode or "5" -- 5 is global
if filter_keyword_mode == "0" then
mode = "0"
elseif filter_keyword_mode == "1" then
mode = "1"
discard_list = sub_cfg.filter_discard_list or {}
elseif filter_keyword_mode == "2" then
mode = "2"
keep_list = sub_cfg.filter_keep_list or {}
elseif filter_keyword_mode == "3" then
mode = "3"
keep_list = sub_cfg.filter_keep_list or {}
discard_list = sub_cfg.filter_discard_list or {}
elseif filter_keyword_mode == "4" then
mode = "4"
keep_list = sub_cfg.filter_keep_list or {}
discard_list = sub_cfg.filter_discard_list or {}
end
end
if mode == "1" then
for k,v in ipairs(discard_list) do
if value:find(v, 1, true) then
@@ -472,9 +495,6 @@ end
local function processData(szType, content, add_mode, group, sub_cfg)
--log(2, content, add_mode, group)
local default_allowinsecure = DEFAULT_ALLOWINSECURE
default_filter_keyword_mode = DEFAULT_FILTER_KEYWORD_MODE
default_filter_keyword_discard_list = DEFAULT_FILTER_KEYWORD_DISCARD_LIST
default_filter_keyword_keep_list = DEFAULT_FILTER_KEYWORD_KEEP_LIST
local default_ss_type = DEFAULT_SS_TYPE
local default_trojan_type = DEFAULT_TROJAN_TYPE
local default_vmess_type = DEFAULT_VMESS_TYPE
@@ -484,24 +504,6 @@ local function processData(szType, content, add_mode, group, sub_cfg)
if sub_cfg.allowInsecure and sub_cfg.allowInsecure ~= "1" then
default_allowinsecure = nil
end
local filter_keyword_mode = sub_cfg.filter_keyword_mode or "5" -- 5 is global
if filter_keyword_mode == "0" then
default_filter_keyword_mode = "0"
elseif filter_keyword_mode == "1" then
default_filter_keyword_mode = "1"
default_filter_keyword_discard_list = sub_cfg.filter_discard_list or {}
elseif filter_keyword_mode == "2" then
default_filter_keyword_mode = "2"
default_filter_keyword_keep_list = sub_cfg.filter_keep_list or {}
elseif filter_keyword_mode == "3" then
default_filter_keyword_mode = "3"
default_filter_keyword_keep_list = sub_cfg.filter_keep_list or {}
default_filter_keyword_discard_list = sub_cfg.filter_discard_list or {}
elseif filter_keyword_mode == "4" then
default_filter_keyword_mode = "4"
default_filter_keyword_keep_list = sub_cfg.filter_keep_list or {}
default_filter_keyword_discard_list = sub_cfg.filter_discard_list or {}
end
local ss_type = sub_cfg.ss_type or "global"
if ss_type ~= "global" and core_has[ss_type] then
default_ss_type = ss_type
@@ -2055,7 +2057,7 @@ local function parse_link(raw, add_mode, group, sub_cfg)
log('丢弃节点:' .. result.remarks .. " ,原因:" .. result.error_msg)
elseif not result.type then
log('丢弃节点:' .. result.remarks .. " ,找不到可使用二进制。")
elseif (add_mode == "2" and is_filter_keyword(default_filter_keyword_mode, default_filter_keyword_discard_list, default_filter_keyword_keep_list, result.remarks)) or not result.address or result.remarks == "NULL" or result.address == "127.0.0.1" or
elseif (add_mode == "2" and is_filter_keyword(sub_cfg, result.remarks)) or not result.address or result.remarks == "NULL" or result.address == "127.0.0.1" or
(not datatypes.hostname(result.address) and not (api.is_ip(result.address))) then
log('丢弃过滤节点:' .. result.type .. ' 节点,' .. result.remarks)
else
@@ -456,7 +456,7 @@ ln_run() {
${file_func:-echolog " - ${ln_name}"} "$@" 2>&1 | logger -t PASSWALL_${protocol}_${ln_name} &
fi
fi
[ -n "$NO_REC_PROCESS" ] && return
[ "$NO_REC_PROCESS" = "1" ] && return
process_count=$(ls $TMP_SCRIPT_FUNC_PATH | wc -l)
process_count=$((process_count + 1))
echo "${file_func:-echolog " - ${ln_name}"} $@ >${output}" > $TMP_SCRIPT_FUNC_PATH/$process_count
+1 -1
View File
@@ -7,7 +7,7 @@ include $(TOPDIR)/rules.mk
PKG_NAME:=luci-app-passwall2
PKG_VERSION:=26.4.20
PKG_RELEASE:=38
PKG_RELEASE:=39
PKG_PO_VERSION:=$(PKG_VERSION)
PKG_CONFIG_DEPENDS:= \
@@ -49,7 +49,30 @@ local core_has = {
["hysteria2"] = has_hysteria2
}
-- Determine whether to filter node keywords
local function is_filter_keyword(mode, discard_list, keep_list, value)
local function is_filter_keyword(sub_cfg, value)
local mode = DEFAULT_FILTER_KEYWORD_MODE
local discard_list = DEFAULT_FILTER_KEYWORD_DISCARD_LIST
local keep_list = DEFAULT_FILTER_KEYWORD_KEEP_LIST
if sub_cfg then
local filter_keyword_mode = sub_cfg.filter_keyword_mode or "5" -- 5 is global
if filter_keyword_mode == "0" then
mode = "0"
elseif filter_keyword_mode == "1" then
mode = "1"
discard_list = sub_cfg.filter_discard_list or {}
elseif filter_keyword_mode == "2" then
mode = "2"
keep_list = sub_cfg.filter_keep_list or {}
elseif filter_keyword_mode == "3" then
mode = "3"
keep_list = sub_cfg.filter_keep_list or {}
discard_list = sub_cfg.filter_discard_list or {}
elseif filter_keyword_mode == "4" then
mode = "4"
keep_list = sub_cfg.filter_keep_list or {}
discard_list = sub_cfg.filter_discard_list or {}
end
end
if mode == "1" then
for k,v in ipairs(discard_list) do
if value:find(v, 1, true) then
@@ -449,9 +472,6 @@ end
local function processData(szType, content, add_mode, group, sub_cfg)
--log(2, content, add_mode, group)
local default_allowinsecure = DEFAULT_ALLOWINSECURE
local default_filter_keyword_mode = DEFAULT_FILTER_KEYWORD_MODE
local default_filter_keyword_discard_list = DEFAULT_FILTER_KEYWORD_DISCARD_LIST
local default_filter_keyword_keep_list = DEFAULT_FILTER_KEYWORD_KEEP_LIST
local default_ss_type = DEFAULT_SS_TYPE
local default_trojan_type = DEFAULT_TROJAN_TYPE
local default_vmess_type = DEFAULT_VMESS_TYPE
@@ -461,24 +481,6 @@ local function processData(szType, content, add_mode, group, sub_cfg)
if sub_cfg.allowInsecure and sub_cfg.allowInsecure ~= "1" then
default_allowinsecure = nil
end
local filter_keyword_mode = sub_cfg.filter_keyword_mode or "5" -- 5 is global
if filter_keyword_mode == "0" then
default_filter_keyword_mode = "0"
elseif filter_keyword_mode == "1" then
default_filter_keyword_mode = "1"
default_filter_keyword_discard_list = sub_cfg.filter_discard_list or {}
elseif filter_keyword_mode == "2" then
default_filter_keyword_mode = "2"
default_filter_keyword_keep_list = sub_cfg.filter_keep_list or {}
elseif filter_keyword_mode == "3" then
default_filter_keyword_mode = "3"
default_filter_keyword_keep_list = sub_cfg.filter_keep_list or {}
default_filter_keyword_discard_list = sub_cfg.filter_discard_list or {}
elseif filter_keyword_mode == "4" then
default_filter_keyword_mode = "4"
default_filter_keyword_keep_list = sub_cfg.filter_keep_list or {}
default_filter_keyword_discard_list = sub_cfg.filter_discard_list or {}
end
local ss_type = sub_cfg.ss_type or "global"
if ss_type ~= "global" and core_has[ss_type] then
default_ss_type = ss_type
@@ -2045,7 +2047,7 @@ local function parse_link(raw, add_mode, group, sub_cfg)
log(2, i18n.translatef("Discard node: %s, Reason:", result.remarks) .. " " .. result.error_msg)
elseif not result.type then
log(2, i18n.translatef("Discard node: %s, Reason:", result.remarks) .. " " .. i18n.translatef("No usable binary was found."))
elseif (add_mode == "2" and is_filter_keyword(default_filter_keyword_mode, default_filter_keyword_discard_list, default_filter_keyword_keep_list, result.remarks)) or not result.address or result.remarks == "NULL" or result.address == "127.0.0.1" or
elseif (add_mode == "2" and is_filter_keyword(sub_cfg, result.remarks)) or not result.address or result.remarks == "NULL" or result.address == "127.0.0.1" or
(not datatypes.hostname(result.address) and not (api.is_ip(result.address))) then
log(2, i18n.translatef("Discard filter nodes: %s type node %s", result.type, result.remarks))
else
+4 -4
View File
@@ -1,14 +1,14 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=mihomo-alpha
PKG_VERSION:=2026.04.15
PKG_RELEASE:=3
PKG_VERSION:=2026.04.20
PKG_RELEASE:=4
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git
PKG_SOURCE_VERSION:=6c407f0f9390b19733ae243a2e6e84705576e5b1
PKG_SOURCE_VERSION:=a84724665eb7f989809abe463c05f5723bd24975
PKG_MIRROR_HASH:=skip
PKG_LICENSE:=GPL3.0+
@@ -18,7 +18,7 @@ PKG_BUILD_DEPENDS:=golang/host
PKG_BUILD_PARALLEL:=1
PKG_BUILD_FLAGS:=no-mips16
PKG_BUILD_VERSION:=alpha-6c407f0f
PKG_BUILD_VERSION:=alpha-a8472466
PKG_BUILD_TIME:=$(shell date -u -Iseconds)
GO_PKG:=github.com/metacubex/mihomo
+2 -2
View File
@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=mihomo
PKG_VERSION:=1.19.23
PKG_RELEASE:=7
PKG_VERSION:=1.19.24
PKG_RELEASE:=8
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/metacubex/mihomo/tar.gz/v$(PKG_VERSION)?
+2 -2
View File
@@ -2,8 +2,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=appfilter
PKG_VERSION:=6.1.7
PKG_RELEASE:=1
PKG_VERSION:=6.1.8
PKG_RELEASE:=2
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)
include $(INCLUDE_DIR)/package.mk
+1 -1
View File
@@ -9,7 +9,7 @@
#include "utils.h"
#define LOG_FILE_PATH "/tmp/log/appfilter.log"
#define OAF_VERSION "6.1.7"
#define OAF_VERSION "6.1.8"
typedef enum {
LOG_LEVEL_ERROR,
+24 -22
View File
@@ -255,16 +255,16 @@ appfilter_handle_dev_visit_list(struct ubus_context *ctx, struct ubus_object *ob
int total_count = json_object_array_length(visit_array);
struct json_object *paged_array = NULL;
if (page == 0) {
paged_array = visit_array;
json_object_get(visit_array);
} else {
paged_array = json_object_new_array();
int start_idx = (page - 1) * page_size;
int end_idx = start_idx + page_size;
int i;
for (i = start_idx; i < end_idx && i < total_count; i++) {
struct json_object *paged_array = NULL;
if (page <= 0) {
/* Reuse visit_array as response data while keeping a local reference for cleanup. */
paged_array = json_object_get(visit_array);
} else {
paged_array = json_object_new_array();
int start_idx = (page - 1) * page_size;
int end_idx = start_idx + page_size;
int i;
for (i = start_idx; i < end_idx && i < total_count; i++) {
struct json_object *visit_obj = json_object_array_get_idx(visit_array, i);
if (visit_obj) {
json_object_get(visit_obj);
@@ -282,7 +282,8 @@ appfilter_handle_dev_visit_list(struct ubus_context *ctx, struct ubus_object *ob
if (page_size > 0) {
total_pages = (total_count + page_size - 1) / page_size; // Ceiling division
}
json_object_object_add(root_obj, "total_pages", json_object_new_int(total_pages));
json_object_object_add(root_obj, "total_pages", json_object_new_int(total_pages));
json_object_put(visit_array);
if (req_obj) {
json_object_put(req_obj);
@@ -1630,16 +1631,16 @@ static int handle_get_all_users(struct ubus_context *ctx, struct ubus_object *ob
int total_count = json_object_array_length(au_info.users_array);
struct json_object *paged_array = NULL;
if (page == 0) {
paged_array = au_info.users_array;
json_object_get(au_info.users_array); // Increment reference count to prevent double free
} else {
paged_array = json_object_new_array();
int start_idx = (page - 1) * page_size;
int end_idx = start_idx + page_size;
int i;
for (i = start_idx; i < end_idx && i < total_count; i++) {
struct json_object *paged_array = NULL;
if (page <= 0) {
/* Reuse users_array as response data while keeping a local reference for cleanup. */
paged_array = json_object_get(au_info.users_array);
} else {
paged_array = json_object_new_array();
int start_idx = (page - 1) * page_size;
int end_idx = start_idx + page_size;
int i;
for (i = start_idx; i < end_idx && i < total_count; i++) {
struct json_object *user_obj = json_object_array_get_idx(au_info.users_array, i);
if (user_obj) {
json_object_get(user_obj); // Increment reference count
@@ -1658,7 +1659,8 @@ static int handle_get_all_users(struct ubus_context *ctx, struct ubus_object *ob
if (page_size > 0) {
total_pages = (total_count + page_size - 1) / page_size; // Ceiling division
}
json_object_object_add(data_obj, "total_pages", json_object_new_int(total_pages));
json_object_object_add(data_obj, "total_pages", json_object_new_int(total_pages));
json_object_put(au_info.users_array);
json_object_object_add(response, "data", data_obj);
+2 -2
View File
@@ -10,8 +10,8 @@ include $(TOPDIR)/rules.mk
PKG_ARCH_quickstart:=$(ARCH)
PKG_NAME:=quickstart
PKG_VERSION:=0.11.14
PKG_RELEASE:=1
PKG_VERSION:=0.11.15
PKG_RELEASE:=2
PKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/prebuilt/
PKG_HASH:=skip
+2 -2
View File
@@ -5,8 +5,8 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=sing-box
PKG_VERSION:=1.13.8
PKG_RELEASE:=12
PKG_VERSION:=1.13.9
PKG_RELEASE:=13
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)?