reg/registry/authchallenge.go
Jess Frazelle 1af74c42c2
fixes
Signed-off-by: Jess Frazelle <me@jessfraz.com>
2016-09-05 19:44:19 -07:00

54 lines
1.1 KiB
Go

package registry
import (
"fmt"
"net/http"
"net/url"
"regexp"
)
var (
authChallengeRegex = regexp.MustCompile(
`^\s*Bearer\s+realm="([^"]+)",service="([^"]+)"\s*$`)
challengeRegex = regexp.MustCompile(
`^\s*Bearer\s+realm="([^"]+)",service="([^"]+)",scope="([^"]+)"\s*$`)
scopeSeparatorRegex = regexp.MustCompile(`\s+`)
)
func parseAuthHeader(header http.Header) (*authService, error) {
ch, err := parseChallenge(header.Get("www-authenticate"))
if err != nil {
return nil, err
}
return ch, nil
}
func parseChallenge(challengeHeader string) (*authService, error) {
match := challengeRegex.FindAllStringSubmatch(challengeHeader, -1)
if len(match) != 1 {
match = authChallengeRegex.FindAllStringSubmatch(challengeHeader, -1)
if len(match) != 1 {
return nil, fmt.Errorf("malformed auth challenge header: '%s'", challengeHeader)
}
}
parsedRealm, err := url.Parse(match[0][1])
if err != nil {
return nil, err
}
a := &authService{
Realm: parsedRealm,
Service: match[0][2],
}
if len(match[0]) >= 4 {
a.Scope = scopeSeparatorRegex.Split(match[0][3], -1)
}
return a, nil
}