Files
dogfather-universe/workspace/material.html
T
DogFatherGitandClaude Opus 5 8a9ab66c44 Angemeldet bleiben: /workspace/ zeigte die Anmeldung trotz Sitzung
Filipe: „ich will dass wenn sich jemand bei der workspace seite
anmeldet, angemeldet bleibt bis er sich selbst abmeldet."

ERST GEMESSEN, DANN GEBAUT -- und das hat die Richtung gedreht.

Die naheliegende Antwort waere gewesen, die Sitzung zu verlaengern.
Sie war aber nie zu kurz:

  * Der Keks gilt 180 Tage und verlaengert sich beim Benutzen.
  * In der echten Datenbank lief KEINE der 28 Sitzungen vor Maerz
    2027 ab.
  * Am echten Browser nachgestellt: Er uebersteht dreimaliges
    Neuladen, den Service Worker UND das Schliessen des Browsers.

Trotzdem meldeten sich dieselben Geraete staendig neu an. DogFathers
Android am 05.10. um 22:54 UND um 22:55 -- gleiche IP, gleiche
Browserkennung, eine Minute auseinander. Kein zweites Geraet.

DER GRUND: `/workspace/` lieferte die Anmeldung aus, OHNE zu fragen,
ob schon jemand angemeldet ist. Das ist die Adresse, die man tippt,
als Lesezeichen hat und weitergibt. Wer sie oeffnete, sah das
Codefeld und tippte den Code noch einmal -- obwohl seine Sitzung die
ganze Zeit gueltig war. Jede Eingabe legt eine neue Sitzung an;
deshalb standen sieben davon bei einer Person.

Haette ich die Sitzungsdauer erhoeht, waere der Fehler geblieben und
die Sicherheit schlechter geworden.

(Die installierte App startet auf `start.html` und war nie betroffen.
Es traf nur den Weg ueber die Adresszeile -- also den haeufigsten.)

WARUM DIE WEITERLEITUNG AUF DEM SERVER STEHT

Mein erster Entwurf stand in gate.js und fragte `/api/ich`. Er
funktionierte und war trotzdem die schlechtere Loesung:

  * Ohne Sitzung antwortet `/api/ich` mit 401 -- danach stand bei
    JEDEM Aufruf der Anmeldung ein Fehler in der Browserkonsole.
    `pruef-neue-seiten` wurde davon zehnmal rot, und eine Meldung,
    die immer kommt, liest nach dem zweiten Mal niemand mehr.
  * Die Seite musste waehrend der Abfrage verdeckt werden, und diese
    Verdeckung brauchte wieder eine Notfrist, damit sie bei
    schlechtem Netz nicht haengen bleibt.
  * Und es brauchte eine Schleifensperre mit Zeitstempel in zwei
    Dateien -- deren erste Fassung prompt jeden ZWEITEN Aufruf auf
    der Anmeldung stehen liess. Die Pruefung hat genau das gefunden.

Drei Hilfskonstruktionen fuer etwas, das der Server in einer Zeile
weiss: Er liest die Sitzung ohnehin bei jeder Anfrage. Jetzt sieht
man die Anmeldung gar nicht erst, es gibt keinen Fehler in der
Konsole, und es geht auch ohne JavaScript. Die drei Hilfskonstruktionen
sind wieder entfernt; gate.css ist unveraendert.

BEIDE HAEUSER, OHNE SIE ZU VERMISCHEN: Auf der Crew-Adresse liefert
`/workspace/` die Datei crew-index.html -- derselbe Weg, dasselbe
Ziel. Der Keks bleibt host-gebunden: Wer nur im anderen Haus
angemeldet ist, bekommt weiterhin die Anmeldung, genau wie es die
Haustrennung vom 24.09.2026 verlangt. pruef-crew-adresse bleibt gruen.

NEU: pruef-angemeldet-bleiben.mjs (22 Pruefungen, 0 Fehler)

Mit einem echten Browserprofil auf der Platte -- nur so ueberlebt ein
Keks das Schliessen des Browsers; ein gewoehnlicher Kontext vergisst
alles, und dann maesse die Pruefung ihre eigene Einrichtung.

