linux.x86.linphone/Linphone/view/Page/Layout/Settings/CarddavSettingsLayout.qml
data edfd148ea6 Add plain text password storage option for CardDAV (Nextcloud support)
- Add storePlainTextPassword setting in SettingsCore and SettingsModel
- Add UI switch in CarddavSettingsLayout.qml to toggle plain text password
- Allow multiple CardDAV accounts by setting showAddButton = true
- Add CardDAV troubleshooting documentation in README.md

This fixes CardDAV synchronization with Nextcloud/WebDAV servers that use
HTTP Basic Authentication, which requires plain text passwords instead
of the default HA1 hash storage.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-02-08 06:23:20 +01:00

143 lines
4.9 KiB
QML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import QtCore
import QtQuick
import QtQuick.Layouts
import QtQuick.Controls.Basic as Control
import QtQuick.Dialogs
import Linphone
import SettingsCpp 1.0
import UtilsCpp
import 'qrc:/qt/qml/Linphone/view/Style/buttonStyle.js' as ButtonStyle
import "qrc:/qt/qml/Linphone/view/Control/Tool/Helper/utils.js" as Utils
AbstractSettingsLayout {
id: mainItem
width: parent?.width
contentModel: [
{
//: Carnet d'adresse CardDAV
title: qsTr("settings_contacts_carddav_title"),
//: "Ajouter un carnet dadresse CardDAV pour synchroniser vos contacts Linphone avec un carnet dadresse tiers."
subTitle: qsTr("settings_contacts_carddav_subtitle"),
contentComponent: cardDavParametersComponent
}
]
topbarOptionalComponent: topBar
property alias carddavGui: mainItem.model
property bool isNew: false
onSave: {
if (carddavGui.core.isValid()) {
carddavGui.core.save()
} else {
UtilsCpp.showInformationPopup(qsTr("information_popup_error_title"),
//: "Vérifiez que toutes les informations ont été saisies."
qsTr("settings_contacts_carddav_popup_invalid_error"), false, mainWindow)
}
}
Connections {
enabled: carddavGui
target: carddavGui ? carddavGui.core : null
function onSaved(success, message) {
if (success)
UtilsCpp.showInformationPopup(qsTr("information_popup_synchronization_success_title"),
//: "Le carnet d'adresse CardDAV est synchronisé."
qsTr("settings_contacts_carddav_synchronization_success_message"), true, mainWindow)
else
UtilsCpp.showInformationPopup(qsTr("settings_contacts_carddav_popup_synchronization_error_title"),
//: "Erreur de synchronisation : %1"
qsTr("settings_contacts_carddav_popup_synchronization_error_message").arg(message), false, mainWindow)
}
}
Component {
id: topBar
RowLayout {
spacing: Utils.getSizeWithScreenRatio(20)
BigButton {
style: ButtonStyle.noBackground
icon.source: AppIcons.trashCan
icon.width: Utils.getSizeWithScreenRatio(32)
icon.height: Utils.getSizeWithScreenRatio(32)
visible: !isNew
onClicked: {
var mainWin = UtilsCpp.getMainWindow()
mainWin.showConfirmationLambdaPopup("",
//: "Supprimer le carnet d'adresse CardDAV ?"
qsTr("settings_contacts_delete_carddav_server_title"),
"",
function (confirmed) {
if (confirmed) {
carddavGui.core.remove()
mainItem.container.pop()
}
}
)
}
}
}
}
Component {
id: cardDavParametersComponent
ColumnLayout {
Layout.fillWidth: true
spacing: Utils.getSizeWithScreenRatio(20)
Layout.rightMargin: Utils.getSizeWithScreenRatio(44)
Layout.topMargin: Utils.getSizeWithScreenRatio(20)
Layout.leftMargin: Utils.getSizeWithScreenRatio(64)
DecoratedTextField {
propertyName: "displayName"
propertyOwnerGui: carddavGui
//: Nom d'affichage
title: qsTr("sip_address_display_name")
canBeEmpty: false
toValidate: true
Layout.fillWidth: true
}
DecoratedTextField {
propertyName: "uri"
propertyOwnerGui: carddavGui
//: "URL du serveur"
title: qsTr("settings_contacts_carddav_server_url_title")
canBeEmpty: false
toValidate: true
Layout.fillWidth: true
}
DecoratedTextField {
propertyName: "username"
propertyOwnerGui: carddavGui
title: qsTr("username")
toValidate: true
Layout.fillWidth: true
}
DecoratedTextField {
propertyName: "password"
hidden: true
propertyOwnerGui: carddavGui
title: qsTr("password")
toValidate: true
Layout.fillWidth: true
}
DecoratedTextField {
propertyName: "realm"
propertyOwnerGui: carddavGui
//: Domaine dauthentification
title: qsTr("settings_contacts_carddav_realm_title")
toValidate: true
Layout.fillWidth: true
}
SwitchSetting {
//: "Stocker ici les contacts nouvellement crées"
titleText: qsTr("settings_contacts_carddav_use_as_default_title")
propertyName: "storeNewFriendsInIt"
propertyOwnerGui: carddavGui
}
SwitchSetting {
//: "Passwort im Klartext speichern (für HTTP Basic Auth)"
titleText: qsTr("settings_contacts_carddav_store_plain_password_title")
//: "Für Nextcloud/WebDAV-Server erforderlich. Passwort wird nicht gehasht."
subTitleText: qsTr("settings_contacts_carddav_store_plain_password_subtitle")
checked: SettingsCpp.storePlainTextPassword
onCheckedChanged: SettingsCpp.storePlainTextPassword = checked
}
}
}
}