headers: rename Auth into Authenticate

This commit is contained in:
aler9
2021-05-11 10:27:24 +02:00
parent 19a18393e5
commit bc0d9d4bf2
7 changed files with 48 additions and 52 deletions

View File

@@ -24,7 +24,7 @@ func TestAuth(t *testing.T) {
}, },
{ {
"both", "both",
[]headers.AuthMethod{headers.AuthBasic, headers.AuthDigest}, nil,
}, },
} { } {
for _, conf := range []string{ for _, conf := range []string{

View File

@@ -21,26 +21,26 @@ type Sender struct {
// a Validator and a set of credentials. // a Validator and a set of credentials.
func NewSender(v base.HeaderValue, user string, pass string) (*Sender, error) { func NewSender(v base.HeaderValue, user string, pass string) (*Sender, error) {
// prefer digest // prefer digest
if headerAuthDigest := func() string { if v0 := func() string {
for _, vi := range v { for _, vi := range v {
if strings.HasPrefix(vi, "Digest ") { if strings.HasPrefix(vi, "Digest") {
return vi return vi
} }
} }
return "" return ""
}(); headerAuthDigest != "" { }(); v0 != "" {
var auth headers.Auth var auth headers.Authenticate
err := auth.Read(base.HeaderValue{headerAuthDigest}) err := auth.Read(base.HeaderValue{v0})
if err != nil { if err != nil {
return nil, err return nil, err
} }
if auth.Realm == nil { if auth.Realm == nil {
return nil, fmt.Errorf("realm not provided") return nil, fmt.Errorf("realm is missing")
} }
if auth.Nonce == nil { if auth.Nonce == nil {
return nil, fmt.Errorf("nonce not provided") return nil, fmt.Errorf("nonce is missing")
} }
return &Sender{ return &Sender{
@@ -52,22 +52,22 @@ func NewSender(v base.HeaderValue, user string, pass string) (*Sender, error) {
}, nil }, nil
} }
if headerAuthBasic := func() string { if v0 := func() string {
for _, vi := range v { for _, vi := range v {
if strings.HasPrefix(vi, "Basic ") { if strings.HasPrefix(vi, "Basic") {
return vi return vi
} }
} }
return "" return ""
}(); headerAuthBasic != "" { }(); v0 != "" {
var auth headers.Auth var auth headers.Authenticate
err := auth.Read(base.HeaderValue{headerAuthBasic}) err := auth.Read(base.HeaderValue{v0})
if err != nil { if err != nil {
return nil, err return nil, err
} }
if auth.Realm == nil { if auth.Realm == nil {
return nil, fmt.Errorf("realm not provided") return nil, fmt.Errorf("realm is missing")
} }
return &Sender{ return &Sender{
@@ -78,7 +78,7 @@ func NewSender(v base.HeaderValue, user string, pass string) (*Sender, error) {
}, nil }, nil
} }
return nil, fmt.Errorf("there are no authentication methods available") return nil, fmt.Errorf("no authentication methods available")
} }
// GenerateHeader generates an Authorization Header that allows to authenticate a request with // GenerateHeader generates an Authorization Header that allows to authenticate a request with
@@ -99,7 +99,7 @@ func (se *Sender) GenerateHeader(method base.Method, ur *base.URL) base.HeaderVa
response := md5Hex(md5Hex(se.user+":"+se.realm+":"+se.pass) + ":" + response := md5Hex(md5Hex(se.user+":"+se.realm+":"+se.pass) + ":" +
se.nonce + ":" + md5Hex(string(method)+":"+urStr)) se.nonce + ":" + md5Hex(string(method)+":"+urStr))
h.DigestValues = headers.Auth{ h.DigestValues = headers.Authenticate{
Method: headers.AuthDigest, Method: headers.AuthDigest,
Username: &se.user, Username: &se.user,
Realm: &se.realm, Realm: &se.realm,

View File

@@ -29,17 +29,13 @@ func NewValidator(user string, pass string, methods []headers.AuthMethod) *Valid
} }
userHashed := false userHashed := false
if strings.HasPrefix(user, "plain:") { if strings.HasPrefix(user, "sha256:") {
user = strings.TrimPrefix(user, "plain:")
} else if strings.HasPrefix(user, "sha256:") {
user = strings.TrimPrefix(user, "sha256:") user = strings.TrimPrefix(user, "sha256:")
userHashed = true userHashed = true
} }
passHashed := false passHashed := false
if strings.HasPrefix(pass, "plain:") { if strings.HasPrefix(pass, "sha256:") {
pass = strings.TrimPrefix(pass, "plain:")
} else if strings.HasPrefix(pass, "sha256:") {
pass = strings.TrimPrefix(pass, "sha256:") pass = strings.TrimPrefix(pass, "sha256:")
passHashed = true passHashed = true
} }
@@ -71,13 +67,13 @@ func (va *Validator) GenerateHeader() base.HeaderValue {
for _, m := range va.methods { for _, m := range va.methods {
switch m { switch m {
case headers.AuthBasic: case headers.AuthBasic:
ret = append(ret, (&headers.Auth{ ret = append(ret, (&headers.Authenticate{
Method: headers.AuthBasic, Method: headers.AuthBasic,
Realm: &va.realm, Realm: &va.realm,
}).Write()...) }).Write()...)
case headers.AuthDigest: case headers.AuthDigest:
ret = append(ret, headers.Auth{ ret = append(ret, headers.Authenticate{
Method: headers.AuthDigest, Method: headers.AuthDigest,
Realm: &va.realm, Realm: &va.realm,
Nonce: &va.nonce, Nonce: &va.nonce,
@@ -125,23 +121,23 @@ func (va *Validator) ValidateHeader(
default: // headers.AuthDigest default: // headers.AuthDigest
if auth.DigestValues.Realm == nil { if auth.DigestValues.Realm == nil {
return fmt.Errorf("realm not provided") return fmt.Errorf("realm is missing")
} }
if auth.DigestValues.Nonce == nil { if auth.DigestValues.Nonce == nil {
return fmt.Errorf("nonce not provided") return fmt.Errorf("nonce is missing")
} }
if auth.DigestValues.Username == nil { if auth.DigestValues.Username == nil {
return fmt.Errorf("username not provided") return fmt.Errorf("username is missing")
} }
if auth.DigestValues.URI == nil { if auth.DigestValues.URI == nil {
return fmt.Errorf("uri not provided") return fmt.Errorf("uri is missing")
} }
if auth.DigestValues.Response == nil { if auth.DigestValues.Response == nil {
return fmt.Errorf("response not provided") return fmt.Errorf("response is missing")
} }
if *auth.DigestValues.Nonce != va.nonce { if *auth.DigestValues.Nonce != va.nonce {

View File

@@ -19,8 +19,8 @@ const (
AuthDigest AuthDigest
) )
// Auth is an Authenticate or a WWW-Authenticate header. // Authenticate is an Authenticate or a WWW-Authenticate header.
type Auth struct { type Authenticate struct {
// authentication method // authentication method
Method AuthMethod Method AuthMethod
@@ -50,7 +50,7 @@ type Auth struct {
} }
// Read decodes an Authenticate or a WWW-Authenticate header. // Read decodes an Authenticate or a WWW-Authenticate header.
func (h *Auth) Read(v base.HeaderValue) error { func (h *Authenticate) Read(v base.HeaderValue) error {
if len(v) == 0 { if len(v) == 0 {
return fmt.Errorf("value not provided") return fmt.Errorf("value not provided")
} }
@@ -120,7 +120,7 @@ func (h *Auth) Read(v base.HeaderValue) error {
} }
// Write encodes an Authenticate or a WWW-Authenticate header. // Write encodes an Authenticate or a WWW-Authenticate header.
func (h Auth) Write() base.HeaderValue { func (h Authenticate) Write() base.HeaderValue {
ret := "" ret := ""
switch h.Method { switch h.Method {

View File

@@ -8,17 +8,17 @@ import (
"github.com/aler9/gortsplib/pkg/base" "github.com/aler9/gortsplib/pkg/base"
) )
var casesAuth = []struct { var casesAuthenticate = []struct {
name string name string
vin base.HeaderValue vin base.HeaderValue
vout base.HeaderValue vout base.HeaderValue
h Auth h Authenticate
}{ }{
{ {
"basic", "basic",
base.HeaderValue{`Basic realm="4419b63f5e51"`}, base.HeaderValue{`Basic realm="4419b63f5e51"`},
base.HeaderValue{`Basic realm="4419b63f5e51"`}, base.HeaderValue{`Basic realm="4419b63f5e51"`},
Auth{ Authenticate{
Method: AuthBasic, Method: AuthBasic,
Realm: func() *string { Realm: func() *string {
v := "4419b63f5e51" v := "4419b63f5e51"
@@ -30,7 +30,7 @@ var casesAuth = []struct {
"digest request 1", "digest request 1",
base.HeaderValue{`Digest realm="4419b63f5e51", nonce="8b84a3b789283a8bea8da7fa7d41f08b", stale="FALSE"`}, base.HeaderValue{`Digest realm="4419b63f5e51", nonce="8b84a3b789283a8bea8da7fa7d41f08b", stale="FALSE"`},
base.HeaderValue{`Digest realm="4419b63f5e51", nonce="8b84a3b789283a8bea8da7fa7d41f08b", stale="FALSE"`}, base.HeaderValue{`Digest realm="4419b63f5e51", nonce="8b84a3b789283a8bea8da7fa7d41f08b", stale="FALSE"`},
Auth{ Authenticate{
Method: AuthDigest, Method: AuthDigest,
Realm: func() *string { Realm: func() *string {
v := "4419b63f5e51" v := "4419b63f5e51"
@@ -50,7 +50,7 @@ var casesAuth = []struct {
"digest request 2", "digest request 2",
base.HeaderValue{`Digest realm="4419b63f5e51", nonce="8b84a3b789283a8bea8da7fa7d41f08b", stale=FALSE`}, base.HeaderValue{`Digest realm="4419b63f5e51", nonce="8b84a3b789283a8bea8da7fa7d41f08b", stale=FALSE`},
base.HeaderValue{`Digest realm="4419b63f5e51", nonce="8b84a3b789283a8bea8da7fa7d41f08b", stale="FALSE"`}, base.HeaderValue{`Digest realm="4419b63f5e51", nonce="8b84a3b789283a8bea8da7fa7d41f08b", stale="FALSE"`},
Auth{ Authenticate{
Method: AuthDigest, Method: AuthDigest,
Realm: func() *string { Realm: func() *string {
v := "4419b63f5e51" v := "4419b63f5e51"
@@ -70,7 +70,7 @@ var casesAuth = []struct {
"digest request 3", "digest request 3",
base.HeaderValue{`Digest realm="4419b63f5e51",nonce="133767111917411116111311118211673010032", stale="FALSE"`}, base.HeaderValue{`Digest realm="4419b63f5e51",nonce="133767111917411116111311118211673010032", stale="FALSE"`},
base.HeaderValue{`Digest realm="4419b63f5e51", nonce="133767111917411116111311118211673010032", stale="FALSE"`}, base.HeaderValue{`Digest realm="4419b63f5e51", nonce="133767111917411116111311118211673010032", stale="FALSE"`},
Auth{ Authenticate{
Method: AuthDigest, Method: AuthDigest,
Realm: func() *string { Realm: func() *string {
v := "4419b63f5e51" v := "4419b63f5e51"
@@ -90,7 +90,7 @@ var casesAuth = []struct {
"digest response generic", "digest response generic",
base.HeaderValue{`Digest username="aa", realm="bb", nonce="cc", uri="dd", response="ee"`}, base.HeaderValue{`Digest username="aa", realm="bb", nonce="cc", uri="dd", response="ee"`},
base.HeaderValue{`Digest username="aa", realm="bb", nonce="cc", uri="dd", response="ee"`}, base.HeaderValue{`Digest username="aa", realm="bb", nonce="cc", uri="dd", response="ee"`},
Auth{ Authenticate{
Method: AuthDigest, Method: AuthDigest,
Username: func() *string { Username: func() *string {
v := "aa" v := "aa"
@@ -118,7 +118,7 @@ var casesAuth = []struct {
"digest response with empty field", "digest response with empty field",
base.HeaderValue{`Digest username="", realm="IPCAM", nonce="5d17cd12b9fa8a85ac5ceef0926ea5a6", uri="rtsp://localhost:8554/mystream", response="c072ae90eb4a27f4cdcb90d62266b2a1"`}, base.HeaderValue{`Digest username="", realm="IPCAM", nonce="5d17cd12b9fa8a85ac5ceef0926ea5a6", uri="rtsp://localhost:8554/mystream", response="c072ae90eb4a27f4cdcb90d62266b2a1"`},
base.HeaderValue{`Digest username="", realm="IPCAM", nonce="5d17cd12b9fa8a85ac5ceef0926ea5a6", uri="rtsp://localhost:8554/mystream", response="c072ae90eb4a27f4cdcb90d62266b2a1"`}, base.HeaderValue{`Digest username="", realm="IPCAM", nonce="5d17cd12b9fa8a85ac5ceef0926ea5a6", uri="rtsp://localhost:8554/mystream", response="c072ae90eb4a27f4cdcb90d62266b2a1"`},
Auth{ Authenticate{
Method: AuthDigest, Method: AuthDigest,
Username: func() *string { Username: func() *string {
v := "" v := ""
@@ -146,7 +146,7 @@ var casesAuth = []struct {
"digest response with no spaces and additional fields", "digest response with no spaces and additional fields",
base.HeaderValue{`Digest realm="Please log in with a valid username",nonce="752a62306daf32b401a41004555c7663",opaque="",stale=FALSE,algorithm=MD5`}, base.HeaderValue{`Digest realm="Please log in with a valid username",nonce="752a62306daf32b401a41004555c7663",opaque="",stale=FALSE,algorithm=MD5`},
base.HeaderValue{`Digest realm="Please log in with a valid username", nonce="752a62306daf32b401a41004555c7663", opaque="", stale="FALSE", algorithm="MD5"`}, base.HeaderValue{`Digest realm="Please log in with a valid username", nonce="752a62306daf32b401a41004555c7663", opaque="", stale="FALSE", algorithm="MD5"`},
Auth{ Authenticate{
Method: AuthDigest, Method: AuthDigest,
Realm: func() *string { Realm: func() *string {
v := "Please log in with a valid username" v := "Please log in with a valid username"
@@ -172,10 +172,10 @@ var casesAuth = []struct {
}, },
} }
func TestAuthRead(t *testing.T) { func TestAuthenticateRead(t *testing.T) {
for _, ca := range casesAuth { for _, ca := range casesAuthenticate {
t.Run(ca.name, func(t *testing.T) { t.Run(ca.name, func(t *testing.T) {
var h Auth var h Authenticate
err := h.Read(ca.vin) err := h.Read(ca.vin)
require.NoError(t, err) require.NoError(t, err)
require.Equal(t, ca.h, h) require.Equal(t, ca.h, h)
@@ -183,8 +183,8 @@ func TestAuthRead(t *testing.T) {
} }
} }
func TestAuthWrite(t *testing.T) { func TestAuthenticateWrite(t *testing.T) {
for _, ca := range casesAuth { for _, ca := range casesAuthenticate {
t.Run(ca.name, func(t *testing.T) { t.Run(ca.name, func(t *testing.T) {
vout := ca.h.Write() vout := ca.h.Write()
require.Equal(t, ca.vout, vout) require.Equal(t, ca.vout, vout)
@@ -192,7 +192,7 @@ func TestAuthWrite(t *testing.T) {
} }
} }
func TestAuthReadError(t *testing.T) { func TestAutenticatehReadError(t *testing.T) {
for _, ca := range []struct { for _, ca := range []struct {
name string name string
hv base.HeaderValue hv base.HeaderValue
@@ -220,7 +220,7 @@ func TestAuthReadError(t *testing.T) {
}, },
} { } {
t.Run(ca.name, func(t *testing.T) { t.Run(ca.name, func(t *testing.T) {
var h Auth var h Authenticate
err := h.Read(ca.hv) err := h.Read(ca.hv)
require.Equal(t, ca.err, err.Error()) require.Equal(t, ca.err, err.Error())
}) })

View File

@@ -20,7 +20,7 @@ type Authorization struct {
BasicPass string BasicPass string
// digest values // digest values
DigestValues Auth DigestValues Authenticate
} }
// Read decodes an Authorization header. // Read decodes an Authorization header.
@@ -56,7 +56,7 @@ func (h *Authorization) Read(v base.HeaderValue) error {
case strings.HasPrefix(v0, "Digest "): case strings.HasPrefix(v0, "Digest "):
h.Method = AuthDigest h.Method = AuthDigest
var vals Auth var vals Authenticate
err := vals.Read(base.HeaderValue{v0}) err := vals.Read(base.HeaderValue{v0})
if err != nil { if err != nil {
return err return err

View File

@@ -30,7 +30,7 @@ var casesAuthorization = []struct {
base.HeaderValue{"Digest realm=\"4419b63f5e51\", nonce=\"8b84a3b789283a8bea8da7fa7d41f08b\", stale=\"FALSE\""}, base.HeaderValue{"Digest realm=\"4419b63f5e51\", nonce=\"8b84a3b789283a8bea8da7fa7d41f08b\", stale=\"FALSE\""},
Authorization{ Authorization{
Method: AuthDigest, Method: AuthDigest,
DigestValues: Auth{ DigestValues: Authenticate{
Method: AuthDigest, Method: AuthDigest,
Realm: func() *string { Realm: func() *string {
v := "4419b63f5e51" v := "4419b63f5e51"