50 lines
1.4 KiB
Go
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)
|
|
})
|
|
}
|