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