void QgsSpatiaLiteConnection::deleteConnection( const QString &name ) { QgsSettings settings; QString key = "/SpatiaLite/connections/" + name; settings.remove( key + "/sqlitepath" ); settings.remove( key ); }
void QgsGeoNodeConnectionUtils::deleteConnection( const QString &name ) { QgsSettings settings; // Add Section manually settings.remove( QStringLiteral( "qgis/connections-geonode/" ) + name ); settings.remove( QStringLiteral( "qgis/geonode/" ) + name ); }
//! Autoconnected SLOTS * void QgsPgNewConnection::accept() { QgsSettings settings; QString baseKey = QStringLiteral( "/PostgreSQL/connections/" ); settings.setValue( baseKey + "selected", txtName->text() ); bool hasAuthConfigID = !mAuthSettings->configId().isEmpty(); if ( !hasAuthConfigID && mAuthSettings->storePasswordIsChecked( ) && QMessageBox::question( this, tr( "Saving Passwords" ), tr( "WARNING: You have opted to save your password. It will be stored in unsecured plain text in your project files and in your home directory (Unix-like OS) or user profile (Windows). If you want to avoid this, press Cancel and either:\n\na) Don't save a password in the connection settings — it will be requested interactively when needed;\nb) Use the Configuration tab to add your credentials in an HTTP Basic Authentication method and store them in an encrypted database." ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // warn if entry was renamed to an existing connection if ( ( mOriginalConnName.isNull() || mOriginalConnName.compare( txtName->text(), Qt::CaseInsensitive ) != 0 ) && ( settings.contains( baseKey + txtName->text() + "/service" ) || settings.contains( baseKey + txtName->text() + "/host" ) ) && QMessageBox::question( this, tr( "Save Connection" ), tr( "Should the existing connection %1 be overwritten?" ).arg( txtName->text() ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // on rename delete the original entry first if ( !mOriginalConnName.isNull() && mOriginalConnName != txtName->text() ) { settings.remove( baseKey + mOriginalConnName ); settings.sync(); } baseKey += txtName->text(); settings.setValue( baseKey + "/service", txtService->text() ); settings.setValue( baseKey + "/host", txtHost->text() ); settings.setValue( baseKey + "/port", txtPort->text() ); settings.setValue( baseKey + "/database", txtDatabase->text() ); settings.setValue( baseKey + "/username", mAuthSettings->storeUsernameIsChecked( ) ? mAuthSettings->username() : QString() ); settings.setValue( baseKey + "/password", mAuthSettings->storePasswordIsChecked( ) && !hasAuthConfigID ? mAuthSettings->password() : QString() ); settings.setValue( baseKey + "/authcfg", mAuthSettings->configId() ); settings.setValue( baseKey + "/publicOnly", cb_publicSchemaOnly->isChecked() ); settings.setValue( baseKey + "/geometryColumnsOnly", cb_geometryColumnsOnly->isChecked() ); settings.setValue( baseKey + "/dontResolveType", cb_dontResolveType->isChecked() ); settings.setValue( baseKey + "/allowGeometrylessTables", cb_allowGeometrylessTables->isChecked() ); settings.setValue( baseKey + "/sslmode", cbxSSLmode->currentData().toInt() ); settings.setValue( baseKey + "/saveUsername", mAuthSettings->storeUsernameIsChecked( ) ? "true" : "false" ); settings.setValue( baseKey + "/savePassword", mAuthSettings->storePasswordIsChecked( ) && !hasAuthConfigID ? "true" : "false" ); settings.setValue( baseKey + "/estimatedMetadata", cb_useEstimatedMetadata->isChecked() ); settings.setValue( baseKey + "/projectsInDatabase", cb_projectsInDatabase->isChecked() ); // remove old save setting settings.remove( baseKey + "/save" ); QDialog::accept(); }
void QgsGpsDeviceDialog::writeDeviceSettings() { QStringList deviceNames; QgsSettings settings; QString devPath = QStringLiteral( "/Plugin-GPS/devices/%1" ); settings.remove( QStringLiteral( "/Plugin-GPS/devices" ) ); std::map<QString, QgsGpsDevice *>::const_iterator iter; for ( iter = mDevices.begin(); iter != mDevices.end(); ++iter ) { deviceNames.append( iter->first ); QString wptDownload = iter->second->importCommand( QStringLiteral( "%babel" ), QStringLiteral( "-w" ), QStringLiteral( "%in" ), QStringLiteral( "%out" ) ).join( QStringLiteral( " " ) ); QString wptUpload = iter->second->exportCommand( QStringLiteral( "%babel" ), QStringLiteral( "-w" ), QStringLiteral( "%in" ), QStringLiteral( "%out" ) ).join( QStringLiteral( " " ) ); QString rteDownload = iter->second->importCommand( QStringLiteral( "%babel" ), QStringLiteral( "-r" ), QStringLiteral( "%in" ), QStringLiteral( "%out" ) ).join( QStringLiteral( " " ) ); QString rteUpload = iter->second->exportCommand( QStringLiteral( "%babel" ), QStringLiteral( "-r" ), QStringLiteral( "%in" ), QStringLiteral( "%out" ) ).join( QStringLiteral( " " ) ); QString trkDownload = iter->second->importCommand( QStringLiteral( "%babel" ), QStringLiteral( "-t" ), QStringLiteral( "%in" ), QStringLiteral( "%out" ) ).join( QStringLiteral( " " ) ); QString trkUpload = iter->second->exportCommand( QStringLiteral( "%babel" ), QStringLiteral( "-t" ), QStringLiteral( "%in" ), QStringLiteral( "%out" ) ).join( QStringLiteral( " " ) ); settings.setValue( devPath.arg( iter->first ) + "/wptdownload", wptDownload ); settings.setValue( devPath.arg( iter->first ) + "/wptupload", wptUpload ); settings.setValue( devPath.arg( iter->first ) + "/rtedownload", rteDownload ); settings.setValue( devPath.arg( iter->first ) + "/rteupload", rteUpload ); settings.setValue( devPath.arg( iter->first ) + "/trkdownload", trkDownload ); settings.setValue( devPath.arg( iter->first ) + "/trkupload", trkUpload ); } settings.setValue( QStringLiteral( "/Plugin-GPS/devicelist" ), deviceNames ); }
//! Autoconnected SLOTS * void QgsNewOgrConnection::accept() { QgsSettings settings; QString baseKey = '/' + cmbDatabaseTypes->currentText() + "/connections/"; settings.setValue( baseKey + "selected", txtName->text() ); // warn if entry was renamed to an existing connection if ( ( mOriginalConnName.isNull() || mOriginalConnName != txtName->text() ) && settings.contains( baseKey + txtName->text() + "/host" ) && QMessageBox::question( this, tr( "Save Connection" ), tr( "Should the existing connection %1 be overwritten?" ).arg( txtName->text() ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // on rename delete original entry first if ( !mOriginalConnName.isNull() && mOriginalConnName != txtName->text() ) { settings.remove( baseKey + mOriginalConnName ); } baseKey += txtName->text(); settings.setValue( baseKey + "/host", txtHost->text() ); settings.setValue( baseKey + "/database", txtDatabase->text() ); settings.setValue( baseKey + "/port", txtPort->text() ); settings.setValue( baseKey + "/username", mAuthSettingsDatabase->storeUsernameIsChecked() ? mAuthSettingsDatabase->username() : QLatin1String( "" ) ); settings.setValue( baseKey + "/password", mAuthSettingsDatabase->storePasswordIsChecked() ? mAuthSettingsDatabase->password() : QLatin1String( "" ) ); settings.setValue( baseKey + "/store_username", mAuthSettingsDatabase->storeUsernameIsChecked() ? "true" : "false" ); settings.setValue( baseKey + "/store_password", mAuthSettingsDatabase->storePasswordIsChecked() ? "true" : "false" ); settings.setValue( baseKey + "/configid", mAuthSettingsDatabase->configId() ); QDialog::accept(); }
void QgsLocatorFiltersModel::commitChanges() { QgsSettings settings; QHash< QgsLocatorFilter *, QString >::const_iterator itp = mPrefixes.constBegin(); for ( ; itp != mPrefixes.constEnd(); ++itp ) { QgsLocatorFilter *filter = itp.key(); QString activePrefix = itp.value(); if ( !activePrefix.isEmpty() && activePrefix != filter->prefix() ) { filter->setActivePrefix( activePrefix ); settings.setValue( QStringLiteral( "locator_filters/prefix_%1" ).arg( filter->name() ), activePrefix, QgsSettings::Section::Gui ); } else { filter->setActivePrefix( QString() ); settings.remove( QStringLiteral( "locator_filters/prefix_%1" ).arg( filter->name() ), QgsSettings::Section::Gui ); } } QHash< QgsLocatorFilter *, bool >::const_iterator it = mEnabledChanges.constBegin(); for ( ; it != mEnabledChanges.constEnd(); ++it ) { QgsLocatorFilter *filter = it.key(); settings.setValue( QStringLiteral( "locator_filters/enabled_%1" ).arg( filter->name() ), it.value(), QgsSettings::Section::Gui ); filter->setEnabled( it.value() ); } it = mDefaultChanges.constBegin(); for ( ; it != mDefaultChanges.constEnd(); ++it ) { QgsLocatorFilter *filter = it.key(); settings.setValue( QStringLiteral( "locator_filters/default_%1" ).arg( filter->name() ), it.value(), QgsSettings::Section::Gui ); filter->setUseWithoutPrefix( it.value() ); } }
void QgsOracleNewConnection::accept() { QgsSettings settings; QString baseKey = QStringLiteral( "/Oracle/connections/" ); settings.setValue( baseKey + QStringLiteral( "selected" ), txtName->text() ); if ( chkStorePassword->isChecked() && QMessageBox::question( this, tr( "Saving Passwords" ), tr( "WARNING: You have opted to save your password. It will be stored in plain text in your project files and in your home directory on Unix-like systems, or in your user profile on Windows. If you do not want this to happen, please press the Cancel button.\n" ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // warn if entry was renamed to an existing connection if ( ( mOriginalConnName.isNull() || mOriginalConnName.compare( txtName->text(), Qt::CaseInsensitive ) != 0 ) && ( settings.contains( baseKey + txtName->text() + QStringLiteral( "/service" ) ) || settings.contains( baseKey + txtName->text() + QStringLiteral( "/host" ) ) ) && QMessageBox::question( this, tr( "Save Connection" ), tr( "Should the existing connection %1 be overwritten?" ).arg( txtName->text() ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // on rename delete the original entry first if ( !mOriginalConnName.isNull() && mOriginalConnName != txtName->text() ) { settings.remove( baseKey + mOriginalConnName ); settings.sync(); } baseKey += txtName->text(); settings.setValue( baseKey + QStringLiteral( "/database" ), txtDatabase->text() ); settings.setValue( baseKey + QStringLiteral( "/host" ), txtHost->text() ); settings.setValue( baseKey + QStringLiteral( "/port" ), txtPort->text() ); settings.setValue( baseKey + QStringLiteral( "/username" ), chkStoreUsername->isChecked() ? txtUsername->text() : QString() ); settings.setValue( baseKey + QStringLiteral( "/password" ), chkStorePassword->isChecked() ? txtPassword->text() : QString() ); settings.setValue( baseKey + QStringLiteral( "/userTablesOnly" ), cb_userTablesOnly->isChecked() ); settings.setValue( baseKey + QStringLiteral( "/geometryColumnsOnly" ), cb_geometryColumnsOnly->isChecked() ); settings.setValue( baseKey + QStringLiteral( "/allowGeometrylessTables" ), cb_allowGeometrylessTables->isChecked() ); settings.setValue( baseKey + QStringLiteral( "/estimatedMetadata" ), cb_useEstimatedMetadata->isChecked() ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ); settings.setValue( baseKey + QStringLiteral( "/onlyExistingTypes" ), cb_onlyExistingTypes->isChecked() ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ); settings.setValue( baseKey + QStringLiteral( "/includeGeoAttributes" ), cb_includeGeoAttributes->isChecked() ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ); settings.setValue( baseKey + QStringLiteral( "/saveUsername" ), chkStoreUsername->isChecked() ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ); settings.setValue( baseKey + QStringLiteral( "/savePassword" ), chkStorePassword->isChecked() ? QStringLiteral( "true" ) : QStringLiteral( "false" ) ); settings.setValue( baseKey + QStringLiteral( "/dboptions" ), txtOptions->text() ); settings.setValue( baseKey + QStringLiteral( "/dbworkspace" ), txtWorkspace->text() ); settings.setValue( baseKey + QStringLiteral( "/schema" ), txtSchema->text() ); QDialog::accept(); }
void QgsOgrSourceSelect::deleteConnection() { QgsSettings settings; QString key = '/' + cmbDatabaseTypes->currentText() + "/connections/" + cmbConnections->currentText(); QString msg = tr( "Are you sure you want to remove the %1 connection and all associated settings?" ) .arg( cmbConnections->currentText() ); QMessageBox::StandardButton result = QMessageBox::information( this, tr( "Confirm Delete" ), msg, QMessageBox::Ok | QMessageBox::Cancel ); if ( result == QMessageBox::Ok ) { settings.remove( key + "/host" ); settings.remove( key + "/database" ); settings.remove( key + "/username" ); settings.remove( key + "/password" ); settings.remove( key + "/port" ); settings.remove( key + "/save" ); settings.remove( key ); cmbConnections->removeItem( cmbConnections->currentIndex() ); // populateConnectionList(); setConnectionListPosition(); } }
void TestQgsOgrProvider::setupProxy() { QgsSettings settings; { settings.setValue( QStringLiteral( "proxy/proxyEnabled" ), true ); settings.setValue( QStringLiteral( "proxy/proxyPort" ), QStringLiteral( "1234" ) ); settings.setValue( QStringLiteral( "proxy/proxyHost" ), QStringLiteral( "myproxyhostname.com" ) ); settings.setValue( QStringLiteral( "proxy/proxyUser" ), QStringLiteral( "username" ) ); settings.setValue( QStringLiteral( "proxy/proxyPassword" ), QStringLiteral( "password" ) ); settings.setValue( QStringLiteral( "proxy/proxyExcludedUrls" ), QStringLiteral( "http://www.myhost.com|http://www.myotherhost.com" ) ); QgsNetworkAccessManager::instance()->setupDefaultProxyAndCache(); QgsVectorLayer vl( mTestDataDir + '/' + QStringLiteral( "lines.shp" ), QStringLiteral( "proxy_test" ), QLatin1Literal( "ogr" ) ); QVERIFY( vl.isValid() ); const char *proxyConfig = CPLGetConfigOption( "GDAL_HTTP_PROXY", nullptr ); QCOMPARE( proxyConfig, "myproxyhostname.com:1234" ); const char *proxyCredentials = CPLGetConfigOption( "GDAL_HTTP_PROXYUSERPWD", nullptr ); QCOMPARE( proxyCredentials, "username:password" ); } { // Test partial config settings.setValue( QStringLiteral( "proxy/proxyEnabled" ), true ); settings.remove( QStringLiteral( "proxy/proxyPort" ) ); settings.setValue( QStringLiteral( "proxy/proxyHost" ), QStringLiteral( "myproxyhostname.com" ) ); settings.setValue( QStringLiteral( "proxy/proxyUser" ), QStringLiteral( "username" ) ); settings.remove( QStringLiteral( "proxy/proxyPassword" ) ); QgsNetworkAccessManager::instance()->setupDefaultProxyAndCache(); QgsVectorLayer vl( mTestDataDir + '/' + QStringLiteral( "lines.shp" ), QStringLiteral( "proxy_test" ), QLatin1Literal( "ogr" ) ); QVERIFY( vl.isValid() ); const char *proxyConfig = CPLGetConfigOption( "GDAL_HTTP_PROXY", nullptr ); QCOMPARE( proxyConfig, "myproxyhostname.com" ); const char *proxyCredentials = CPLGetConfigOption( "GDAL_HTTP_PROXYUSERPWD", nullptr ); QCOMPARE( proxyCredentials, "username" ); } }
//! Autoconnected SLOTS * void QgsMssqlNewConnection::accept() { QgsSettings settings; QString baseKey = QStringLiteral( "/MSSQL/connections/" ); settings.setValue( baseKey + "selected", txtName->text() ); // warn if entry was renamed to an existing connection if ( ( mOriginalConnName.isNull() || mOriginalConnName.compare( txtName->text(), Qt::CaseInsensitive ) != 0 ) && ( settings.contains( baseKey + txtName->text() + "/service" ) || settings.contains( baseKey + txtName->text() + "/host" ) ) && QMessageBox::question( this, tr( "Save Connection" ), tr( "Should the existing connection %1 be overwritten?" ).arg( txtName->text() ), QMessageBox::Ok | QMessageBox::Cancel ) == QMessageBox::Cancel ) { return; } // on rename delete the original entry first if ( !mOriginalConnName.isNull() && mOriginalConnName != txtName->text() ) { settings.remove( baseKey + mOriginalConnName ); settings.sync(); } baseKey += txtName->text(); QString database; QListWidgetItem *item = listDatabase->currentItem(); if ( item && item->text() != QLatin1String( "(from service)" ) ) { database = item->text(); } settings.setValue( baseKey + "/service", txtService->text() ); settings.setValue( baseKey + "/host", txtHost->text() ); settings.setValue( baseKey + "/database", database ); settings.setValue( baseKey + "/username", chkStoreUsername->isChecked() ? txtUsername->text() : QString() ); settings.setValue( baseKey + "/password", chkStorePassword->isChecked() ? txtPassword->text() : QString() ); settings.setValue( baseKey + "/saveUsername", chkStoreUsername->isChecked() ? "true" : "false" ); settings.setValue( baseKey + "/savePassword", chkStorePassword->isChecked() ? "true" : "false" ); settings.setValue( baseKey + "/geometryColumns", cb_geometryColumns->isChecked() ); settings.setValue( baseKey + "/allowGeometrylessTables", cb_allowGeometrylessTables->isChecked() ); settings.setValue( baseKey + "/estimatedMetadata", cb_useEstimatedMetadata->isChecked() ); QDialog::accept(); }
void QgsOwsConnection::deleteConnection( const QString &service, const QString &name ) { QgsSettings settings; settings.remove( "qgis/connections-" + service.toLower() + '/' + name ); settings.remove( "qgis/" + service + '/' + name ); }
void QgsGeoPackageConnection::deleteConnection( const QString &name ) { QgsSettings settings; settings.remove( QStringLiteral( "%1/%2" ).arg( connectionsPath(), name ) ); }
void QgsNewHttpConnection::accept() { QgsSettings settings; QString key = mBaseKey + txtName->text(); QString credentialsKey = "qgis/" + mCredentialsBaseKey + '/' + txtName->text(); if ( !validate() ) return; // on rename delete original entry first if ( !mOriginalConnName.isNull() && mOriginalConnName != key ) { settings.remove( mBaseKey + mOriginalConnName ); settings.remove( "qgis/" + mCredentialsBaseKey + '/' + mOriginalConnName ); settings.sync(); } QUrl url( urlTrimmed() ); settings.setValue( key + "/url", url.toString() ); QString wfsKey = wfsSettingsKey( mBaseKey, txtName->text() ); QString wmsKey = wmsSettingsKey( mBaseKey, txtName->text() ); if ( mTypes & ConnectionWfs ) { settings.setValue( wfsKey + "/ignoreAxisOrientation", cbxWfsIgnoreAxisOrientation->isChecked() ); settings.setValue( wfsKey + "/invertAxisOrientation", cbxWfsInvertAxisOrientation->isChecked() ); } if ( mTypes & ConnectionWms || mTypes & ConnectionWcs ) { settings.setValue( wmsKey + "/ignoreAxisOrientation", cbxWmsIgnoreAxisOrientation->isChecked() ); settings.setValue( wmsKey + "/invertAxisOrientation", cbxWmsInvertAxisOrientation->isChecked() ); settings.setValue( wmsKey + "/ignoreGetMapURI", cbxIgnoreGetMapURI->isChecked() ); settings.setValue( wmsKey + "/smoothPixmapTransform", cbxSmoothPixmapTransform->isChecked() ); int dpiMode = 0; switch ( cmbDpiMode->currentIndex() ) { case 0: // all => QGIS|UMN|GeoServer dpiMode = 7; break; case 1: // off dpiMode = 0; break; case 2: // QGIS dpiMode = 1; break; case 3: // UMN dpiMode = 2; break; case 4: // GeoServer dpiMode = 4; break; } settings.setValue( wmsKey + "/dpiMode", dpiMode ); settings.setValue( wmsKey + "/referer", txtReferer->text() ); } if ( mTypes & ConnectionWms ) { settings.setValue( wmsKey + "/ignoreGetFeatureInfoURI", cbxIgnoreGetFeatureInfoURI->isChecked() ); } if ( mTypes & ConnectionWfs ) { QString version = QStringLiteral( "auto" ); switch ( cmbVersion->currentIndex() ) { case 0: version = QStringLiteral( "auto" ); break; case 1: version = QStringLiteral( "1.0.0" ); break; case 2: version = QStringLiteral( "1.1.0" ); break; case 3: version = QStringLiteral( "2.0.0" ); break; } settings.setValue( wfsKey + "/version", version ); settings.setValue( wfsKey + "/maxnumfeatures", txtMaxNumFeatures->text() ); settings.setValue( wfsKey + "/pagesize", txtPageSize->text() ); settings.setValue( wfsKey + "/pagingenabled", cbxWfsFeaturePaging->isChecked() ); } settings.setValue( credentialsKey + "/username", mAuthSettings->username() ); settings.setValue( credentialsKey + "/password", mAuthSettings->password() ); settings.setValue( credentialsKey + "/authcfg", mAuthSettings->configId() ); settings.setValue( mBaseKey + "/selected", txtName->text() ); QDialog::accept(); }
bool QgsAuthOAuth2Method::updateNetworkRequest( QNetworkRequest &request, const QString &authcfg, const QString &dataprovider ) { Q_UNUSED( dataprovider ) QMutexLocker locker( &mNetworkRequestMutex ); QString msg; QgsO2 *o2 = getOAuth2Bundle( authcfg ); if ( !o2 ) { msg = QStringLiteral( "Update request FAILED for authcfg %1: null object for requestor" ).arg( authcfg ); QgsMessageLog::logMessage( msg, AUTH_METHOD_KEY, Qgis::MessageLevel::Warning ); return false; } if ( o2->linked() ) { // Check if the cache file has been deleted outside core method routines QString tokencache = QgsAuthOAuth2Config::tokenCachePath( authcfg, !o2->oauth2config()->persistToken() ); if ( !QFile::exists( tokencache ) ) { msg = QStringLiteral( "Token cache removed for authcfg %1: unlinking authenticator" ).arg( authcfg ); QgsMessageLog::logMessage( msg, AUTH_METHOD_KEY, Qgis::MessageLevel::Info ); o2->unlink(); } } if ( o2->linked() ) { // First, check if it is expired bool expired = false; if ( o2->expires() > 0 ) // QStringLiteral("").toInt() result for tokens with no expiration { int cursecs = static_cast<int>( QDateTime::currentDateTime().toMSecsSinceEpoch() / 1000 ); expired = ( ( o2->expires() - cursecs ) < 120 ); // try refresh with expired or two minutes to go } if ( expired ) { msg = QStringLiteral( "Token expired, attempting refresh for authcfg %1" ).arg( authcfg ); QgsMessageLog::logMessage( msg, AUTH_METHOD_KEY, Qgis::MessageLevel::Info ); // Try to get a refresh token first // go into local event loop and wait for a fired refresh-related slot QEventLoop rloop( nullptr ); connect( o2, &QgsO2::refreshFinished, &rloop, &QEventLoop::quit ); // Asynchronously attempt the refresh // TODO: This already has a timed reply setup in O2 base class (and in QgsNetworkAccessManager!) // May need to address this or app crashes will occur! o2->refresh(); // block request update until asynchronous linking loop is quit rloop.exec( QEventLoop::ExcludeUserInputEvents ); // refresh result should set o2 to (un)linked } } if ( !o2->linked() ) { // link app // clear any previous token session properties o2->unlink(); connect( o2, &QgsO2::linkedChanged, this, &QgsAuthOAuth2Method::onLinkedChanged, Qt::UniqueConnection ); connect( o2, &QgsO2::linkingFailed, this, &QgsAuthOAuth2Method::onLinkingFailed, Qt::UniqueConnection ); connect( o2, &QgsO2::linkingSucceeded, this, &QgsAuthOAuth2Method::onLinkingSucceeded, Qt::UniqueConnection ); connect( o2, &QgsO2::openBrowser, this, &QgsAuthOAuth2Method::onOpenBrowser, Qt::UniqueConnection ); connect( o2, &QgsO2::closeBrowser, this, &QgsAuthOAuth2Method::onCloseBrowser, Qt::UniqueConnection ); connect( o2, &QgsO2::getAuthCode, this, &QgsAuthOAuth2Method::onAuthCode, Qt::UniqueConnection ); connect( this, &QgsAuthOAuth2Method::setAuthCode, o2, &QgsO2::onSetAuthCode, Qt::UniqueConnection ); //qRegisterMetaType<QNetworkReply::NetworkError>( QStringLiteral( "QNetworkReply::NetworkError" )) // for Qt::QueuedConnection, if needed; connect( o2, &QgsO2::refreshFinished, this, &QgsAuthOAuth2Method::onRefreshFinished, Qt::UniqueConnection ); QgsSettings settings; QString timeoutkey = QStringLiteral( "qgis/networkAndProxy/networkTimeout" ); int prevtimeout = settings.value( timeoutkey, QStringLiteral( "-1" ) ).toInt(); int reqtimeout = o2->oauth2config()->requestTimeout() * 1000; settings.setValue( timeoutkey, reqtimeout ); // go into local event loop and wait for a fired linking-related slot QEventLoop loop( nullptr ); connect( o2, &QgsO2::linkingFailed, &loop, &QEventLoop::quit ); connect( o2, &QgsO2::linkingSucceeded, &loop, &QEventLoop::quit ); // add singlshot timer to quit linking after an alloted timeout // this should keep the local event loop from blocking forever QTimer timer( nullptr ); timer.setInterval( reqtimeout * 5 ); timer.setSingleShot( true ); connect( &timer, &QTimer::timeout, o2, &QgsO2::linkingFailed ); timer.start(); // asynchronously attempt the linking o2->link(); // block request update until asynchronous linking loop is quit loop.exec(); if ( timer.isActive() ) { timer.stop(); } // don't re-apply a setting that wasn't already set if ( prevtimeout == -1 ) { settings.remove( timeoutkey ); } else { settings.setValue( timeoutkey, prevtimeout ); } if ( !o2->linked() ) { msg = QStringLiteral( "Update request FAILED for authcfg %1: requestor could not link app" ).arg( authcfg ); QgsMessageLog::logMessage( msg, AUTH_METHOD_KEY, Qgis::MessageLevel::Warning ); return false; } } if ( o2->token().isEmpty() ) { msg = QStringLiteral( "Update request FAILED for authcfg %1: access token is empty" ).arg( authcfg ); QgsMessageLog::logMessage( msg, AUTH_METHOD_KEY, Qgis::MessageLevel::Warning ); return false; } // update the request QgsAuthOAuth2Config::AccessMethod accessmethod = o2->oauth2config()->accessMethod(); QUrl url = request.url(); QUrlQuery query( url ); switch ( accessmethod ) { case QgsAuthOAuth2Config::Header: request.setRawHeader( O2_HTTP_AUTHORIZATION_HEADER, QStringLiteral( "Bearer %1" ).arg( o2->token() ).toAscii() ); msg = QStringLiteral( "Updated request HEADER with access token for authcfg: %1" ).arg( authcfg ); QgsMessageLog::logMessage( msg, AUTH_METHOD_KEY, Qgis::MessageLevel::Info ); break; case QgsAuthOAuth2Config::Form: // FIXME: what to do here if the parent request is not POST? // probably have to skip this until auth system support is moved into QgsNetworkAccessManager msg = QStringLiteral( "Update request FAILED for authcfg %1: form POST token update is unsupported" ).arg( authcfg ); QgsMessageLog::logMessage( msg, AUTH_METHOD_KEY, Qgis::MessageLevel::Warning ); break; case QgsAuthOAuth2Config::Query: if ( !query.hasQueryItem( O2_OAUTH2_ACCESS_TOKEN ) ) { query.addQueryItem( O2_OAUTH2_ACCESS_TOKEN, o2->token() ); url.setQuery( query ); request.setUrl( url ); msg = QStringLiteral( "Updated request QUERY with access token for authcfg: %1" ).arg( authcfg ); } else { msg = QStringLiteral( "Updated request QUERY with access token SKIPPED (existing token) for authcfg: %1" ).arg( authcfg ); } QgsMessageLog::logMessage( msg, AUTH_METHOD_KEY, Qgis::MessageLevel::Info ); break; } return true; }