Skip to content

Commit

Permalink
Add WebAPI for managing cookies
Browse files Browse the repository at this point in the history
  • Loading branch information
Piccirello committed Sep 14, 2024
1 parent 4353858 commit 8532981
Show file tree
Hide file tree
Showing 3 changed files with 69 additions and 0 deletions.
66 changes: 66 additions & 0 deletions src/webui/api/appcontroller.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
#include <QJsonArray>
#include <QJsonDocument>
#include <QJsonObject>
#include <QNetworkCookie>
#include <QNetworkInterface>
#include <QRegularExpression>
#include <QStringList>
Expand All @@ -50,6 +51,7 @@
#include "base/bittorrent/session.h"
#include "base/global.h"
#include "base/interfaces/iapplication.h"
#include "base/net/downloadmanager.h"
#include "base/net/portforwarder.h"
#include "base/net/proxyconfigurationmanager.h"
#include "base/path.h"
Expand All @@ -58,6 +60,7 @@
#include "base/rss/rss_session.h"
#include "base/torrentfileguard.h"
#include "base/torrentfileswatcher.h"
#include "base/utils/datetime.h"
#include "base/utils/fs.h"
#include "base/utils/misc.h"
#include "base/utils/net.h"
Expand All @@ -69,6 +72,12 @@

using namespace std::chrono_literals;

const QString KEY_COOKIE_NAME = u"name"_s;
const QString KEY_COOKIE_DOMAIN = u"domain"_s;
const QString KEY_COOKIE_PATH = u"path"_s;
const QString KEY_COOKIE_VALUE = u"value"_s;
const QString KEY_COOKIE_EXPIRATION_DATE = u"expirationDate"_s;

void AppController::webapiVersionAction()
{
setResult(API_VERSION.toString());
Expand Down Expand Up @@ -1172,6 +1181,63 @@ void AppController::getDirectoryContentAction()
setResult(ret);
}

void AppController::cookiesAction()
{
const QList<QNetworkCookie> &cookies = Net::DownloadManager::instance()->allCookies();
QJsonArray ret;
for (const QNetworkCookie &cookie : cookies)
{
ret << QJsonObject{
{KEY_COOKIE_NAME, QString::fromLatin1(cookie.name())},
{KEY_COOKIE_DOMAIN, cookie.domain()},
{KEY_COOKIE_PATH, cookie.path()},
{KEY_COOKIE_VALUE, QString::fromLatin1(cookie.value())},
{KEY_COOKIE_EXPIRATION_DATE, Utils::DateTime::toSecsSinceEpoch(cookie.expirationDate())},
};
}

setResult(ret);
}

void AppController::setCookiesAction()
{
requireParams({u"cookies"_s});
const QString cookiesParam {params()[u"cookies"_s].trimmed()};

QJsonParseError jsonError;
const auto cookiesJsonDocument = QJsonDocument::fromJson(cookiesParam.toUtf8(), &jsonError);
if (jsonError.error != QJsonParseError::NoError)
throw APIError(APIErrorType::BadParams, tr("unable to parse"));
if (!cookiesJsonDocument.isArray())
throw APIError(APIErrorType::BadParams, tr("cookies must be array"));

const QJsonArray &cookiesJsonArr = cookiesJsonDocument.array();
QList<QNetworkCookie> cookies;
cookies.reserve(cookiesJsonArr.size());
for (const QJsonValue &jsonVal : cookiesJsonArr)
{
if (!jsonVal.isObject())
throw APIError(APIErrorType::BadParams);

QNetworkCookie cookie;
const QJsonObject &jsonObj = jsonVal.toObject();
if (jsonObj.contains(KEY_COOKIE_NAME))
cookie.setName(jsonObj.value(KEY_COOKIE_NAME).toString().toLatin1());
if (jsonObj.contains(KEY_COOKIE_DOMAIN))
cookie.setDomain(jsonObj.value(KEY_COOKIE_DOMAIN).toString());
if (jsonObj.contains(KEY_COOKIE_PATH))
cookie.setPath(jsonObj.value(KEY_COOKIE_PATH).toString());
if (jsonObj.contains(KEY_COOKIE_VALUE))
cookie.setValue(jsonObj.value(KEY_COOKIE_VALUE).toString().toUtf8());
if (jsonObj.contains(KEY_COOKIE_EXPIRATION_DATE))
cookie.setExpirationDate(QDateTime::fromSecsSinceEpoch(jsonObj.value(KEY_COOKIE_EXPIRATION_DATE).toInteger()));

cookies << cookie;
}

Net::DownloadManager::instance()->setAllCookies(cookies);
}

void AppController::networkInterfaceListAction()
{
QJsonArray ifaceList;
Expand Down
2 changes: 2 additions & 0 deletions src/webui/api/appcontroller.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ private slots:
void defaultSavePathAction();
void sendTestEmailAction();
void getDirectoryContentAction();
void cookiesAction();
void setCookiesAction();

void networkInterfaceListAction();
void networkInterfaceAddressListAction();
Expand Down
1 change: 1 addition & 0 deletions src/webui/webapplication.h
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,7 @@ class WebApplication final : public ApplicationComponent<QObject>
{
// <<controller name, action name>, HTTP method>
{{u"app"_s, u"sendTestEmail"_s}, Http::METHOD_POST},
{{u"app"_s, u"setCookies"_s}, Http::METHOD_POST},
{{u"app"_s, u"setPreferences"_s}, Http::METHOD_POST},
{{u"app"_s, u"shutdown"_s}, Http::METHOD_POST},
{{u"auth"_s, u"login"_s}, Http::METHOD_POST},
Expand Down

0 comments on commit 8532981

Please sign in to comment.