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.
tdesvn/src/ksvnwidgets/pwstorage.cpp

209 lines
5.3 KiB

/***************************************************************************
* Copyright (C) 2006-2007 by Rajko Albrecht *
* ral@alwins-world.de *
* *
* 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"