| 144 | } |
| 145 | |
| 146 | void Resource::slotAuthenticate(KJob *job) |
| 147 | { |
| 148 | const QString tokenName = job->property("requestedTokenName").toString(); |
| 149 | Q_ASSERT(!tokenName.isEmpty()); |
| 150 | |
| 151 | if (job->error()) { |
| 152 | emit authenticated("", "", tokenName); |
| 153 | return; |
| 154 | } |
| 155 | |
| 156 | const auto metaData = qobject_cast<KIO::StoredTransferJob*>(job)->metaData(); |
| 157 | if (metaData[QStringLiteral("responsecode")] == QLatin1String("401")) { |
| 158 | const auto& header = metaData[QStringLiteral("HTTP-Headers")]; |
| 159 | if (header.contains(QLatin1String("X-GitHub-OTP: required;"), Qt::CaseInsensitive)) { |
| 160 | emit twoFactorAuthRequested(qobject_cast<KIO::StoredTransferJob*>(job)->outgoingMetaData()[QStringLiteral("customHTTPHeader")]); |
| 161 | return; |
| 162 | } |
| 163 | } |
| 164 | |
| 165 | QJsonParseError error; |
| 166 | QJsonDocument doc = QJsonDocument::fromJson(qobject_cast<KIO::StoredTransferJob *>(job)->data(), &error); |
| 167 | |
| 168 | qCDebug(GHPROVIDER) << "Response:" << doc; |
| 169 | |
| 170 | if (error.error == 0) { |
| 171 | QVariantMap map = doc.toVariant().toMap(); |
| 172 | emit authenticated(map.value(QStringLiteral("id")).toByteArray(), |
| 173 | map.value(QStringLiteral("token")).toByteArray(), tokenName); |
| 174 | } else |
| 175 | emit authenticated("", "", tokenName); |
| 176 | } |
| 177 | |
| 178 | void Resource::slotRepos(KIO::Job *job, const QByteArray &data) |
| 179 | { |