From 455a07ad83b190b3560c5e71bbcfb501043a3acf Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Mon, 8 Feb 2021 15:40:34 +0100 Subject: [PATCH] save --- src/librssguard/definitions/definitions.h | 1 + src/librssguard/miscellaneous/feedreader.cpp | 3 ++ src/librssguard/network-web/oauth2service.cpp | 3 +- .../network-web/oauthhttphandler.cpp | 2 +- src/librssguard/services/feedly/definitions.h | 7 +-- .../services/feedly/feedlynetwork.cpp | 51 ++++++++++++++++++- .../services/feedly/feedlynetwork.h | 13 +++++ .../feedly/gui/feedlyaccountdetails.cpp | 37 ++++++++++---- .../feedly/gui/formeditfeedlyaccount.cpp | 2 +- 9 files changed, 100 insertions(+), 19 deletions(-) diff --git a/src/librssguard/definitions/definitions.h b/src/librssguard/definitions/definitions.h index a03f9b229..0a1b72e8b 100755 --- a/src/librssguard/definitions/definitions.h +++ b/src/librssguard/definitions/definitions.h @@ -109,6 +109,7 @@ #define LOGSEC_NEXTCLOUD "nextcloud: " #define LOGSEC_GREADER "greader: " #define LOGSEC_INOREADER "inoreader: " +#define LOGSEC_FEEDLY "feedly: " #define LOGSEC_TTRSS "tt-rss: " #define LOGSEC_GMAIL "gmail: " #define LOGSEC_OAUTH "oauth: " diff --git a/src/librssguard/miscellaneous/feedreader.cpp b/src/librssguard/miscellaneous/feedreader.cpp index 6e969b6d5..ae704a946 100644 --- a/src/librssguard/miscellaneous/feedreader.cpp +++ b/src/librssguard/miscellaneous/feedreader.cpp @@ -56,7 +56,10 @@ FeedReader::~FeedReader() { QList FeedReader::feedServices() { if (m_feedServices.isEmpty()) { // NOTE: All installed services create their entry points here. +#if defined (DEBUG) m_feedServices.append(new FeedlyEntryPoint()); +#endif + m_feedServices.append(new GmailEntryPoint()); m_feedServices.append(new GreaderEntryPoint()); m_feedServices.append(new InoreaderEntryPoint()); diff --git a/src/librssguard/network-web/oauth2service.cpp b/src/librssguard/network-web/oauth2service.cpp index cef8e7ceb..997caf6d5 100644 --- a/src/librssguard/network-web/oauth2service.cpp +++ b/src/librssguard/network-web/oauth2service.cpp @@ -46,8 +46,7 @@ OAuth2Service::OAuth2Service(const QString& auth_url, const QString& token_url, const QString& client_secret, const QString& scope, QObject* parent) : QObject(parent), m_id(QString::number(QRandomGenerator::global()->generate())), m_timerId(-1), - m_redirectionHandler(new OAuthHttpHandler(tr("You can close this window now. Go back to %1.").arg(APP_NAME), - this)) { + m_redirectionHandler(new OAuthHttpHandler(tr("You can close this window now. Go back to %1.").arg(APP_NAME), this)) { m_tokenGrantType = QSL("authorization_code"); m_tokenUrl = QUrl(token_url); m_authUrl = auth_url; diff --git a/src/librssguard/network-web/oauthhttphandler.cpp b/src/librssguard/network-web/oauthhttphandler.cpp index 1810ae131..e202a1d13 100644 --- a/src/librssguard/network-web/oauthhttphandler.cpp +++ b/src/librssguard/network-web/oauthhttphandler.cpp @@ -11,7 +11,7 @@ #include OAuthHttpHandler::OAuthHttpHandler(const QString& success_text, QObject* parent) - : QObject(parent), m_successText(success_text) { + : QObject(parent), m_listenAddress(QHostAddress()), m_listenPort(0), m_successText(success_text) { connect(&m_httpServer, &QTcpServer::newConnection, this, &OAuthHttpHandler::clientConnected); setListenAddressPort(QString(OAUTH_REDIRECT_URI) + QL1C(':') + QString::number(OAUTH_REDIRECT_URI_PORT)); } diff --git a/src/librssguard/services/feedly/definitions.h b/src/librssguard/services/feedly/definitions.h index 5d9cca062..1773c9bc8 100755 --- a/src/librssguard/services/feedly/definitions.h +++ b/src/librssguard/services/feedly/definitions.h @@ -7,8 +7,9 @@ #define FEEDLY_API_REDIRECT_URI_PORT 8080 #define FEEDLY_API_SCOPE "https://cloud.feedly.com/subscriptions" -#define FEEDLY_API_URL_BASE "https://cloud.feedly.com/v3/" -#define FEEDLY_API_URL_AUTH "auth/auth" -#define FEEDLY_API_URL_TOKEN "auth/token" +#define FEEDLY_API_URL_BASE "https://cloud.feedly.com/v3/" +#define FEEDLY_API_URL_AUTH "auth/auth" +#define FEEDLY_API_URL_TOKEN "auth/token" +#define FEEDLY_API_URL_PROFILE "profile" #endif // FEEDLY_DEFINITIONS_H diff --git a/src/librssguard/services/feedly/feedlynetwork.cpp b/src/librssguard/services/feedly/feedlynetwork.cpp index d6b587228..4b1db8d70 100755 --- a/src/librssguard/services/feedly/feedlynetwork.cpp +++ b/src/librssguard/services/feedly/feedlynetwork.cpp @@ -35,7 +35,7 @@ FeedlyNetwork::FeedlyNetwork(QObject* parent) m_developerAccessToken(QString()), m_batchSize(FEEDLY_UNLIMITED_BATCH_SIZE) { #if defined (FEEDLY_OFFICIAL_SUPPORT) - m_oauth->setRedirectUrl(QString(OAUTH_REDIRECT_URI) + QL1C(':') + QString::number(FEEDLY_API_REDIRECT_URI_PORT)); + //m_oauth->setRedirectUrl(QString(OAUTH_REDIRECT_URI) + QL1C(':') + QString::number(FEEDLY_API_REDIRECT_URI_PORT)); connect(m_oauth, &OAuth2Service::tokensRetrieveError, this, &FeedlyNetwork::onTokensError); connect(m_oauth, &OAuth2Service::authFailed, this, &FeedlyNetwork::onAuthFailed); @@ -43,6 +43,34 @@ FeedlyNetwork::FeedlyNetwork(QObject* parent) #endif } +QString FeedlyNetwork::profile(const QNetworkProxy& network_proxy) { + QString bear = bearer(); + + if (bear.isEmpty()) { + qCriticalNN << LOGSEC_FEEDLY + << "Cannot obtain profile information, because bearer is empty."; + return {}; + } + 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); + } +} + QString FeedlyNetwork::username() const { return m_username; } @@ -108,6 +136,27 @@ void FeedlyNetwork::onTokensReceived(const QString& access_token, const QString& } } +QString FeedlyNetwork::fullUrl(FeedlyNetwork::Service service) const { + switch (service) { + case FeedlyNetwork::Service::Profile: + return QSL(FEEDLY_API_URL_BASE) + FEEDLY_API_URL_PROFILE; + } +} + +QString FeedlyNetwork::bearer() const { +#if defined (FEEDLY_OFFICIAL_SUPPORT) + if (m_developerAccessToken.simplified().isEmpty()) { + return m_oauth->bearer().toLocal8Bit(); + } +#endif + + return QString("Bearer %1").arg(m_developerAccessToken); +} + +QPair FeedlyNetwork::bearerHeader(const QString& bearer) const { + return { QString(HTTP_HEADERS_AUTHORIZATION).toLocal8Bit(), bearer.toLocal8Bit() }; +} + OAuth2Service* FeedlyNetwork::oauth() const { return m_oauth; } diff --git a/src/librssguard/services/feedly/feedlynetwork.h b/src/librssguard/services/feedly/feedlynetwork.h index 635fd24a6..ce057731f 100755 --- a/src/librssguard/services/feedly/feedlynetwork.h +++ b/src/librssguard/services/feedly/feedlynetwork.h @@ -20,6 +20,10 @@ class FeedlyNetwork : public QObject { public: explicit FeedlyNetwork(QObject* parent = nullptr); + // API operations. + QString profile(const QNetworkProxy& network_proxy); + + // Getters and setters. QString username() const; void setUsername(const QString& username); @@ -41,6 +45,15 @@ class FeedlyNetwork : public QObject { void onTokensReceived(const QString& access_token, const QString& refresh_token, int expires_in); #endif + private: + enum class Service { + Profile + }; + + QString fullUrl(Service service) const; + QString bearer() const; + QPair bearerHeader(const QString& bearer) const; + private: FeedlyServiceRoot* m_service; diff --git a/src/librssguard/services/feedly/gui/feedlyaccountdetails.cpp b/src/librssguard/services/feedly/gui/feedlyaccountdetails.cpp index 99bc426a1..0d62e92d1 100755 --- a/src/librssguard/services/feedly/gui/feedlyaccountdetails.cpp +++ b/src/librssguard/services/feedly/gui/feedlyaccountdetails.cpp @@ -18,9 +18,11 @@ FeedlyAccountDetails::FeedlyAccountDetails(QWidget* parent) : QWidget(parent) { #if defined (FEEDLY_OFFICIAL_SUPPORT) m_oauth = new OAuth2Service(QSL(FEEDLY_API_URL_BASE) + FEEDLY_API_URL_AUTH, QSL(FEEDLY_API_URL_BASE) + FEEDLY_API_URL_TOKEN, - "dontknow", - "dontknow", - FEEDLY_API_SCOPE, this), + FEEDLY_CLIENT_ID, + FEEDLY_CLIENT_SECRET, + FEEDLY_API_SCOPE, this); + + m_oauth->setRedirectUrl(QString(OAUTH_REDIRECT_URI) + QL1C(':') + QString::number(FEEDLY_API_REDIRECT_URI_PORT)); #endif m_ui.setupUi(this); @@ -107,21 +109,34 @@ void FeedlyAccountDetails::onAuthGranted() { void FeedlyAccountDetails::performTest(const QNetworkProxy& custom_proxy) { #if defined (FEEDLY_OFFICIAL_SUPPORT) - m_oauth->logout(); + if (m_ui.m_txtDeveloperAccessToken->lineEdit()->text().simplified().isEmpty()) { + m_oauth->logout(); - if (m_oauth->login()) { - m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, - tr("You are already logged in."), - tr("Access granted.")); + if (m_oauth->login()) { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, + tr("You are already logged in."), + tr("Access granted.")); + } + + return; } -#else +#endif + FeedlyNetwork factory; factory.setUsername(m_ui.m_txtUsername->lineEdit()->text()); factory.setDeveloperAccessToken(m_ui.m_txtDeveloperAccessToken->lineEdit()->text()); - // TODO: todo -#endif + if (!factory.profile(custom_proxy).isEmpty()) { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Ok, + tr("Login was successful."), + tr("Access granted.")); + } + else { + m_ui.m_lblTestResult->setStatus(WidgetWithStatus::StatusType::Error, + tr("Make sure your \"development access token\" is correct and your internet works."), + tr("Some problems.")); + } } void FeedlyAccountDetails::onUsernameChanged() { diff --git a/src/librssguard/services/feedly/gui/formeditfeedlyaccount.cpp b/src/librssguard/services/feedly/gui/formeditfeedlyaccount.cpp index 05e17cc6d..bba6e7e41 100755 --- a/src/librssguard/services/feedly/gui/formeditfeedlyaccount.cpp +++ b/src/librssguard/services/feedly/gui/formeditfeedlyaccount.cpp @@ -15,7 +15,7 @@ #endif FormEditFeedlyAccount::FormEditFeedlyAccount(QWidget* parent) - : FormAccountDetails(qApp->icons()->miscIcon(QSL("google")), parent), m_details(new FeedlyAccountDetails(this)) { + : FormAccountDetails(qApp->icons()->miscIcon(QSL("feedly")), parent), m_details(new FeedlyAccountDetails(this)) { insertCustomTab(m_details, tr("Service setup"), 0); activateTab(0);