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}