mirror of
https://github.com/drakkan/sftpgo.git
synced 2025-12-06 22:30:56 +03:00
WebDAV: try to preserve the lock fs as much as possible
This commit is contained in:
@@ -895,6 +895,7 @@ func TestBasicUsersCache(t *testing.T) {
|
||||
},
|
||||
},
|
||||
}
|
||||
dataprovider.InitializeWebDAVUserCache(c.Cache.Users.MaxSize)
|
||||
server := webDavServer{
|
||||
config: c,
|
||||
binding: c.Bindings[0],
|
||||
@@ -915,10 +916,8 @@ func TestBasicUsersCache(t *testing.T) {
|
||||
assert.False(t, isCached)
|
||||
assert.Equal(t, dataprovider.LoginMethodPassword, loginMethod)
|
||||
// now the user should be cached
|
||||
var cachedUser *dataprovider.CachedUser
|
||||
result, ok := dataprovider.GetCachedWebDAVUser(username)
|
||||
cachedUser, ok := dataprovider.GetCachedWebDAVUser(username)
|
||||
if assert.True(t, ok) {
|
||||
cachedUser = result.(*dataprovider.CachedUser)
|
||||
assert.False(t, cachedUser.IsExpired())
|
||||
assert.True(t, cachedUser.Expiration.After(now.Add(time.Duration(c.Cache.Users.ExpirationTime)*time.Minute)))
|
||||
// authenticate must return the cached user now
|
||||
@@ -935,10 +934,9 @@ func TestBasicUsersCache(t *testing.T) {
|
||||
|
||||
// force cached user expiration
|
||||
cachedUser.Expiration = now
|
||||
dataprovider.CacheWebDAVUser(cachedUser, c.Cache.Users.MaxSize)
|
||||
result, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
dataprovider.CacheWebDAVUser(cachedUser)
|
||||
cachedUser, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
if assert.True(t, ok) {
|
||||
cachedUser = result.(*dataprovider.CachedUser)
|
||||
assert.True(t, cachedUser.IsExpired())
|
||||
}
|
||||
// now authenticate should get the user from the data provider and update the cache
|
||||
@@ -946,12 +944,24 @@ func TestBasicUsersCache(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
assert.False(t, isCached)
|
||||
assert.Equal(t, dataprovider.LoginMethodPassword, loginMethod)
|
||||
result, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
cachedUser, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
if assert.True(t, ok) {
|
||||
cachedUser = result.(*dataprovider.CachedUser)
|
||||
assert.False(t, cachedUser.IsExpired())
|
||||
}
|
||||
// cache is invalidated after a user modification
|
||||
// cache is not invalidated after a user modification if the fs does not change
|
||||
err = dataprovider.UpdateUser(&user)
|
||||
assert.NoError(t, err)
|
||||
_, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
assert.True(t, ok)
|
||||
folderName := "testFolder"
|
||||
user.VirtualFolders = append(user.VirtualFolders, vfs.VirtualFolder{
|
||||
BaseVirtualFolder: vfs.BaseVirtualFolder{
|
||||
Name: folderName,
|
||||
MappedPath: filepath.Join(os.TempDir(), "mapped"),
|
||||
},
|
||||
VirtualPath: "/vdir",
|
||||
})
|
||||
|
||||
err = dataprovider.UpdateUser(&user)
|
||||
assert.NoError(t, err)
|
||||
_, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
@@ -969,6 +979,9 @@ func TestBasicUsersCache(t *testing.T) {
|
||||
_, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
assert.False(t, ok)
|
||||
|
||||
err = dataprovider.DeleteFolder(folderName)
|
||||
assert.NoError(t, err)
|
||||
|
||||
err = os.RemoveAll(u.GetHomeDir())
|
||||
assert.NoError(t, err)
|
||||
}
|
||||
@@ -1011,6 +1024,7 @@ func TestCachedUserWithFolders(t *testing.T) {
|
||||
},
|
||||
},
|
||||
}
|
||||
dataprovider.InitializeWebDAVUserCache(c.Cache.Users.MaxSize)
|
||||
server := webDavServer{
|
||||
config: c,
|
||||
binding: c.Bindings[0],
|
||||
@@ -1031,10 +1045,8 @@ func TestCachedUserWithFolders(t *testing.T) {
|
||||
assert.False(t, isCached)
|
||||
assert.Equal(t, dataprovider.LoginMethodPassword, loginMethod)
|
||||
// now the user should be cached
|
||||
var cachedUser *dataprovider.CachedUser
|
||||
result, ok := dataprovider.GetCachedWebDAVUser(username)
|
||||
cachedUser, ok := dataprovider.GetCachedWebDAVUser(username)
|
||||
if assert.True(t, ok) {
|
||||
cachedUser = result.(*dataprovider.CachedUser)
|
||||
assert.False(t, cachedUser.IsExpired())
|
||||
assert.True(t, cachedUser.Expiration.After(now.Add(time.Duration(c.Cache.Users.ExpirationTime)*time.Minute)))
|
||||
// authenticate must return the cached user now
|
||||
@@ -1054,9 +1066,8 @@ func TestCachedUserWithFolders(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
assert.False(t, isCached)
|
||||
assert.Equal(t, dataprovider.LoginMethodPassword, loginMethod)
|
||||
result, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
cachedUser, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
if assert.True(t, ok) {
|
||||
cachedUser = result.(*dataprovider.CachedUser)
|
||||
assert.False(t, cachedUser.IsExpired())
|
||||
}
|
||||
|
||||
@@ -1067,9 +1078,8 @@ func TestCachedUserWithFolders(t *testing.T) {
|
||||
assert.NoError(t, err)
|
||||
assert.False(t, isCached)
|
||||
assert.Equal(t, dataprovider.LoginMethodPassword, loginMethod)
|
||||
result, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
cachedUser, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
if assert.True(t, ok) {
|
||||
cachedUser = result.(*dataprovider.CachedUser)
|
||||
assert.False(t, cachedUser.IsExpired())
|
||||
}
|
||||
|
||||
@@ -1133,6 +1143,7 @@ func TestUsersCacheSizeAndExpiration(t *testing.T) {
|
||||
},
|
||||
},
|
||||
}
|
||||
dataprovider.InitializeWebDAVUserCache(c.Cache.Users.MaxSize)
|
||||
server := webDavServer{
|
||||
config: c,
|
||||
binding: c.Bindings[0],
|
||||
@@ -1240,6 +1251,7 @@ func TestUsersCacheSizeAndExpiration(t *testing.T) {
|
||||
assert.True(t, ok)
|
||||
|
||||
// now remove user1 after an update
|
||||
user1.HomeDir += "_mod"
|
||||
err = dataprovider.UpdateUser(&user1)
|
||||
assert.NoError(t, err)
|
||||
_, ok = dataprovider.GetCachedWebDAVUser(user1.Username)
|
||||
@@ -1283,6 +1295,7 @@ func TestUsersCacheSizeAndExpiration(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestUserCacheIsolation(t *testing.T) {
|
||||
dataprovider.InitializeWebDAVUserCache(10)
|
||||
username := "webdav_internal_cache_test"
|
||||
password := "dav_pwd"
|
||||
u := dataprovider.User{
|
||||
@@ -1307,31 +1320,27 @@ func TestUserCacheIsolation(t *testing.T) {
|
||||
cachedUser.User.FsConfig.S3Config.AccessSecret = kms.NewPlainSecret("test secret")
|
||||
err = cachedUser.User.FsConfig.S3Config.AccessSecret.Encrypt()
|
||||
assert.NoError(t, err)
|
||||
|
||||
dataprovider.CacheWebDAVUser(cachedUser, 10)
|
||||
result, ok := dataprovider.GetCachedWebDAVUser(username)
|
||||
dataprovider.CacheWebDAVUser(cachedUser)
|
||||
cachedUser, ok := dataprovider.GetCachedWebDAVUser(username)
|
||||
|
||||
if assert.True(t, ok) {
|
||||
cachedUser := result.(*dataprovider.CachedUser).User
|
||||
_, err = cachedUser.GetFilesystem("")
|
||||
_, err = cachedUser.User.GetFilesystem("")
|
||||
assert.NoError(t, err)
|
||||
// the filesystem is now cached
|
||||
}
|
||||
result, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
cachedUser, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
if assert.True(t, ok) {
|
||||
cachedUser := result.(*dataprovider.CachedUser).User
|
||||
assert.True(t, cachedUser.FsConfig.S3Config.AccessSecret.IsEncrypted())
|
||||
err = cachedUser.FsConfig.S3Config.AccessSecret.Decrypt()
|
||||
assert.True(t, cachedUser.User.FsConfig.S3Config.AccessSecret.IsEncrypted())
|
||||
err = cachedUser.User.FsConfig.S3Config.AccessSecret.Decrypt()
|
||||
assert.NoError(t, err)
|
||||
cachedUser.FsConfig.Provider = vfs.S3FilesystemProvider
|
||||
_, err = cachedUser.GetFilesystem("")
|
||||
cachedUser.User.FsConfig.Provider = vfs.S3FilesystemProvider
|
||||
_, err = cachedUser.User.GetFilesystem("")
|
||||
assert.Error(t, err, "we don't have to get the previously cached filesystem!")
|
||||
}
|
||||
result, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
cachedUser, ok = dataprovider.GetCachedWebDAVUser(username)
|
||||
if assert.True(t, ok) {
|
||||
cachedUser := result.(*dataprovider.CachedUser).User
|
||||
assert.Equal(t, vfs.LocalFilesystemProvider, cachedUser.FsConfig.Provider)
|
||||
assert.False(t, cachedUser.FsConfig.S3Config.AccessSecret.IsEncrypted())
|
||||
assert.Equal(t, vfs.LocalFilesystemProvider, cachedUser.User.FsConfig.Provider)
|
||||
assert.False(t, cachedUser.User.FsConfig.S3Config.AccessSecret.IsEncrypted())
|
||||
}
|
||||
|
||||
err = dataprovider.DeleteUser(username)
|
||||
|
||||
Reference in New Issue
Block a user