persistent encrypted cookies
This commit is contained in:
parent
bfe019f22c
commit
4caa7313e4
5 changed files with 105 additions and 8 deletions
|
@ -15,6 +15,9 @@
|
||||||
DKEY WebEngineAttributes::ID = "web_engine_attributes";
|
DKEY WebEngineAttributes::ID = "web_engine_attributes";
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Cookies.
|
||||||
|
DKEY Cookies::ID = "cookies";
|
||||||
|
|
||||||
// AdBlock.
|
// AdBlock.
|
||||||
DKEY AdBlock::ID = "adblock";
|
DKEY AdBlock::ID = "adblock";
|
||||||
|
|
||||||
|
|
|
@ -32,6 +32,10 @@ namespace WebEngineAttributes {
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
namespace Cookies {
|
||||||
|
KEY ID;
|
||||||
|
}
|
||||||
|
|
||||||
namespace AdBlock {
|
namespace AdBlock {
|
||||||
KEY ID;
|
KEY ID;
|
||||||
|
|
||||||
|
|
|
@ -2,14 +2,22 @@
|
||||||
|
|
||||||
#include "network-web/cookiejar.h"
|
#include "network-web/cookiejar.h"
|
||||||
|
|
||||||
|
#include "3rd-party/boolinq/boolinq.h"
|
||||||
#include "definitions/definitions.h"
|
#include "definitions/definitions.h"
|
||||||
|
#include "miscellaneous/application.h"
|
||||||
|
#include "miscellaneous/iofactory.h"
|
||||||
|
#include "miscellaneous/settings.h"
|
||||||
|
|
||||||
#include <QDateTime>
|
#include <QDateTime>
|
||||||
|
#include <QDir>
|
||||||
#include <QNetworkCookie>
|
#include <QNetworkCookie>
|
||||||
|
#include <QSettings>
|
||||||
|
|
||||||
CookieJar::CookieJar(QObject* parent) : QNetworkCookieJar(parent) {}
|
CookieJar::CookieJar(QObject* parent) : QNetworkCookieJar(parent) {
|
||||||
|
loadCookies();
|
||||||
|
}
|
||||||
|
|
||||||
QList<QNetworkCookie> CookieJar::extractCookiesFromUrl(const QString& url) const {
|
QList<QNetworkCookie> CookieJar::extractCookiesFromUrl(const QString& url) {
|
||||||
if (!url.contains(QSL(COOKIE_URL_IDENTIFIER))) {
|
if (!url.contains(QSL(COOKIE_URL_IDENTIFIER))) {
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
@ -37,11 +45,85 @@ QList<QNetworkCookie> CookieJar::extractCookiesFromUrl(const QString& url) const
|
||||||
return cookies;
|
return cookies;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CookieJar::insertCookies(const QList<QNetworkCookie>& cookies) {
|
void CookieJar::loadCookies() {
|
||||||
bool result = true;
|
Settings* sett = qApp->settings();
|
||||||
|
|
||||||
|
sett->beginGroup(GROUP(Cookies));
|
||||||
|
auto keys = sett->allKeys();
|
||||||
|
|
||||||
|
sett->endGroup();
|
||||||
|
|
||||||
|
for (const QString& cookie_key : qAsConst(keys)) {
|
||||||
|
QByteArray encoded = sett->password(GROUP(Cookies), cookie_key, {}).toByteArray();
|
||||||
|
|
||||||
|
if (!encoded.isEmpty()) {
|
||||||
|
auto cookie = QNetworkCookie::parseCookies(encoded);
|
||||||
|
|
||||||
|
if (!cookie.isEmpty()) {
|
||||||
|
if (!QNetworkCookieJar::insertCookie(cookie.at(0))) {
|
||||||
|
qCriticalNN << LOGSEC_NETWORK
|
||||||
|
<< "Failed to load cookie"
|
||||||
|
<< QUOTE_W_SPACE(cookie_key)
|
||||||
|
<< "from settings.";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CookieJar::saveCookies() {
|
||||||
|
auto cookies = allCookies();
|
||||||
|
Settings* sett = qApp->settings();
|
||||||
|
int i = 1;
|
||||||
|
|
||||||
|
sett->beginGroup(GROUP(Cookies));
|
||||||
|
qobject_cast<QSettings*>(sett)->remove(QString());
|
||||||
|
sett->endGroup();
|
||||||
|
|
||||||
for (const QNetworkCookie& cookie : cookies) {
|
for (const QNetworkCookie& cookie : cookies) {
|
||||||
result &= insertCookie(cookie);
|
if (cookie.isSessionCookie()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
sett->setPassword(GROUP(Cookies),
|
||||||
|
QSL("%1-%2").arg(QString::number(i++), cookie.name()),
|
||||||
|
cookie.toRawForm(QNetworkCookie::RawForm::Full));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QList<QNetworkCookie> CookieJar::cookiesForUrl(const QUrl& url) const {
|
||||||
|
return QNetworkCookieJar::cookiesForUrl(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CookieJar::setCookiesFromUrl(const QList<QNetworkCookie>& cookie_list, const QUrl& url) {
|
||||||
|
return QNetworkCookieJar::setCookiesFromUrl(cookie_list, url);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CookieJar::insertCookie(const QNetworkCookie& cookie) {
|
||||||
|
auto result = QNetworkCookieJar::insertCookie(cookie);
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
saveCookies();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CookieJar::updateCookie(const QNetworkCookie& cookie) {
|
||||||
|
auto result = QNetworkCookieJar::updateCookie(cookie);
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
saveCookies();
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool CookieJar::deleteCookie(const QNetworkCookie& cookie) {
|
||||||
|
auto result = QNetworkCookieJar::deleteCookie(cookie);
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
saveCookies();
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
|
|
@ -9,8 +9,16 @@ class CookieJar : public QNetworkCookieJar {
|
||||||
public:
|
public:
|
||||||
explicit CookieJar(QObject* parent = nullptr);
|
explicit CookieJar(QObject* parent = nullptr);
|
||||||
|
|
||||||
QList<QNetworkCookie> extractCookiesFromUrl(const QString& url) const;
|
virtual QList<QNetworkCookie> cookiesForUrl(const QUrl& url) const;
|
||||||
bool insertCookies(const QList<QNetworkCookie>& cookies);
|
virtual bool setCookiesFromUrl(const QList<QNetworkCookie>& cookie_list, const QUrl& url);
|
||||||
|
virtual bool insertCookie(const QNetworkCookie& cookie);
|
||||||
|
virtual bool updateCookie(const QNetworkCookie& cookie);
|
||||||
|
virtual bool deleteCookie(const QNetworkCookie& cookie);
|
||||||
|
static QList<QNetworkCookie> extractCookiesFromUrl(const QString& url);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void loadCookies();
|
||||||
|
void saveCookies();
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // COOKIEJAR_H
|
#endif // COOKIEJAR_H
|
||||||
|
|
|
@ -61,7 +61,7 @@ void Downloader::manipulateData(const QString& url,
|
||||||
const QString& username,
|
const QString& username,
|
||||||
const QString& password) {
|
const QString& password) {
|
||||||
|
|
||||||
auto cookies = qApp->web()->cookieJar()->extractCookiesFromUrl(url);
|
auto cookies = CookieJar::extractCookiesFromUrl(url);
|
||||||
|
|
||||||
if (!cookies.isEmpty()) {
|
if (!cookies.isEmpty()) {
|
||||||
qApp->web()->cookieJar()->setCookiesFromUrl(cookies, url);
|
qApp->web()->cookieJar()->setCookiesFromUrl(cookies, url);
|
||||||
|
|
Loading…
Add table
Reference in a new issue