forked from Silverfish/proton-bridge
GODT-1478: Add GUI settings for keychain selection.
This commit is contained in:
2
Makefile
2
Makefile
@ -292,7 +292,7 @@ run-debug:
|
|||||||
|
|
||||||
run-qml-preview:
|
run-qml-preview:
|
||||||
find internal/frontend/qml/ -iname '*qmlc' | xargs rm -f
|
find internal/frontend/qml/ -iname '*qmlc' | xargs rm -f
|
||||||
cd internal/frontend/qml/ && qmlscene -verbose -I . -f Bridge_test.qml
|
bridge_preview internal/frontend/qml/Bridge_test.qml
|
||||||
|
|
||||||
|
|
||||||
clean-frontend-qt:
|
clean-frontend-qt:
|
||||||
|
|||||||
@ -242,8 +242,8 @@ Window {
|
|||||||
|
|
||||||
|
|
||||||
// add one user on start
|
// add one user on start
|
||||||
var haveUserOnStart = true
|
var hasUserOnStart = true
|
||||||
if (haveUserOnStart) {
|
if (hasUserOnStart) {
|
||||||
var newUserObject = root.userComponent.createObject(root)
|
var newUserObject = root.userComponent.createObject(root)
|
||||||
newUserObject.username = "LerooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooyJenkins@protonmail.com"
|
newUserObject.username = "LerooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooyJenkins@protonmail.com"
|
||||||
newUserObject.loggedIn = true
|
newUserObject.loggedIn = true
|
||||||
@ -584,6 +584,14 @@ Window {
|
|||||||
root.diskFull()
|
root.diskFull()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
text: "No keychain"
|
||||||
|
colorScheme: root.colorScheme
|
||||||
|
onClicked: {
|
||||||
|
root.hasNoKeychain()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -799,11 +807,14 @@ Window {
|
|||||||
signal bugReportSendSuccess()
|
signal bugReportSendSuccess()
|
||||||
signal bugReportSendError()
|
signal bugReportSendError()
|
||||||
|
|
||||||
property var availableKeychain: ["gnome-keyring", "pass"]
|
property var availableKeychain: ["gnome-keyring", "pass", "macos-keychain", "windows-credentials"]
|
||||||
property string selectedKeychain
|
property string currentKeychain: availableKeychain[0]
|
||||||
function selectKeychain(wantedKeychain){
|
function changeKeychain(wantedKeychain){
|
||||||
selectedKeychain = wantedKeychain
|
console.log("Changing keychain from", root.currentKeychain, "to", wantedKeychain)
|
||||||
|
root.currentKeychain = wantedKeychain
|
||||||
|
root.changeKeychainFinished()
|
||||||
}
|
}
|
||||||
|
signal changeKeychainFinished()
|
||||||
signal hasNoKeychain()
|
signal hasNoKeychain()
|
||||||
|
|
||||||
signal noActiveKeyForRecipient(string email)
|
signal noActiveKeyForRecipient(string email)
|
||||||
|
|||||||
@ -310,7 +310,7 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PortSettings { // 3
|
KeychainSettings { // 3
|
||||||
colorScheme: root.colorScheme
|
colorScheme: root.colorScheme
|
||||||
backend: root.backend
|
backend: root.backend
|
||||||
|
|
||||||
@ -319,7 +319,7 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SMTPSettings { // 4
|
PortSettings { // 4
|
||||||
colorScheme: root.colorScheme
|
colorScheme: root.colorScheme
|
||||||
backend: root.backend
|
backend: root.backend
|
||||||
|
|
||||||
@ -328,7 +328,16 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
LocalCacheSettings { // 5
|
SMTPSettings { // 5
|
||||||
|
colorScheme: root.colorScheme
|
||||||
|
backend: root.backend
|
||||||
|
|
||||||
|
onBack: {
|
||||||
|
rightContent.showGeneralSettings()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
LocalCacheSettings { // 6
|
||||||
colorScheme: root.colorScheme
|
colorScheme: root.colorScheme
|
||||||
backend: root.backend
|
backend: root.backend
|
||||||
notifications: root.notifications
|
notifications: root.notifications
|
||||||
@ -338,7 +347,7 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
HelpView { // 6
|
HelpView { // 7
|
||||||
colorScheme: root.colorScheme
|
colorScheme: root.colorScheme
|
||||||
backend: root.backend
|
backend: root.backend
|
||||||
|
|
||||||
@ -347,7 +356,7 @@ Item {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
BugReportView { // 7
|
BugReportView { // 8
|
||||||
colorScheme: root.colorScheme
|
colorScheme: root.colorScheme
|
||||||
backend: root.backend
|
backend: root.backend
|
||||||
selectedAddress: {
|
selectedAddress: {
|
||||||
@ -372,11 +381,12 @@ Item {
|
|||||||
|
|
||||||
function showSignIn () { rightContent.currentIndex = 1 }
|
function showSignIn () { rightContent.currentIndex = 1 }
|
||||||
function showGeneralSettings () { rightContent.currentIndex = 2 }
|
function showGeneralSettings () { rightContent.currentIndex = 2 }
|
||||||
function showPortSettings () { rightContent.currentIndex = 3 }
|
function showKeychainSettings () { rightContent.currentIndex = 3 }
|
||||||
function showSMTPSettings () { rightContent.currentIndex = 4 }
|
function showPortSettings () { rightContent.currentIndex = 4 }
|
||||||
function showLocalCacheSettings () { rightContent.currentIndex = 5 }
|
function showSMTPSettings () { rightContent.currentIndex = 5 }
|
||||||
function showHelpView () { rightContent.currentIndex = 6 }
|
function showLocalCacheSettings () { rightContent.currentIndex = 6 }
|
||||||
function showBugReport () { rightContent.currentIndex = 7 }
|
function showHelpView () { rightContent.currentIndex = 7 }
|
||||||
|
function showBugReport () { rightContent.currentIndex = 8 }
|
||||||
|
|
||||||
Connections {
|
Connections {
|
||||||
target: root.backend
|
target: root.backend
|
||||||
|
|||||||
@ -116,6 +116,20 @@ SettingsView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SettingsItem {
|
||||||
|
id: keychains
|
||||||
|
visible: root._isAdvancedShown && root.backend.availableKeychain.length > 1
|
||||||
|
colorScheme: root.colorScheme
|
||||||
|
text: qsTr("Change keychain")
|
||||||
|
description: qsTr("Change which keychain Bridge uses as default")
|
||||||
|
actionText: qsTr("Change")
|
||||||
|
type: SettingsItem.Button
|
||||||
|
checked: root.backend.isDoHEnabled
|
||||||
|
onClicked: root.parent.showKeychainSettings()
|
||||||
|
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
|
||||||
SettingsItem {
|
SettingsItem {
|
||||||
id: doh
|
id: doh
|
||||||
visible: root._isAdvancedShown
|
visible: root._isAdvancedShown
|
||||||
|
|||||||
116
internal/frontend/qml/KeychainSettings.qml
Normal file
116
internal/frontend/qml/KeychainSettings.qml
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
// Copyright (c) 2022 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/>.
|
||||||
|
|
||||||
|
import QtQuick 2.13
|
||||||
|
import QtQuick.Layouts 1.12
|
||||||
|
import QtQuick.Controls 2.13
|
||||||
|
import QtQuick.Controls.impl 2.13
|
||||||
|
|
||||||
|
import Proton 4.0
|
||||||
|
|
||||||
|
SettingsView {
|
||||||
|
id: root
|
||||||
|
|
||||||
|
fillHeight: false
|
||||||
|
|
||||||
|
property bool _valuesChanged: keychainSelection.checkedButton && keychainSelection.checkedButton.text != root.backend.currentKeychain
|
||||||
|
|
||||||
|
Label {
|
||||||
|
colorScheme: root.colorScheme
|
||||||
|
text: qsTr("Default keychain")
|
||||||
|
type: Label.Heading
|
||||||
|
Layout.fillWidth: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
colorScheme: root.colorScheme
|
||||||
|
text: qsTr("Change which keychain Bridge uses as default")
|
||||||
|
type: Label.Body
|
||||||
|
color: root.colorScheme.text_weak
|
||||||
|
Layout.fillWidth: true
|
||||||
|
wrapMode: Text.WordWrap
|
||||||
|
}
|
||||||
|
|
||||||
|
ColumnLayout {
|
||||||
|
spacing: 16
|
||||||
|
|
||||||
|
ButtonGroup{ id: keychainSelection }
|
||||||
|
|
||||||
|
Repeater {
|
||||||
|
model: root.backend.availableKeychain
|
||||||
|
|
||||||
|
RadioButton {
|
||||||
|
colorScheme: root.colorScheme
|
||||||
|
ButtonGroup.group: keychainSelection
|
||||||
|
text: modelData
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Rectangle {
|
||||||
|
Layout.fillWidth: true
|
||||||
|
height: 1
|
||||||
|
color: root.colorScheme.border_weak
|
||||||
|
}
|
||||||
|
|
||||||
|
RowLayout {
|
||||||
|
spacing: 12
|
||||||
|
|
||||||
|
Button {
|
||||||
|
id: submitButton
|
||||||
|
colorScheme: root.colorScheme
|
||||||
|
text: qsTr("Save and restart")
|
||||||
|
enabled: root._valuesChanged
|
||||||
|
onClicked: {
|
||||||
|
root.backend.changeKeychain(keychainSelection.checkedButton.text)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Button {
|
||||||
|
colorScheme: root.colorScheme
|
||||||
|
text: qsTr("Cancel")
|
||||||
|
onClicked: root.back()
|
||||||
|
secondary: true
|
||||||
|
}
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: root.backend
|
||||||
|
|
||||||
|
onChangeKeychainFinished: {
|
||||||
|
submitButton.loading = false
|
||||||
|
root.back()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
onBack: {
|
||||||
|
root.setDefaultValues()
|
||||||
|
}
|
||||||
|
|
||||||
|
function setDefaultValues(){
|
||||||
|
for (var bi in keychainSelection.buttons){
|
||||||
|
var button = keychainSelection.buttons[bi]
|
||||||
|
if (button.text == root.backend.currentKeychain) {
|
||||||
|
button.checked = true
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: root.setDefaultValues()
|
||||||
|
}
|
||||||
@ -110,4 +110,9 @@ Item {
|
|||||||
colorScheme: root.colorScheme
|
colorScheme: root.colorScheme
|
||||||
notification: root.notifications.deleteAccount
|
notification: root.notifications.deleteAccount
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NotificationDialog {
|
||||||
|
colorScheme: root.colorScheme
|
||||||
|
notification: root.notifications.noKeychain
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -72,7 +72,8 @@ QtObject {
|
|||||||
root.disableLocalCache,
|
root.disableLocalCache,
|
||||||
root.enableLocalCache,
|
root.enableLocalCache,
|
||||||
root.resetBridge,
|
root.resetBridge,
|
||||||
root.deleteAccount
|
root.deleteAccount,
|
||||||
|
root.noKeychain
|
||||||
]
|
]
|
||||||
|
|
||||||
// Connection
|
// Connection
|
||||||
@ -866,4 +867,31 @@ QtObject {
|
|||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
property Notification noKeychain: Notification {
|
||||||
|
title: qsTr("No keychain available")
|
||||||
|
description: qsTr("Bridge is not able to detected a supported password manager (pass, gnome-keyring). Please install and setup supported password manager and restart the application.")
|
||||||
|
brief: title
|
||||||
|
icon: "./icons/ic-exclamation-circle-filled.svg"
|
||||||
|
type: Notification.NotificationType.Danger
|
||||||
|
group: Notifications.Group.Dialogs | Notifications.Group.Configuration
|
||||||
|
|
||||||
|
Connections {
|
||||||
|
target: root.backend
|
||||||
|
|
||||||
|
onHasNoKeychain: {
|
||||||
|
root.noKeychain.active = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
action: [
|
||||||
|
Action {
|
||||||
|
text: qsTr("Quit Bridge")
|
||||||
|
|
||||||
|
onTriggered: {
|
||||||
|
root.backend.quit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -159,10 +159,12 @@ func (f *FrontendQt) setKeychain() {
|
|||||||
availableKeychain = append(availableKeychain, chain)
|
availableKeychain = append(availableKeychain, chain)
|
||||||
}
|
}
|
||||||
f.qml.SetAvailableKeychain(availableKeychain)
|
f.qml.SetAvailableKeychain(availableKeychain)
|
||||||
f.qml.SetSelectedKeychain(f.bridge.GetKeychainApp())
|
f.qml.SetCurrentKeychain(f.bridge.GetKeychainApp())
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *FrontendQt) selectKeychain(wantKeychain string) {
|
func (f *FrontendQt) changeKeychain(wantKeychain string) {
|
||||||
|
defer f.qml.ChangeKeychainFinished()
|
||||||
|
|
||||||
if f.bridge.GetKeychainApp() == wantKeychain {
|
if f.bridge.GetKeychainApp() == wantKeychain {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@ -138,8 +138,9 @@ type QMLBackend struct {
|
|||||||
_ func() `signal:"bugReportSendError"`
|
_ func() `signal:"bugReportSendError"`
|
||||||
|
|
||||||
_ []string `property:"availableKeychain"`
|
_ []string `property:"availableKeychain"`
|
||||||
_ string `property:"selectedKeychain"`
|
_ string `property:"currentKeychain"`
|
||||||
_ func(keychain string) `slot:"selectKeychain"`
|
_ func(keychain string) `slot:"changeKeychain"`
|
||||||
|
_ func() `signal:"changeKeychainFinished"`
|
||||||
_ func() `signal:"notifyHasNoKeychain"`
|
_ func() `signal:"notifyHasNoKeychain"`
|
||||||
|
|
||||||
_ func(email string) `signal:noActiveKeyForRecipient`
|
_ func(email string) `signal:noActiveKeyForRecipient`
|
||||||
@ -287,10 +288,10 @@ func (q *QMLBackend) setup(f *FrontendQt) {
|
|||||||
})
|
})
|
||||||
|
|
||||||
f.setKeychain()
|
f.setKeychain()
|
||||||
q.ConnectSelectKeychain(func(k string) {
|
q.ConnectChangeKeychain(func(k string) {
|
||||||
go func() {
|
go func() {
|
||||||
defer f.panicHandler.HandlePanic()
|
defer f.panicHandler.HandlePanic()
|
||||||
f.selectKeychain(k)
|
f.changeKeychain(k)
|
||||||
}()
|
}()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user