fix(multi): Tor Shield API, ACL restart permission, menu moves

- Fix tor-shield/api.js: Use baseclass.extend() pattern correctly
- Fix tor-shield ACL: Add missing 'restart' write permission
- Fix secubox-app-tor: Disable conflicting default tor init in postinst
- Move metablogizer menu from secubox/services to admin/services

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
CyberMind-FR 2026-01-27 15:45:20 +01:00
parent fa5d573755
commit 5a9627a2d6
4 changed files with 39 additions and 43 deletions

View File

@ -1,30 +1,29 @@
{
"admin/secubox/services/metablogizer": {
"admin/services/metablogizer": {
"title": "MetaBlogizer",
"order": 85,
"action": {
"type": "view",
"path": "metablogizer/overview"
"type": "firstchild"
},
"depends": {
"acl": ["luci-app-metablogizer"],
"uci": {"metablogizer": true}
},
"order": 85
}
},
"admin/secubox/services/metablogizer/overview": {
"admin/services/metablogizer/overview": {
"title": "Sites",
"order": 10,
"action": {
"type": "view",
"path": "metablogizer/overview"
},
"order": 10
}
},
"admin/secubox/services/metablogizer/settings": {
"admin/services/metablogizer/settings": {
"title": "Settings",
"order": 20,
"action": {
"type": "view",
"path": "metablogizer/settings"
},
"order": 20
}
}
}

View File

@ -2,12 +2,6 @@
'require baseclass';
'require rpc';
/**
* Tor Shield API
* Package: luci-app-tor
* RPCD object: luci.tor-shield
*/
var callStatus = rpc.declare({
object: 'luci.tor-shield',
method: 'status',
@ -115,7 +109,6 @@ var callSaveSettings = rpc.declare({
expect: { success: false }
});
// Utility functions
function formatBytes(bytes) {
if (bytes === 0) return '0 B';
var k = 1024;
@ -156,31 +149,33 @@ function getCountryFlag(code) {
function getPresetIcon(icon) {
switch (icon) {
case 'shield': return '&#128737;';
case 'target': return '&#127919;';
case 'unlock': return '&#128275;';
default: return '&#128737;';
case 'shield': return '\uD83D\uDEE1';
case 'target': return '\uD83C\uDFAF';
case 'unlock': return '\uD83D\uDD13';
default: return '\uD83D\uDEE1';
}
}
return baseclass.extend({
getStatus: callStatus,
enable: callEnable,
disable: callDisable,
restart: callRestart,
getCircuits: callCircuits,
newIdentity: callNewIdentity,
checkLeaks: callCheckLeaks,
getHiddenServices: callHiddenServices,
addHiddenService: callAddHiddenService,
removeHiddenService: callRemoveHiddenService,
getExitIp: callExitIp,
getBandwidth: callBandwidth,
getPresets: callPresets,
getBridges: callBridges,
setBridges: callSetBridges,
getSettings: callSettings,
saveSettings: callSaveSettings,
getStatus: function() { return callStatus(); },
enable: function(preset) { return callEnable(preset); },
disable: function() { return callDisable(); },
restart: function() { return callRestart(); },
getCircuits: function() { return callCircuits(); },
newIdentity: function() { return callNewIdentity(); },
checkLeaks: function() { return callCheckLeaks(); },
getHiddenServices: function() { return callHiddenServices(); },
addHiddenService: function(name, local_port, virtual_port) { return callAddHiddenService(name, local_port, virtual_port); },
removeHiddenService: function(name) { return callRemoveHiddenService(name); },
getExitIp: function() { return callExitIp(); },
getBandwidth: function() { return callBandwidth(); },
getPresets: function() { return callPresets(); },
getBridges: function() { return callBridges(); },
setBridges: function(enabled, type) { return callSetBridges(enabled, type); },
getSettings: function() { return callSettings(); },
saveSettings: function(mode, dns_over_tor, kill_switch, socks_port, trans_port, dns_port, exit_nodes, exclude_exit_nodes, strict_nodes) {
return callSaveSettings(mode, dns_over_tor, kill_switch, socks_port, trans_port, dns_port, exit_nodes, exclude_exit_nodes, strict_nodes);
},
formatBytes: formatBytes,
formatRate: formatRate,
@ -188,14 +183,12 @@ return baseclass.extend({
getCountryFlag: getCountryFlag,
getPresetIcon: getPresetIcon,
// Aggregate function for dashboard
getDashboardData: function() {
return Promise.all([
callStatus(),
callPresets(),
callBandwidth()
]).then(function(results) {
// Handle RPC expect unwrapping - results may be array or object
var presetsData = results[1] || [];
var presets = Array.isArray(presetsData) ? presetsData : (presetsData.presets || []);
@ -207,14 +200,12 @@ return baseclass.extend({
});
},
// Get all data for monitoring
getMonitoringData: function() {
return Promise.all([
callStatus(),
callCircuits(),
callBandwidth()
]).then(function(results) {
// Handle RPC expect unwrapping - results[1] may be array or object
var circuitsData = results[1] || [];
var circuits = Array.isArray(circuitsData) ? circuitsData : (circuitsData.circuits || []);

View File

@ -29,6 +29,7 @@
"luci.tor-shield": [
"enable",
"disable",
"restart",
"new_identity",
"check_leaks",
"add_hidden_service",

View File

@ -61,6 +61,11 @@ endef
define Package/secubox-app-tor/postinst
#!/bin/sh
[ -n "$${IPKG_INSTROOT}" ] || {
# Disable default tor init script to prevent conflicts
if [ -x /etc/init.d/tor ]; then
/etc/init.d/tor disable 2>/dev/null
/etc/init.d/tor stop 2>/dev/null
fi
echo ""
echo "SecuBox Tor Shield installed."
echo ""