fspermission.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. package fspermission
  2. import (
  3. "errors"
  4. "fmt"
  5. "log"
  6. "os"
  7. "strconv"
  8. "imuslab.com/arozos/mod/filesystem"
  9. "imuslab.com/arozos/mod/filesystem/fsdef"
  10. )
  11. /*
  12. This module handle functions realted to local file system permission.
  13. Only enabling when the system is run with sudo mode
  14. */
  15. func GetFilePermissions(fsh *filesystem.FileSystemHandler, file string) (string, error) {
  16. fshAbs := fsh.FileSystemAbstraction
  17. fileStat, err := fshAbs.Stat(file)
  18. if err != nil {
  19. return "", err
  20. }
  21. permission := "0000"
  22. permission = fmt.Sprintf("%04o", fileStat.Mode().Perm())
  23. return permission, nil
  24. }
  25. func SetFilePermisson(fsh *filesystem.FileSystemHandler, file string, permissionKey string) error {
  26. fshAbs := fsh.FileSystemAbstraction
  27. if fshAbs.FileExists(file) && filesystem.FileExists(file) {
  28. //This ensure this must be a local file on the system
  29. mode := os.FileMode(0644)
  30. if len(permissionKey) != 4 {
  31. return errors.New("Invalid File Node")
  32. }
  33. finalMode := 0
  34. for i := 0; i < len(permissionKey); i++ {
  35. thisInt, err := strconv.Atoi(string(permissionKey[i]))
  36. if err != nil {
  37. return errors.New("Failed to parse permission key")
  38. }
  39. if i == 0 {
  40. if thisInt != 0 {
  41. return errors.New("Failed to parse permission key")
  42. }
  43. } else if i == 1 {
  44. if thisInt > 7 {
  45. return errors.New("Failed to parse permission key: Permission value > 7")
  46. } else {
  47. finalMode = finalMode + thisInt*100
  48. }
  49. } else if i == 2 {
  50. if thisInt > 7 {
  51. return errors.New("Failed to parse permission key: Permission value > 7")
  52. } else {
  53. finalMode = finalMode + thisInt*10
  54. }
  55. } else if i == 3 {
  56. if thisInt > 7 {
  57. return errors.New("Failed to parse permission key: Permission value > 7")
  58. } else {
  59. finalMode = finalMode + thisInt
  60. }
  61. }
  62. }
  63. //Convert the value into a file mode
  64. log.Println("Updating " + file + " permission to " + strconv.Itoa(finalMode))
  65. //Magic way to convert dec to oct
  66. output, _ := strconv.ParseInt("0"+strconv.Itoa(finalMode), 8, 64)
  67. mode = os.FileMode(output)
  68. //Set its mode
  69. err := os.Chmod(file, mode)
  70. if err != nil {
  71. return err
  72. }
  73. } else {
  74. return fsdef.ErrOperationNotSupported
  75. }
  76. return nil
  77. }