summaryrefslogtreecommitdiffstats
path: root/knode/knserverinfo.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'knode/knserverinfo.cpp')
-rw-r--r--knode/knserverinfo.cpp188
1 files changed, 188 insertions, 0 deletions
diff --git a/knode/knserverinfo.cpp b/knode/knserverinfo.cpp
new file mode 100644
index 000000000..b79735a2f
--- /dev/null
+++ b/knode/knserverinfo.cpp
@@ -0,0 +1,188 @@
+/*
+ KNode, the KDE newsreader
+ Copyright (c) 1999-2005 the KNode authors.
+ See file AUTHORS for details
+
+ 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.
+ 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, US
+*/
+
+
+#include <kmessagebox.h>
+#include <kconfig.h>
+#include <klocale.h>
+#include <kdebug.h>
+#include <kwallet.h>
+using namespace KWallet;
+
+#include "knglobals.h"
+#include "knserverinfo.h"
+#include "knaccountmanager.h"
+#include "utilities.h"
+
+#include <qwidget.h>
+
+KNServerInfo::KNServerInfo() :
+ t_ype(STnntp), i_d(-1), p_ort(119), h_old(300),
+ t_imeout(60), n_eedsLogon(false), p_assDirty(false),
+ mPassLoaded( false ),
+ mEncryption( None )
+{
+}
+
+
+
+KNServerInfo::~KNServerInfo()
+{
+}
+
+
+
+void KNServerInfo::readConf(KConfig *conf)
+{
+ s_erver=conf->readEntry("server", "localhost");
+
+ if(t_ype==STnntp)
+ p_ort=conf->readNumEntry("port", 119);
+ else
+ p_ort=conf->readNumEntry("port", 25);
+
+ h_old=conf->readNumEntry("holdTime", 300);
+
+ if(h_old < 0) h_old=0;
+
+ t_imeout=conf->readNumEntry("timeout", 60);
+
+ if(t_imeout < 15) t_imeout=15;
+
+ if(t_ype==STnntp)
+ i_d=conf->readNumEntry("id", -1);
+
+ n_eedsLogon=conf->readBoolEntry("needsLogon",false);
+ u_ser=conf->readEntry("user");
+ p_ass = KNHelper::decryptStr(conf->readEntry("pass"));
+
+ // migration to KWallet
+ if (Wallet::isEnabled() && !p_ass.isEmpty()) {
+ conf->deleteEntry( "pass" );
+ p_assDirty = true;
+ }
+
+ // if the wallet is open, no need to delay the password loading
+ if (Wallet::isOpen( Wallet::NetworkWallet() ))
+ readPassword();
+
+ QString encStr = conf->readEntry( "encryption", "None" );
+ if ( encStr.contains( "SSL", false ) )
+ mEncryption = SSL;
+ else if ( encStr.contains( "TLS", false ) )
+ mEncryption = TLS;
+ else
+ mEncryption = None;
+}
+
+
+void KNServerInfo::saveConf(KConfig *conf)
+{
+ conf->writeEntry("server", s_erver);
+ if ( p_ort == 0 ) p_ort = 119;
+ conf->writeEntry("port", p_ort);
+ conf->writeEntry("holdTime", h_old);
+ conf->writeEntry("timeout", t_imeout);
+ if (t_ype==STnntp)
+ conf->writeEntry("id", i_d);
+
+ conf->writeEntry("needsLogon", n_eedsLogon);
+ conf->writeEntry("user", u_ser);
+ // open wallet for storing only if the user actually changed the password
+ if (n_eedsLogon && p_assDirty) {
+ Wallet *wallet = KNAccountManager::wallet();
+ if (!wallet || wallet->writePassword(QString::number(i_d), p_ass)) {
+ if ( KMessageBox::warningYesNo( 0,
+ i18n("KWallet is not available. It is strongly recommended to use "
+ "KWallet for managing your passwords.\n"
+ "However, KNode can store the password in its configuration "
+ "file instead. The password is stored in an obfuscated format, "
+ "but should not be considered secure from decryption efforts "
+ "if access to the configuration file is obtained.\n"
+ "Do you want to store the password for server '%1' in the "
+ "configuration file?").arg( server() ),
+ i18n("KWallet Not Available"),
+ KGuiItem( i18n("Store Password") ),
+ KGuiItem( i18n("Do Not Store Password") ) )
+ == KMessageBox::Yes ) {
+ conf->writeEntry( "pass", KNHelper::encryptStr( p_ass ) );
+ }
+ }
+ p_assDirty = false;
+ }
+
+ switch ( mEncryption ) {
+ case SSL:
+ conf->writeEntry( "encryption", "SSL" );
+ break;
+ case TLS:
+ conf->writeEntry( "encryption", "TLS" );
+ break;
+ default:
+ conf->writeEntry( "encryption", "None" );
+ }
+}
+
+
+
+bool KNServerInfo::operator==(const KNServerInfo &s)
+{
+ return ( (t_ype==s.t_ype) &&
+ (s_erver==s.s_erver) &&
+ (p_ort==s.p_ort) &&
+ (h_old==s.h_old) &&
+ (t_imeout==s.t_imeout) &&
+ (n_eedsLogon==s.n_eedsLogon) &&
+ (u_ser==s.u_ser) &&
+ (p_ass==s.p_ass) &&
+ (mEncryption == s.mEncryption)
+ );
+}
+
+
+const QString &KNServerInfo::pass()
+{
+ // if we need to load the password, load all of them
+ if (n_eedsLogon && !mPassLoaded && p_ass.isEmpty() )
+ knGlobals.accountManager()->loadPasswords();
+
+ return p_ass;
+}
+
+void KNServerInfo::setPass(const QString &s)
+{
+ if (p_ass != s) {
+ p_ass = s;
+ p_assDirty = true;
+ }
+}
+
+
+void KNServerInfo::readPassword()
+{
+ // no need to load a password if the account doesn't require auth
+ if (!n_eedsLogon)
+ return;
+ mPassLoaded = true;
+
+ // check wether there is a chance to find our password at all
+ if (Wallet::folderDoesNotExist(Wallet::NetworkWallet(), "knode") ||
+ Wallet::keyDoesNotExist(Wallet::NetworkWallet(), "knode", QString::number(i_d)))
+ return;
+
+ // finally try to open the wallet and read the password
+ KWallet::Wallet *wallet = KNAccountManager::wallet();
+ if ( wallet )
+ wallet->readPassword( QString::number(i_d), p_ass );
+}