mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-15 14:56:42 +00:00
GODT-980: placeholder for user agent
This commit is contained in:
51
internal/config/useragent/platform.go
Normal file
51
internal/config/useragent/platform.go
Normal file
@ -0,0 +1,51 @@
|
||||
// Copyright (c) 2021 Proton Technologies AG
|
||||
//
|
||||
// This file is part of ProtonMail Bridge.
|
||||
//
|
||||
// ProtonMail Bridge is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ProtonMail Bridge is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with ProtonMail Bridge. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package useragent
|
||||
|
||||
import (
|
||||
"os/exec"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
||||
"github.com/Masterminds/semver/v3"
|
||||
)
|
||||
|
||||
// IsCatalinaOrNewer checks whether host is MacOS Catalina 10.15.x or higher.
|
||||
func IsCatalinaOrNewer() bool {
|
||||
if runtime.GOOS != "darwin" {
|
||||
return false
|
||||
}
|
||||
|
||||
rawVersion, err := exec.Command("sw_vers", "-productVersion").Output()
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
return isVersionCatalinaOrNewer(strings.TrimSpace(string(rawVersion)))
|
||||
}
|
||||
|
||||
func isVersionCatalinaOrNewer(rawVersion string) bool {
|
||||
semVersion, err := semver.NewVersion(rawVersion)
|
||||
if err != nil {
|
||||
return false
|
||||
}
|
||||
|
||||
minVersion := semver.MustParse("10.15.0")
|
||||
|
||||
return semVersion.GreaterThan(minVersion) || semVersion.Equal(minVersion)
|
||||
}
|
||||
44
internal/config/useragent/platform_test.go
Normal file
44
internal/config/useragent/platform_test.go
Normal file
@ -0,0 +1,44 @@
|
||||
// Copyright (c) 2021 Proton Technologies AG
|
||||
//
|
||||
// This file is part of ProtonMail Bridge.
|
||||
//
|
||||
// ProtonMail Bridge is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ProtonMail Bridge is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with ProtonMail Bridge. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package useragent
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestIsVersionCatalinaOrNewer(t *testing.T) {
|
||||
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,
|
||||
{"11.1"}: true,
|
||||
}
|
||||
|
||||
for args, exp := range testData {
|
||||
got := isVersionCatalinaOrNewer(args.version)
|
||||
assert.Equal(t, exp, got, "version %v", args.version)
|
||||
}
|
||||
}
|
||||
59
internal/config/useragent/useragent.go
Normal file
59
internal/config/useragent/useragent.go
Normal file
@ -0,0 +1,59 @@
|
||||
// Copyright (c) 2021 Proton Technologies AG
|
||||
//
|
||||
// This file is part of ProtonMail Bridge.
|
||||
//
|
||||
// ProtonMail Bridge is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ProtonMail Bridge is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with ProtonMail Bridge. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package useragent
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"regexp"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
type UserAgent struct {
|
||||
client, platform string
|
||||
}
|
||||
|
||||
func New() *UserAgent {
|
||||
return &UserAgent{
|
||||
client: "",
|
||||
platform: runtime.GOOS,
|
||||
}
|
||||
}
|
||||
|
||||
func (ua *UserAgent) SetClient(name, version string) {
|
||||
ua.client = fmt.Sprintf("%v/%v", name, regexp.MustCompile(`(.*) \((.*)\)`).ReplaceAllString(version, "$1-$2"))
|
||||
}
|
||||
|
||||
func (ua *UserAgent) HasClient() bool {
|
||||
return ua.client != ""
|
||||
}
|
||||
|
||||
func (ua *UserAgent) SetPlatform(platform string) {
|
||||
ua.platform = platform
|
||||
}
|
||||
|
||||
func (ua *UserAgent) String() string {
|
||||
var client string
|
||||
|
||||
if ua.client != "" {
|
||||
client = ua.client
|
||||
} else {
|
||||
client = "NoClient/0.0.1"
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%v (%v)", client, ua.platform)
|
||||
}
|
||||
86
internal/config/useragent/useragent_test.go
Normal file
86
internal/config/useragent/useragent_test.go
Normal file
@ -0,0 +1,86 @@
|
||||
// Copyright (c) 2021 Proton Technologies AG
|
||||
//
|
||||
// This file is part of ProtonMail Bridge.
|
||||
//
|
||||
// ProtonMail Bridge is free software: you can redistribute it and/or modify
|
||||
// it under the terms of the GNU General Public License as published by
|
||||
// the Free Software Foundation, either version 3 of the License, or
|
||||
// (at your option) any later version.
|
||||
//
|
||||
// ProtonMail Bridge is distributed in the hope that it will be useful,
|
||||
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
// GNU General Public License for more details.
|
||||
//
|
||||
// You should have received a copy of the GNU General Public License
|
||||
// along with ProtonMail Bridge. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
package useragent
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestUserAgent(t *testing.T) {
|
||||
tests := []struct {
|
||||
name, version, platform string
|
||||
want string
|
||||
}{
|
||||
// No name/version, no platform.
|
||||
{
|
||||
want: fmt.Sprintf("NoClient/0.0.1 (%v)", runtime.GOOS),
|
||||
},
|
||||
|
||||
// No name/version, with platform.
|
||||
{
|
||||
platform: "macOS 10.15",
|
||||
want: "NoClient/0.0.1 (macOS 10.15)",
|
||||
},
|
||||
|
||||
// With name/version, with platform.
|
||||
{
|
||||
name: "Mac OS X Mail",
|
||||
version: "1.0.0",
|
||||
platform: "macOS 10.15",
|
||||
want: "Mac OS X Mail/1.0.0 (macOS 10.15)",
|
||||
},
|
||||
|
||||
// With name/version, with platform.
|
||||
{
|
||||
name: "Mac OS X Mail",
|
||||
version: "13.4 (3608.120.23.2.4)",
|
||||
platform: "macOS 10.15",
|
||||
want: "Mac OS X Mail/13.4-3608.120.23.2.4 (macOS 10.15)",
|
||||
},
|
||||
|
||||
// With name/version, with platform.
|
||||
{
|
||||
name: "Thunderbird",
|
||||
version: "78.6.1",
|
||||
platform: "Windows 10 (10.0)",
|
||||
want: "Thunderbird/78.6.1 (Windows 10 (10.0))",
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
test := test
|
||||
|
||||
t.Run(test.want, func(t *testing.T) {
|
||||
ua := New()
|
||||
|
||||
if test.name != "" && test.version != "" {
|
||||
ua.SetClient(test.name, test.version)
|
||||
}
|
||||
|
||||
if test.platform != "" {
|
||||
ua.SetPlatform(test.platform)
|
||||
}
|
||||
|
||||
assert.Equal(t, test.want, ua.String())
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user