[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kopete-devel
Subject:    Re: [kopete-devel] Prevent creating duplicate accounts
From:       Dennis =?iso-8859-15?q?Nienh=FCser?= <earthwings () gentoo ! org>
Date:       2007-11-06 20:51:34
Message-ID: 200711062151.35545.earthwings () gentoo ! org
[Download RAW message or body]

Am Sonntag 04 November 2007 14:25:13 schrieb Will Stephenson:
> On Saturday 03 November 2007 19:55:24 Dennis Nienhüser wrote:
> > please have a look at the attached patch which prevents adding accounts
> > more than once. Currently kopete crashes when doing that, the patch
> > modifies most plugins such that a friendly message pops up when creating
> > a duplicate account in the add account wizard and proceeding to the next
> > page is not possible. Additionally, the accept() method of the wizard
> > does that check again (e.g. the Testbed protocol doesn't have the
> > duplicate check).
> >
> > If there are no objections, I'll check it in.
>
> The patch is fine, but as discussed on IRC, this would be a good
> opportunity to use Kopete::Password::validate() in validateData().
>
> Will

Good idea, a new patch is attached with an example implementation for the ICQ 
protocol (6-8 characters). I didn't add the check to any other protocols as I 
don't know about any other password restrictions in protocols - drop me a 
line if you do.

Changes compared to the previous patch:
- Implemented validatePassword() for ICQ and use it in validateData()
- Changed virtual bool validateData() to
virtual bool validateData( Kopete::AccountChangeAction 
changeAction=Kopete::Create ) in 
kdenetwork/kopete/libkopete/ui/editaccountwidget.h.
This allows to distinguish between adding and editing accounts when validating 
data
- Changed this in all protocols - I hope I really got them all.
- Removed the Apply button in the Account Properties dialog. It wasn't 
connected.

Please have a look at the patch again :)
Dennis

["accountedit-datavalidation.diff" (text/x-diff)]

Index: kdenetwork/kopete/protocols/yahoo/yahooeditaccount.cpp
===================================================================
--- kdenetwork/kopete/protocols/yahoo/yahooeditaccount.cpp	(revision 733585)
+++ kdenetwork/kopete/protocols/yahoo/yahooeditaccount.cpp	(working copy)
@@ -43,6 +43,7 @@
 #include <addcontactpage.h>
 #include <kopeteuiglobal.h>
 #include <avatardialog.h>
+#include <kopeteaccountmanager.h>
 
 // Local Includes
 #include "yahooaccount.h"
@@ -96,20 +97,30 @@
 	show();
 }
 
-bool YahooEditAccount::validateData()
+bool YahooEditAccount::validateData( Kopete::AccountChangeAction changeAction )
 {
 	kDebug(YAHOO_GEN_DEBUG) ;
 
-	if(mScreenName->text().isEmpty())
+	QString userName(mScreenName->text());
+	if(userName.isEmpty())
 	{	KMessageBox::queuedMessageBox(this, KMessageBox::Sorry,
 			i18n("<qt>You must enter a valid screen name.</qt>"), i18n("Yahoo"));
 		return false;
 	}
+
 	if(!mPasswordWidget->validate())
 	{	KMessageBox::queuedMessageBox(this, KMessageBox::Sorry,
 			i18n("<qt>You must enter a valid password.</qt>"), i18n("Yahoo"));
 		return false;
 	}
+
+	if ( changeAction == Kopete::Create && Kopete::AccountManager::self()->findAccount( \
"YahooProtocol", userName ) ) +	{
+		KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18nc( "@info", 
+			"<qt>This account already exists. Please choose a different Yahoo username or use \
the Configure Dialog to change the settings of the <resource>%1</resource> \
account.</qt>", userName), i18n( "Yahoo" ) ); +		return false;
+	}
+
 	return true;
 }
 
Index: kdenetwork/kopete/protocols/yahoo/yahooeditaccount.h
===================================================================
--- kdenetwork/kopete/protocols/yahoo/yahooeditaccount.h	(revision 733585)
+++ kdenetwork/kopete/protocols/yahoo/yahooeditaccount.h	(working copy)
@@ -43,7 +43,7 @@
 public:
 	YahooEditAccount(YahooProtocol *protocol, Kopete::Account *theAccount, QWidget \
*parent = 0);  
-	virtual bool validateData();
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  
 public slots:
 	virtual Kopete::Account *apply();
Index: kdenetwork/kopete/protocols/gadu/gadueditaccount.h
===================================================================
--- kdenetwork/kopete/protocols/gadu/gadueditaccount.h	(revision 733585)
+++ kdenetwork/kopete/protocols/gadu/gadueditaccount.h	(working copy)
@@ -38,7 +38,7 @@
 
 public:
 	GaduEditAccount( GaduProtocol*, Kopete::Account*, QWidget* parent = 0 );
