diff options
Diffstat (limited to 'src/ksvnwidgets/pwstorage.cpp')
-rw-r--r-- | src/ksvnwidgets/pwstorage.cpp | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/src/ksvnwidgets/pwstorage.cpp b/src/ksvnwidgets/pwstorage.cpp new file mode 100644 index 0000000..c239b5a --- /dev/null +++ b/src/ksvnwidgets/pwstorage.cpp @@ -0,0 +1,208 @@ +/*************************************************************************** + * Copyright (C) 2006-2007 by Rajko Albrecht * + * [email protected] * + * * + * This program 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 2 of the License, or * + * (at your option) any later version. * + * * + * This program 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 this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * + ***************************************************************************/ +#include "pwstorage.h" +#include "kdesvn-config.h" +#include "src/settings/kdesvnsettings.h" + +#include <kwallet.h> +#include <kwin.h> +#include <kapp.h> + +#include <qthread.h> +#include <qmap.h> +#include <qpair.h> + +class PwStorageData +{ +public: + + PwStorageData(){ + m_Wallet=0; + } + + ~PwStorageData() + { + delete m_Wallet; + m_Wallet=0; + } + + KWallet::Wallet*getWallet(); + + typedef QPair<QString,QString> userpw_type; + typedef QMap<QString, userpw_type> cache_type; + + cache_type*getLoginCache(); + + QMutex*getCacheMutex(); + +protected: + KWallet::Wallet* m_Wallet; + +}; + +QMutex*PwStorageData::getCacheMutex() +{ + static QMutex _mutex; + return &_mutex; +} + +PwStorageData::cache_type*PwStorageData::getLoginCache() +{ + static PwStorageData::cache_type _LoginCache; + return &_LoginCache; +} + +KWallet::Wallet*PwStorageData::getWallet() +{ + static bool walletOpenFailed = false; + if (m_Wallet && m_Wallet->isOpen()) { + return m_Wallet; + } + + if (KWallet::Wallet::isEnabled()) { + WId window = 0; + if ( qApp->activeWindow() ) { + window = qApp->activeWindow()->winId(); + } + delete m_Wallet; + m_Wallet = KWallet::Wallet::openWallet( KWallet::Wallet::NetworkWallet(),window); + } + if (!m_Wallet) { + walletOpenFailed = true; + } else { + if (!m_Wallet->hasFolder(WALLETNAME)) { + m_Wallet->createFolder(WALLETNAME); + } + m_Wallet->setFolder(WALLETNAME); + } + return m_Wallet; +} + +PwStorage*PwStorage::self() +{ + static PwStorage*_me = 0; + if (!_me) { + _me = new PwStorage(); + } + return _me; +} + +/*! + \fn PwStorage::PwStorageData() + */ +PwStorage::PwStorage() + :QObject() +{ + mData = new PwStorageData; +} + +/*! + \fn PwStorage::~PwStorageData() + */ +PwStorage::~PwStorage() +{ + delete mData; +} + + +/*! + \fn PwStorage::connectWallet() + */ +bool PwStorage::connectWallet() +{ + return mData->getWallet()!=0L; +} + +/*! + \fn PwStorage::getCertPw(const QString&realm,QString&pw) + */ +bool PwStorage::getCertPw(const QString&realm,QString&pw) +{ + if (!mData->getWallet()) { + return false; + } + return (mData->getWallet()->readPassword(realm,pw)==0); +} + + +/*! + \fn PwStorage::getLogin(const QString&realm,QString&user,QString&pw) + */ +bool PwStorage::getLogin(const QString&realm,QString&user,QString&pw) +{ + if (!mData->getWallet()) { + return false; + } + QMap<QString,QString> content; + int j = mData->getWallet()->readMap(realm,content); + if (j!=0||content.find("user")==content.end()) { + return true; + } + user = content["user"]; + pw = content["password"]; + return true; +} + +bool PwStorage::getCachedLogin(const QString&realm,QString&user,QString&pw) +{ + QMutexLocker lc(mData->getCacheMutex()); + PwStorageData::cache_type::ConstIterator it = mData->getLoginCache()->find(realm); + if (it!=mData->getLoginCache()->end()) { + user=(*it).first; + pw = (*it).second; + } + return true; +} + +/*! + \fn PwStorage::setCertPw(const QString&realm, const QString&pw) + */ +bool PwStorage::setCertPw(const QString&realm, const QString&pw) +{ + if (!mData->getWallet()) { + return false; + } + return (mData->getWallet()->writePassword(realm,pw)==0); +} + + +/*! + \fn PwStorage::setLogin(const QString&realm,const QString&user,const QString&pw) + */ +bool PwStorage::setLogin(const QString&realm,const QString&user,const QString&pw) +{ + if (!mData->getWallet()) { + return false; + } + QMap<QString,QString> content; + content["user"]=user; + content["password"]=pw; + return (mData->getWallet()->writeMap(realm,content)==0); +} + +bool PwStorage::setCachedLogin(const QString&realm,const QString&user,const QString&pw) +{ + QMutexLocker lc(mData->getCacheMutex()); + PwStorageData::cache_type*_Cache = mData->getLoginCache(); + (*_Cache)[realm]=PwStorageData::userpw_type(user,pw); + return true; +} + +#include "pwstorage.moc" |