Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Evergreen:11.1:Test
kdenetwork4
bnc516347-kopete-yahoo16.diff
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File bnc516347-kopete-yahoo16.diff of Package kdenetwork4
diff -Naur kopete/kopete/kconf_update/CMakeLists.txt kopete/kopete/kconf_update/CMakeLists.txt --- kopete/kopete/kconf_update/CMakeLists.txt 2008-01-05 00:59:03.000000000 +0100 +++ kopete/kopete/kconf_update/CMakeLists.txt 2009-10-08 21:28:36.000000000 +0200 @@ -3,10 +3,9 @@ install(FILES kopete-account-kconf_update.upd kopete-jabberproxytype-kconf_update.upd kopete-jabberpriorityaddition-kconf_update.upd kopete-pluginloader2.upd DESTINATION ${KCONF_UPDATE_INSTALL_DIR}) endif(NOT WIN32) +install( FILES kopete-pluginloader.upd kopete-nameTracking.upd kopete-update_yahoo_server.upd DESTINATION ${KCONF_UPDATE_INSTALL_DIR}) -install( FILES kopete-pluginloader.upd kopete-nameTracking.upd DESTINATION ${KCONF_UPDATE_INSTALL_DIR}) - -install( PROGRAMS kopete-pluginloader.pl +install( PROGRAMS kopete-pluginloader.pl kopete-update_yahoo_server.pl kopete-account-0.10.pl DESTINATION ${KCONF_UPDATE_INSTALL_DIR}) diff -Naur kopete/protocols/yahoo/libkyahoo/logintask.cpp kopete/protocols/yahoo/libkyahoo/logintask.cpp --- kopete/protocols/yahoo/libkyahoo/logintask.cpp 2008-01-05 00:58:45.000000000 +0100 +++ kopete/protocols/yahoo/libkyahoo/logintask.cpp 2009-10-08 21:29:20.000000000 +0200 @@ -3,10 +3,10 @@ Handles logging into to the Yahoo service Copyright (c) 2004 Duncan Mac-Vicar P. <duncan@kde.org> - Copyright (c) 2005-2006 André Duffeck <duffeck@kde.org> + Copyright 2009 Matt Rogers <mattr@kde.org> - Kopete (c) 2002-2006 by the Kopete developers <kopete-devel@kde.org> + Kopete (c) 2002-2009 by the Kopete developers <kopete-devel@kde.org> ************************************************************************* * * @@ -28,6 +28,10 @@ #include <qstring.h> #include <kdebug.h> #include <stdlib.h> + +#include <QCryptographicHash> +#include <KDE/KJob> +#include <KDE/KIO/Job> extern "C" { #include "libyahoo.h" @@ -168,56 +172,201 @@ QString sn = t->firstParam( 1 ); QString seed = t->firstParam( 94 ); + m_challengeString = seed; QString version_s = t->firstParam( 13 ); - uint sessionID = t->id(); + m_sessionID = t->id(); int version = version_s.toInt(); switch (version) { case 0: - kDebug(YAHOO_RAW_DEBUG) << " Version pre 0x0b "<< version_s; - break; + case 1: + + case 2: + kDebug(YAHOO_RAW_DEBUG) << "Using version 16 authorization" << endl; + sendAuthSixteenStage1(sn, seed); + break; default: - kDebug(YAHOO_RAW_DEBUG) << " Version 0x0b "<< version_s; - sendAuthResp_0x0b(sn, seed, sessionID); - break; + kWarning(YAHOO_RAW_DEBUG) << "Unknown authentication method used!" + << "Attempting current authentication anyways"; + sendAuthSixteenStage1(sn, seed); + break; } mState = SentAuthResp; - emit haveSessionID( sessionID ); + emit haveSessionID( m_sessionID ); } -void LoginTask::sendAuthResp_0x0b(const QString &sn, const QString &seed, uint sessionID) +void LoginTask::sendAuthSixteenStage1(const QString& sn, const QString& seed) { - kDebug(YAHOO_RAW_DEBUG) << " with seed " << seed; - char *resp_6 = (char *) malloc(100); - char *resp_96 = (char *) malloc(100); - authresp_0x0b(seed.toLatin1(), sn.toLatin1(), (client()->password()).toLatin1(), resp_6, resp_96); - kDebug(YAHOO_RAW_DEBUG) << "resp_6: " << resp_6 << " resp_69: " << resp_96; - YMSGTransfer *t = new YMSGTransfer(Yahoo::ServiceAuthResp, m_stateOnConnect); - t->setId( sessionID ); - t->setParam( 0 , sn.toLocal8Bit()); - t->setParam( 2 , sn.toLocal8Bit()); - t->setParam( 6 , resp_6); - t->setParam( 96 , resp_96); -// t->setParam( 59 , "B\\tfckeert1kk1nl&b=2" ); // ??? - t->setParam( 135 , YMSG_PROGRAM_VERSION_STRING ); // Client version - t->setParam( 148 , -60 ); - t->setParam( 192 , client()->pictureChecksum() ); -// t->setParam( 244 , 524223 ); - t->setParam( 1 , sn.toLocal8Bit()); + const QString YahooTokenUrl = "https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=&login=%1&passwd=%2&chal=%3"; + kDebug(YAHOO_RAW_DEBUG) << "seed:" << seed; + m_stage1Data.clear(); + /* construct a URL from the seed and request tokens */ + QByteArray encodedUrl; + QString fullUrl = YahooTokenUrl.arg(sn, client()->password(), seed); + KUrl tokenUrl(fullUrl); + KIO::Job* job = KIO::get(tokenUrl, KIO::Reload, KIO::HideProgressInfo); + connect(job, SIGNAL(data(KIO::Job*, const QByteArray&)), + this, SLOT(handleAuthSixteenStage1Data(KIO::Job*, const QByteArray&))); + connect(job, SIGNAL(result(KJob*)), + this, SLOT(handleAuthSixteenStage1Result(KJob*))); +} - if( !m_verificationWord.isEmpty() ) +void LoginTask::handleAuthSixteenStage1Data(KIO::Job* job, const QByteArray& data) +{ + kDebug(YAHOO_RAW_DEBUG) << "data:" << data; + m_stage1Data.append(data); +} + +void LoginTask::handleAuthSixteenStage1Result(KJob* job) +{ + int responseNumber = -1; + QString token; + int error = job->error(); + kDebug(YAHOO_RAW_DEBUG) << "error:" << error; + if (error == 0) { - t->setParam( 227 , m_verificationWord.toLocal8Bit() ); - m_verificationWord.clear(); - } - - free(resp_6); - free(resp_96); - send(t); + QStringList responses = m_stage1Data.split("\r\n"); + if (responses.count() >= 3) + { + responseNumber = responses[0].toInt(); + token = responses[1]; + token.remove("ymsgr="); + kDebug(YAHOO_RAW_DEBUG) << "response is:" << responseNumber; + kDebug(YAHOO_RAW_DEBUG) << "token is:" << token; + } + + if (responseNumber != 0) + { + switch(responseNumber) + { + case -1: + /* error in the received stream */ + emit loginResponse(Yahoo::LoginSock, QString()); + kDebug(YAHOO_RAW_DEBUG) << "unknown error logging in"; + break; + case 1212: + /* password incorrect */ + emit loginResponse(Yahoo::LoginPasswd, QString()); + kDebug(YAHOO_RAW_DEBUG) << "password incorrect"; + break; + case 1213: + /* security lock */ + emit loginResponse(Yahoo::LoginLock, QString()); + break; + case 1235: + /* username does not exist */ + emit loginResponse(Yahoo::LoginUname, QString()); + kDebug(YAHOO_RAW_DEBUG) << "user does not exist"; + break; + case 1214: + case 1236: + emit loginResponse(Yahoo::LoginVerify, QString()); + break; + case 100: /* username or password missing */ + /*FIXME handle this */ + break; + default: + /* FIXME unknown error. handle it! */ + break; + } + } + else + { + /* start stage 2 here */ + sendAuthSixteenStage2(token); + } + } +} +void LoginTask::sendAuthSixteenStage2(const QString& token) +{ + const QString YahooLoginUrl = "https://login.yahoo.com/config/pwtoken_login?src=ymsgr&ts=&token=%1"; + kDebug(YAHOO_RAW_DEBUG) << "token:" << token; + m_stage2Data.clear(); + QString fullUrl = YahooLoginUrl.arg(token); + KUrl loginUrl(fullUrl); + KIO::Job* job = KIO::get(loginUrl, KIO::Reload, KIO::HideProgressInfo); + connect(job, SIGNAL(data(KIO::Job*, const QByteArray&)), + this, SLOT(handleAuthSixteenStage2Data(KIO::Job*, const QByteArray&))); + connect(job, SIGNAL(result(KJob*)), + this, SLOT(handleAuthSixteenStage2Result(KJob*))); +} + +void LoginTask::handleAuthSixteenStage2Data(KIO::Job*, const QByteArray& data) +{ + kDebug(YAHOO_RAW_DEBUG) << "data:" << data; + m_stage2Data.append(data); +} + +void LoginTask::handleAuthSixteenStage2Result(KJob* job) +{ + QString crumb; + int responseNumber = -1; + int error = job->error(); + kDebug(YAHOO_RAW_DEBUG) << "error:" << error; + if (error == 0) + { + QStringList responses = m_stage2Data.split("\r\n"); + kDebug(YAHOO_RAW_DEBUG) << responses; + responseNumber = responses[0].toInt(); + if (responseNumber == 0) + { + crumb = responses[1]; + crumb.remove("crumb="); + m_yCookie = responses[2].remove(0,2); /* remove Y= */ + m_tCookie = responses[3].remove(0,2); /* remove T= */ + } + + if (responseNumber != 0) + { + switch(responseNumber) + { + case -1: + emit loginResponse(Yahoo::LoginSock, QString()); + break; + case 100: + emit loginResponse(Yahoo::LoginSock, QString()); + break; + default: /* try to login anyways */ + break; + } + } + else + { + QString cryptString = crumb; + cryptString.append(m_challengeString); + sendAuthSixteenStage3(cryptString); + } + } +} + +void LoginTask::sendAuthSixteenStage3(const QString& cryptString) +{ + kDebug(YAHOO_RAW_DEBUG) << " with crypt string" << cryptString; + QByteArray cryptStringHash = QCryptographicHash::hash( cryptString.toAscii(), + QCryptographicHash::Md5 ); + cryptStringHash = cryptStringHash.toBase64(); + cryptStringHash = cryptStringHash.replace('+', '.'); + cryptStringHash = cryptStringHash.replace('/', '_'); + cryptStringHash = cryptStringHash.replace('=', '-'); + + YMSGTransfer *t = new YMSGTransfer(Yahoo::ServiceAuthResp, m_stateOnConnect); + t->setId( m_sessionID ); + t->setParam( 1, client()->userId().toLocal8Bit()); + t->setParam( 0 , client()->userId().toLocal8Bit()); + t->setParam( 277, m_yCookie.toLocal8Bit() ); + t->setParam( 278, m_tCookie.toLocal8Bit() ); + t->setParam( 307, cryptStringHash ); + t->setParam( 244, 2097087 ); + t->setParam( 2 , client()->userId().toLocal8Bit()); + t->setParam( 2, 1 ); // Both parameter 2s wind up in the packet + t->setParam( 135, YMSG_PROGRAM_VERSION_STRING ); + + send(t); + +} -} void LoginTask::sendAuthResp_pre_0x0b(const QString &/*sn*/, const QString &/*seed*/) { diff -Naur kopete/protocols/yahoo/libkyahoo/logintask.h kopete/protocols/yahoo/libkyahoo/logintask.h --- kopete/protocols/yahoo/libkyahoo/logintask.h 2008-01-05 00:58:45.000000000 +0100 +++ kopete/protocols/yahoo/libkyahoo/logintask.h 2009-10-08 21:29:20.000000000 +0200 @@ -26,6 +26,12 @@ class QString; class YMSGTransfer; +class KJob; + +namespace KIO +{ + class Job; +} /** @author Duncan Mac-Vicar @@ -58,6 +64,14 @@ void sendAuthResp_pre_0x0b(const QString &sn, const QString &seed); void handleAuthResp(YMSGTransfer *transfer); void parseCookies( YMSGTransfer *transfer ); + void sendAuthSixteenStage1(const QString& sn, const QString& seed); + void sendAuthSixteenStage2(const QString& token); + void sendAuthSixteenStage3(const QString& cryptString); + protected Q_SLOTS: + void handleAuthSixteenStage1Data(KIO::Job*, const QByteArray& data); + void handleAuthSixteenStage1Result(KJob*); + void handleAuthSixteenStage2Data(KIO::Job*, const QByteArray& data); + void handleAuthSixteenStage2Result(KJob*); signals: void haveSessionID( uint ); void haveCookies(); @@ -70,6 +84,10 @@ QString m_cCookie; QString m_loginCookie; QString m_verificationWord; + QString m_stage1Data; + QString m_stage2Data; + QString m_challengeString; + uint m_sessionID; }; #endif diff -Naur kopete/protocols/yahoo/yahooaccount.cpp kopete/protocols/yahoo/yahooaccount.cpp --- kopete/protocols/yahoo/yahooaccount.cpp 2008-10-30 14:23:46.000000000 +0100 +++ kopete/protocols/yahoo/yahooaccount.cpp 2009-10-08 21:29:32.000000000 +0200 @@ -521,7 +521,7 @@ return; } - QString server = configGroup()->readEntry( "Server", "scs.msg.yahoo.com" ); + QString server = configGroup()->readEntry( "Server", "scsa.msg.yahoo.com" ); int port = configGroup()->readEntry( "Port", 5050 ); initConnectionSignals( MakeConnections ); diff -Naur kopete/protocols/yahoo/yahooeditaccount.cpp kopete/protocols/yahoo/yahooeditaccount.cpp --- kopete/protocols/yahoo/yahooeditaccount.cpp 2008-10-30 14:23:46.000000000 +0100 +++ kopete/protocols/yahoo/yahooeditaccount.cpp 2009-10-08 21:29:32.000000000 +0200 @@ -63,9 +63,9 @@ mAutoConnect->setChecked(acct->excludeConnect()); mPasswordWidget->load( &acct->password() ); - QString pagerServer = account()->configGroup()->readEntry("Server", "scs.msg.yahoo.com"); + QString pagerServer = account()->configGroup()->readEntry("Server", "scsa.msg.yahoo.com"); int pagerPort = account()->configGroup()->readEntry("Port", 5050); - if( pagerServer != "scs.msg.yahoo.com" || pagerPort != 5050 ) + if( pagerServer != "scsa.msg.yahoo.com" || pagerPort != 5050 ) optionOverrideServer->setChecked( true ); else optionOverrideServer->setChecked( false ); @@ -133,7 +133,7 @@ } else { - yahooAccount->setServer( "scs.msg.yahoo.com" ); + yahooAccount->setServer( "scsa.msg.yahoo.com" ); yahooAccount->setPort( 5050 ); } --- kopete/kopete/kconf_update/kopete-update_yahoo_server.upd.orig 2010-11-17 23:29:16.000000000 +0100 +++ kopete/kopete/kconf_update/kopete-update_yahoo_server.upd 2010-11-17 23:28:54.000000000 +0100 @@ -0,0 +1,4 @@ +Id=kopete-update-yahoo-server/r1 +File=kopeterc +Options=overwrite +Script=kopete-update_yahoo_server.pl,perl --- kopete/kopete/kconf_update/kopete-update_yahoo_server.pl.orig 2010-11-17 23:29:08.000000000 +0100 +++ kopete/kopete/kconf_update/kopete-update_yahoo_server.pl 2010-11-17 23:28:54.000000000 +0100 @@ -0,0 +1,20 @@ +#!/usr/bin/perl + +# Rename the old Gaim style to Pidgin + +my $inYahoo = 0; +foreach (<>) { + $inYahoo = 1 if (/^\[Account_YahooProtocol_.*$/); + if ($inYahoo) { + if (/^Server\=(.*)/) { + my $oldServer = $1; + if ($oldServer =~ m/\.yahoo\.com$/) { + print "Server=scsa.msg.yahoo.com\n"; + $inYahoo = 0; + next; + } + } + } + + print $_; +}
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor