diff options
Diffstat (limited to 'kresources/carddav/preferences.cpp')
-rw-r--r-- | kresources/carddav/preferences.cpp | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/kresources/carddav/preferences.cpp b/kresources/carddav/preferences.cpp new file mode 100644 index 000000000..69c0db9cc --- /dev/null +++ b/kresources/carddav/preferences.cpp @@ -0,0 +1,235 @@ +/*========================================================================= +| KABCDAV +|-------------------------------------------------------------------------- +| (c) 2010 Timothy Pearson +| +| This project is released under the GNU General Public License. +| Please see the file COPYING for more details. +|-------------------------------------------------------------------------- +| CardDAV resource preferences class. + ========================================================================*/ + +/*========================================================================= +| INCLUDES + ========================================================================*/ + +#include "preferences.h" + +#include <kwallet.h> +#include <qstring.h> +#include <qurl.h> +#include <kdebug.h> + +/*========================================================================= +| NAMESPACES + ========================================================================*/ + +using namespace KABC; +using namespace KWallet; + +/*========================================================================= +| CONSTANTS + ========================================================================*/ + +const QString CardDavPrefs::NO_PASSWORD = ""; +const QString CardDavPrefs::WALLET_FOLDER = "CardDAV resource"; +const QString CardDavPrefs::WALLET_PWD_SUFFIX = ":carddav_password"; + +/*========================================================================= +| METHODS + ========================================================================*/ + +bool CardDavPrefs::setWalletFolder(const QString& folder) { + bool ret = true; + + if (!mNoWallet && NULL != mWallet) { + if (!mWallet->hasFolder(folder)) { + if (!mWallet->createFolder(folder)) { + ret = false; + kdWarning() << "can't create the wallet folder for CardDAV passwords"; + } + } + if (!mWallet->setFolder(folder)) { + ret = false; + kdWarning() << "can't set the wallet folder for CardDAV passwords"; + } + } else { + // the wallet is inaccessible or not configured + ret = false; + } + + return ret; +} + +Wallet* CardDavPrefs::getWallet() { + Wallet* ret = NULL; + + if (!mNoWallet) { + // the wallet is not marked as inaccessible + + if (NULL == mWallet) { + kdDebug() << "creating wallet for " + mPrefix; + + mWallet = Wallet::openWallet(Wallet::NetworkWallet(), 0); + if (NULL == mWallet) { + mNoWallet = true; // can't open the wallet, mark it inaccessible + kdWarning() << "can't create a wallet for CardDAV passwords"; + } else { + if (setWalletFolder(WALLET_FOLDER)) { + // reserved + } else { + // can't set the wallet folder, remove the wallet and mark it inaccessible + kdWarning() << "can't set the walet folder for CardDAV passwords"; + removeWallet(true); + } + } + } + + ret = mWallet; + } + + return ret; +} + +void CardDavPrefs::removeWallet(bool noWallet) { + delete mWallet; + mWallet = NULL; + mNoWallet = noWallet; +} + +void CardDavPrefs::addPrefix(const QString& prefix) { + KConfigSkeletonItem::List itemList = items(); + KConfigSkeletonItem::List::Iterator it; + + for ( it = itemList.begin(); it != itemList.end(); ++it ) { + (*it)->setGroup( prefix + ':' + (*it)->group() ); + } +} + +bool CardDavPrefs::writePasswordToWallet(const QString& password) { + + Wallet* w = getWallet(); + + bool ret = false; + if (NULL != w) { + int rc = w->writePassword(mPrefix + WALLET_PWD_SUFFIX, password); + if (0 != rc) { + kdWarning() << "CardDAV: can't write password to the wallet"; + } else { + ret = true; + } + } + + return ret; +} + +bool CardDavPrefs::readPasswordFromWallet(QString& password) { + Wallet* w = getWallet(); + + bool ret = false; + if (NULL != w) { + QString p; + int rc = w->readPassword(mPrefix + WALLET_PWD_SUFFIX, p); + if (0 == rc) { + //CardDavPrefsSkel::setPassword(p); + password = p; + ret = true; + } else { + kdWarning() << "CardDAV: can't read password from the wallet"; + password = NO_PASSWORD; + } + } + + return ret; +} + +bool CardDavPrefs::removePasswordFromWallet() { + + Wallet* w = getWallet(); + + bool ret = false; + if (NULL != w) { + int rc = w->removeEntry(mPrefix + WALLET_PWD_SUFFIX); + if (0 == rc) { + ret = true; + } else { + kdWarning() << "CardDAV: can't remove password from the wallet"; + } + } + + return ret; +} + +void CardDavPrefs::setPassword(const QString& p) { + + mPassword = p; + + if (rememberPassword()) { + writePasswordToWallet(p); + } +} + +QString CardDavPrefs::password() { + if (NO_PASSWORD == mPassword) { + readPasswordFromWallet(mPassword); + } + return mPassword; +} + +QString CardDavPrefs::getusername() { + return username(); +} + +void CardDavPrefs::setRememberPassword(bool v) { + kdDebug() << "remember: " << v; + + CardDavPrefsSkel::setRememberPassword(v); + + if (!v) { + // we should not remember password. If there is one already stored, it must be removed. + kdDebug() << "removing password from wallet"; + removePasswordFromWallet(); + } +} + +void CardDavPrefs::writeConfig() { + CardDavPrefsSkel::writeConfig(); +} + +void CardDavPrefs::readConfig() { + + CardDavPrefsSkel::readConfig(); + + // the password is not in config file, try to restore it from the wallet. + /*if (rememberPassword()) { + readPasswordFromWallet(); + }*/ +} + +QString CardDavPrefs::getFullUrl() { + + QUrl t(url()); + QString safeURL; + int firstAt; + + t.setUser(username()); + t.setPassword(password()); + + safeURL = t.toString(); + + firstAt = safeURL.find("@") + 1; + while (safeURL.find("@", firstAt) != -1) { + safeURL.replace(safeURL.find("@", firstAt), 1, "%40"); + } + + // Unencode the username, as Zimbra stupidly rejects the %40 + safeURL.replace("%40", "@"); + + // Encode any spaces, as libcarddav stupidly fails otherwise + safeURL.replace(" ", "%20"); + + return safeURL; +} + +// EOF ======================================================================== + |