Files
BetterDesk/web-nodejs/views/resource-control.ejs
T
UNITRONIX 235c9c0706 security: implement Phase 0-3 remediation (deps, SQL ident, JWT, CSP, suite)
Bump axios/multer and npm overrides; add safeSqlIdent and multer cleanup;
harden JWT aud/iss/nbf; CSP without unsafe-eval via static protobuf build
and data-bd-call delegation; ship Security Test Suite v1.2.0 and docs.
Ignore generated RdClient protobuf artifacts (~40k lines) — rebuild locally
with npm run protocols:rdclient.

Thanks: INSOLVE (Honorary); Marco Jakobs (@jacotec); MyNameisStitch (@MyNameisStitch); Redspin (@playerumpknow); muopc (@muopc)
2026-10-17 15:33:48 +02:00

246 lines
14 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<%- include('layouts/main', {
title: typeof title !== 'undefined' ? title : 'Resource Control',
pageStyles: typeof pageStyles !== 'undefined' ? pageStyles : ['resource-control'],
pageScripts: typeof pageScripts !== 'undefined' ? pageScripts : ['resource-control'],
currentPage: typeof currentPage !== 'undefined' ? currentPage : 'resource-control',
breadcrumb: typeof breadcrumb !== 'undefined' ? breadcrumb : [{ label: 'Resource Control' }],
body: `
<div class="page-content" style="max-width: 1400px; margin: 0 auto;">
<div class="rc-header">
<h2>${_('resource_control.title')}</h2>
<div class="rc-tabs" id="rc-tabs">
<button class="rc-tab active" data-tab="overview" data-bd-call="ResourceControl.switchTab" data-bd-args='["overview"]'>
<span class="material-icons-round">dashboard</span>
${_('resource_control.tab_overview')}
</button>
<button class="rc-tab" data-tab="usb" data-bd-call="ResourceControl.switchTab" data-bd-args='["usb"]'>
<span class="material-icons-round">usb</span>
${_('resource_control.tab_usb')}
</button>
<button class="rc-tab" data-tab="optical" data-bd-call="ResourceControl.switchTab" data-bd-args='["optical"]'>
<span class="material-icons-round">album</span>
${_('resource_control.tab_optical')}
</button>
<button class="rc-tab" data-tab="monitors" data-bd-call="ResourceControl.switchTab" data-bd-args='["monitors"]'>
<span class="material-icons-round">monitor</span>
${_('resource_control.tab_monitors')}
</button>
<button class="rc-tab" data-tab="disks" data-bd-call="ResourceControl.switchTab" data-bd-args='["disks"]'>
<span class="material-icons-round">storage</span>
${_('resource_control.tab_disks')}
</button>
<button class="rc-tab" data-tab="quotas" data-bd-call="ResourceControl.switchTab" data-bd-args='["quotas"]'>
<span class="material-icons-round">speed</span>
${_('resource_control.tab_quotas')}
</button>
</div>
</div>
<div class="rc-content">
<!-- Overview tab -->
<div class="rc-panel active" id="panel-overview">
<div class="rc-compliance-row" id="compliance-stats"></div>
<div class="rc-section">
<h3>${_('resource_control.compliance_by_category')}</h3>
<div class="rc-category-grid" id="compliance-categories"></div>
</div>
<div class="rc-section">
<h3>${_('resource_control.device_compliance')}</h3>
<div class="rc-device-filter">
<input type="text" class="rc-search" id="rc-device-search"
placeholder="${_('resource_control.search_devices')}"
oninput="ResourceControl.filterDevices()">
</div>
<div class="rc-table-scroll">
<table class="rc-table" id="rc-device-table">
<thead>
<tr>
<th>${_('resource_control.col_device')}</th>
<th>${_('resource_control.col_platform')}</th>
<th>${_('resource_control.col_status')}</th>
<th>${_('resource_control.col_usb')}</th>
<th>${_('resource_control.col_optical')}</th>
<th>${_('resource_control.col_monitors')}</th>
<th>${_('resource_control.col_disks')}</th>
<th>${_('resource_control.col_quotas')}</th>
<th>${_('resource_control.col_actions')}</th>
</tr>
</thead>
<tbody id="rc-device-tbody"></tbody>
</table>
</div>
</div>
</div>
<!-- USB tab -->
<div class="rc-panel" id="panel-usb">
<div class="rc-section">
<div class="rc-section-header">
<h3><span class="material-icons-round">usb</span> ${_('resource_control.usb_title')}</h3>
</div>
<p class="rc-hint">${_('resource_control.usb_hint')}</p>
<div class="rc-policy-form" id="usb-form">
<div class="rc-form-group">
<label>${_('resource_control.usb_storage_policy')}</label>
<select id="usb-storage-policy">
<option value="allowed">${_('resource_control.policy_allowed')}</option>
<option value="blocked">${_('resource_control.policy_blocked')}</option>
<option value="whitelist">${_('resource_control.policy_whitelist')}</option>
</select>
</div>
<div class="rc-form-group">
<label>${_('resource_control.usb_whitelist')}</label>
<textarea id="usb-whitelist" placeholder="${_('resource_control.usb_whitelist_hint')}" rows="4"></textarea>
</div>
<div class="rc-form-group">
<label class="rc-toggle-label">
<input type="checkbox" id="usb-audit-log"> ${_('resource_control.usb_audit_log')}
</label>
</div>
</div>
</div>
</div>
<!-- Optical tab -->
<div class="rc-panel" id="panel-optical">
<div class="rc-section">
<div class="rc-section-header">
<h3><span class="material-icons-round">album</span> ${_('resource_control.optical_title')}</h3>
</div>
<p class="rc-hint">${_('resource_control.optical_hint')}</p>
<div class="rc-policy-form" id="optical-form">
<div class="rc-form-group">
<label>${_('resource_control.optical_policy')}</label>
<select id="optical-policy">
<option value="allowed">${_('resource_control.policy_allowed')}</option>
<option value="blocked">${_('resource_control.policy_blocked')}</option>
</select>
</div>
<div class="rc-form-group">
<label class="rc-toggle-label">
<input type="checkbox" id="optical-audit-log"> ${_('resource_control.optical_audit_log')}
</label>
</div>
</div>
</div>
</div>
<!-- Monitors tab -->
<div class="rc-panel" id="panel-monitors">
<div class="rc-section">
<div class="rc-section-header">
<h3><span class="material-icons-round">monitor</span> ${_('resource_control.monitors_title')}</h3>
</div>
<p class="rc-hint">${_('resource_control.monitors_hint')}</p>
<div class="rc-policy-form" id="monitors-form">
<div class="rc-form-group">
<label>${_('resource_control.monitors_max_count')}</label>
<input type="number" id="monitors-max-count" min="0" max="16" value="0"
placeholder="${_('resource_control.monitors_max_hint')}">
</div>
<div class="rc-form-group">
<label>${_('resource_control.monitors_resolution')}</label>
<select id="monitors-resolution">
<option value="any">${_('resource_control.policy_any')}</option>
<option value="1920x1080">1920×1080 (Full HD)</option>
<option value="2560x1440">2560×1440 (QHD)</option>
<option value="3840x2160">3840×2160 (4K UHD)</option>
</select>
</div>
<div class="rc-form-group">
<label>${_('resource_control.monitors_brightness')}</label>
<input type="range" id="monitors-brightness" min="0" max="100" value="100">
<span id="monitors-brightness-val">100%</span>
</div>
<div class="rc-form-group">
<label>${_('resource_control.monitors_power_schedule')}</label>
<input type="text" id="monitors-power-schedule"
placeholder="${_('resource_control.monitors_power_hint')}">
</div>
</div>
</div>
</div>
<!-- Disks tab -->
<div class="rc-panel" id="panel-disks">
<div class="rc-section">
<div class="rc-section-header">
<h3><span class="material-icons-round">storage</span> ${_('resource_control.disks_title')}</h3>
</div>
<p class="rc-hint">${_('resource_control.disks_hint')}</p>
<div class="rc-policy-form" id="disks-form">
<div class="rc-form-group">
<label class="rc-toggle-label">
<input type="checkbox" id="disks-readonly"> ${_('resource_control.disks_readonly')}
</label>
</div>
<div class="rc-form-group">
<label class="rc-toggle-label">
<input type="checkbox" id="disks-encryption"> ${_('resource_control.disks_encryption')}
</label>
</div>
<div class="rc-form-group">
<label class="rc-toggle-label">
<input type="checkbox" id="disks-smart"> ${_('resource_control.disks_smart')}
</label>
</div>
<div class="rc-form-group">
<label>${_('resource_control.disks_hidden')}</label>
<input type="text" id="disks-hidden-partitions"
placeholder="${_('resource_control.disks_hidden_hint')}">
</div>
</div>
</div>
</div>
<!-- Quotas tab -->
<div class="rc-panel" id="panel-quotas">
<div class="rc-section">
<div class="rc-section-header">
<h3><span class="material-icons-round">speed</span> ${_('resource_control.quotas_title')}</h3>
</div>
<p class="rc-hint">${_('resource_control.quotas_hint')}</p>
<div class="rc-policy-form" id="quotas-form">
<div class="rc-form-group">
<label>${_('resource_control.quotas_cpu')}</label>
<div class="rc-range-group">
<input type="range" id="quotas-cpu" min="0" max="100" value="100">
<span id="quotas-cpu-val">100%</span>
</div>
</div>
<div class="rc-form-group">
<label>${_('resource_control.quotas_ram')}</label>
<div class="rc-range-group">
<input type="range" id="quotas-ram" min="0" max="100" value="100">
<span id="quotas-ram-val">100%</span>
</div>
</div>
<div class="rc-form-group">
<label>${_('resource_control.quotas_bandwidth')}</label>
<input type="number" id="quotas-bandwidth" min="0" value="0"
placeholder="${_('resource_control.quotas_bandwidth_hint')}">
</div>
<div class="rc-form-group">
<label>${_('resource_control.quotas_disk_quota')}</label>
<input type="number" id="quotas-disk" min="0" value="0"
placeholder="${_('resource_control.quotas_disk_hint')}">
</div>
<div class="rc-form-group">
<label>${_('resource_control.quotas_process_whitelist')}</label>
<textarea id="quotas-process-whitelist" rows="4"
placeholder="${_('resource_control.quotas_process_hint')}"></textarea>
</div>
</div>
</div>
</div>
</div>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
if (window.ResourceControl) ResourceControl.init();
});
</script>
`
}) %>