Raw
 1package signin
 2
 3import (
 4	"crypto/rand"
 5	"encoding/hex"
 6	"net/http"
 7
 8	"tug/internal/storage"
 9)
10
11const (
12	BrowserCookie = "__Host-authsvc_browser"
13	browserMaxAge = 400 * 24 * 60 * 60
14)
15
16func browserMarker(r *http.Request) (string, bool) {
17	c, err := r.Cookie(BrowserCookie)
18	if err != nil || !storage.ValidBrowser(c.Value) {
19		return "", false
20	}
21	return c.Value, true
22}
23
24func newBrowserMarker() string {
25	b := make([]byte, storage.BrowserMarkerLength/2)
26	rand.Read(b)
27	return hex.EncodeToString(b)
28}
29
30func setBrowser(w http.ResponseWriter, marker string) {
31	http.SetCookie(w, &http.Cookie{Name: BrowserCookie, Value: marker, Path: "/", MaxAge: browserMaxAge, Secure: true, HttpOnly: true, SameSite: http.SameSiteLaxMode})
32}
33
34func ensureBrowser(w http.ResponseWriter, r *http.Request) string {
35	if marker, ok := browserMarker(r); ok {
36		return marker
37	}
38	marker := newBrowserMarker()
39	setBrowser(w, marker)
40	return marker
41}