DIE WICHTIGSTE ZEILE IST DIE ZAHL DER SITZUNGEN. „Man bleibt
angemeldet" laesst sich leicht vortaeuschen: Wer bei jedem Besuch
stillschweigend neu anmeldet, sieht auch nie ein Codefeld. Deshalb
wird durchgehend gezaehlt -- es bleibt bei EINER, ueber drei Aufrufe
und einen Browserneustart hinweg.

Dazu die Gegenprobe in beide Richtungen: Abmelden beendet es
wirklich (die Sitzung ist weg, die Anmeldung bleibt stehen, kein Hin
und Her), und ohne Keks fuehrt `/workspace/` nicht zur Startseite --
die Messung kann also auch Nein sagen.

DREI MEINER EIGENEN MESSUNGEN WAREN ZUERST FALSCH, nicht der Code:
Die Pruefung klickte „Abmelden" ohne die Rueckfrage zu bestaetigen
und meldete dann „die Sitzung ist nicht weg"; ihre Knopfauswahl traf
einen unsichtbaren Knopf und lief 30 Sekunden in eine
Zeitueberschreitung; und die erste Schleifensperre war zu grob.
Alle drei berichtigt, bevor sie als Befund durchgingen.

NICHT VON MIR: pruef-css-klassen meldet weiterhin 44 statt 42
Schriftgroessen unter 11,5 px (uebersicht.css, wissen.css) -- derselbe
aeltere Befund wie gestern.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-10-06 01:14:27 +02:00

152 lines
6.6 KiB
HTML

