From ec4099da830e7adad86e37a56b33b07835c91559 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rn=20Friedrich=20Dreyer?= Date: Wed, 11 Aug 2021 16:29:01 +0200 Subject: [PATCH] Quota stubs (#1985) --- changelog/unreleased/quota-stubs.md | 5 +++++ pkg/storage/fs/owncloud/owncloud.go | 4 ---- pkg/storage/fs/owncloud/owncloud_unix.go | 14 ++++++++++++++ pkg/storage/fs/owncloud/owncloud_windows.go | 19 +++++++++++++++++++ pkg/storage/fs/owncloudsql/owncloudsql.go | 4 ---- .../fs/owncloudsql/owncloudsql_unix.go | 14 ++++++++++++++ .../fs/owncloudsql/owncloudsql_windows.go | 19 +++++++++++++++++++ 7 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 changelog/unreleased/quota-stubs.md diff --git a/changelog/unreleased/quota-stubs.md b/changelog/unreleased/quota-stubs.md new file mode 100644 index 00000000000..cc122f0354f --- /dev/null +++ b/changelog/unreleased/quota-stubs.md @@ -0,0 +1,5 @@ +Bugfix: Add quota stubs + +The `owncloud` and `owncloudsql` drivers now read the available quota from disk to no longer always return 0, which causes the web UI to disable uploads. + +https://github.com/cs3org/reva/pull/1985 \ No newline at end of file diff --git a/pkg/storage/fs/owncloud/owncloud.go b/pkg/storage/fs/owncloud/owncloud.go index d7cebff38b8..471da92e07a 100644 --- a/pkg/storage/fs/owncloud/owncloud.go +++ b/pkg/storage/fs/owncloud/owncloud.go @@ -1119,10 +1119,6 @@ func (fs *ocfs) UpdateGrant(ctx context.Context, ref *provider.Reference, g *pro return fs.propagate(ctx, ip) } -func (fs *ocfs) GetQuota(ctx context.Context) (uint64, uint64, error) { - return 0, 0, nil -} - func (fs *ocfs) CreateHome(ctx context.Context) error { u, ok := ctxpkg.ContextGetUser(ctx) if !ok { diff --git a/pkg/storage/fs/owncloud/owncloud_unix.go b/pkg/storage/fs/owncloud/owncloud_unix.go index 52e0088836e..11c82f1f6cb 100755 --- a/pkg/storage/fs/owncloud/owncloud_unix.go +++ b/pkg/storage/fs/owncloud/owncloud_unix.go @@ -66,3 +66,17 @@ func calcEtag(ctx context.Context, fi os.FileInfo) string { etag := fmt.Sprintf(`"%x"`, h.Sum(nil)) return fmt.Sprintf("\"%s\"", strings.Trim(etag, "\"")) } + +func (fs *ocfs) GetQuota(ctx context.Context) (uint64, uint64, error) { + // TODO quota of which storage space? + // we could use the logged in user, but when a user has access to multiple storages this falls short + // for now return quota of root + stat := syscall.Statfs_t{} + err := syscall.Statfs(fs.toInternalPath(ctx, "/"), &stat) + if err != nil { + return 0, 0, err + } + total := stat.Blocks * uint64(stat.Bsize) // Total data blocks in filesystem + used := (stat.Blocks - stat.Bavail) * uint64(stat.Bsize) // Free blocks available to unprivileged user + return total, used, nil +} diff --git a/pkg/storage/fs/owncloud/owncloud_windows.go b/pkg/storage/fs/owncloud/owncloud_windows.go index 29b93dc72c6..b925d6a3ee4 100644 --- a/pkg/storage/fs/owncloud/owncloud_windows.go +++ b/pkg/storage/fs/owncloud/owncloud_windows.go @@ -52,3 +52,22 @@ func calcEtag(ctx context.Context, fi os.FileInfo) string { etag := fmt.Sprintf(`"%x"`, h.Sum(nil)) return fmt.Sprintf("\"%s\"", strings.Trim(etag, "\"")) } + +func (fs *ocfs) GetQuota(ctx context.Context) (uint64, uint64, error) { + // TODO quota of which storage space? + // we could use the logged in user, but when a user has access to multiple storages this falls short + // for now return quota of root + var free, total, avail uint64 + + pathPtr, err := windows.UTF16PtrFromString(fs.toInternalPath(ctx, "/")) + if err != nil { + return 0, 0, err + } + err = windows.GetDiskFreeSpaceEx(pathPtr, &avail, &total, &free) + if err != nil { + return 0, 0, err + } + + used := total - free + return total, used, nil +} diff --git a/pkg/storage/fs/owncloudsql/owncloudsql.go b/pkg/storage/fs/owncloudsql/owncloudsql.go index 7c552bb3a0c..a33297d2bdd 100644 --- a/pkg/storage/fs/owncloudsql/owncloudsql.go +++ b/pkg/storage/fs/owncloudsql/owncloudsql.go @@ -647,10 +647,6 @@ func (fs *owncloudsqlfs) UpdateGrant(ctx context.Context, ref *provider.Referenc return nil // nop } -func (fs *owncloudsqlfs) GetQuota(ctx context.Context) (uint64, uint64, error) { - return 0, 0, nil -} - func (fs *owncloudsqlfs) CreateHome(ctx context.Context) error { u, ok := ctxpkg.ContextGetUser(ctx) if !ok { diff --git a/pkg/storage/fs/owncloudsql/owncloudsql_unix.go b/pkg/storage/fs/owncloudsql/owncloudsql_unix.go index 440e2c98ffc..9e5c1ad9ff9 100755 --- a/pkg/storage/fs/owncloudsql/owncloudsql_unix.go +++ b/pkg/storage/fs/owncloudsql/owncloudsql_unix.go @@ -66,3 +66,17 @@ func calcEtag(ctx context.Context, fi os.FileInfo) string { etag := fmt.Sprintf("%x", h.Sum(nil)) return strings.Trim(etag, "\"") } + +func (fs *owncloudsqlfs) GetQuota(ctx context.Context) (uint64, uint64, error) { + // TODO quota of which storage space? + // we could use the logged in user, but when a user has access to multiple storages this falls short + // for now return quota of root + stat := syscall.Statfs_t{} + err := syscall.Statfs(fs.toInternalPath(ctx, "/"), &stat) + if err != nil { + return 0, 0, err + } + total := stat.Blocks * uint64(stat.Bsize) // Total data blocks in filesystem + used := (stat.Blocks - stat.Bavail) * uint64(stat.Bsize) // Free blocks available to unprivileged user + return total, used, nil +} diff --git a/pkg/storage/fs/owncloudsql/owncloudsql_windows.go b/pkg/storage/fs/owncloudsql/owncloudsql_windows.go index 847de9a0f0e..dc4dd873d50 100644 --- a/pkg/storage/fs/owncloudsql/owncloudsql_windows.go +++ b/pkg/storage/fs/owncloudsql/owncloudsql_windows.go @@ -52,3 +52,22 @@ func calcEtag(ctx context.Context, fi os.FileInfo) string { etag := fmt.Sprintf(`"%x"`, h.Sum(nil)) return fmt.Sprintf("\"%s\"", strings.Trim(etag, "\"")) } + +func (fs *owncloudsqlfs) GetQuota(ctx context.Context) (uint64, uint64, error) { + // TODO quota of which storage space? + // we could use the logged in user, but when a user has access to multiple storages this falls short + // for now return quota of root + var free, total, avail uint64 + + pathPtr, err := windows.UTF16PtrFromString(fs.toInternalPath(ctx, "/")) + if err != nil { + return 0, 0, err + } + err = windows.GetDiskFreeSpaceEx(pathPtr, &avail, &total, &free) + if err != nil { + return 0, 0, err + } + + used := total - free + return total, used, nil +}