Privater Bereich /api/privat fuer Behoerdenfotos (d4rk-rp-planung#227 H1)
Polizeifotos aus dem Spiel duerfen nicht unter /f/ liegen, wo jeder sie mit der Adresse bekommt. Neu: - eigener Ordner DATA_DIR/privat neben files/ (fuer /f/ und /t/ durch Bauart unerreichbar), eigene Tabelle privat_media, eigene Vorschauen - PUT/GET /api/privat/datei/<pfad>, ?vorschau=1; kein Ueberschreiben (409), kein Loeschweg; Cache-Control private, no-store - Token-Fessel "privat": ein privater Token kommt an keinen oeffentlichen Weg (upload, Fivemanage, Liste), ein oeffentlicher an keinen privaten - Dashboard: Kaestchen "nur privater Bereich" beim Anlegen und Bearbeiten, Marke in der Liste - checkPathUnter: dieselbe Pfadregel fuer beide Ablagen - tools/sichern.ps1 packt privat/ mit und zaehlt Dateien gegen Eintraege Geprueft mit tools/privat-pruefen.mjs gegen einen Wegwerf-Container des Abbilds: 21/21, mit Kontrollen (oeffentliches Bild MUSS unter /f/ kommen). Dashboard gemessen (kopfloser Edge): 7/7. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
1 parent
c8080fb2eb
commit
6630def7b2
14 files changed
+641
-15
No files matched your search
+24
-2
@@ -175,7 +175,17 @@ Schritt 'Bilder und Datenbank packen'
|
||||
# Ordner gar nicht, und tar braeche mit "Cannot stat" ab. Eine Sicherung, die
|
||||
# daran scheitert, dass nichts im Papierkorb liegt, waere absurd. Das Volume
|
||||
# haengt NUR LESEND -- ein `mkdir` als Ausweg ginge hier also ohnehin nicht.
|
||||
$packen = "if [ -d /data/papierkorb ]; then tar czf '/out/$name' -C /data files -C /data/.sicherung media.db -C /data papierkorb; else tar czf '/out/$name' -C /data files -C /data/.sicherung media.db; fi"
|
||||
#
|
||||
# DER PRIVATE BEREICH MUSS EBENSO MIT (d4rk-rp-planung#227): seine Eintraege
|
||||
# stehen in media.db (privat_media), die Dateien unter /data/privat. Fehlte der
|
||||
# Ordner im Archiv, saehe eine Wiederherstellung vollstaendig aus und haette
|
||||
# jedes Behoerdenfoto verloren. Die Vorschauen (/data/privat-vorschau) bleiben
|
||||
# draussen wie /data/thumbs.
|
||||
#
|
||||
# Beide Ordner sind wahlweise, deshalb die Liste `extra` und `${extra:+...}`:
|
||||
# ist sie leer, steht hinter media.db gar nichts mehr. Die Dollarzeichen der
|
||||
# Shell tragen einen Backtick, sonst setzt PowerShell sie selbst ein.
|
||||
$packen = "extra=''; if [ -d /data/papierkorb ]; then extra=`"`$extra papierkorb`"; fi; if [ -d /data/privat ]; then extra=`"`$extra privat`"; fi; tar czf '/out/$name' -C /data files -C /data/.sicherung media.db `${extra:+-C /data `$extra}"
|
||||
docker run --rm `
|
||||
-v "${Volume}:/data:ro" `
|
||||
-v "${Ziel}:/out" `
|
||||
@@ -209,9 +219,12 @@ const db = require('better-sqlite3')('/tmp/p/media.db', { readonly: true, fileMu
|
||||
const m = db.prepare('SELECT COUNT(*) AS n FROM media').get().n;
|
||||
const t = db.prepare('SELECT COUNT(*) AS n FROM tokens').get().n;
|
||||
const u = db.prepare('SELECT COUNT(*) AS n FROM users').get().n;
|
||||
console.log(JSON.stringify({ media: m, tokens: t, users: u }));
|
||||
let p = -1;
|
||||
try { p = db.prepare('SELECT COUNT(*) AS n FROM privat_media').get().n; } catch (e) {}
|
||||
console.log(JSON.stringify({ media: m, tokens: t, users: u, privat: p }));
|
||||
"
|
||||
find /tmp/p/files -type f | wc -l
|
||||
find /tmp/p/privat -type f 2>/dev/null | wc -l
|
||||
"@) -replace "`r", ''
|
||||
|
||||
$pruefung = docker run --rm -v "${Ziel}:/in:ro" --entrypoint sh $Abbild -c $skript
|
||||
@@ -220,8 +233,17 @@ if ($LASTEXITCODE -ne 0) { Schlecht "Pruefung fehlgeschlagen: $pruefung"; exit 1
|
||||
$zeilen = @($pruefung -split "`n" | Where-Object { $_.Trim() })
|
||||
$zahlen = $zeilen[0] | ConvertFrom-Json
|
||||
$dateien = [int]$zeilen[1].Trim()
|
||||
$privatDateien = [int]$zeilen[2].Trim()
|
||||
|
||||
Gut "in der Sicherung: $($zahlen.media) Medieneintraege, $dateien Dateien, $($zahlen.tokens) Token, $($zahlen.users) Benutzer"
|
||||
# -1 heisst: die Tabelle gibt es in dieser Sicherung noch nicht (aelterer Stand).
|
||||
if ($zahlen.privat -ge 0) {
|
||||
Gut "privater Bereich: $($zahlen.privat) Eintraege, $privatDateien Dateien"
|
||||
if ($privatDateien -ne $zahlen.privat) {
|
||||
Schlecht "PASST NICHT: $privatDateien private Dateien zu $($zahlen.privat) Eintraegen - Behoerdenfotos fehlen in der Sicherung."
|
||||
exit 1
|
||||
}
|
||||
}
|
||||
|
||||
if ($erwartet -ge 0 -and $zahlen.media -ne $erwartet) {
|
||||
Schlecht "PASST NICHT: erwartet waren $erwartet Eintraege."
|
||||
|
||||
Reference in new issue
Block a user