aboutsummaryrefslogtreecommitdiff
path: root/launcher/minecraft/auth/MinecraftAccount.cpp
diff options
context:
space:
mode:
authorTheKodeToad <TheKodeToad@proton.me>2023-07-19 10:16:27 +0100
committerGitHub <noreply@github.com>2023-07-19 10:16:27 +0100
commit593f45298614843c14acb11994320f90a474c750 (patch)
tree69f1d3f4386d7e1203c554b4d5febab802013352 /launcher/minecraft/auth/MinecraftAccount.cpp
parentf8d88cc83d45c63685852a2c015f2556ba8f0494 (diff)
parentf8fcb98c6837c0bf66c2175ea98198449c36b165 (diff)
downloadPrismLauncher-593f45298614843c14acb11994320f90a474c750.tar.gz
PrismLauncher-593f45298614843c14acb11994320f90a474c750.tar.bz2
PrismLauncher-593f45298614843c14acb11994320f90a474c750.zip
Merge pull request #1399 from Scrumplex/offline-uuid
fix: generate predictable UUIDs for offline accounts
Diffstat (limited to 'launcher/minecraft/auth/MinecraftAccount.cpp')
-rw-r--r--launcher/minecraft/auth/MinecraftAccount.cpp32
1 files changed, 31 insertions, 1 deletions
diff --git a/launcher/minecraft/auth/MinecraftAccount.cpp b/launcher/minecraft/auth/MinecraftAccount.cpp
index 3b050ac0..d7b061e5 100644
--- a/launcher/minecraft/auth/MinecraftAccount.cpp
+++ b/launcher/minecraft/auth/MinecraftAccount.cpp
@@ -37,6 +37,7 @@
#include "MinecraftAccount.h"
+#include <QCryptographicHash>
#include <QUuid>
#include <QJsonObject>
#include <QJsonArray>
@@ -100,7 +101,7 @@ MinecraftAccountPtr MinecraftAccount::createOffline(const QString &username)
account->data.yggdrasilToken.extra["clientToken"] = QUuid::createUuid().toString().remove(QRegularExpression("[{}-]"));
account->data.minecraftEntitlement.ownsMinecraft = true;
account->data.minecraftEntitlement.canPlayMinecraft = true;
- account->data.minecraftProfile.id = QUuid::createUuid().toString().remove(QRegularExpression("[{}-]"));
+ account->data.minecraftProfile.id = uuidFromUsername(username).toString().remove(QRegularExpression("[{}-]"));
account->data.minecraftProfile.name = username;
account->data.minecraftProfile.validity = Katabasis::Validity::Certain;
return account;
@@ -334,3 +335,32 @@ void MinecraftAccount::incrementUses()
qWarning() << "Profile" << data.profileId() << "is now in use.";
}
}
+
+QUuid MinecraftAccount::uuidFromUsername(QString username) {
+ auto input = QString("OfflinePlayer:%1").arg(username).toUtf8();
+
+ // basically a reimplementation of Java's UUID#nameUUIDFromBytes
+ QByteArray digest = QCryptographicHash::hash(input, QCryptographicHash::Md5);
+
+#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
+ auto bOr = [](QByteArray& array, int index, char value) {
+ array[index] = array.at(index) | value;
+ };
+ auto bAnd = [](QByteArray& array, int index, char value) {
+ array[index] = array.at(index) & value;
+ };
+#else
+ auto bOr = [](QByteArray& array, qsizetype index, char value) {
+ array[index] |= value;
+ };
+ auto bAnd = [](QByteArray& array, qsizetype index, char value) {
+ array[index] &= value;
+ };
+#endif
+ bAnd(digest, 6, (char) 0x0f); // clear version
+ bOr(digest, 6, (char) 0x30); // set to version 3
+ bAnd(digest, 8, (char) 0x3f); // clear variant
+ bOr(digest, 8, (char) 0x80); // set to IETF variant
+
+ return QUuid::fromRfc4122(digest);
+}