From b13b288c6d9b00489b1611b3681d625503a58005 Mon Sep 17 00:00:00 2001 From: VitorVieiraZ Date: Fri, 31 Jan 2025 02:20:05 -0300 Subject: [PATCH] extract helper methods --- core/merginuserauth.cpp | 229 ++++++++++++++++++---------------------- core/merginuserauth.h | 10 ++ 2 files changed, 110 insertions(+), 129 deletions(-) diff --git a/core/merginuserauth.cpp b/core/merginuserauth.cpp index 5c7833b8a..6f37eaf67 100644 --- a/core/merginuserauth.cpp +++ b/core/merginuserauth.cpp @@ -18,46 +18,26 @@ MerginUserAuth::MerginUserAuth( QObject *parent ) void MerginUserAuth::clear() { - mUsername = ""; - mPassword = ""; + mUsername.clear(); + mPassword.clear(); mAuthToken.clear(); mTokenExpiration = QDateTime(); mUserId = -1; #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) - const QString group = QStringLiteral( "Input/" ); - - auto deleteJob = [this, group]( const QString & key ) - { - auto *job = new QKeychain::DeletePasswordJob( QStringLiteral( "mergin_maps_auth" ), this ); - job->setAutoDelete( false ); - job->setKey( group + key ); - - connect( job, &QKeychain::Job::finished, this, [this, job, key]() - { - if ( job->error() ) - { - CoreUtils::log( "Auth", QString( "Keychain delete error (%1): %2" ).arg( key, job->errorString() ) ); - } - job->deleteLater(); - } ); - - job->start(); - }; - - deleteJob( "username" ); - deleteJob( "password" ); - deleteJob( "userId" ); - deleteJob( "token" ); - deleteJob( "expire" ); + deleteKey( QStringLiteral( "username" ) ); + deleteKey( QStringLiteral( "password" ) ); + deleteKey( QStringLiteral( "userId" ) ); + deleteKey( QStringLiteral( "token" ) ); + deleteKey( QStringLiteral( "expire" ) ); #else QSettings settings; - settings.beginGroup( "Input/" ); - settings.remove( "username" ); - settings.remove( "password" ); - settings.remove( "userId" ); - settings.remove( "token" ); - settings.remove( "expire" ); + settings.beginGroup( QStringLiteral( "Input/" ) ); + settings.remove( QStringLiteral( "username" ) ); + settings.remove( QStringLiteral( "password" ) ); + settings.remove( QStringLiteral( "userId" ) ); + settings.remove( QStringLiteral( "token" ) ); + settings.remove( QStringLiteral( "expire" ) ); settings.endGroup(); #endif @@ -70,33 +50,13 @@ void MerginUserAuth::clearTokenData() mAuthToken.clear(); #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) - const QString group = QStringLiteral( "Input/" ); - - auto deleteJob = [this, group]( const QString & key ) - { - auto *job = new QKeychain::DeletePasswordJob( QStringLiteral( "mergin_maps_auth" ), this ); - job->setAutoDelete( false ); - job->setKey( group + key ); - - connect( job, &QKeychain::Job::finished, this, [this, job, key]() - { - if ( job->error() ) - { - CoreUtils::log( "Auth", QString( "Keychain delete error (%1): %2" ).arg( key, job->errorString() ) ); - } - job->deleteLater(); - } ); - - job->start(); - }; - - deleteJob( "token" ); - deleteJob( "expire" ); + deleteKey( QStringLiteral( "token" ) ); + deleteKey( QStringLiteral( "expire" ) ); #else QSettings settings; - settings.beginGroup( "Input/" ); - settings.remove( "token" ); - settings.remove( "expire" ); + settings.beginGroup( QStringLiteral( "Input/" ) ); + settings.remove( QStringLiteral( "token" ) ); + settings.remove( QStringLiteral( "expire" ) ); settings.endGroup(); #endif @@ -125,39 +85,11 @@ void MerginUserAuth::saveAuthData() { #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) // mobile => QtKeychain - const QString group = QStringLiteral( "Input/" ); - - auto writeJob = [this, group]( const QString & key, const QVariant & value ) - { - auto *job = new QKeychain::WritePasswordJob( QStringLiteral( "mergin_maps_auth" ), this ); - job->setAutoDelete( false ); - job->setKey( group + key ); - - if ( value.type() == QVariant::ByteArray ) - job->setTextData( QString::fromUtf8( value.toByteArray().toBase64() ) ); - else if ( value.type() == QVariant::DateTime ) - job->setTextData( value.toDateTime().toString( Qt::ISODate ) ); - else - job->setTextData( value.toString() ); - - connect( job, &QKeychain::Job::finished, this, [this, job, key]() - { - if ( job->error() ) - { - CoreUtils::log( "Auth", QString( "Keychain write error (%1): %2" ).arg( key, job->errorString() ) ); - } - job->deleteLater(); - } ); - - job->start(); - }; - - writeJob( QStringLiteral( "username" ), mUsername ); - writeJob( QStringLiteral( "password" ), mPassword ); - writeJob( QStringLiteral( "userId" ), mUserId ); - writeJob( QStringLiteral( "token" ), mAuthToken ); - writeJob( QStringLiteral( "expire" ), mTokenExpiration ); - + writeKey( QStringLiteral( "username" ), mUsername ); + writeKey( QStringLiteral( "password" ), mPassword ); + writeKey( QStringLiteral( "userId" ), mUserId ); + writeKey( QStringLiteral( "token" ), mAuthToken ); + writeKey( QStringLiteral( "expire" ), mTokenExpiration ); #else // desktop => QSettings QSettings settings; @@ -175,44 +107,11 @@ void MerginUserAuth::loadAuthData() { #if defined(Q_OS_ANDROID) || defined(Q_OS_IOS) // mobile => QtKeychain - const QString group = QStringLiteral( "Input/" ); - - auto readJob = [this, group]( const QString & key, auto & destination, std::function::type( const QString & )> converter ) - { - auto *job = new QKeychain::ReadPasswordJob( QStringLiteral( "mergin_maps_auth" ), this ); - job->setAutoDelete( false ); - job->setKey( group + key ); - - connect( job, &QKeychain::Job::finished, this, [this, job, key, &destination, converter]() - { - if ( !job->error() && !job->textData().isEmpty() ) - { - destination = converter( job->textData() ); - } - else if ( job->error() ) - { - CoreUtils::log( "Auth", QString( "Keychain read error (%1): %2" ).arg( key, job->errorString() ) ); - } - job->deleteLater(); - } ); - - job->start(); - }; - - readJob( QStringLiteral( "username" ), mUsername, []( const QString & v ) { return v; } ); - readJob( QStringLiteral( "password" ), mPassword, []( const QString & v ) { return v; } ); - readJob( QStringLiteral( "userId" ), mUserId, []( const QString & v ) { return v.toInt(); } ); - - readJob( QStringLiteral( "token" ), mAuthToken, []( const QString & v ) - { - return QByteArray::fromBase64( v.toUtf8() ); - } ); - - readJob( QStringLiteral( "expire" ), mTokenExpiration, []( const QString & v ) - { - return QDateTime::fromString( v, Qt::ISODate ); - } ); - + readKey( QStringLiteral( "username" ), mUsername, []( const QString & v ) { return v; } ); + readKey( QStringLiteral( "password" ), mPassword, []( const QString & v ) { return v; } ); + readKey( QStringLiteral( "userId" ), mUserId, []( const QString & v ) { return v.toInt(); } ); + readKey( QStringLiteral( "token" ), mAuthToken, []( const QString & v ) { return QByteArray::fromBase64( v.toUtf8() ); } ); + readKey( QStringLiteral( "expire" ), mTokenExpiration, []( const QString & v ) { return QDateTime::fromString( v, Qt::ISODate ); } ); #else // desktop => QSettings QSettings settings; @@ -285,3 +184,75 @@ bool MerginUserAuth::hasValidToken() const { return !mAuthToken.isEmpty() && mTokenExpiration >= QDateTime().currentDateTimeUtc(); } + +void MerginUserAuth::deleteKey( const QString &key ) +{ + auto *job = new QKeychain::DeletePasswordJob( "mergin_maps_auth", this ); + job->setAutoDelete( false ); + job->setKey( "Input/" + key ); + + connect( job, &QKeychain::Job::finished, this, [this, job, key]() + { + if ( job->error() ) + { + CoreUtils::log( "Auth", QString( "Keychain delete error (%1): %2" ).arg( key, job->errorString() ) ); + } + job->deleteLater(); + } ); + + job->start(); +} + +void MerginUserAuth::writeKey( const QString &key, const QVariant &value ) +{ + auto *job = new QKeychain::WritePasswordJob( "mergin_maps_auth", this ); + job->setAutoDelete( false ); + job->setKey( "Input/" + key ); + + if ( value.type() == QVariant::ByteArray ) + { + job->setTextData( QString::fromUtf8( value.toByteArray().toBase64() ) ); + } + else if ( value.type() == QVariant::DateTime ) + { + job->setTextData( value.toDateTime().toString( Qt::ISODate ) ); + } + else + { + job->setTextData( value.toString() ); + } + + connect( job, &QKeychain::Job::finished, this, [this, job, key]() + { + if ( job->error() ) + { + CoreUtils::log( "Auth", QString( "Keychain write error (%1): %2" ).arg( key, job->errorString() ) ); + } + job->deleteLater(); + } ); + + job->start(); +} + +template +void MerginUserAuth::readKey( const QString &key, T &destination, Converter converter ) +{ + auto *job = new QKeychain::ReadPasswordJob( "mergin_maps_auth", this ); + job->setAutoDelete( false ); + job->setKey( "Input/" + key ); + + connect( job, &QKeychain::Job::finished, this, [this, job, key, &destination, converter]() + { + if ( !job->error() && !job->textData().isEmpty() ) + { + destination = converter( job->textData() ); + } + else if ( job->error() ) + { + CoreUtils::log( "Auth", QString( "Keychain read error (%1): %2" ).arg( key, job->errorString() ) ); + } + job->deleteLater(); + } ); + + job->start(); +} diff --git a/core/merginuserauth.h b/core/merginuserauth.h index c55a57d56..8f91b96e7 100644 --- a/core/merginuserauth.h +++ b/core/merginuserauth.h @@ -62,6 +62,16 @@ class MerginUserAuth: public QObject void setFromJson( QJsonObject docObj ); private: + //! Delete a key in keychain + void deleteKey( const QString &key ); + + //! Write a key/value in keychain + void writeKey( const QString &key, const QVariant &value ); + + //! Read a key from keychain into a destination variable + template + void readKey( const QString &key, T &destination, Converter converter ); + QString mUsername; QString mPassword; int mUserId = -1;