-	virtual bool validateData();
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  Kopete::Account* apply();
 
 private slots:
Index: kdenetwork/kopete/protocols/gadu/gadueditaccount.cpp
===================================================================
--- kdenetwork/kopete/protocols/gadu/gadueditaccount.cpp	(revision 733585)
+++ kdenetwork/kopete/protocols/gadu/gadueditaccount.cpp	(working copy)
@@ -42,6 +42,7 @@
 #include <kpassworddialog.h>
 
 #include "kopetepasswordwidget.h"
+#include "kopeteaccountmanager.h"
 
 GaduEditAccount::GaduEditAccount( GaduProtocol* proto, Kopete::Account* ident, \
QWidget* parent )  : QWidget( parent ), KopeteEditAccountWidget( ident ), protocol_( \
proto ), rcmd( 0 ) @@ -210,15 +211,16 @@
 }
 
 bool
-GaduEditAccount::validateData()
+GaduEditAccount::validateData( Kopete::AccountChangeAction changeAction )
 {
 
-	if ( loginEdit_->text().isEmpty() ) {
+	QString userName(loginEdit_->text());
+	if ( userName.isEmpty() ) {
 		KMessageBox::sorry( this, i18n( "<b>Enter UIN please.</b>" ), i18n( "Gadu-Gadu" ) \
);  return false;
 	}
 
-	if ( loginEdit_->text().toInt() < 0 || loginEdit_->text().toInt() == 0 ) {
+	if ( userName.toInt() < 0 || userName.toInt() == 0 ) {
 		KMessageBox::sorry( this, i18n( "<b>UIN should be a positive number.</b>" ), i18n( \
"Gadu-Gadu" ) );  return false;
 	}
@@ -228,6 +230,13 @@
 		return false;
 	}
 
+	if ( changeAction == Kopete::Create && Kopete::AccountManager::self()->findAccount( \
"GaduProtocol", userName ) ) +	{
+		KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18nc( "@info", 
+			"<qt>This account already exists. Please choose a different Gadu-Gadu UIN or use \
the Configure Dialog to change the settings of the <resource>%1</resource> \
account.</qt>", userName), i18n( "Gadu-Gadu" ) ); +		return false;
+	}
+
 	return true;
 }
 
Index: kdenetwork/kopete/protocols/qq/ui/qqeditaccountwidget.cpp
===================================================================
--- kdenetwork/kopete/protocols/qq/ui/qqeditaccountwidget.cpp	(revision 733585)
+++ kdenetwork/kopete/protocols/qq/ui/qqeditaccountwidget.cpp	(working copy)
@@ -48,6 +48,7 @@
 #include "kopeteglobal.h"
 
 #include "kopetepasswordwidget.h"
+#include "kopeteaccountmanager.h"
 
 #include "qqaccount.h"
 #include "qqcontact.h"
@@ -165,14 +166,23 @@
 	return account();
 }
 
-bool QQEditAccountWidget::validateData()
+bool QQEditAccountWidget::validateData( Kopete::AccountChangeAction changeAction )
 {
 	QString userid = d->ui->m_login->text();
+
+	if ( changeAction == Kopete::Create && Kopete::AccountManager::self()->findAccount( \
"QQProtocol", userid ) ) +	{
+		KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18nc( "@info", 
+			"<qt>This account already exists. Please choose a different QQ ID or use the \
Configure Dialog to change the settings of the <resource>%1</resource> \
account.</qt>", userid), i18n( "QQ" ) ); +		return false;
+	}
+
 	if ( QQProtocol::validContactId( userid ) )
 		return true;
 
 	KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), \
KMessageBox::Sorry,  i18n( "<qt>You must enter a valid email address.</qt>" ), i18n( \
"QQ Plugin" ) ); +
 	return false;
 }
 
Index: kdenetwork/kopete/protocols/qq/ui/qqeditaccountwidget.h
===================================================================
--- kdenetwork/kopete/protocols/qq/ui/qqeditaccountwidget.h	(revision 733585)
+++ kdenetwork/kopete/protocols/qq/ui/qqeditaccountwidget.h	(working copy)
@@ -42,7 +42,7 @@
 	/**
 	 * Is the data correct?
 	 */
-	virtual bool validateData();
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  
 private slots:
 	void slotOpenRegister();
Index: kdenetwork/kopete/protocols/winpopup/wpeditaccount.cpp
===================================================================
--- kdenetwork/kopete/protocols/winpopup/wpeditaccount.cpp	(revision 733585)
+++ kdenetwork/kopete/protocols/winpopup/wpeditaccount.cpp	(working copy)
@@ -36,9 +36,9 @@
 #include <kconfig.h>
 #include <kstandarddirs.h>
 
