msg_file_xattr.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. package smb
  2. import (
  3. "strings"
  4. "github.com/kormoc/xattr"
  5. )
  6. // https://developer.apple.com/documentation/coreservices/file_metadata/mditem/common_metadata_attribute_keys
  7. type XATTR_Key string
  8. const (
  9. /** Extended Attributes Constants **/
  10. // XATTR_MAX_EMBEDDED_SIZE XATTR_Key = 3804 // = 3 Ki + 732
  11. // XATTR_APFS_COW_EXEMPT_COUNT_NAME XATTR_Key = "com.apple.fs.cow-exempt-file-count"
  12. // XATTR_DB_REBUILD_IN_PROGRESS_EA_NAME XATTR_Key = "com.apple.assetsd.dbRebuildInProgress"
  13. // XATTR_DB_REBUILD_UUID_EA_NAME XATTR_Key = "com.apple.assetsd.dbRebuildUuid"
  14. // XATTR_THUMBNAIL_CAMERA_PREVIEW_IMAGE_ASSETID_EA_NAME XATTR_Key= "com.apple.assetsd.thumbnailCameraPreviewImageAssetID"
  15. // XATTR_UUID_EA_NAME XATTR_Key= "com.apple.assetsd.UUID"
  16. // XATTR_DECMPFS_EA_NAME XATTR_Key = "com.apple.decmpfs"
  17. XATTR_FINDER_INFO_EA_NAME XATTR_Key = "com.apple.FinderInfo"
  18. // XATTR_SYMLINK_EA_NAME XATTR_Key = "com.apple.fs.symlink"
  19. // XATTR_FIRMLINK_EA_NAME XATTR_Key = "com.apple.fs.firmlink"
  20. // XATTR_INFO_EA_NAME XATTR_Key = "com.apple.genstore.info"
  21. // XATTR_ORIG_DISPLAY_NAME_EA_NAME XATTR_Key = "com.apple.genstore.origdisplayname"
  22. // XATTR_ORIG_PERMS_V1_EA_NAME XATTR_Key = "com.apple.genstore.orig_perms_v1"
  23. // XATTR_ORIG_POSIX_NAME_EA_NAME XATTR_Key = "com.apple.genstore.origposixname"
  24. // XATTR_SHA1_EA_NAME XATTR_Key = "com.apple.GeoServices.SHA1"
  25. // XATTR_INSTALL_TYPE_EA_NAME XATTR_Key = "com.apple.installd.installType"
  26. // XATTR_UNIQUE_INSTALLID_EA_NAME XATTR_Key = "com.apple.installd.uniqueInstallID"
  27. XATTR_PS_EA_NAME XATTR_Key = "com.apple.lastuseddate#PS"
  28. XATTR_KMD_ITEM_USER_TAGS_EA_NAME XATTR_Key = "com.apple.metadata:_kMDItemUserTags"
  29. // XATTR_COM_APPLE_BACKUP_EXCLUDEITEM_EA_NAME XATTR_Key = "com.apple.metadata:com_apple_backup_excludeItem"
  30. // XATTR_KMD_ITEM_DOWNLOADED_DATE_EA_NAME XATTR_Key = "com.apple.metadata:kMDItemDownloadedDate"
  31. // XATTR_KMD_ITEM_WHERE_FROMS_EA_NAME XATTR_Key = "com.apple.metadata:kMDItemWhereFroms"
  32. // XATTR_KMD_LABEL_EA_NAME XATTR_Key = "com.apple.metadata:kMDLabel_fwlfb7nbt2o7degof3q2o2btjy"
  33. // XATTR_QUARANTINE_EA_NAME XATTR_Key = "com.apple.quarantine"
  34. // XATTR_RESOURCEFORK_EA_NAME XATTR_Key = "com.apple.ResourceFork"
  35. // XATTR_ROOTLESS_EA_NAME XATTR_Key = "com.apple.rootless"
  36. // XATTR_SECURITY_EA_NAME XATTR_Key = "com.apple.system.Security"
  37. // XATTR_TEXT_ENCODING_EA_NAME XATTR_Key = "com.apple.TextEncoding"
  38. // XATTR_LAST_UPGRADE_CHECK_EA_NAME XATTR_Key = "LastUpgradeCheck"
  39. // XATTR_LOCK_EA_NAME XATTR_Key = "lock"
  40. // XATTR_CRASHPAD_DB_INITIALIZED_EA_NAME XATTR_Key = "org.chromium.crashpad.database.initialized"
  41. )
  42. func IsXAttr(name string) (bool, string, string) {
  43. index := strings.Index(name, ":")
  44. if index >= 0 {
  45. path := name[:index]
  46. xatrr := name[index:]
  47. if strings.Contains(xatrr, ":com.apple.") {
  48. return true, path, xatrr[1:]
  49. }
  50. }
  51. return false, "", ""
  52. }
  53. func XAttrSet(name string, key string, value []byte) error {
  54. err := xattr.SetBytes(name, key, value)
  55. return err
  56. }
  57. func XAttrGet(name string, key string) (value []byte, err error) {
  58. value, err = xattr.GetBytes(name, key)
  59. return
  60. }
  61. func XAttrDel(name string, key string) (err error) {
  62. err = xattr.Remove(name, key)
  63. return
  64. }
  65. func XAttrClear(name string) (err error) {
  66. keys, err := XAttrGetKeys(name)
  67. if err != nil {
  68. return
  69. }
  70. for _, key := range keys {
  71. err = xattr.Remove(name, key)
  72. if err != nil {
  73. return
  74. }
  75. }
  76. return nil
  77. }
  78. func XAttrGetKeys(name string) (keys []string, err error) {
  79. defer func() {
  80. if cerr := recover(); cerr != nil {
  81. err = nil
  82. }
  83. }()
  84. keysBuf, err := xattr.ListBytes(name)
  85. if err != nil {
  86. return nil, err
  87. }
  88. keys = strings.Split(string(keysBuf), "\x00")
  89. if len(keys[len(keys)-1]) == 0 {
  90. keys = keys[:len(keys)-1]
  91. }
  92. return
  93. }