diff --git a/Changelog.md b/Changelog.md index fcaa4a54..808cc7ed 100644 --- a/Changelog.md +++ b/Changelog.md @@ -22,6 +22,7 @@ Changelog [format](http://keepachangelog.com/en/1.0.0/) * GODT-698 Use correct package type for signed PGP/Inline messages. * Generic bug report window title. * Fix missing check for unencrypted recipients during sending. +* Version checking for catalina. ## [IE 1.0.x] Congo (v1.0.0 live 2020-09-08) diff --git a/go.mod b/go.mod index 742e94e8..21e113b8 100644 --- a/go.mod +++ b/go.mod @@ -13,6 +13,7 @@ require ( require ( github.com/0xAX/notificator v0.0.0-20191016112426-3962a5ea8da1 + github.com/Masterminds/semver/v3 v3.1.0 github.com/ProtonMail/go-appdir v1.1.0 github.com/ProtonMail/go-apple-mobileconfig v0.0.0-20160701194735-7ea9927a11f6 github.com/ProtonMail/go-autostart v0.0.0-20181114175602-c5272053443a diff --git a/go.sum b/go.sum index bd7b3d25..8d659fce 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,9 @@ github.com/0xAX/notificator v0.0.0-20191016112426-3962a5ea8da1 h1:j9HaafapDbPbGRDku6e/HRs6KBMcKHiWcm1/9Sbxnl4= github.com/0xAX/notificator v0.0.0-20191016112426-3962a5ea8da1/go.mod h1:NtXa9WwQsukMHZpjNakTTz0LArxvGYdPA9CjIcUSZ6s= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= +github.com/Masterminds/semver/v3 v3.1.0 h1:Y2lUDsFKVRSYGojLJ1yLxSXdMmMYTYls0rCvoqmMUQk= +github.com/Masterminds/semver/v3 v3.1.0/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/ProtonMail/bcrypt v0.0.0-20170924085257-7509ea014998 h1:YT2uVwQiRQZxCaaahwfcgTq2j3j66w00n/27gb/zubs= github.com/ProtonMail/bcrypt v0.0.0-20170924085257-7509ea014998/go.mod h1:HecWFHognK8GfRDGnFQbW/LiV7A3MX3gZVs45vk5h8I= github.com/ProtonMail/crypto v0.0.0-20200416114516-1fa7f403fb9c h1:DAvlgde2Stu18slmjwikiMPs/CKPV35wSvmJS34z0FU= diff --git a/pkg/useragent/useragent.go b/pkg/useragent/useragent.go index 95dc8490..5052e953 100644 --- a/pkg/useragent/useragent.go +++ b/pkg/useragent/useragent.go @@ -18,40 +18,35 @@ package useragent import ( - "fmt" "os/exec" "runtime" + + "github.com/Masterminds/semver/v3" ) -// IsCatalinaOrNewer checks that host is MacOS Catalina 10.14.xx or higher. +// IsCatalinaOrNewer checks that host is MacOS Catalina 10.15.x or higher. func IsCatalinaOrNewer() bool { if runtime.GOOS != "darwin" { return false } - major, minor, _ := getMacVersion() - return isVersionCatalinaOrNewer(major, minor) + return isVersionCatalinaOrNewer(getMacVersion()) } -func getMacVersion() (major, minor, tiny int) { - major, minor, tiny = 10, 0, 0 +func getMacVersion() string { out, err := exec.Command("sw_vers", "-productVersion").Output() if err != nil { - return + return "" } - return parseMacVersion(string(out)) + + return string(out) } -func parseMacVersion(version string) (major, minor, tiny int) { - _, _ = fmt.Sscanf(version, "%d.%d.%d", &major, &minor, &tiny) - return -} +func isVersionCatalinaOrNewer(version string) bool { + v, err := semver.StrictNewVersion(version) + if err != nil { + return false + } -func isVersionCatalinaOrNewer(major, minor int) bool { - if major != 10 { - return false - } - if minor < 15 { - return false - } - return true + catalina := semver.MustParse("10.15.0") + return v.GreaterThan(catalina) || v.Equal(catalina) } diff --git a/pkg/useragent/useragent_test.go b/pkg/useragent/useragent_test.go index 17ef1965..e98fe86d 100644 --- a/pkg/useragent/useragent_test.go +++ b/pkg/useragent/useragent_test.go @@ -23,35 +23,21 @@ import ( "github.com/stretchr/testify/assert" ) -func TestGetMacVersion(t *testing.T) { - testData := map[string]struct{ major, minor, tiny int }{ - "10.14.4": {10, 14, 4}, - "10.14.4\r\n": {10, 14, 4}, - "10.14.0": {10, 14, 0}, - "10.14": {10, 14, 0}, - "10": {10, 0, 0}, - } - - for arg, exp := range testData { - gotMajor, gotMinor, gotTiny := parseMacVersion(arg) - assert.Equal(t, exp.major, gotMajor, "arg %q", arg) - assert.Equal(t, exp.minor, gotMinor, "arg %q", arg) - assert.Equal(t, exp.tiny, gotTiny, "arg %q", arg) - } -} - func TestIsVersionCatalinaOrNewer(t *testing.T) { - testData := map[struct{ major, minor int }]bool{ - {9, 0}: false, - {9, 15}: false, - {10, 13}: false, - {10, 14}: false, - {10, 15}: true, - {10, 16}: true, + testData := map[struct{ version string }]bool{ + {""}: false, + {"9.0.0"}: false, + {"9.15.0"}: false, + {"10.13.0"}: false, + {"10.14.0"}: false, + {"10.14.99"}: false, + {"10.15.0"}: true, + {"10.16.0"}: true, + {"11.0.0"}: true, } for args, exp := range testData { - got := isVersionCatalinaOrNewer(args.major, args.minor) - assert.Equal(t, exp, got, "version %q.%q", args.major, args.minor) + got := isVersionCatalinaOrNewer(args.version) + assert.Equal(t, exp, got, "version %v", args.version) } }