29 #define SAVE_DELAY 3 // Save after 3 minutes
31 #include <QtCore/QTimer>
32 #include <QtCore/QFile>
33 #include <QtDBus/QtDBus>
45 #include "kcookieserveradaptor.h"
47 #define QL1S(x) QLatin1String(x)
48 #define QL1C(x) QLatin1Char(x)
51 registerPlugin<KCookieServer>();
56 enum CookieDetails { CF_DOMAIN=0, CF_PATH, CF_NAME, CF_HOST,
57 CF_VALUE, CF_EXPIRE, CF_PROVER, CF_SECURE };
68 template class QList<CookieRequest*>;
70 class RequestList :
public QList<CookieRequest*>
73 RequestList() : QList<CookieRequest*>() { }
79 (void)
new KCookieServerAdaptor(
this);
82 mRequestList =
new RequestList;
83 mAdvicePending =
false;
84 mTimer =
new QTimer();
85 mTimer->setSingleShot(
true);
86 connect(mTimer, SIGNAL(
timeout()), SLOT(slotSave()));
87 mConfig =
new KConfig(
"kcookiejarrc");
94 if (!filenameOld.isEmpty())
99 QFile::remove(filenameOld);
107 this, SLOT(slotDeleteSessionCookies(qlonglong)));
115 delete mPendingCookies;
124 if (mPendingCookies->isEmpty())
131 Q_FOREACH(
const KHttpCookie& cookie, *mPendingCookies) {
132 if (cookie.
match( fqdn, domains, path)) {
135 cookieList->append(cookie);
140 return cookieList->isEmpty();
144 qlonglong windowId,
bool useDOMFormat )
148 cookieList = mCookieJar->
makeDOMCookies(url, cookieHeader, windowId);
150 cookieList = mCookieJar->
makeCookies(url, cookieHeader, windowId);
154 *mPendingCookies += cookieList;
158 mAdvicePending =
true;
159 while (!mPendingCookies->isEmpty())
163 mAdvicePending =
false;
179 list = mPendingCookies;
181 QMutableListIterator<KHttpCookie> cookieIterator(*list);
182 while (cookieIterator.hasNext()) {
189 cookieIterator.remove();
192 cookieIterator.remove();
199 if (cookieList || list->isEmpty())
203 const KHttpCookie& currentCookie = mPendingCookies->first();
205 currentList.append(currentCookie);
208 for (
int i = 1 ; i < mPendingCookies->count(); ++i) {
210 if (cookie.
host() == currentHost) {
211 currentList.append(cookie);
235 QMutableListIterator<KHttpCookie> cookieIterator2(*mPendingCookies);
236 int pendingCookieIndex = -1;
237 while (cookieIterator2.hasNext()) {
238 ++pendingCookieIndex;
240 if (cookie.
host() != currentHost)
243 && !shownCookies.contains(pendingCookieIndex)) {
255 cookieIterator2.remove();
259 cookieIterator2.remove();
263 kWarning() <<
"userAdvice not accept or reject, this should never happen!";
269 QMutableListIterator<CookieRequest *> requestIterator(*mRequestList);
270 while (requestIterator.hasNext()) {
271 CookieRequest *request = requestIterator.next();
273 const QString res = mCookieJar->
findCookies(request->url, request->DOM, request->windowId);
275 QDBusConnection::sessionBus().send(request->reply.createReply(res));
277 requestIterator.remove();
284 void KCookieServer::slotSave()
293 void KCookieServer::saveCookieJar()
295 if( mTimer->isActive() )
304 foreach (
int i, fields ) {
311 out << cookie.
name();
314 out << cookie.
path();
317 out << cookie.
host();
320 out << cookie.
value();
329 out << QString::number(cookie.
isSecure() ? 1 : 0);
337 bool KCookieServer::cookieMatches(
const KHttpCookie& c,
341 const bool hasDomain = !domain.isEmpty();
342 return (((hasDomain && c.
domain() == domain) || fqdn == c.
host()) &&
343 (c.
path() == path) && (c.
name() == name) &&
359 CookieRequest *request =
new CookieRequest;
360 message().setDelayedReply(
true);
363 request->DOM =
false;
364 request->windowId = windowId;
365 mRequestList->append( request );
384 if ( list && !list->isEmpty() )
399 const bool allCookies = name.isEmpty();
400 const QStringList domainList = _domain.split(QLatin1Char(
' '));
404 Q_FOREACH(
const QString& domain, domainList)
413 putCookie(result, cookie, fields);
419 Q_FOREACH(
const QString& domain, domainList)
428 if (cookieMatches(cookie, domain, fqdn, path, name))
430 putCookie(result, cookie, fields);
457 return mCookieJar->
findCookies(url,
true, windowId, &pendingCookies);
473 if (cookieList && !cookieList->isEmpty()) {
474 KHttpCookieList::Iterator itEnd = cookieList->end();
475 for (KHttpCookieList::Iterator it = cookieList->begin(); it != itEnd; ++it)
477 if (cookieMatches(*it, domain, fqdn, path, name)) {
497 KCookieServer::slotDeleteSessionCookies( qlonglong windowId )
529 addCookies(url, cookieHeader, windowId,
true);
564 QStringListIterator it (domains);
570 const QString& domain = it.next();
571 if ( domain.at(0) ==
'.' || domain == fqdn )
594 #include "kcookieserver.moc"