kopete/protocols/messenger/libpapillon
logintask.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #include "Papillon/Tasks/LoginTask"
00016
00017
00018 #include <QtCore/QStringList>
00019 #include <QtCore/QLatin1String>
00020 #include <QtDebug>
00021
00022
00023 #include "Papillon/NetworkMessage"
00024 #include "Papillon/Connection"
00025 #include "Papillon/Http/TweenerHandler"
00026 #include "Papillon/Client"
00027 #include "Papillon/UserContact"
00028
00029 namespace Papillon
00030 {
00031
00032 class LoginTask::Private
00033 {
00034 public:
00035 Private()
00036 : currentState(LoginTask::StateVersion)
00037 {}
00038
00039 LoginTask::LoginState currentState;
00040
00041
00042 QString currentTransactionId;
00043
00044 QString tweenerTicket;
00045 };
00046
00047 LoginTask::LoginTask(Task *parent)
00048 : Task(parent), d(new Private)
00049 {
00050 }
00051
00052 LoginTask::~LoginTask()
00053 {
00054 delete d;
00055 }
00056
00057 LoginTask::LoginState LoginTask::loginState() const
00058 {
00059 return d->currentState;
00060 }
00061
00062 bool LoginTask::take(NetworkMessage *networkMessage)
00063 {
00064 if( forMe(networkMessage) )
00065 {
00066 bool proceeded = false;
00067 switch(d->currentState)
00068 {
00069 case StateVersion:
00070 {
00071 if( networkMessage->command() == QLatin1String("VER") )
00072 {
00073 d->currentState = StateCVR;
00074 proceeded = true;
00075 sendCvrCommand();
00076 }
00077 break;
00078 }
00079 case StateCVR:
00080 {
00081 if( networkMessage->command() == QLatin1String("CVR") )
00082 {
00083 d->currentState = StateTweenerInvite;
00084 proceeded = true;
00085 sendTweenerInviteCommand();
00086 }
00087 break;
00088 }
00089 case StateTweenerInvite:
00090 {
00091 if( networkMessage->command() == QLatin1String("USR") )
00092 {
00093 if( networkMessage->arguments()[0] == QLatin1String("TWN") && networkMessage->arguments()[1] == QLatin1String("S") )
00094 {
00095 d->currentState = StateTweenerConfirmed;
00096
00097 QString tweener = networkMessage->arguments()[2];
00098 TweenerHandler *tweenerHandler = new TweenerHandler;
00099 tweenerHandler->setLoginInformation(tweener, passportId(), password());
00100 connect(tweenerHandler, SIGNAL(result( TweenerHandler* )), this, SLOT(ticketReceived( TweenerHandler* )));
00101 tweenerHandler->start();
00102
00103 proceeded = true;
00104 }
00105 }
00106 else if( networkMessage->command() == QLatin1String("XFR") )
00107 {
00108 QString newServer = networkMessage->arguments()[1].section(":", 0, 0);
00109 QString tempPort = networkMessage->arguments()[1].section(":", 1, 1);
00110 bool dummy;
00111 int newPort = tempPort.toUInt(&dummy);
00112
00113 d->currentState = StateRedirection;
00114 proceeded = true;
00115 emit redirection(newServer, newPort);
00116 }
00117 break;
00118 }
00119 case StateTweenerConfirmed:
00120 {
00121 if( networkMessage->command() == QLatin1String("USR") )
00122 {
00123 if( networkMessage->arguments()[0] == QLatin1String("OK") )
00124 {
00125 proceeded = true;
00126 d->currentState = StateFinish;
00127
00128 setSuccess();
00129 }
00130 }
00131 break;
00132 }
00133 default:
00134 return false;
00135 }
00136
00137 return proceeded;
00138 }
00139
00140 return false;
00141 }
00142
00143 bool LoginTask::forMe(NetworkMessage *networkMessage) const
00144 {
00145 if( networkMessage->type() == NetworkMessage::TransactionMessage )
00146 {
00147 if( networkMessage->transactionId() == d->currentTransactionId )
00148 return true;
00149 }
00150
00151 return false;
00152 }
00153
00154
00155 void LoginTask::onGo()
00156 {
00157 qDebug() << Q_FUNC_INFO << "Begin login process...";
00158
00159 sendVersionCommand();
00160 }
00161
00162 void LoginTask::sendVersionCommand()
00163 {
00164 qDebug() << Q_FUNC_INFO << "Sending version command.";
00165 NetworkMessage *versionNetworkMessage = new NetworkMessage(NetworkMessage::TransactionMessage);
00166 versionNetworkMessage->setCommand( QLatin1String("VER") );
00167
00168 d->currentTransactionId = QString::number( connection()->transactionId() );
00169 versionNetworkMessage->setTransactionId( d->currentTransactionId );
00170
00171 versionNetworkMessage->setArguments( QString("MSNP13 CVR0") );
00172
00173 send(versionNetworkMessage);
00174 }
00175
00176 void LoginTask::sendCvrCommand()
00177 {
00178 qDebug() << Q_FUNC_INFO << "Sending CVR command.";
00179 NetworkMessage *cvrMessage = new NetworkMessage(NetworkMessage::TransactionMessage);
00180 cvrMessage->setCommand( QLatin1String("CVR") );
00181
00182 d->currentTransactionId = QString::number( connection()->transactionId() );
00183 cvrMessage->setTransactionId( d->currentTransactionId );
00184
00185 QString arguments = QString("0x0409 winnt 5.1 i386 MSG80BETA 8.0.0689 msmsgs %1").arg( passportId() );
00186 cvrMessage->setArguments(arguments);
00187
00188 send(cvrMessage);
00189 }
00190
00191 void LoginTask::sendTweenerInviteCommand()
00192 {
00193 qDebug() << Q_FUNC_INFO << "Sending Tweener Invite Command";
00194 NetworkMessage *twnMessage = new NetworkMessage(NetworkMessage::TransactionMessage);
00195 twnMessage->setCommand("USR");
00196
00197 d->currentTransactionId = QString::number( connection()->transactionId() );
00198 twnMessage->setTransactionId( d->currentTransactionId );
00199
00200 QString arguments = QString("TWN I %1").arg( passportId() );
00201 twnMessage->setArguments(arguments);
00202
00203 send(twnMessage);
00204 }
00205
00206 void LoginTask::sendTweenerConfirmation()
00207 {
00208 qDebug() << Q_FUNC_INFO << "Sending Tweener confirmation command.";
00209 NetworkMessage *twnMessage = new NetworkMessage(NetworkMessage::TransactionMessage);
00210 twnMessage->setCommand("USR");
00211
00212 d->currentTransactionId = QString::number( connection()->transactionId() );
00213 twnMessage->setTransactionId( d->currentTransactionId );
00214
00215 QString arguments = QString("TWN S %1").arg(d->tweenerTicket);
00216 twnMessage->setArguments(arguments);
00217
00218 send(twnMessage);
00219 }
00220
00221 void LoginTask::ticketReceived(TweenerHandler *tweenerHandler)
00222 {
00223 if( tweenerHandler->success() )
00224 {
00225 d->tweenerTicket = tweenerHandler->ticket();
00226 tweenerHandler->deleteLater();
00227
00228 sendTweenerConfirmation();
00229 }
00230 else
00231 {
00232 d->currentState = LoginTask::StateBadPassword;
00233 setError();
00234 }
00235 }
00236
00237 QString LoginTask::passportId() const
00238 {
00239 return connection()->client()->userContact()->passportId();
00240 }
00241
00242 QString LoginTask::password() const
00243 {
00244 return connection()->client()->userContact()->password();
00245 }
00246
00247 }
00248
00249 #include "logintask.moc"