Files
appsandbox/web/index.html
T
James Stringer c986d092bf Add EV + Microsoft-attestation driver signing and release packaging
YubiKey-gated signing/packaging driven from the VS Release|x64 build:
- make-release.ps1 / sign-drivers.ps1: EV-sign all binaries + driver
  .sys/.dll, submit drivers to Microsoft for attestation in parallel,
  deposit the returned MS-signed drivers into bin\Release\drivers, and
  build a flat AppSandbox-<ver>-x64.zip. Token presence is detected via
  WinSCard + a silent NCrypt key-open, so an unplugged or unrelated card
  never triggers an "insert smart card" dialog; no token => test-sign
  only, no packaging.
- AppSandboxPackage.vcxproj runs it as a post-build step.
- Directory.Build.props/targets + build/version.rc: single-source version
  stamped into every binary and into the driver INFs (StampInf).
- VDD INF: pull WUDFRd via Include/Needs + Win11 decoration to pass
  infverif /h for Partner Center submission.
- Default new Windows VMs to Test Mode off (shipped drivers are MS-signed).
- SIGNING.md documents the git-ignored partner-center.local.json that you
  must create with the Entra API secrets for driver attestation.

Partner Center credentials stay in git-ignored tools/sign/*.local.* files.
2026-05-31 22:21:09 -04:00

192 lines
8.2 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>App Sandbox</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<!-- Virtual Machines -->
<section id="vm-section">
<div class="section-header">
<h2>Sandboxes</h2>
<button id="btn-new-sandbox" class="primary" onclick="openCreateModal()">+ New Sandbox</button>
</div>
<div class="vm-table-wrap">
<table id="vm-table">
<thead><tr>
<th>Name</th>
<th>OS</th>
<th>Status</th>
<th>Agent</th>
<th>CPU</th>
<th>RAM (MB)</th>
<th>HDD (GB)</th>
<th>GPU</th>
<th>Network</th>
<th class="win-only">Snapshot</th>
<th class="icon-col">&#x25B6;&#xFE0F;</th>
<th class="icon-col" title="IDD Display">&#x1F4FA;</th>
<th class="icon-col" title="SSH">&gt;_</th>
<th class="icon-col">&#x23FB;</th>
<th class="icon-col">&#x2715;&#xFE0F;</th>
<th class="icon-col">&#x1F5D1;&#xFE0F;</th>
<th class="icon-col">&#x270F;&#xFE0F;</th>
</tr></thead>
<tbody id="vm-tbody"></tbody>
</table>
</div>
</section>
<!-- Log -->
<section id="log-section">
<h2 class="collapsible" onclick="toggleSection('log-section')"><span class="collapse-arrow" id="log-section-arrow">&#x25BC;</span> Log</h2>
<div id="log-panel"></div>
</section>
<!-- Prerequisite modal -->
<div class="modal-overlay" id="prereq-overlay">
<div class="modal">
<h3>Virtual Machine Platform Required</h3>
<p id="prereq-message">App Sandbox requires the <strong>Virtual Machine Platform</strong> Windows feature to create and run VMs. This feature is not currently enabled.</p>
<div class="modal-buttons" id="prereq-buttons">
<button onclick="document.getElementById('prereq-overlay').classList.remove('active')">Cancel</button>
<button class="primary" onclick="enableFeature()">Enable</button>
</div>
</div>
</div>
<!-- Create Sandbox modal -->
<div class="modal-overlay" id="create-vm-overlay">
<div class="modal wide">
<h3>New Sandbox</h3>
<div class="form-grid">
<label for="os-type">OS Type:</label>
<div class="form-row">
<select id="os-type" onchange="applyOsTypeUI()">
<option value="Windows" selected>Windows</option>
<option value="Linux">Linux</option>
<option value="macOS">macOS</option>
</select>
</div>
<label for="vm-name">VM Name:</label>
<div class="form-row">
<input type="text" id="vm-name" value="MyAppSandbox" class="input-md">
<span class="field-warn" id="vm-name-warn"></span>
</div>
<label class="needs-iso">OS Image:</label>
<div class="image-row needs-iso">
<input type="text" id="image-path" placeholder="Path to ISO or VHDX...">
<button id="btn-browse" onclick="sendCmd('browseImage')">Browse...</button>
<span class="or-separator win-only">OR</span>
<label class="win-only" style="text-align:left">Template:</label>
<div class="template-dropdown win-only" id="template-dropdown">
<div class="template-dropdown-selected" id="template-dropdown-selected">(None)</div>
<div class="template-dropdown-list" id="template-dropdown-list"></div>
<input type="hidden" id="template-select" value="">
</div>
</div>
<label class="needs-linux-version">Distribution:</label>
<div class="form-row needs-linux-version">
<select id="linux-version">
<option value="ubuntu-26.04" selected>Ubuntu 26.04 LTS</option>
</select>
<span class="host-info">Downloaded on first create (~600 MB), cached on the host</span>
</div>
<label for="hdd-size">HDD Size:</label>
<div class="form-row">
<input type="number" id="hdd-size" value="64" min="1" class="input-sm"> GB
<span class="host-info" id="host-hdd"></span>
</div>
<label for="ram-size">RAM Size:</label>
<div class="form-row">
<input type="number" id="ram-size" value="16384" min="512" class="input-sm"> MB
<span class="host-info" id="host-ram"></span>
</div>
<label for="cpu-cores">CPU Cores:</label>
<div class="form-row">
<input type="number" id="cpu-cores" value="8" min="1" class="input-sm">
<span class="host-info" id="host-cpu"></span>
</div>
<label for="gpu-mode">GPU:</label>
<div class="form-row">
<select id="gpu-mode">
<option value="0">None</option>
<option value="1" selected>Default GPU</option>
<option value="2">Try all</option>
</select>
</div>
<label for="net-mode">Network:</label>
<div class="form-row">
<select id="net-mode" onchange="onNetModeChange()">
<option value="0">None</option>
<option value="1" selected>NAT</option>
<option value="2">External</option>
<option value="3">Internal</option>
</select>
<label id="net-adapter-label" style="text-align:left">Adapter:</label>
<select id="net-adapter"></select>
</div>
<label>Username:</label>
<div class="cred-row">
<input type="text" id="admin-user" value="user" class="input-md" autocomplete="off">
<span class="field-warn" id="admin-user-warn"></span>
</div>
<label>Password:</label>
<div class="cred-row">
<input type="password" id="admin-pass" value="test123">
<label>Confirm:</label>
<input type="password" id="admin-confirm" value="test123">
<span class="toggle-pass" onmousedown="showPassword()" onmouseup="hidePassword()" onmouseleave="hidePassword()">&#x1F441;</span>
<span class="field-warn" id="admin-pass-warn"></span>
</div>
<label>Options:</label>
<div class="form-row">
<label class="win-only" title="Disable Secure Boot and enable test-signing"><input type="checkbox" id="test-mode"> Test Mode</label>
<label title="Exposes the VM's sshd on a host-loopback port, tunnelled over vsock"><input type="checkbox" id="ssh-enabled"> SSH Server</label>
</div>
</div>
<div class="modal-buttons">
<button onclick="closeCreateModal()">Cancel</button>
<button id="btn-create-template" class="win-only" disabled onclick="onCreateTemplate()">Build Template</button>
<button id="btn-create" class="primary" disabled onclick="onCreateVm()">Create Sandbox</button>
</div>
</div>
</div>
<!-- Confirm modal -->
<div class="modal-overlay" id="modal-overlay">
<div class="modal">
<h3 id="modal-title">Confirm</h3>
<p id="modal-message"></p>
<label style="display:none; font-size:12px; color:var(--text-dim); cursor:pointer; margin-bottom:8px;">
<input type="checkbox" id="modal-dont-show"> Don't show this again
</label>
<div id="modal-input-row" style="display:none; margin-bottom:12px;">
<label style="font-size:12px; color:var(--text-dim);" id="modal-input-label">Name:</label>
<input type="text" id="modal-input" style="width:100%; margin-top:4px;">
</div>
<div class="modal-buttons">
<button onclick="modalResolve(false)">Cancel</button>
<button class="danger" onclick="modalResolve(true)" id="modal-confirm-btn">Delete</button>
</div>
</div>
</div>
<script src="app.js"></script>
</body>
</html>