60 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Go
		
	
	
	
package cookies
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"net"
 | 
						|
	"net/http"
 | 
						|
	"strings"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"github.com/pusher/oauth2_proxy/pkg/apis/options"
 | 
						|
	"github.com/pusher/oauth2_proxy/pkg/logger"
 | 
						|
)
 | 
						|
 | 
						|
// MakeCookie constructs a cookie from the given parameters,
 | 
						|
// discovering the domain from the request if not specified.
 | 
						|
func MakeCookie(req *http.Request, name string, value string, path string, domain string, httpOnly bool, secure bool, expiration time.Duration, now time.Time, sameSite http.SameSite) *http.Cookie {
 | 
						|
	if domain != "" {
 | 
						|
		host := req.Host
 | 
						|
		if h, _, err := net.SplitHostPort(host); err == nil {
 | 
						|
			host = h
 | 
						|
		}
 | 
						|
		if !strings.HasSuffix(host, domain) {
 | 
						|
			logger.Printf("Warning: request host is %q but using configured cookie domain of %q", host, domain)
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	return &http.Cookie{
 | 
						|
		Name:     name,
 | 
						|
		Value:    value,
 | 
						|
		Path:     path,
 | 
						|
		Domain:   domain,
 | 
						|
		HttpOnly: httpOnly,
 | 
						|
		Secure:   secure,
 | 
						|
		Expires:  now.Add(expiration),
 | 
						|
		SameSite: sameSite,
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// MakeCookieFromOptions constructs a cookie based on the given *options.CookieOptions,
 | 
						|
// value and creation time
 | 
						|
func MakeCookieFromOptions(req *http.Request, name string, value string, opts *options.CookieOptions, expiration time.Duration, now time.Time) *http.Cookie {
 | 
						|
	return MakeCookie(req, name, value, opts.CookiePath, opts.CookieDomain, opts.CookieHTTPOnly, opts.CookieSecure, expiration, now, ParseSameSite(opts.CookieSameSite))
 | 
						|
}
 | 
						|
 | 
						|
// 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 http.SameSiteDefaultMode
 | 
						|
	default:
 | 
						|
		panic(fmt.Sprintf("Invalid value for SameSite: %s", v))
 | 
						|
	}
 | 
						|
}
 |