You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
236 lines
6.2 KiB
236 lines
6.2 KiB
/*=========================================================================
|
|
| 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 ========================================================================
|
|
|