/*************************************************************************** * 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 #include #include #include #include #include class PwStorageData { public: PwStorageData(){ m_Wallet=0; } ~PwStorageData() { delete m_Wallet; m_Wallet=0; } KWallet::Wallet*getWallet(); typedef QPair userpw_type; typedef QMap 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 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 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"