19#include "ui_cookiemanager.h"
29#include <QNetworkCookie>
34#include <QInputDialog>
41 setAttribute(Qt::WA_DeleteOnClose);
46 if (isRightToLeft()) {
47 ui->cookieTree->headerItem()->setTextAlignment(0, Qt::AlignRight | Qt::AlignVCenter);
48 ui->cookieTree->headerItem()->setTextAlignment(1, Qt::AlignRight | Qt::AlignVCenter);
49 ui->cookieTree->setLayoutDirection(Qt::LeftToRight);
50 ui->whiteList->setLayoutDirection(Qt::LeftToRight);
51 ui->blackList->setLayoutDirection(Qt::LeftToRight);
55 connect(ui->cookieTree, &QTreeWidget::currentItemChanged,
this, &CookieManager::currentItemChanged);
56 connect(ui->removeAll, &QAbstractButton::clicked,
this, &CookieManager::removeAll);
57 connect(ui->removeOne, &QAbstractButton::clicked,
this, &CookieManager::remove);
58 connect(ui->close, &QDialogButtonBox::clicked,
this, &QWidget::close);
59 connect(ui->close2, &QDialogButtonBox::clicked,
this, &QWidget::close);
60 connect(ui->close3, &QDialogButtonBox::clicked,
this, &QWidget::close);
61 connect(ui->search, &QLineEdit::textChanged,
this, &CookieManager::filterString);
64 connect(ui->whiteAdd, &QAbstractButton::clicked,
this, &CookieManager::addWhitelist);
65 connect(ui->whiteRemove, &QAbstractButton::clicked,
this, &CookieManager::removeWhitelist);
66 connect(ui->blackAdd, SIGNAL(clicked()),
this, SLOT(addBlacklist()));
67 connect(ui->blackRemove, &QAbstractButton::clicked,
this, &CookieManager::removeBlacklist);
72 ui->saveCookies->setChecked(settings.
value(
QSL(
"allowCookies"),
true).toBool());
73 ui->filter3rdParty->setChecked(settings.
value(
QSL(
"filterThirdPartyCookies"),
false).toBool());
74 ui->filterTracking->setChecked(settings.
value(
QSL(
"filterTrackingCookie"),
false).toBool());
75 ui->deleteCookiesOnClose->setChecked(settings.
value(
QSL(
"deleteCookiesOnClose"),
false).toBool());
78 ui->search->setPlaceholderText(tr(
"Search"));
80 ui->cookieTree->sortItems(0, Qt::AscendingOrder);
81 ui->cookieTree->header()->setDefaultSectionSize(220);
82 ui->cookieTree->setFocus();
84 initWhiteAndBlacklist();
86 ui->whiteList->sortItems(Qt::AscendingOrder);
87 ui->blackList->sortItems(Qt::AscendingOrder);
89 auto* removeShortcut =
new QShortcut(QKeySequence(
QSL(
"Del")),
this);
90 connect(removeShortcut, &QShortcut::activated,
this, &CookieManager::deletePressed);
92 connect(ui->search, &QLineEdit::textChanged,
this, &CookieManager::filterString);
97 const auto allCookies =
mApp->cookieJar()->getAllCookies();
98 for (
const QNetworkCookie &cookie : allCookies) {
105void CookieManager::initWhiteAndBlacklist()
109 QString sqlTable =
mApp->siteSettingsManager()->sqlTable();
112 query.prepare(
QSL(
"SELECT server FROM %1 WHERE %2=?").arg(sqlTable, sqlColumn));
116 while (query.next()) {
117 QString server = query.value(0).toString();
118 ui->whiteList->addItem(server);
124 while (query.next()) {
125 QString server = query.value(0).toString();
126 ui->blackList->addItem(server);
131void CookieManager::removeAll()
133 QMessageBox::StandardButton button = QMessageBox::warning(
this, tr(
"Confirmation"),
134 tr(
"Are you sure you want to delete all cookies on your computer?"), QMessageBox::Yes | QMessageBox::No);
135 if (button != QMessageBox::Yes) {
139 mApp->cookieJar()->deleteAllCookies();
142 m_domainHash.clear();
143 ui->cookieTree->clear();
146void CookieManager::remove()
148 QList<QNetworkCookie> cookies;
149 auto selection = ui->cookieTree->selectedItems();
151 for (
int i = 0;
i < selection.count();
i++) {
152 QTreeWidgetItem* current = selection[
i];
154 if (current->childCount()) {
155 for (
int i = 0;
i < current->childCount(); ++
i) {
156 QTreeWidgetItem *item = current->child(
i);
157 if (item && m_itemHash.contains(item)) {
158 cookies.append(m_itemHash.value(item));
161 }
else if (m_itemHash.contains(current)) {
162 cookies.append(m_itemHash.value(current));
166 for (
const QNetworkCookie &cookie : std::as_const(cookies)) {
167 mApp->cookieJar()->deleteCookie(cookie);
171void CookieManager::currentItemChanged(QTreeWidgetItem* current, QTreeWidgetItem* parent)
178 if (current->text(1).isEmpty()) {
179 ui->name->setText(tr(
"<cookie not selected>"));
180 ui->value->setText(tr(
"<cookie not selected>"));
181 ui->server->setText(tr(
"<cookie not selected>"));
182 ui->path->setText(tr(
"<cookie not selected>"));
183 ui->secure->setText(tr(
"<cookie not selected>"));
184 ui->expiration->setText(tr(
"<cookie not selected>"));
186 ui->removeOne->setText(tr(
"Remove cookies"));
188 }
else if (ui->cookieTree->selectedItems().count() > 1) {
189 ui->name->setText(tr(
"<multiple cookies selected>"));
190 ui->value->setText(tr(
"<multiple cookies selected>"));
191 ui->server->setText(tr(
"<multiple cookies selected>"));
192 ui->path->setText(tr(
"<multiple cookies selected>"));
193 ui->secure->setText(tr(
"<multiple cookies selected>"));
194 ui->expiration->setText(tr(
"<multiple cookies selected>"));
196 ui->removeOne->setText(tr(
"Remove cookies"));
200 const QNetworkCookie cookie = qvariant_cast<QNetworkCookie>(current->data(0, Qt::UserRole + 10));
202 ui->name->setText(QString::fromUtf8(cookie.name()));
203 ui->value->setText(QString::fromUtf8(cookie.value()));
204 ui->server->setText(cookie.domain());
205 ui->path->setText(cookie.path());
206 cookie.isSecure() ? ui->secure->setText(tr(
"Secure only")) : ui->secure->setText(tr(
"All connections"));
207 cookie.isSessionCookie() ? ui->expiration->setText(tr(
"Session cookie")) : ui->expiration->setText(QDateTime(cookie.expirationDate()).toString(
QSL(
"hh:mm:ss dddd d. MMMM yyyy")));
209 ui->removeOne->setText(tr(
"Remove cookie"));
212void CookieManager::addWhitelist()
214 const QString server = QInputDialog::getText(
this, tr(
"Add to whitelist"), tr(
"Server:"));
216 if (server.isEmpty()) {
220 if (!ui->blackList->findItems(server, Qt::MatchFixedString).isEmpty()) {
221 QMessageBox::information(
this, tr(
"Already blacklisted!"), tr(
"The server \"%1\" is already in blacklist, please remove it first.").arg(server));
225 if (ui->whiteList->findItems(server, Qt::MatchFixedString).isEmpty()) {
226 ui->whiteList->addItem(server);
231void CookieManager::removeWhitelist()
233 QString server = ui->whiteList->currentItem()->text();
236 delete ui->whiteList->currentItem();
239void CookieManager::addBlacklist()
241 const QString server = QInputDialog::getText(
this, tr(
"Add to blacklist"), tr(
"Server:"));
242 addBlacklist(server);
245void CookieManager::addBlacklist(
const QString &server)
247 if (server.isEmpty()) {
251 if (!ui->whiteList->findItems(server, Qt::MatchFixedString).isEmpty()) {
252 QMessageBox::information(
this, tr(
"Already whitelisted!"), tr(
"The server \"%1\" is already in whitelist, please remove it first.").arg(server));
256 if (ui->blackList->findItems(server, Qt::MatchFixedString).isEmpty()) {
257 ui->blackList->addItem(server);
262QString CookieManager::cookieDomain(
const QNetworkCookie &cookie)
const
264 QString domain = cookie.domain();
265 if (domain.startsWith(QLatin1Char(
'.'))) {
271QTreeWidgetItem *CookieManager::cookieItem(
const QNetworkCookie &cookie)
const
273 QHashIterator<QTreeWidgetItem*, QNetworkCookie> it(m_itemHash);
274 while (it.hasNext()) {
276 if (it.value() == cookie)
282void CookieManager::removeBlacklist()
284 QString server = ui->blackList->currentItem()->text();
287 delete ui->blackList->currentItem();
290void CookieManager::deletePressed()
292 if (ui->cookieTree->hasFocus()) {
295 else if (ui->whiteList->hasFocus()) {
298 else if (ui->blackList->hasFocus()) {
303void CookieManager::filterString(
const QString &
string)
305 if (
string.isEmpty()) {
306 for (
int i = 0;
i < ui->cookieTree->topLevelItemCount(); ++
i) {
307 ui->cookieTree->topLevelItem(
i)->setHidden(
false);
312 for (
int i = 0;
i < ui->cookieTree->topLevelItemCount(); ++
i) {
313 QString text =
QSL(
".") + ui->cookieTree->topLevelItem(
i)->text(0);
314 ui->cookieTree->topLevelItem(
i)->setHidden(!text.contains(
string, Qt::CaseInsensitive));
315 ui->cookieTree->topLevelItem(
i)->setExpanded(
true);
320void CookieManager::addCookie(
const QNetworkCookie &cookie)
322 QTreeWidgetItem* item;
323 const QString domain = cookieDomain(cookie);
325 QTreeWidgetItem* findParent = m_domainHash.value(domain);
327 item =
new QTreeWidgetItem(findParent);
330 auto* newParent =
new QTreeWidgetItem(ui->cookieTree);
331 newParent->setText(0, domain);
333 newParent->setData(0, Qt::UserRole + 10, cookie.domain());
334 ui->cookieTree->addTopLevelItem(newParent);
335 m_domainHash[domain] = newParent;
337 item =
new QTreeWidgetItem(newParent);
340 item->setText(0,
QSL(
".") + domain);
341 item->setText(1, QString::fromUtf8(cookie.name()));
342 item->setData(0, Qt::UserRole + 10, QVariant::fromValue(cookie));
343 ui->cookieTree->addTopLevelItem(item);
345 m_itemHash[item] = cookie;
348void CookieManager::removeCookie(
const QNetworkCookie &cookie)
350 QTreeWidgetItem *item = cookieItem(cookie);
354 m_itemHash.remove(item);
356 if (item->parent() && item->parent()->childCount() == 1) {
357 m_domainHash.remove(cookieDomain(cookie));
358 delete item->parent();
365void CookieManager::closeEvent(QCloseEvent* e)
369 for (QHash<QString, int>::iterator it = m_listModifications.begin(); it != m_listModifications.end(); ++it) {
370 url.setHost(it.key());
376 settings.
setValue(
QSL(
"allowCookies"), ui->saveCookies->isChecked());
377 settings.
setValue(
QSL(
"filterThirdPartyCookies"), ui->filter3rdParty->isChecked());
378 settings.
setValue(
QSL(
"filterTrackingCookie"), ui->filterTracking->isChecked());
379 settings.
setValue(
QSL(
"deleteCookiesOnClose"), ui->deleteCookiesOnClose->isChecked());
382 mApp->cookieJar()->loadSettings();
387void CookieManager::keyPressEvent(QKeyEvent* e)
389 if (e->key() == Qt::Key_Escape) {
393 QWidget::keyPressEvent(e);
void cookieAdded(const QNetworkCookie &cookie)
void cookieRemoved(const QNetworkCookie &cookie)
CookieManager(QWidget *parent=nullptr)
~CookieManager() override
static QIcon standardIcon(QStyle::StandardPixmap icon)
void beginGroup(const QString &prefix)
QVariant value(const QString &key, const QVariant &defaultValue=QVariant())
void setValue(const QString &key, const QVariant &defaultValue=QVariant())
static SqlDatabase * instance()