-
 // Kopete Includes
 #include <addcontactpage.h>
+#include <kopeteaccountmanager.h>
 
 // Local Includes
 #include "wpaccount.h"
@@ -93,11 +93,12 @@
 	mProtocol->installSamba();
 }
 
-bool WPEditAccount::validateData()
+bool WPEditAccount::validateData( Kopete::AccountChangeAction changeAction )
 {
 	kDebug(14170) << "WPEditAccount::validateData()";
 
-	if(mHostName->text().isEmpty()) {
+	QString hostname(mHostName->text());
+	if(hostname.isEmpty()) {
 		KMessageBox::sorry(this, i18n("<qt>You must enter a valid screen name.</qt>"), \
i18n("WinPopup"));  return false;
 	}
@@ -108,6 +109,13 @@
 		return false;
 	}
 
+	if ( changeAction == Kopete::Create && Kopete::AccountManager::self()->findAccount( \
"WPProtocol", hostname ) ) +	{
+		KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18nc( "@info",
+			"<qt>This account already exists. Please choose a different hostname or use the \
Configure Dialog to change the settings of the <resource>%1</resource> \
account.</qt>", hostname), i18n( "WinPopup" ) ); +		return false;
+	}
+
 	return true;
 }
 
Index: kdenetwork/kopete/protocols/winpopup/wpeditaccount.h
===================================================================
--- kdenetwork/kopete/protocols/winpopup/wpeditaccount.h	(revision 733585)
+++ kdenetwork/kopete/protocols/winpopup/wpeditaccount.h	(working copy)
@@ -43,7 +43,7 @@
 public:
 	WPEditAccount(QWidget *parent, Kopete::Account *theAccount);
 
-	virtual bool validateData();
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  void writeConfig();
 
 public slots:
Index: kdenetwork/kopete/protocols/groupwise/ui/gweditaccountwidget.cpp
===================================================================
--- kdenetwork/kopete/protocols/groupwise/ui/gweditaccountwidget.cpp	(revision \
                733585)
+++ kdenetwork/kopete/protocols/groupwise/ui/gweditaccountwidget.cpp	(working copy)
@@ -116,7 +116,7 @@
 	return account();
 }
 
-bool GroupWiseEditAccountWidget::validateData()
+bool GroupWiseEditAccountWidget::validateData( Kopete::AccountChangeAction \
changeAction )  {
     return !( m_preferencesDialog->m_userId->text().isEmpty() || \
m_preferencesDialog->m_server->text().isEmpty() );  }
Index: kdenetwork/kopete/protocols/groupwise/ui/gweditaccountwidget.h
===================================================================
--- kdenetwork/kopete/protocols/groupwise/ui/gweditaccountwidget.h	(revision 733585)
+++ kdenetwork/kopete/protocols/groupwise/ui/gweditaccountwidget.h	(working copy)
@@ -49,7 +49,7 @@
 	/**
 	 * Is the data correct?
 	 */
-	virtual bool validateData();
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  protected slots:
 	void configChanged();
 protected:
Index: kdenetwork/kopete/protocols/jabber/ui/jabbereditaccountwidget.cpp
===================================================================
--- kdenetwork/kopete/protocols/jabber/ui/jabbereditaccountwidget.cpp	(revision \
                733585)
+++ kdenetwork/kopete/protocols/jabber/ui/jabbereditaccountwidget.cpp	(working copy)
@@ -32,6 +32,7 @@
 #include <klineedit.h>
 #include <kopetepassword.h>
 #include <kopetepasswordedaccount.h>
+#include <kopeteaccountmanager.h>
 
 #include "kopeteuiglobal.h"
 #include "kopetepasswordwidget.h"
@@ -194,10 +195,11 @@
 	account()->configGroup()->writeEntry("HideSystemInfo", \
cbHideSystemInfo->isChecked());  }
 
-bool JabberEditAccountWidget::validateData ()
+bool JabberEditAccountWidget::validateData ( Kopete::AccountChangeAction \
changeAction )  {
 
-	if(!mID->text().contains('@'))
+	QString userId(mID->text());
+	if(!userId.contains('@'))
 	{
 		KMessageBox::sorry(this, i18n("The Jabber ID you have chosen is invalid. "
 							"Please make sure it is in the form user@server.com, like an email \
address."), @@ -206,6 +208,13 @@
 		return false;
 	}
 
+	if ( changeAction == Kopete::Create && Kopete::AccountManager::self()->findAccount( \
"JabberProtocol", userId ) ) +	{
+		KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18nc( "@info", 
+			"<qt>This account already exists. Please choose a different Jabber ID or use the \
Configure Dialog to change the settings of the <resource>%1</resource> \
account.</qt>", userId), i18n( "Jabber" ) ); +		return false;
+	}
+
 	return true;
 }
 
