From c807f2e2bd50f5f8f734164a9b2781dfdca05cce Mon Sep 17 00:00:00 2001 From: rjarosz Date: Sat, 5 May 2007 20:27:41 +0000 Subject: [PATCH] Merge AIM/ICQ login tasks. Use MD5 based authorization in ICQ. Send closed connection FLAP. git-svn-id: svn://anonsvn.kde.org/home/kde/trunk/KDE/kdenetwork@661505 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- kopete/protocols/oscar/liboscar/CMakeLists.txt | 3 +- kopete/protocols/oscar/liboscar/client.cpp | 8 +- .../protocols/oscar/liboscar/connectionhandler.cpp | 5 + .../protocols/oscar/liboscar/connectionhandler.h | 6 ++ .../protocols/oscar/liboscar/oscarbytestream.cpp | 6 +- .../oscar/liboscar/tasks/closeconnectiontask.cpp | 86 ++++----------- .../oscar/liboscar/tasks/closeconnectiontask.h | 20 +--- .../oscar/liboscar/tasks/icqlogintask.cpp | 115 --------------------- .../protocols/oscar/liboscar/tasks/icqlogintask.h | 47 --------- .../protocols/oscar/liboscar/tasks/logintask.cpp | 70 +++++-------- kopete/protocols/oscar/liboscar/tasks/logintask.h | 13 ++- .../tasks/{aimlogintask.cpp => oscarlogintask.cpp} | 87 ++++++++-------- .../tasks/{aimlogintask.h => oscarlogintask.h} | 18 ++-- 13 files changed, 133 insertions(+), 351 deletions(-) delete mode 100644 kopete/protocols/oscar/liboscar/tasks/icqlogintask.cpp delete mode 100644 kopete/protocols/oscar/liboscar/tasks/icqlogintask.h rename kopete/protocols/oscar/liboscar/tasks/{aimlogintask.cpp => oscarlogintask.cpp} (74%) rename kopete/protocols/oscar/liboscar/tasks/{aimlogintask.h => oscarlogintask.h} (84%) diff --git a/kopete/protocols/oscar/liboscar/CMakeLists.txt b/kopete/protocols/oscar/liboscar/CMakeLists.txt index 2799fbdc9..271bc6e57 100644 --- a/kopete/protocols/oscar/liboscar/CMakeLists.txt +++ b/kopete/protocols/oscar/liboscar/CMakeLists.txt @@ -47,8 +47,7 @@ set(liboscar_SRCS xtrazxrandomizerservice.cpp tasks/task.cpp tasks/logintask.cpp - tasks/aimlogintask.cpp - tasks/icqlogintask.cpp + tasks/oscarlogintask.cpp tasks/closeconnectiontask.cpp tasks/serverversionstask.cpp tasks/rateinfotask.cpp diff --git a/kopete/protocols/oscar/liboscar/client.cpp b/kopete/protocols/oscar/liboscar/client.cpp index 95bd0b519..26a563f68 100644 --- a/kopete/protocols/oscar/liboscar/client.cpp +++ b/kopete/protocols/oscar/liboscar/client.cpp @@ -2,11 +2,12 @@ client.cpp - Kopete Oscar Protocol Copyright (c) 2004-2005 Matt Rogers + Copyright (c) 2007 Roman Jarosz Based on code Copyright (c) 2004 SuSE Linux AG Based on Iris, Copyright (C) 2003 Justin Karneges - Kopete (c) 2002-2005 by the Kopete developers + Kopete (c) 2002-2007 by the Kopete developers ************************************************************************* * * @@ -67,6 +68,7 @@ #include "oscarmessageplugin.h" #include "xtrazxtraznotify.h" #include "xtrazxawayservice.h" +#include "closeconnectiontask.h" namespace @@ -227,6 +229,10 @@ void Client::start( const QString &host, const uint port, const QString &userId, void Client::close() { + QList cList = d->connections.connections(); + for ( int i = 0; i < cList.size(); i++ ) + (new CloseConnectionTask( cList.at(i)->rootTask() ))->go( true ); + d->active = false; d->awayMsgRequestTimer->stop(); d->awayMsgRequestQueue.clear(); diff --git a/kopete/protocols/oscar/liboscar/connectionhandler.cpp b/kopete/protocols/oscar/liboscar/connectionhandler.cpp index 9a612a457..6bdbe92a0 100644 --- a/kopete/protocols/oscar/liboscar/connectionhandler.cpp +++ b/kopete/protocols/oscar/liboscar/connectionhandler.cpp @@ -111,6 +111,11 @@ Connection* ConnectionHandler::defaultConnection() const return d->connections.first(); } +QList ConnectionHandler::connections() const +{ + return d->connections; +} + void ConnectionHandler::addChatInfoForConnection( Connection* c, Oscar::WORD exchange, const QString& room ) { if ( d->connections.indexOf( c ) == -1 ) diff --git a/kopete/protocols/oscar/liboscar/connectionhandler.h b/kopete/protocols/oscar/liboscar/connectionhandler.h index 6094cab3c..657222940 100644 --- a/kopete/protocols/oscar/liboscar/connectionhandler.h +++ b/kopete/protocols/oscar/liboscar/connectionhandler.h @@ -78,6 +78,12 @@ public: Connection* defaultConnection() const; /** + * Get all connections. + * @return all connection objects + */ + QList connections() const; + + /** * Add chat room information to a connection so that we can track * connections by chat room * @param c The connection to add information to diff --git a/kopete/protocols/oscar/liboscar/oscarbytestream.cpp b/kopete/protocols/oscar/liboscar/oscarbytestream.cpp index 092235260..7e10836ed 100644 --- a/kopete/protocols/oscar/liboscar/oscarbytestream.cpp +++ b/kopete/protocols/oscar/liboscar/oscarbytestream.cpp @@ -86,7 +86,11 @@ KNetwork::KBufferedSocket *KNetworkByteStream::socket() const KNetworkByteStream::~KNetworkByteStream() { - delete mSocket; + // If socket is open than it has data in buffer, so delete socket later + if ( mSocket->isOpen() ) + QObject::connect( mSocket, SIGNAL(closed()), mSocket, SLOT(deleteLater()) ); + else + delete mSocket; } void KNetworkByteStream::slotConnected() diff --git a/kopete/protocols/oscar/liboscar/tasks/closeconnectiontask.cpp b/kopete/protocols/oscar/liboscar/tasks/closeconnectiontask.cpp index 9fc7f956d..c3d908eab 100644 --- a/kopete/protocols/oscar/liboscar/tasks/closeconnectiontask.cpp +++ b/kopete/protocols/oscar/liboscar/tasks/closeconnectiontask.cpp @@ -3,8 +3,9 @@ closeconnectiontask.h - Handles the closing of the connection to the server Copyright (c) 2004 Matt Rogers + Copyright (c) 2007 Roman Jarosz - Kopete (c) 2002-2004 by the Kopete developers + Kopete (c) 2002-2007 by the Kopete developers ************************************************************************* * * @@ -38,93 +39,36 @@ CloseConnectionTask::~CloseConnectionTask() { } -const QByteArray& CloseConnectionTask::cookie() const -{ - return m_cookie; -} - -const QString& CloseConnectionTask::bosHost() const -{ - return m_bosHost; -} - -const QString& CloseConnectionTask::bosPort() const -{ - return m_bosPort; -} - bool CloseConnectionTask::take( Transfer* transfer ) { - QString errorReason; - Oscar::WORD errorNum = 0; if ( forMe( transfer ) ) { kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "RECV (DISCONNECT)" << endl; FlapTransfer* ft = dynamic_cast ( transfer ); - + if ( !ft ) { kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Could not convert transfer object to type FlapTransfer!!" << endl; return false; } - + QList tlvList = ft->buffer()->getTLVList(); - - TLV uin = findTLV( tlvList, 0x0001 ); - if ( uin ) - { - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "found TLV(1) [UIN], uin=" << QString( uin.data ) << endl; - } - - TLV err = findTLV( tlvList, 0x0008 ); - if ( !err ) - err = findTLV( tlvList, 0x0009 ); - if ( err.type == 0x0008 || err.type == 0x0009 ) + TLV err = findTLV( tlvList, 0x0009 ); + if ( err ) { - errorNum = ( ( err.data[0] << 8 ) | err.data[1] ); - + Oscar::WORD errorNum = ( ( err.data[0] << 8 ) | err.data[1] ); + kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "found TLV(8) [ERROR] error= " << errorNum << endl; - + Oscar::SNAC s = { 0, 0, 0, 0 }; client()->fatalTaskError( s, errorNum ); return true; //if there's an error, we'll need to disconnect anyways } - TLV server = findTLV( tlvList, 0x0005 ); - if ( server ) - { - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "found TLV(5) [SERVER] " << QString( server.data ) << endl; - QString ip = server.data; - int index = ip.indexOf( ':' ); - m_bosHost = ip.left( index ); - ip.remove( 0 , index+1 ); //get rid of the colon and everything before it - m_bosPort = ip; - } - - TLV cookie = findTLV( tlvList, 0x0006 ); - if ( cookie ) - { - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "found TLV(6) [COOKIE]" << endl; - m_cookie = cookie.data; - } - - tlvList.clear(); - - if ( m_bosHost.isEmpty() ) - { - kWarning(OSCAR_RAW_DEBUG) << k_funcinfo << "Empty host address!" << endl; - - Oscar::SNAC s = { 0, 0, 0, 0 }; - client()->fatalTaskError( s, 0 ); - return true; - } - - kDebug( OSCAR_RAW_DEBUG ) << k_funcinfo << "We should reconnect to server '" - << m_bosHost << "' on port " << m_bosPort << endl; - setSuccess( errorNum, errorReason ); + setSuccess( 0, QString() ); return true; } return false; @@ -143,4 +87,14 @@ bool CloseConnectionTask::forMe( const Transfer* transfer ) const return false; } +void CloseConnectionTask::onGo() +{ + FLAP f = { 0x04, 0, 0 }; + + Transfer* ft = createTransfer( f, new Buffer() ); + kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Sending channel 0x04 close packet" << endl; + send( ft ); + setSuccess( 0, QString() ); +} + //kate: tab-width 4; indent-mode csands; diff --git a/kopete/protocols/oscar/liboscar/tasks/closeconnectiontask.h b/kopete/protocols/oscar/liboscar/tasks/closeconnectiontask.h index a9f0993d3..e5b1317bd 100644 --- a/kopete/protocols/oscar/liboscar/tasks/closeconnectiontask.h +++ b/kopete/protocols/oscar/liboscar/tasks/closeconnectiontask.h @@ -3,8 +3,9 @@ closeconnectiontask.h - Handles the closing of the connection to the server Copyright (c) 2004 Matt Rogers + Copyright (c) 2007 Roman Jarosz - Kopete (c) 2002-2004 by the Kopete developers + Kopete (c) 2002-2007 by the Kopete developers ************************************************************************* * * @@ -22,7 +23,6 @@ #include class Transfer; -class QString; /** @author Matt Rogers @@ -35,25 +35,11 @@ public: ~CloseConnectionTask(); virtual bool take(Transfer* transfer); - - //Protocol specific stuff - const QByteArray& cookie() const; - const QString& bosHost() const; - const QString& bosPort() const; - protected: virtual bool forMe(const Transfer* transfer) const; + virtual void onGo(); -private: - bool parseDisconnectCode( int error, QString& reason ); - -private: - QByteArray m_cookie; - QString m_bosHost; - QString m_bosPort; - - }; #endif diff --git a/kopete/protocols/oscar/liboscar/tasks/icqlogintask.cpp b/kopete/protocols/oscar/liboscar/tasks/icqlogintask.cpp deleted file mode 100644 index 2710df921..000000000 --- a/kopete/protocols/oscar/liboscar/tasks/icqlogintask.cpp +++ /dev/null @@ -1,115 +0,0 @@ -/* - Kopete Oscar Protocol - icqlogintask.cpp - Handles logging into to the ICQ service - - Copyright (c) 2004 Matt Rogers - - Kopete (c) 2002-2004 by the Kopete developers - - ************************************************************************* - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public * - * License as published by the Free Software Foundation; either * - * version 2 of the License, or (at your option) any later version. * - * * - ************************************************************************* -*/ - -#include "icqlogintask.h" - -#include -#include -#include "transfer.h" -#include "connection.h" -#include "oscarutils.h" - -using namespace Oscar; - -IcqLoginTask::IcqLoginTask( Task* parent ) - : Task( parent ) -{ -} - -IcqLoginTask::~IcqLoginTask() -{ -} - -bool IcqLoginTask::take( Transfer* transfer ) -{ - Q_UNUSED( transfer ); - return false; -} - -bool IcqLoginTask::forMe( Transfer* transfer ) const -{ - //there shouldn't be a incoming transfer for this task - Q_UNUSED( transfer ); - return false; -} - -void IcqLoginTask::onGo() -{ - FLAP f = { 0x01, 0, 0 }; - Oscar::DWORD flapVersion = 0x00000001; - Buffer *outbuf = new Buffer(); - - QString encodedPassword = encodePassword( client()->password() ); - - const Oscar::ClientVersion* version = client()->version(); - outbuf->addDWord( flapVersion ); - outbuf->addTLV( 0x0001, client()->userId().toLatin1() ); - outbuf->addTLV( 0x0002, encodedPassword.toLatin1() ); - outbuf->addTLV( 0x0003, version->clientString.toLatin1() ); - outbuf->addTLV16( 0x0016, version->clientId ); - outbuf->addTLV16( 0x0017, version->major ); - outbuf->addTLV16( 0x0018, version->minor ); - outbuf->addTLV16( 0x0019, version->point ); - outbuf->addTLV16(0x001a, version->build ); - outbuf->addTLV32( 0x0014, version->other ); - outbuf->addTLV( 0x000f, version->lang.toLatin1() ); - outbuf->addTLV( 0x000e, version->country.toLatin1() ); - - Transfer* ft = createTransfer( f, outbuf ); - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Sending ICQ channel 0x01 login packet" << endl; - send( ft ); - emit finished(); -} - - -QString IcqLoginTask::encodePassword( const QString& loginPassword ) -{ - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Called." << endl; - - // TODO: check if latin1 is the right conversion - QByteArray password = loginPassword.toLatin1(); - - const uint MAX_PASSWORD_SIZE = 8; - unsigned int i = 0; - QString encodedPassword; - - //encoding table used in ICQ password XOR transformation - unsigned char encoding_table[] = - { - 0xf3, 0x26, 0x81, 0xc4, - 0x39, 0x86, 0xdb, 0x92, - 0x71, 0xa3, 0xb9, 0xe6, - 0x53, 0x7a, 0x95, 0x7c - }; - - const uint size = qMin( (uint)password.size(), MAX_PASSWORD_SIZE ); - for (i = 0; i < size; i++) - encodedPassword.append( password.at(i) ^ encoding_table[i] ); - -#ifdef OSCAR_PWDEBUG - kDebug(OSCAR_RAW_DEBUG) << " plaintext pw='" << loginPassword << "', length=" << - loginPassword.length() << endl; - - kDebug(OSCAR_RAW_DEBUG) << " encoded pw='" << encodedPassword << "', length=" << - encodedPassword.length() << endl; -#endif - - return encodedPassword; -} - -#include "icqlogintask.moc" diff --git a/kopete/protocols/oscar/liboscar/tasks/icqlogintask.h b/kopete/protocols/oscar/liboscar/tasks/icqlogintask.h deleted file mode 100644 index 45fb3eb60..000000000 --- a/kopete/protocols/oscar/liboscar/tasks/icqlogintask.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - Kopete Oscar Protocol - icqlogintask.h - Handles logging into to the ICQ service - - Copyright (c) 2004 Matt Rogers - - Kopete (c) 2002-2004 by the Kopete developers - - ************************************************************************* - * * - * This library is free software; you can redistribute it and/or * - * modify it under the terms of the GNU Lesser General Public * - * License as published by the Free Software Foundation; either * - * version 2 of the License, or (at your option) any later version. * - * * - ************************************************************************* -*/ - -#ifndef _OSCAR_ICQLOGINTASK_H_ -#define _OSCAR_ICQLOGINTASK_H_ - -#include -#include - -class QString; -class Transfer; - -using namespace Oscar; - -class IcqLoginTask : public Task -{ -Q_OBJECT -public: - IcqLoginTask( Task* parent ); - ~IcqLoginTask(); - bool take( Transfer* transfer ); - virtual void onGo(); - -protected: - bool forMe( Transfer* transfer ) const; - -private: - QString encodePassword( const QString& pw ); - -}; - -#endif diff --git a/kopete/protocols/oscar/liboscar/tasks/logintask.cpp b/kopete/protocols/oscar/liboscar/tasks/logintask.cpp index 6f780b9fb..91c04ace5 100644 --- a/kopete/protocols/oscar/liboscar/tasks/logintask.cpp +++ b/kopete/protocols/oscar/liboscar/tasks/logintask.cpp @@ -3,8 +3,9 @@ logintask.cpp - Handles logging into to the AIM or ICQ service Copyright (c) 2004 Matt Rogers + Copyright (c) 2007 Roman Jarosz - Kopete (c) 2002-2004 by the Kopete developers + Kopete (c) 2002-2007 by the Kopete developers ************************************************************************* * * @@ -22,10 +23,9 @@ #include #include -#include "aimlogintask.h" #include "connection.h" #include "closeconnectiontask.h" -#include "icqlogintask.h" +#include "oscarlogintask.h" #include "oscarutils.h" #include "rateinfotask.h" #include "serverversionstask.h" @@ -40,15 +40,13 @@ StageOneLoginTask::StageOneLoginTask( Task* parent ) : Task ( parent ) { - m_aimTask = 0L; - m_icqTask = 0L; + m_loginTask = 0L; m_closeTask = 0L; } StageOneLoginTask::~StageOneLoginTask() { - delete m_aimTask; - delete m_icqTask; + delete m_loginTask; delete m_closeTask; } @@ -56,33 +54,22 @@ bool StageOneLoginTask::take( Transfer* transfer ) { if ( forMe( transfer ) ) { - if ( client()->isIcq() ) - { - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Starting ICQ login" << endl; - m_icqTask = new IcqLoginTask( client()->rootTask() ); - m_closeTask = new CloseConnectionTask( client()->rootTask() ); - - //connect finished signal - connect( m_closeTask, SIGNAL( finished() ), this, SLOT( closeTaskFinished() ) ); - m_icqTask->go( true ); - } - else - { - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Starting AIM login" << endl; - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Sending the FLAP version back" << endl; - - //send the flap version response - FLAP f = { 0x01, 0 , 0 }; - Buffer *outbuf = new Buffer; - outbuf->addDWord(0x00000001); //flap version - f.length = outbuf->length(); - Transfer* ft = createTransfer( f, outbuf ); - send( ft ); - - m_aimTask = new AimLoginTask( client()->rootTask() ); - connect( m_aimTask, SIGNAL( finished() ), this, SLOT( aimTaskFinished() ) ); - m_aimTask->go( true ); - } + kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Starting login" << endl; + kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Sending the FLAP version back" << endl; + + //send the flap version response + FLAP f = { 0x01, 0 , 0 }; + Buffer *outbuf = new Buffer; + outbuf->addDWord(0x00000001); //flap version + f.length = outbuf->length(); + Transfer* ft = createTransfer( f, outbuf ); + send( ft ); + + m_loginTask = new OscarLoginTask( client()->rootTask() ); + m_closeTask = new CloseConnectionTask( client()->rootTask() ); + connect( m_loginTask, SIGNAL(finished()), this, SLOT(loginTaskFinished()) ); + connect( m_closeTask, SIGNAL(finished()), this, SLOT(closeTaskFinished()) ); + m_loginTask->go( true ); return true; } return false; @@ -91,21 +78,16 @@ bool StageOneLoginTask::take( Transfer* transfer ) void StageOneLoginTask::closeTaskFinished() { kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << endl; - m_cookie = m_closeTask->cookie(); - m_bosPort = m_closeTask->bosPort(); - m_bosServer = m_closeTask->bosHost(); - m_closeTask->safeDelete(); setSuccess( m_closeTask->statusCode(), m_closeTask->statusString() ); } -void StageOneLoginTask::aimTaskFinished() +void StageOneLoginTask::loginTaskFinished() { kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << endl; - m_cookie = m_aimTask->cookie(); - m_bosPort = m_aimTask->bosPort(); - m_bosServer = m_aimTask->bosHost(); - - setSuccess( m_aimTask->statusCode(), m_aimTask->statusString() ); + m_cookie = m_loginTask->cookie(); + m_bosPort = m_loginTask->bosPort(); + m_bosServer = m_loginTask->bosHost(); + m_loginTask = 0L; } bool StageOneLoginTask::forMe( Transfer* transfer ) const diff --git a/kopete/protocols/oscar/liboscar/tasks/logintask.h b/kopete/protocols/oscar/liboscar/tasks/logintask.h index 881f5c61d..8bf8b3098 100644 --- a/kopete/protocols/oscar/liboscar/tasks/logintask.h +++ b/kopete/protocols/oscar/liboscar/tasks/logintask.h @@ -3,8 +3,9 @@ logintask.h - Handles logging into to the AIM or ICQ service Copyright (c) 2004 Matt Rogers + Copyright (c) 2007 Roman Jarosz - Kopete (c) 2002-2004 by the Kopete developers + Kopete (c) 2002-2007 by the Kopete developers ************************************************************************* * * @@ -22,9 +23,8 @@ #include "oscartypes.h" #include "task.h" -#include "aimlogintask.h" -#include "icqlogintask.h" -#include "closeconnectiontask.h" +class OscarLoginTask; +class CloseConnectionTask; using namespace Oscar; @@ -68,7 +68,7 @@ public: public slots: void closeTaskFinished(); - void aimTaskFinished(); + void loginTaskFinished(); protected: bool forMe( Transfer* transfer ) const; @@ -76,8 +76,7 @@ protected: private: //Tasks we want to control - AimLoginTask* m_aimTask; - IcqLoginTask* m_icqTask; + OscarLoginTask* m_loginTask; CloseConnectionTask* m_closeTask; //Private data we get from the tasks diff --git a/kopete/protocols/oscar/liboscar/tasks/aimlogintask.cpp b/kopete/protocols/oscar/liboscar/tasks/oscarlogintask.cpp similarity index 74% rename from kopete/protocols/oscar/liboscar/tasks/aimlogintask.cpp rename to kopete/protocols/oscar/liboscar/tasks/oscarlogintask.cpp index f61fe6d61..5849dffaa 100644 --- a/kopete/protocols/oscar/liboscar/tasks/aimlogintask.cpp +++ b/kopete/protocols/oscar/liboscar/tasks/oscarlogintask.cpp @@ -1,10 +1,11 @@ /* Kopete Oscar Protocol - aimlogintask.h - Handles logging into to the AIM service + oscarlogintask.h - Handles logging into to the OSCAR service Copyright (c) 2004 Matt Rogers + Copyright (c) 2007 Roman Jarosz - Kopete (c) 2002-2004 by the Kopete developers + Kopete (c) 2002-2007 by the Kopete developers ************************************************************************* * * @@ -15,7 +16,7 @@ * * ************************************************************************* */ -#include "aimlogintask.h" +#include "oscarlogintask.h" #include #include @@ -29,16 +30,16 @@ using namespace Oscar; -AimLoginTask::AimLoginTask( Task* parent ) +OscarLoginTask::OscarLoginTask( Task* parent ) : Task ( parent ) { } -AimLoginTask::~AimLoginTask() +OscarLoginTask::~OscarLoginTask() { } -void AimLoginTask::onGo() +void OscarLoginTask::onGo() { //send Snac 17,06 sendAuthStringRequest(); @@ -46,7 +47,7 @@ void AimLoginTask::onGo() connect( this, SIGNAL( haveAuthKey() ), this, SLOT( sendLoginRequest() ) ); } -bool AimLoginTask::forMe( Transfer* transfer ) const +bool OscarLoginTask::forMe( Transfer* transfer ) const { SnacTransfer* st = dynamic_cast( transfer ); @@ -72,22 +73,22 @@ bool AimLoginTask::forMe( Transfer* transfer ) const return false; } -const QByteArray& AimLoginTask::cookie() const +const QByteArray& OscarLoginTask::cookie() const { return m_cookie; } -const QString& AimLoginTask::bosHost() const +const QString& OscarLoginTask::bosHost() const { return m_bosHost; } -const QString& AimLoginTask::bosPort() const +const QString& OscarLoginTask::bosPort() const { return m_bosPort; } -bool AimLoginTask::take( Transfer* transfer ) +bool OscarLoginTask::take( Transfer* transfer ) { if ( forMe( transfer ) ) { @@ -120,7 +121,7 @@ bool AimLoginTask::take( Transfer* transfer ) return false; } -void AimLoginTask::sendAuthStringRequest() +void OscarLoginTask::sendAuthStringRequest() { kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "SEND CLI_AUTH_REQUEST, sending login request" << endl; @@ -130,30 +131,22 @@ void AimLoginTask::sendAuthStringRequest() Buffer* outbuf = new Buffer; outbuf->addTLV(0x0001, client()->userId().toLatin1() ); - outbuf->addDWord(0x004B0000); // empty TLV 0x004B - outbuf->addDWord(0x005A0000); // empty TLV 0x005A Transfer* st = createTransfer( f, s, outbuf ); send( st ); } -QByteArray AimLoginTask::parseAuthString( Buffer* b ) +void OscarLoginTask::processAuthStringReply() { - Oscar::WORD keylength = b->getWord(); - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Key length is " << keylength << endl; - QByteArray authString = b->getBlock( keylength ); - return authString; -} + kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Got the authorization key" << endl; + Buffer* b = transfer()->buffer(); + m_authKey = b->getBSTR(); -void AimLoginTask::processAuthStringReply() -{ - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "Got the authorization key" << endl; - m_authKey = parseAuthString( transfer()->buffer() ); emit haveAuthKey(); } -void AimLoginTask::sendLoginRequest() +void OscarLoginTask::sendLoginRequest() { kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "SEND (CLI_MD5_LOGIN) sending AIM login" << endl; @@ -178,14 +171,17 @@ void AimLoginTask::sendLoginRequest() outbuf->addTLV(0x000f, version->lang.toLatin1() ); outbuf->addTLV(0x000e, version->country.toLatin1() ); - //if set, old-style buddy lists will not work... you will need to use SSI - outbuf->addTLV8(0x004a,0x01); + if ( !client()->isIcq() ) + { + //if set, old-style buddy lists will not work... you will need to use SSI + outbuf->addTLV8(0x004a,0x01); + } Transfer *st = createTransfer( f, s, outbuf ); send( st ); } -void AimLoginTask::handleLoginResponse() +void OscarLoginTask::handleLoginResponse() { kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "RECV SNAC 0x17, 0x07 - AIM Login Response" << endl; @@ -193,7 +189,7 @@ void AimLoginTask::handleLoginResponse() if ( !st ) { - setError( -1 , QString::null ); + setError( -1 , QString() ); return; } @@ -205,31 +201,27 @@ void AimLoginTask::handleLoginResponse() kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "found TLV(1) [SN], SN=" << QString( uin.data ) << endl; } - TLV err = findTLV( tlvList, 0x0008 ); - + TLV err = findTLV( tlvList, 0x0008 ); if ( err ) { Oscar::WORD errorNum = ( ( err.data[0] << 8 ) | err.data[1] ); - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << k_funcinfo << "found TLV(8) [ERROR] error= " << - errorNum << endl; + kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "found TLV(8) [ERROR] error= " << errorNum << endl; Oscar::SNAC s = { 0, 0, 0, 0 }; client()->fatalTaskError( s, errorNum ); - setError( errorNum, QString::null ); + setError( errorNum, QString() ); return; //if there's an error, we'll need to disconnect anyways } TLV server = findTLV( tlvList, 0x0005 ); if ( server ) { + kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "found TLV(5) [SERVER] " << QString( server.data ) << endl; QString ip = QString( server.data ); - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "found TLV(5) [SERVER] " << ip << endl; int index = ip.indexOf( ':' ); m_bosHost = ip.left( index ); ip.remove( 0 , index+1 ); //get rid of the colon and everything before it - m_bosPort = ip.left(4); //we only need 4 bytes - kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "We should reconnect to server '" << m_bosHost << - "' on port " << m_bosPort << endl; + m_bosPort = ip; } TLV cookie = findTLV( tlvList, 0x0006 ); @@ -237,12 +229,25 @@ void AimLoginTask::handleLoginResponse() { kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << "found TLV(6) [COOKIE]" << endl; m_cookie = cookie.data; - setSuccess( 0, QString::null ); } tlvList.clear(); + + if ( m_bosHost.isEmpty() ) + { + kWarning(OSCAR_RAW_DEBUG) << k_funcinfo << "Empty host address!" << endl; + + Oscar::SNAC s = { 0, 0, 0, 0 }; + client()->fatalTaskError( s, 0 ); + setError( 0, QString() ); + return; + } + + kDebug( OSCAR_RAW_DEBUG ) << k_funcinfo << "We should reconnect to server '" + << m_bosHost << "' on port " << m_bosPort << endl; + setSuccess( 0, QString() ); } -void AimLoginTask::encodePassword( QByteArray& digest ) const +void OscarLoginTask::encodePassword( QByteArray& digest ) const { kDebug(OSCAR_RAW_DEBUG) << k_funcinfo << endl; md5_state_t state; @@ -255,4 +260,4 @@ void AimLoginTask::encodePassword( QByteArray& digest ) const //kate: indent-mode csands; tab-width 4; replace-tabs off; indent-spaces off; -#include "aimlogintask.moc" +#include "oscarlogintask.moc" diff --git a/kopete/protocols/oscar/liboscar/tasks/aimlogintask.h b/kopete/protocols/oscar/liboscar/tasks/oscarlogintask.h similarity index 84% rename from kopete/protocols/oscar/liboscar/tasks/aimlogintask.h rename to kopete/protocols/oscar/liboscar/tasks/oscarlogintask.h index 917422d89..0b0cc59be 100644 --- a/kopete/protocols/oscar/liboscar/tasks/aimlogintask.h +++ b/kopete/protocols/oscar/liboscar/tasks/oscarlogintask.h @@ -1,10 +1,11 @@ /* Kopete Oscar Protocol - aimlogintask.h - Handles logging into to the AIM service + oscarlogintask.h - Handles logging into to the OSCAR service Copyright (c) 2004 Matt Rogers + Copyright (c) 2007 Roman Jarosz - Kopete (c) 2002-2004 by the Kopete developers + Kopete (c) 2002-2007 by the Kopete developers ************************************************************************* * * @@ -16,19 +17,19 @@ ************************************************************************* */ -#ifndef _OSCAR_AIMLOGINTASK_H_ -#define _OSCAR_AIMLOGINTASK_H_ +#ifndef OSCARLOGINTASK_H +#define OSCARLOGINTASK_H #include "task.h" using namespace Oscar; -class AimLoginTask : public Task +class OscarLoginTask : public Task { Q_OBJECT public: - AimLoginTask( Task* parent ); - ~AimLoginTask(); + OscarLoginTask( Task* parent ); + ~OscarLoginTask(); bool take( Transfer* transfer ); virtual void onGo(); @@ -37,9 +38,6 @@ public: const QString& bosHost() const; const QString& bosPort() const; - static QByteArray parseAuthString( Buffer* ); - - protected: bool forMe( Transfer* transfer ) const; -- 2.11.4.GIT