185 lines
9.5 KiB
HTML
185 lines
9.5 KiB
HTML
<!-- app/templates/base.html
|
|
*
|
|
* LitterBox shell — terminal/IDE layout.
|
|
* - top titlebar: brand (logo + name) + breadcrumb + version
|
|
* - left sidebar: grouped navigation + system-status footer
|
|
* - main column: optional tabs row + content
|
|
*
|
|
* Tailwind utility classes are still available; pages are encouraged
|
|
* to use the .lb-* component classes from app/static/css/style.css.
|
|
-->
|
|
<!DOCTYPE html>
|
|
{% set favicon_url = url_for('static', filename='favicon.ico') %}
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
|
<title>{{ config.application.name }} — Payload Analysis</title>
|
|
<link rel="icon" type="image/x-icon" href="{{ favicon_url }}"/>
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/tailwind.min.css') }}"/>
|
|
<link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}"/>
|
|
{% block head %}{% endblock %}
|
|
</head>
|
|
<body>
|
|
|
|
<div class="lb-page">
|
|
|
|
<!-- Titlebar: brand + breadcrumb -->
|
|
<div class="lb-titlebar">
|
|
<a href="/" class="lb-tb-brand" title="LitterBox home">
|
|
<img src="{{ favicon_url }}" alt="" class="lb-tb-mark"/>
|
|
<span class="lb-tb-name">{{ config.application.name }}</span>
|
|
</a>
|
|
<span class="lb-tb-divider"></span>
|
|
<span class="lb-tb-path">
|
|
{% block breadcrumb %}Home{% endblock %}
|
|
</span>
|
|
</div>
|
|
|
|
<div class="lb-shell">
|
|
|
|
<!-- Sidebar -->
|
|
<aside class="lb-sidebar">
|
|
<div class="lb-nav-group">
|
|
<div class="lb-nav-heading">Analyse</div>
|
|
|
|
<a href="/" class="lb-nav-item{% if active_nav == 'upload' %} active{% endif %}">
|
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"/>
|
|
</svg>
|
|
<span class="lb-nav-text">Upload</span>
|
|
</a>
|
|
|
|
<button onclick="showProcessWarning()" class="lb-nav-item{% if active_nav == 'process' %} active{% endif %}">
|
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3"/>
|
|
</svg>
|
|
<span class="lb-nav-text">Processes</span>
|
|
</button>
|
|
|
|
<a href="/holygrail" class="lb-nav-item{% if active_nav == 'holygrail' %} active{% endif %}">
|
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M7 9v2a5 5 0 0010 0V9"/>
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M6 9h12"/>
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 16v3"/>
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 19h6"/>
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M6 9h-1a1 1 0 000 2h1M18 9h1a1 1 0 010 2h-1"/>
|
|
</svg>
|
|
<span class="lb-nav-text">HolyGrail</span>
|
|
</a>
|
|
</div>
|
|
|
|
<div class="lb-nav-group">
|
|
<div class="lb-nav-heading">Tools</div>
|
|
|
|
<button onclick="openDoppelganger()" class="lb-nav-item{% if active_nav == 'doppelganger' %} active{% endif %}">
|
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M8 7h12M8 12h12M8 17h12"/>
|
|
<circle cx="4" cy="7" r="1" stroke-width="1.5"/>
|
|
<circle cx="4" cy="12" r="1" stroke-width="1.5"/>
|
|
<circle cx="4" cy="17" r="1" stroke-width="1.5"/>
|
|
</svg>
|
|
<span class="lb-nav-text">Doppelganger</span>
|
|
</button>
|
|
|
|
<button onclick="showSummary()" class="lb-nav-item{% if active_nav == 'summary' %} active{% endif %}">
|
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
|
</svg>
|
|
<span class="lb-nav-text">Summary</span>
|
|
</button>
|
|
|
|
<a href="/whiskers" class="lb-nav-item{% if active_nav == 'whiskers' %} active{% endif %}">
|
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 17a4 4 0 008 0M5 17a8 8 0 0116 0H5z"/>
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 13V3M9 6l3-3 3 3"/>
|
|
</svg>
|
|
<span class="lb-nav-text">Whiskers</span>
|
|
</a>
|
|
|
|
<button onclick="cleanupSystem()" class="lb-nav-item">
|
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/>
|
|
</svg>
|
|
<span class="lb-nav-text">Cleanup</span>
|
|
</button>
|
|
</div>
|
|
|
|
{% block sidebar_extra %}{% endblock %}
|
|
|
|
<!-- Status footer + version -->
|
|
<div class="lb-sidebar-foot">
|
|
<span id="status-indicator" class="lb-status-dot"></span>
|
|
<span class="lb-status-text">
|
|
<span id="status-text">Checking…</span>
|
|
</span>
|
|
<span class="lb-sidebar-version">v{{ config.application.version }}</span>
|
|
</div>
|
|
|
|
<!-- Hidden popover for issues -->
|
|
<div id="issues-popover" class="hidden lb-fade-in" style="position: absolute; left: 16px; bottom: 60px; background: var(--lb-bg); border: 1px solid var(--lb-border-hi); padding: 12px; max-width: 220px; z-index: 50;">
|
|
<div style="font-size: 12px; color: var(--lb-accent); text-transform: uppercase; letter-spacing: 0.1em; margin-bottom: 6px;">System Issues</div>
|
|
<ul id="issues-list" style="margin: 0; padding-left: 16px; font-size: 12px; color: var(--lb-text-dim); list-style: disc;"></ul>
|
|
</div>
|
|
</aside>
|
|
|
|
<!-- Main column: tabs (optional) + content -->
|
|
<div class="lb-main">
|
|
{% block tabs %}{% endblock %}
|
|
<main class="lb-content">
|
|
{% block content %}{% endblock %}
|
|
</main>
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- Process Analysis Modal -->
|
|
<div id="processWarningModal" class="hidden lb-modal-backdrop">
|
|
<div class="lb-modal lb-fade-in">
|
|
<div class="lb-modal-hdr">
|
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M3 6l3 1m0 0l-3 9a5.002 5.002 0 006.001 0M6 7l3 9M6 7l6-2m6 2l3-1m-3 1l-3 9a5.002 5.002 0 006.001 0M18 7l3 9m-3-9l-6-2m0-2v2m0 16V5m0 16H9m3 0h3"/>
|
|
</svg>
|
|
Process Analysis
|
|
</div>
|
|
<div class="lb-modal-body">
|
|
<div style="margin-bottom: 14px;">
|
|
<label class="lb-eyebrow" style="display:block; margin-bottom: 6px;">Process ID (PID)</label>
|
|
<input type="number" id="processId" class="lb-input lb-mono" placeholder="Enter process ID"/>
|
|
</div>
|
|
<p style="color: var(--lb-sev-medium); font-size: 12px;">This will perform dynamic analysis on the running process.</p>
|
|
</div>
|
|
<div class="lb-modal-foot">
|
|
<button onclick="hideProcessWarning()" class="lb-btn lb-btn-ghost">Cancel</button>
|
|
<button onclick="startProcessAnalysis()" class="lb-btn lb-btn-primary">Start Analysis</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Cleanup Warning Modal -->
|
|
<div id="cleanupWarningModal" class="hidden lb-modal-backdrop">
|
|
<div class="lb-modal lb-fade-in">
|
|
<div class="lb-modal-hdr">
|
|
<svg fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"/>
|
|
</svg>
|
|
System Cleanup
|
|
</div>
|
|
<div class="lb-modal-body">
|
|
<p style="margin-bottom: 10px;">This will permanently remove all uploaded files and analysis data.</p>
|
|
<p style="color: var(--lb-accent);">Are you sure you want to proceed?</p>
|
|
</div>
|
|
<div class="lb-modal-foot">
|
|
<button onclick="hideCleanupWarning()" class="lb-btn lb-btn-ghost">Cancel</button>
|
|
<button onclick="executeCleanup()" class="lb-btn lb-btn-danger">Proceed</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% block scripts %}{% endblock %}
|
|
<script type="module" src="{{ url_for('static', filename='js/base.js') }}"></script>
|
|
</body>
|
|
</html>
|