Skip to content

Commit

Permalink
extract helper methods
Browse files Browse the repository at this point in the history
  • Loading branch information
VitorVieiraZ committed Jan 31, 2025
1 parent a38d2e0 commit b13b288
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 129 deletions.
229 changes: 100 additions & 129 deletions core/merginuserauth.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Expand Down Expand Up @@ -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;
Expand All @@ -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<typename std::decay<decltype( destination )>::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;
Expand Down Expand Up @@ -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 <typename T, typename Converter>
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();
}
10 changes: 10 additions & 0 deletions core/merginuserauth.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 <typename T, typename Converter>
void readKey( const QString &key, T &destination, Converter converter );

QString mUsername;
QString mPassword;
int mUserId = -1;
Expand Down

1 comment on commit b13b288

@inputapp-bot
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

iOS - version 25.1.701411 just submitted!

Please sign in to comment.