Index: kdenetwork/kopete/protocols/jabber/ui/jabbereditaccountwidget.h
===================================================================
--- kdenetwork/kopete/protocols/jabber/ui/jabbereditaccountwidget.h	(revision 733585)
+++ kdenetwork/kopete/protocols/jabber/ui/jabbereditaccountwidget.h	(working copy)
@@ -39,7 +39,7 @@
 public:
 	JabberEditAccountWidget (JabberProtocol * proto, JabberAccount *, QWidget * parent \
= 0);  ~JabberEditAccountWidget ();
-	virtual bool validateData ();
+	virtual bool validateData ( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  virtual Kopete::Account *apply ();
 	JabberAccount *account ();
 
Index: kdenetwork/kopete/protocols/testbed/testbededitaccountwidget.cpp
===================================================================
--- kdenetwork/kopete/protocols/testbed/testbededitaccountwidget.cpp	(revision \
                733585)
+++ kdenetwork/kopete/protocols/testbed/testbededitaccountwidget.cpp	(working copy)
@@ -58,7 +58,7 @@
 	return account();
 }
 
-bool TestbedEditAccountWidget::validateData()
+bool TestbedEditAccountWidget::validateData( Kopete::AccountChangeAction \
changeAction )  {
     //return !( m_preferencesWidget->m_acctName->text().isEmpty() );
 	return true;
Index: kdenetwork/kopete/protocols/testbed/testbededitaccountwidget.h
===================================================================
--- kdenetwork/kopete/protocols/testbed/testbededitaccountwidget.h	(revision 733585)
+++ kdenetwork/kopete/protocols/testbed/testbededitaccountwidget.h	(working copy)
@@ -45,7 +45,7 @@
 	/**
 	 * Is the data correct?
 	 */
-	virtual bool validateData();
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  protected:
 	Kopete::Account *m_account;
 	Ui::TestbedAccountPreferences *m_preferencesWidget;
Index: kdenetwork/kopete/protocols/msn/ui/msneditaccountwidget.cpp
===================================================================
--- kdenetwork/kopete/protocols/msn/ui/msneditaccountwidget.cpp	(revision 733585)
+++ kdenetwork/kopete/protocols/msn/ui/msneditaccountwidget.cpp	(working copy)
@@ -45,6 +45,7 @@
 
 #include "kopeteuiglobal.h"
 #include "kopeteglobal.h"
+#include "kopeteaccountmanager.h"
 
 #include "kopetepasswordwidget.h"
 #include "avatardialog.h"
@@ -213,9 +214,17 @@
 	return account();
 }
 
-bool MSNEditAccountWidget::validateData()
+bool MSNEditAccountWidget::validateData( Kopete::AccountChangeAction changeAction )
 {
 	QString userid = d->ui->m_login->text();
+
+	if ( changeAction == Kopete::Create && Kopete::AccountManager::self()->findAccount( \
"MSNProtocol", userid ) ) +	{
+		KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18nc( "@info", 
+			"<qt>This account already exists. Please choose a different MSN Passport ID or \
use the Configure Dialog to change the settings of the <resource>%1</resource> \
account.</qt>", userid), i18n( "MSN Plugin" ) ); +		return false;
+	}
+
 	if ( MSNProtocol::validContactId( userid ) )
 		return true;
 
Index: kdenetwork/kopete/protocols/msn/ui/msneditaccountwidget.h
===================================================================
--- kdenetwork/kopete/protocols/msn/ui/msneditaccountwidget.h	(revision 733585)
+++ kdenetwork/kopete/protocols/msn/ui/msneditaccountwidget.h	(working copy)
@@ -39,7 +39,7 @@
 public:
 	MSNEditAccountWidget( MSNProtocol *proto, Kopete::Account *account, QWidget *parent \
= 0 );  ~MSNEditAccountWidget();
-	virtual bool validateData();
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  virtual Kopete::Account * apply();
 
 private slots:
Index: kdenetwork/kopete/protocols/telepathy/ui/telepathyeditaccountwidget.cpp
===================================================================
--- kdenetwork/kopete/protocols/telepathy/ui/telepathyeditaccountwidget.cpp	(revision \
                733585)
+++ kdenetwork/kopete/protocols/telepathy/ui/telepathyeditaccountwidget.cpp	(working \
copy) @@ -105,7 +105,7 @@
 	return static_cast<TelepathyAccount*>( KopeteEditAccountWidget::account() );
 }
 
