- Add get_web_token RPCD method to retrieve auth token - Create webui.js view that embeds mitmweb in an iframe - Capture auth token at startup and save to file - Add Web UI navigation to all mitmproxy views - Fix PATH for /usr/local/bin in Docker image - Change default port from 8080 to 8888 (avoid CrowdSec conflict) secubox-app-mitmproxy: bump to r12 luci-app-mitmproxy: bump to r2 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
255 lines
5.0 KiB
JavaScript
255 lines
5.0 KiB
JavaScript
'use strict';
|
|
'require baseclass';
|
|
'require rpc';
|
|
|
|
var callMitmproxy = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'get_status'
|
|
});
|
|
|
|
var callGetConfig = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'get_config'
|
|
});
|
|
|
|
var callGetTransparentConfig = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'get_transparent_config'
|
|
});
|
|
|
|
var callGetWhitelistConfig = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'get_whitelist_config'
|
|
});
|
|
|
|
var callGetFilteringConfig = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'get_filtering_config'
|
|
});
|
|
|
|
var callGetAllConfig = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'get_all_config'
|
|
});
|
|
|
|
var callGetStats = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'get_stats'
|
|
});
|
|
|
|
var callGetRequests = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'get_requests',
|
|
params: ['limit', 'category']
|
|
});
|
|
|
|
var callGetTopHosts = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'get_top_hosts',
|
|
params: ['limit']
|
|
});
|
|
|
|
var callGetCaInfo = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'get_ca_info'
|
|
});
|
|
|
|
var callGetWebToken = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'get_web_token'
|
|
});
|
|
|
|
var callServiceStart = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'service_start'
|
|
});
|
|
|
|
var callServiceStop = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'service_stop'
|
|
});
|
|
|
|
var callServiceRestart = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'service_restart'
|
|
});
|
|
|
|
var callFirewallSetup = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'firewall_setup'
|
|
});
|
|
|
|
var callFirewallClear = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'firewall_clear'
|
|
});
|
|
|
|
var callSetConfig = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'set_config',
|
|
params: ['key', 'value']
|
|
});
|
|
|
|
var callAddToList = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'add_to_list',
|
|
params: ['key', 'value']
|
|
});
|
|
|
|
var callRemoveFromList = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'remove_from_list',
|
|
params: ['key', 'value']
|
|
});
|
|
|
|
var callClearData = rpc.declare({
|
|
object: 'luci.mitmproxy',
|
|
method: 'clear_data'
|
|
});
|
|
|
|
return baseclass.extend({
|
|
getStatus: function() {
|
|
return callMitmproxy().catch(function() {
|
|
return { running: false, enabled: false };
|
|
});
|
|
},
|
|
|
|
getConfig: function() {
|
|
return callGetConfig().catch(function() {
|
|
return {};
|
|
});
|
|
},
|
|
|
|
getTransparentConfig: function() {
|
|
return callGetTransparentConfig().catch(function() {
|
|
return { enabled: false };
|
|
});
|
|
},
|
|
|
|
getWhitelistConfig: function() {
|
|
return callGetWhitelistConfig().catch(function() {
|
|
return { enabled: true, bypass_ip: [], bypass_domain: [] };
|
|
});
|
|
},
|
|
|
|
getFilteringConfig: function() {
|
|
return callGetFilteringConfig().catch(function() {
|
|
return { enabled: false };
|
|
});
|
|
},
|
|
|
|
getAllConfig: function() {
|
|
return callGetAllConfig().catch(function() {
|
|
return { main: {}, transparent: {}, whitelist: {}, filtering: {} };
|
|
});
|
|
},
|
|
|
|
getStats: function() {
|
|
return callGetStats().catch(function() {
|
|
return {
|
|
total_requests: 0,
|
|
unique_hosts: 0,
|
|
flow_file_size: 0,
|
|
cdn_requests: 0,
|
|
media_requests: 0,
|
|
blocked_ads: 0
|
|
};
|
|
});
|
|
},
|
|
|
|
getRequests: function(limit, category) {
|
|
return callGetRequests(limit || 50, category || 'all').catch(function() {
|
|
return { requests: [] };
|
|
});
|
|
},
|
|
|
|
getTopHosts: function(limit) {
|
|
return callGetTopHosts(limit || 20).catch(function() {
|
|
return { hosts: [] };
|
|
});
|
|
},
|
|
|
|
getCaInfo: function() {
|
|
return callGetCaInfo().catch(function() {
|
|
return { installed: false };
|
|
});
|
|
},
|
|
|
|
getWebToken: function() {
|
|
return callGetWebToken().catch(function() {
|
|
return { token: '', web_url: '', web_url_with_token: '' };
|
|
});
|
|
},
|
|
|
|
serviceStart: function() {
|
|
return callServiceStart();
|
|
},
|
|
|
|
serviceStop: function() {
|
|
return callServiceStop();
|
|
},
|
|
|
|
serviceRestart: function() {
|
|
return callServiceRestart();
|
|
},
|
|
|
|
firewallSetup: function() {
|
|
return callFirewallSetup();
|
|
},
|
|
|
|
firewallClear: function() {
|
|
return callFirewallClear();
|
|
},
|
|
|
|
setConfig: function(key, value) {
|
|
return callSetConfig(key, value);
|
|
},
|
|
|
|
addToList: function(key, value) {
|
|
return callAddToList(key, value);
|
|
},
|
|
|
|
removeFromList: function(key, value) {
|
|
return callRemoveFromList(key, value);
|
|
},
|
|
|
|
clearData: function() {
|
|
return callClearData();
|
|
},
|
|
|
|
getAllData: function() {
|
|
var self = this;
|
|
return Promise.all([
|
|
self.getStatus(),
|
|
self.getAllConfig(),
|
|
self.getStats(),
|
|
self.getTopHosts(10),
|
|
self.getCaInfo()
|
|
]).then(function(results) {
|
|
return {
|
|
status: results[0],
|
|
config: results[1].main || results[1],
|
|
allConfig: results[1],
|
|
stats: results[2],
|
|
topHosts: results[3],
|
|
caInfo: results[4]
|
|
};
|
|
});
|
|
},
|
|
|
|
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();
|
|
}
|
|
});
|