diff --git a/resources/scripts/7za b/resources/scripts/7za index 47f412575..9c10723bf 160000 --- a/resources/scripts/7za +++ b/resources/scripts/7za @@ -1 +1 @@ -Subproject commit 47f4125753452eff8800dbd6600c5a05540b15d9 +Subproject commit 9c10723bfbaf6cb85107d6ee16e0324e9e487749 diff --git a/src/librssguard/exceptions/networkexception.cpp b/src/librssguard/exceptions/networkexception.cpp new file mode 100644 index 000000000..414a1f5d3 --- /dev/null +++ b/src/librssguard/exceptions/networkexception.cpp @@ -0,0 +1,11 @@ +// For license of this file, see /LICENSE.md. + +#include "exceptions/networkexception.h" + +#include "network-web/networkfactory.h" + +NetworkException::NetworkException(QNetworkReply::NetworkError error) : ApplicationException(NetworkFactory::networkErrorText(error)) {} + +QNetworkReply::NetworkError NetworkException::networkError() const { + return m_networkError; +} diff --git a/src/librssguard/exceptions/networkexception.h b/src/librssguard/exceptions/networkexception.h new file mode 100644 index 000000000..abfb09749 --- /dev/null +++ b/src/librssguard/exceptions/networkexception.h @@ -0,0 +1,20 @@ +// For license of this file, see /LICENSE.md. + +#ifndef NETWORKEXCEPTION_H +#define NETWORKEXCEPTION_H + +#include "exceptions/applicationexception.h" + +#include + +class NetworkException : public ApplicationException { + public: + explicit NetworkException(QNetworkReply::NetworkError error); + + QNetworkReply::NetworkError networkError() const; + + private: + QNetworkReply::NetworkError m_networkError; +}; + +#endif // NETWORKEXCEPTION_H diff --git a/src/librssguard/librssguard.pro b/src/librssguard/librssguard.pro index e69b18a50..898eb9f70 100644 --- a/src/librssguard/librssguard.pro +++ b/src/librssguard/librssguard.pro @@ -50,6 +50,7 @@ HEADERS += core/feeddownloader.h \ exceptions/applicationexception.h \ exceptions/filteringexception.h \ exceptions/ioexception.h \ + exceptions/networkexception.h \ exceptions/scriptexception.h \ gui/baselineedit.h \ gui/basetoolbar.h \ @@ -229,6 +230,7 @@ SOURCES += core/feeddownloader.cpp \ exceptions/applicationexception.cpp \ exceptions/filteringexception.cpp \ exceptions/ioexception.cpp \ + exceptions/networkexception.cpp \ exceptions/scriptexception.cpp \ gui/baselineedit.cpp \ gui/basetoolbar.cpp \ diff --git a/src/librssguard/miscellaneous/databasequeries.cpp b/src/librssguard/miscellaneous/databasequeries.cpp index 988b228d0..21319f5bb 100755 --- a/src/librssguard/miscellaneous/databasequeries.cpp +++ b/src/librssguard/miscellaneous/databasequeries.cpp @@ -1846,12 +1846,12 @@ bool DatabaseQueries::overwriteOwnCloudAccount(const QSqlDatabase& db, const QSt bool DatabaseQueries::createFeedlyAccount(const QSqlDatabase& db, const QString& username, const QString& developer_access_token, const QString& refresh_token, - int batch_size, int id_to_assign) { + int batch_size, int account_id) { QSqlQuery q(db); q.prepare("INSERT INTO FeedlyAccounts (id, username, developer_access_token, refresh_token, msg_limit) " "VALUES (:id, :username, :developer_access_token, :refresh_token, :msg_limit);"); - q.bindValue(QSL(":id"), id_to_assign); + q.bindValue(QSL(":id"), account_id); q.bindValue(QSL(":username"), username); q.bindValue(QSL(":developer_access_token"), developer_access_token); q.bindValue(QSL(":refresh_token"), refresh_token); @@ -1870,8 +1870,26 @@ bool DatabaseQueries::createFeedlyAccount(const QSqlDatabase& db, const QString& bool DatabaseQueries::overwriteFeedlyAccount(const QSqlDatabase& db, const QString& username, const QString& developer_access_token, const QString& refresh_token, - int batch_size, int id_to_assign) { - return {}; + int batch_size, int account_id) { + QSqlQuery query(db); + + query.prepare("UPDATE FeedlyAccounts " + "SET username = :username, developer_access_token = :developer_access_token, " + "refresh_token = :refresh_token, msg_limit = :msg_limit " + "WHERE id = :id;"); + query.bindValue(QSL(":id"), account_id); + query.bindValue(QSL(":username"), username); + query.bindValue(QSL(":developer_access_token"), developer_access_token); + query.bindValue(QSL(":refresh_token"), refresh_token); + query.bindValue(QSL(":msg_limit"), batch_size <= 0 ? FEEDLY_UNLIMITED_BATCH_SIZE : batch_size); + + if (query.exec()) { + return true; + } + else { + qCriticalNN << LOGSEC_FEEDLY << "Updating account failed:" << QUOTE_W_SPACE_DOT(query.lastError().text()); + return false; + } } bool DatabaseQueries::createGreaderAccount(const QSqlDatabase& db, int id_to_assign, const QString& username, @@ -2604,7 +2622,11 @@ QList DatabaseQueries::getFeedlyAccounts(const QSqlDatabase& db, b root->setAccountId(query.value(0).toInt()); root->network()->setUsername(query.value(1).toString()); root->network()->setDeveloperAccessToken(query.value(2).toString()); + +#if defined (FEEDLY_OFFICIAL_SUPPORT) root->network()->oauth()->setRefreshToken(query.value(3).toString()); +#endif + root->network()->setBatchSize(query.value(4).toInt()); root->updateTitle(); diff --git a/src/librssguard/miscellaneous/databasequeries.h b/src/librssguard/miscellaneous/databasequeries.h index b45bc6f41..040f16a6a 100644 --- a/src/librssguard/miscellaneous/databasequeries.h +++ b/src/librssguard/miscellaneous/databasequeries.h @@ -159,13 +159,13 @@ class DatabaseQueries { const QString& developer_access_token, const QString& refresh_token, int batch_size, - int id_to_assign); + int account_id); static bool overwriteFeedlyAccount(const QSqlDatabase& db, const QString& username, const QString& developer_access_token, const QString& refresh_token, int batch_size, - int id_to_assign); + int account_id); // Greader account. static bool deleteGreaderAccount(const QSqlDatabase& db, int account_id); diff --git a/src/librssguard/services/feedly/definitions.h b/src/librssguard/services/feedly/definitions.h index b844bc846..ce457732c 100755 --- a/src/librssguard/services/feedly/definitions.h +++ b/src/librssguard/services/feedly/definitions.h @@ -9,7 +9,7 @@ #define FEEDLY_API_REDIRECT_URI_PORT 8080 #define FEEDLY_API_SCOPE "https://cloud.feedly.com/subscriptions" -#if defined(DEBUG) +#if defined(NDEBUG) #define FEEDLY_API_URL_BASE "https://sandbox7.feedly.com/v3/" #else #define FEEDLY_API_URL_BASE "https://cloud.feedly.com/v3/" diff --git a/src/librssguard/services/feedly/feedlynetwork.cpp b/src/librssguard/services/feedly/feedlynetwork.cpp index 7661c08c2..52a38acda 100755 --- a/src/librssguard/services/feedly/feedlynetwork.cpp +++ b/src/librssguard/services/feedly/feedlynetwork.cpp @@ -3,10 +3,10 @@ #include "services/feedly/feedlynetwork.h" #include "3rd-party/boolinq/boolinq.h" +#include "exceptions/networkexception.h" #include "miscellaneous/application.h" -#include "network-web/networkfactory.h" - #include "miscellaneous/databasequeries.h" +#include "network-web/networkfactory.h" #include "network-web/webfactory.h" #include "services/abstract/category.h" #include "services/abstract/label.h" @@ -44,34 +44,45 @@ FeedlyNetwork::FeedlyNetwork(QObject* parent) #endif } -QString FeedlyNetwork::profile(const QNetworkProxy& network_proxy) { +RootItem* FeedlyNetwork::personalCollections(bool obtain_icons, const QNetworkProxy& proxy) { QString bear = bearer(); if (bear.isEmpty()) { - qCriticalNN << LOGSEC_FEEDLY - << "Cannot obtain profile information, because bearer is empty."; - return {}; + qCriticalNN << LOGSEC_FEEDLY << "Cannot obtain personal collections, because bearer is empty."; + throw NetworkException(QNetworkReply::NetworkError::AuthenticationRequiredError); } - else { - QString target_url = fullUrl(Service::Profile); - int timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); - QByteArray output_msgs; +} - // This method uses proxy via parameter, - // not via "m_service" field. - auto result = NetworkFactory::performNetworkOperation(target_url, - timeout, - {}, - output_msgs, - QNetworkAccessManager::Operation::GetOperation, - { bearerHeader(bear) }, - false, - {}, - {}, - network_proxy); +QVariantHash FeedlyNetwork::profile(const QNetworkProxy& network_proxy) { + QString bear = bearer(); - return output_msgs; + if (bear.isEmpty()) { + qCriticalNN << LOGSEC_FEEDLY << "Cannot obtain profile information, because bearer is empty."; + throw NetworkException(QNetworkReply::NetworkError::AuthenticationRequiredError); } + + QString target_url = fullUrl(Service::Profile); + int timeout = qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(); + QByteArray output_msgs; + + // This method uses proxy via parameter, + // not via "m_service" field. + auto result = NetworkFactory::performNetworkOperation(target_url, + timeout, + {}, + output_msgs, + QNetworkAccessManager::Operation::GetOperation, + { bearerHeader(bear) }, + false, + {}, + {}, + network_proxy); + + if (result.first != QNetworkReply::NetworkError::NoError) { + throw NetworkException(result.first); + } + + return QJsonDocument::fromJson(output_msgs).object().toVariantHash(); } QString FeedlyNetwork::username() const { diff --git a/src/librssguard/services/feedly/feedlynetwork.h b/src/librssguard/services/feedly/feedlynetwork.h index fb740607b..206008a1b 100755 --- a/src/librssguard/services/feedly/feedlynetwork.h +++ b/src/librssguard/services/feedly/feedlynetwork.h @@ -21,7 +21,7 @@ class FeedlyNetwork : public QObject { explicit FeedlyNetwork(QObject* parent = nullptr); // API operations. - QString profile(const QNetworkProxy& network_proxy); + QVariantHash profile(const QNetworkProxy& network_proxy); // Getters and setters. QString username() const; diff --git a/src/librssguard/services/feedly/gui/feedlyaccountdetails.cpp b/src/librssguard/services/feedly/gui/feedlyaccountdetails.cpp index fe896517c..2b974dc6c 100755 --- a/src/librssguard/services/feedly/gui/feedlyaccountdetails.cpp +++ b/src/librssguard/services/feedly/gui/feedlyaccountdetails.cpp @@ -3,6 +3,7 @@ #include "services/feedly/gui/feedlyaccountdetails.h" #include "definitions/definitions.h" +#include "exceptions/networkexception.h" #include "gui/guiutilities.h" #include "miscellaneous/application.h" #include "miscellaneous/systemfactory.h" @@ -14,6 +15,8 @@ #include "network-web/oauth2service.h" #endif +#include + FeedlyAccountDetails::FeedlyAccountDetails(QWidget* parent) : QWidget(parent) { #if defined (FEEDLY_OFFICIAL_SUPPORT) m_oauth = new OAuth2Service(QSL(FEEDLY_API_URL_BASE) + FEEDLY_API_URL_AUTH, @@ -131,14 +134,15 @@ void FeedlyAccountDetails::performTest(const QNetworkProxy& custom_proxy) { factory.setUsername(m_ui.m_txtUsername->lineEdit()->text()); factory.setDeveloperAccessToken(m_ui.m_txtDeveloperAccessToken->lineEdit()->text()); - if (!factory.profile(custom_proxy).isEmpty()) { + try { + m_ui.m_txtUsername->lineEdit()->setText(factory.profile(custom_proxy)["email"].toString()); m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, tr("Login was successful."), tr("Access granted.")); } - else { + catch (const NetworkException& ex) { m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, - tr("Make sure your \"development access token\" is correct and your internet works."), + tr("Error: '%1'").arg(ex.message()), tr("Some problems.")); } }