69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
| package validation
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"net/http"
 | |
| 	"sort"
 | |
| 
 | |
| 	"github.com/oauth2-proxy/oauth2-proxy/v7/pkg/apis/options"
 | |
| 	"github.com/oauth2-proxy/oauth2-proxy/v7/pkg/encryption"
 | |
| )
 | |
| 
 | |
| func validateCookie(o options.Cookie) []string {
 | |
| 	msgs := validateCookieSecret(o.Secret)
 | |
| 
 | |
| 	if o.Refresh >= o.Expire {
 | |
| 		msgs = append(msgs, fmt.Sprintf(
 | |
| 			"cookie_refresh (%q) must be less than cookie_expire (%q)",
 | |
| 			o.Refresh.String(),
 | |
| 			o.Expire.String()))
 | |
| 	}
 | |
| 
 | |
| 	switch o.SameSite {
 | |
| 	case "", "none", "lax", "strict":
 | |
| 	default:
 | |
| 		msgs = append(msgs, fmt.Sprintf("cookie_samesite (%q) must be one of ['', 'lax', 'strict', 'none']", o.SameSite))
 | |
| 	}
 | |
| 
 | |
| 	// Sort cookie domains by length, so that we try longer (and more specific) domains first
 | |
| 	sort.Slice(o.Domains, func(i, j int) bool {
 | |
| 		return len(o.Domains[i]) > len(o.Domains[j])
 | |
| 	})
 | |
| 
 | |
| 	msgs = append(msgs, validateCookieName(o.Name)...)
 | |
| 	return msgs
 | |
| }
 | |
| 
 | |
| func validateCookieName(name string) []string {
 | |
| 	msgs := []string{}
 | |
| 
 | |
| 	cookie := &http.Cookie{Name: name}
 | |
| 	if cookie.String() == "" {
 | |
| 		msgs = append(msgs, fmt.Sprintf("invalid cookie name: %q", name))
 | |
| 	}
 | |
| 
 | |
| 	if len(name) > 256 {
 | |
| 		msgs = append(msgs, fmt.Sprintf("cookie name should be under 256 characters: cookie name is %d characters", len(name)))
 | |
| 	}
 | |
| 	return msgs
 | |
| }
 | |
| 
 | |
| func validateCookieSecret(secret string) []string {
 | |
| 	if secret == "" {
 | |
| 		return []string{"missing setting: cookie-secret"}
 | |
| 	}
 | |
| 
 | |
| 	secretBytes := encryption.SecretBytes(secret)
 | |
| 	// Check if the secret is a valid length
 | |
| 	switch len(secretBytes) {
 | |
| 	case 16, 24, 32:
 | |
| 		// Valid secret size found
 | |
| 		return []string{}
 | |
| 	}
 | |
| 	// Invalid secret size found, return a message
 | |
| 	return []string{fmt.Sprintf(
 | |
| 		"cookie_secret must be 16, 24, or 32 bytes to create an AES cipher, but is %d bytes",
 | |
| 		len(secretBytes)),
 | |
| 	}
 | |
| }
 |