Skip to content

Fix #48: Optionaler Token-Ablauf mit Toggle und Ablaufprüfung - #49

Merged
dergel merged 5 commits into
mainfrom
fix-issue-48-token-ablauf-optional
Aug 24, 2026
Merged

Fix #48: Optionaler Token-Ablauf mit Toggle und Ablaufprüfung#49
dergel merged 5 commits into
mainfrom
fix-issue-48-token-ablauf-optional

Conversation

@skerbis

@skerbis skerbis commented Jun 4, 2026

Copy link
Copy Markdown
Member

Bezug

Fixes #48

Was wurde umgesetzt?

  • Optionales Ablaufdatum für API-Tokens (expires_at, nullable) ergänzt.
  • Bestehende ungültige Werte (0000-00-00 00:00:00 / leer) werden auf NULL normalisiert.
  • Token-Validierung berücksichtigt Ablaufdatum serverseitig (abgelaufene Tokens werden nicht autorisiert).
  • Backend-Formular erweitert:
    • Ablauf aktiv Checkbox
    • Ablaufdatum als YForm-Datetime
    • Ablaufdatum wird per Toggle ein-/ausgeblendet.
  • JS-Einbindung sauber über boot.php nur auf page=api/token.
  • Bei deaktiviertem Ablauf wird expires_at zuverlässig auf NULL gesetzt.

Wichtige Hinweise

  • Rückwärtskompatibel: Ohne aktivierten Ablauf bleibt das bisherige Verhalten erhalten.
  • Keine Ausgabe sensibler Tokenwerte in diesem PR-Text.

Tests / Verifikation

  • RexStan auf den geänderten Kern-Dateien:
    • redaxo/src/addons/api/lib/Token.php -> OK
    • redaxo/src/addons/api/pages/token.php -> OK
  • API-Verifikation (ohne Token im Report zu zeigen):
    • mit Token auf erlaubtem Scope-Endpunkt (/api/search_it/capabilities) -> 200
    • ohne Token auf demselben Endpunkt -> 401
  • Manuelle UI-Prüfung:
    • Toggle Ablauf aktiv blendet Ablaufdatum ein/aus.
    • Ablaufdatum wird gespeichert; deaktivierter Ablauf setzt expires_at auf NULL.

