From bd2849183c3d3c69129b9b4190d0cddb8620ec62 Mon Sep 17 00:00:00 2001 From: "John K. Luebs" Date: Fri, 29 Sep 2023 21:48:47 -0500 Subject: [PATCH] Fix exclude_by_attribute feature on POSIX The exclude by attribute function is broken on non-Darwin POSIX: linux and freebsd. This is because those xattrs must be prefixed by a legal namespace. The old xattr library implicitly appended the user namespace to the xattr, but the current official go pkg does not (which is just as well). Also fix the test to remove the discordant old xattr dependency and provide test cases for both darwin and non-darwin POSIX. --- go.mod | 1 - go.sum | 2 -- src/duplicacy_entry_test.go | 27 ++++++++++++------- src/duplicacy_utils_darwin.go | 4 +-- src/duplicacy_utils_freebsd.go | 13 --------- ...tils_linux.go => duplicacy_utils_posix.go} | 6 +++-- src/duplicacy_utils_windows.go | 2 +- 7 files changed, 25 insertions(+), 30 deletions(-) delete mode 100644 src/duplicacy_utils_freebsd.go rename src/{duplicacy_utils_linux.go => duplicacy_utils_posix.go} (60%) diff --git a/go.mod b/go.mod index a03c2bf..b30772a 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,6 @@ require ( github.com/gilbertchen/gopass v0.0.0-20170109162249-bf9dde6d0d2c github.com/gilbertchen/highwayhash v0.0.0-20221109044721-eeab1f4799d8 github.com/gilbertchen/keyring v0.0.0-20221004152639-1661cbebc508 - github.com/gilbertchen/xattr v0.0.0-20160926155429-68e7a6806b01 github.com/hirochachacha/go-smb2 v1.1.0 github.com/klauspost/compress v1.16.3 github.com/klauspost/reedsolomon v1.9.9 diff --git a/go.sum b/go.sum index 6ec8e48..acc7b69 100644 --- a/go.sum +++ b/go.sum @@ -47,8 +47,6 @@ github.com/gilbertchen/highwayhash v0.0.0-20221109044721-eeab1f4799d8 h1:ijgl4Y+ github.com/gilbertchen/highwayhash v0.0.0-20221109044721-eeab1f4799d8/go.mod h1:0lQcVva56+L1PuUFXLOsJ6arJQaU0baIH8q+IegeBhg= github.com/gilbertchen/keyring v0.0.0-20221004152639-1661cbebc508 h1:SqTyk5KkNXp7zTdTttIZSDcTrL5uau4K/2OpKvgBZVI= github.com/gilbertchen/keyring v0.0.0-20221004152639-1661cbebc508/go.mod h1:w/pisxUZezf2XzU9Ewjphcf6q1mZtOzKPHhJiuc8cag= -github.com/gilbertchen/xattr v0.0.0-20160926155429-68e7a6806b01 h1:LqwS9qL6SrDkp0g0iwUkETrDdtB9gTKaIbSn9imUq5o= -github.com/gilbertchen/xattr v0.0.0-20160926155429-68e7a6806b01/go.mod h1:TMlibuxKfkdtHyltooAw7+DHqRpaXs9nxaffk00Sh1Q= github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/goamz/goamz v0.0.0-20180131231218-8b901b531db8 h1:G1U0vew/vA/1/hBmf1XNeyIzJJbPFVv+kb+HPl6rj6c= diff --git a/src/duplicacy_entry_test.go b/src/duplicacy_entry_test.go index 670a16b..0326734 100644 --- a/src/duplicacy_entry_test.go +++ b/src/duplicacy_entry_test.go @@ -5,6 +5,8 @@ package duplicacy import ( + "bytes" + "encoding/json" "io/ioutil" "math/rand" "os" @@ -13,11 +15,10 @@ import ( "sort" "strings" "testing" - "bytes" - "encoding/json" - "github.com/gilbertchen/xattr" - "github.com/vmihailenco/msgpack" + "github.com/pkg/xattr" + + "github.com/vmihailenco/msgpack" ) func TestEntrySort(t *testing.T) { @@ -175,7 +176,7 @@ func TestEntryOrder(t *testing.T) { directories = append(directories, CreateEntry("", 0, 0, 0)) entries := make([]*Entry, 0, 4) - entryChannel := make(chan *Entry, 1024) + entryChannel := make(chan *Entry, 1024) entries = append(entries, CreateEntry("", 0, 0, 0)) for len(directories) > 0 { @@ -233,8 +234,16 @@ func TestEntryOrder(t *testing.T) { // TestEntryExcludeByAttribute tests the excludeByAttribute parameter to the ListEntries function func TestEntryExcludeByAttribute(t *testing.T) { - if !(runtime.GOOS == "darwin" || runtime.GOOS == "linux") { - t.Skip("skipping test not darwin or linux") + var excludeAttrName string + var excludeAttrValue []byte + + if runtime.GOOS == "darwin" { + excludeAttrName = "com.apple.metadata:com_apple_backup_excludeItem" + excludeAttrValue = []byte("com.apple.backupd") + } else if runtime.GOOS == "linux" || runtime.GOOS == "freebsd" || runtime.GOOS == "netbsd" || runtime.GOOS == "solaris" { + excludeAttrName = "user.duplicacy_exclude" + } else { + t.Skip("skipping test, not darwin, linux, freebsd, netbsd, or solaris") } testDir := filepath.Join(os.TempDir(), "duplicacy_test") @@ -273,7 +282,7 @@ func TestEntryExcludeByAttribute(t *testing.T) { for _, file := range DATA { fullPath := filepath.Join(testDir, file) if strings.Contains(file, "exclude") { - xattr.Setxattr(fullPath, "com.apple.metadata:com_apple_backup_excludeItem", []byte("com.apple.backupd")) + xattr.Set(fullPath, excludeAttrName, excludeAttrValue) } } @@ -372,4 +381,4 @@ func TestEntryEncoding(t *testing.T) { t.Error("Decoded entry is different than the original one") } -} \ No newline at end of file +} diff --git a/src/duplicacy_utils_darwin.go b/src/duplicacy_utils_darwin.go index 38e2a51..6c69d55 100644 --- a/src/duplicacy_utils_darwin.go +++ b/src/duplicacy_utils_darwin.go @@ -8,7 +8,7 @@ import ( "strings" ) -func excludedByAttribute(attirbutes map[string][]byte) bool { - value, ok := attirbutes["com.apple.metadata:com_apple_backup_excludeItem"] +func excludedByAttribute(attributes map[string][]byte) bool { + value, ok := attributes["com.apple.metadata:com_apple_backup_excludeItem"] return ok && strings.Contains(string(value), "com.apple.backupd") } diff --git a/src/duplicacy_utils_freebsd.go b/src/duplicacy_utils_freebsd.go deleted file mode 100644 index a129284..0000000 --- a/src/duplicacy_utils_freebsd.go +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Acrosync LLC. All rights reserved. -// Free for personal use and commercial trial -// Commercial use requires per-user licenses available from https://duplicacy.com - -package duplicacy - -import ( -) - -func excludedByAttribute(attirbutes map[string][]byte) bool { - _, ok := attirbutes["duplicacy_exclude"] - return ok -} \ No newline at end of file diff --git a/src/duplicacy_utils_linux.go b/src/duplicacy_utils_posix.go similarity index 60% rename from src/duplicacy_utils_linux.go rename to src/duplicacy_utils_posix.go index 223f32c..20bf9fe 100644 --- a/src/duplicacy_utils_linux.go +++ b/src/duplicacy_utils_posix.go @@ -2,12 +2,14 @@ // Free for personal use and commercial trial // Commercial use requires per-user licenses available from https://duplicacy.com +// +build freebsd netbsd linux solaris + package duplicacy import ( ) -func excludedByAttribute(attirbutes map[string][]byte) bool { - _, ok := attirbutes["duplicacy_exclude"] +func excludedByAttribute(attributes map[string][]byte) bool { + _, ok := attributes["user.duplicacy_exclude"] return ok } diff --git a/src/duplicacy_utils_windows.go b/src/duplicacy_utils_windows.go index 3a01682..5a4d8d1 100644 --- a/src/duplicacy_utils_windows.go +++ b/src/duplicacy_utils_windows.go @@ -132,6 +132,6 @@ func SplitDir(fullPath string) (dir string, file string) { return fullPath[:i+1], fullPath[i+1:] } -func excludedByAttribute(attirbutes map[string][]byte) bool { +func excludedByAttribute(attributes map[string][]byte) bool { return false }