package signin import ( "crypto/rand" "encoding/hex" "net/http" "tug/internal/storage" ) const ( BrowserCookie = "__Host-authsvc_browser" browserMaxAge = 400 * 24 * 60 * 60 ) func browserMarker(r *http.Request) (string, bool) { c, err := r.Cookie(BrowserCookie) if err != nil || !storage.ValidBrowser(c.Value) { return "", false } return c.Value, true } func newBrowserMarker() string { b := make([]byte, storage.BrowserMarkerLength/2) rand.Read(b) return hex.EncodeToString(b) } func setBrowser(w http.ResponseWriter, marker string) { http.SetCookie(w, &http.Cookie{Name: BrowserCookie, Value: marker, Path: "/", MaxAge: browserMaxAge, Secure: true, HttpOnly: true, SameSite: http.SameSiteLaxMode}) } func ensureBrowser(w http.ResponseWriter, r *http.Request) string { if marker, ok := browserMarker(r); ok { return marker } marker := newBrowserMarker() setBrowser(w, marker) return marker }