From b19d96f82c4198f200121bce9c1dece5935496de Mon Sep 17 00:00:00 2001 From: data Date: Sun, 8 Feb 2026 06:14:37 +0100 Subject: [PATCH] Fix CardDAV authentication and allow multiple accounts CardDAV fixes: - Extract domain from URI for auth info lookup - Auto-populate realm from host if empty - Add domain parameter to createAuthInfo for proper auth matching - Update liblinphone submodule with setAuthInfo fix UI improvements: - Allow multiple CardDAV accounts (removed count==0 restriction) Co-Authored-By: Claude Opus 4.5 --- .../address-books/carddav/CarddavModel.cpp | 23 ++++++++++++++++--- .../Settings/ContactsSettingsLayout.qml | 3 ++- external/linphone-sdk | 2 +- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/Linphone/model/address-books/carddav/CarddavModel.cpp b/Linphone/model/address-books/carddav/CarddavModel.cpp index 38621b04..4c5f60c1 100644 --- a/Linphone/model/address-books/carddav/CarddavModel.cpp +++ b/Linphone/model/address-books/carddav/CarddavModel.cpp @@ -22,6 +22,7 @@ #include "model/core/CoreModel.hpp" #include "model/setting/SettingsModel.hpp" #include "tool/Utils.hpp" +#include DEFINE_ABSTRACT_OBJECT(CarddavModel) @@ -59,16 +60,32 @@ void CarddavModel::save( mustBeInLinphoneThread(log().arg(Q_FUNC_INFO)); auto core = CoreModel::getInstance()->getCore(); + // Extract domain from URI for auth info lookup + string domain; + QUrl url(QString::fromStdString(uri)); + if (url.isValid()) { + domain = url.host().toStdString(); + } + + // If realm is empty, use domain as default realm + if (realm.empty() && !domain.empty()) { + realm = domain; + lInfo() << log().arg("Using host as default realm:") << realm; + } + + lInfo() << log().arg("CardDAV save called with:") << " displayName=" << displayName << " uri=" << uri + << " username=" << username << " realm=" << realm << " domain=" << domain << " (password hidden)"; + // Auth info handled in lazy mode, if provided handle otherwise ignore. // TODO: add dialog to ask user before removing existing auth info if existing already - (comment from Android) if (!username.empty() && !realm.empty()) { - mRemovedAuthInfo = core->findAuthInfo(realm, username, ""); + mRemovedAuthInfo = core->findAuthInfo(realm, username, domain); if (mRemovedAuthInfo != nullptr) { lWarning() << log().arg("Auth info with username ") << username << " already exists, removing it first."; core->removeAuthInfo(mRemovedAuthInfo); } - lInfo() << log().arg("Adding auth info with username") << username; - mCreatedAuthInfo = linphone::Factory::get()->createAuthInfo(username, "", password, "", realm, ""); + lInfo() << log().arg("Adding auth info with username ") << username << " and domain " << domain; + mCreatedAuthInfo = linphone::Factory::get()->createAuthInfo(username, "", password, "", realm, domain); core->addAuthInfo(mCreatedAuthInfo); } else { lInfo() << log().arg("No auth info provided upon saving."); diff --git a/Linphone/view/Page/Layout/Settings/ContactsSettingsLayout.qml b/Linphone/view/Page/Layout/Settings/ContactsSettingsLayout.qml index 194aaac2..e908ed2b 100644 --- a/Linphone/view/Page/Layout/Settings/ContactsSettingsLayout.qml +++ b/Linphone/view/Page/Layout/Settings/ContactsSettingsLayout.qml @@ -79,7 +79,8 @@ AbstractSettingsLayout { accessibleUseButtonText: qsTr("use_cardav_server_accessible_name") proxyModel: CarddavProxy { onModelReset: { - carddavProvider.showAddButton = carddavProvider.proxyModel.count == 0 + // Allow multiple CardDAV accounts + carddavProvider.showAddButton = true carddavProvider.newItemGui = createGuiObject('Carddav') } } diff --git a/external/linphone-sdk b/external/linphone-sdk index 2e6e6b92..4193a948 160000 --- a/external/linphone-sdk +++ b/external/linphone-sdk @@ -1 +1 @@ -Subproject commit 2e6e6b927ce202f6948da02ea33081a52b89bf48 +Subproject commit 4193a9481e6d8530bec6f6af26efb59285a53e0e