Repository navigation
Releases: listiges-kaenguru/ausflugskiste
Release list
Ausflugskiste 0.5.0
Hinzugefügt
- Versionsprüfung: Ganz unten im Profil steht jetzt, ob auf GitHub eine neuere Version erschienen ist (für Admins mit Link zum Release), sonst „Das ist die neueste Version.“
- Die Abfrage stellt der Server, nicht der Browser (neuer Endpunkt
GET version, über cURL oderallow_url_fopen). Er merkt sich das Ergebnis 12 Stunden indata/release.jsonund fragt nach einem Fehlschlag frühestens nach einer Stunde erneut. Daten der Nutzer werden dabei nicht übertragen.
Hinweise zum Update
Dateien überschreiben, den Ordner data/ dabei nicht löschen.
Ausflugskiste 0.4.2
Hinzugefügt
BENUTZERHANDBUCH.md: die Anleitung für Nutzer und Administratoren liegt jetzt im App-Repo und damit auch in
der Release-ZIP. Bisher stand sie nur auf der Projektseite, die sie künftig aus dieser Datei baut.
Geändert
- Code aufgeräumt, ohne Änderung an Oberfläche, Verhalten oder API: ungenutztes Icon und CSS-Regeln entfernt,
doppelte Bausteine zusammengefasst (Kopieren-Button, Passkey-Listeneintrag, Adresszeile, Passwortprüfung,
Rate-Limit für 2FA-Codes, Bildpfade, lesbare Zufallscodes) und die Prüfung des Datenverzeichnisses vereinfacht. - Hinweise für Coding-Agents stehen jetzt in
CLAUDE.md(stattAGENTS.md),IDEEN.mdist in ToDo und Ideen gegliedert.
v0.4.1 – 2FA-Geheimnisse verschlüsselt
Sicherheit
- Die Geheimnisse der Zwei-Faktor-Anmeldung werden jetzt verschlüsselt gespeichert (AES-256-GCM, wie in
AuslagenFlow). Der Schlüssel liegt in der neuen Dateidata/secret.keystatt in der Datenbank und wird beim
ersten Bedarf erzeugt; die Benutzer-ID ist mitgebunden, ein Geheimnis lässt sich nicht in ein anderes Konto
kopieren. Bestehende Geheimnisse aus 0.4.0 werden beim ersten Aufruf automatisch verschlüsselt, eingerichtete
Authenticator-Apps funktionieren weiter. Die Zwei-Faktor-Anmeldung braucht dafür die PHP-Erweiterung
openssl(wie Passkeys);meliefert dazutotp. Passt der Schlüssel nicht mehr, meldet die Anmeldung das
verständlich (TOTP_KEY_ERROR) statt „Code falsch“.
v0.4.0 – Zwei-Faktor-Anmeldung
Hinzugefügt
- Zwei-Faktor-Anmeldung (TOTP): Unter Profil → Anmeldung & Sicherheit lässt sich eine Authenticator-App
einrichten (QR-Code, alternativ Link oder Schlüssel zum Abtippen). Danach fragt die Anmeldung mit Passwort
zusätzlich nach dem sechsstelligen Code; die Anmeldung mit Passkey bleibt ohne Code. Zehn
Wiederherstellungscodes (einmalig angezeigt, zum Kopieren oder Herunterladen) helfen, wenn das Handy fehlt;
neue lassen sich jederzeit erzeugen. Abschalten und neue Codes verlangen einen gültigen Code. Jeder Code gilt
nur einmal, höchstens 5 Fehlversuche in 5 Minuten je Benutzer. Der QR-Code entsteht im Browser ohne
externe Bibliothek. - Admins können die Zwei-Faktor-Anmeldung eines Benutzers unter Profil → Benutzer abschalten (z. B. nach
Handyverlust); die Benutzerliste zeigt „2FA aktiv“. Neuer CLI-Befehldisable-totp <name>,list-users
zeigt „2FA“. - Neue Endpunkte
login/totp,totp(GET/POST/DELETE),totp/setup,totp/recovery-codesund
DELETE users/<id>/totp;meunduserslieferntotpEnabled. Die Datenbank erhält dafür drei neue
Spalten inUser(werden beim ersten Aufruf automatisch ergänzt).
Behoben
- Nach einem Update zeigte der Browser oft noch die alte Version, bis die Seite neu geladen wurde. Die
.htaccesssetzt jetztCache-Control: no-cachefür statische Dateien (HTML, JS, CSS, Icons, Manifest); der
Browser prüft sie bei jedem Aufruf kurz beim Server. API-Antworten (no-store) und Fotos behalten ihre Werte.
Geändert
- Release-Archive enthalten nur noch, was für den Betrieb gebraucht wird, dazu README und LICENSE
(export-ignorein.gitattributes).
v0.3.0 – Neuer Name: Ausflugskiste
Geändert
- Neuer Name: Ausflugskiste – „Deine Schatzkiste für freie Tage.“ Titel, Kopfzeile (Wortmarke mit
„kiste“ in Holzfarbe), Manifest (name„Ausflugskiste“,short_name„Ausflüge“), Fußzeile, Anzeigename neuer
Passkeys und Log-Einträge tragen den neuen Namen. Das Repository heißt jetztlistiges-kaenguru/ausflugskiste
(SOURCE_URL); GitHub leitet alte Links weiter. - Neues Icon: Truhe mit Kompass als Schloss, weiterhin auf dunklem Grund (
icon.svg,icon-192.png,
icon-512.png,favicon.ico). - Farben: heller Hintergrund und Flächen in warmem Creme statt kühlem Grau; Grün und Sterne unverändert.
- Texte: Leere Liste „Deine Kiste ist noch leer“, „Wohin heute?“ beginnt mit „Ein Griff in die Kiste“.
- Bewusst unverändert: Umgebungsvariable
AUSFLUGSZIELE_DATA_DIR, Datenbank, Sitzungs-Cookie. Bestehende
Installationen laufen ohne Anpassung weiter; vorhandene Passkeys behalten ihren alten Anzeigenamen.
v0.2.0 – AGPL, Passkeys für Admins, Passwortwechsel und kleinere Fotos
Hinzugefügt
- Passkeys verwalten für Admins: Unter Profil → Benutzer zeigt ein Fingerabdruck-Button die Passkeys eines
Benutzers; einzelne lassen sich entfernen, z. B. nach einem verlorenen Gerät. Neue Endpunkte
GET users/<id>/passkeysundDELETE users/<id>/passkeys/<passkeyId>, neue CLI-Befehle
list-passkeys <name>unddelete-passkeys <name> [<passkey-id>]. - Passwortwechsel erzwingen: Nach einem vom Admin vergebenen Passwort (neuer Benutzer oder „Neues Passwort“)
muss der Benutzer bei der nächsten Anmeldung – auch per Passkey – ein eigenes Passwort festlegen; bis dahin
lehnt die API alle anderen Anfragen mitPASSWORD_CHANGE_REQUIREDab. Das aktuelle Passwort wird dabei nicht
abgefragt, das neue muss sich vom bisherigen unterscheiden. Die Benutzerliste undserver/cli.php list-users
zeigen ausstehende Wechsel. Neue SpalteUser.mustChangePassword(wird automatisch ergänzt);me,login,
passkey-loginundusersliefern das FeldmustChangePassword. - Bilder verkleinern: Fotos werden vor dem Upload im Browser per Canvas auf höchstens 2560 Pixel
Kantenlänge verkleinert (JPEG mit Qualität 0,85, PNG bleibt PNG, GIFs bleiben unverändert). Das spart Speicher
und Ladezeit; größere Handyfotos passen so unter die Upload-Grenze. Bereits gespeicherte Fotos bleiben unverändert.
Geändert
- Lizenz: Die App steht jetzt unter der GNU Affero General Public License v3.0 oder später (bisher GPL-3.0).
- Anmeldeseite und Profil verlinken auf den Quelltext (
SOURCE_URLinserver/bootstrap.php);
meliefert zusätzlichsourceUrl.
Aktualisieren
Vorher den Ordner data/ sichern. Dann alle Dateien außer data/ ersetzen. Die Datenbank wird beim ersten Aufruf automatisch ergänzt (neue Spalte User.mustChangePassword); vorhandene Daten und Passwörter bleiben erhalten.
- Wer die App verändert betreibt, muss wegen der AGPL den eigenen Quelltext anbieten und dazu
SOURCE_URLinserver/bootstrap.phpanpassen. - API: Solange ein Passwortwechsel aussteht, lehnt die API Anfragen außer dem Passwortwechsel mit
PASSWORD_CHANGE_REQUIREDab.
Vollständige Änderungen: v0.1.0...v0.2.0
v0.1.0 – Passkeys, neue Oberfläche und Benutzerverwaltung
Hinzugefügt
- Passkeys: Unter Profil → Anmeldung & Sicherheit Passkeys anlegen, umbenennen und entfernen;
Anmeldung per Passkey-Button oder direkt über das Autofill des Benutzernamens. Nach einer Anmeldung
mit Passwort schlägt die Übersicht einmalig vor, einen Passkey einzurichten. Bekannte Passwortmanager
(Google, iCloud, Windows Hello, 1Password, Bitwarden, …) werden am Namen des Passkeys erkannt.
Umsetzung ohne Bibliothek inserver/webauthn.php(ES256 und RS256, benötigt die PHP-Erweiterungopenssl). - Neue API-Endpunkte
passkeys,passkeys/options,passkeys/<id>,passkey-login/options,passkey-login;
meliefert zusätzlichpasskeys(ob der Server Passkeys unterstützt). - Neue Tabelle
Passkey(wird bei bestehenden Datenbanken automatisch ergänzt). - Übersicht: Favorit und Besucht direkt auf der Karte umschalten, Titelbild (erstes Foto) und Anzahl der Fotos,
Sortierung (neueste, zuletzt geändert, Name, Bewertung). - Detailseite: Fotogalerie mit Vollbildansicht (Blättern per Pfeiltasten oder Wischen), Fotos per Drag & Drop
hinzufügen, Link „Auf Karte zeigen“ zur Adresse (OpenStreetMap). - Hell- und Dunkelmodus nach Systemeinstellung.
- Benutzerverwaltung: Admins können Benutzer sperren und entsperren (gesperrte Benutzer werden sofort
abgemeldet und können sich weder per Passwort noch per Passkey anmelden), löschen (samt Zielen, Fotos und
Passkeys; zur Sicherheit muss der Benutzername eingetippt werden) und ein neues Passwort erzeugen.
Das eigene Konto ist davon ausgenommen. Neue EndpunktePUT/DELETE users/<id>undPOST users/<id>/password;
neue SpalteUser.disabledAt(wird automatisch ergänzt).server/cli.php list-userszeigt gesperrte Benutzer. - „Wohin heute?“: Ein Würfel in der Übersicht schlägt ein zufälliges, noch nicht besuchtes Ziel aus der
aktuellen Auswahl vor.
Geändert
- Oberfläche überarbeitet: Navigation oben (Desktop) bzw. unten mit hervorgehobenem „Neu“-Button (Mobil),
Karten mit Titelbild, gegliederte Formulare mit Sterne-Auswahl und Schaltern, festgehaltene Speichern-Leiste. - Suche und Übersicht zusammengelegt: Suchfeld, Schnellfilter (Alle, Favoriten, Noch offen, Besucht) mit
Anzahl sowie ausklappbare Filter für Bewertung und Tags;#/searchführt zur Übersicht. - Bestätigungen, Eingaben und Meldungen erscheinen als Dialoge und Hinweise in der App statt als
Browser-Fenster (confirm,prompt,alert). - Einrichtung und Passwortänderung fragen das neue Passwort zur Sicherheit doppelt ab.
- Nach dem Anlegen eines Ziels geht es direkt zur Detailseite, um Fotos hinzuzufügen; die Übersicht merkt sich
beim Zurückkehren Filter und Scrollposition. - Beim Anlegen eines Benutzers erzeugt die App das Passwort selbst und zeigt es einmalig mit Kopier-Button an.
Die API akzeptiert weiterhin ein selbst gewähltespassword.
Behoben
- Fehlt PHP die Erweiterung
pdo_sqlite, zeigt die App (undserver/cli.php) eine verständliche Meldung
statt „Interner Fehler“. README um einen Abschnitt zur Fehlersuche ergänzt.
Aktualisieren
Vorher den Ordner data/ sichern. Dann alle Dateien außer data/ ersetzen. Die Datenbank wird beim ersten Aufruf automatisch ergänzt (neue Tabelle Passkey, neue Spalte User.disabledAt); vorhandene Daten und Passwörter bleiben erhalten.
- Für Passkeys muss die PHP-Erweiterung
opensslaktiv sein (fehlt sie, blendet die App Passkeys aus) und die App über HTTPS unter einem Domainnamen laufen. - API:
POST usersohnepassworderzeugt jetzt ein Passwort und gibt es einmalig zurück; mitpasswordfunktioniert es wie bisher. - Lesezeichen auf
#/searchführen jetzt zur Übersicht mit Suchfeld.
Vollständige Änderungen: v0.0.3...v0.1.0
v0.0.3 – Eigenes App-Icon
Hinzugefügt
- Eigenes App-Icon (Kompass im Stil der App) mit der Quelldatei
icon.svg, die modernen Browsern
auch direkt als Favicon dient.
Behoben
- Die App-Icons
icon-192.pngundicon-512.pngwaren leere Dateien; Startbildschirm- und Tab-Icon fehlten. favicon.icoenthielt noch das Vercel-Logo aus der Next.js-Vorlage.
Aktualisieren
Alle Dateien außer data/ ersetzen – eine Migration ist nicht nötig. Damit Browser das neue Favicon zeigen, ggf. den Cache leeren.
Vollständige Änderungen: v0.0.2...v0.0.3
v0.0.2 – Suche nach Bewertung und mehreren Tags
Hinzugefügt
- Suche: Filter nach Mindestbewertung (API-Parameter
minRating). - Suche: Mehrere Tags gleichzeitig auswählbar; angezeigt werden Ziele, die alle ausgewählten Tags haben
(API-Parametertag[], mehrfach angebbar;tag=<name>funktioniert weiterhin). - Hinweistext unter dem Link-Feld mit Beispielen.
Geändert
- Das Feld „Google Maps Link“ heißt jetzt „Link“ und ist für beliebige Webadressen gedacht
(z. B. OpenStreetMap, Komoot oder die Webseite des Ziels). Der Button auf der Detailseite heißt
„Link öffnen“ und zeigt die Ziel-Domain. Feldname in API und Datenbank bleibtgoogleMapsLink. - Die Suchfilter stehen ab mittlerer Bildschirmbreite nebeneinander.
Behoben
- Fehlen dem Webserver Schreibrechte für
data/, zeigt die App jetzt eine verständliche Meldung statt
„Interner Fehler“. README um Befehle für Rechte und SELinux sowie einen Abschnitt zur Fehlersuche ergänzt.
Aktualisieren von 0.0.1
Alle Dateien außer data/ ersetzen – Datenbank und Bilder bleiben erhalten, eine Migration ist nicht nötig.
Vollständige Änderungen: v0.0.1...v0.0.2
v0.0.1 – PHP + SQLite ohne Abhängigkeiten
Erste versionierte Veröffentlichung. Die App läuft jetzt ohne npm, Framework und Build-Schritt auf jedem Webserver mit PHP 8.1+.
Geändert
- Frontend von Next.js/React auf reines HTML, CSS und JavaScript umgestellt (Single-Page-App mit Hash-Routing).
- Backend von Next.js-API-Routes auf
api.phpmit PDO SQLite umgestellt; Endpunkte liegen jetzt unterapi.php?r=<pfad>. - Anmeldung über PHP-Sessions statt JWT-Cookie.
- Daten (Datenbank, Sessions, Bilder) liegen gesammelt in
data/; der Ort ist überAUSFLUGSZIELE_DATA_DIReinstellbar. - Destinations-Antworten liefern Tags als
[{ id, name }]und Bilder miturlstatt verschachtelter Prisma-Strukturen. - Tags umbenennen und löschen ist nur noch für Administratoren erlaubt.
- Die Suche findet Umlaute unabhängig von Groß-/Kleinschreibung.
Hinzugefügt
- Ersteinrichtung im Browser: Gibt es noch keine Benutzer, wird der erste Admin-Zugang angelegt.
- Oberfläche für Suche und Filter (Text, Favorit, Besucht, Tag).
- Bilder auf der Detailseite anzeigen, hochladen und löschen.
- Ziele löschen, Tags direkt im Formular anlegen, Tag-Verwaltung im Profil.
- Passwort ändern und Abmelden im Profil.
- Benutzerverwaltung für Administratoren.
- Kommandozeilen-Skript
server/cli.php(Benutzer anlegen, Passwort zurücksetzen, Demo-Daten). .htaccess-Dateien mit Zugriffsschutz und Sicherheits-Headern für Apache..user.inibzw..htaccess-PHP-Einstellungen: Fehler werden protokolliert statt ausgegeben, Uploads bis 10 MB.- Verständliche Fehlermeldung, wenn ein Upload die
post_max_sizedes Servers überschreitet. CONTRIBUTING.md,CHANGELOG.md,.editorconfigund.gitattributes.
Entfernt
- Next.js, React, Prisma, Tailwind und alle weiteren npm-Abhängigkeiten.
- Docker-Setup und PostgreSQL-Konfiguration.
- Feste Standard-Zugangsdaten aus dem Seed;
seed-demoerzeugt zufällige Passwörter.
Sicherheit
- Bilder werden nicht mehr öffentlich unter
public/uploadsabgelegt, sondern nur an den Eigentümer des Ziels ausgeliefert. - Bilder können nur noch zu eigenen Zielen hochgeladen werden.
- Uploads werden auf echte Bilddateien (JPEG, PNG, GIF, WebP, max. 10 MB) geprüft und unter zufälligem Namen gespeichert.
- Google-Maps-Links müssen mit
http://oderhttps://beginnen (verhindertjavascript:-Links). - Schreibende API-Anfragen erfordern den Header
X-Requested-With: fetch(CSRF-Schutz). - Das Login-Rate-Limit nutzt die echte Client-Adresse statt des fälschbaren
X-Forwarded-For-Headers und gilt auch bei mehreren PHP-Prozessen.
Umstieg von der früheren Next.js-Fassung
- Eine bestehende SQLite-Datenbank (
dev.db) kann alsdata/app.dbweiterverwendet werden; Passwörter bleiben gültig. - Bisher hochgeladene Bilder aus
public/uploads/nachdata/uploads/verschieben. - PostgreSQL-Datenbanken werden nicht mehr unterstützt.
Installation
Archiv herunterladen, auf einen Webserver mit PHP 8.1+ und pdo_sqlite entpacken, data/ für PHP beschreibbar machen und die Seite aufrufen – beim ersten Aufruf wird der Admin-Zugang eingerichtet. Details im README.