mirror of
https://github.com/ProtonMail/proton-bridge.git
synced 2025-12-13 06:06:44 +00:00
Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| f9ac05ea01 | |||
| e8e188a30f | |||
| 2a22410550 | |||
| 65cd7095f3 |
@ -38,6 +38,7 @@ stages:
|
|||||||
- cache
|
- cache
|
||||||
- test
|
- test
|
||||||
- build
|
- build
|
||||||
|
- check
|
||||||
- mirror
|
- mirror
|
||||||
|
|
||||||
# Stage: CACHE
|
# Stage: CACHE
|
||||||
@ -138,9 +139,6 @@ build-qml:
|
|||||||
script:
|
script:
|
||||||
- make build
|
- make build
|
||||||
- git diff && git diff-index --quiet HEAD
|
- git diff && git diff-index --quiet HEAD
|
||||||
- curl -L https://services.nvd.nist.gov/rest/json/cves/1.0/
|
|
||||||
- gobinsec -verbose -wait -config utils/gobinsec_conf.yml
|
|
||||||
cmd/Desktop-Bridge/deploy/linux/proton-bridge
|
|
||||||
artifacts:
|
artifacts:
|
||||||
# Note: The latest artifacts for refs are locked against deletion, and kept
|
# Note: The latest artifacts for refs are locked against deletion, and kept
|
||||||
# regardless of the expiry time. Introduced in GitLab 13.0 behind a
|
# regardless of the expiry time. Introduced in GitLab 13.0 behind a
|
||||||
@ -235,6 +233,26 @@ build-windows-qa:
|
|||||||
artifacts:
|
artifacts:
|
||||||
name: "bridge-windows-qa-$CI_COMMIT_SHORT_SHA"
|
name: "bridge-windows-qa-$CI_COMMIT_SHORT_SHA"
|
||||||
|
|
||||||
|
# Stage: CHECK
|
||||||
|
check-gobinsec:
|
||||||
|
stage: check
|
||||||
|
only:
|
||||||
|
- branches
|
||||||
|
cache:
|
||||||
|
key: gobinsec-cache
|
||||||
|
paths:
|
||||||
|
- gobinsec-cache.yml
|
||||||
|
policy: pull-push
|
||||||
|
before_script:
|
||||||
|
- mkdir build
|
||||||
|
- tar -xzf bridge_linux_*.tgz -C build
|
||||||
|
script:
|
||||||
|
- "[ ! -f ./gobinsec-cache.yml ] && wget bridgeteam.protontech.ch/bridgeteam/gobinsec-cache.yml"
|
||||||
|
- cat ./gobinsec-cache.yml
|
||||||
|
- gobinsec -cache -config utils/gobinsec_conf.yml build/proton-bridge
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Stage: MIRROR
|
# Stage: MIRROR
|
||||||
|
|
||||||
mirror-repo:
|
mirror-repo:
|
||||||
|
|||||||
10
Changelog.md
10
Changelog.md
@ -2,6 +2,16 @@
|
|||||||
|
|
||||||
Changelog [format](http://keepachangelog.com/en/1.0.0/)
|
Changelog [format](http://keepachangelog.com/en/1.0.0/)
|
||||||
|
|
||||||
|
## [Bridge 2.2.2] Millau
|
||||||
|
|
||||||
|
### Added
|
||||||
|
* Introduced gobinsec cache.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
* GODT-1743: Terminate running bridge if has old version.
|
||||||
|
* GODT-1743: Quit bridge when opening manual install.
|
||||||
|
|
||||||
|
|
||||||
## [Bridge 2.2.1] Millau
|
## [Bridge 2.2.1] Millau
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
2
Makefile
2
Makefile
@ -10,7 +10,7 @@ TARGET_OS?=${GOOS}
|
|||||||
.PHONY: build build-nogui build-launcher versioner hasher
|
.PHONY: build build-nogui build-launcher versioner hasher
|
||||||
|
|
||||||
# Keep version hardcoded so app build works also without Git repository.
|
# Keep version hardcoded so app build works also without Git repository.
|
||||||
BRIDGE_APP_VERSION?=2.2.1+git
|
BRIDGE_APP_VERSION?=2.2.2+git
|
||||||
APP_VERSION:=${BRIDGE_APP_VERSION}
|
APP_VERSION:=${BRIDGE_APP_VERSION}
|
||||||
SRC_ICO:=bridge.ico
|
SRC_ICO:=bridge.ico
|
||||||
SRC_ICNS:=Bridge.icns
|
SRC_ICNS:=Bridge.icns
|
||||||
|
|||||||
@ -57,7 +57,6 @@ import (
|
|||||||
"github.com/ProtonMail/proton-bridge/v2/pkg/keychain"
|
"github.com/ProtonMail/proton-bridge/v2/pkg/keychain"
|
||||||
"github.com/ProtonMail/proton-bridge/v2/pkg/listener"
|
"github.com/ProtonMail/proton-bridge/v2/pkg/listener"
|
||||||
"github.com/ProtonMail/proton-bridge/v2/pkg/pmapi"
|
"github.com/ProtonMail/proton-bridge/v2/pkg/pmapi"
|
||||||
"github.com/allan-simon/go-singleinstance"
|
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
"github.com/urfave/cli/v2"
|
"github.com/urfave/cli/v2"
|
||||||
)
|
)
|
||||||
@ -153,9 +152,9 @@ func New( //nolint:funlen
|
|||||||
}
|
}
|
||||||
settingsObj := settings.New(settingsPath)
|
settingsObj := settings.New(settingsPath)
|
||||||
|
|
||||||
lock, err := singleinstance.CreateLockFile(locations.GetLockFile())
|
lock, err := checkSingleInstance(locations.GetLockFile(), settingsObj)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logrus.Warnf("%v is already running", appName)
|
logrus.WithError(err).Warnf("%v is already running", appName)
|
||||||
return nil, api.CheckOtherInstanceAndFocus(settingsObj.GetInt(settings.APIPortKey))
|
return nil, api.CheckOtherInstanceAndFocus(settingsObj.GetInt(settings.APIPortKey))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -21,7 +21,9 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/Masterminds/semver/v3"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestIncrementRestartFlag(t *testing.T) {
|
func TestIncrementRestartFlag(t *testing.T) {
|
||||||
@ -47,3 +49,15 @@ func TestIncrementRestartFlag(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestVersionLessThan(t *testing.T) {
|
||||||
|
r := require.New(t)
|
||||||
|
|
||||||
|
old := semver.MustParse("1.1.0")
|
||||||
|
current := semver.MustParse("1.1.1")
|
||||||
|
newer := semver.MustParse("1.1.2")
|
||||||
|
|
||||||
|
r.True(old.LessThan(current))
|
||||||
|
r.False(current.LessThan(current))
|
||||||
|
r.False(newer.LessThan(current))
|
||||||
|
}
|
||||||
|
|||||||
101
internal/app/base/singleinstance_unix.go
Normal file
101
internal/app/base/singleinstance_unix.go
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
// Copyright (c) 2022 Proton AG
|
||||||
|
//
|
||||||
|
// This file is part of Proton Mail Bridge.
|
||||||
|
//
|
||||||
|
// Proton Mail 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.
|
||||||
|
//
|
||||||
|
// Proton Mail 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 Proton Mail Bridge. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//go:build !windows
|
||||||
|
// +build !windows
|
||||||
|
|
||||||
|
package base
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/Masterminds/semver/v3"
|
||||||
|
"github.com/ProtonMail/proton-bridge/v2/internal/config/settings"
|
||||||
|
"github.com/ProtonMail/proton-bridge/v2/internal/constants"
|
||||||
|
"github.com/allan-simon/go-singleinstance"
|
||||||
|
"golang.org/x/sys/unix"
|
||||||
|
)
|
||||||
|
|
||||||
|
// checkSingleInstance returns error if a bridge instance is already running
|
||||||
|
// This instance should be stop and window of running window should be brought
|
||||||
|
// to focus.
|
||||||
|
//
|
||||||
|
// For macOS and Linux when already running version is older than this instance
|
||||||
|
// it will kill old and continue with this new bridge (i.e. no error returned).
|
||||||
|
func checkSingleInstance(lockFilePath string, settingsObj *settings.Settings) (*os.File, error) {
|
||||||
|
if lock, err := singleinstance.CreateLockFile(lockFilePath); err == nil {
|
||||||
|
// Bridge is not runnig, continue normally
|
||||||
|
return lock, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := runningVersionIsOlder(settingsObj); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
pid, err := getPID(lockFilePath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := unix.Kill(pid, unix.SIGTERM); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Need to wait some time to release file lock
|
||||||
|
time.Sleep(time.Second)
|
||||||
|
|
||||||
|
return singleinstance.CreateLockFile(lockFilePath)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getPID(lockFilePath string) (int, error) {
|
||||||
|
file, err := os.Open(filepath.Clean(lockFilePath))
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
defer func() { _ = file.Close() }()
|
||||||
|
|
||||||
|
rawPID := make([]byte, 10) // PID is probably up to 7 digits long, 10 should be enough
|
||||||
|
n, err := file.Read(rawPID)
|
||||||
|
if err != nil {
|
||||||
|
return 0, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return strconv.Atoi(strings.TrimSpace(string(rawPID[:n])))
|
||||||
|
}
|
||||||
|
|
||||||
|
func runningVersionIsOlder(settingsObj *settings.Settings) error {
|
||||||
|
currentVer, err := semver.StrictNewVersion(constants.Version)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
runningVer, err := semver.StrictNewVersion(settingsObj.Get(settings.LastVersionKey))
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if !runningVer.LessThan(currentVer) {
|
||||||
|
return errors.New("running version is not older")
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
32
internal/app/base/singleinstance_windows.go
Normal file
32
internal/app/base/singleinstance_windows.go
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
// Copyright (c) 2022 Proton AG
|
||||||
|
//
|
||||||
|
// This file is part of Proton Mail Bridge.
|
||||||
|
//
|
||||||
|
// Proton Mail 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.
|
||||||
|
//
|
||||||
|
// Proton Mail 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 Proton Mail Bridge. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
//go:build windows
|
||||||
|
// +build windows
|
||||||
|
|
||||||
|
package base
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
|
||||||
|
"github.com/ProtonMail/proton-bridge/v2/internal/config/settings"
|
||||||
|
"github.com/allan-simon/go-singleinstance"
|
||||||
|
)
|
||||||
|
|
||||||
|
func checkSingleInstance(lockFilePath string, _ *settings.Settings) (*os.File, error) {
|
||||||
|
return singleinstance.CreateLockFile(lockFilePath)
|
||||||
|
}
|
||||||
@ -193,6 +193,7 @@ QtObject {
|
|||||||
onTriggered: {
|
onTriggered: {
|
||||||
Qt.openUrlExternally(root.backend.landingPageLink)
|
Qt.openUrlExternally(root.backend.landingPageLink)
|
||||||
root.updateManualError.active = false
|
root.updateManualError.active = false
|
||||||
|
root.backend.quit()
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Action {
|
Action {
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
.PHONY: check-go check-godog install-godog test test-bridge test-live test-live-bridge test-stage test-debug test-live-debug bench
|
.PHONY: check-go check-godog install-godog test test-bridge test-live test-live-bridge test-stage test-debug test-live-debug bench
|
||||||
|
|
||||||
export GO111MODULE=on
|
export GO111MODULE=on
|
||||||
export BRIDGE_VERSION:=2.2.1+integrationtests
|
export BRIDGE_VERSION:=2.2.2+integrationtests
|
||||||
export VERBOSITY?=fatal
|
export VERBOSITY?=fatal
|
||||||
export TEST_DATA=testdata
|
export TEST_DATA=testdata
|
||||||
|
|
||||||
|
|||||||
@ -1,5 +1,9 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
|
file:
|
||||||
|
name: "./gobinsec-cache.yml"
|
||||||
|
expiration: 24h
|
||||||
|
|
||||||
ignore:
|
ignore:
|
||||||
# golang.org/x/net wrong match, we are using 2871e0cb, fixed by 37e1c6af
|
# golang.org/x/net wrong match, we are using 2871e0cb, fixed by 37e1c6af
|
||||||
- "CVE-2021-33194"
|
- "CVE-2021-33194"
|
||||||
|
|||||||
Reference in New Issue
Block a user