diff -Nru a/Makefile.am b/Makefile.am
--- a/Makefile.am	2005-02-23 11:30:54.000000000 +0100
+++ b/Makefile.am	2005-05-21 13:34:36.000000000 +0200
@@ -11,7 +11,7 @@
 CLEANFILES = dummy.cpp
 
 libkopete_msn_shared_la_SOURCES = msnprotocol.cpp msnaccount.cpp msnaddcontactpage.cpp msncontact.cpp \
-	msnsocket.cpp msnmessagemanager.cpp msndebugrawcmddlg.cpp \
+	msnsocket.cpp msnmessagemanager.cpp msndebugrawcmddlg.cpp sslloginhandler.cpp \
 	msnnotifysocket.cpp msnswitchboardsocket.cpp msnfiletransfersocket.cpp msninvitation.cpp \
 	msnp2p.cpp msnp2pdisplatcher.cpp msnp2pincoming.cpp msnp2poutgoing.cpp sha1.cpp
 
diff -Nru a/Makefile.in b/Makefile.in
--- a/Makefile.in	2005-05-21 14:22:18.000000000 +0200
+++ b/Makefile.in	2005-05-21 14:15:59.000000000 +0200
@@ -72,7 +72,7 @@
 	../../libkopete/libkopete.la $(am__DEPENDENCIES_1)
 am_libkopete_msn_shared_la_OBJECTS = msnprotocol.lo msnaccount.lo \
 	msnaddcontactpage.lo msncontact.lo msnsocket.lo \
-	msnmessagemanager.lo msndebugrawcmddlg.lo msnnotifysocket.lo \
+	msnmessagemanager.lo msndebugrawcmddlg.lo sslloginhandler.lo msnnotifysocket.lo \
 	msnswitchboardsocket.lo msnfiletransfersocket.lo \
 	msninvitation.lo msnp2p.lo msnp2pdisplatcher.lo \
 	msnp2pincoming.lo msnp2poutgoing.lo sha1.lo
@@ -82,7 +82,7 @@
 libkopete_msn_shared_la_final_OBJECTS = libkopete_msn_shared_la.all_cpp.lo 
 libkopete_msn_shared_la_nofinal_OBJECTS = msnprotocol.lo msnaccount.lo \
 	msnaddcontactpage.lo msncontact.lo msnsocket.lo \
-	msnmessagemanager.lo msndebugrawcmddlg.lo msnnotifysocket.lo \
+	msnmessagemanager.lo msndebugrawcmddlg.lo sslloginhandler.lo msnnotifysocket.lo \
 	msnswitchboardsocket.lo msnfiletransfersocket.lo \
 	msninvitation.lo msnp2p.lo msnp2pdisplatcher.lo \
 	msnp2pincoming.lo msnp2poutgoing.lo sha1.lo
@@ -467,7 +467,7 @@
 lib_LTLIBRARIES = libkopete_msn_shared.la
 CLEANFILES = dummy.cpp
 libkopete_msn_shared_la_SOURCES = msnprotocol.cpp msnaccount.cpp msnaddcontactpage.cpp msncontact.cpp \
-	msnsocket.cpp msnmessagemanager.cpp msndebugrawcmddlg.cpp \
+	msnsocket.cpp msnmessagemanager.cpp msndebugrawcmddlg.cpp sslloginhandler.cpp \
 	msnnotifysocket.cpp msnswitchboardsocket.cpp msnfiletransfersocket.cpp msninvitation.cpp \
 	msnp2p.cpp msnp2pdisplatcher.cpp msnp2pincoming.cpp msnp2poutgoing.cpp sha1.cpp
 
