From 3efaf7c9463261fb2d182a7ae00d9045a2b273b8 Mon Sep 17 00:00:00 2001 From: Jeremy Rimpo Date: Tue, 12 May 2026 13:50:45 -0500 Subject: Migrating to OAuth Authentication (#2374) Co-authored-by: aglowinthefield <146008217+aglowinthefield@users.noreply.github.com> Co-authored-by: Jonathan Feenstra <26406078+JonathanFeenstra@users.noreply.github.com> --- src/nexusoauthtokens.h | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 src/nexusoauthtokens.h (limited to 'src/nexusoauthtokens.h') 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 . +*/ + +#ifndef NEXUSOAUTHTOKENS_H +#define NEXUSOAUTHTOKENS_H + +#include +#include +#include +#include + +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 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 -- cgit v1.3.1