diff --git a/src/oauth/qabstractoauth.cpp b/src/oauth/qabstractoauth.cpp index 8e29d36..de6f4ab 100644 --- a/src/oauth/qabstractoauth.cpp +++ b/src/oauth/qabstractoauth.cpp @@ -11,7 +11,6 @@ #include #include #include -#include #include #include #include @@ -20,6 +19,9 @@ #include #include +#include +#include + #include QT_BEGIN_NAMESPACE @@ -262,15 +264,19 @@ void QAbstractOAuthPrivate::setStatus(QAbstractOAuth::Status newStatus) } } +Q_CONSTINIT static QBasicMutex prngMutex; +Q_GLOBAL_STATIC_WITH_ARGS(std::mt19937, prng, (*QRandomGenerator::system())) + QByteArray QAbstractOAuthPrivate::generateRandomString(quint8 length) { - const char characters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; - static std::mt19937 randomEngine(QDateTime::currentDateTime().toMSecsSinceEpoch()); + constexpr char characters[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; std::uniform_int_distribution distribution(0, sizeof(characters) - 2); QByteArray data; data.reserve(length); + auto lock = qt_unique_lock(prngMutex); for (quint8 i = 0; i < length; ++i) - data.append(characters[distribution(randomEngine)]); + data.append(characters[distribution(*prng)]); + lock.unlock(); return data; } @@ -580,6 +586,7 @@ void QAbstractOAuth::resourceOwnerAuthorization(const QUrl &url, const QMultiMap } /*! + \threadsafe Generates a random string which could be used as state or nonce. The parameter \a length determines the size of the generated string.