Simplyfiyng network api.

This commit is contained in:
Martin Rotter 2017-10-04 09:54:54 +02:00
parent 8a7ca6b289
commit 8f051db71b
8 changed files with 60 additions and 48 deletions

View File

@ -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;

View File

@ -57,6 +57,13 @@ QStringList NetworkFactory::extractFeedLinksFromHtmlPage(const QUrl& url, const
return feeds;
}
QPair<QByteArray, QByteArray> 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<QByteArray, QByteArray>(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<QString>& u
}
Downloader* NetworkFactory::performAsyncNetworkOperation(const QString& url, int timeout, const QByteArray& input_data,
const QString& input_content_type,
QNetworkAccessManager::Operation operation,
QList<QPair<QByteArray, QByteArray>> 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);

View File

@ -38,6 +38,7 @@ class NetworkFactory {
public:
static QStringList extractFeedLinksFromHtmlPage(const QUrl& url, const QString& html);
static QPair<QByteArray, QByteArray> 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<QString>& 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<QPair<QByteArray,
QByteArray>> additional_headers = QList<QPair<QByteArray, QByteArray>>(),
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,

View File

@ -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

View File

@ -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."));
}
}

View File

@ -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<QPair<QByteArray, QByteArray>> headers;
headers << QPair<QByteArray, QByteArray>(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<QPair<QByteArray, QByteArray>> headers;
headers << QPair<QByteArray, QByteArray>(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 {

View File

@ -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 {

View File

@ -182,7 +182,8 @@ QPair<StandardFeed*, QNetworkReply::NetworkError> StandardFeed::guessFeed(const
QNetworkAccessManager::GetOperation,
!username.isEmpty(),
username,
password);
password,
true);
result.second = network_result.first;
@ -442,7 +443,8 @@ QList<Message> 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());