diff --git a/changelog/unreleased/quota-stubs.md b/changelog/unreleased/quota-stubs.md new file mode 100644 index 0000000000..cc122f0354 --- /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 c525af5021..0bd4c2c28c 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 := user.ContextGetUser(ctx) if !ok { diff --git a/pkg/storage/fs/owncloud/owncloud_unix.go b/pkg/storage/fs/owncloud/owncloud_unix.go index 52e0088836..11c82f1f6c 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 29b93dc72c..b925d6a3ee 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 067bc7d92b..e534d9a407 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 := user.ContextGetUser(ctx) if !ok { diff --git a/pkg/storage/fs/owncloudsql/owncloudsql_unix.go b/pkg/storage/fs/owncloudsql/owncloudsql_unix.go index 440e2c98ff..9e5c1ad9ff 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 847de9a0f0..dc4dd873d5 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 +}