Erst die Sitzung, dann der Schluessel

Der Schluessel kennt keinen Nutzer und landete beim Standardnutzer — auch
dann, wenn die App unter derselben Site liegt und der Browser das
HoneyOS-Cookie laengst mitschickt (cloud.honeyos.… und honeyos.… sind
dieselbe Site, duckdns.org steht auf der Public-Suffix-Liste). Damit trug
die HoneyBar in Aether die Farben eines fremden Nutzers.

Jetzt sieht /api/apps erst nach der Sitzung, und nur bei eigener
Anmeldung: Im offenen Betrieb und hinter einem Anmelde-Proxy gilt jede
Anfrage als angemeldet, dort bleibt der Schluessel das letzte Wort.
Test dazu, mit zwei Nutzern, damit der Rueckfall auf den einzigen Nutzer
das Ergebnis nicht zufaellig richtig aussehen laesst.
This commit is contained in:
marc committed 2026-08-29 23:29:53 +02:00
1 parent ffaba616ce
commit cc7a50c621
4 files changed
+111 -14

No files matched your search

+16
View File
@@ -250,6 +250,22 @@ func noCache(next http.Handler) http.Handler {
// damit nur für den lesbar, der ohnehin an die App herankommt.
func (s *Server) appsReadable(next func(http.ResponseWriter, *http.Request, string)) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
// Erst die Sitzung, dann der Schlüssel. Umgekehrt wäre bequemer zu
// lesen, aber falsch: Der Schlüssel kennt keinen Nutzer und landet
// beim Standardnutzer. Liegt die App unter derselben Site wie HoneyOS
// (`cloud.honeyos.…` und `honeyos.…` sind dieselbe), schickt der
// Browser die Sitzung längst mit — dann soll die HoneyBar dort auch
// die Farben, das Wetter und später die Reihenfolge **dieses** Nutzers
// bekommen und nicht die eines fremden.
//
// Nur bei eigener Anmeldung: Ohne sie gilt jede Anfrage als angemeldet
// (offener Betrieb, Proxy davor), und das hier wäre eine offene Tür.
if s.auth.Enabled() {
if sub, ok := s.auth.SubFromRequest(r); ok {
next(w, r, sub)
return
}
}
if key := s.cfg.AppsKey; key != "" {
given := r.Header.Get("X-HoneyOS-Key")
if given == "" {