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", "title": "MetaBlogizer",
"order": 85,
"action": { "action": {
"type": "view", "type": "firstchild"
"path": "metablogizer/overview"
}, },
"depends": { "depends": {
"acl": ["luci-app-metablogizer"], "acl": ["luci-app-metablogizer"],
"uci": {"metablogizer": true} "uci": {"metablogizer": true}
}, }
"order": 85
}, },
"admin/secubox/services/metablogizer/overview": { "admin/services/metablogizer/overview": {
"title": "Sites", "title": "Sites",
"order": 10,
"action": { "action": {
"type": "view", "type": "view",
"path": "metablogizer/overview" "path": "metablogizer/overview"
}, }
"order": 10
}, },
"admin/secubox/services/metablogizer/settings": { "admin/services/metablogizer/settings": {
"title": "Settings", "title": "Settings",
"order": 20,
"action": { "action": {
"type": "view", "type": "view",
"path": "metablogizer/settings" "path": "metablogizer/settings"
}, }
"order": 20
} }
} }

View File

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

View File

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

View File

@ -61,6 +61,11 @@ endef
define Package/secubox-app-tor/postinst define Package/secubox-app-tor/postinst
#!/bin/sh #!/bin/sh
[ -n "$${IPKG_INSTROOT}" ] || { [ -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 ""
echo "SecuBox Tor Shield installed." echo "SecuBox Tor Shield installed."
echo "" echo ""