/* * Copyright (C) 2005, Mart Kelder (mart.kde@hccnet.nl) * * 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 "password.h" #include #include #include #include #include KWallet::Wallet* KOrnPassword::m_wallet = 0; bool KOrnPassword::m_openFailed = false; bool KOrnPassword::m_useWallet = false; //Not default true until moving works TQString KOrnPassword::readKOrnPassword( int box, int account, const TDEConfigBase &fallbackConfig ) { TQString result; if( readKOrnPassword( box, account, result ) ) return result; else return fallbackConfig.readEntry( "password" ); } TQString KOrnPassword::readKMailPassword( int accountnr, const TDEConfigBase& fallbackConfig ) { TQString password; open(); if( !m_wallet || !m_wallet->isOpen() || m_openFailed ) return KMailDecrypt( fallbackConfig.readEntry( "pass" ) ); if( !m_wallet->hasFolder( "kmail" ) ) return KMailDecrypt( fallbackConfig.readEntry( "pass" )); m_wallet->setFolder( "kmail" ); if( m_wallet->readPassword( TQString( "account-%1" ).arg( accountnr ), password ) != 0 ) return fallbackConfig.readEntry( "password" ); return password; } void KOrnPassword::writeKOrnPassword( int box, int account, TDEConfigBase& fallbackConfig, const TQString& password ) { if( writeKOrnPassword( box, account, password ) ) { if( fallbackConfig.hasKey( "password" ) ) fallbackConfig.deleteEntry( "password" ); } else fallbackConfig.writeEntry( "password", password ); } void KOrnPassword::deleteKOrnPassword( int box, int account, TDEConfigBase& fallbackConfig ) { deleteKOrnPassword( box, account ); if( fallbackConfig.hasKey( "password" ) ) fallbackConfig.deleteEntry( "password" ); } bool KOrnPassword::deleteKOrnPassword( int box, int account ) { if( !m_useWallet ) //Wallet should not be used => saving in config file return false; //Open wallet open(); if( !m_wallet || !m_wallet->isOpen() || m_openFailed ) //Opening failed => delete in config file return false; //Make folder for KOrn if needed if( !m_wallet->hasFolder( "korn" ) ) return false; //It does not exist m_wallet->setFolder( "korn" ); //Write to wallet if( m_wallet->removeEntry( TQString( "account-%1-%2" ).arg( box ).arg( account ) ) != 0 ) //Writing failed return false; //Password succesfully stored in the configuration. return true; } void KOrnPassword::moveKOrnPassword( int boxSrc, int accountSrc, TDEConfigBase& configSrc, int boxDest, int accountDest, TDEConfigBase &configDest ) { TQString password; password = readKOrnPassword( boxSrc, accountSrc, configSrc ); deleteKOrnPassword( boxSrc, accountSrc, configSrc ); writeKOrnPassword( boxDest, accountDest, configDest, password ); } void KOrnPassword::swapKOrnPassword( int box1, int account1, TDEConfigBase &config1, int box2, int account2, TDEConfigBase &config2 ) { TQString password1, password2; password1 = readKOrnPassword( box1, account1, config1 ); password2 = readKOrnPassword( box2, account2, config2 ); deleteKOrnPassword( box1, account1, config1 ); deleteKOrnPassword( box2, account2, config2 ); writeKOrnPassword( box1, account1, config1, password2 ); writeKOrnPassword( box2, account2, config2, password1 ); } void KOrnPassword::swapKOrnWalletPassword( int box1, int account1, int box2, int account2 ) { TQString password1, password2; bool passExist1, passExist2; passExist1 = readKOrnPassword( box1, account1, password1 ); passExist2 = readKOrnPassword( box2, account2, password2 ); if( passExist1 ) deleteKOrnPassword( box1, account1 ); if( passExist2 ) deleteKOrnPassword( box2, account2 ); if( passExist1 ) writeKOrnPassword( box2, account2, password1 ); if( passExist2 ) writeKOrnPassword( box1, account1, password2 ); } void KOrnPassword::swapKOrnWalletPasswords( int box1, int accountnumber1 ,int box2, int accountnumber2 ) { int max = accountnumber1 > accountnumber2 ? accountnumber1 : accountnumber2; for( int xx = 0; xx < max; ++xx ) swapKOrnWalletPassword( box1, xx, box2, xx ); } void KOrnPassword::rewritePassword( int box, int account, TDEConfigBase &config, bool newUseWalletValue ) { bool useWallet = m_useWallet; TQString password; setUseWallet( !newUseWalletValue ); password = readKOrnPassword( box, account, config ); deleteKOrnPassword( box, account, config ); setUseWallet( newUseWalletValue ); writeKOrnPassword( box, account, config, password ); setUseWallet( useWallet ); } void KOrnPassword::setUseWallet( const bool value ) { m_useWallet = value; } void KOrnPassword::open() { if( m_wallet && m_wallet->isOpen() ) return; //Already open if( m_openFailed ) return; //Not open, and can't be opened delete m_wallet; m_wallet = 0; m_wallet = KWallet::Wallet::openWallet( KWallet::Wallet::NetworkWallet(), 0 ); if( !m_wallet ) m_openFailed = true; } bool KOrnPassword::readKOrnPassword( int box, int account, TQString& password ) { if( !m_useWallet ) return false; //Otherwise: try to open the wallet open(); if( !m_wallet || !m_wallet->isOpen() || m_openFailed ) //Opening failed: getting value out of config if it exists there return false; if( !m_wallet->hasFolder( "korn" ) ) //No folder korn exist, so no password stored in the wallet. return false; m_wallet->setFolder( "korn" ); if( m_wallet->readPassword( TQString( "account-%1-%2" ).arg( box ).arg( account ), password ) != 0 ) //Error during reading the password: use the one in the config file return false; //Reading completed: returning return true; } bool KOrnPassword::writeKOrnPassword( int box, int account, const TQString& password ) { if( !m_useWallet ) //Wallet should not be used => saving in the config file return false; //Open wallet open(); if( !m_wallet || !m_wallet->isOpen() || m_openFailed ) //Opening failed => write to configfile return false; //Make folder for KOrn if needed if( !m_wallet->hasFolder( "korn" ) ) m_wallet->createFolder( "korn" ); m_wallet->setFolder( "korn" ); //Write to wallet if( m_wallet->writePassword( TQString( "account-%1-%2" ).arg( box ).arg( account ), password ) != 0 ) //Writing failed return false; //Password succesfully stored in the configuration. return true; } //This function is copyed from kmail/kmaccount.cpp TQString KOrnPassword::KMailDecrypt( const TQString& enc ) { TQString result; for (uint i = 0; i < enc.length(); i++) result += (enc[i].unicode() <= 0x21) ? enc[i] : TQChar(0x1001F - enc[i].unicode()); return result; }