From 8f051db71b656e0040e53101d522b8c4311699bf Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 4 Oct 2017 09:54:54 +0200 Subject: [PATCH] Simplyfiyng network api. --- src/miscellaneous/databasequeries.cpp | 4 +- src/network-web/networkfactory.cpp | 22 +++++----- src/network-web/networkfactory.h | 13 ++++-- src/services/owncloud/definitions.h | 10 ++--- .../owncloud/gui/formeditowncloudaccount.cpp | 8 ++-- .../network/owncloudnetworkfactory.cpp | 43 +++++++++++-------- .../owncloud/owncloudserviceentrypoint.cpp | 2 +- src/services/standard/standardfeed.cpp | 6 ++- 8 files changed, 60 insertions(+), 48 deletions(-) diff --git a/src/miscellaneous/databasequeries.cpp b/src/miscellaneous/databasequeries.cpp index 0a1384ed1..31a500970 100755 --- a/src/miscellaneous/databasequeries.cpp +++ b/src/miscellaneous/databasequeries.cpp @@ -980,7 +980,7 @@ bool DatabaseQueries::overwriteOwnCloudAccount(QSqlDatabase db, const QString& u query.bindValue(QSL(":url"), url); query.bindValue(QSL(":force_update"), force_server_side_feed_update ? 1 : 0); query.bindValue(QSL(":id"), account_id); - query.bindValue(QSL(":msg_limit"), batch_size <= 0 ? UNLIMITED_BATCH_SIZE : batch_size); + query.bindValue(QSL(":msg_limit"), batch_size <= 0 ? OWNCLOUD_UNLIMITED_BATCH_SIZE : batch_size); if (query.exec()) { return true; @@ -1003,7 +1003,7 @@ bool DatabaseQueries::createOwnCloudAccount(QSqlDatabase db, int id_to_assign, c q.bindValue(QSL(":password"), TextFactory::encrypt(password)); q.bindValue(QSL(":url"), url); q.bindValue(QSL(":force_update"), force_server_side_feed_update ? 1 : 0); - q.bindValue(QSL(":msg_limit"), batch_size <= 0 ? UNLIMITED_BATCH_SIZE : batch_size); + q.bindValue(QSL(":msg_limit"), batch_size <= 0 ? OWNCLOUD_UNLIMITED_BATCH_SIZE : batch_size); if (q.exec()) { return true; diff --git a/src/network-web/networkfactory.cpp b/src/network-web/networkfactory.cpp index 9e12b487c..e95c26e23 100755 --- a/src/network-web/networkfactory.cpp +++ b/src/network-web/networkfactory.cpp @@ -57,6 +57,13 @@ QStringList NetworkFactory::extractFeedLinksFromHtmlPage(const QUrl& url, const return feeds; } +QPair NetworkFactory::generateBasicAuthHeader(const QString& username, const QString& password) { + QString basic_value = username + ":" + password; + QString header_value = QString("Basic ") + QString(basic_value.toUtf8().toBase64()); + + return QPair(HTTP_HEADERS_AUTHORIZATION, header_value.toLocal8Bit()); +} + QString NetworkFactory::networkErrorText(QNetworkReply::NetworkError error_code) { switch (error_code) { case QNetworkReply::ProtocolUnknownError: @@ -164,23 +171,16 @@ QNetworkReply::NetworkError NetworkFactory::downloadIcon(const QList& u } Downloader* NetworkFactory::performAsyncNetworkOperation(const QString& url, int timeout, const QByteArray& input_data, - const QString& input_content_type, QNetworkAccessManager::Operation operation, + QList> additional_headers, bool protected_contents, const QString& username, - const QString& password, bool set_basic_header) { + const QString& password) { Downloader* downloader = new Downloader(); QObject::connect(downloader, &Downloader::completed, downloader, &Downloader::deleteLater); - if (!input_content_type.isEmpty()) { - downloader->appendRawHeader("Content-Type", input_content_type.toLocal8Bit()); - } - - if (set_basic_header) { - QString basic_value = username + ":" + password; - QString header_value = QString("Basic ") + QString(basic_value.toUtf8().toBase64()); - - downloader->appendRawHeader(HTTP_HEADERS_AUTHORIZATION, header_value.toLocal8Bit()); + foreach (const auto& header, additional_headers) { + downloader->appendRawHeader(header.first, header.second); } downloader->manipulateData(url, operation, input_data, timeout, protected_contents, username, password); diff --git a/src/network-web/networkfactory.h b/src/network-web/networkfactory.h index fe674b14d..bd1a43152 100755 --- a/src/network-web/networkfactory.h +++ b/src/network-web/networkfactory.h @@ -38,6 +38,7 @@ class NetworkFactory { public: static QStringList extractFeedLinksFromHtmlPage(const QUrl& url, const QString& html); + static QPair generateBasicAuthHeader(const QString& username, const QString& password); // Returns human readable text for given network error. static QString networkErrorText(QNetworkReply::NetworkError error_code); @@ -45,11 +46,15 @@ class NetworkFactory { // Performs SYNCHRONOUS download if favicon for the site, // given URL belongs to. static QNetworkReply::NetworkError downloadIcon(const QList& urls, int timeout, QIcon& output); - static Downloader* performAsyncNetworkOperation(const QString& url, int timeout, const QByteArray& input_data, - const QString& input_content_type, + static Downloader* performAsyncNetworkOperation(const QString& url, + int timeout, + const QByteArray& input_data, QNetworkAccessManager::Operation operation, - bool protected_contents = false, const QString& username = QString(), - const QString& password = QString(), bool set_basic_header = false); + QList> additional_headers = QList>(), + bool protected_contents = false, + const QString& username = QString(), + const QString& password = QString()); static NetworkResult performNetworkOperation(const QString& url, int timeout, const QByteArray& input_data, const QString& input_content_type, QByteArray& output, QNetworkAccessManager::Operation operation, diff --git a/src/services/owncloud/definitions.h b/src/services/owncloud/definitions.h index 5b3ee3a23..400181997 100755 --- a/src/services/owncloud/definitions.h +++ b/src/services/owncloud/definitions.h @@ -19,10 +19,10 @@ #ifndef OWNCLOUD_DEFINITIONS_H #define OWNCLOUD_DEFINITIONS_H -#define CONTENT_TYPE "application/json; charset=utf-8" -#define API_VERSION "1.2" -#define API_PATH "index.php/apps/news/api/v1-2/" -#define MINIMAL_OC_VERSION "6.0.5" -#define UNLIMITED_BATCH_SIZE -1 +#define OWNCLOUD_CONTENT_TYPE_JSON "application/json; charset=utf-8" +#define OWNCLOUD_API_VERSION "1.2" +#define OWNCLOUD_API_PATH "index.php/apps/news/api/v1-2/" +#define OWNCLOUD_MIN_VERSION "6.0.5" +#define OWNCLOUD_UNLIMITED_BATCH_SIZE -1 #endif // OWNCLOUD_DEFINITIONS_H diff --git a/src/services/owncloud/gui/formeditowncloudaccount.cpp b/src/services/owncloud/gui/formeditowncloudaccount.cpp index 5f14ecf21..15f85d339 100755 --- a/src/services/owncloud/gui/formeditowncloudaccount.cpp +++ b/src/services/owncloud/gui/formeditowncloudaccount.cpp @@ -35,7 +35,7 @@ FormEditOwnCloudAccount::FormEditOwnCloudAccount(QWidget* parent) m_ui->m_lblTestResult->label()->setWordWrap(true); m_ui->m_lblServerSideUpdateInformation->setText(tr("Leaving this option on causes that updates " "of feeds will be probably much slower and may time-out often.")); - m_ui->m_lblDescription->setText(tr("Note that at least version %1 is required.").arg(MINIMAL_OC_VERSION)); + m_ui->m_lblDescription->setText(tr("Note that at least version %1 is required.").arg(OWNCLOUD_MIN_VERSION)); m_ui->m_txtPassword->lineEdit()->setPlaceholderText(tr("Password for your ownCloud account")); m_ui->m_txtUsername->lineEdit()->setPlaceholderText(tr("Username for your ownCloud account")); m_ui->m_txtUrl->lineEdit()->setPlaceholderText(tr("URL of your ownCloud server, without any API path")); @@ -121,12 +121,12 @@ void FormEditOwnCloudAccount::performTest() { OwnCloudStatusResponse result = factory.status(); if (result.isLoaded()) { - if (!SystemFactory::isVersionEqualOrNewer(result.version(), MINIMAL_OC_VERSION)) { + if (!SystemFactory::isVersionEqualOrNewer(result.version(), OWNCLOUD_MIN_VERSION)) { m_ui->m_lblTestResult->setStatus(WidgetWithStatus::Error, tr( "Selected ownCloud News server is running unsupported version (%1). At least version %2 is required.").arg( result.version(), - MINIMAL_OC_VERSION), + OWNCLOUD_MIN_VERSION), tr("Selected ownCloud News server is running unsupported version.")); } else { @@ -134,7 +134,7 @@ void FormEditOwnCloudAccount::performTest() { tr( "ownCloud News server is okay, running with version %1, while at least version %2 is required.").arg( result.version(), - MINIMAL_OC_VERSION), + OWNCLOUD_MIN_VERSION), tr("ownCloud News server is okay.")); } } diff --git a/src/services/owncloud/network/owncloudnetworkfactory.cpp b/src/services/owncloud/network/owncloudnetworkfactory.cpp index 088c3990a..ae2935008 100755 --- a/src/services/owncloud/network/owncloudnetworkfactory.cpp +++ b/src/services/owncloud/network/owncloudnetworkfactory.cpp @@ -34,7 +34,8 @@ OwnCloudNetworkFactory::OwnCloudNetworkFactory() : m_url(QString()), m_fixedUrl(QString()), m_forceServerSideUpdate(false), - m_authUsername(QString()), m_authPassword(QString()), m_batchSize(UNLIMITED_BATCH_SIZE), m_urlUser(QString()), m_urlStatus(QString()), + m_authUsername(QString()), m_authPassword(QString()), m_batchSize(OWNCLOUD_UNLIMITED_BATCH_SIZE), m_urlUser(QString()), m_urlStatus( + QString()), m_urlFolders(QString()), m_urlFeeds(QString()), m_urlMessages(QString()), m_urlFeedsUpdate(QString()), m_urlDeleteFeed(QString()), m_urlRenameFeed(QString()), m_userId(QString()) {} @@ -55,14 +56,14 @@ void OwnCloudNetworkFactory::setUrl(const QString& url) { } // Store endpoints. - m_urlUser = m_fixedUrl + API_PATH + "user"; - m_urlStatus = m_fixedUrl + API_PATH + "status"; - m_urlFolders = m_fixedUrl + API_PATH + "folders"; - m_urlFeeds = m_fixedUrl + API_PATH + "feeds"; - m_urlMessages = m_fixedUrl + API_PATH + "items?id=%1&batchSize=%2&type=%3"; - m_urlFeedsUpdate = m_fixedUrl + API_PATH + "feeds/update?userId=%1&feedId=%2"; - m_urlDeleteFeed = m_fixedUrl + API_PATH + "feeds/%1"; - m_urlRenameFeed = m_fixedUrl + API_PATH + "feeds/%1/rename"; + m_urlUser = m_fixedUrl + OWNCLOUD_API_PATH + "user"; + m_urlStatus = m_fixedUrl + OWNCLOUD_API_PATH + "status"; + m_urlFolders = m_fixedUrl + OWNCLOUD_API_PATH + "folders"; + m_urlFeeds = m_fixedUrl + OWNCLOUD_API_PATH + "feeds"; + m_urlMessages = m_fixedUrl + OWNCLOUD_API_PATH + "items?id=%1&batchSize=%2&type=%3"; + m_urlFeedsUpdate = m_fixedUrl + OWNCLOUD_API_PATH + "feeds/update?userId=%1&feedId=%2"; + m_urlDeleteFeed = m_fixedUrl + OWNCLOUD_API_PATH + "feeds/%1"; + m_urlRenameFeed = m_fixedUrl + OWNCLOUD_API_PATH + "feeds/%1/rename"; setUserId(QString()); } @@ -312,10 +313,10 @@ void OwnCloudNetworkFactory::markMessagesRead(RootItem::ReadStatus status, const QString final_url; if (status == RootItem::Read) { - final_url = m_fixedUrl + API_PATH + "items/read/multiple"; + final_url = m_fixedUrl + OWNCLOUD_API_PATH + "items/read/multiple"; } else { - final_url = m_fixedUrl + API_PATH + "items/unread/multiple"; + final_url = m_fixedUrl + OWNCLOUD_API_PATH + "items/unread/multiple"; } foreach (const QString& id, custom_ids) { @@ -324,14 +325,16 @@ void OwnCloudNetworkFactory::markMessagesRead(RootItem::ReadStatus status, const json["items"] = ids; + QList> headers; + headers << QPair(HTTP_HEADERS_CONTENT_TYPE, OWNCLOUD_CONTENT_TYPE_JSON); + headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); + NetworkFactory::performAsyncNetworkOperation(final_url, qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(), QJsonDocument(json).toJson(QJsonDocument::Compact), - CONTENT_TYPE, QNetworkAccessManager::PutOperation, - true, m_authUsername, m_authPassword, - true); + headers); } void OwnCloudNetworkFactory::markMessagesStarred(RootItem::Importance importance, @@ -342,10 +345,10 @@ void OwnCloudNetworkFactory::markMessagesStarred(RootItem::Importance importance QString final_url; if (importance == RootItem::Important) { - final_url = m_fixedUrl + API_PATH + "items/star/multiple"; + final_url = m_fixedUrl + OWNCLOUD_API_PATH + "items/star/multiple"; } else { - final_url = m_fixedUrl + API_PATH + "items/unstar/multiple"; + final_url = m_fixedUrl + OWNCLOUD_API_PATH + "items/unstar/multiple"; } for (int i = 0; i < feed_ids.size(); i++) { @@ -358,14 +361,16 @@ void OwnCloudNetworkFactory::markMessagesStarred(RootItem::Importance importance json["items"] = ids; + QList> headers; + headers << QPair(HTTP_HEADERS_CONTENT_TYPE, OWNCLOUD_CONTENT_TYPE_JSON); + headers << NetworkFactory::generateBasicAuthHeader(m_authUsername, m_authPassword); + NetworkFactory::performAsyncNetworkOperation(final_url, qApp->settings()->value(GROUP(Feeds), SETTING(Feeds::UpdateTimeout)).toInt(), QJsonDocument(json).toJson(QJsonDocument::Compact), - CONTENT_TYPE, QNetworkAccessManager::PutOperation, - true, m_authUsername, m_authPassword, - true); + headers); } int OwnCloudNetworkFactory::batchSize() const { diff --git a/src/services/owncloud/owncloudserviceentrypoint.cpp b/src/services/owncloud/owncloudserviceentrypoint.cpp index 1a95cbfc6..a1ce77c32 100755 --- a/src/services/owncloud/owncloudserviceentrypoint.cpp +++ b/src/services/owncloud/owncloudserviceentrypoint.cpp @@ -52,7 +52,7 @@ QString OwnCloudServiceEntryPoint::code() const { QString OwnCloudServiceEntryPoint::description() const { return QObject::tr("The News app is an RSS/Atom feed aggregator. It is part of Nextcloud suite. This plugin implements %1 API.") - .arg(API_VERSION); + .arg(OWNCLOUD_API_VERSION); } QString OwnCloudServiceEntryPoint::author() const { diff --git a/src/services/standard/standardfeed.cpp b/src/services/standard/standardfeed.cpp index bc122f853..a33181330 100755 --- a/src/services/standard/standardfeed.cpp +++ b/src/services/standard/standardfeed.cpp @@ -182,7 +182,8 @@ QPair StandardFeed::guessFeed(const QNetworkAccessManager::GetOperation, !username.isEmpty(), username, - password); + password, + true); result.second = network_result.first; @@ -442,7 +443,8 @@ QList StandardFeed::obtainNewMessages(bool* error_during_obtaining) { QNetworkAccessManager::GetOperation, !username().isEmpty(), username(), - password()).first; + password(), + true).first; if (m_networkError != QNetworkReply::NoError) { qWarning("Error during fetching of new messages for feed '%s' (id %d).", qPrintable(url()), id());