forked from Silverfish/proton-bridge
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d7fd39503f | |||
| b4b66f94ec | |||
| cbd36184bd | |||
| 465f754803 | |||
| 2fa7c97f39 |
11
Changelog.md
11
Changelog.md
@ -2,6 +2,17 @@
|
|||||||
|
|
||||||
Changelog [format](http://keepachangelog.com/en/1.0.0/)
|
Changelog [format](http://keepachangelog.com/en/1.0.0/)
|
||||||
|
|
||||||
|
## [Bridge 3.0.15/16] Perth Narrows
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
* GODT-2355: Improve wording and actions on bad event.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
* GODT-2354: Report failed load users.
|
||||||
|
* GODT-2353: Show popup only after 3.0.16.
|
||||||
|
* GODT-2351: Bump GPA to better handle net.OpError.
|
||||||
|
|
||||||
|
|
||||||
## [Bridge 3.0.14] Perth Narrows
|
## [Bridge 3.0.14] Perth Narrows
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|||||||
18
Makefile
18
Makefile
@ -11,7 +11,7 @@ ROOT_DIR:=$(shell dirname $(realpath $(firstword $(MAKEFILE_LIST))))
|
|||||||
.PHONY: build build-gui build-nogui build-launcher versioner hasher
|
.PHONY: build build-gui 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?=3.0.14+git
|
BRIDGE_APP_VERSION?=3.0.15+git
|
||||||
APP_VERSION:=${BRIDGE_APP_VERSION}
|
APP_VERSION:=${BRIDGE_APP_VERSION}
|
||||||
APP_FULL_NAME:=Proton Mail Bridge
|
APP_FULL_NAME:=Proton Mail Bridge
|
||||||
APP_VENDOR:=Proton AG
|
APP_VENDOR:=Proton AG
|
||||||
@ -294,7 +294,7 @@ gofiles: ./internal/bridge/credits.go
|
|||||||
cd ./utils/ && ./credits.sh bridge
|
cd ./utils/ && ./credits.sh bridge
|
||||||
|
|
||||||
## Run and debug
|
## Run and debug
|
||||||
.PHONY: run run-qt run-qt-cli run-nogui run-cli run-noninteractive run-debug run-qml-preview clean-vendor clean-frontend-qt clean-frontend-qt-common clean
|
.PHONY: run run-qt run-qt-cli run-nogui run-cli run-noninteractive run-debug run-gui-tester clean-vendor clean-frontend-qt clean-frontend-qt-common clean
|
||||||
|
|
||||||
LOG?=debug
|
LOG?=debug
|
||||||
LOG_IMAP?=client # client/server/all, or empty to turn it off
|
LOG_IMAP?=client # client/server/all, or empty to turn it off
|
||||||
@ -321,6 +321,20 @@ run-nogui: build-nogui clean-vendor gofiles
|
|||||||
run-debug:
|
run-debug:
|
||||||
dlv debug ./cmd/Desktop-Bridge/main.go -- -l=debug
|
dlv debug ./cmd/Desktop-Bridge/main.go -- -l=debug
|
||||||
|
|
||||||
|
ifeq "${TARGET_OS}" "windows"
|
||||||
|
EXE_SUFFIX=.exe
|
||||||
|
endif
|
||||||
|
|
||||||
|
bridge-gui-tester: build-gui
|
||||||
|
cp ./cmd/Desktop-Bridge/deploy/${TARGET_OS}/bridge-gui${EXE_SUFFIX} .
|
||||||
|
cd ./internal/frontend/bridge-gui/bridge-gui-tester && cmake . && make
|
||||||
|
|
||||||
|
run-gui-tester: bridge-gui-tester
|
||||||
|
# copying tester as bridge so bridge-gui will start it and connect to it automatically
|
||||||
|
cp ./internal/frontend/bridge-gui/bridge-gui-tester/bridge-gui-tester${EXE_SUFFIX} bridge${EXE_SUFFIX}
|
||||||
|
./bridge-gui${EXE_SUFFIX}
|
||||||
|
|
||||||
|
|
||||||
clean-vendor:
|
clean-vendor:
|
||||||
rm -rf ./vendor
|
rm -rf ./vendor
|
||||||
|
|
||||||
|
|||||||
2
go.mod
2
go.mod
@ -7,7 +7,7 @@ require (
|
|||||||
github.com/Masterminds/semver/v3 v3.1.1
|
github.com/Masterminds/semver/v3 v3.1.1
|
||||||
github.com/ProtonMail/gluon v0.14.2-0.20230207072331-53797c5aa3f6
|
github.com/ProtonMail/gluon v0.14.2-0.20230207072331-53797c5aa3f6
|
||||||
github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a
|
github.com/ProtonMail/go-autostart v0.0.0-20210130080809-00ed301c8e9a
|
||||||
github.com/ProtonMail/go-proton-api v0.3.1-0.20230207122130-dd2095ddc7fe
|
github.com/ProtonMail/go-proton-api v0.3.1-0.20230209110241-fe7894c4931a
|
||||||
github.com/ProtonMail/go-rfc5322 v0.11.0
|
github.com/ProtonMail/go-rfc5322 v0.11.0
|
||||||
github.com/ProtonMail/gopenpgp/v2 v2.4.10
|
github.com/ProtonMail/gopenpgp/v2 v2.4.10
|
||||||
github.com/PuerkitoBio/goquery v1.8.0
|
github.com/PuerkitoBio/goquery v1.8.0
|
||||||
|
|||||||
4
go.sum
4
go.sum
@ -41,8 +41,8 @@ github.com/ProtonMail/go-message v0.0.0-20210611055058-fabeff2ec753/go.mod h1:NB
|
|||||||
github.com/ProtonMail/go-mime v0.0.0-20220302105931-303f85f7fe0f/go.mod h1:NYt+V3/4rEeDuaev/zw1zCq8uqVEuPHzDPo3OZrlGJ4=
|
github.com/ProtonMail/go-mime v0.0.0-20220302105931-303f85f7fe0f/go.mod h1:NYt+V3/4rEeDuaev/zw1zCq8uqVEuPHzDPo3OZrlGJ4=
|
||||||
github.com/ProtonMail/go-mime v0.0.0-20220429130430-2192574d760f h1:4IWzKjHzZxdrW9k4zl/qCwenOVHDbVDADPPHFLjs0Oc=
|
github.com/ProtonMail/go-mime v0.0.0-20220429130430-2192574d760f h1:4IWzKjHzZxdrW9k4zl/qCwenOVHDbVDADPPHFLjs0Oc=
|
||||||
github.com/ProtonMail/go-mime v0.0.0-20220429130430-2192574d760f/go.mod h1:qRZgbeASl2a9OwmsV85aWwRqic0NHPh+9ewGAzb4cgM=
|
github.com/ProtonMail/go-mime v0.0.0-20220429130430-2192574d760f/go.mod h1:qRZgbeASl2a9OwmsV85aWwRqic0NHPh+9ewGAzb4cgM=
|
||||||
github.com/ProtonMail/go-proton-api v0.3.1-0.20230207122130-dd2095ddc7fe h1:um5Kp4WLzq28G7JMafv9lpmXFxasyg4RI2MhEFRjoJY=
|
github.com/ProtonMail/go-proton-api v0.3.1-0.20230209110241-fe7894c4931a h1:h9KLPt0HTCJjILYHREWCYnZv+1xaYmOVx/rxiT/1dIg=
|
||||||
github.com/ProtonMail/go-proton-api v0.3.1-0.20230207122130-dd2095ddc7fe/go.mod h1:JUo5IQG0hNuPRuDpOUsCOvtee6UjTEHHF1QN2i8RSos=
|
github.com/ProtonMail/go-proton-api v0.3.1-0.20230209110241-fe7894c4931a/go.mod h1:JUo5IQG0hNuPRuDpOUsCOvtee6UjTEHHF1QN2i8RSos=
|
||||||
github.com/ProtonMail/go-rfc5322 v0.11.0 h1:o5Obrm4DpmQEffvgsVqG6S4BKwC1Wat+hYwjIp2YcCY=
|
github.com/ProtonMail/go-rfc5322 v0.11.0 h1:o5Obrm4DpmQEffvgsVqG6S4BKwC1Wat+hYwjIp2YcCY=
|
||||||
github.com/ProtonMail/go-rfc5322 v0.11.0/go.mod h1:6oOKr0jXvpoE6pwTx/HukigQpX2J9WUf6h0auplrFTw=
|
github.com/ProtonMail/go-rfc5322 v0.11.0/go.mod h1:6oOKr0jXvpoE6pwTx/HukigQpX2J9WUf6h0auplrFTw=
|
||||||
github.com/ProtonMail/go-srp v0.0.5 h1:xhUioxZgDbCnpo9JehyFhwwsn9JLWkUGfB0oiKXgiGg=
|
github.com/ProtonMail/go-srp v0.0.5 h1:xhUioxZgDbCnpo9JehyFhwwsn9JLWkUGfB0oiKXgiGg=
|
||||||
|
|||||||
@ -21,6 +21,7 @@ package bridge
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"crypto/tls"
|
"crypto/tls"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
@ -38,6 +39,7 @@ import (
|
|||||||
"github.com/ProtonMail/proton-bridge/v3/internal/events"
|
"github.com/ProtonMail/proton-bridge/v3/internal/events"
|
||||||
"github.com/ProtonMail/proton-bridge/v3/internal/focus"
|
"github.com/ProtonMail/proton-bridge/v3/internal/focus"
|
||||||
"github.com/ProtonMail/proton-bridge/v3/internal/safe"
|
"github.com/ProtonMail/proton-bridge/v3/internal/safe"
|
||||||
|
"github.com/ProtonMail/proton-bridge/v3/internal/sentry"
|
||||||
"github.com/ProtonMail/proton-bridge/v3/internal/user"
|
"github.com/ProtonMail/proton-bridge/v3/internal/user"
|
||||||
"github.com/ProtonMail/proton-bridge/v3/internal/vault"
|
"github.com/ProtonMail/proton-bridge/v3/internal/vault"
|
||||||
"github.com/bradenaw/juniper/xslices"
|
"github.com/bradenaw/juniper/xslices"
|
||||||
@ -378,6 +380,9 @@ func (bridge *Bridge) init(tlsReporter TLSReporter) error {
|
|||||||
bridge.goLoad = bridge.tasks.Trigger(func(ctx context.Context) {
|
bridge.goLoad = bridge.tasks.Trigger(func(ctx context.Context) {
|
||||||
if err := bridge.loadUsers(ctx); err != nil {
|
if err := bridge.loadUsers(ctx); err != nil {
|
||||||
logrus.WithError(err).Error("Failed to load users")
|
logrus.WithError(err).Error("Failed to load users")
|
||||||
|
if netErr := new(proton.NetError); !errors.As(err, &netErr) {
|
||||||
|
sentry.ReportError(bridge.reporter, "Failed to load users", err)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
bridge.publish(events.AllUsersLoaded{})
|
bridge.publish(events.AllUsersLoaded{})
|
||||||
}
|
}
|
||||||
|
|||||||
@ -874,12 +874,14 @@ void QMLBackend::onLoginAlreadyLoggedIn(QString const &userID) {
|
|||||||
//****************************************************************************************************************************************************
|
//****************************************************************************************************************************************************
|
||||||
void QMLBackend::onUserBadEvent(QString const &userID, QString const &errorMessage) {
|
void QMLBackend::onUserBadEvent(QString const &userID, QString const &errorMessage) {
|
||||||
HANDLE_EXCEPTION(
|
HANDLE_EXCEPTION(
|
||||||
Q_UNUSED(errorMessage);
|
|
||||||
SPUser const user = users_->getUserWithID(userID);
|
SPUser const user = users_->getUserWithID(userID);
|
||||||
if (!user)
|
if (!user)
|
||||||
app().log().error(QString("Received bad event for unknown user %1").arg(user->id()));
|
app().log().error(QString("Received bad event for unknown user %1").arg(user->id()));
|
||||||
user->setState(UserState::SignedOut);
|
user->setState(UserState::SignedOut);
|
||||||
emit userBadEvent(tr("%1 was logged out because of an internal error.").arg(user->primaryEmailOrUsername()));
|
emit userBadEvent(
|
||||||
|
tr("Internal error: %1 was automatically logged out. Please log in again or report this problem if the issue persists.").arg(user->primaryEmailOrUsername()),
|
||||||
|
errorMessage
|
||||||
|
);
|
||||||
emit selectUser(userID);
|
emit selectUser(userID);
|
||||||
emit showMainWindow();
|
emit showMainWindow();
|
||||||
)
|
)
|
||||||
|
|||||||
@ -222,7 +222,7 @@ signals: // Signals received from the Go backend, to be forwarded to QML
|
|||||||
void addressChangedLogout(QString const &address); ///< Signal for the 'addressChangedLogout' gRPC stream event.
|
void addressChangedLogout(QString const &address); ///< Signal for the 'addressChangedLogout' gRPC stream event.
|
||||||
void apiCertIssue(); ///< Signal for the 'apiCertIssue' gRPC stream event.
|
void apiCertIssue(); ///< Signal for the 'apiCertIssue' gRPC stream event.
|
||||||
void userDisconnected(QString const &username); ///< Signal for the 'userDisconnected' gRPC stream event.
|
void userDisconnected(QString const &username); ///< Signal for the 'userDisconnected' gRPC stream event.
|
||||||
void userBadEvent(QString const &message); ///< Signal for the 'userBadEvent' gRPC stream event.
|
void userBadEvent(QString const &description, QString const &errorMessage); ///< Signal for the 'userBadEvent' gRPC stream event.
|
||||||
void internetOff(); ///< Signal for the 'internetOff' gRPC stream event.
|
void internetOff(); ///< Signal for the 'internetOff' gRPC stream event.
|
||||||
void internetOn(); ///< Signal for the 'internetOn' gRPC stream event.
|
void internetOn(); ///< Signal for the 'internetOn' gRPC stream event.
|
||||||
void resetFinished(); ///< Signal for the 'resetFinished' gRPC stream event.
|
void resetFinished(); ///< Signal for the 'resetFinished' gRPC stream event.
|
||||||
|
|||||||
@ -170,6 +170,10 @@ SettingsView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setDescription(message) {
|
||||||
|
description.text = message
|
||||||
|
}
|
||||||
|
|
||||||
function setDefaultValue() {
|
function setDefaultValue() {
|
||||||
description.text = ""
|
description.text = ""
|
||||||
address.text = root.selectedAddress
|
address.text = root.selectedAddress
|
||||||
|
|||||||
@ -348,6 +348,7 @@ Item {
|
|||||||
}
|
}
|
||||||
|
|
||||||
BugReportView { // 8
|
BugReportView { // 8
|
||||||
|
id: bugReport
|
||||||
colorScheme: root.colorScheme
|
colorScheme: root.colorScheme
|
||||||
selectedAddress: {
|
selectedAddress: {
|
||||||
if (accounts.currentIndex < 0) return ""
|
if (accounts.currentIndex < 0) return ""
|
||||||
@ -409,10 +410,14 @@ Item {
|
|||||||
}
|
}
|
||||||
accounts.currentIndex = i;
|
accounts.currentIndex = i;
|
||||||
if (user.state === EUserState.SignedOut)
|
if (user.state === EUserState.SignedOut)
|
||||||
showSignIn(user.primaryEmailOrUsername())
|
showSignIn(user.primaryEmailOrUsername())
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
console.error("User with ID ", userID, " was not found in the account list")
|
console.error("User with ID ", userID, " was not found in the account list")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function showBugReportAndPrefill(description) {
|
||||||
|
rightContent.showBugReport()
|
||||||
|
bugReport.setDescription(description)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -169,7 +169,6 @@ ApplicationWindow {
|
|||||||
root.showSetup(null,"")
|
root.showSetup(null,"")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
NotificationPopups {
|
NotificationPopups {
|
||||||
@ -188,6 +187,10 @@ ApplicationWindow {
|
|||||||
function showHelp() { contentWrapper.showHelp() }
|
function showHelp() { contentWrapper.showHelp() }
|
||||||
function selectUser(userID) { contentWrapper.selectUser(userID) }
|
function selectUser(userID) { contentWrapper.selectUser(userID) }
|
||||||
|
|
||||||
|
function showBugReportAndPrefill(message) {
|
||||||
|
contentWrapper.showBugReportAndPrefill(message)
|
||||||
|
}
|
||||||
|
|
||||||
function showSignIn(username) {
|
function showSignIn(username) {
|
||||||
if (contentLayout.currentIndex == 1) return
|
if (contentLayout.currentIndex == 1) return
|
||||||
contentWrapper.showSignIn(username)
|
contentWrapper.showSignIn(username)
|
||||||
|
|||||||
@ -129,6 +129,11 @@ Item {
|
|||||||
notification: root.notifications.noActiveKeyForRecipient
|
notification: root.notifications.noActiveKeyForRecipient
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NotificationDialog {
|
||||||
|
colorScheme: root.colorScheme
|
||||||
|
notification: root.notifications.userBadEvent
|
||||||
|
}
|
||||||
|
|
||||||
NotificationDialog {
|
NotificationDialog {
|
||||||
colorScheme: root.colorScheme
|
colorScheme: root.colorScheme
|
||||||
notification: root.notifications.genericError
|
notification: root.notifications.genericError
|
||||||
|
|||||||
@ -1046,8 +1046,8 @@ QtObject {
|
|||||||
property Notification apiCertIssue: Notification {
|
property Notification apiCertIssue: Notification {
|
||||||
title: qsTr("Unable to establish a \nsecure connection to \nProton servers")
|
title: qsTr("Unable to establish a \nsecure connection to \nProton servers")
|
||||||
description: qsTr("Bridge cannot verify the authenticity of Proton servers on your current network due to a TLS certificate error. " +
|
description: qsTr("Bridge cannot verify the authenticity of Proton servers on your current network due to a TLS certificate error. " +
|
||||||
"Start Bridge again after ensuring your connection is secure and/or connecting to a VPN. Learn more about TLS pinning " +
|
"Start Bridge again after ensuring your connection is secure and/or connecting to a VPN. Learn more about TLS pinning " +
|
||||||
"<a href=\"https://proton.me/blog/tls-ssl-certificate#Extra-security-precautions-taken-by-ProtonMail\">here</a>.")
|
"<a href=\"https://proton.me/blog/tls-ssl-certificate#Extra-security-precautions-taken-by-ProtonMail\">here</a>.")
|
||||||
|
|
||||||
brief: title
|
brief: title
|
||||||
icon: "./icons/ic-exclamation-circle-filled.svg"
|
icon: "./icons/ic-exclamation-circle-filled.svg"
|
||||||
@ -1086,7 +1086,7 @@ QtObject {
|
|||||||
|
|
||||||
function onNoActiveKeyForRecipient(email) {
|
function onNoActiveKeyForRecipient(email) {
|
||||||
root.noActiveKeyForRecipient.description = qsTr("There are no active keys to encrypt your message to %1. "+
|
root.noActiveKeyForRecipient.description = qsTr("There are no active keys to encrypt your message to %1. "+
|
||||||
"Please update the setting for this contact.").arg(email)
|
"Please update the setting for this contact.").arg(email)
|
||||||
root.noActiveKeyForRecipient.active = true
|
root.noActiveKeyForRecipient.active = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1103,17 +1103,21 @@ QtObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
property Notification userBadEvent: Notification {
|
property Notification userBadEvent: Notification {
|
||||||
title: qsTr("User was logged out")
|
title: qsTr("Your account was logged out")
|
||||||
brief: title
|
brief: title
|
||||||
description: "#PlaceHolderText"
|
description: "#PlaceHolderText"
|
||||||
icon: "./icons/ic-exclamation-circle-filled.svg"
|
icon: "./icons/ic-exclamation-circle-filled.svg"
|
||||||
type: Notification.NotificationType.Danger
|
type: Notification.NotificationType.Danger
|
||||||
group: Notifications.Group.Connection
|
group: Notifications.Group.Connection | Notifications.Group.Dialogs
|
||||||
|
|
||||||
|
property var bugReportMsg: "Reporting an issue:\n\n\"%1\"\n\nError: %2\n\nThe issue persists even after loggin back in."
|
||||||
|
property var errorMessage: ""
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: Backend
|
target: Backend
|
||||||
function onUserBadEvent(message) {
|
function onUserBadEvent(description, errorMessage) {
|
||||||
root.userBadEvent.description = message
|
root.userBadEvent.description = description
|
||||||
|
root.userBadEvent.errorMessage = errorMessage
|
||||||
root.userBadEvent.active = true
|
root.userBadEvent.active = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1125,8 +1129,22 @@ QtObject {
|
|||||||
onTriggered: {
|
onTriggered: {
|
||||||
root.userBadEvent.active = false
|
root.userBadEvent.active = false
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
Action {
|
||||||
|
text: qsTr("Report")
|
||||||
|
|
||||||
|
onTriggered: {
|
||||||
|
root.frontendMain.showBugReportAndPrefill(
|
||||||
|
root.userBadEvent.bugReportMsg.
|
||||||
|
arg( root.userBadEvent.description).
|
||||||
|
arg(root.userBadEvent.errorMessage)
|
||||||
|
)
|
||||||
|
root.userBadEvent.active = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
property Notification genericError: Notification {
|
property Notification genericError: Notification {
|
||||||
@ -1135,14 +1153,14 @@ QtObject {
|
|||||||
icon: "./icons/ic-exclamation-circle-filled.svg"
|
icon: "./icons/ic-exclamation-circle-filled.svg"
|
||||||
type: Notification.NotificationType.Danger
|
type: Notification.NotificationType.Danger
|
||||||
group: Notifications.Group.Dialogs
|
group: Notifications.Group.Dialogs
|
||||||
Connections {
|
Connections {
|
||||||
target: Backend
|
target: Backend
|
||||||
function onGenericError(title, description) {
|
function onGenericError(title, description) {
|
||||||
root.genericError.title = title
|
root.genericError.title = title
|
||||||
root.genericError.description = description
|
root.genericError.description = description
|
||||||
root.genericError.active = true;
|
root.genericError.active = true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
action: [
|
action: [
|
||||||
Action {
|
Action {
|
||||||
|
|||||||
@ -96,9 +96,11 @@ func (s *Service) GuiReady(ctx context.Context, _ *emptypb.Empty) (*GuiReadyResp
|
|||||||
|
|
||||||
s.initializationDone.Do(s.initializing.Done)
|
s.initializationDone.Do(s.initializing.Done)
|
||||||
|
|
||||||
// Splash screen should be displayed only to users who start v3 for the first time after upgrading from v2.
|
// Splash screen should be displayed only to users who start v3.0.16 or later for the first time after upgrading from v2.
|
||||||
return &GuiReadyResponse{
|
return &GuiReadyResponse{
|
||||||
ShowSplashScreen: (!s.bridge.GetFirstStart()) && s.bridge.GetLastVersion().LessThan(semver.MustParse("3.0.0")),
|
ShowSplashScreen: (!s.bridge.GetFirstStart()) &&
|
||||||
|
s.bridge.GetLastVersion().LessThan(semver.MustParse("3.0.0")) &&
|
||||||
|
s.bridge.GetCurrentVersion().GreaterThan(semver.MustParse("3.0.15")),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -26,6 +26,7 @@ import (
|
|||||||
"runtime"
|
"runtime"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"github.com/ProtonMail/gluon/reporter"
|
||||||
"github.com/ProtonMail/proton-bridge/v3/internal/constants"
|
"github.com/ProtonMail/proton-bridge/v3/internal/constants"
|
||||||
"github.com/ProtonMail/proton-bridge/v3/pkg/restarter"
|
"github.com/ProtonMail/proton-bridge/v3/pkg/restarter"
|
||||||
"github.com/getsentry/sentry-go"
|
"github.com/getsentry/sentry-go"
|
||||||
@ -163,6 +164,14 @@ func (r *Reporter) scopedReport(context map[string]interface{}, doReport func())
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ReportError(r reporter.Reporter, msg string, err error) {
|
||||||
|
if rerr := r.ReportMessageWithContext(msg, reporter.Context{
|
||||||
|
"error": err.Error(),
|
||||||
|
}); rerr != nil {
|
||||||
|
logrus.WithError(rerr).WithField("msg", msg).Error("Failed to send report")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// SkipDuringUnwind removes caller from the traceback.
|
// SkipDuringUnwind removes caller from the traceback.
|
||||||
func SkipDuringUnwind() {
|
func SkipDuringUnwind() {
|
||||||
pcs := make([]uintptr, 2)
|
pcs := make([]uintptr, 2)
|
||||||
|
|||||||
Reference in New Issue
Block a user