From 9132c59638b8bdfcf8af47f2fc8cd92ac55a7f62 Mon Sep 17 00:00:00 2001 From: Yuriy Puchkov Date: Tue, 4 Aug 2020 09:29:20 +0300 Subject: [PATCH 1/3] Read proxy settings from OS settings (for Windows) --- src/tools/imgs3/imgs3uploader.cpp | 142 ++++++++++++++++++------------ src/tools/imgs3/imgs3uploader.h | 1 + 2 files changed, 86 insertions(+), 57 deletions(-) diff --git a/src/tools/imgs3/imgs3uploader.cpp b/src/tools/imgs3/imgs3uploader.cpp index f5f6bb09..52ea4dd1 100644 --- a/src/tools/imgs3/imgs3uploader.cpp +++ b/src/tools/imgs3/imgs3uploader.cpp @@ -50,6 +50,7 @@ ImgS3Uploader::ImgS3Uploader(const QPixmap &capture, QWidget *parent) : QWidget(parent), m_pixmap(capture) { + m_proxy = nullptr; setWindowTitle(tr("Upload to ImgS3")); setWindowIcon(QIcon(":img/app/flameshot.svg")); @@ -64,84 +65,111 @@ ImgS3Uploader::ImgS3Uploader(const QPixmap &capture, QWidget *parent) : m_vLayout->addWidget(m_spinner, 0, Qt::AlignHCenter); m_vLayout->addWidget(m_infoLabel); + setAttribute(Qt::WA_DeleteOnClose); + + // get enterprise settings + m_configEnterprise = new ConfigEnterprise(); + + // get s3 credentials + QSettings *settings = m_configEnterprise->settings(); + settings->beginGroup("S3"); + m_s3CredsUrl = settings->value("S3_CREDS_URL").toString(); + m_s3XApiKey = settings->value("S3_X_API_KEY").toString(); + settings->endGroup(); + + initNetwork(); + upload(); +} + +void ImgS3Uploader::initNetwork() { + // Init network m_NetworkAM = new QNetworkAccessManager(this); connect(m_NetworkAM, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleReply); m_NetworkAMCreds = new QNetworkAccessManager(this); connect(m_NetworkAMCreds, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleCredsReply); - setAttribute(Qt::WA_DeleteOnClose); - - // get enterprise settings - m_configEnterprise = new ConfigEnterprise(); QSettings *settings = m_configEnterprise->settings(); - // get s3 credentials - settings->beginGroup("S3"); - m_s3CredsUrl = settings->value("S3_CREDS_URL").toString(); - m_s3XApiKey = settings->value("S3_X_API_KEY").toString(); - settings->endGroup(); + // Get proxy settings from OS settings + QNetworkProxyQuery q(QUrl(m_s3CredsUrl.toUtf8())); + q.setQueryType(QNetworkProxyQuery::UrlRequest); + q.setProtocolTag("http"); - // set proxy server parameters - QString httpProxyHost = settings->value("HTTP_PROXY_HOST").toString(); - if(httpProxyHost.length() > 0) { - qDebug() << "Using proxy server"; - m_proxy = new QNetworkProxy(); + QList proxies = QNetworkProxyFactory::systemProxyForQuery(q); + if( proxies.size() > 0 && proxies[0].type() != QNetworkProxy::NoProxy ){ + m_proxy = &proxies[0]; + } + else { + // get proxy settings from "config.ini" file + QString httpProxyHost = settings->value("HTTP_PROXY_HOST").toString(); + if(httpProxyHost.length() > 0) { + m_proxy = new QNetworkProxy(); - if(settings->contains("HTTP_PROXY_TYPE")) { - switch (settings->value("HTTP_PROXY_TYPE").toInt()) { - case 0: - m_proxy->setType(QNetworkProxy::DefaultProxy); - break; - case 1: - m_proxy->setType(QNetworkProxy::Socks5Proxy); - break; - case 2: - m_proxy->setType(QNetworkProxy::NoProxy); - break; - case 4: - m_proxy->setType(QNetworkProxy::HttpCachingProxy); - break; - case 5: - m_proxy->setType(QNetworkProxy::FtpCachingProxy); - break; - case 3: - default: - m_proxy->setType(QNetworkProxy::HttpProxy); - break; + if(settings->contains("HTTP_PROXY_TYPE")) { + switch (settings->value("HTTP_PROXY_TYPE").toInt()) { + case 0: + m_proxy->setType(QNetworkProxy::DefaultProxy); + break; + case 1: + m_proxy->setType(QNetworkProxy::Socks5Proxy); + break; + case 2: + m_proxy->setType(QNetworkProxy::NoProxy); + break; + case 4: + m_proxy->setType(QNetworkProxy::HttpCachingProxy); + break; + case 5: + m_proxy->setType(QNetworkProxy::FtpCachingProxy); + break; + case 3: + default: + m_proxy->setType(QNetworkProxy::HttpProxy); + break; + } + } + } + + // set proxy server parameters + if(httpProxyHost.length() > 0) { + m_proxy->setHostName(httpProxyHost); + + int nProxyPort = 3128; + if(settings->contains("HTTP_PROXY_PORT")) { + nProxyPort = settings->value("HTTP_PROXY_PORT").toInt(); + } + m_proxy->setPort(nProxyPort); + + if(settings->contains("HTTP_PROXY_USER")) { + qDebug() << "Proxy user" << settings->value("HTTP_PROXY_PASSWORD").toString(); + m_proxy->setUser(settings->value("HTTP_PROXY_USER").toString()); + } + if(settings->contains("HTTP_PROXY_PASSWORD")) { + qDebug() << "Proxy password is not empty"; + m_proxy->setPassword(settings->value("HTTP_PROXY_PASSWORD").toString()); } } } - // set proxy server parameters - if(httpProxyHost.length() > 0) { - m_proxy->setHostName(httpProxyHost); + if(m_proxy != nullptr) { + qDebug() << "Using proxy server"; + qDebug() << "proxy host:" << m_proxy->hostName(); + qDebug() << "proxy port:" << m_proxy->port(); + qDebug() << "proxy type:" << m_proxy->type(); + qDebug() << "proxy user:" << (m_proxy->user().length() > 0 ? m_proxy->user() : "no user"); + qDebug() << "proxy password:" << (m_proxy->password().length() > 0 ? "***" : "no password"); - int nProxyPort = 3128; - if(settings->contains("HTTP_PROXY_PORT")) { - nProxyPort = settings->value("HTTP_PROXY_PORT").toInt(); - } - m_proxy->setPort(nProxyPort); - - qDebug() << "Proxy Host" << httpProxyHost; - qDebug() << "Proxy Port" << nProxyPort; - - if(settings->contains("HTTP_PROXY_USER")) { - qDebug() << "Proxy user" << settings->value("HTTP_PROXY_PASSWORD").toString(); - m_proxy->setUser(settings->value("HTTP_PROXY_USER").toString()); - } - if(settings->contains("HTTP_PROXY_PASSWORD")) { - qDebug() << "Proxy password is not empty"; - m_proxy->setPassword(settings->value("HTTP_PROXY_PASSWORD").toString()); - } QNetworkProxy::setApplicationProxy(*m_proxy); m_NetworkAM->setProxy(*m_proxy); m_NetworkAMCreds->setProxy(*m_proxy); } - - upload(); + else { + qDebug() << "No proxy"; + } } + void ImgS3Uploader::handleReply(QNetworkReply *reply) { m_spinner->deleteLater(); if (reply->error() == QNetworkReply::NoError) { diff --git a/src/tools/imgs3/imgs3uploader.h b/src/tools/imgs3/imgs3uploader.h index d6a72b37..3df0a224 100644 --- a/src/tools/imgs3/imgs3uploader.h +++ b/src/tools/imgs3/imgs3uploader.h @@ -48,6 +48,7 @@ private slots: private: void uploadToS3(QJsonDocument &response); + void initNetwork(); private: ConfigEnterprise *m_configEnterprise; From 1515db4f212252114780904a9baeecc11b451f0a Mon Sep 17 00:00:00 2001 From: Yuriy Puchkov Date: Tue, 4 Aug 2020 11:31:35 +0300 Subject: [PATCH 2/3] Chage proxy setting priorities: config.ini - first, windows settins - next if no proxy settings in config.ini --- src/tools/imgs3/imgs3uploader.cpp | 102 ++++++++++++++---------------- 1 file changed, 49 insertions(+), 53 deletions(-) diff --git a/src/tools/imgs3/imgs3uploader.cpp b/src/tools/imgs3/imgs3uploader.cpp index 52ea4dd1..267886ac 100644 --- a/src/tools/imgs3/imgs3uploader.cpp +++ b/src/tools/imgs3/imgs3uploader.cpp @@ -89,66 +89,62 @@ void ImgS3Uploader::initNetwork() { m_NetworkAMCreds = new QNetworkAccessManager(this); connect(m_NetworkAMCreds, &QNetworkAccessManager::finished, this, &ImgS3Uploader::handleCredsReply); + // get proxy settings from "config.ini" file QSettings *settings = m_configEnterprise->settings(); + QString httpProxyHost = settings->value("HTTP_PROXY_HOST").toString(); + if(httpProxyHost.length() > 0) { + m_proxy = new QNetworkProxy(); - // Get proxy settings from OS settings - QNetworkProxyQuery q(QUrl(m_s3CredsUrl.toUtf8())); - q.setQueryType(QNetworkProxyQuery::UrlRequest); - q.setProtocolTag("http"); - - QList proxies = QNetworkProxyFactory::systemProxyForQuery(q); - if( proxies.size() > 0 && proxies[0].type() != QNetworkProxy::NoProxy ){ - m_proxy = &proxies[0]; - } - else { - // get proxy settings from "config.ini" file - QString httpProxyHost = settings->value("HTTP_PROXY_HOST").toString(); - if(httpProxyHost.length() > 0) { - m_proxy = new QNetworkProxy(); - - if(settings->contains("HTTP_PROXY_TYPE")) { - switch (settings->value("HTTP_PROXY_TYPE").toInt()) { - case 0: - m_proxy->setType(QNetworkProxy::DefaultProxy); - break; - case 1: - m_proxy->setType(QNetworkProxy::Socks5Proxy); - break; - case 2: - m_proxy->setType(QNetworkProxy::NoProxy); - break; - case 4: - m_proxy->setType(QNetworkProxy::HttpCachingProxy); - break; - case 5: - m_proxy->setType(QNetworkProxy::FtpCachingProxy); - break; - case 3: - default: - m_proxy->setType(QNetworkProxy::HttpProxy); - break; - } + if(settings->contains("HTTP_PROXY_TYPE")) { + switch (settings->value("HTTP_PROXY_TYPE").toInt()) { + case 0: + m_proxy->setType(QNetworkProxy::DefaultProxy); + break; + case 1: + m_proxy->setType(QNetworkProxy::Socks5Proxy); + break; + case 2: + m_proxy->setType(QNetworkProxy::NoProxy); + break; + case 4: + m_proxy->setType(QNetworkProxy::HttpCachingProxy); + break; + case 5: + m_proxy->setType(QNetworkProxy::FtpCachingProxy); + break; + case 3: + default: + m_proxy->setType(QNetworkProxy::HttpProxy); + break; } } - // set proxy server parameters - if(httpProxyHost.length() > 0) { - m_proxy->setHostName(httpProxyHost); + m_proxy->setHostName(httpProxyHost); + int nProxyPort = 3128; + if(settings->contains("HTTP_PROXY_PORT")) { + nProxyPort = settings->value("HTTP_PROXY_PORT").toInt(); + } + m_proxy->setPort(nProxyPort); - int nProxyPort = 3128; - if(settings->contains("HTTP_PROXY_PORT")) { - nProxyPort = settings->value("HTTP_PROXY_PORT").toInt(); - } - m_proxy->setPort(nProxyPort); + if(settings->contains("HTTP_PROXY_USER")) { + qDebug() << "Proxy user" << settings->value("HTTP_PROXY_PASSWORD").toString(); + m_proxy->setUser(settings->value("HTTP_PROXY_USER").toString()); + } + if(settings->contains("HTTP_PROXY_PASSWORD")) { + qDebug() << "Proxy password is not empty"; + m_proxy->setPassword(settings->value("HTTP_PROXY_PASSWORD").toString()); + } + } - if(settings->contains("HTTP_PROXY_USER")) { - qDebug() << "Proxy user" << settings->value("HTTP_PROXY_PASSWORD").toString(); - m_proxy->setUser(settings->value("HTTP_PROXY_USER").toString()); - } - if(settings->contains("HTTP_PROXY_PASSWORD")) { - qDebug() << "Proxy password is not empty"; - m_proxy->setPassword(settings->value("HTTP_PROXY_PASSWORD").toString()); - } + if(m_proxy == nullptr) { + // Get proxy settings from OS settings + QNetworkProxyQuery q(QUrl(m_s3CredsUrl.toUtf8())); + q.setQueryType(QNetworkProxyQuery::UrlRequest); + q.setProtocolTag("http"); + + QList proxies = QNetworkProxyFactory::systemProxyForQuery(q); + if( proxies.size() > 0 && proxies[0].type() != QNetworkProxy::NoProxy ){ + m_proxy = &proxies[0]; } } From ae6ceac395bb3b4de60fc2318a2d49d5d669f691 Mon Sep 17 00:00:00 2001 From: Yuriy Puchkov Date: Tue, 4 Aug 2020 13:17:31 +0300 Subject: [PATCH 3/3] Fix crash on system proxy is set but not available (on Windows) --- src/tools/imgs3/imgs3uploader.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/tools/imgs3/imgs3uploader.cpp b/src/tools/imgs3/imgs3uploader.cpp index 267886ac..6357a7b5 100644 --- a/src/tools/imgs3/imgs3uploader.cpp +++ b/src/tools/imgs3/imgs3uploader.cpp @@ -92,7 +92,7 @@ void ImgS3Uploader::initNetwork() { // get proxy settings from "config.ini" file QSettings *settings = m_configEnterprise->settings(); QString httpProxyHost = settings->value("HTTP_PROXY_HOST").toString(); - if(httpProxyHost.length() > 0) { + if(httpProxyHost.length() > 0 && m_proxy == nullptr) { m_proxy = new QNetworkProxy(); if(settings->contains("HTTP_PROXY_TYPE")) { @@ -135,8 +135,7 @@ void ImgS3Uploader::initNetwork() { m_proxy->setPassword(settings->value("HTTP_PROXY_PASSWORD").toString()); } } - - if(m_proxy == nullptr) { + else { // Get proxy settings from OS settings QNetworkProxyQuery q(QUrl(m_s3CredsUrl.toUtf8())); q.setQueryType(QNetworkProxyQuery::UrlRequest); @@ -144,7 +143,12 @@ void ImgS3Uploader::initNetwork() { QList proxies = QNetworkProxyFactory::systemProxyForQuery(q); if( proxies.size() > 0 && proxies[0].type() != QNetworkProxy::NoProxy ){ - m_proxy = &proxies[0]; + m_proxy = new QNetworkProxy(); + m_proxy->setHostName(proxies[0].hostName()); + m_proxy->setPort(proxies[0].port()); + m_proxy->setType(proxies[0].type()); + m_proxy->setUser(proxies[0].user()); + m_proxy->setPassword(proxies[0].password()); } } @@ -156,6 +160,7 @@ void ImgS3Uploader::initNetwork() { qDebug() << "proxy user:" << (m_proxy->user().length() > 0 ? m_proxy->user() : "no user"); qDebug() << "proxy password:" << (m_proxy->password().length() > 0 ? "***" : "no password"); + QNetworkProxy::setApplicationProxy(*m_proxy); m_NetworkAM->setProxy(*m_proxy); m_NetworkAMCreds->setProxy(*m_proxy);