Files
pawtoolbox/web/index.html
2026-08-26 07:30:25 +02:00

251 lines
24 KiB
HTML
Raw 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.
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="color-scheme" content="dark light">
<title>PAW Toolbox</title>
<link rel="stylesheet" href="/static/app.css">
</head>
<body>
<header class="topbar">
<div class="brand">
<div class="brand-mark">P</div>
<div><strong>PAW Toolbox</strong><span>Apps · Transfer · Admin-Werkzeuge</span></div>
</div>
<nav class="nav" aria-label="Hauptnavigation">
<button class="nav-btn active" data-view="dashboard">Übersicht</button>
<button class="nav-btn" data-view="clipboard">Zwischenablage</button>
<button class="nav-btn" data-view="password">Passwort</button>
<button class="nav-btn" data-view="files">Dateien</button>
<button class="nav-btn" data-view="tools">Werkzeuge</button>
</nav>
</header>
<main class="shell">
<section id="view-dashboard" class="view active">
<div class="hero">
<div>
<p class="eyebrow">Zentrale Arbeitsoberfläche</p>
<h1>Ein Einstiegspunkt für die PAW</h1>
<p class="lead">Interne Anwendungen öffnen, Werte zwischen Sitzungen übertragen, Kennwörter erzeugen, Dateien austauschen und typische Admin-Aufgaben ohne externe Webseiten erledigen.</p>
</div>
<div class="hero-status"><span class="dot"></span><span id="statusText">Status wird geladen…</span></div>
</div>
<div class="quick-grid four">
<button class="quick-card" data-open-view="clipboard"><span class="quick-icon"></span><strong>Zwischenablage</strong><small>Text und einmalige Secrets</small></button>
<button class="quick-card" data-open-view="password"><span class="quick-icon"></span><strong>Passwortgenerator</strong><small>Direkt in einen Raum ablegen</small></button>
<button class="quick-card" data-open-view="files"><span class="quick-icon"></span><strong>Dateiaustausch</strong><small>Upload, Download, Löschen, SHA-256</small></button>
<button class="quick-card" data-open-view="tools"><span class="quick-icon"></span><strong>Admin-Werkzeuge</strong><small>16 Offline- und Netzwerkhelfer</small></button>
</div>
<div class="section-head">
<div><p class="eyebrow">App Launcher</p><h2>Interne Anwendungen</h2></div>
<div class="filters"><input id="appSearch" type="search" placeholder="Suchen…"><select id="appCategory"><option value="">Alle Kategorien</option></select></div>
</div>
<div id="appsGrid" class="apps-grid"></div>
</section>
<section id="view-clipboard" class="view">
<div class="section-head"><div><p class="eyebrow">Tier-übergreifender Transfer</p><h1>Virtuelle Zwischenablage</h1></div></div>
<article class="panel room-panel">
<div class="panel-head">
<div><h2>Räume</h2><p class="hint room-hint">Klick auf einen Raum öffnet ihn. Leeren behält den Raum, Löschen entfernt ihn dauerhaft.</p></div>
<button id="clipRoomsRefresh" class="btn small">Aktualisieren</button>
</div>
<div id="clipRooms" class="room-list"></div>
</article>
<div class="two-col">
<article class="panel">
<h2>Eintrag ablegen</h2>
<label>Raum<input id="clipRoom" value="default" maxlength="64" autocomplete="off"></label>
<div class="actions"><button id="clipOpenRoom" class="btn small" type="button">Raum öffnen / anlegen</button></div>
<label>Inhalt<textarea id="clipContent" rows="7" placeholder="Text oder Wert…"></textarea></label>
<div class="form-grid">
<label>Autor<input id="clipAuthor" placeholder="optional" autocomplete="off"></label>
<label>TTL in Minuten<input id="clipTTL" type="number" min="0" max="1440" value="30"></label>
</div>
<div class="checks">
<label class="check"><input id="clipSecret" type="checkbox"> <span>Als Secret maskieren</span></label>
<label class="check"><input id="clipOneTime" type="checkbox"> <span>Nach erstem Abruf löschen</span></label>
</div>
<div class="actions"><button id="clipSubmit" class="btn primary">Ablegen</button><button id="clipPasteLocal" class="btn">Lokale Zwischenablage einfügen</button></div>
<p class="hint">Secrets sind in der Verlaufsliste maskiert und werden standardmäßig persistent gespeichert. Bei „einmalig“ wird der Eintrag nach dem expliziten Abruf dauerhaft entfernt.</p>
</article>
<article class="panel">
<div class="panel-head"><div><h2>Verlauf</h2><span id="clipRoomBadge" class="badge">default</span></div><div class="actions compact"><button id="clipRefresh" class="btn small">Aktualisieren</button><button id="clipClear" class="btn small danger">Leeren</button></div></div>
<div id="clipHistory" class="clip-list"></div>
</article>
</div>
</section>
<section id="view-password" class="view">
<div class="section-head"><div><p class="eyebrow">Kryptographisch zufällig</p><h1>Passwortgenerator</h1></div></div>
<div class="two-col">
<article class="panel">
<h2>Generieren</h2>
<div class="form-grid">
<label>Anzahl<input id="pwCount" type="number" min="1" max="20" value="1"></label>
<label>Zielraum<input id="pwRoom" value="default" maxlength="64"></label>
<label>TTL in Minuten<input id="pwTTL" type="number" min="0" max="1440" value="15"></label>
</div>
<div class="checks">
<label class="check"><input id="pwStore" type="checkbox" checked> <span>In virtueller Zwischenablage ablegen</span></label>
<label class="check"><input id="pwOneTime" type="checkbox" checked> <span>Nur einmal abrufbar</span></label>
</div>
<button id="pwGenerate" class="btn primary">Passwort generieren</button>
<p class="hint">Generator-Grundeinstellungen werden per <code>PWGEN_*</code>-Umgebungsvariablen festgelegt.</p>
</article>
<article class="panel">
<div class="panel-head"><h2>Ergebnis</h2><button id="pwCopy" class="btn small">Lokal kopieren</button></div>
<pre id="pwOutput" class="secret-output">Noch kein Passwort erzeugt.</pre>
<div id="pwMeta" class="meta-row"></div>
</article>
</div>
</section>
<section id="view-files" class="view">
<div class="section-head"><div><p class="eyebrow">Einfacher Dateiaustausch</p><h1>Dateien</h1></div><button id="filesRefresh" class="btn">Aktualisieren</button></div>
<article class="panel upload-panel">
<form id="uploadForm">
<label class="file-drop">Datei auswählen<input id="uploadFile" name="file" type="file" required><span id="filePicked">Keine Datei ausgewählt</span></label>
<label>Quelle / Bearbeiter<input id="fileUploader" name="uploader" placeholder="z. B. Sandbox, Tier-0, Kürzel"></label>
<button class="btn primary" type="submit">Hochladen</button>
</form>
<p id="uploadStatus" class="hint">Maximale Dateigröße: wird vom Server vorgegeben.</p>
</article>
<div id="filesList" class="file-list"></div>
</section>
<section id="view-tools" class="view">
<div class="section-head tool-head">
<div><p class="eyebrow">Lokale Admin-Helfer</p><h1>Werkzeuge</h1><p class="lead small-lead">Die meisten Werkzeuge verarbeiten Inhalte ausschließlich im Browser. Nur DNS, TCP-Test und serverseitige Datei-/Zertifikats-/ZIP-Analyse verwenden die Toolbox-API.</p></div>
<input id="toolSearch" class="tool-search" type="search" placeholder="Werkzeug suchen…">
</div>
<div class="tool-layout">
<aside id="toolNav" class="tool-nav" aria-label="Werkzeuge">
<button class="tool-nav-btn active" data-tool="onboarding" data-keywords="ad benutzer user onboarding account">Onboarding Assistant</button>
<button class="tool-nav-btn" data-tool="fileinspect" data-keywords="hash sha md5 datei file magic mime">Hash / File Inspector</button>
<button class="tool-nav-btn" data-tool="cert" data-keywords="zertifikat certificate pem der pfx crt cer tls">Certificate Inspector</button>
<button class="tool-nav-btn" data-tool="formatter" data-keywords="json xml yaml formatter config">JSON / XML / YAML</button>
<button class="tool-nav-btn" data-tool="diff" data-keywords="text diff vergleich">Text Diff</button>
<button class="tool-nav-btn" data-tool="adconv" data-keywords="ad sid guid uuid timestamp filetime ldap zeit">AD Converter</button>
<button class="tool-nav-btn" data-tool="dns" data-keywords="dns a aaaa ptr cname mx txt srv ldap kerberos">DNS Lookup</button>
<button class="tool-nav-btn" data-tool="subnet" data-keywords="ip subnet cidr ipv4 ipv6 netz">IP / Subnet Calculator</button>
<button class="tool-nav-btn" data-tool="encoder" data-keywords="base64 hex url encode decode">Base64 / Hex / URL</button>
<button class="tool-nav-btn" data-tool="powershell" data-keywords="powershell command builder ad">PowerShell Builder</button>
<button class="tool-nav-btn" data-tool="csv" data-keywords="csv tabelle filter export">CSV Viewer</button>
<button class="tool-nav-btn" data-tool="connectivity" data-keywords="tcp port connectivity host verbindung">Connectivity Checker</button>
<button class="tool-nav-btn" data-tool="regex" data-keywords="regex regexp tester">Regex Tester</button>
<button class="tool-nav-btn" data-tool="transform" data-keywords="text transform sort unique prefix suffix case">Text Transformer</button>
<button class="tool-nav-btn" data-tool="archive" data-keywords="zip archive inhalt viewer">ZIP Archive Viewer</button>
<button class="tool-nav-btn" data-tool="encoding" data-keywords="encoding utf8 bom windows1252 charset">Encoding Converter</button>
</aside>
<div class="tool-content">
<article id="tool-onboarding" class="panel tool-panel active">
<div class="panel-head"><div><h2>Onboarding Assistant</h2><span class="badge">AD</span></div><button id="onbCopy" class="btn small">PowerShell kopieren</button></div>
<div class="form-grid three">
<label>Vorname<input id="onbFirst" placeholder="Max"></label><label>Nachname<input id="onbLast" placeholder="Mustermann"></label><label>DisplayName-Format<select id="onbDisplayMode"><option value="lastfirst">Nachname, Vorname</option><option value="firstlast">Vorname Nachname</option></select></label>
<label>UPN-Suffix<input id="onbDomain" placeholder="example.local"></label><label>E-Mail-Domain<input id="onbMailDomain" placeholder="example.de"></label><label>Basis-OU<input id="onbOU" placeholder="OU=Users,DC=example,DC=local"></label>
<label>Abteilung<input id="onbDepartment"></label><label>Funktion<input id="onbTitle"></label><label>Standort<input id="onbOffice"></label>
<label>Gruppen (kommagetrennt)<input id="onbGroups" placeholder="GG_VPN, GG_Office"></label><label>Zielraum für Kennwort<input id="onbRoom" value="onboarding"></label><label>TTL Minuten<input id="onbTTL" type="number" min="1" max="1440" value="15"></label>
</div>
<div class="actions top-gap"><button id="onbBuild" class="btn primary">Daten erzeugen</button><button id="onbPassword" class="btn">Kennwort generieren + einmalig ablegen</button></div>
<div class="result-grid top-gap"><div><span class="result-label">sAMAccountName</span><code id="onbSam"></code></div><div><span class="result-label">UPN</span><code id="onbUPN"></code></div><div><span class="result-label">E-Mail</span><code id="onbMail"></code></div><div><span class="result-label">DisplayName</span><code id="onbDisplay"></code></div></div>
<label class="top-gap">PowerShell<textarea id="onbPS" rows="11" class="mono" readonly></textarea></label>
<p id="onbSecretStatus" class="hint">Der Assistant erzeugt Befehle, führt aber keine AD-Änderungen selbst aus.</p>
</article>
<article id="tool-fileinspect" class="panel tool-panel">
<div class="panel-head"><h2>Hash / File Inspector</h2><button id="fiCopyHash" class="btn small">SHA-256 kopieren</button></div>
<form id="fiForm" class="inline-form"><label class="file-drop">Datei analysieren<input id="fiFile" type="file" required><span id="fiPicked">Keine Datei ausgewählt</span></label><button class="btn primary" type="submit">Analysieren</button></form>
<div id="fiResult" class="kv-list top-gap"></div>
</article>
<article id="tool-cert" class="panel tool-panel">
<h2>Certificate Inspector</h2>
<form id="certForm" class="form-grid top-gap"><label class="file-drop">PEM / CER / CRT / DER / PFX<input id="certFile" type="file" accept=".pem,.cer,.crt,.der,.pfx,.p12" required><span id="certPicked">Keine Datei ausgewählt</span></label><label>PFX/P12-Kennwort (optional)<input id="certPassword" type="password" autocomplete="off"><span class="hint">Nur für die lokale Serveranalyse verwendet.</span></label><div class="actions"><button class="btn primary" type="submit">Zertifikat prüfen</button></div></form>
<div id="certResult" class="top-gap"></div>
</article>
<article id="tool-formatter" class="panel tool-panel">
<div class="panel-head"><h2>JSON / XML / YAML Formatter</h2><div class="actions"><button id="fmtCopy" class="btn small">Ergebnis kopieren</button></div></div>
<div class="form-grid"><label>Format<select id="fmtType"><option>JSON</option><option>XML</option><option>YAML</option></select></label><label>Aktion<select id="fmtAction"><option value="pretty">Formatieren</option><option value="minify">Minify / kompakt</option><option value="validate">Validieren</option></select></label></div>
<div class="split-edit top-gap"><label>Eingabe<textarea id="fmtInput" rows="15" class="mono"></textarea></label><label>Ergebnis<textarea id="fmtOutput" rows="15" class="mono" readonly></textarea></label></div>
<div class="actions top-gap"><button id="fmtRun" class="btn primary">Ausführen</button></div><p id="fmtStatus" class="hint">YAML wird konservativ auf Einrückung und häufige Strukturfehler geprüft; es erfolgt keine semantische Neuordnung.</p>
</article>
<article id="tool-diff" class="panel tool-panel">
<div class="panel-head"><h2>Text Diff</h2><button id="diffRun" class="btn primary small">Vergleichen</button></div>
<div class="split-edit"><label>Links<textarea id="diffA" rows="14" class="mono"></textarea></label><label>Rechts<textarea id="diffB" rows="14" class="mono"></textarea></label></div>
<pre id="diffOutput" class="diff-output top-gap"></pre>
</article>
<article id="tool-adconv" class="panel tool-panel">
<h2>AD SID / GUID / Timestamp Converter</h2>
<div class="subtools top-gap">
<section class="subpanel"><h3>GUID / UUID</h3><label>GUID<input id="guidInput" class="mono" placeholder="00112233-4455-6677-8899-aabbccddeeff"></label><div class="actions top-gap"><button id="guidNew" class="btn">Neue UUID</button><button id="guidConvert" class="btn primary">AD-Bytefolge</button></div><pre id="guidOutput" class="tool-output"></pre></section>
<section class="subpanel"><h3>SID</h3><label>SID oder Hex<textarea id="sidInput" rows="3" class="mono" placeholder="S-1-5-21-... oder 0105..."></textarea></label><div class="actions top-gap"><button id="sidConvert" class="btn primary">Konvertieren</button></div><pre id="sidOutput" class="tool-output"></pre></section>
<section class="subpanel"><h3>Zeit</h3><label>ISO, Unix, Unix-ms oder Windows FILETIME<input id="timeInput" class="mono" placeholder="2026-08-12T18:00:00Z"></label><div class="actions top-gap"><button id="timeNow" class="btn">Jetzt</button><button id="timeConvert" class="btn primary">Umrechnen</button></div><pre id="timeOutput" class="tool-output"></pre></section>
</div>
</article>
<article id="tool-dns" class="panel tool-panel">
<h2>DNS Lookup</h2><p class="hint">Die DNS-Abfrage erfolgt aus Sicht des PAW-Toolbox-Servers.</p><div class="form-grid three top-gap"><label>Name / IP<input id="dnsName" class="mono" placeholder="_ldap._tcp.example.local"></label><label>Record-Typ<select id="dnsType"><option>A</option><option>AAAA</option><option>CNAME</option><option>MX</option><option>TXT</option><option>SRV</option><option>PTR</option></select></label><div class="actions align-end"><button id="dnsRun" class="btn primary">Abfragen</button></div></div><pre id="dnsOutput" class="tool-output top-gap"></pre>
</article>
<article id="tool-subnet" class="panel tool-panel">
<h2>IP / Subnet Calculator</h2><div class="form-grid top-gap"><label>IPv4/IPv6 mit CIDR<input id="subnetInput" class="mono" placeholder="10.20.30.40/24"></label><div class="actions align-end"><button id="subnetRun" class="btn primary">Berechnen</button></div></div><div id="subnetOutput" class="kv-list top-gap"></div>
</article>
<article id="tool-encoder" class="panel tool-panel">
<div class="panel-head"><h2>Base64 / Hex / URL Encoder</h2><button id="encSwap" class="btn small">Eingabe ⇄ Ergebnis</button></div>
<div class="form-grid three"><label>Verfahren<select id="encType"><option value="base64">Base64 (UTF-8)</option><option value="hex">Hex (UTF-8)</option><option value="url">URL Component</option></select></label><label>Richtung<select id="encMode"><option value="encode">Encode</option><option value="decode">Decode</option></select></label><div class="actions align-end"><button id="encRun" class="btn primary">Ausführen</button></div></div>
<div class="split-edit top-gap"><label>Eingabe<textarea id="encInput" rows="12" class="mono"></textarea></label><label>Ergebnis<textarea id="encOutput" rows="12" class="mono" readonly></textarea></label></div>
</article>
<article id="tool-powershell" class="panel tool-panel">
<div class="panel-head"><h2>PowerShell Command Builder</h2><button id="psCopy" class="btn small">Kopieren</button></div>
<div class="form-grid three"><label>Befehl<select id="psTemplate"><option value="getuser">Get-ADUser</option><option value="unlock">Unlock-ADAccount</option><option value="addgroup">Add-ADGroupMember</option><option value="resetpw">Set-ADAccountPassword</option><option value="newuser">New-ADUser</option></select></label><label>Benutzer / Identity<input id="psIdentity"></label><label>Gruppe<input id="psGroup"></label><label>Vorname<input id="psFirst"></label><label>Nachname<input id="psLast"></label><label>OU-Pfad<input id="psOU"></label></div>
<div class="actions top-gap"><button id="psBuild" class="btn primary">Befehl erzeugen</button></div><pre id="psOutput" class="tool-output top-gap"></pre><p class="hint">Nur Generator: Die Toolbox führt keine PowerShell-Kommandos aus.</p>
</article>
<article id="tool-csv" class="panel tool-panel">
<div class="panel-head"><h2>CSV Viewer</h2><div class="actions"><button id="csvExport" class="btn small">Gefiltert exportieren</button></div></div>
<div class="form-grid three"><label class="file-drop">CSV laden<input id="csvFile" type="file" accept=".csv,.txt"><span id="csvPicked">Keine Datei ausgewählt</span></label><label>Trennzeichen<select id="csvDelimiter"><option value="auto">Automatisch</option><option value=";">Semikolon ;</option><option value=",">Komma ,</option><option value="\t">Tab</option></select></label><label>Filter<input id="csvFilter" type="search" placeholder="Zeilen filtern…"></label></div>
<div id="csvMeta" class="hint top-gap"></div><div id="csvTableWrap" class="table-wrap top-gap"></div>
</article>
<article id="tool-connectivity" class="panel tool-panel">
<h2>Connectivity Checker</h2><p class="hint">Der TCP-Test erfolgt aus Sicht des PAW-Toolbox-Servers, nicht aus Sicht des Browsers der Tier-VM.</p><div class="form-grid three top-gap"><label>Hostname / IP<input id="connHost" class="mono" placeholder="dc01.example.local"></label><label>Port<input id="connPort" type="number" min="1" max="65535" value="636"></label><label>Timeout ms<input id="connTimeout" type="number" min="100" max="10000" value="3000"></label></div><div class="actions top-gap"><button id="connRun" class="btn primary">TCP-Verbindung prüfen</button></div><div id="connOutput" class="kv-list top-gap"></div>
</article>
<article id="tool-regex" class="panel tool-panel">
<div class="panel-head"><h2>Regex Tester</h2><button id="regexRun" class="btn primary small">Testen</button></div><div class="form-grid"><label>Regulärer Ausdruck<input id="regexPattern" class="mono" placeholder="^CN=(.*?),"></label><label>Flags<input id="regexFlags" class="mono" value="gim"></label></div><label class="top-gap">Testtext<textarea id="regexText" rows="10" class="mono"></textarea></label><pre id="regexOutput" class="tool-output top-gap"></pre>
</article>
<article id="tool-transform" class="panel tool-panel">
<h2>Text Transformer</h2><div class="form-grid three top-gap"><label>Aktion<select id="transformAction"><option value="trim">Zeilen trimmen</option><option value="sort">Zeilen sortieren</option><option value="unique">Duplikate entfernen</option><option value="upper">GROSSSCHRIFT</option><option value="lower">kleinschrift</option><option value="prefix">Prefix hinzufügen</option><option value="suffix">Suffix hinzufügen</option><option value="reverse">Zeilenreihenfolge umkehren</option></select></label><label>Prefix / Suffix<input id="transformAffix"></label><div class="actions align-end"><button id="transformRun" class="btn primary">Transformieren</button></div></div><div class="split-edit top-gap"><label>Eingabe<textarea id="transformInput" rows="13" class="mono"></textarea></label><label>Ergebnis<textarea id="transformOutput" rows="13" class="mono" readonly></textarea></label></div>
</article>
<article id="tool-archive" class="panel tool-panel">
<h2>ZIP Archive Viewer</h2><form id="archiveForm" class="inline-form top-gap"><label class="file-drop">ZIP auswählen<input id="archiveFile" type="file" accept=".zip" required><span id="archivePicked">Keine Datei ausgewählt</span></label><button class="btn primary" type="submit">Inhalt anzeigen</button></form><div id="archiveMeta" class="hint top-gap"></div><div id="archiveTable" class="table-wrap top-gap"></div>
</article>
<article id="tool-encoding" class="panel tool-panel">
<h2>Encoding Converter</h2><div class="form-grid three top-gap"><label class="file-drop">Textdatei laden<input id="encodingFile" type="file"><span id="encodingPicked">Keine Datei ausgewählt</span></label><label>Quell-Encoding<select id="encodingSource"><option value="utf-8">UTF-8</option><option value="windows-1252">Windows-1252</option><option value="iso-8859-1">ISO-8859-1</option><option value="utf-16le">UTF-16 LE</option><option value="utf-16be">UTF-16 BE</option></select></label><label>Ziel<select id="encodingTarget"><option value="utf8">UTF-8</option><option value="utf8bom">UTF-8 mit BOM</option></select></label></div><label class="top-gap">Vorschau<textarea id="encodingText" rows="13" class="mono"></textarea></label><div class="actions top-gap"><button id="encodingDownload" class="btn primary">Konvertierte Datei herunterladen</button></div><p class="hint">Die Konvertierung läuft vollständig im Browser.</p>
</article>
</div>
</div>
</section>
</main>
<div id="toast" class="toast" role="status" aria-live="polite"></div>
<script src="/static/app.js" defer></script>
</body>
</html>