package cookies import ( "fmt" "net" "net/http" "strings" "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/logger" requestutil "github.com/oauth2-proxy/oauth2-proxy/v7/pkg/requests/util" ) // GetCookieDomain returns the correct cookie domain given a list of domains // by checking the X-Fowarded-Host and host header of an an http request func GetCookieDomain(req *http.Request, cookieDomains []string) string { host := requestutil.GetRequestHost(req) for _, domain := range cookieDomains { if strings.HasSuffix(host, domain) { return domain } } return "" } // Parse a valid http.SameSite value from a user supplied string for use of making cookies. func ParseSameSite(v string) http.SameSite { switch v { case "lax": return http.SameSiteLaxMode case "strict": return http.SameSiteStrictMode case "none": return http.SameSiteNoneMode case "": return 0 default: panic(fmt.Sprintf("Invalid value for SameSite: %s", v)) } } // warnInvalidDomain logs a warning if the request host and cookie domain are // mismatched. func warnInvalidDomain(c *http.Cookie, req *http.Request) { if c.Domain == "" { return } host := requestutil.GetRequestHost(req) if h, _, err := net.SplitHostPort(host); err == nil { host = h } if !strings.HasSuffix(host, c.Domain) { logger.Errorf("Warning: request host is %q but using configured cookie domain of %q", host, c.Domain) } }