Files
zoraxy/src/web/snippet/pluginInfo.html

268 lines
12 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<!-- Notes: This should be open in its original path-->
<meta charset="utf-8">
<meta name="zoraxy.csrf.Token" content="{{.csrfToken}}">
<link rel="stylesheet" href="../script/semantic/semantic.min.css">
<script src="../script/jquery-3.6.0.min.js"></script>
<script src="../script/semantic/semantic.min.js"></script>
<script src="../script/utils.js"></script>
<style>
.basic.segment.advanceoptions {
background-color: var(--theme_advance);
border-radius: 1em;
}
</style>
</head>
<body>
<link rel="stylesheet" href="../darktheme.css">
<script src="../script/darktheme.js"></script>
<br>
<div class="ui container">
<div class="ui header">
<div class="content">
Plugin Information
<div class="sub header plugin_name"></div>
</div>
</div>
<div class="ui divider"></div>
<div class="ui basic segment">
<div class="ui centered aligned container"></div>
<img id="plugin_image" src="" alt="Plugin Image" style="max-width: 100px;">
</div>
<div class="ui divider"></div>
<b>IntroSpect</b>
<p>The plugin registered the following information about itself</p>
<table class="ui very basic celled unstackable table">
<thead>
<tr>
<th>IntroSpect</th>
<th>Response</th>
</tr>
</thead>
<tbody>
<tr>
<td>Name</td>
<td class="plugin_name"></td>
</tr>
<tr>
<td>Version</td>
<td id="plugin_version"></td>
</tr>
<tr>
<td>Author</td>
<td id="plugin_author"></td>
</tr>
<tr>
<tr>
<td>Description</td>
<td id="plugin_description"></td>
</tr>
<tr>
<td>Category</td>
<td id="plugin_category"></td>
</tr>
<tr>
<td>URL</td>
<td id="plugin_url"></td>
</tr>
<tr>
<td>Contact</td>
<td id="plugin_contact"></td>
</tr>
</tbody>
</table>
<div class="ui divider"></div>
<b>Runtime Values</b>
<p>Zoraxy assigned the following settings for its runtime</p>
<table class="ui very basic celled unstackable table">
<thead>
<tr>
<th>Properties</th>
<th>Configuration</th>
</tr>
</thead>
<tbody>
<td>Enabled</td>
<td id="plugin_enabled"></td>
</tr>
<tr>
<td>Assigned Port</td>
<td id="plugin_assigned_port"></td>
</tr>
<tr>
<td>Working Directory</td>
<td id="plugin_root_dir"></td>
</tr>
</tbody>
</table>
</div>
<div class="ui basic segment advanceoptions" style="margin-left: 0.4em; margin-right: 0.4em;">
<div class="ui accordion advanceSettings">
<div class="title">
<i class="dropdown icon"></i>
Developer Insights
</div>
<div class="content">
<h4>Plugin IntroSpect Path Registration</h4>
<p>The following static capture paths are registered by this plugin and will be intercepting all traffics that request these paths. <br>
If dynamic capture path is not empty, all traffic headers will be forwarded to plugin for processing and optionally intercept.</p>
<table class="ui basic celled unstackable table">
<tbody>
<tr>
<td>Registered Static Capture Paths<br>
<small>Paths (and subpaths) to be intercepted by this plugin</small></td>
<td id="registered_static_capture_paths"></td>
</tr>
<tr>
<td>Static Capture Ingress<br>
<small>Static intercept request ingress path</small></td>
<td id="static_capture_ingress"></td>
</tr>
<tr>
<td>Dynamic Capture Sniffing Path<br>
<small>Request header ingress for intercept precheck</small></td>
<td id="dynamic_capture_sniffing_path"></td>
</tr>
<tr>
<td>Dynamic Capture Ingress<br>
<small>Dynamic intercept request ingress path</small></td>
<td id="dynamic_capture_ingress"></td>
</tr>
<tr>
<td>Registered UI Proxy Path<br>
<small>The relative path of the web UI</small></td>
<td id="registered_ui_proxy_path"></td>
</tr>
</tbody>
</table>
<div class="ui divider"></div>
<h4>Plugin IntroSpect Permitted API Endpoints</h4>
<p>The following API endpoints are registered by this plugin and will be accessible by the plugin's API key:</p>
<table class="ui basic celled unstackable table">
<thead>
<tr>
<th>Endpoint</th>
<th>Method</th>
<th>Reason</th>
</tr>
</thead>
<!-- This tbody will be filled by JavaScript -->
<tbody id="plugin_permitted_api_endpoints">
</tbody>
</table>
<p>
Note that the API endpoints are only accessible by the plugin's API key.
If the plugin does not have an API key, it will not be able to access these endpoints.
API keys are generated automatically by Zoraxy when a plugin with permitted API endpoints is enabled.
</p>
<div class="ui divider"></div>
</div>
</div>
</div>
<div class="ui divider"></div>
<div class="field" >
<button class="ui basic button" style="float: right;" onclick="closeThisWrapper();">Close</button>
</div>
<br><br><br>
<script>
//Get hash from windows
let hash = window.location.hash;
let payload = hash.substring(1);
let pluginID = "";
try{
payload = JSON.parse(decodeURIComponent(payload));
pluginID = payload.plugin_id;
getPluginInfo(pluginID);
}catch(e){
console.error(e);
}
function getPluginInfo(pluginId){
$.get(`/api/plugins/info?plugin_id=${pluginId}`, function(data){
let authorContact = data.Spec.author_contact;
if(!authorContact.startsWith('http')){
authorContact = `mailto:${authorContact}`;
}
let versionString = `v${data.Spec.version_major}.${data.Spec.version_minor}.${data.Spec.version_patch}`;
$(".plugin_name").text(data.Spec.name);
$("#plugin_image").attr("src", `/api/plugins/icon?plugin_id=${data.Spec.id}`);
$("#plugin_version").text(versionString);
$("#plugin_author").html(`<a href="${authorContact}" target="_blank">${data.Spec.author}</a>`);
$("#plugin_enabled").html(data.Enabled?`<i class="ui green check icon"></i>`:`<i class="ui red times icon"></i>`);
$("#plugin_assigned_port").text(data.AssignedPort);
$("#plugin_root_dir").text(data.RootDir + "/");
$("#plugin_description").text(data.Spec.description);
$("#plugin_category").text(data.Spec.type == 0 ? "Router" : "Utilities");
$("#plugin_url").html(`<a href="${data.Spec.url}" target="_blank">${data.Spec.url}</a>`);
$("#plugin_contact").html(`<a href="${authorContact}" target="_blank">${data.Spec.author_contact}</a>`);
$("#plugin_info_modal").modal('show');
//Update the developer insights
//Note that some paths might be empty string which means they are not registered
let registeredStaticCapturePaths = data.Spec.static_capture_paths;
if (registeredStaticCapturePaths == null || registeredStaticCapturePaths.length == 0) {
registeredStaticCapturePaths = [{capture_path: "No static capture paths registered"}];
}
let capturePathsList = '<div class="ui list">';
registeredStaticCapturePaths.forEach(function(path) {
capturePathsList += `<div class="item">${path.capture_path}</div>`;
});
capturePathsList += '</ul>';
$("#registered_static_capture_paths").html(capturePathsList);
let staticCaptureIngress = data.Spec.static_capture_ingress;
if (staticCaptureIngress == null || staticCaptureIngress == "") {
staticCaptureIngress = "Not registered";
}
let dynamicCaptureSniffingPath = data.Spec.dynamic_capture_sniff;
if (dynamicCaptureSniffingPath == null || dynamicCaptureSniffingPath == "") {
dynamicCaptureSniffingPath = "Not registered";
}
let dynamicCaptureIngress = data.Spec.dynamic_capture_ingress;
if (dynamicCaptureIngress == null || dynamicCaptureIngress == "") {
dynamicCaptureIngress = "Not registered";
}
let registeredUIProxyPath = data.Spec.ui_path;
if (registeredUIProxyPath == null || registeredUIProxyPath == "") {
registeredUIProxyPath = "No UI registered";
}
$("#static_capture_ingress").text(staticCaptureIngress);
$("#dynamic_capture_sniffing_path").text(dynamicCaptureSniffingPath);
$("#dynamic_capture_ingress").text(dynamicCaptureIngress);
$("#registered_ui_proxy_path").text(registeredUIProxyPath);
//Update permitted API endpoints
let apiEndpoints = data.Spec.permitted_api_endpoints;
if (apiEndpoints == null || apiEndpoints.length == 0) {
$("#plugin_permitted_api_endpoints").html('<tr><td colspan="3">No API endpoints registered</td></tr>');
} else {
let endpointRows = '';
apiEndpoints.forEach(function(endpoint) {
endpointRows += `<tr>
<td>${endpoint.endpoint}</td>
<td>${endpoint.method}</td>
<td>${endpoint.reason}</td>
</tr>`;
});
$("#plugin_permitted_api_endpoints").html(endpointRows);
}
});
}
$(".advanceSettings").accordion();
function closeThisWrapper(){
parent.hideSideWrapper(true);
}
</script>
</body>
</html>