fix: lock files across different users

Fixes #66.
This commit is contained in:
Henrique Dias
2025-05-17 10:53:07 +02:00
parent e350dc989a
commit 5226853fca
2 changed files with 45 additions and 2 deletions
+10 -2
View File
@@ -23,6 +23,8 @@ type Handler struct {
} }
func NewHandler(c *Config) (http.Handler, error) { func NewHandler(c *Config) (http.Handler, error) {
ls := webdav.NewMemLS()
h := &Handler{ h := &Handler{
noPassword: c.NoPassword, noPassword: c.NoPassword,
behindProxy: c.BehindProxy, behindProxy: c.BehindProxy,
@@ -36,7 +38,10 @@ func NewHandler(c *Config) (http.Handler, error) {
Dir: webdav.Dir(c.Directory), Dir: webdav.Dir(c.Directory),
noSniff: c.NoSniff, noSniff: c.NoSniff,
}, },
LockSystem: webdav.NewMemLS(), LockSystem: &lockSystem{
LockSystem: ls,
directory: c.Directory,
},
}, },
}, },
users: map[string]*handlerUser{}, users: map[string]*handlerUser{},
@@ -51,7 +56,10 @@ func NewHandler(c *Config) (http.Handler, error) {
Dir: webdav.Dir(u.Directory), Dir: webdav.Dir(u.Directory),
noSniff: c.NoSniff, noSniff: c.NoSniff,
}, },
LockSystem: webdav.NewMemLS(), LockSystem: &lockSystem{
LockSystem: ls,
directory: u.Directory,
},
}, },
} }
} }
+35
View File
@@ -0,0 +1,35 @@
package lib
import (
"path/filepath"
"time"
"golang.org/x/net/webdav"
)
var _ webdav.LockSystem = &lockSystem{}
// LockSystem wraps a [webdav.LockSystem] with a root directory, allowing
// to reuse the same [webdav.LockSystem] for multiple users with different base
// directories, meaning we can correctly lock the files across different users.
type lockSystem struct {
webdav.LockSystem
directory string
}
func (l *lockSystem) Confirm(now time.Time, name0, name1 string, conditions ...webdav.Condition) (release func(), err error) {
if name0 != "" {
name0 = filepath.Join(l.directory, name0)
}
if name1 != "" {
name1 = filepath.Join(l.directory, name1)
}
return l.LockSystem.Confirm(now, name0, name1, conditions...)
}
func (l *lockSystem) Create(now time.Time, details webdav.LockDetails) (token string, err error) {
details.Root = filepath.Join(l.directory, details.Root)
return l.LockSystem.Create(now, details)
}