Files
nidus/internal/webdav/handler.go
T
2026-04-23 21:56:59 +02:00

50 lines
1.4 KiB
Go

package filewebdav
import (
"log/slog"
"net/http"
"os"
"path/filepath"
"github.com/yourusername/caldav-server/internal/auth"
"github.com/yourusername/caldav-server/internal/config"
xwebdav "golang.org/x/net/webdav"
)
// NewHandler returns an http.Handler that provides standard WebDAV file access
// per-user under dataDir/files/<username>/.
func NewHandler(cfg *config.Config, dataDir string, logger *slog.Logger) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
p := auth.FromContext(r.Context())
if p == nil {
w.WriteHeader(http.StatusUnauthorized)
return
}
userDir := filepath.Join(dataDir, "files", p.Username)
logger.Debug(userDir)
if err := os.MkdirAll(userDir, 0o755); err != nil {
logger.Error("creating user WebDAV dir", "user", p.Username, "error", err)
http.Error(w, "internal server error", http.StatusInternalServerError)
return
}
// Each user gets their own isolated WebDAV handler so paths don't bleed.
h := &xwebdav.Handler{
FileSystem: xwebdav.Dir(userDir),
LockSystem: xwebdav.NewMemLS(),
Logger: func(r *http.Request, err error) {
if err != nil {
logger.Warn("WebDAV error",
"user", p.Username,
"method", r.Method,
"path", r.URL.Path,
"error", err)
}
},
Prefix: "/", //fmt.Sprintf("/files/%s", p.Username),
}
h.ServeHTTP(w, r)
})
}