Angriffszeit-Check: kein Fallback mehr auf fremde Accounts #30

Merged
DasAoD merged 1 commit from fix-attack-time-own-account-only into main 2026-08-14 00:40:56 +02:00
Owner

Hintergrund

Die neue CLAUDE.md (von dir am 13.08. ergänzt, nach PR #28) hält fest:

Cron und sf-api-Sync verwenden ausschließlich Admin-Accounts (Compliance mit S&F-Spielregeln) – niemals reguläre User-Accounts für automatisierte Zugriffe verwenden

findAnySfAccountForServer() (Angriffszeit-Feature) hatte einen Fallback: wenn der klickende Nutzer selbst keinen Charakter auf dem gewählten Server hatte, wurde auf irgendeinen anderen Nutzer-Account zurückgegriffen — nicht auf Admins beschränkt. Kein Cron im engeren Sinne, aber dieselbe Grauzone: ein fremder SF-Account wird eingeloggt, ohne dass dessen Besitzer in dem Moment selbst etwas tut.

Wie besprochen: Fallback komplett entfernt, strikt auf den eigenen Account des anfragenden Nutzers beschränkt.

Änderungen

  • findAnySfAccountForServer(): kein $userId=null-Fallback-Pfad mehr, $userId jetzt Pflichtparameter, sucht ausschließlich in den eigenen sf_accounts des Nutzers.
  • listKnownServers() → listKnownServersForUser($db, $userId): Server-Dropdown zeigt nur noch Server, auf denen der Nutzer selbst einen Charakter hat.
  • Fehlermeldung + Leer-Zustand-Text entsprechend angepasst ("du hast keinen eigenen Charakter..." statt generisch "es gibt keinen").

Getestet

Gegen die echte sfguilds.sqlite: eigener Account funktioniert weiterhin (DasAoD/f9.sfgame.net → Gweneth), Fallback bestätigt entfernt (AndreaU hat keinen Charakter auf s6.sfgame.eu, findAnySfAccountForServer(db, 2, 's6.sfgame.eu') liefert jetzt korrekt null statt auf DasAoDs Account auszuweichen). php -l auf allen geänderten Dateien.

🤖 Generated with Claude Code

## Hintergrund Die neue `CLAUDE.md` (von dir am 13.08. ergänzt, nach PR #28) hält fest: > Cron und sf-api-Sync verwenden **ausschließlich Admin-Accounts** (Compliance mit S&F-Spielregeln) – niemals reguläre User-Accounts für automatisierte Zugriffe verwenden `findAnySfAccountForServer()` (Angriffszeit-Feature) hatte einen Fallback: wenn der klickende Nutzer selbst keinen Charakter auf dem gewählten Server hatte, wurde auf **irgendeinen** anderen Nutzer-Account zurückgegriffen — nicht auf Admins beschränkt. Kein Cron im engeren Sinne, aber dieselbe Grauzone: ein fremder SF-Account wird eingeloggt, ohne dass dessen Besitzer in dem Moment selbst etwas tut. Wie besprochen: Fallback komplett entfernt, strikt auf den eigenen Account des anfragenden Nutzers beschränkt. ## Änderungen - `findAnySfAccountForServer()`: kein `$userId=null`-Fallback-Pfad mehr, `$userId` jetzt Pflichtparameter, sucht ausschließlich in den eigenen `sf_accounts` des Nutzers. - `listKnownServers()` → `listKnownServersForUser($db, $userId)`: Server-Dropdown zeigt nur noch Server, auf denen der Nutzer selbst einen Charakter hat. - Fehlermeldung + Leer-Zustand-Text entsprechend angepasst ("du hast keinen eigenen Charakter..." statt generisch "es gibt keinen"). ## Getestet Gegen die echte `sfguilds.sqlite`: eigener Account funktioniert weiterhin (DasAoD/f9.sfgame.net → Gweneth), Fallback bestätigt entfernt (AndreaU hat keinen Charakter auf s6.sfgame.eu, `findAnySfAccountForServer(db, 2, 's6.sfgame.eu')` liefert jetzt korrekt `null` statt auf DasAoDs Account auszuweichen). `php -l` auf allen geänderten Dateien. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Per CLAUDE.md's account-usage convention (added 2026-08-13, after this
feature's original PR #28): "Cron und sf-api-Sync verwenden
ausschliesslich Admin-Accounts ... niemals reguläre User-Accounts für
automatisierte Zugriffe verwenden". findAnySfAccountForServer() had a
fallback that could pick ANY other user's sf_account (not just admins)
when the requesting user had no character on the chosen server - so a
button click by user A could silently log into user B's SF account
without B doing anything themselves. Not a cron job, but the same
"someone else's account gets used without their direct involvement"
concern the rule is about.

- findAnySfAccountForServer(): dropped the userId=null / fallback-to-
  any-account path entirely; now takes a required int $userId and only
  ever looks at that user's own sf_accounts.
- listKnownServers() -> listKnownServersForUser($db, $userId): the
  server dropdown now only lists servers the requesting user actually
  has a character on, matching the helper above (no point offering a
  server they can't query anyway).
- Updated the "no character found" error message and the empty-state
  page copy to reflect that it's about the user's own account now, not
  "nobody has one".

Verified both changes against the live DB (own-account lookups still
work, fallback path confirmed gone - AndreaU has no character on
s6.sfgame.eu, findAnySfAccountForServer(db, 2, 's6.sfgame.eu') now
correctly returns null instead of falling back to DasAoD's account).

🤖 Generated with [Claude Code](https://claude.com/claude-code)
DasAoD merged commit f94b36cbf4 into main 2026-08-14 00:40:56 +02:00
Sign in to join this conversation.
No description provided.