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()) {
188 cookieIterator.remove();
191 cookieIterator.remove();
198 if (cookieList || list->isEmpty())
202 const KHttpCookie& currentCookie = mPendingCookies->first();
204 currentList.append(currentCookie);
207 for (
int i = 1 ; i < mPendingCookies->count(); ++i) {
209 if (cookie.
host() == currentHost) {
210 currentList.append(cookie);
234 QMutableListIterator<KHttpCookie> cookieIterator2(*mPendingCookies);
235 int pendingCookieIndex = -1;
236 while (cookieIterator2.hasNext()) {
237 ++pendingCookieIndex;
239 if (cookie.
host() != currentHost)
242 && !shownCookies.contains(pendingCookieIndex)) {
249 cookieIterator2.remove();
253 cookieIterator2.remove();
257 kWarning() <<
"userAdvice not accept or reject, this should never happen!";
263 QMutableListIterator<CookieRequest *> requestIterator(*mRequestList);
264 while (requestIterator.hasNext()) {
265 CookieRequest *request = requestIterator.next();
267 const QString res = mCookieJar->
findCookies(request->url, request->DOM, request->windowId);
269 QDBusConnection::sessionBus().send(request->reply.createReply(res));
271 requestIterator.remove();
278 void KCookieServer::slotSave()
287 void KCookieServer::saveCookieJar()
289 if( mTimer->isActive() )
298 foreach (
int i, fields ) {
305 out << cookie.
name();
308 out << cookie.
path();
311 out << cookie.
host();
314 out << cookie.
value();
323 out << QString::number(cookie.
isSecure() ? 1 : 0);
331 bool KCookieServer::cookieMatches(
const KHttpCookie& c,
335 const bool hasDomain = !domain.isEmpty();
336 return (((hasDomain && c.
domain() == domain) || fqdn == c.
host()) &&
337 (c.
path() == path) && (c.
name() == name) &&
353 CookieRequest *request =
new CookieRequest;
354 message().setDelayedReply(
true);
357 request->DOM =
false;
358 request->windowId = windowId;
359 mRequestList->append( request );
378 if ( list && !list->isEmpty() )
393 const bool allCookies = name.isEmpty();
394 const QStringList domainList = _domain.split(QLatin1Char(
' '));
398 Q_FOREACH(
const QString& domain, domainList)
407 putCookie(result, cookie, fields);
413 Q_FOREACH(
const QString& domain, domainList)
422 if (cookieMatches(cookie, domain, fqdn, path, name))
424 putCookie(result, cookie, fields);
451 return mCookieJar->
findCookies(url,
true, windowId, &pendingCookies);
467 if (cookieList && !cookieList->isEmpty()) {
468 KHttpCookieList::Iterator itEnd = cookieList->end();
469 for (KHttpCookieList::Iterator it = cookieList->begin(); it != itEnd; ++it)
471 if (cookieMatches(*it, domain, fqdn, path, name)) {
491 KCookieServer::slotDeleteSessionCookies( qlonglong windowId )
523 addCookies(url, cookieHeader, windowId,
true);
558 QStringListIterator it (domains);
564 const QString& domain = it.next();
565 if ( domain.at(0) ==
'.' || domain == fqdn )
588 #include "kcookieserver.moc"