summaryrefslogtreecommitdiff
path: root/src/nexusoauthtokens.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/nexusoauthtokens.h')
-rw-r--r--src/nexusoauthtokens.h98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/nexusoauthtokens.h b/src/nexusoauthtokens.h
new file mode 100644
index 00000000..78f3f22c
--- /dev/null
+++ b/src/nexusoauthtokens.h
@@ -0,0 +1,98 @@
+/*
+Copyright (C) 2012 Sebastian Herbord. All rights reserved.
+
+This file is part of Mod Organizer.
+
+Mod Organizer is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+Mod Organizer is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with Mod Organizer. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef NEXUSOAUTHTOKENS_H
+#define NEXUSOAUTHTOKENS_H
+
+#include <QDateTime>
+#include <QJsonObject>
+#include <chrono>
+#include <optional>
+
+struct NexusOAuthTokens
+{
+ QString accessToken;
+ QString refreshToken;
+ QString scope;
+ QString tokenType;
+ QDateTime expiresAt;
+ QString apiKey;
+
+ bool isValid() const { return !accessToken.isEmpty() && expiresAt.isValid(); }
+
+ bool isExpired(std::chrono::seconds skew = std::chrono::seconds(300)) const
+ {
+ if (!expiresAt.isValid()) {
+ return true;
+ }
+
+ const auto now = QDateTime::currentDateTimeUtc();
+ return now.addSecs(skew.count()) >= expiresAt;
+ }
+
+ QJsonObject toJson() const
+ {
+ QJsonObject json;
+ json.insert(QStringLiteral("access_token"), accessToken);
+ json.insert(QStringLiteral("refresh_token"), refreshToken);
+ json.insert(QStringLiteral("scope"), scope);
+ json.insert(QStringLiteral("token_type"), tokenType);
+ json.insert(QStringLiteral("expires_at"), expiresAt.toString(Qt::ISODateWithMs));
+ return json;
+ }
+
+ static std::optional<NexusOAuthTokens> fromJson(const QJsonObject& json)
+ {
+ NexusOAuthTokens tokens;
+ tokens.accessToken = json.value(QStringLiteral("access_token")).toString();
+ tokens.refreshToken = json.value(QStringLiteral("refresh_token")).toString();
+ tokens.scope = json.value(QStringLiteral("scope")).toString();
+ tokens.tokenType = json.value(QStringLiteral("token_type")).toString();
+ tokens.expiresAt = QDateTime::fromString(
+ json.value(QStringLiteral("expires_at")).toString(), Qt::ISODateWithMs);
+ if (!tokens.expiresAt.isValid()) {
+ tokens.expiresAt = QDateTime::fromString(
+ json.value(QStringLiteral("expires_at")).toString(), Qt::ISODate);
+ }
+
+ if (!tokens.isValid()) {
+ return std::nullopt;
+ }
+
+ if (tokens.expiresAt.isValid() && tokens.expiresAt.timeSpec() != Qt::UTC) {
+ tokens.expiresAt = tokens.expiresAt.toUTC();
+ }
+
+ return tokens;
+ }
+};
+
+inline NexusOAuthTokens makeTokensFromResponse(const QVariantMap& data)
+{
+ NexusOAuthTokens tokens;
+ tokens.accessToken = data["access_token"].toString();
+ tokens.refreshToken = data["refresh_token"].toString();
+ tokens.scope = data["scope"].toString();
+ tokens.tokenType = data["token_type"].toString();
+ tokens.expiresAt = data["expiration_at"].toDateTime();
+
+ return tokens;
+}
+
+#endif // NEXUSOAUTHTOKENS_H