@@ -620,6 +620,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msnsocket.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/msnswitchboardsocket.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sha1.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sslloginhandler.Plo@am__quote@
 
 .cpp.o:
 @am__fastdepCXX_TRUE@	if $(CXXCOMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \
@@ -991,6 +992,13 @@
 mocs: msndebugrawcmddlg.moc
 
 #>+ 3
+sslloginhandler.moc: $(srcdir)/sslloginhandler.h
+	$(MOC) $(srcdir)/sslloginhandler.h -o sslloginhandler.moc
+
+#>+ 2
+mocs: sslloginhandler.moc
+
+#>+ 3
 msnp2pdisplatcher.moc: $(srcdir)/msnp2pdisplatcher.h
 	$(MOC) $(srcdir)/msnp2pdisplatcher.h -o msnp2pdisplatcher.moc
 
@@ -1092,10 +1100,10 @@
 
 #>+ 3
 clean-metasources:
-	-rm -f  msndebugrawcmddlg.moc msnp2pdisplatcher.moc msnmessagemanager.moc msnfiletransfersocket.moc msncontact.moc msnprotocol.moc msnaccount.moc msnsocket.moc msnswitchboardsocket.moc msnnotifysocket.moc msnp2poutgoing.moc msnp2p.moc msnp2pincoming.moc msnaddcontactpage.moc
+	-rm -f  msndebugrawcmddlg.mocsslloginhandler.moc  msnp2pdisplatcher.moc msnmessagemanager.moc msnfiletransfersocket.moc msncontact.moc msnprotocol.moc msnaccount.moc msnsocket.moc msnswitchboardsocket.moc msnnotifysocket.moc msnp2poutgoing.moc msnp2p.moc msnp2pincoming.moc msnaddcontactpage.moc
 
 #>+ 2
-KDE_DIST=msnp2poutgoing.h kopete_msn.desktop msncontact.h msnp2p.h msnmessagemanager.h msnchatui.rc Changelog msnsocket.h msnp2pincoming.h ReleaseNotes msndebugrawcmddlg.h msnaccount.h msnfiletransfersocket.h sha1.h msnp2pdisplatcher.h msninvitation.h Makefile.in msnswitchboardsocket.h msnprotocol.h msnnotifysocket.h msnaddcontactpage.h Makefile.am 
+KDE_DIST=msnp2poutgoing.h kopete_msn.desktop msncontact.h msnp2p.h msnmessagemanager.h msnchatui.rc Changelog msnsocket.h msnp2pincoming.h ReleaseNotes msndebugrawcmddlg.h sslloginhandler.h msnaccount.h msnfiletransfersocket.h sha1.h msnp2pdisplatcher.h msninvitation.h Makefile.in msnswitchboardsocket.h msnprotocol.h msnnotifysocket.h msnaddcontactpage.h Makefile.am 
 
 #>+ 3
 clean-closures:
@@ -1143,11 +1151,11 @@
 
 
 #>+ 11
-libkopete_msn_shared_la.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/msnprotocol.cpp $(srcdir)/msnaccount.cpp $(srcdir)/msnaddcontactpage.cpp $(srcdir)/msncontact.cpp $(srcdir)/msnsocket.cpp $(srcdir)/msnmessagemanager.cpp $(srcdir)/msndebugrawcmddlg.cpp $(srcdir)/msnnotifysocket.cpp $(srcdir)/msnswitchboardsocket.cpp $(srcdir)/msnfiletransfersocket.cpp $(srcdir)/msninvitation.cpp $(srcdir)/msnp2p.cpp $(srcdir)/msnp2pdisplatcher.cpp $(srcdir)/msnp2pincoming.cpp $(srcdir)/msnp2poutgoing.cpp $(srcdir)/sha1.cpp  msndebugrawcmddlg.moc msncontact.moc msnfiletransfersocket.moc msnmessagemanager.moc msnp2pdisplatcher.moc msnprotocol.moc msnaccount.moc msnsocket.moc msnswitchboardsocket.moc msnnotifysocket.moc msnp2p.moc msnp2poutgoing.moc msnaddcontactpage.moc msnp2pincoming.moc
+libkopete_msn_shared_la.all_cpp.cpp: $(srcdir)/Makefile.in $(srcdir)/msnprotocol.cpp $(srcdir)/msnaccount.cpp $(srcdir)/msnaddcontactpage.cpp $(srcdir)/msncontact.cpp $(srcdir)/msnsocket.cpp $(srcdir)/msnmessagemanager.cpp $(srcdir)/msndebugrawcmddlg.cpp $(srcdir)/sslloginhandler.cpp $(srcdir)/msnnotifysocket.cpp $(srcdir)/msnswitchboardsocket.cpp $(srcdir)/msnfiletransfersocket.cpp $(srcdir)/msninvitation.cpp $(srcdir)/msnp2p.cpp $(srcdir)/msnp2pdisplatcher.cpp $(srcdir)/msnp2pincoming.cpp $(srcdir)/msnp2poutgoing.cpp $(srcdir)/sha1.cpp  msndebugrawcmddlg.moc sslloginhandler.moc msncontact.moc msnfiletransfersocket.moc msnmessagemanager.moc msnp2pdisplatcher.moc msnprotocol.moc msnaccount.moc msnsocket.moc msnswitchboardsocket.moc msnnotifysocket.moc msnp2p.moc msnp2poutgoing.moc msnaddcontactpage.moc msnp2pincoming.moc
 	@echo 'creating libkopete_msn_shared_la.all_cpp.cpp ...'; \
 	rm -f libkopete_msn_shared_la.all_cpp.files libkopete_msn_shared_la.all_cpp.final; \
 	echo "#define KDE_USE_FINAL 1" >> libkopete_msn_shared_la.all_cpp.final; \
-	for file in msnprotocol.cpp msnaccount.cpp msnaddcontactpage.cpp msncontact.cpp msnsocket.cpp msnmessagemanager.cpp msndebugrawcmddlg.cpp msnnotifysocket.cpp msnswitchboardsocket.cpp msnfiletransfersocket.cpp msninvitation.cpp msnp2p.cpp msnp2pdisplatcher.cpp msnp2pincoming.cpp msnp2poutgoing.cpp sha1.cpp ; do \
+	for file in msnprotocol.cpp msnaccount.cpp msnaddcontactpage.cpp msncontact.cpp msnsocket.cpp msnmessagemanager.cpp msndebugrawcmddlg.cpp sslloginhandler.cpp msnnotifysocket.cpp msnswitchboardsocket.cpp msnfiletransfersocket.cpp msninvitation.cpp msnp2p.cpp msnp2pdisplatcher.cpp msnp2pincoming.cpp msnp2poutgoing.cpp sha1.cpp ; do \
 	  echo "#include \"$$file\"" >> libkopete_msn_shared_la.all_cpp.files; \
 	  test ! -f $(srcdir)/$$file || egrep '^#pragma +implementation' $(srcdir)/$$file >> libkopete_msn_shared_la.all_cpp.final; \
 	done; \
@@ -1182,15 +1190,17 @@
 kde-rpo-clean:
 	-rm -f *.rpo
 
-#>+ 31
+#>+ 33
 msnprotocol.lo: msnprotocol.moc 
 msnaccount.lo: msnaccount.moc 
 msnp2pdisplatcher.lo: msnp2pdisplatcher.moc 
 msnaccount.o: msnaccount.moc 
+sslloginhandler.lo: sslloginhandler.moc 
 msncontact.lo: msncontact.moc 
 msnp2pincoming.o: msnp2pincoming.moc 
 nmcheck-am: nmcheck
 msnswitchboardsocket.lo: msnswitchboardsocket.moc 
+sslloginhandler.o: sslloginhandler.moc 
 msnprotocol.o: msnprotocol.moc 
 msnmessagemanager.o: msnmessagemanager.moc 
 msnswitchboardsocket.o: msnswitchboardsocket.moc 
diff -Nru a/msnnotifysocket.cpp b/msnnotifysocket.cpp
--- a/msnnotifysocket.cpp	2005-02-23 11:30:54.000000000 +0100
+++ b/msnnotifysocket.cpp	2005-05-21 12:27:55.000000000 +0200
@@ -23,6 +23,7 @@
 #include "msnnotifysocket.h"
 #include "msncontact.h"
 #include "msnaccount.h"
+#include "sslloginhandler.h"
 
 #include <qregexp.h>
 
@@ -48,6 +49,7 @@
 : MSNSocket( account )
 {
 	m_newstatus = MSNProtocol::protocol()->NLN;
+	m_sslLoginHandler=0l;
 	
 	m_isHotmailAccount=false;
 	m_ping=false;
@@ -65,6 +67,7 @@
 
 MSNNotifySocket::~MSNNotifySocket()
 {
+	delete m_sslLoginHandler;
 	kdDebug(14140) << k_funcinfo << endl;
 }
 
@@ -248,7 +251,7 @@
 	
 	if ( cmd == "VER" )
 	{
-		sendCommand( "CVR", "0x0409 winnt 5.1 i386 MSNMSGR 6.0.0602 MSMSGS " + m_account->accountId() );
+		sendCommand( "CVR", "0x0409 winnt 5.1 i386 MSNMSGR 6.2.0205 MSMSGS " + m_account->accountId() );
 /*
 		struct utsname utsBuf;
 		uname ( &utsBuf );
@@ -266,27 +269,16 @@
 	{
 		if( data.section( ' ', 1, 1 ) == "S" )
 		{
-			m_authData=data.section( ' ' , 2 , 2 );
-			m_kv=QString::null;
+			m_sslLoginHandler = new SslLoginHandler();
+			QObject::connect( m_sslLoginHandler, SIGNAL(       loginFailed()        ),
+					 this,            SLOT  (    sslLoginFailed()        ) );
+			QObject::connect( m_sslLoginHandler, SIGNAL(    loginIncorrect()        ),
+					 this,            SLOT  ( sslLoginIncorrect()        ) );
+			QObject::connect( m_sslLoginHandler, SIGNAL(    loginSucceeded(QString) ),
+					 this,            SLOT  ( sslLoginSucceeded(QString) ) );
 
-			if( m_account->accountId().contains("@hotmail.") )
-				m_sid="loginnet.passport.com";
-			else if( m_account->accountId().contains("@msn.") ||  m_account->accountId().contains("@compaq.net") ||  m_account->accountId().contains("@webtv.net") )
-				m_sid="msnialogin.passport.com";
-			else
-				m_sid="login.passport.com";
-
-			QString authURL="https://"+m_sid+"/login.srf?" + m_authData;
-			authURL.replace("," , "&" ) ;
-
-			kdDebug(14140) << k_funcinfo << "downlaod URL: " << authURL << endl;
-
-			KIO::Job *job = KIO::get( KURL( authURL ), true, false );
-			job->addMetaData("cookies", "manual");
-			// This should force kio to download the page even is we are in the konqueror offline mode.  [see bug #68483]
-			job->addMetaData("cache", "reload");
-			QObject::connect( job, SIGNAL(result( KIO::Job *)), this, SLOT(slotAuthJobDone( KIO::Job *)) );
-		}
+			m_sslLoginHandler->login( data.section( ' ' , 2 , 2 ), m_account->accountId() , m_password );
+  		}
 		else
 		{
 			// Successful auth
@@ -582,76 +574,23 @@
 }
 
 
-void MSNNotifySocket::slotAuthJobDataReceived ( KIO::Job */*job*/,const  QByteArray &data)
+void MSNNotifySocket::sslLoginFailed()
 {
-	m_authData += QCString( data, data.size()+1 );
-//	kdDebug(14140) << "MSNNotifySocket::slotAuthJobDataReceived: " << data << endl;
+	disconnect();
 }
 
-void MSNNotifySocket::slotAuthJobDone ( KIO::Job *job)
+void MSNNotifySocket::sslLoginIncorrect()
 {
-//	kdDebug(14140) << "MSNNotifySocket::slotAuthJobDone: "<< m_authData << endl;
-
-	if(job->error())
-	{
-		//FIXME: Shouldn't we say that we are the MSN plugin?
-		job->showErrorDialog();
-		disconnect();
-		return;
-	}
-
-	if(m_kv.isNull())
-	{
-		QStringList cookielist=QStringList::split("\n", job->queryMetaData("setcookies") );
-		QString cookies="Cookie: ";
-		for ( QStringList::Iterator it = cookielist.begin(); it != cookielist.end(); ++it )
-		{
-			QRegExp rx("Set-Cookie: ([^;]*)");
-			rx.search(*it);
-			cookies+=rx.cap(1)+";";
-		}
-
-		//QRegExp rx("lc=([1-9]*),id=([1-9]*),tw=([1-9]*),fs=[1-9]*,ru=[1-9a-zA-Z%]*,ct=[1-9]*,kpp=[1-9]*,kv=([1-9]*),");
-		QRegExp rx("lc=([0-9]*),id=([0-9]*),tw=([0-9]*),.*kv=([0-9]*),");
-		rx.search(m_authData);
-
-		QString authURL = "https://" + m_sid + "/ppsecure/post.srf?lc=" + rx.cap( 1 ) + "&id=" +
-			rx.cap( 2 ) + "&tw=" + rx.cap( 3 ) + "&cbid=" + rx.cap( 2 ) + "&da=passport.com&login=" +
-			KURL::encode_string( m_account->accountId()) + "&domain=passport.com&passwd=";
-
-		kdDebug( 14140 ) << k_funcinfo << "Download URL: " << authURL << "(*******)" << endl;
-
-		m_authData = QString::null;
-		m_kv=rx.cap(4);
-		if(m_kv.isNull()) m_kv="";
-
-		authURL += KURL::encode_string( m_password ) ;
-		job = KIO::get( KURL( authURL ), false, false );
-		job->addMetaData("cookies", "manual");
-		job->addMetaData("setcookies", cookies);
-		job->addMetaData("cache", "reload");
-
-		QObject::connect( job, SIGNAL(data( KIO::Job *,const QByteArray&)), this, SLOT(slotAuthJobDataReceived( KIO::Job *,const QByteArray&)) );
-		QObject::connect( job, SIGNAL(result( KIO::Job *)), this, SLOT(slotAuthJobDone( KIO::Job *)) );
-	}
-	else
-	{
-		if(m_authData.contains("CookiesDisabled"))
-		{
-			// FIXME: is this still possible now we add our meta data? - Martijn
-			disconnect();
-			KMessageBox::queuedMessageBox( Kopete::UI::Global::mainWidget(), KMessageBox::Error,
-				i18n( "Unable to connect to the MSN Network.\nYour Web browser options are currently set to disable cookies.\n"
-				"To use .NET Passport, you must enable cookies at least for the passport.com domain" ), i18n( "MSN Plugin" ) );
-			return;
-		}
+	m_badPassword = true;
+	disconnect();
+}
 
-		QRegExp rx(/*URL=http://memberservices.passport.net/memberservice.srf*/"\\?did=[0-9]*&(t=[0-9A-Za-z!$*]*&p=[0-9A-Za-z!$*]*)\"");
-		rx.search(m_authData);
+void MSNNotifySocket::sslLoginSucceeded(QString a)
+{
+	sendCommand("USR" , "TWN S " + a);
+	m_sslLoginHandler->deleteLater();
+	m_sslLoginHandler=0;
 
-		m_badPassword=true;  //if this disconnect, that mean the password was bad
-		sendCommand("USR" , "TWN S " + rx.cap(1));
-	}
 }
 
 
diff -Nru a/msnnotifysocket.h b/msnnotifysocket.h
--- a/msnnotifysocket.h	2005-02-23 11:30:54.000000000 +0100
+++ b/msnnotifysocket.h	2005-05-21 12:12:05.000000000 +0200
@@ -29,6 +29,7 @@
 class MSNDispatchSocket;
 class MSNAccount;
 class KTempFile;
+class SslLoginHandler;
 
 #include <kio/job.h>
 
@@ -136,11 +137,9 @@
 	 */
 	void slotResetKeepAlive();
 
-
-
-	void slotAuthJobDataReceived ( KIO::Job *, const QByteArray &data);
-	void slotAuthJobDone ( KIO::Job *);
-
+	void sslLoginFailed();
+	void sslLoginIncorrect();
+	void sslLoginSucceeded(QString);
 
 private:
 	/**
@@ -170,7 +169,7 @@
 	QString m_kv;
 	QString m_sid;
 	QString m_loginTime;
-	QString m_authData;
+	SslLoginHandler *m_sslLoginHandler;
 
 	QTimer *m_keepaliveTimer;
 
diff -Nru a/sslloginhandler.cpp b/sslloginhandler.cpp
--- a/sslloginhandler.cpp	1970-01-01 01:00:00.000000000 +0100
+++ b/sslloginhandler.cpp	2005-05-20 13:52:07.000000000 +0200
@@ -0,0 +1,453 @@
+//Imported from KMess (2005-05-19)
+
+/***************************************************************************
+                          sslloginhandler.cpp  -  description
+                             -------------------
+    begin                : Sat Jun 28 2003
+    copyright            : (C) 2003 by Mike K. Bennett
+    email                : mkb137b@hotmail.com
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#include "sslloginhandler.h"
+
+#include <qstringlist.h>
+#include <qregexp.h>
+#include <qsocket.h>
+#include <qurl.h>
+
+#include <kdebug.h>
+#include <kextsock.h>
+#include <kssl.h>
+#include <kurl.h>
+
+#if 0
+#include "../kmessdebug.h"
+#include "mimemessage.h"
+#else
+//i didn't want to import the whole MimeMessage from Kmess for Kopete so i
+// reimplemented the base here  -Olivier
+
+class MimeMessage
+{
+	public:
+		MimeMessage(const QString &msg) : message(msg) {}
+
+		QString getValue(const QString &key)
+		{
+			QRegExp rx(key+": (.*)\n");
+			rx.search(message);
+			return rx.cap(1);
+		}
+	private:
+		QString message;
+};
+
+#include "sslloginhandler.moc"
+#endif
+//there is nothing modified from here.  this is exactly the kmerlin code
+
+
+
+/*
+ * Great documentation about this can be found at
+ * http://siebe.bot2k3.net/docs/
+ */
+
+
+// The constructor
+SslLoginHandler::SslLoginHandler()
+ : mode_(NONE)
+{
+  // Create the SSL handler
+  ssl_ = new KSSL( true );
+
+  // Create and set up the socket.
+  socket_ = new KExtendedSocket( );
+
+  //socket_->setSocketFlags( 0x00 | 0x600000 ); // 0x00 = anySocket | 0x600000 = bufferedSocket
+  socket_->setSocketFlags( 0x00 ); // 0x00 = anySocket | 0x600000 = bufferedSocket
+  socket_->setTimeout( 30   );
+  socket_->enableRead( true );
+  connect( socket_, SIGNAL(         readyRead()    ),
+           this,    SLOT  (      dataReceived()    ) );
+  connect( socket_, SIGNAL(  connectionFailed(int) ),
+           this,    SLOT  (       socketError(int) ) );
+}
+
+
+
+// The destructor
+SslLoginHandler::~SslLoginHandler()
+{
+  delete ssl_;
+  delete socket_;
+}
+
+
+
+// Data was received over the socket
+void SslLoginHandler::dataReceived()
+{
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - ******************** Data received ********************" << endl;
+  kdDebug() << "SslLoginHandler - " << socket_->bytesAvailable() << " bytes available." << endl;
+  kdDebug() << "SslLoginHandler - SSL says " << ssl_->pending() << " bytes available." << endl;
+#endif
+
+  QString   data;
+  int       breakOut = 0;
+  const int maxIterations = 1000;
+  while ( ( !data.contains( QRegExp("\r\n") ) ) && ( breakOut < maxIterations ) )
+  {
+    // Read data via SSL
+    data = readSslData();
+    breakOut ++;
+  }
+
+  // Output the data for debugging
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - ********************   Contents    ********************" << endl;
+  kdDebug() << data << endl;
+  kdDebug() << "SslLoginHandler - ********************  End of data  ********************" << endl;
+#endif
+
+  // Warn if timed out
+  if ( breakOut >= maxIterations )
+  {
+    kdDebug() << "WARNING - SSL read timed out." << endl;
+    emit loginFailed();
+    return;
+  }
+
+  if ( data.length() > 0 )
+  {
+    parseHttpResponse(data);
+  }
+  else
+  {
+    kdDebug() << "WARNING - Available data wasn't read from the SSL socket." << endl;
+    emit loginFailed();
+  }
+}
+
+
+
+// Start the login process
+void SslLoginHandler::login( QString parameters, QString handle, QString password )
+{
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - Starting login with parameters " << parameters << "." << endl;
+#endif
+
+  // Store the given data
+  authenticationParameters_ = parameters;
+  handle_                   = handle;
+  password_                 = password;
+
+  // Get the login server
+  sendLoginServerRequest("nexus.passport.com");
+  dataReceived();
+}
+
+
+
+// Get the authentication data from a string
+void SslLoginHandler::parseAuthenticationData( QString data )
+{
+  QString twnData;
+
+  // Pull TWN data out of the message
+  twnData = data.right( data.length() - data.find(QRegExp("from-PP='")) - 9 );
+  twnData = twnData.left( twnData.find(QRegExp("',")) );
+
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - data for TWN is " << twnData << "." << endl;
+#endif
+
+  // Notify the MsnNotificationConnection
+  emit loginSucceeded(twnData);
+}
+
+
+
+// Parse the HTTP response from the server
+void SslLoginHandler::parseHttpResponse(QString data)
+{
+  KURL    location;
+  int     headerEnd;
+  QString header;
+  int     headerCode;
+  QString headerText;
+
+  // Parse the HTTP status header
+  QRegExp re("HTTP/\\d+\\.\\d+ (\\d+) ([^\r\n]+)");
+  headerEnd  = data.find("\r\n");
+  header     = data.left( (headerEnd == -1) ? 20 : headerEnd );
+
+  re.search(header);
+  headerCode = re.cap(1).toUInt();
+  headerText = re.cap(2);
+
+  // Create a MimeMessage, removing the HTTP status header
+  MimeMessage message( data.section( ",", 1 ) );
+
+
+  switch(mode_)
+  {
+    case GETLOGINSERVER:
+    {
+      // Step 1. This data describes the login server to use.
+      if(headerCode == 302)
+      {
+        // HTTP Redirect
+        location = KURL( message.getValue( "Location" ) );
+        sendLoginServerRequest(location.host());
+      }
+      else
+      {
+        // Parse the data
+        QString loginServer;
+        QString page;
+        parseLoginServerData( loginServer, page, message.getValue("PassportURLs") );
+
+        // Send the authentication request
+        sendAuthenticationRequest( loginServer, page );
+      }
+      break;
+    }
+    case GETAUTHENTICATIONDATA:
+    {
+      // Step 2. Get the authentication data
+      if(headerCode == 200)
+      {
+        // Login success
+        parseAuthenticationData(message.getValue("Authentication-Info"));
+      }
+      else if(headerCode == 302)
+      {
+        // HTTP Redirect
+        location = KURL( message.getValue( "Location" ) );
+        sendAuthenticationRequest(location.host(), location.path());
+      }
+      else if(headerCode == 401)
+      {
+        // Got a HTTP "401 Unauthorized"; Login failed
+        emit loginIncorrect();
+      }
+      else
+      {
+        kdDebug() << "SslLoginHandler::parseHttpResponse: WARNING "
+                  << "- Unhandled response code " << headerCode << " " << headerText << endl;
+        emit loginFailed();
+      }
+      break;
+    }
+    default:
+    {
+      kdDebug() << "SslLoginHandler::parseHttpResponse: WARNING - Entered illegal state" << endl;
+      emit loginFailed();
+    }
+  }
+}
+
+
+// Get login server data from a string
+void SslLoginHandler::parseLoginServerData( QString &host, QString &page, QString serverData )
+{
+  int slashIndex;
+
+  // Get everything between "DLLogin=" and to the comma.
+  serverData = serverData.right( serverData.length() - serverData.find( "DALogin=" ) - 8 );
+  serverData = serverData.left( serverData.find( "," ) );
+
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - host/page=" << serverData << endl;
+#endif
+
+  // Separate the "host/page" string.
+  slashIndex = serverData.find( "/" );
+  host = serverData.left( slashIndex );
+  page = serverData.right( serverData.length() - slashIndex );
+
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - host=" << host << " page=" << page << endl;
+#endif
+}
+
+
+
+// Read data from the socket via SSL
+QString SslLoginHandler::readSslData()
+{
+  char       rawblock[1024];
+  QCString   block;
+  QString    data        = "";
+  int        noBytesRead = 1;
+
+  // Read data from the SSL socket.
+  if ( ssl_ != 0 )
+  {
+//    while( ( ssl_->pending() > 0 ) && ( noBytesRead > 0 ) )
+//    while( ( socket_->bytesAvailable() > 0 ) && ( noBytesRead > 0 ) )
+    while(noBytesRead > 0)
+    {
+      noBytesRead = ssl_->read( rawblock, 1024 );
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+      kdDebug() << "SslLoginHandler - " << noBytesRead << " bytes read." << endl;
+#endif
+      block = rawblock;
+      block = block.left( noBytesRead );
+      data += QString::fromUtf8( block );
+    }
+  }
+
+  return data;
+}
+
+
+
+// Send the authenticationn request
+void SslLoginHandler::sendAuthenticationRequest( QString loginServer, QString page )
+{
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - Step 2. Requesting authentication data." << endl;
+#endif
+
+  QString request;
+  QString encodedHandle   = handle_;
+  QString encodedPassword = password_;
+
+  QUrl::encode(encodedHandle);
+  QUrl::encode(encodedPassword);
+
+  request = "GET " + page + " HTTP/1.1\r\n"
+            "Authorization: Passport1.4"
+              " OrgVerb=GET"
+              ",OrgURL=http%3A%2F%2Fmessenger%2Emsn%2Ecom"
+              ",sign-in=" + encodedHandle +
+              ",pwd="     + encodedPassword +
+              ","         + authenticationParameters_ + "\r\n"
+            "User-Agent: MSMSGS\r\n"     // Make sure the server won't discriminate
+            "Host: " + loginServer + "\r\n"
+            "Connection: Keep-Alive\r\n"
+            "Cache-Control: no-cache\r\n\r\n";
+
+  // Step 2. Send the authorisation request
+  mode_ = GETAUTHENTICATIONDATA;
+  sendHttpRequest( request, loginServer, 443 );
+}
+
+
+
+// Send a HTTP request to the server
+void SslLoginHandler::sendHttpRequest( QString request, QString host, int port )
+{
+  QString response;
+  QString responseBody;
+
+  if ( socket_ == 0 )
+  {
+    kdDebug() << "SslLoginHandler::sendHttpRequest - WARNING "
+              << "- Trying to login using a null socket." << endl;
+    return;
+  }
+
+  // Configure the socket
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - Close and reset the socket." << endl;
+#endif
+  ssl_->setAutoReconfig( true );
+  ssl_->reInitialize();
+  socket_->closeNow();
+  socket_->reset();
+
+  // Try to connect
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - Connecting to " << host << ":" << port << "." << endl;
+#endif
+  socket_->setAddress( host, port );
+  socket_->lookup();
+  int connectionSuccess = socket_->connect();
+  if ( connectionSuccess != 0 )
+  {
+    kdDebug() << "SslLoginHandler::sendHttpRequest - WARNING "
+              << "- Connection failed, giving " << connectionSuccess << endl;
+    return;
+  }
+
+  // Try to wrap the SSL handler
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - Connection success, binding SSL to socket fd " << socket_->fd() << endl;
+#endif
+  int sslConnectionSuccess = ssl_->connect( socket_->fd() );
+  if ( sslConnectionSuccess != 1 )
+  {
+    kdDebug() << "SslLoginHandler::sendHttpRequest - WARNING "
+              << "- SSL Connection failed, giving " << sslConnectionSuccess << endl;
+    return;
+  }
+
+  // Send the request
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - SSL connected OK, sending the request." << endl;
+  kdDebug() << request;
+#endif
+  writeSslData( request );
+}
+
+
+
+// Request the name of the login server
+void SslLoginHandler::sendLoginServerRequest(QString hostname)
+{
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+  kdDebug() << "SslLoginHandler - Step 1. Requesting the login server." << endl;
+#endif
+
+  // Step 1. Send the login server request
+  // The server will respond with the location of the main SSL server.
+  mode_ = GETLOGINSERVER;
+  sendHttpRequest( "GET /rdr/pprdr.asp\r\n\r\n", hostname, 443 );
+}
+
+
+
+// Detect a socket error
+void SslLoginHandler::socketError(int error)
+{
+  kdDebug() << "SslLoginHandler : WARNING - Received error " << error << " from the socket." << endl;
+}
+
+
+
+// Write data to the socket via SSL
+void SslLoginHandler::writeSslData( QString data )
+{
+  int noBytesWritten;
+
+  if(socket_ != 0 && ssl_ != 0)
+  {
+    noBytesWritten = ssl_->write( data.latin1(), data.length() );
+    if(noBytesWritten != (int)data.length())
+    {
+      kdDebug() << "WARNING - Wanted to write " << data.length() << " to the socket, "
+                << " wrote " << noBytesWritten << "." << endl;
+    }
+#ifdef KMESSDEBUG_SSLLOGINHANDLER
+    else
+    {
+      kdDebug() << "SslLoginHandler - Sent " << noBytesWritten << " bytes via SSL." << endl;
+    }
+#endif
+  }
+}
+
diff -Nru a/sslloginhandler.h b/sslloginhandler.h
--- a/sslloginhandler.h	1970-01-01 01:00:00.000000000 +0100
+++ b/sslloginhandler.h	2005-05-20 13:52:07.000000000 +0200
@@ -0,0 +1,96 @@
+//Imported from KMess  - 2005-05-19
+
+/***************************************************************************
+                          sslloginhandler.h  -  description
+                             -------------------
+    begin                : Sat Jun 28 2003
+    copyright            : (C) 2003 by Mike K. Bennett
+    email                : mkb137b@hotmail.com
+ ***************************************************************************/
+
+/***************************************************************************
+ *                                                                         *
+ *   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.                                   *
+ *                                                                         *
+ ***************************************************************************/
+
+#ifndef SSLLOGINHANDLER_H
+#define SSLLOGINHANDLER_H
+
+#include <qobject.h>
+#include <qstringlist.h>
+
+// Forward declarations
+class KExtendedSocket;
+class KSSL;
+class MimeMessage;
+
+/**This class handles the SSL portion of the login.
+  *@author Mike K. Bennett
+  */
+
+class SslLoginHandler : public QObject
+{
+   Q_OBJECT
+
+  public:
+    // The constructor
+                         SslLoginHandler();
+    // The destructor
+                        ~SslLoginHandler();
+    // Start the login process
+    void                 login( QString parameters, QString handle, QString password );
+
+  private : // Private methods
+    // Get the authentication data from a string
+    void                 parseAuthenticationData( QString data );
+    // Parse the HTTP response from the server
+    void                 parseHttpResponse(QString data);
+    // Get login server data from a string
+    void                 parseLoginServerData( QString &host, QString &page, QString serverData );
+    // Read data from the socket via SSL
+    QString              readSslData();
+    // Send the authenticationn request
+    void                 sendAuthenticationRequest( QString loginServer, QString page );
+    // Send a HTTP request to the server
+    void                 sendHttpRequest( QString request, QString host, int port );
+    // Request the name of the login server
+    void                 sendLoginServerRequest(QString hostname);
+    // Write data to the socket via SSL
+    void                 writeSslData( QString data );
+
+  private slots : // Private slots
+    // Data was received over the socket
+    void                 dataReceived();
+    // Detect a socket error
+    void                 socketError(int error);
+
+  private : // Private attributes
+    // The mode of the transfer.
+    enum Mode          { NONE = 0, GETLOGINSERVER = 1, GETAUTHENTICATIONDATA = 2 } mode_;
+    // The list of parameters sent by the notification server
+    QString              authenticationParameters_;
+    // The cookies we received from the server
+    QStringList          cookies_;
+    // The user's handle
+    QString              handle_;
+    // The user's password
+    QString              password_;
+    // The socket over which the SSL data is written and read
+    KExtendedSocket     *socket_;
+    // The SSL handler
+    KSSL                *ssl_;
+
+  signals : // Public signals
+    // Signal that the login was aborted because an internal error occured
+    void                 loginFailed();
+    // Signal that the login failed, username/password was incorrect
+    void                 loginIncorrect();
+    // Signal that the login succeeded
+    void                 loginSucceeded( QString authentication );
+};
+
+#endif
