[prev in list] [next in list] [prev in thread] [next in thread]
List: kopete-devel
Subject: Re: [kopete-devel] [Bug 105929] password for MSN Messenger wrong
From: Catimimi <catimimi () libertysurf ! fr>
Date: 2005-05-22 17:58:53
Message-ID: 4290C85D.9060707 () libertysurf ! fr
[Download RAW message or body]
Nicolas Blais a écrit :
> ------- You are receiving this mail because: -------
> You are the assignee for the bug, or are watching the assignee.
>
> http://bugs.kde.org/show_bug.cgi?id=105929
>
>
>
>
> ------- Additional Comments From nb_root videotron ca 2005-05-22 19:29 -------
> I get this error when I try to compile kdenetwork with your patch:
> then mv -f ".deps/msnnotifysocket.Tpo" ".deps/msnnotifysocket.Plo"; else rm -f \
> ".deps/msnnotifysocket.Tpo"; exit 1; fi
> msnnotifysocket.cpp: In constructor `MSNNotifySocket::MSNNotifySocket(MSNAccount*, \
> const QString&, const QString&)': msnnotifysocket.cpp:52: error: invalid conversion \
> from `int' to `SslLoginHandler*' gmake[5]: *** [msnnotifysocket.lo] Error 1
> gmake[5]: Leaving directory \
> `/usr/ports/net/kdenetwork3/work/kdenetwork-3.4.0/kopete/protocols/msn' gmake[4]: \
> *** [all-recursive] Error 1 gmake[4]: Leaving directory \
> `/usr/ports/net/kdenetwork3/work/kdenetwork-3.4.0/kopete/protocols/msn' gmake[3]: \
> *** [all-recursive] Error 1 gmake[3]: Leaving directory \
> `/usr/ports/net/kdenetwork3/work/kdenetwork-3.4.0/kopete/protocols' gmake[2]: *** \
> [all-recursive] Error 1 gmake[2]: Leaving directory \
> `/usr/ports/net/kdenetwork3/work/kdenetwork-3.4.0/kopete' gmake[1]: *** \
> [all-recursive] Error 1 gmake[1]: Leaving directory \
> `/usr/ports/net/kdenetwork3/work/kdenetwork-3.4.0'
> gmake: *** [all] Error 2
> *** Error code 2
>
> Any solutions?
> _______________________________________________
> kopete-devel mailing list
> kopete-devel@kde.org
> https://mail.kde.org/mailman/listinfo/kopete-devel
>
>
Hello,
Yes, I reported yesterday that it seems that the modifications for file
Makefile.in
are missing in the patch. I rebuilt the patch against Branch 3.4 and it
works for me.
I enclose this modified patch.
Michel.
["kopete.diff" (text/x-patch)]
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
_______________________________________________
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