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:
parent
fa5d573755
commit
5a9627a2d6
@ -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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 '🛡';
|
case 'shield': return '\uD83D\uDEE1';
|
||||||
case 'target': return '🎯';
|
case 'target': return '\uD83C\uDFAF';
|
||||||
case 'unlock': return '🔓';
|
case 'unlock': return '\uD83D\uDD13';
|
||||||
default: return '🛡';
|
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 || []);
|
||||||
|
|
||||||
|
|||||||
@ -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",
|
||||||
|
|||||||
@ -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 ""
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user