wip
This commit is contained in:
@@ -0,0 +1,49 @@
|
||||
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)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user