-bool TelepathyEditAccountWidget::validateData()
+bool TelepathyEditAccountWidget::validateData( Kopete::AccountChangeAction \
changeAction )  {
 	kDebug(TELEPATHY_DEBUG_AREA) ;
 	// You must fill the form to move to the next step
Index: kdenetwork/kopete/protocols/telepathy/ui/telepathyeditaccountwidget.h
===================================================================
--- kdenetwork/kopete/protocols/telepathy/ui/telepathyeditaccountwidget.h	(revision \
                733585)
+++ kdenetwork/kopete/protocols/telepathy/ui/telepathyeditaccountwidget.h	(working \
copy) @@ -42,7 +42,7 @@
 	explicit TelepathyEditAccountWidget(Kopete::Account *account, QWidget *parent = 0);
 	~TelepathyEditAccountWidget();
 
-	virtual bool validateData();
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  
 	/**
 	 * Create a new account if we are in the 'add account wizard',
Index: kdenetwork/kopete/protocols/sms/smseditaccountwidget.h
===================================================================
--- kdenetwork/kopete/protocols/sms/smseditaccountwidget.h	(revision 733585)
+++ kdenetwork/kopete/protocols/sms/smseditaccountwidget.h	(working copy)
@@ -33,7 +33,7 @@
 	SMSEditAccountWidget(SMSProtocol *protocol, Kopete::Account *theAccount, QWidget \
*parent = 0);  ~SMSEditAccountWidget();
 
-	bool validateData();
+	bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create );
 	Kopete::Account* apply();
 public slots:
 	void setServicePreferences(const QString& serviceName);
Index: kdenetwork/kopete/protocols/sms/smseditaccountwidget.cpp
===================================================================
--- kdenetwork/kopete/protocols/sms/smseditaccountwidget.cpp	(revision 733585)
+++ kdenetwork/kopete/protocols/sms/smseditaccountwidget.cpp	(working copy)
@@ -32,6 +32,7 @@
 #include <kconfiggroup.h>
 
 #include "kopeteuiglobal.h"
+#include "kopeteaccountmanager.h"
 
 #include "smseditaccountwidget.h"
 #include "smsactprefs.h"
@@ -90,8 +91,20 @@
 	delete service;
 }
 
-bool SMSEditAccountWidget::validateData()
+bool SMSEditAccountWidget::validateData( Kopete::AccountChangeAction changeAction )
 {
+	QString accountId(preferencesDialog->accountId->text());
+
+	if (accountId.isEmpty())
+		return false;
+
+	if ( changeAction == Kopete::Create && Kopete::AccountManager::self()->findAccount( \
"SMSProtocol", accountId ) ) +	{
+		KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18nc( "@info", 
+			"<qt>This account already exists. Please choose a different account ID or use the \
Configure Dialog to change the settings of the <resource>%1</resource> \
account.</qt>", accountId), i18n( "SMS" ) ); +		return false;
+	}
+
 	return true;
 }
 
Index: kdenetwork/kopete/protocols/oscar/aim/ui/aimeditaccountwidget.h
===================================================================
--- kdenetwork/kopete/protocols/oscar/aim/ui/aimeditaccountwidget.h	(revision 733585)
+++ kdenetwork/kopete/protocols/oscar/aim/ui/aimeditaccountwidget.h	(working copy)
@@ -44,7 +44,7 @@
 	                     QWidget *parent=0);
 	virtual ~AIMEditAccountWidget();
 	
-	virtual bool validateData();
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  virtual Kopete::Account *apply();
 	
 private slots:
Index: kdenetwork/kopete/protocols/oscar/aim/ui/aimeditaccountwidget.cpp
===================================================================
--- kdenetwork/kopete/protocols/oscar/aim/ui/aimeditaccountwidget.cpp	(revision \
                733585)
+++ kdenetwork/kopete/protocols/oscar/aim/ui/aimeditaccountwidget.cpp	(working copy)
@@ -14,9 +14,11 @@
 #include <ktoolinvocation.h>
 #include <kpassworddialog.h>
 #include <kconfig.h>
+#include <kmessagebox.h>
 
 #include "kopetepassword.h"
 #include "kopetepasswordwidget.h"
+#include "kopeteaccountmanager.h"
 
 #include "aimprotocol.h"
 #include "aimaccount.h"
@@ -203,7 +205,7 @@
 	return mAccount;
 }
 
-bool AIMEditAccountWidget::validateData()
+bool AIMEditAccountWidget::validateData( Kopete::AccountChangeAction changeAction )
 {
 	//kDebug(14152) << "Called.";
 
@@ -220,6 +222,13 @@
 	if ( server.length() < 1 )
 		return false;
 
+	if ( changeAction == Kopete::Create && Kopete::AccountManager::self()->findAccount( \
"AIMProtocol", userName ) ) +	{
+		KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18nc( "@info", 
+			"<qt>This account already exists. Please choose a different AIM screen name or \
use the Configure Dialog to change the settings of the <resource>%1</resource> \
account.</qt>", userName), i18n( "AIM" ) ); +		return false;
+	}
+
 	// Seems good to me
 	//kDebug(14152) << "Account data validated successfully.";
 	return true;
Index: kdenetwork/kopete/protocols/oscar/icq/icqprotocol.cpp
===================================================================
--- kdenetwork/kopete/protocols/oscar/icq/icqprotocol.cpp	(revision 733585)
+++ kdenetwork/kopete/protocols/oscar/icq/icqprotocol.cpp	(working copy)
@@ -842,6 +842,11 @@
 	return statusManager_;
 }
 
+bool ICQProtocol::validatePassword( const QString & password ) const
+{
+	return password.length() >= 6 && password.length() <= 8;
+}
+
 //END class ICQProtocol
 
 #include "icqprotocol.moc"
Index: kdenetwork/kopete/protocols/oscar/icq/icqprotocol.h
===================================================================
--- kdenetwork/kopete/protocols/oscar/icq/icqprotocol.h	(revision 733585)
+++ kdenetwork/kopete/protocols/oscar/icq/icqprotocol.h	(working copy)
@@ -76,6 +76,8 @@
 	void setTZComboValue(QComboBox *combo, const char &tz);
 	char getTZComboValue(QComboBox *combo); */
 
+	virtual bool validatePassword( const QString & password ) const;
+
 private:
 	void initGenders();
 	void initLang();
Index: kdenetwork/kopete/protocols/oscar/icq/ui/icqeditaccountwidget.cpp
===================================================================
--- kdenetwork/kopete/protocols/oscar/icq/ui/icqeditaccountwidget.cpp	(revision \
                733585)
+++ kdenetwork/kopete/protocols/oscar/icq/ui/icqeditaccountwidget.cpp	(working copy)
@@ -38,6 +38,7 @@
 
 #include "kopetepassword.h"
 #include "kopetepasswordwidget.h"
+#include "kopeteaccountmanager.h"
 
 #include "icqprotocol.h"
 #include "icqaccount.h"
@@ -68,6 +69,8 @@
 	QRegExp rx("[0-9]{9}");
 	QValidator* validator = new QRegExpValidator( rx, this );
 	mAccountSettings->edtAccountId->setValidator(validator);
+	
+	mAccountSettings->mPasswordWidget->setValidationProtocol(protocol);
 
 	// Read in the settings from the account if it exists
 	if(mAccount)
@@ -78,7 +81,7 @@
 		mAccountSettings->edtAccountId->setReadOnly(true);
 		mAccountSettings->mPasswordWidget->load(&mAccount->password());
 		mAccountSettings->chkAutoLogin->setChecked(mAccount->excludeConnect());
-
+			
 		QString serverEntry = mAccount->configGroup()->readEntry("Server", \
"login.oscar.aol.com");  int portEntry = mAccount->configGroup()->readEntry("Port", \
5190);  if ( serverEntry != "login.oscar.aol.com" || ( portEntry != 5190) )
@@ -261,7 +264,7 @@
 	return mAccount;
 }
 