<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
<title>Dogi-Media · Team Dogi</title>
<meta name="robots" content="noindex, nofollow" />
<!-- app.webmanifest, NICHT crew.webmanifest -- die Adresse biegt es um.
Der Server ersetzt den Pfad auf crew. an EINER Stelle
(crew-adresse.js). Wer hier das Crew-Manifest direkt nennt,
macht daraus eine zweite Stelle, die beim naechsten Umbau
vergessen wird. -->
<link rel="manifest" href="/workspace/app.webmanifest" />
<meta name="theme-color" content="#06090f" />
<link rel="icon" type="image/png" href="/assets/img/app-symbole/workspace-32.png?v=202610060113" />
<link rel="apple-touch-icon" href="/assets/img/app-symbole/workspace-180.png?v=202610060113" />
<link rel="stylesheet" href="assets/css/gate.css?v=202610060113" />
<link rel="stylesheet" href="assets/css/start.css?v=202610060113" />
<link rel="stylesheet" href="assets/css/material.css?v=202610060113" />
<link rel="stylesheet" href="assets/css/module.css?v=202610060113" />
<link rel="stylesheet" href="assets/css/haus.css?v=202610060113" />
</head>
<body class="start" data-ton="42" data-buehne="studio">
<div class="schleier" aria-hidden="true"></div>
<header class="kopfleiste">
<button type="button" class="zurueck-knopf" id="zurueck" hidden>
<svg viewBox="0 0 24 24" aria-hidden="true"><path d="M15 5l-7 7 7 7"/></svg>
<span class="zurueck-knopf__text">Übersicht</span>
</button>
<p class="marke"><span class="marke__text"><a class="zurueck" href="start.html">Team&nbsp;Dogi</a> · Dogi-Media</span></p>
<div class="kopfleiste__rechts">
<span class="wer" id="wer">…</span>
<button type="button" class="abmelden" id="abmelden">Abmelden</button>
</div>
</header>
<main class="inhalt inhalt--breit" id="haupt" aria-busy="true">
<section class="kopf-zeile">
<div>
<p class="marke" id="ober">Community</p>
<h1 class="titel">Dogi-Media</h1>
<p class="unterzeile">
Bilder und Videos zum Posten. <strong>Jedes nur einmal</strong> — wer es
nimmt, hat es; danach ist es für alle anderen weg.
</p>
</div>
</section>
<p class="fehler" id="fehler" role="alert" aria-live="polite"></p>
<!-- EINSTELLEN — nur für das Team. Der Kasten steht gar nicht erst
da, wenn jemand nicht darf: Ein Formular, das beim Absenden eine
Absage bringt, ist schlimmer als keines. -->
<section class="m-neu" id="neu-block" hidden>
<h2 class="m-neu__titel">Etwas bereitstellen</h2>
<p class="m-neu__satz">
Bild oder Video aussuchen, kurz dazuschreiben, wofür es gut ist.
Sobald jemand es nimmt, verschwindet es aus der Liste.
</p>
<div class="m-neu__zeile">
<label class="feld-schild" for="m-datei">Bild oder Video</label>
<input type="file" id="m-datei" accept="image/*,video/*" />
</div>
<div class="m-neu__zeile">
<label class="feld-schild" for="m-text">Wofür ist es? (freiwillig)</label>
<textarea id="m-text" rows="2"
placeholder="z. B. „Für TikTok, passt zum Stream von gestern“"></textarea>
</div>
<!-- VON WANN BIS WANN (22.09.2026). Filipe: "welche laufen von
wan bis wann, das muss man auch machen koennen."
BEIDES FREIWILLIG: Der haeufigste Fall ist "gilt einfach".
Ein Pflichtfeld erzwaenge ein erfundenes Datum, und ein
erfundenes Datum ist schlechter als keins.
STEHT AUSSERHALB VON .m-neu__knoepfe -- das ist eine
Flex-Reihe fuer Knopf und Stand. Zwei Datumsfelder und ein
Hinweissatz darin waeren vier Flex-Kinder nebeneinander und
auf dem Handy eine Treppe. -->
<div class="m-neu__zeile m-neu__fenster">
<div class="m-neu__fenster-feld">
<label class="feld-schild" for="m-ab">Gilt ab (freiwillig)</label>
<input type="date" id="m-ab" />
</div>
<div class="m-neu__fenster-feld">
<label class="feld-schild" for="m-bis">Gilt bis (freiwillig)</label>
<input type="date" id="m-bis" />
</div>
</div>
<p class="feld-hinweis m-neu__fenster-satz">
Ohne Datum gilt es einfach — bis es jemand nimmt.
</p>
<div class="m-neu__knoepfe">
<button type="button" class="knopf knopf--klein" id="m-hoch">Bereitstellen</button>
<span class="m-neu__stand" id="m-stand" aria-live="polite"></span>
</div>
<!-- Hierhin zeichnet der gemeinsame Hochlader seinen Balken. -->
<div id="m-fortschritt" hidden></div>
</section>
<!-- DIE FREIEN ZUERST. Wer hierherkommt, will etwas holen; was schon
weg ist, interessiert danach. -->
<section class="m-liste-block">
<div class="m-kopf">
<h2 class="m-kopf__titel" id="frei-titel">Zum Mitnehmen</h2>
<p class="m-kopf__satz" id="frei-satz"></p>
<!-- KATEGORIEN (22.09.2026). Filipe: "mach kategorien welche sind
benutzt welche nicht welche sind noch offen, welche laufen
von wan bis wann."
Die Knoepfe werden im Skript gebaut, damit die Zahl daneben
aus den echten Daten kommt und nicht aus dem HTML -- eine
Zahl im Markup waere die, die beim naechsten Stueck falsch
dasteht.
DIE LEISTE IST DIE DES HAUSES (.filter mit .schritt), nicht
eine eigene. Auf dateien.html und bereich.html steht dieselbe
Reihe; eine dritte Bauart haette dasselbe anders ausgesehen
und beim naechsten Umbau nur an zwei von drei Stellen
mitgeaendert. -->
<div class="filter" id="m-kat" role="group" aria-label="Kategorie"></div>
</div>
<div class="m-raster" id="frei" aria-busy="true"></div>
</section>
<section class="m-liste-block" id="weg-block" hidden>
<div class="m-kopf">
<h2 class="m-kopf__titel">Schon benutzt</h2>
<p class="m-kopf__satz" id="weg-satz">
Damit nichts zweimal gepostet wird.
</p>
</div>
<div class="m-raster m-raster--weg" id="weg"></div>
</section>
<p class="m-laedt" id="laedt">Einen Moment …</p>
</main>
<script src="assets/js/meldung.js?v=202610060113" defer></script>
<script src="assets/js/nachfrage.js?v=202610060113" defer></script>
<script src="assets/js/hochladen.js?v=202610060113" defer></script>
<script src="assets/js/wahl.js?v=202610060113" defer></script>
<script src="assets/js/bereiche.js?v=202610060113" defer></script>
<script src="assets/js/installieren.js?v=202610060113" defer></script>
<script src="assets/js/kopf.js?v=202610060113" defer></script>
<script src="assets/js/glocke.js?v=202610060113" defer></script>
<script src="assets/js/material.js?v=202610060113" defer></script>
</body>
</html>