2 * kcookiespolicies.cpp - Cookies configuration
5 * Copyright (c) Waldo Bastian <bastian@kde.org>
6 * Copyright (c) 1999 David Faure <faure@kde.org>
7 * Copyright (c) 2008 Urs Wolfer <uwolfer @ kde.org>
10 * Copyright (c) 2000- Dawit Alemayehu <adawit@kde.org>
12 * This program is free software; you can redistribute it and/or modify
13 * it under the terms of the GNU General Public License as published by
14 * the Free Software Foundation; either version 2 of the License, or
15 * (at your option) any later version.
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
28 #include "kcookiespolicies.h"
31 #include <QtGui/QLayout>
32 #include <QtGui/QCheckBox>
33 #include <QtGui/QPushButton>
34 #include <QtGui/QRadioButton>
35 #include <QtGui/QToolButton>
36 #include <QtGui/QBoxLayout>
37 #include <QtDBus/QtDBus>
40 #include <kiconloader.h>
41 #include <kmessagebox.h>
47 #include "ksaveioconfig.h"
50 KCookiesPolicies::KCookiesPolicies(const KComponentData
&componentData
, QWidget
*parent
)
51 :KCModule(componentData
, parent
)
53 QVBoxLayout
*mainLayout
= new QVBoxLayout(this);
54 mainLayout
->setMargin(0);
55 mainLayout
->setSpacing(0);
57 dlg
= new KCookiesPolicyDlgUI (this);
58 dlg
->kListViewSearchLine
->setTreeWidget(dlg
->lvDomainPolicy
);
61 dlg
->kListViewSearchLine
->setSearchColumns(columns
);
63 dlg
->pbNew
->setIcon(KIcon("list-add"));
64 dlg
->pbChange
->setIcon(KIcon("edit-rename"));
65 dlg
->pbDelete
->setIcon(KIcon("list-remove"));
66 dlg
->pbDeleteAll
->setIcon(KIcon("edit-delete"));
68 mainLayout
->addWidget(dlg
);
70 // Connect the main swicth :) Enable/disable cookie support
71 connect( dlg
->cbEnableCookies
, SIGNAL( toggled(bool) ),
72 SLOT( cookiesEnabled(bool) ) );
73 connect( dlg
->cbEnableCookies
, SIGNAL( toggled(bool) ),
74 SLOT( configChanged() ) );
76 // Connect the preference check boxes...
77 connect ( dlg
->cbRejectCrossDomainCookies
, SIGNAL(toggled(bool)),
78 SLOT(configChanged()));
79 connect ( dlg
->cbAutoAcceptSessionCookies
, SIGNAL(toggled(bool)),
80 SLOT(configChanged()));
81 connect ( dlg
->cbIgnoreCookieExpirationDate
, SIGNAL(toggled(bool)),
82 SLOT(configChanged()));
84 connect ( dlg
->cbAutoAcceptSessionCookies
, SIGNAL(toggled(bool)),
85 SLOT(autoAcceptSessionCookies(bool)));
86 connect ( dlg
->cbIgnoreCookieExpirationDate
, SIGNAL(toggled(bool)),
87 SLOT(ignoreCookieExpirationDate(bool)));
89 connect ( dlg
->rbPolicyAsk
, SIGNAL(toggled(bool)),
90 SLOT(configChanged()));
91 connect ( dlg
->rbPolicyAccept
, SIGNAL(toggled(bool)),
92 SLOT(configChanged()));
93 connect ( dlg
->rbPolicyReject
, SIGNAL(toggled(bool)),
94 SLOT(configChanged()));
95 // Connect signals from the domain specific policy listview.
96 connect( dlg
->lvDomainPolicy
, SIGNAL(itemSelectionChanged()),
97 SLOT(selectionChanged()) );
98 connect( dlg
->lvDomainPolicy
, SIGNAL(itemDoubleClicked(QTreeWidgetItem
*, int)),
99 SLOT(changePressed() ) );
101 // Connect the buttons...
102 connect( dlg
->pbNew
, SIGNAL(clicked()), SLOT( addPressed() ) );
103 connect( dlg
->pbChange
, SIGNAL( clicked() ), SLOT( changePressed() ) );
104 connect( dlg
->pbDelete
, SIGNAL( clicked() ), SLOT( deletePressed() ) );
105 connect( dlg
->pbDeleteAll
, SIGNAL( clicked() ), SLOT( deleteAllPressed() ) );
108 KCookiesPolicies::~KCookiesPolicies()
112 void KCookiesPolicies::configChanged ()
114 //kDebug() << "KCookiesPolicies::configChanged...";
118 void KCookiesPolicies::cookiesEnabled( bool enable
)
120 dlg
->bgDefault
->setEnabled( enable
);
121 dlg
->bgPreferences
->setEnabled ( enable
);
122 dlg
->gbDomainSpecific
->setEnabled( enable
);
126 ignoreCookieExpirationDate ( enable
);
127 autoAcceptSessionCookies ( enable
);
131 void KCookiesPolicies::ignoreCookieExpirationDate ( bool enable
)
133 bool isAutoAcceptChecked
= dlg
->cbAutoAcceptSessionCookies
->isChecked();
134 enable
= (enable
&& isAutoAcceptChecked
);
136 dlg
->bgDefault
->setEnabled( !enable
);
137 dlg
->gbDomainSpecific
->setEnabled( !enable
);
140 void KCookiesPolicies::autoAcceptSessionCookies ( bool enable
)
142 bool isIgnoreExpirationChecked
= dlg
->cbIgnoreCookieExpirationDate
->isChecked();
143 enable
= (enable
&& isIgnoreExpirationChecked
);
145 dlg
->bgDefault
->setEnabled( !enable
);
146 dlg
->gbDomainSpecific
->setEnabled( !enable
);
149 void KCookiesPolicies::addNewPolicy(const QString
& domain
)
151 PolicyDlg
pdlg (i18n("New Cookie Policy"), this);
152 pdlg
.setEnableHostEdit (true, domain
);
154 if (dlg
->rbPolicyAccept
->isChecked())
155 pdlg
.setPolicy(KCookieAdvice::Reject
);
157 pdlg
.setPolicy(KCookieAdvice::Accept
);
159 if (pdlg
.exec() && !pdlg
.domain().isEmpty())
161 QString domain
= KUrl::fromAce(pdlg
.domain().toLatin1());
162 int advice
= pdlg
.advice();
164 if ( !handleDuplicate(domain
, advice
) )
166 const char* strAdvice
= KCookieAdvice::adviceToStr(advice
);
167 QTreeWidgetItem
* index
= new QTreeWidgetItem (dlg
->lvDomainPolicy
,
168 QStringList()<< domain
<< i18n(strAdvice
));
169 m_pDomainPolicy
.insert (index
, strAdvice
);
176 void KCookiesPolicies::addPressed()
178 addNewPolicy (QString());
181 void KCookiesPolicies::changePressed()
183 QTreeWidgetItem
* index
= dlg
->lvDomainPolicy
->currentItem();
188 QString oldDomain
= index
->text(0);
190 PolicyDlg
pdlg (i18n("Change Cookie Policy"), this);
191 pdlg
.setPolicy (KCookieAdvice::strToAdvice(m_pDomainPolicy
[index
]));
192 pdlg
.setEnableHostEdit (true, oldDomain
);
194 if( pdlg
.exec() && !pdlg
.domain().isEmpty())
196 QString newDomain
= KUrl::fromAce(pdlg
.domain().toLatin1());
197 int advice
= pdlg
.advice();
198 if (newDomain
== oldDomain
|| !handleDuplicate(newDomain
, advice
))
200 m_pDomainPolicy
[index
] = KCookieAdvice::adviceToStr(advice
);
201 index
->setText(0, newDomain
);
202 index
->setText(1, i18n(m_pDomainPolicy
[index
]) );
208 bool KCookiesPolicies::handleDuplicate( const QString
& domain
, int advice
)
210 QTreeWidgetItem
* item
= dlg
->lvDomainPolicy
->topLevelItem(0);
213 if ( item
->text(0) == domain
)
215 QString msg
= i18n("<qt>A policy already exists for"
216 "<center><b>%1</b></center>"
217 "Do you want to replace it?</qt>", domain
);
218 int res
= KMessageBox::warningContinueCancel(this, msg
,
219 i18n("Duplicate Policy"),
220 KGuiItem(i18n("Replace")));
221 if ( res
== KMessageBox::Continue
)
223 m_pDomainPolicy
[item
]= KCookieAdvice::adviceToStr(advice
);
224 item
->setText(0, domain
);
225 item
->setText(1, i18n(m_pDomainPolicy
[item
]));
230 return true; // User Cancelled!!
232 item
= dlg
->lvDomainPolicy
->itemBelow(item
);
237 void KCookiesPolicies::deletePressed()
239 QTreeWidgetItem
* nextItem
= 0L;
241 Q_FOREACH(QTreeWidgetItem
* item
, dlg
->lvDomainPolicy
->selectedItems()) {
242 nextItem
= dlg
->lvDomainPolicy
->itemBelow(item
);
244 nextItem
= dlg
->lvDomainPolicy
->itemAbove(item
);
250 nextItem
->setSelected(true);
256 void KCookiesPolicies::deleteAllPressed()
258 m_pDomainPolicy
.clear();
259 dlg
->lvDomainPolicy
->clear();
264 void KCookiesPolicies::updateButtons()
266 bool hasItems
= dlg
->lvDomainPolicy
->topLevelItemCount() > 0;
268 dlg
->pbChange
->setEnabled ((hasItems
&& d_itemsSelected
== 1));
269 dlg
->pbDelete
->setEnabled ((hasItems
&& d_itemsSelected
> 0));
270 dlg
->pbDeleteAll
->setEnabled ( hasItems
);
273 void KCookiesPolicies::updateDomainList(const QStringList
&domainConfig
)
275 dlg
->lvDomainPolicy
->clear();
277 QStringList::ConstIterator it
= domainConfig
.begin();
278 for (; it
!= domainConfig
.end(); ++it
)
281 KCookieAdvice::Value advice
= KCookieAdvice::Dunno
;
283 splitDomainAdvice(*it
, domain
, advice
);
285 if (!domain
.isEmpty())
287 QTreeWidgetItem
* index
= new QTreeWidgetItem( dlg
->lvDomainPolicy
, QStringList() << KUrl::fromAce(domain
.toLatin1()) <<
288 i18n(KCookieAdvice::adviceToStr(advice
)) );
289 m_pDomainPolicy
[index
] = KCookieAdvice::adviceToStr(advice
);
294 void KCookiesPolicies::selectionChanged ()
296 d_itemsSelected
= dlg
->lvDomainPolicy
->selectedItems().count();
301 void KCookiesPolicies::load()
305 KConfig
cfg ("kcookiejarrc");
306 KConfigGroup group
= cfg
.group ("Cookie Policy");
308 bool enableCookies
= group
.readEntry("Cookies", true);
309 dlg
->cbEnableCookies
->setChecked (enableCookies
);
310 cookiesEnabled( enableCookies
);
312 KCookieAdvice::Value advice
= KCookieAdvice::strToAdvice (group
.readEntry(
313 "CookieGlobalAdvice", "Ask"));
316 case KCookieAdvice::Accept
:
317 dlg
->rbPolicyAccept
->setChecked (true);
319 case KCookieAdvice::Reject
:
320 dlg
->rbPolicyReject
->setChecked (true);
322 case KCookieAdvice::Ask
:
323 case KCookieAdvice::Dunno
:
325 dlg
->rbPolicyAsk
->setChecked (true);
328 bool enable
= group
.readEntry("RejectCrossDomainCookies", true);
329 dlg
->cbRejectCrossDomainCookies
->setChecked (enable
);
331 bool sessionCookies
= group
.readEntry("AcceptSessionCookies", true);
332 dlg
->cbAutoAcceptSessionCookies
->setChecked (sessionCookies
);
333 bool cookieExpiration
= group
.readEntry("IgnoreExpirationDate", false);
334 dlg
->cbIgnoreCookieExpirationDate
->setChecked (cookieExpiration
);
335 updateDomainList(group
.readEntry("CookieDomainAdvice", QStringList()));
339 ignoreCookieExpirationDate( cookieExpiration
);
340 autoAcceptSessionCookies( sessionCookies
);
345 void KCookiesPolicies::save()
347 KConfig
cfg ( "kcookiejarrc" );
348 KConfigGroup group
= cfg
.group( "Cookie Policy" );
350 bool state
= dlg
->cbEnableCookies
->isChecked();
351 group
.writeEntry( "Cookies", state
);
352 state
= dlg
->cbRejectCrossDomainCookies
->isChecked();
353 group
.writeEntry( "RejectCrossDomainCookies", state
);
354 state
= dlg
->cbAutoAcceptSessionCookies
->isChecked();
355 group
.writeEntry( "AcceptSessionCookies", state
);
356 state
= dlg
->cbIgnoreCookieExpirationDate
->isChecked();
357 group
.writeEntry( "IgnoreExpirationDate", state
);
360 if (dlg
->rbPolicyAccept
->isChecked())
361 advice
= KCookieAdvice::adviceToStr(KCookieAdvice::Accept
);
362 else if (dlg
->rbPolicyReject
->isChecked())
363 advice
= KCookieAdvice::adviceToStr(KCookieAdvice::Reject
);
365 advice
= KCookieAdvice::adviceToStr(KCookieAdvice::Ask
);
367 group
.writeEntry("CookieGlobalAdvice", advice
);
369 QStringList domainConfig
;
370 QTreeWidgetItem
*at
= dlg
->lvDomainPolicy
->topLevelItem(0);
374 domainConfig
.append(QString::fromLatin1("%1:%2").arg(QString(KUrl::toAce(at
->text(0)))).arg(m_pDomainPolicy
[at
]));
375 at
= dlg
->lvDomainPolicy
->itemBelow(at
);
378 group
.writeEntry("CookieDomainAdvice", domainConfig
);
381 // Update the cookiejar...
382 if (!dlg
->cbEnableCookies
->isChecked())
384 QDBusInterface
kded("org.kde.kded", "/modules/kcookiejar", "org.kde.KCookieServer", QDBusConnection::sessionBus());
385 kded
.call( "shutdown" );
389 QDBusInterface
kded("org.kde.kded", "/modules/kcookiejar", "org.kde.KCookieServer", QDBusConnection::sessionBus());
390 QDBusReply
<void> reply
= kded
.call( "reloadPolicy" );
391 if (!reply
.isValid())
392 KMessageBox::sorry(0, i18n("Unable to communicate with the cookie handler service.\n"
393 "Any changes you made will not take effect until the service "
397 // Force running io-slave to reload configurations...
398 KSaveIOConfig::updateRunningIOSlaves (this);
399 emit
changed( false );
403 void KCookiesPolicies::defaults()
405 dlg
->cbEnableCookies
->setChecked( true );
406 dlg
->rbPolicyAsk
->setChecked( true );
407 dlg
->rbPolicyAccept
->setChecked( false );
408 dlg
->rbPolicyReject
->setChecked( false );
409 dlg
->cbRejectCrossDomainCookies
->setChecked( true );
410 dlg
->cbAutoAcceptSessionCookies
->setChecked( true );
411 dlg
->cbIgnoreCookieExpirationDate
->setChecked( false );
412 dlg
->lvDomainPolicy
->clear();
414 cookiesEnabled( dlg
->cbEnableCookies
->isChecked() );
418 void KCookiesPolicies::splitDomainAdvice (const QString
& cfg
, QString
&domain
,
419 KCookieAdvice::Value
&advice
)
421 int sepPos
= cfg
.lastIndexOf(':');
423 // Ignore any policy that does not contain a domain...
427 domain
= cfg
.left(sepPos
);
428 advice
= KCookieAdvice::strToAdvice( cfg
.mid( sepPos
+1 ) );
431 QString
KCookiesPolicies::quickHelp() const
433 return i18n("<p><h1>Cookies</h1> Cookies contain information that Konqueror"
434 " (or any other KDE application using the HTTP protocol) stores"
435 " on your computer from a remote Internet server. This means"
436 " that a web server can store information about you and your"
437 " browsing activities on your machine for later use. You might"
438 " consider this an invasion of privacy.</p><p>However, cookies are"
439 " useful in certain situations. For example, they are often used"
440 " by Internet shops, so you can 'put things into a shopping"
441 " basket'. Some sites require you have a browser that supports"
442 " cookies.</p><p>Because most people want a compromise between privacy"
443 " and the benefits cookies offer, KDE offers you the ability to"
444 " customize the way it handles cookies. You might, for example"
445 " want to set KDE's default policy to ask you whenever a server"
446 " wants to set a cookie or simply reject or accept everything."
447 " For example, you might choose to accept all cookies from your"
448 " favorite shopping web site. For this all you have to do is"
449 " either browse to that particular site and when you are presented"
450 " with the cookie dialog box, click on <i> This domain </i> under"
451 " the 'apply to' tab and choose accept or simply specify the name"
452 " of the site in the <i> Domain Specific Policy </i> tab and set"
453 " it to accept. This enables you to receive cookies from trusted"
454 " web sites without being asked every time KDE receives a cookie.</p>"
458 #include "kcookiespolicies.moc"