-bool ICQEditAccountWidget::validateData()
+bool ICQEditAccountWidget::validateData( Kopete::AccountChangeAction changeAction )
 {
 	kDebug(14153) << "Called.";
 	bool bOk;
@@ -274,6 +277,20 @@
 		return false;
 	}
 
+	if ( changeAction == Kopete::Create && Kopete::AccountManager::self()->findAccount( \
"ICQProtocol", userId ) ) +	{
+		KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18nc( "@info", 
+			"<qt>This account already exists. Please choose a different ICQ UID or use the \
Configure Dialog to change the settings of the <resource>%1</resource> \
account.</qt>", userId), i18n( "ICQ" ) ); +		return false;
+	}
+	
+	if (!mAccountSettings->mPasswordWidget->validate())
+	{
+		KMessageBox::queuedMessageBox( this, KMessageBox::Sorry, i18nc( "@info",
+			"<qt>The password entered does not match the ICQ password guidelines: Passwords \
must be 6-8 characters long.</qt>"), i18n( "ICQ" ) ); +		return false;
+	}
+	
 	// No need to check port, min and max values are properly defined in .ui
 
 	if (mAccountSettings->edtServerAddress->text().isEmpty())
Index: kdenetwork/kopete/protocols/oscar/icq/ui/icqeditaccountwidget.h
===================================================================
--- kdenetwork/kopete/protocols/oscar/icq/ui/icqeditaccountwidget.h	(revision 733585)
+++ kdenetwork/kopete/protocols/oscar/icq/ui/icqeditaccountwidget.h	(working copy)
@@ -40,7 +40,7 @@
 	                     QWidget *parent=0);
 	~ICQEditAccountWidget();
 	
-	virtual bool validateData();
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  virtual Kopete::Account *apply();
 	
 private slots:
Index: kdenetwork/kopete/protocols/meanwhile/meanwhileeditaccountwidget.cpp
===================================================================
--- kdenetwork/kopete/protocols/meanwhile/meanwhileeditaccountwidget.cpp	(revision \
                733585)
+++ kdenetwork/kopete/protocols/meanwhile/meanwhileeditaccountwidget.cpp	(working \
copy) @@ -83,7 +83,7 @@
     return myAccount;
 }
 
-bool MeanwhileEditAccountWidget::validateData()
+bool MeanwhileEditAccountWidget::validateData( Kopete::AccountChangeAction \
changeAction )  {
     if(mScreenName->text().isEmpty())
     {
Index: kdenetwork/kopete/protocols/meanwhile/meanwhileeditaccountwidget.h
===================================================================
--- kdenetwork/kopete/protocols/meanwhile/meanwhileeditaccountwidget.h	(revision \
                733585)
+++ kdenetwork/kopete/protocols/meanwhile/meanwhileeditaccountwidget.h	(working copy)
@@ -40,7 +40,7 @@
 
     virtual Kopete::Account* apply();
 
-    virtual bool validateData();
+    virtual bool validateData( Kopete::AccountChangeAction \
changeAction=Kopete::Create );  protected slots:
     void slotSetServer2Default();
 protected:
Index: kdenetwork/kopete/protocols/irc/ui/irceditaccountwidget.cpp
===================================================================
--- kdenetwork/kopete/protocols/irc/ui/irceditaccountwidget.cpp	(revision 733585)
+++ kdenetwork/kopete/protocols/irc/ui/irceditaccountwidget.cpp	(working copy)
@@ -268,7 +268,7 @@
 	return account();
 }
 
-bool IRCEditAccountWidget::validateData()
+bool IRCEditAccountWidget::validateData( Kopete::AccountChangeAction changeAction )
 {
 	if( nickNames->text().isEmpty() )
 		KMessageBox::sorry(this, i18n("<qt>You must enter a nickname.</qt>"), \
                i18n("Kopete"));
Index: kdenetwork/kopete/protocols/irc/ui/irceditaccountwidget.h
===================================================================
--- kdenetwork/kopete/protocols/irc/ui/irceditaccountwidget.h	(revision 733585)
+++ kdenetwork/kopete/protocols/irc/ui/irceditaccountwidget.h	(working copy)
@@ -37,7 +37,7 @@
 	~IRCEditAccountWidget();
 
 	IRCAccount *account();
-	virtual bool validateData();
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
);  virtual Kopete::Account *apply();
 
 private slots:
Index: kdenetwork/kopete/kopete/addaccountwizard/addaccountwizard.cpp
===================================================================
--- kdenetwork/kopete/kopete/addaccountwizard/addaccountwizard.cpp	(revision 733585)
+++ kdenetwork/kopete/kopete/addaccountwizard/addaccountwizard.cpp	(working copy)
@@ -179,7 +179,7 @@
 	else if (currentPage()->widget() == d->accountPageWidget)
 	{
 		// check the data of the page is valid
-		if (!d->accountPage->validateData())
+		if (!d->accountPage->validateData(Kopete::Create))
 		{
 			return;
 		}
@@ -200,17 +200,33 @@
 
 void AddAccountWizard::accept()
 {
-	// registeredAccount shouldn't probably be called here. Anyway, if the account is \
                already registered, 
-	// it won't be registered twice
 	Kopete::AccountManager *manager = Kopete::AccountManager::self();
-	Kopete::Account        *account = \
manager->registerAccount(d->accountPage->apply());  
-	// if the account wasn't created correctly then leave
+	// Have the plugin extract account information
+	Kopete::Account *account = d->accountPage->apply();
 	if (!account)
 	{
+		KMessageBox::sorry( this, i18nc("@info", "<qt>An error occurred during account \
creation.</qt>"));  return;
 	}
 
+	// Check that the account doesn't exist yet, otherwise the account manager would \
delete it during registration +	// This shouldn't be the case as the protocol's \
account edit page should prevent this, but it's not guaranteed +	if \
(manager->findAccount(account->protocol()->pluginId(), account->accountId())) +	{
+		KMessageBox::sorry( this, i18nc("@info", "<qt>This account already \
exists.</qt>")); +		reject();
+		return;
+	}
+
+	// Register account and leave if it doesn't work
+	account = manager->registerAccount(account);
+	if (!account)
+	{
+		KMessageBox::sorry( this, i18nc("@info", "<qt>An error occurred during account \
registration.</qt>")); +		return;
+	}
+
 	// Make sure the protocol is correctly enabled.  This is not really needed, but \
still good  const QString PROTO_NAME = \
d->proto->pluginId().remove("Protocol").toLower();  \
                Kopete::PluginManager::self()->setPluginEnabled(PROTO_NAME , true);
Index: kdenetwork/kopete/kopete/config/accounts/kopeteaccountconfig.cpp
===================================================================
--- kdenetwork/kopete/kopete/config/accounts/kopeteaccountconfig.cpp	(revision \
                733585)
+++ kdenetwork/kopete/kopete/config/accounts/kopeteaccountconfig.cpp	(working copy)
@@ -239,6 +239,9 @@
 	
 void KopeteAccountConfig::modifyAccount(Kopete::Account *account)
 {
+	// FIXME: This function is almost identical to editAccount() in \
libkopete/kopeteaccount.cpp +	// and both should be merged.
+
 	Kopete::Protocol *proto = account->protocol();
 
 	KDialog editDialog ( this );
@@ -264,7 +267,11 @@
 	editDialog.setMainWidget( w );
 	if ( editDialog.exec() == QDialog::Accepted )
 	{
-		if( m_accountWidget->validateData() )
+                // FIXME: The dialog is hidden at this point, which means that \
messages +                // created in validateData() with "this" as parent won't be \
shown. It +                // should be called earlier such that messages are \
displayed to the user +                // and he gets a chance to know about them and \
fix them instantly. +		if( m_accountWidget->validateData(Kopete::Edit) )
 			m_accountWidget->apply();
 	}
 
Index: kdenetwork/kopete/libkopete/kopeteaccount.cpp
===================================================================
--- kdenetwork/kopete/libkopete/kopeteaccount.cpp	(revision 733585)
+++ kdenetwork/kopete/libkopete/kopeteaccount.cpp	(working copy)
@@ -566,11 +566,11 @@
 
 void Account::editAccount(QWidget *parent)
 {
-	KDialog *editDialog = new KDialog( parent );
-	editDialog->setCaption( i18n( "Edit Account" ) );
-	editDialog->setButtons( KDialog::Ok | KDialog::Apply | KDialog::Cancel );
+	KDialog editDialog( parent );
+	editDialog.setCaption( i18n( "Edit Account" ) );
+	editDialog.setButtons( KDialog::Ok | KDialog::Cancel );
 
-	KopeteEditAccountWidget *m_accountWidget = protocol()->createEditAccountWidget( \
this, editDialog ); +	KopeteEditAccountWidget *m_accountWidget = \
protocol()->createEditAccountWidget( this, &editDialog );  if ( !m_accountWidget )
 		return;
 
@@ -584,14 +584,16 @@
 	if ( !w )
 		return;
 
-	editDialog->setMainWidget( w );
-	if ( editDialog->exec() == QDialog::Accepted )
+	editDialog.setMainWidget( w );
+	if ( editDialog.exec() == QDialog::Accepted )
 	{
-		if( m_accountWidget->validateData() )
+		// FIXME: The dialog is hidden at this point, which means that messages
+		// created in validateData() with "this" as parent won't be shown. It
+		// should be called earlier such that messages are displayed to the user
+		// and he gets a chance to know about them and fix them instantly.
+		if( m_accountWidget->validateData(Kopete::Edit) )
 			m_accountWidget->apply();
 	}
-
-	editDialog->deleteLater();
 }
 
 void Account::setCustomIcon( const QString & i)
Index: kdenetwork/kopete/libkopete/ui/editaccountwidget.h
===================================================================
--- kdenetwork/kopete/libkopete/ui/editaccountwidget.h	(revision 733585)
+++ kdenetwork/kopete/libkopete/ui/editaccountwidget.h	(working copy)
@@ -23,7 +23,17 @@
 
 namespace Kopete
 {
-class Account;
+	class Account;
+
+	/**
+	 * \brief Possible changes to accounts
+	 * @sa @ref KopeteEditAccountWidget::validateData()
+	 */
+	enum AccountChangeAction {
+		Create = 0, ///< New account will be created 
+		Edit = 1 ///< Existing account will be changed
+	};
+
 }
 
 class KopeteEditAccountWidgetPrivate;
@@ -70,9 +80,11 @@
 
 	/**
 	 * This method must be reimplemented.
-	 * It does the same as @ref AddContactPage::validateData()
+	 * Returns true if all account configuration data filled in by the user is valid, \
and +	 * false otherwise, preferably with a message telling what is wrong. 
+	 * It is similar to @ref AddContactPage::validateData()
 	 */
-	virtual bool validateData() = 0;
+	virtual bool validateData( Kopete::AccountChangeAction changeAction=Kopete::Create \
) = 0;  
 	/**
 	 * Create a new account if we are in the 'add account wizard',



_______________________________________________
kopete-devel mailing list
kopete-devel@kde.org
https://mail.kde.org/mailman/listinfo/kopete-devel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic