scope = {"openid", "profile", "email"};
m_NexusOAuth->setRequestedScopeTokens(scope);
m_NexusOAuthReplyHandler->close();
m_NexusOAuthReplyHandler->setCallbackPath(QUrl(NexusOAuth::redirectUri()).path());
QFile logo(":/MO/gui/app_icon");
logo.open(QIODevice::ReadOnly);
QByteArray imageData = logo.readAll();
logo.close();
QByteArray base64Data = imageData.toBase64();
QString imageSrc =
QString("data:image/png;base64,") + QString::fromLatin1(base64Data);
m_NexusOAuthReplyHandler->setCallbackText(
QString("\n"
"
\n")
.arg(imageSrc) +
QObject::tr("Authorization complete.
You may close this "
"window.
\n"));
if (!m_NexusOAuthReplyHandler->listen(QHostAddress::LocalHost,
NexusOAuth::redirectPort())) {
handleOAuthError(QObject::tr("Failed to bind to localhost on port %1.")
.arg(NexusOAuth::redirectPort()));
return;
}
if (!tokens.accessToken.isEmpty()) {
m_NexusOAuth->setToken(tokens.accessToken);
m_NexusOAuth->setRefreshToken(tokens.refreshToken);
scope.clear();
for (const QString scopeItem : tokens.scope.split(" ")) {
scope.insert(scopeItem.toUtf8());
}
m_NexusOAuth->setRequestedScopeTokens(scope);
setOAuthState(OAuthState::Refreshing);
m_NexusOAuth->refreshTokens();
} else {
setOAuthState(OAuthState::Initializing);
m_NexusOAuth->grant();
}
}
void NXMAccessManager::cancelAuth()
{
if (m_NexusOAuthReplyHandler) {
m_NexusOAuthReplyHandler->close();
}
m_NexusOAuth.reset();
m_NexusOAuthReplyHandler.reset();
setOAuthState(OAuthState::Cancelled);
}
void NXMAccessManager::addAPIHeaders(QNetworkRequest& request)
{
request.setAttribute(QNetworkRequest::CacheSaveControlAttribute, false);
request.setAttribute(QNetworkRequest::CacheLoadControlAttribute,
QNetworkRequest::AlwaysNetwork);
request.setHeader(QNetworkRequest::KnownHeaders::UserAgentHeader,
userAgent().toUtf8());
request.setHeader(QNetworkRequest::KnownHeaders::ContentTypeHeader,
"application/json");
request.setRawHeader("Protocol-Version", "1.0.0");
request.setRawHeader("Application-Name", "MO2");
request.setRawHeader("Application-Version", MOVersion().toUtf8());
}
QNetworkReply* NXMAccessManager::makeOAuthGetRequest(const QUrl url)
{
if (!m_NexusOAuth->token().isEmpty()) {
QNetworkRequest request(url);
m_NexusOAuth->prepareRequest(&request, "GET");
addAPIHeaders(request);
return m_NexusOAuth->networkAccessManager()->get(request);
}
return nullptr;
}
QNetworkReply* NXMAccessManager::makeOAuthPostRequest(const QUrl url,
const QByteArray payload = {})
{
if (!m_NexusOAuth->token().isEmpty()) {
QNetworkRequest request(url);
m_NexusOAuth->prepareRequest(&request, "POST", payload);
addAPIHeaders(request);
return m_NexusOAuth->networkAccessManager()->post(request, payload);
}
return nullptr;
}
QNetworkReply* NXMAccessManager::makeOAuthDeleteRequest(QNetworkRequest request)
{
if (!m_NexusOAuth->token().isEmpty()) {
m_NexusOAuth->prepareRequest(&request, "DELETE");
addAPIHeaders(request);
return m_NexusOAuth->networkAccessManager()->deleteResource(request);
}
return nullptr;
}
QNetworkReply* NXMAccessManager::makeOAuthCustomRequest(QNetworkRequest request,
const QByteArray& verb,
const QByteArray& data)
{
if (!m_NexusOAuth->token().isEmpty()) {
m_NexusOAuth->prepareRequest(&request, verb, data);
addAPIHeaders(request);
return m_NexusOAuth->networkAccessManager()->sendCustomRequest(request, verb, data);
}
return nullptr;
}
void NXMAccessManager::apiCheck(const NexusOAuthTokens& tokens, bool force)
{
if (m_Validator.isActive()) {
return;
}
setTokens(tokens);
if (m_Settings && m_Settings->network().offlineMode()) {
m_ValidationState = NotChecked;
return;
}
if (force) {
m_ValidationState = NotChecked;
}
if (m_ValidationState == Valid) {
emit validateSuccessful(false);
return;
}
if (m_NexusOAuth->token().isEmpty() && !tokens.accessToken.isEmpty()) {
connectOrRefresh(tokens);
} else if (!tokens.apiKey.isEmpty()) {
startValidationCheck(tokens);
}
}
const QString& NXMAccessManager::MOVersion() const
{
return m_MOVersion;
}
QString NXMAccessManager::userAgent(const QString& subModule) const
{
QStringList comments;
QString os;
if (QSysInfo::productType() == "windows")
comments << ((QSysInfo::kernelType() == "winnt") ? "Windows_NT " : "Windows ") +
QSysInfo::kernelVersion();
else
comments << QSysInfo::kernelType().left(1).toUpper() + QSysInfo::kernelType().mid(1)
<< QSysInfo::productType().left(1).toUpper() +
QSysInfo::kernelType().mid(1) + " " + QSysInfo::productVersion();
if (!subModule.isEmpty()) {
comments << "module: " + subModule;
}
comments << ((QSysInfo::buildCpuArchitecture() == "x86_64") ? "x64" : "x86");
return QString("Mod Organizer/%1 (%2) Qt/%3")
.arg(m_MOVersion, comments.join("; "), qVersion());
}
void NXMAccessManager::clearCredentials()
{
m_Validator.cancel();
// TODO: Verify revocation process
// if (m_Tokens && !m_Tokens->accessToken.isEmpty()) {
// QNetworkRequest request(NexusOAuth::tokenUrl());
// QUrlQuery params;
// params.addQueryItem("token", m_Tokens->refreshToken);
// params.addQueryItem("token_type_hint", "refresh_token");
// m_NexusOAuth->prepareRequest(&request, "POST",
// params.toString(QUrl::FullyEncoded).toUtf8());
// m_NexusOAuth->networkAccessManager()->post(
// request, params.toString(QUrl::FullyEncoded).toUtf8());
//}
m_Tokens.reset();
m_NexusOAuth->setToken("");
m_NexusOAuthReplyHandler->close();
emit credentialsReceived(APIUserAccount());
}
void NXMAccessManager::startProgress()
{
if (!m_ProgressDialog) {
m_ProgressDialog.reset(new ValidationProgressDialog(m_Settings, m_Validator));
}
m_ProgressDialog->start();
}
void NXMAccessManager::stopProgress()
{
if (m_ProgressDialog) {
m_ProgressDialog->stop();
}
}