| 453 | } |
| 454 | |
| 455 | bool parseMojangResponse(QByteArray & data, Katabasis::Token &output) { |
| 456 | QJsonParseError jsonError; |
| 457 | qDebug() << "Parsing Mojang response..."; |
| 458 | #ifndef NDEBUG |
| 459 | qDebug() << data; |
| 460 | #endif |
| 461 | QJsonDocument doc = QJsonDocument::fromJson(data, &jsonError); |
| 462 | if(jsonError.error) { |
| 463 | qWarning() << "Failed to parse response from api.minecraftservices.com/launcher/login as JSON: " << jsonError.errorString(); |
| 464 | return false; |
| 465 | } |
| 466 | |
| 467 | auto obj = doc.object(); |
| 468 | double expires_in = 0; |
| 469 | if(!getNumber(obj.value("expires_in"), expires_in)) { |
| 470 | qWarning() << "expires_in is not a valid number"; |
| 471 | return false; |
| 472 | } |
| 473 | auto currentTime = QDateTime::currentDateTimeUtc(); |
| 474 | output.issueInstant = currentTime; |
| 475 | output.notAfter = currentTime.addSecs(expires_in); |
| 476 | |
| 477 | QString username; |
| 478 | if(!getString(obj.value("username"), username)) { |
| 479 | qWarning() << "username is not valid"; |
| 480 | return false; |
| 481 | } |
| 482 | |
| 483 | // TODO: it's a JWT... validate it? |
| 484 | if(!getString(obj.value("access_token"), output.token)) { |
| 485 | qWarning() << "access_token is not valid"; |
| 486 | return false; |
| 487 | } |
| 488 | output.validity = Katabasis::Validity::Certain; |
| 489 | qDebug() << "Mojang response is valid."; |
| 490 | return true; |
| 491 | } |
| 492 | |
| 493 | } |
no test coverage detected