- Add RPCD methods to mitmproxy: settings, save_settings, set_mode, setup_firewall, clear_firewall - Add apply_now parameter to tor-shield save_settings to restart service and apply iptables rules immediately - Update ACL files with new permissions - Add Save & Apply button to tor-shield settings page - Update api.js files to use correct RPCD method signatures Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
194 lines
3.9 KiB
JavaScript
194 lines
3.9 KiB
JavaScript
'use strict';
|
|
'require baseclass';
|
|
'require rpc';
|
|
|
|
// Status and settings
|
|
var callStatus = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'status',
|
|
expect: {}
|
|
});
|
|
|
|
var callSettings = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'settings',
|
|
expect: {}
|
|
});
|
|
|
|
var callSaveSettings = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'save_settings',
|
|
params: ['mode', 'enabled', 'proxy_port', 'web_port', 'web_host', 'data_path',
|
|
'memory_limit', 'upstream_proxy', 'reverse_target', 'ssl_insecure',
|
|
'anticache', 'anticomp', 'transparent_enabled', 'transparent_interface',
|
|
'redirect_http', 'redirect_https', 'filtering_enabled', 'log_requests',
|
|
'filter_cdn', 'filter_media', 'block_ads', 'apply_now'],
|
|
expect: {}
|
|
});
|
|
|
|
var callSetMode = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'set_mode',
|
|
params: ['mode', 'apply_now'],
|
|
expect: {}
|
|
});
|
|
|
|
// Service control
|
|
var callInstall = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'install',
|
|
expect: {}
|
|
});
|
|
|
|
var callStart = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'start',
|
|
expect: {}
|
|
});
|
|
|
|
var callStop = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'stop',
|
|
expect: {}
|
|
});
|
|
|
|
var callRestart = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'restart',
|
|
expect: {}
|
|
});
|
|
|
|
// Firewall control
|
|
var callSetupFirewall = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'setup_firewall',
|
|
expect: {}
|
|
});
|
|
|
|
var callClearFirewall = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'clear_firewall',
|
|
expect: {}
|
|
});
|
|
|
|
return baseclass.extend({
|
|
getStatus: function() {
|
|
return callStatus().catch(function() {
|
|
return {
|
|
running: false,
|
|
enabled: false,
|
|
installed: false,
|
|
lxc_available: false,
|
|
mode: 'regular',
|
|
nft_active: false
|
|
};
|
|
});
|
|
},
|
|
|
|
getSettings: function() {
|
|
return callSettings().catch(function() {
|
|
return {
|
|
enabled: false,
|
|
mode: 'regular',
|
|
proxy_port: 8888,
|
|
web_port: 8081,
|
|
web_host: '0.0.0.0',
|
|
data_path: '/srv/mitmproxy',
|
|
memory_limit: '256M',
|
|
transparent_enabled: false,
|
|
transparent_interface: 'br-lan',
|
|
redirect_http: true,
|
|
redirect_https: true,
|
|
filtering_enabled: false,
|
|
log_requests: true,
|
|
filter_cdn: false,
|
|
filter_media: false,
|
|
block_ads: false
|
|
};
|
|
});
|
|
},
|
|
|
|
saveSettings: function(settings) {
|
|
return callSaveSettings(
|
|
settings.mode,
|
|
settings.enabled,
|
|
settings.proxy_port,
|
|
settings.web_port,
|
|
settings.web_host,
|
|
settings.data_path,
|
|
settings.memory_limit,
|
|
settings.upstream_proxy,
|
|
settings.reverse_target,
|
|
settings.ssl_insecure,
|
|
settings.anticache,
|
|
settings.anticomp,
|
|
settings.transparent_enabled,
|
|
settings.transparent_interface,
|
|
settings.redirect_http,
|
|
settings.redirect_https,
|
|
settings.filtering_enabled,
|
|
settings.log_requests,
|
|
settings.filter_cdn,
|
|
settings.filter_media,
|
|
settings.block_ads,
|
|
settings.apply_now !== false
|
|
);
|
|
},
|
|
|
|
setMode: function(mode, applyNow) {
|
|
return callSetMode(mode, applyNow !== false);
|
|
},
|
|
|
|
install: function() {
|
|
return callInstall();
|
|
},
|
|
|
|
start: function() {
|
|
return callStart();
|
|
},
|
|
|
|
stop: function() {
|
|
return callStop();
|
|
},
|
|
|
|
restart: function() {
|
|
return callRestart();
|
|
},
|
|
|
|
setupFirewall: function() {
|
|
return callSetupFirewall();
|
|
},
|
|
|
|
clearFirewall: function() {
|
|
return callClearFirewall();
|
|
},
|
|
|
|
getAllData: function() {
|
|
var self = this;
|
|
return Promise.all([
|
|
self.getStatus(),
|
|
self.getSettings()
|
|
]).then(function(results) {
|
|
return {
|
|
status: results[0],
|
|
settings: results[1]
|
|
};
|
|
});
|
|
},
|
|
|
|
formatBytes: function(bytes) {
|
|
if (!bytes || bytes === 0) return '0 B';
|
|
var k = 1024;
|
|
var sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
|
|
var i = Math.floor(Math.log(bytes) / Math.log(k));
|
|
return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
|
|
},
|
|
|
|
formatNumber: function(num) {
|
|
if (!num) return '0';
|
|
if (num >= 1000000) return (num / 1000000).toFixed(1) + 'M';
|
|
if (num >= 1000) return (num / 1000).toFixed(1) + 'K';
|
|
return num.toString();
|
|
}
|
|
});
|