From 33e483e464ef1f02335090eed1e38fa043fc366b 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 a03c2bf2..b30772ad 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 6ec8e480..acc7b694 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 670a16b3..03267340 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 38e2a518..6c69d558 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 a1292840..00000000 --- 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 223f32c5..20bf9fe8 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 3a01682b..5a4d8d15 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 }