1
0
Fork 0
authdav/authdav.go
2019-08-31 16:39:50 +02:00

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)
}