diff --git a/src/librssguard/network-web/basenetworkaccessmanager.cpp b/src/librssguard/network-web/basenetworkaccessmanager.cpp index 89e05ef06..5954d7c67 100644 --- a/src/librssguard/network-web/basenetworkaccessmanager.cpp +++ b/src/librssguard/network-web/basenetworkaccessmanager.cpp @@ -21,9 +21,9 @@ void BaseNetworkAccessManager::loadSettings() { SETTING(Proxy::Type)). toInt()); - if (selected_proxy_type == QNetworkProxy::NoProxy) { + if (selected_proxy_type == QNetworkProxy::ProxyType::NoProxy) { // No extra setting is needed, set new proxy and exit this method. - setProxy(QNetworkProxy::NoProxy); + setProxy(QNetworkProxy::ProxyType::NoProxy); } else { setProxy(QNetworkProxy::applicationProxy()); diff --git a/src/librssguard/network-web/basenetworkaccessmanager.h b/src/librssguard/network-web/basenetworkaccessmanager.h index 8d7cdc87c..ae550e49a 100644 --- a/src/librssguard/network-web/basenetworkaccessmanager.h +++ b/src/librssguard/network-web/basenetworkaccessmanager.h @@ -10,8 +10,6 @@ class BaseNetworkAccessManager : public QNetworkAccessManager { Q_OBJECT public: - - // Constructors and desctructors. explicit BaseNetworkAccessManager(QObject* parent = nullptr); public slots: diff --git a/src/librssguard/network-web/downloader.cpp b/src/librssguard/network-web/downloader.cpp index f46a71b43..f9ad50f7d 100644 --- a/src/librssguard/network-web/downloader.cpp +++ b/src/librssguard/network-web/downloader.cpp @@ -282,6 +282,12 @@ QVariant Downloader::lastContentType() const { return m_lastContentType; } +void Downloader::setProxy(const QNetworkProxy& proxy) { + qWarningNN << LOGSEC_NETWORK << "Setting custom proxy:" << QUOTE_W_SPACE_DOT(proxy.hostName()); + + m_downloadManager->setProxy(proxy); +} + void Downloader::cancel() { if (m_activeReply != nullptr) { // Download action timed-out, too slow connection or target is not reachable. diff --git a/src/librssguard/network-web/downloader.h b/src/librssguard/network-web/downloader.h index a2bc4f667..f0421bb4a 100644 --- a/src/librssguard/network-web/downloader.h +++ b/src/librssguard/network-web/downloader.h @@ -9,6 +9,7 @@ #include "network-web/httpresponse.h" #include +#include #include #include @@ -28,6 +29,8 @@ class Downloader : public QObject { QList lastOutputMultipartData() const; QVariant lastContentType() const; + void setProxy(const QNetworkProxy& proxy); + public slots: void cancel(); diff --git a/src/librssguard/network-web/networkfactory.cpp b/src/librssguard/network-web/networkfactory.cpp index 7513f423b..242794815 100644 --- a/src/librssguard/network-web/networkfactory.cpp +++ b/src/librssguard/network-web/networkfactory.cpp @@ -208,7 +208,8 @@ NetworkResult NetworkFactory::performNetworkOperation(const QString& url, int ti QByteArray& output, QNetworkAccessManager::Operation operation, QList> additional_headers, bool protected_contents, - const QString& username, const QString& password) { + const QString& username, const QString& password, + const QNetworkProxy& custom_proxy) { Downloader downloader; QEventLoop loop; NetworkResult result; @@ -222,6 +223,10 @@ NetworkResult NetworkFactory::performNetworkOperation(const QString& url, int ti } } + if (custom_proxy.type() != QNetworkProxy::ProxyType::DefaultProxy) { + downloader.setProxy(custom_proxy); + } + downloader.manipulateData(url, operation, input_data, timeout, protected_contents, username, password); loop.exec(); @@ -239,7 +244,8 @@ NetworkResult NetworkFactory::performNetworkOperation(const QString& url, QList> additional_headers, bool protected_contents, const QString& username, - const QString& password) { + const QString& password, + const QNetworkProxy& custom_proxy) { Downloader downloader; QEventLoop loop; NetworkResult result; @@ -253,6 +259,10 @@ NetworkResult NetworkFactory::performNetworkOperation(const QString& url, } } + if (custom_proxy.type() != QNetworkProxy::ProxyType::DefaultProxy) { + downloader.setProxy(custom_proxy); + } + downloader.manipulateData(url, operation, input_data, timeout, protected_contents, username, password); loop.exec(); diff --git a/src/librssguard/network-web/networkfactory.h b/src/librssguard/network-web/networkfactory.h index de821ce7a..2e5172ad1 100644 --- a/src/librssguard/network-web/networkfactory.h +++ b/src/librssguard/network-web/networkfactory.h @@ -7,6 +7,7 @@ #include #include +#include #include #include #include @@ -50,7 +51,8 @@ class NetworkFactory { QByteArray>> additional_headers = QList>(), bool protected_contents = false, const QString& username = QString(), - const QString& password = QString()); + const QString& password = QString(), + const QNetworkProxy& custom_proxy = QNetworkProxy::ProxyType::DefaultProxy); static NetworkResult performNetworkOperation(const QString& url, int timeout, QHttpMultiPart* input_data, QList& output, @@ -59,7 +61,8 @@ class NetworkFactory { QByteArray>> additional_headers = QList>(), bool protected_contents = false, const QString& username = QString(), - const QString& password = QString()); + const QString& password = QString(), + const QNetworkProxy& custom_proxy = QNetworkProxy::ProxyType::DefaultProxy); }; #endif // NETWORKFACTORY_H diff --git a/src/librssguard/services/abstract/gui/authenticationdetails.ui b/src/librssguard/services/abstract/gui/authenticationdetails.ui index e25245d80..7486efb19 100755 --- a/src/librssguard/services/abstract/gui/authenticationdetails.ui +++ b/src/librssguard/services/abstract/gui/authenticationdetails.ui @@ -14,7 +14,7 @@ Form - + Some feeds require authentication, including GMail feeds. BASIC, NTLM-2 and DIGEST-MD5 authentication schemes are supported. diff --git a/src/librssguard/services/abstract/gui/formaccountdetails.cpp b/src/librssguard/services/abstract/gui/formaccountdetails.cpp index 7bbbd32f9..874c923fe 100644 --- a/src/librssguard/services/abstract/gui/formaccountdetails.cpp +++ b/src/librssguard/services/abstract/gui/formaccountdetails.cpp @@ -16,6 +16,8 @@ FormAccountDetails::FormAccountDetails(const QIcon& icon, QWidget* parent) ? qApp->icons()->fromTheme(QSL("emblem-system")) : icon); createConnections(); + + m_proxyDetails->setProxy(QNetworkProxy()); } void FormAccountDetails::insertCustomTab(QWidget* custom_tab, const QString& title, int index) { diff --git a/src/librssguard/services/standard/gui/standardfeeddetails.cpp b/src/librssguard/services/standard/gui/standardfeeddetails.cpp index f7fb71ccd..928ca7ac8 100755 --- a/src/librssguard/services/standard/gui/standardfeeddetails.cpp +++ b/src/librssguard/services/standard/gui/standardfeeddetails.cpp @@ -78,8 +78,12 @@ StandardFeedDetails::StandardFeedDetails(QWidget* parent) : QWidget(parent) { onUrlChanged(QString()); } -void StandardFeedDetails::guessIconOnly(const QString& url, const QString& username, const QString& password) { - QPair result = StandardFeed::guessFeed(url, username, password); +void StandardFeedDetails::guessIconOnly(const QString& url, const QString& username, + const QString& password, const QNetworkProxy& custom_proxy) { + QPair result = StandardFeed::guessFeed(url, + username, + password, + custom_proxy); if (result.first != nullptr) { // Icon or whole feed was guessed. @@ -107,8 +111,12 @@ void StandardFeedDetails::guessIconOnly(const QString& url, const QString& usern } } -void StandardFeedDetails::guessFeed(const QString& url, const QString& username, const QString& password) { - QPair result = StandardFeed::guessFeed(url, username, password); +void StandardFeedDetails::guessFeed(const QString& url, const QString& username, + const QString& password, const QNetworkProxy& custom_proxy) { + QPair result = StandardFeed::guessFeed(url, + username, + password, + custom_proxy); if (result.first != nullptr) { // Icon or whole feed was guessed. diff --git a/src/librssguard/services/standard/gui/standardfeeddetails.h b/src/librssguard/services/standard/gui/standardfeeddetails.h index 406576be0..6c83dfadd 100755 --- a/src/librssguard/services/standard/gui/standardfeeddetails.h +++ b/src/librssguard/services/standard/gui/standardfeeddetails.h @@ -7,6 +7,8 @@ #include "ui_standardfeeddetails.h" +#include + class Category; class RootItem; class StandardFeed; @@ -20,8 +22,14 @@ class StandardFeedDetails : public QWidget { explicit StandardFeedDetails(QWidget* parent = nullptr); private slots: - void guessIconOnly(const QString& url, const QString& username, const QString& password); - void guessFeed(const QString& url, const QString& username, const QString& password); + void guessIconOnly(const QString& url, + const QString& username, + const QString& password, + const QNetworkProxy& custom_proxy = QNetworkProxy::ProxyType::DefaultProxy); + void guessFeed(const QString& url, + const QString& username, + const QString& password, + const QNetworkProxy& custom_proxy = QNetworkProxy::ProxyType::DefaultProxy); void onTitleChanged(const QString& new_title); void onDescriptionChanged(const QString& new_description); diff --git a/src/librssguard/services/standard/standardfeed.cpp b/src/librssguard/services/standard/standardfeed.cpp index bcb1ef019..bd1e347a3 100644 --- a/src/librssguard/services/standard/standardfeed.cpp +++ b/src/librssguard/services/standard/standardfeed.cpp @@ -111,7 +111,10 @@ QString StandardFeed::typeToString(StandardFeed::Type type) { } void StandardFeed::fetchMetadataForItself() { - QPair metadata = guessFeed(url(), username(), password()); + QPair metadata = guessFeed(url(), + username(), + password(), + getParentServiceRoot()->networkProxy()); if (metadata.first != nullptr && metadata.second == QNetworkReply::NetworkError::NoError) { // Some properties are not updated when new metadata are fetched. @@ -138,7 +141,8 @@ void StandardFeed::fetchMetadataForItself() { QPair StandardFeed::guessFeed(const QString& url, const QString& username, - const QString& password) { + const QString& password, + const QNetworkProxy& custom_proxy) { QPair result; result.first = nullptr; @@ -146,14 +150,17 @@ QPair StandardFeed::guessFeed(const QList> headers; headers << NetworkFactory::generateBasicAuthHeader(username, password); - NetworkResult network_result = NetworkFactory::performNetworkOperation(url, qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(), QByteArray(), feed_contents, QNetworkAccessManager::GetOperation, - headers); + headers, + false, + {}, + {}, + custom_proxy); result.second = network_result.first; @@ -430,7 +437,11 @@ QList StandardFeed::obtainNewMessages(bool* error_during_obtaining) { QByteArray(), feed_contents, QNetworkAccessManager::GetOperation, - headers).first; + headers, + false, + {}, + {}, + getParentServiceRoot()->networkProxy()).first; if (m_networkError != QNetworkReply::NoError) { qWarningNN << LOGSEC_CORE diff --git a/src/librssguard/services/standard/standardfeed.h b/src/librssguard/services/standard/standardfeed.h index 7029ed779..aaa2157ba 100644 --- a/src/librssguard/services/standard/standardfeed.h +++ b/src/librssguard/services/standard/standardfeed.h @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -72,7 +73,8 @@ class StandardFeed : public Feed { // or NULL feed. static QPair guessFeed(const QString& url, const QString& username = QString(), - const QString& password = QString()); + const QString& password = QString(), + const QNetworkProxy& custom_proxy = QNetworkProxy::ProxyType::DefaultProxy); // Converts particular feed type to string. static QString typeToString(Type type); diff --git a/src/librssguard/services/standard/standardfeedsimportexportmodel.cpp b/src/librssguard/services/standard/standardfeedsimportexportmodel.cpp index 6cdaec2f7..7dc0c01f9 100644 --- a/src/librssguard/services/standard/standardfeedsimportexportmodel.cpp +++ b/src/librssguard/services/standard/standardfeedsimportexportmodel.cpp @@ -152,6 +152,12 @@ void FeedsImportExportModel::importAsOPML20(const QByteArray& data, bool fetch_m int completed = 0, total = 0, succeded = 0, failed = 0; auto* root_item = new StandardServiceRoot(); QStack model_items; + QNetworkProxy custom_proxy; + + if (sourceModel()->rootItem() != nullptr && + sourceModel()->rootItem()->getParentServiceRoot() != nullptr) { + custom_proxy = sourceModel()->rootItem()->getParentServiceRoot()->networkProxy(); + } model_items.push(root_item); QStack elements_to_process; @@ -182,7 +188,7 @@ void FeedsImportExportModel::importAsOPML20(const QByteArray& data, bool fetch_m QPair guessed; if (fetch_metadata_online && - (guessed = StandardFeed::guessFeed(feed_url)).second == QNetworkReply::NoError) { + (guessed = StandardFeed::guessFeed(feed_url, {}, {}, custom_proxy)).second == QNetworkReply::NoError) { // We should obtain fresh metadata from online feed source. guessed.first->setUrl(feed_url); active_model_item->appendChild(guessed.first); @@ -287,6 +293,13 @@ void FeedsImportExportModel::importAsTxtURLPerLine(const QByteArray& data, bool emit layoutChanged(); int completed = 0, succeded = 0, failed = 0; auto* root_item = new StandardServiceRoot(); + QNetworkProxy custom_proxy; + + if (sourceModel()->rootItem() != nullptr && + sourceModel()->rootItem()->getParentServiceRoot() != nullptr) { + custom_proxy = sourceModel()->rootItem()->getParentServiceRoot()->networkProxy(); + } + QList urls = data.split('\n'); for (const QByteArray& url : urls) { @@ -294,7 +307,7 @@ void FeedsImportExportModel::importAsTxtURLPerLine(const QByteArray& data, bool QPair guessed; if (fetch_metadata_online && - (guessed = StandardFeed::guessFeed(url)).second == QNetworkReply::NoError) { + (guessed = StandardFeed::guessFeed(url, {}, {}, custom_proxy)).second == QNetworkReply::NoError) { guessed.first->setUrl(url); root_item->appendChild(guessed.first); succeded++;