keel/net/http/cookie/domainprovider.go
Kevin Franklin Kim 74d3162e42
fix: lint issues
2024-11-18 15:39:54 +01:00

75 lines
1.5 KiB
Go

package cookie
import (
"net/http"
"strings"
"github.com/pkg/errors"
keelhttp "github.com/foomo/keel/utils/net/http"
)
type DomainProvider func(r *http.Request) (string, error)
var ErrDomainNotAllowed = errors.New("domain not allowed")
type (
DomainProviderOptions struct {
Domains []string
Mappings map[string]string
}
DomainProviderOption func(options *DomainProviderOptions)
)
func GetDefaultDomainProviderOptions() DomainProviderOptions {
return DomainProviderOptions{}
}
func DomainProviderWithDomains(v ...string) DomainProviderOption {
return func(o *DomainProviderOptions) {
o.Domains = v
}
}
func DomainProviderWithMappings(v map[string]string) DomainProviderOption {
return func(o *DomainProviderOptions) {
o.Mappings = v
}
}
func NewDomainProvider(opts ...DomainProviderOption) DomainProvider {
options := GetDefaultDomainProviderOptions()
for _, opt := range opts {
if opt != nil {
opt(&options)
}
}
return func(r *http.Request) (string, error) {
domain := keelhttp.GetRequestDomain(r)
if len(options.Domains) == 0 {
return domain, nil
}
if options.Mappings != nil {
if value, ok := options.Mappings[domain]; ok {
domain = value
}
}
if len(options.Domains) > 0 {
for _, value := range options.Domains {
// foo.com = foo.com
// foo.com = *.foo.com
// example.foo.com = *.foo.com
if domain == strings.TrimPrefix(value, "*.") || (strings.HasPrefix(value, "*.") && strings.HasSuffix(domain, value[1:])) {
return domain, nil
}
}
}
return "", ErrDomainNotAllowed
}
}