Skip to content

Releases: listiges-kaenguru/ausflugskiste

Ausflugskiste 0.5.0

Choose a tag to compare

@listiges-kaenguru listiges-kaenguru released this 16 Oct 22:29
aa17326

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 oder allow_url_fopen). Er merkt sich das Ergebnis 12 Stunden in data/release.json und 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

Choose a tag to compare

@listiges-kaenguru listiges-kaenguru released this 16 Oct 12:21
8169082

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 (statt AGENTS.md), IDEEN.md ist in ToDo und Ideen gegliedert.

v0.4.1 – 2FA-Geheimnisse verschlüsselt

Choose a tag to compare

@listiges-kaenguru listiges-kaenguru released this 16 Oct 08:38
b8a3ba8

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 Datei data/secret.key statt 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); me liefert dazu totp. Passt der Schlüssel nicht mehr, meldet die Anmeldung das
    verständlich (TOTP_KEY_ERROR) statt „Code falsch“.

v0.4.0 – Zwei-Faktor-Anmeldung

Choose a tag to compare

@listiges-kaenguru listiges-kaenguru released this 16 Oct 08:26
2a3c4bc

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-Befehl disable-totp <name>, list-users
    zeigt „2FA“.
  • Neue Endpunkte login/totp, totp (GET/POST/DELETE), totp/setup, totp/recovery-codes und
    DELETE users/<id>/totp; me und users liefern totpEnabled. Die Datenbank erhält dafür drei neue
    Spalten in User (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
    .htaccess setzt jetzt Cache-Control: no-cache fü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-ignore in .gitattributes).

v0.3.0 – Neuer Name: Ausflugskiste

Choose a tag to compare

@listiges-kaenguru listiges-kaenguru released this 15 Oct 12:18
b1a996b

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 jetzt listiges-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

Choose a tag to compare

@listiges-kaenguru listiges-kaenguru released this 14 Oct 15:53
43974c3

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>/passkeys und DELETE users/<id>/passkeys/<passkeyId>, neue CLI-Befehle
    list-passkeys <name> und delete-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 mit PASSWORD_CHANGE_REQUIRED ab. Das aktuelle Passwort wird dabei nicht
    abgefragt, das neue muss sich vom bisherigen unterscheiden. Die Benutzerliste und server/cli.php list-users
    zeigen ausstehende Wechsel. Neue Spalte User.mustChangePassword (wird automatisch ergänzt); me, login,
    passkey-login und users liefern das Feld mustChangePassword.
  • 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_URL in server/bootstrap.php);
    me liefert zusätzlich sourceUrl.

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_URL in server/bootstrap.php anpassen.
  • API: Solange ein Passwortwechsel aussteht, lehnt die API Anfragen außer dem Passwortwechsel mit PASSWORD_CHANGE_REQUIRED ab.

Vollständige Änderungen: v0.1.0...v0.2.0

v0.1.0 – Passkeys, neue Oberfläche und Benutzerverwaltung

Choose a tag to compare

@listiges-kaenguru listiges-kaenguru released this 08 Oct 14:16
f8f86d2

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 in server/webauthn.php (ES256 und RS256, benötigt die PHP-Erweiterung openssl).
  • Neue API-Endpunkte passkeys, passkeys/options, passkeys/<id>, passkey-login/options, passkey-login;
    me liefert zusätzlich passkeys (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 Endpunkte PUT/DELETE users/<id> und POST users/<id>/password;
    neue Spalte User.disabledAt (wird automatisch ergänzt). server/cli.php list-users zeigt 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; #/search fü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ähltes password.

Behoben

  • Fehlt PHP die Erweiterung pdo_sqlite, zeigt die App (und server/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 openssl aktiv sein (fehlt sie, blendet die App Passkeys aus) und die App über HTTPS unter einem Domainnamen laufen.
  • API: POST users ohne password erzeugt jetzt ein Passwort und gibt es einmalig zurück; mit password funktioniert es wie bisher.
  • Lesezeichen auf #/search führen jetzt zur Übersicht mit Suchfeld.

Vollständige Änderungen: v0.0.3...v0.1.0

v0.0.3 – Eigenes App-Icon

Choose a tag to compare

@listiges-kaenguru listiges-kaenguru released this 05 Oct 13:50

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.png und icon-512.png waren leere Dateien; Startbildschirm- und Tab-Icon fehlten.
  • favicon.ico enthielt 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

Choose a tag to compare

@listiges-kaenguru listiges-kaenguru released this 05 Oct 13:46

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-Parameter tag[], 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 bleibt googleMapsLink.
  • 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

Choose a tag to compare

@listiges-kaenguru listiges-kaenguru released this 05 Oct 13:24

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.php mit PDO SQLite umgestellt; Endpunkte liegen jetzt unter api.php?r=<pfad>.
  • Anmeldung über PHP-Sessions statt JWT-Cookie.
  • Daten (Datenbank, Sessions, Bilder) liegen gesammelt in data/; der Ort ist über AUSFLUGSZIELE_DATA_DIR einstellbar.
  • Destinations-Antworten liefern Tags als [{ id, name }] und Bilder mit url statt 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.ini bzw. .htaccess-PHP-Einstellungen: Fehler werden protokolliert statt ausgegeben, Uploads bis 10 MB.
  • Verständliche Fehlermeldung, wenn ein Upload die post_max_size des Servers überschreitet.
  • CONTRIBUTING.md, CHANGELOG.md, .editorconfig und .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-demo erzeugt zufällige Passwörter.

Sicherheit

  • Bilder werden nicht mehr öffentlich unter public/uploads abgelegt, 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:// oder https:// beginnen (verhindert javascript:-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 als data/app.db weiterverwendet werden; Passwörter bleiben gültig.
  • Bisher hochgeladene Bilder aus public/uploads/ nach data/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.