quota.go 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. package user
  2. import (
  3. //"path/filepath"
  4. //"log"
  5. fs "imuslab.com/arozos/mod/filesystem"
  6. )
  7. /*
  8. Quota Handler
  9. author: tobychui
  10. This module handle the user storage quota and its related functions
  11. */
  12. //Return the user quota information, returning used / total
  13. func (u *User) HaveSpaceFor(fsh *fs.FileSystemHandler, vpath string) bool {
  14. realpath, err := fsh.FileSystemAbstraction.VirtualPathToRealPath(vpath, u.Username)
  15. if err != nil {
  16. return false
  17. }
  18. if u.StorageQuota.HaveSpace(fsh.FileSystemAbstraction.GetFileSize(realpath)) {
  19. return true
  20. } else {
  21. return false
  22. }
  23. }
  24. func (u *User) SetOwnerOfFile(fsh *fs.FileSystemHandler, vpath string) error {
  25. rpath, err := fsh.FileSystemAbstraction.VirtualPathToRealPath(vpath, u.Username)
  26. if err != nil {
  27. return err
  28. }
  29. //Check if it is user structured. If yes, add the filesize to user's quota
  30. if fsh.Hierarchy == "user" {
  31. //log.Println("Setting user ownership on: " + realpath)
  32. u.StorageQuota.AllocateSpace(fsh.FileSystemAbstraction.GetFileSize(rpath))
  33. }
  34. //Add to the fshandler database of this file owner
  35. err = fsh.CreateFileRecord(rpath, u.Username)
  36. return err
  37. }
  38. func (u *User) RemoveOwnershipFromFile(fsh *fs.FileSystemHandler, vpath string) error {
  39. realpath, err := fsh.FileSystemAbstraction.VirtualPathToRealPath(vpath, u.Username)
  40. if err != nil {
  41. return err
  42. }
  43. //Check if it is user structured. If yes, add the filesize to user's quota
  44. if fsh.Hierarchy == "user" {
  45. //log.Println("Removing user ownership on: " + realpath)
  46. u.StorageQuota.ReclaimSpace(fsh.FileSystemAbstraction.GetFileSize(realpath))
  47. }
  48. err = fsh.DeleteFileRecord(realpath)
  49. return err
  50. }
  51. func (u *User) IsOwnerOfFile(fsh *fs.FileSystemHandler, vpath string) bool {
  52. owner := u.GetFileOwner(fsh, vpath)
  53. if owner == u.Username {
  54. //This file is owned by this user
  55. return true
  56. } else {
  57. return false
  58. }
  59. }
  60. func (u *User) GetFileOwner(fsh *fs.FileSystemHandler, vpath string) string {
  61. realpath, err := fsh.FileSystemAbstraction.VirtualPathToRealPath(vpath, u.Username)
  62. if err != nil {
  63. return ""
  64. }
  65. if fsh.UUID == "user" {
  66. //This file is inside user's root. It must be this user's file
  67. return u.Username
  68. }
  69. owner, err := fsh.GetFileRecord(realpath)
  70. if err != nil {
  71. //Error occured. Either this file is not tracked or this file has no owner
  72. return ""
  73. }
  74. return owner
  75. }