175{
176 QString
message(
"\n\nVP1Authenticator done. STAGE " + QString::number(
m_d->stage) +
"\n");
177
178 QUrl redirectionUrl;
179 QList<QNetworkCookie> cookielist;
180
181
182
183
184 QVariant
val =
m_d->m_netreply->header(QNetworkRequest::SetCookieHeader);
185 if(
val.type()==QVariant::Invalid) {
186 message += QString(
" No set cookies\n");
187 }
else if (!
val.canConvert<QList<QNetworkCookie> >()){
188 message += QString(
" Cannot convert to the list of cookies\n");
189 } else {
190 cookielist =
val.value<QList<QNetworkCookie> >();
191 for(int ii=0; ii<cookielist.size(); ++ii) {
192 const QNetworkCookie& cookie = cookielist.at(ii);
193 message += (
" Received cookie #" + QString::number(ii) +
"\n");
194 message += (
" *** Path: " + cookie.path() +
"\n");
195 message += (
" *** Domain: " + cookie.domain() +
"\n");
196 message += (QString(
" *** Secure: ") + (cookie.isSecure() ?
"YES" :
"NO") +
"\n");
197 message += (QString(
" *** Session: ") + (cookie.isSessionCookie() ?
"YES" :
"NO") +
"\n");
198 message += (
" *** Name: " + QString(cookie.name().constData()) +
"\n");
199 message += (
" *** Value: " + QString(cookie.value().constData()) +
"\n");
200 }
201 }
202
203 val =
m_d->m_netreply->header(QNetworkRequest::ContentTypeHeader);
204 if(
val.type()==QVariant::Invalid) {
205 message += QString(
" No ContentType\n");
206 }
else if (!
val.canConvert<QString>()) {
207 message += QString(
" Cannot convert Content Type to String\n");
208 } else {
209 QString conttype =
val.value<QString>();
210 message += QString(
" Content type: " + conttype +
"\n");
211 }
212
213 val =
m_d->m_netreply->header(QNetworkRequest::ContentLengthHeader);
214 if(
val.type()==QVariant::Invalid) {
215 message += QString(
" No ContentLength\n");
216 }
else if (!
val.canConvert<
int>()) {
217 message += QString(
" Cannot convert Content Length to int\n");
218 } else {
219 int contlength =
val.value<
int>();
220 message += QString(
" Content Length: " + QString::number(contlength) +
"\n");
221 }
222
223 val =
m_d->m_netreply->header(QNetworkRequest::LocationHeader);
224 if(
val.type()==QVariant::Invalid) {
225 message += QString(
" No Location\n");
226 }
else if (!
val.canConvert<QUrl>()) {
227 message += QString(
" Cannot convert Content Length to QUrl\n");
228 } else {
229 QUrl
url =
val.value<QUrl>();
230 message += QString(
" Location URL " +
url.toString() +
"\n");
231 }
232
233
234 val =
m_d->m_netreply->attribute(QNetworkRequest::HttpStatusCodeAttribute);
235 if(
val.type()==QVariant::Invalid) {
236 message += QString(
" No StatusCode Attribute\n");
237 }
else if (!
val.canConvert<
int>()) {
238 message += QString(
" Cannot convert StatusCode to int\n");
239 } else {
240 int sc =
val.value<
int>();
241 message += QString(
" StatusCode : " +QString::number(
sc) +
"\n");
242 }
243
244 val =
m_d->m_netreply->attribute(QNetworkRequest::RedirectionTargetAttribute);
245 if(
val.type()==QVariant::Invalid) {
246 message += QString(
" No Redirection Attribute\n");
247 }
else if (!
val.canConvert<QUrl>()) {
248 message += QString(
" Cannot convert Redirection to QUrl\n");
249 } else {
250 redirectionUrl =
val.value<QUrl>();
251 message += QString(
" Redirection : " + redirectionUrl.toString() +
"\n");
252 }
253
254 message += QString(
"\n HTML response >>>>>\n");
255
256 QByteArray logMessage(
message.toStdString().c_str());
257
258
259 QByteArray ba =
m_d->m_netreply->readAll();
260 logMessage = logMessage.append(ba);
261 logMessage = logMessage.append("\n<<<<< HTML response\n\n\n");
263 m_d->m_log->write(logMessage);
264
265
266
267
268
269
270
271
273 QString replyBody(ba.data());
274 if(replyBody.contains("authorization failed", Qt::CaseInsensitive)) {
275 QString errMessage("Authorization Failed");
276 m_d->displayError(errMessage);
277 m_d->m_netmanager->deleteLater();
278 m_d->m_netmanager =
new QNetworkAccessManager();
281 return;
282 }
283
284 if(
m_d->m_netreply->error()==QNetworkReply::NoError)
286 }
287
288
289 if(
m_d->m_netreply->error()!=QNetworkReply::NoError) {
290 QString errMessage("Network error occured during authentication phase\n");
291 errMessage += QString(
"Error code " + QString::number((
int)
m_d->m_netreply->error()) +
"\nExplanation on http://doc.trolltech.com/4.4/qnetworkreply.html#NetworkError-enum");
292 m_d->displayError(errMessage);
294 return;
295 }
296
297
298
299
301 if(redirectionUrl.isEmpty() || redirectionUrl.host() !=
m_d->m_loginServer) {
302 QString errMessage(
"Wrong URL: " +
m_d->m_fileInfoUrl +
"\nPlease fix the URL and restart the job");
303 m_d->displayError(errMessage);
305 return;
306 } else {
307 QNetworkRequest netrequest(redirectionUrl);
308 m_d->m_netreply =
m_d->m_netmanager->get(netrequest);
310 QByteArray baLog("Get request sent\n_______________________________________________________\n\n");
311 m_d->m_log->write(baLog);
312 }
313 m_d->connectToAuthenticator(
this);
315 return;
316 }
317 }
318
319
320
321
322
324 QString replyBody(ba.data());
325
326 QString newRequestBody("__EVENTTARGET=&__EVENTARGUMENT=&__LASTFOCUS=");
327
328 QStringMatcher inputStartMatcher("<input ",Qt::CaseInsensitive);
329 QStringMatcher inputEndMatcher("/>");
330
331 int inputStart = inputStartMatcher.indexIn(replyBody,0);
332
333 while(inputStart!=-1) {
334 int inputEnd = inputEndMatcher.indexIn(replyBody,inputStart+inputStartMatcher.pattern().size());
335 if(inputEnd==-1)
336 break;
337 else {
338
339 QString
tag = replyBody.mid(inputStart,inputEnd-inputStart);
340 QString typeVal =
m_d->getTagAttributeVal(tag,
"type");
341 QString nameVal =
m_d->getTagAttributeVal(tag,
"name");
342 QString valueVal =
m_d->getTagAttributeVal(tag,
"value").replace(
" ",
"+");
343
344 if(QString::compare(typeVal,"text",Qt::CaseInsensitive)==0)
345 valueVal = inpPers->text();
346 else if(QString::compare(typeVal,"password",Qt::CaseInsensitive)==0)
347 valueVal = inpPhr->text();
348
349 if(QString::compare(typeVal,"checkbox",Qt::CaseInsensitive)!=0) {
350 QByteArray encodedNameVal = QUrl::toPercentEncoding(nameVal);
351 if(QString::compare(typeVal,"submit",Qt::CaseInsensitive)==0
352 || QString::compare(typeVal,"text",Qt::CaseInsensitive)==0
353 || QString::compare(typeVal,"password",Qt::CaseInsensitive)==0 ) {
354 newRequestBody+=("&"+QString(encodedNameVal)+"="+valueVal);
355 } else {
356 QByteArray encodedValueVal = QUrl::toPercentEncoding(valueVal);
357 if(newRequestBody.size()!=0)
358 newRequestBody+="&";
359 newRequestBody+=(QString(encodedNameVal)+"="+QString(encodedValueVal));
360 }
361 }
362
363
364 inputStart = inputStartMatcher.indexIn(replyBody,inputEnd+inputEndMatcher.pattern().size());
365 }
366 }
367
368 QByteArray newBody = newRequestBody.toUtf8();
369
370 QString logMessage = "New Request Length: " + QString::number(newBody.size()) + "\n";
371 logMessage += ("New Request Body:\n" + newRequestBody.replace(inpPhr->text(),"xxx") + "\n");
372
373
374
375 QString actionUrlString(
"https://"+
m_d->m_loginServer);
376
377 QStringMatcher actionStartMatcher("action=\"",Qt::CaseInsensitive);
378 QStringMatcher actionEndMatcher("\"");
379 int actionStart = actionStartMatcher.indexIn(replyBody,0);
380 if(actionStart!=-1) {
381 int actionEnd = actionEndMatcher.indexIn(replyBody,actionStart+actionStartMatcher.pattern().size());
382 if(actionEnd!=-1)
383 actionUrlString += replyBody.mid(actionStart+actionStartMatcher.pattern().size(),actionEnd-actionStart-actionStartMatcher.pattern().size());
384 }
385
386 logMessage += ("New URL: " + actionUrlString + "\n");
387 QByteArray actionUrlBa(actionUrlString.toStdString().c_str());
388 QString actionUrlStringDecoded = QUrl::fromPercentEncoding(actionUrlBa);
389 logMessage += ("Decoded URL: " + actionUrlStringDecoded.replace("&","&")
390 + "\n\nPost request sent\n_______________________________________________________\n\n");
391
392
393 QNetworkRequest netrequest(QUrl(actionUrlStringDecoded.replace("&","&")));
394 netrequest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
395 netrequest.setHeader(QNetworkRequest::ContentLengthHeader,newBody.size());
396 m_d->m_netreply =
m_d->m_netmanager->post(netrequest,newBody);
398 QByteArray baLog(logMessage.toStdString().c_str());
399 m_d->m_log->write(baLog);
400 }
401 m_d->connectToAuthenticator(
this);
403 return;
404 }
405
406
407
408
409
410
411
412
413
414
415
416
417
419
420 if(cookielist.size()==0) {
421
422 QString errMessage("Authentication failed, please try again\n");
423 m_d->displayError(errMessage);
425 return;
426 }
427
428 QString replyBody(ba.data());
429 QByteArray excludeFromEncoding(" ");
430 QString newRequestBody("");
431
432 QStringMatcher inputStartMatcher("<input ",Qt::CaseInsensitive);
433 QStringMatcher inputEndMatcher("/>");
434
435 int inputStart = inputStartMatcher.indexIn(replyBody,0);
436
437 while(inputStart!=-1) {
438
439
440
441 int inputEnd = inputStart;
442 int quoteCount = 1;
443 int quotePos = inputStart;
444 QStringMatcher quoteMatcher("\"");
445
446 while(quoteCount%2!=0) {
447 inputEnd = inputEndMatcher.indexIn(replyBody,quotePos);
448 if(inputEnd==-1)
449 break;
450 quoteCount = 0;
451 quotePos = inputStart;
452
453 while(true) {
454 quotePos = quoteMatcher.indexIn(replyBody,quotePos);
455 if(quotePos==-1||quotePos>inputEnd)
456 break;
457 quoteCount++;
458 quotePos++;
459 }
460 }
461
462 if(inputEnd==-1)
463 break;
464 else {
465
466 QString
tag = replyBody.mid(inputStart,inputEnd-inputStart);
467 QString typeVal =
m_d->getTagAttributeVal(tag,
"type");
468 QString nameVal =
m_d->getTagAttributeVal(tag,
"name");
469 QString valueVal =
m_d->getTagAttributeVal(tag,
"value");
470
471 if(QString::compare(typeVal,"text",Qt::CaseInsensitive)==0)
472 valueVal = inpPers->text();
473 else if(QString::compare(typeVal,"password",Qt::CaseInsensitive)==0)
474 valueVal = inpPhr->text();
475
476 if(QString::compare(typeVal,"checkbox",Qt::CaseInsensitive)!=0 &&
477 QString::compare(typeVal,"submit",Qt::CaseInsensitive)!=0) {
478 QByteArray encodedNameVal = QUrl::toPercentEncoding(nameVal);
479 QString valueVal1 = valueVal.replace("<","<");
480 QString valueVal2 = valueVal.replace(""","\"");
481 QByteArray encodedValueVal = QUrl::toPercentEncoding(valueVal2,excludeFromEncoding);
482 if(newRequestBody.size()!=0)
483 newRequestBody+="&";
484 newRequestBody+=(QString(encodedNameVal)+"="+QString(encodedValueVal).replace(" ","+"));
485 }
486
487
488 inputStart = inputStartMatcher.indexIn(replyBody,inputEnd+inputEndMatcher.pattern().size());
489 }
490 }
491
492 QByteArray newBody = newRequestBody.toUtf8();
493
494 QString logMessage = "New Request Length: " + QString::number(newBody.size()) + "\n";
495 logMessage += ("New Request Body:\n" + newRequestBody + "\n");
496
497
498 QString actionUrlString("");
499
500 QStringMatcher actionStartMatcher("action=\"",Qt::CaseInsensitive);
501 QStringMatcher actionEndMatcher("\"");
502 int actionStart = actionStartMatcher.indexIn(replyBody,0);
503 if(actionStart!=-1) {
504 int actionEnd = actionEndMatcher.indexIn(replyBody,actionStart+actionStartMatcher.pattern().size());
505 if(actionEnd!=-1)
506 actionUrlString = replyBody.mid(actionStart+actionStartMatcher.pattern().size(),actionEnd-actionStart-actionStartMatcher.pattern().size());
507 }
508
509 logMessage += ("New URL: " + actionUrlString + "\n");
510
511
512 QNetworkRequest netrequest;
513 netrequest.setUrl(actionUrlString);
514 netrequest.setHeader(QNetworkRequest::ContentTypeHeader,"application/x-www-form-urlencoded");
515 netrequest.setHeader(QNetworkRequest::ContentLengthHeader,newBody.size());
516 m_d->m_netreply =
m_d->m_netmanager->post(netrequest,newBody);
517 logMessage += ("\n\nPost request sent\n_______________________________________________________\n\n");
519 QByteArray baLog(logMessage.toStdString().c_str());
520 m_d->m_log->write(baLog);
521 }
522 m_d->connectToAuthenticator(
this);
524 return;
525 }
526
527
528
529
531 QNetworkRequest netrequest(redirectionUrl);
532 m_d->m_netreply =
m_d->m_netmanager->get(netrequest);
534 QByteArray baLog("Get request sent\n_______________________________________________________\n\n");
535 m_d->m_log->write(baLog);
536 }
537 m_d->connectToAuthenticator(
this);
539 return;
540 }
541}
void authenticationSuccessful(QNetworkAccessManager *)