f92d4bb2d9
fix(gallery): keep an admin draft preview out of the guest share-login flow Making verify-token pass for a draft preview opened a path that did not exist before it: the gallery bootstrap then called shareLinkLogin, which refuses a draft AND records a failed login attempt against the caller's IP while doing it. Five preview opens inside the attempt window therefore locked share-link logins out for that IP — including for real guests, and including after the gallery was published. An admin preview does not need a guest session at all. The admin cookie plus admin_preview=1 already authorizes every gallery call, which is exactly how preview works on a published gallery, so the preview path loads the gallery directly and never touches the login endpoint. Deliberately not fixed by relaxing shareLinkLogin's draft check: that endpoint mints a guest token, and a draft should not be handing those out. Relates to issue 1386 fix(gallery): let an admin preview a draft through its short share URL /info has honoured admin_preview since issue 868, but two sibling routes on the short-URL path never did: - GET /resolve/:identifier filtered drafts out through ACTIVE_EVENT_FILTER (shareLinkService.js), with no escape for a verified admin. - GET /:slug/verify-token/:token repeated the same filter inline, so clearing the first would only have moved the 404 one step later. With "use short gallery URLs" off the View Gallery link carries the slug, GalleryPage never calls /resolve, and the preview worked. With it on the link is the token form, GalleryPage resolves it first, and the draft answered "Gallery Not Found". resolveShareIdentifier takes an includeDrafts option, and /resolve reaches for it only after the published lookup misses AND verifyAdminPreview accepts the caller — so the published path keeps its single query and an unverified caller never learns the draft exists. The frontend already sends admin_preview=1 (EventDetailsHeader.tsx:203, forwarded by config/api.ts:81); only the backend had to change. GHSA-rh8r's rule is unchanged and now pinned by test: a bare slug lookup still never returns share_token, draft or not. Relates to issue 1386