Adds a Files section at the bottom of the server detail page that lists the kernel-overlayfs merged view at runtime/<server_id>/merged/. Reuses the overlay file-tree partial via two new template variables: - files_base_url: parent passes "/overlays/<id>" or "/servers/<id>" - download_supported: false for servers (runtime holds large game binaries; no download endpoint), true for overlays (existing behavior) New service helper safe_resolve_for_server_listing() rejects path traversal beyond the merged root and returns None when the overlayfs mount doesn't exist (server never started or just reset). New route GET /servers/<id>/files?path=<rel> returns the lazy-load file-tree fragment, gated to the server owner. No download counterpart. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
26 lines
959 B
HTML
26 lines
959 B
HTML
{% if entry.kind == 'dir' %}
|
||
<li class="file-tree-row file-tree-row-dir">
|
||
<button type="button"
|
||
class="file-tree-toggle"
|
||
aria-expanded="false"
|
||
data-files-url="{{ files_base_url }}/files?path={{ entry.rel|urlencode }}">
|
||
<span class="chevron" aria-hidden="true">›</span>{{ entry.name }}/
|
||
</button>
|
||
<div class="file-tree-children" hidden></div>
|
||
</li>
|
||
{% else %}
|
||
<li class="file-tree-row file-tree-row-file">
|
||
{% if entry.broken %}
|
||
<span>{{ entry.name }}</span>
|
||
<span class="file-tree-badge file-tree-badge-warn">broken link</span>
|
||
{% else %}
|
||
{% if download_supported %}
|
||
<a href="{{ files_base_url }}/files/download?path={{ entry.rel|urlencode }}">{{ entry.name }}</a>
|
||
{% else %}
|
||
<span>{{ entry.name }}</span>
|
||
{% endif %}
|
||
{% if entry.is_symlink %}<span class="file-tree-badge">link</span>{% endif %}
|
||
<span class="muted">{{ entry.size_human }}</span>
|
||
{% endif %}
|
||
</li>
|
||
{% endif %}
|