void CredentialsManager::setCredentials( const CredentialsStorageKey& csKey, const QVariant& value, bool tryToWriteAsString ) { tDebug() << Q_FUNC_INFO; QMutexLocker locker( &m_mutex ); QKeychain::Job* j; if ( value.isNull() || ( value.type() == QVariant::Map && value.toMap().isEmpty() ) || ( value.type() == QVariant::String && value.toString().isEmpty() ) ) { if ( !m_credentials.contains( csKey ) ) //if we don't have any credentials for this key, we bail return; m_credentials.remove( csKey ); #ifdef Q_OS_MAC TomahawkSettings::instance()->beginGroup( QString( "accounts/%1" ).arg( csKey.key() ) ); TomahawkSettings::instance()->remove( "credentials" ); TomahawkSettings::instance()->endGroup(); #else QKeychain::DeletePasswordJob* dj = new QKeychain::DeletePasswordJob( csKey.service(), this ); dj->setKey( csKey.key() ); j = dj; #endif } else { if ( value == m_credentials.value( csKey ) ) //if the credentials haven't actually changed, we bail return; m_credentials.insert( csKey, value ); #ifdef Q_OS_MAC TomahawkSettings::instance()->beginGroup( QString( "accounts/%1" ).arg( csKey.key() ) ); TomahawkSettings::instance()->setValue( "credentials", value ); TomahawkSettings::instance()->endGroup(); #else QKeychain::WritePasswordJob* wj = new QKeychain::WritePasswordJob( csKey.service(), this ); wj->setKey( csKey.key() ); Q_ASSERT( value.type() == QVariant::String || value.type() == QVariant::Map ); if ( tryToWriteAsString && value.type() == QVariant::String ) { wj->setTextData( value.toString() ); } else if ( value.type() == QVariant::Map ) { bool ok; QByteArray data = TomahawkUtils::toJson( value.toMap(), &ok ); if ( ok ) { tDebug() << "About to write credentials for key" << csKey.key(); } else { tDebug() << "Cannot serialize credentials for writing" << csKey.key(); } wj->setTextData( data ); } j = wj; #endif //Q_OS_MAC } #ifndef Q_OS_MAC j->setAutoDelete( false ); #if defined( Q_OS_UNIX ) && !defined( Q_OS_MAC ) j->setInsecureFallback( true ); #endif connect( j, SIGNAL( finished( QKeychain::Job* ) ), SLOT( keychainJobFinished( QKeychain::Job* ) ) ); j->start(); tDebug() << Q_FUNC_INFO << "launched" << j->metaObject()->className() << "for service" << j->service(); #endif }
void CredentialsManager::setCredentials( const CredentialsStorageKey& csKey, const QVariant& value, bool tryToWriteAsString ) { QMutexLocker locker( &m_mutex ); QKeychain::Job* j; if ( value.isNull() || ( value.type() == QVariant::Hash && value.toHash().isEmpty() ) || ( value.type() == QVariant::String && value.toString().isEmpty() ) ) { if ( !m_credentials.contains( csKey ) ) //if we don't have any credentials for this key, we bail return; m_credentials.remove( csKey ); QKeychain::DeletePasswordJob* dj = new QKeychain::DeletePasswordJob( csKey.service(), this ); dj->setKey( csKey.key() ); j = dj; } else { if ( value == m_credentials.value( csKey ) ) //if the credentials haven't actually changed, we bail return; m_credentials.insert( csKey, value ); QKeychain::WritePasswordJob* wj = new QKeychain::WritePasswordJob( csKey.service(), this ); wj->setKey( csKey.key() ); Q_ASSERT( value.type() == QVariant::String || value.type() == QVariant::Hash ); if ( tryToWriteAsString && value.type() == QVariant::String ) { wj->setTextData( value.toString() ); } else if ( value.type() == QVariant::Hash ) { QJson::Serializer serializer; bool ok; QByteArray data = serializer.serialize( value.toHash(), &ok ); if ( ok ) { tDebug() << "About to write credentials for key" << csKey.key(); } else { tDebug() << "Cannot serialize credentials for writing" << csKey.key(); } wj->setTextData( data ); } j = wj; } j->setAutoDelete( false ); #if defined( Q_OS_UNIX ) && !defined( Q_OS_MAC ) j->setInsecureFallback( true ); #endif connect( j, SIGNAL( finished( QKeychain::Job* ) ), SLOT( keychainJobFinished( QKeychain::Job* ) ) ); j->start(); }