57 lines
1.5 KiB
Go
57 lines
1.5 KiB
Go
// Copyright (C) 2019 Marius Schellenberger
|
|
|
|
package authdav
|
|
|
|
import (
|
|
"golang.org/x/net/webdav"
|
|
"net/http"
|
|
)
|
|
|
|
// DefaultRealm is the HTTP Basic Auth default realm
|
|
const DefaultRealm = "WebDav"
|
|
|
|
// Authenticator is the interface for Webdav HTTP Basic Auth
|
|
type Authenticator interface {
|
|
BasicAuth(username string, password string) bool
|
|
}
|
|
|
|
// WebdavBasicAuth is a WebDav wrapper for HTTP Basic Auth and implements the http.Handler interface
|
|
type WebdavBasicAuth struct {
|
|
dav *webdav.Handler
|
|
auth Authenticator
|
|
realm string
|
|
}
|
|
|
|
// NewWebdavBasicAuth returns a new WebdavBasicAuth wrapper
|
|
// prefix can be empty
|
|
// ls and log can be nil
|
|
// an empty authenticator disables HTTP Basic Auth
|
|
// realm can be empty and defaults to authdav.DefaultRealm
|
|
func NewWebdavBasicAuth(prefix string, fs webdav.FileSystem, ls webdav.LockSystem, log func(*http.Request, error), auth Authenticator, realm string) *WebdavBasicAuth {
|
|
if ls == nil {
|
|
ls = webdav.NewMemLS()
|
|
}
|
|
if realm == "" {
|
|
realm = DefaultRealm
|
|
}
|
|
dav := &webdav.Handler{
|
|
Prefix: prefix,
|
|
FileSystem: fs,
|
|
LockSystem: ls,
|
|
Logger: log,
|
|
}
|
|
return &WebdavBasicAuth{dav, auth, `Basic realm="` + realm + `"`}
|
|
}
|
|
|
|
func (h *WebdavBasicAuth) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|
if h.auth != nil {
|
|
u, p, ok := r.BasicAuth()
|
|
if !ok || !h.auth.BasicAuth(u, p) {
|
|
w.Header().Set("WWW-Authenticate", h.realm)
|
|
w.WriteHeader(http.StatusUnauthorized)
|
|
w.Write([]byte("Unauthorised\n"))
|
|
return
|
|
}
|
|
}
|
|
h.dav.ServeHTTP(w, r)
|
|
}
|