~sircmpwn/tokidoki

1d871b000a79d0d65d247c5db41cd6885ccbf9ce — Conrad Hoffmann 4 months ago ddc11d4
Add a "null" auth backend

Not built by default, but can be added with `go build -tags nullauth`.
Enabled by running tokidoki with `-auth.url null://`. Very useful for
simpler debugging when you don't want manage test accounts with actual
passwords.
3 files changed, 50 insertions(+), 0 deletions(-)

A auth/null.go
A auth/null_stub.go
M auth/url.go
A auth/null.go => auth/null.go +37 -0
@@ 0,0 1,37 @@
//go:build nullauth

package auth

import (
	"net/http"
)

type nullProvider struct{}

func NewNull() (AuthProvider, error) {
	return nullProvider{}, nil
}

func (nullProvider) Middleware() func(http.Handler) http.Handler {
	return func(next http.Handler) http.Handler {
		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			nullAuth(next, w, r)
		})
	}
}

func nullAuth(next http.Handler, w http.ResponseWriter, r *http.Request) {
	user, _, ok := r.BasicAuth()
	if !ok {
		w.Header().Add("WWW-Authenticate", `Basic realm="Please provide your system credentials", charset="UTF-8"`)
		http.Error(w, "HTTP Basic auth is required", http.StatusUnauthorized)
		return
	}
	authCtx := AuthContext{
		AuthMethod: "null",
		UserName:   user,
	}
	ctx := NewContext(r.Context(), &authCtx)
	r = r.WithContext(ctx)
	next.ServeHTTP(w, r)
}

A auth/null_stub.go => auth/null_stub.go +11 -0
@@ 0,0 1,11 @@
//go:build !nullauth

package auth

import (
	"errors"
)

func NewNull() (AuthProvider, error) {
	return nil, errors.New("NullAuth is disabled")
}

M auth/url.go => auth/url.go +2 -0
@@ 18,6 18,8 @@ func NewFromURL(authURL string) (AuthProvider, error) {
		return NewIMAP(u.Host, true), nil
	case "pam":
		return NewPAM()
	case "null":
		return NewNull()
	default:
		return nil, fmt.Errorf("no auth provider found for %s:// URL", u.Scheme)
	}