Add multiple auth test
This commit is contained in:
parent
ca40e2802e
commit
5fd8037a63
@ -39,6 +39,54 @@ func basicAuth(h http.Handler) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func multipleAuth(h http.Handler) http.HandlerFunc {
|
||||||
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
notAuthed := false
|
||||||
|
if r.Header.Get("Authorization") == "" {
|
||||||
|
notAuthed = true
|
||||||
|
} else if user, passwd, ok := r.BasicAuth(); ok {
|
||||||
|
if user == "user" && passwd == "password" {
|
||||||
|
h.ServeHTTP(w, r)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
notAuthed = true
|
||||||
|
} else if strings.HasPrefix(r.Header.Get("Authorization"), "Digest ") {
|
||||||
|
pairs := strings.TrimPrefix(r.Header.Get("Authorization"), "Digest ")
|
||||||
|
digestParts := make(map[string]string)
|
||||||
|
for _, pair := range strings.Split(pairs, ",") {
|
||||||
|
kv := strings.SplitN(strings.TrimSpace(pair), "=", 2)
|
||||||
|
key, value := kv[0], kv[1]
|
||||||
|
value = strings.Trim(value, `"`)
|
||||||
|
digestParts[key] = value
|
||||||
|
}
|
||||||
|
if digestParts["qop"] == "" {
|
||||||
|
digestParts["qop"] = "auth"
|
||||||
|
}
|
||||||
|
|
||||||
|
ha1 := getMD5(fmt.Sprint(digestParts["username"], ":", digestParts["realm"], ":", "digestPW"))
|
||||||
|
ha2 := getMD5(fmt.Sprint(r.Method, ":", digestParts["uri"]))
|
||||||
|
expected := getMD5(fmt.Sprint(ha1,
|
||||||
|
":", digestParts["nonce"],
|
||||||
|
":", digestParts["nc"],
|
||||||
|
":", digestParts["cnonce"],
|
||||||
|
":", digestParts["qop"],
|
||||||
|
":", ha2))
|
||||||
|
|
||||||
|
if expected == digestParts["response"] {
|
||||||
|
h.ServeHTTP(w, r)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
notAuthed = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if notAuthed {
|
||||||
|
w.Header().Add("WWW-Authenticate", `Digest realm="testrealm@host.com", qop="auth,auth-int",nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093",opaque="5ccc069c403ebaf9f0171e9517f40e41"`)
|
||||||
|
w.Header().Add("WWW-Authenticate", `Basic realm="x"`)
|
||||||
|
w.WriteHeader(401)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func fillFs(t *testing.T, fs webdav.FileSystem) context.Context {
|
func fillFs(t *testing.T, fs webdav.FileSystem) context.Context {
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
f, err := fs.OpenFile(ctx, "hello.txt", os.O_CREATE, 0644)
|
f, err := fs.OpenFile(ctx, "hello.txt", os.O_CREATE, 0644)
|
||||||
@ -95,6 +143,24 @@ func TestConnect(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestConnectMultipleAuth(t *testing.T) {
|
||||||
|
cli, srv, _, _ := newAuthServer(t, multipleAuth)
|
||||||
|
defer srv.Close()
|
||||||
|
if err := cli.Connect(); err != nil {
|
||||||
|
t.Fatalf("got error: %v, want nil", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cli = NewClient(srv.URL, "digestUser", "digestPW")
|
||||||
|
if err := cli.Connect(); err != nil {
|
||||||
|
t.Fatalf("got nil, want error: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cli = NewClient(srv.URL, "no", "no")
|
||||||
|
if err := cli.Connect(); err == nil {
|
||||||
|
t.Fatalf("got nil, want error: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestConnectMultiAuthII(t *testing.T) {
|
func TestConnectMultiAuthII(t *testing.T) {
|
||||||
cli, srv, _, _ := newAuthServer(t, func(h http.Handler) http.HandlerFunc {
|
cli, srv, _, _ := newAuthServer(t, func(h http.Handler) http.HandlerFunc {
|
||||||
return func(w http.ResponseWriter, r *http.Request) {
|
return func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
Loading…
Reference in New Issue
Block a user