You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

66 lines
1.6 KiB

package toolbox
import (
"errors"
"net/url"
"regexp"
"strings"
"time"
"github.com/cloudtrust/keycloak-client"
)
// IssuerManager provides URL according to a given context
type IssuerManager interface {
GetOidcVerifierProvider(issuer string) (OidcVerifierProvider, error)
}
type issuerManager struct {
domainToVerifier map[string]OidcVerifierProvider
}
func getProtocolAndDomain(URL string) string {
var r = regexp.MustCompile(`^\w+:\/\/[^\/]+`)
var match = r.FindStringSubmatch(URL)
if match != nil {
return strings.ToLower(match[0])
}
// Best effort: if not found return the whole input string
return URL
}
// NewIssuerManager creates a new URLProvider
func NewIssuerManager(config keycloak.Config) (IssuerManager, error) {
URLs := config.AddrTokenProvider
// Use default values when clients are not initializing these values
cacheTTL := config.CacheTTL
if cacheTTL == 0 {
cacheTTL = 15 * time.Minute
}
errTolerance := config.ErrorTolerance
if errTolerance == 0 {
errTolerance = time.Minute
}
var domainToVerifier = make(map[string]OidcVerifierProvider)
for _, value := range strings.Split(URLs, " ") {
uToken, err := url.Parse(value)
if err != nil {
return nil, err
}
verifier := NewVerifierCache(uToken, cacheTTL, errTolerance)
domainToVerifier[getProtocolAndDomain(value)] = verifier
}
return &issuerManager{
domainToVerifier: domainToVerifier,
}, nil
}
func (im *issuerManager) GetOidcVerifierProvider(issuer string) (OidcVerifierProvider, error) {
issuerDomain := getProtocolAndDomain(issuer)
if verifier, ok := im.domainToVerifier[issuerDomain]; ok {
return verifier, nil
}
return nil, errors.New("Unknown issuer")
}