Copilot AI review requested due to automatic review settings June 4, 2026 22:08

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Erweitert das API-Token-Handling um ein optionales Ablaufdatum (expires_at) inkl. Backend-UI-Toggle und serverseitiger Berücksichtigung bei der Token-Autorisierung, um Tokens nach Ablauf automatisch nicht mehr zu akzeptieren (Fix #48).

Changes:

  • DB-Schema um nullable expires_at ergänzt und Altwerte (0000-00-00 00:00:00/leer) auf NULL normalisiert.
  • Token-Lookup/Autorisierung um Ablauf-Prüfung erweitert.
  • Backend-Maske um „Ablauf aktiv“ + Datetime-Feld ergänzt, inkl. JS-Toggle (nur auf api/token geladen).

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
pages/token.php YForm-Formular um Ablauf-UI erweitert und expires_at nach Save normalisiert/gesetzt.
lib/Token.php Token-Model um expires_at/Expiry-Checks ergänzt und Token-Lookup um Ablauf-Filter erweitert.
install.php DB-Spalte expires_at angelegt und Altwerte auf NULL migriert.
boot.php Lädt das neue Backend-JS nur auf der Token-Seite.
assets/js/token-expiry.js Implementiert Toggle/Enable-Disable-Logik für das Ablaufdatum im Backend.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread lib/Token.php Outdated
Comment thread lib/Token.php
Comment thread pages/token.php Outdated
Comment thread assets/js/token-expiry.js Outdated
Comment thread install.php Outdated
@skerbis

skerbis commented Jun 4, 2026

Copy link
Copy Markdown
Member Author

Kleiner Nachtrag im selben PR: Statusanzeige auf der Token-Seite korrigiert.

  • [translate:active]-Darstellung behoben
  • Token-List-Formatter nutzt jetzt addon-spezifische Keys (api_active / api_inactive)
  • fehlende Übersetzungen in lang/de_de.lang ergänzt

dergel added 2 commits August 24, 2026 12:02
Behebt drei Probleme, die den optionalen Ablauf praktisch unbrauchbar
machten:

1. Ein im Backend angelegter Token war sofort abgelaufen. Das JS hakte
   "Ablauf aktiv" anhand der Datumsfelder an, und YForms datetime-Feld ist
   mit current_date=1 nie leer -- gespeichert wurde damit der Zeitpunkt des
   Formularaufrufs, der beim Absenden schon in der Vergangenheit lag. Der
   Default entscheidet jetzt serverseitig: beim Anlegen aus, beim Bearbeiten
   aktiv, wenn ein Datum gespeichert ist. Ohne aktive Checkbox schreibt die
   Seite NULL -- auch wenn das JS nicht lädt.

2. Der Jahresbereich des Feldes lief von 2006 bis zum laufenden Jahr, ein
   Ablaufdatum in der Zukunft war also nicht wählbar. Jetzt laufendes Jahr
   bis +10, vorbelegt mit "in einem Jahr" (modify_default).

3. Ein Datum ohne Jahr (z.B. 0000-03-15, wenn im Select kein Jahr gewählt
   wurde) ergab einen still unbrauchbaren Token. Normalisierung und
   Default-Ermittlung prüfen daher auf YEAR() < 1 statt nur auf
   0000-00-00 00:00:00; install.php räumt solche Altbestände mit auf.

Weitere Korrekturen:

- Der Vergleich expires_at = '' entfaellt in getByToken(): er erzeugte pro
  Auth-Request eine MySQL-Warning 1292 und kann in einer nullable
  DATETIME-Spalte nicht vorkommen.
- isExpired() vergleicht über die Datenbankzeit statt über time(). Bei
  abweichender PHP- und MySQL-Zeitzone urteilte die Methode anders als der
  Filter in getByToken(), der mit now() arbeitet.
- Die Listenspalte trägt jetzt das Label "Ablaufdatum" statt des
  technischen Spaltennamens.
- Toter Code in pages/token.php entfernt, dazu ein unbenutzter Import
  (php-cs-fixer).
- README: Abschnitt zum Ablaufdatum.
@dergel

dergel commented Aug 24, 2026

Copy link
Copy Markdown
Member

Getestet gegen eine laufende Installation und um drei Korrekturen ergänzt (Commit 6670c0e), main ist in den Branch gemergt. Suite grün: 188 Tests, 2305 Assertions.

Der Ablauf funktionierte serverseitig korrekt (kein Ablauf → 200, Vergangenheit → 401, Zukunft → 200, exakt jetzt → 401), im Backend-Formular waren aber drei Dinge offen:

  1. Ein neu angelegter Token war sofort abgelaufen. hasDateValue() hakte „Ablauf aktiv" anhand der Datumsfelder an — YForms datetime ist mit current_date=1 aber nie leer, gespeichert wurde also der Zeitpunkt des Formularaufrufs. Gemessen: Token über die UI angelegt → 401; derselbe Token mit expires_at = NULL → 200. Der Default kommt jetzt aus pages/token.php (beim Anlegen aus, beim Bearbeiten aktiv, wenn ein Datum gespeichert ist); das JS blendet nur noch ein und aus und disabled die Felder nicht mehr, damit YForm seine Werte behält. Ohne geladenes JS speichert die Seite ebenfalls korrekt — separat geprüft.
  2. Der Jahresbereich lief 2006 bis 2026, ein Zukunftsdatum war gar nicht wählbar. Jetzt laufendes Jahr bis +10, vorbelegt mit „in einem Jahr".
  3. Datum ohne Jahr (0000-03-15, wenn im Select kein Jahr gewählt wird) ergab still einen unbrauchbaren Token. Normalisierung und Default prüfen jetzt YEAR() < 1; install.php räumt solche Werte beim Update mit auf.

Kleinigkeiten dazu: der expires_at = ''-Vergleich in getByToken() erzeugte pro Auth-Request eine MySQL-Warning 1292 und ist entfallen, isExpired() vergleicht über die DB-Zeit (deine now()-Logik urteilte sonst anders als PHP time(), sobald die Zeitzonen abweichen), die Listenspalte heißt „Ablaufdatum" statt expires_at, plus README-Abschnitt. Updatefähigkeit geprüft: update.phpinstall.php legt die Spalte nullable an, bestehende Tokens bleiben gültig, und der Installer-Update-Pfad kopiert assets/ mit, sodass das neue JS bei bestehenden Installationen ankommt.

Der Token::get()-Fix (status = ?,status = ?) ist übrigens ein echter Gewinn — das Statement war in main invalides SQL. Copilot hat ihn oben als neuen Fehler gemeldet, tatsächlich behebt dieser PR ihn.

Nicht laufen konnte rexstan: es bricht in dieser Umgebung an einer PHP-8.5-Inkompatibilität in yform ab (function clone()). Stattdessen php -l, php-cs-fixer und die Integrationstests.


Dieser Text wurde durch eine KI erstellt.

@dergel
dergel merged commit f1a054a into main Aug 24, 2026
@dergel
dergel deleted the fix-issue-48-token-ablauf-optional branch August 24, 2026 10:03
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Automatische Deaktivierung

3 participants