You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/kcontrol/kio/kcookiesmanagement.cpp

490 lines
13 KiB

/**
* kcookiesmanagement.cpp - Cookies manager
*
* Copyright 2000-2001 Marco Pinelli <pinmc@orion.it>
* Copyright (c) 2000-2001 Dawit Alemayehu <adawit@kde.org>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <qapplication.h>
#include <qlayout.h>
#include <qpushbutton.h>
#include <qgroupbox.h>
#include <qhbox.h>
#include <qlabel.h>
#include <qtimer.h>
#include <qdatetime.h>
#include <qtoolbutton.h>
#include <kidna.h>
#include <kdebug.h>
#include <klocale.h>
#include <kdialog.h>
#include <kiconloader.h>
#include <klineedit.h>
#include <klistview.h>
#include <klistviewsearchline.h>
#include <kmessagebox.h>
#include <dcopref.h>
#include "kcookiesmain.h"
#include "kcookiespolicies.h"
#include "kcookiesmanagement.h"
#include "kcookiesmanagementdlg_ui.h"
#include <assert.h>
struct CookieProp
{
QString host;
QString name;
QString value;
QString domain;
QString path;
QString expireDate;
QString secure;
bool allLoaded;
};
CookieListViewItem::CookieListViewItem(QListView *parent, QString dom)
:QListViewItem(parent)
{
init( 0, dom );
}
CookieListViewItem::CookieListViewItem(QListViewItem *parent, CookieProp *cookie)
:QListViewItem(parent)
{
init( cookie );
}
CookieListViewItem::~CookieListViewItem()
{
delete mCookie;
}
void CookieListViewItem::init( CookieProp* cookie, QString domain,
bool cookieLoaded )
{
mCookie = cookie;
mDomain = domain;
mCookiesLoaded = cookieLoaded;
}
CookieProp* CookieListViewItem::leaveCookie()
{
CookieProp *ret = mCookie;
mCookie = 0;
return ret;
}
QString CookieListViewItem::text(int f) const
{
if (mCookie)
return f == 0 ? QString::null : KIDNA::toUnicode(mCookie->host);
else
return f == 0 ? KIDNA::toUnicode(mDomain) : QString::null;
}
KCookiesManagement::KCookiesManagement(QWidget *parent)
: KCModule(parent, "kcmkio")
{
// Toplevel layout
QVBoxLayout* mainLayout = new QVBoxLayout(this, KDialog::marginHint(),
KDialog::spacingHint());
dlg = new KCookiesManagementDlgUI (this);
dlg->tbClearSearchLine->setIconSet(SmallIconSet(QApplication::reverseLayout() ? "clear_left" : "locationbar_erase"));
dlg->kListViewSearchLine->setListView(dlg->lvCookies);
mainLayout->addWidget(dlg);
dlg->lvCookies->setSorting(0);
connect(dlg->lvCookies, SIGNAL(expanded(QListViewItem*)), SLOT(getCookies(QListViewItem*)) );
connect(dlg->lvCookies, SIGNAL(selectionChanged(QListViewItem*)), SLOT(showCookieDetails(QListViewItem*)) );
connect(dlg->pbDelete, SIGNAL(clicked()), SLOT(deleteCookie()));
connect(dlg->pbDeleteAll, SIGNAL(clicked()), SLOT(deleteAllCookies()));
connect(dlg->pbReload, SIGNAL(clicked()), SLOT(getDomains()));
connect(dlg->pbPolicy, SIGNAL(clicked()), SLOT(doPolicy()));
connect(dlg->lvCookies, SIGNAL(doubleClicked (QListViewItem *)), SLOT(doPolicy()));
deletedCookies.setAutoDelete(true);
m_bDeleteAll = false;
mainWidget = parent;
load();
}
KCookiesManagement::~KCookiesManagement()
{
}
void KCookiesManagement::load()
{
reset();
getDomains();
}
void KCookiesManagement::save()
{
// If delete all cookies was requested!
if(m_bDeleteAll)
{
if(!DCOPRef("kded", "kcookiejar").send("deleteAllCookies"))
{
QString caption = i18n ("DCOP Communication Error");
QString message = i18n ("Unable to delete all the cookies as requested.");
KMessageBox::sorry (this, message,caption);
return;
}
m_bDeleteAll = false; // deleted[Cookies|Domains] have been cleared yet
}
// Certain groups of cookies were deleted...
QStringList::Iterator dIt = deletedDomains.begin();
while( dIt != deletedDomains.end() )
{
QByteArray call;
QByteArray reply;
QCString replyType;
QDataStream callStream(call, IO_WriteOnly);
callStream << *dIt;
if( !DCOPRef("kded", "kcookiejar").send("deleteCookiesFromDomain", (*dIt)) )
{
QString caption = i18n ("DCOP Communication Error");
QString message = i18n ("Unable to delete cookies as requested.");
KMessageBox::sorry (this, message,caption);
return;
}
dIt = deletedDomains.remove(dIt);
}
// Individual cookies were deleted...
bool success = true; // Maybe we can go on...
QDictIterator<CookiePropList> cookiesDom(deletedCookies);
while(cookiesDom.current())
{
CookiePropList *list = cookiesDom.current();
QPtrListIterator<CookieProp> cookie(*list);
while(*cookie)
{
if( !DCOPRef("kded", "kcookiejar").send("deleteCookie",(*cookie)->domain,
(*cookie)->host, (*cookie)->path,
(*cookie)->name) )
{
success = false;
break;
}
list->removeRef(*cookie);
}
if(!success)
break;
deletedCookies.remove(cookiesDom.currentKey());
}
emit changed( false );
}
void KCookiesManagement::defaults()
{
reset();
getDomains();
emit changed (false);
}
void KCookiesManagement::reset()
{
m_bDeleteAll = false;
clearCookieDetails();
dlg->lvCookies->clear();
deletedDomains.clear();
deletedCookies.clear();
dlg->pbDelete->setEnabled(false);
dlg->pbDeleteAll->setEnabled(false);
dlg->pbPolicy->setEnabled(false);
}
void KCookiesManagement::clearCookieDetails()
{
dlg->leName->clear();
dlg->leValue->clear();
dlg->leDomain->clear();
dlg->lePath->clear();
dlg->leExpires->clear();
dlg->leSecure->clear();
}
QString KCookiesManagement::quickHelp() const
{
return i18n("<h1>Cookies Management Quick Help</h1>" );
}
void KCookiesManagement::getDomains()
{
DCOPReply reply = DCOPRef("kded", "kcookiejar").call("findDomains");
if( !reply.isValid() )
{
QString caption = i18n ("Information Lookup Failure");
QString message = i18n ("Unable to retrieve information about the "
"cookies stored on your computer.");
KMessageBox::sorry (this, message, caption);
return;
}
QStringList domains = reply;
if ( dlg->lvCookies->childCount() )
{
reset();
dlg->lvCookies->setCurrentItem( 0L );
}
CookieListViewItem *dom;
for(QStringList::Iterator dIt = domains.begin(); dIt != domains.end(); dIt++)
{
dom = new CookieListViewItem(dlg->lvCookies, *dIt);
dom->setExpandable(true);
}
// are ther any cookies?
dlg->pbDeleteAll->setEnabled(dlg->lvCookies->childCount());
}
void KCookiesManagement::getCookies(QListViewItem *cookieDom)
{
CookieListViewItem* ckd = static_cast<CookieListViewItem*>(cookieDom);
if ( ckd->cookiesLoaded() )
return;
QValueList<int> fields;
fields << 0 << 1 << 2 << 3;
DCOPReply reply = DCOPRef ("kded", "kcookiejar").call ("findCookies",
DCOPArg(fields, "QValueList<int>"),
ckd->domain(),
QString::null,
QString::null,
QString::null);
if(reply.isValid())
{
QStringList fieldVal = reply;
QStringList::Iterator fIt = fieldVal.begin();
while(fIt != fieldVal.end())
{
CookieProp *details = new CookieProp;
details->domain = *fIt++;
details->path = *fIt++;
details->name = *fIt++;
details->host = *fIt++;
details->allLoaded = false;
new CookieListViewItem(cookieDom, details);
}
static_cast<CookieListViewItem*>(cookieDom)->setCookiesLoaded();
}
}
bool KCookiesManagement::cookieDetails(CookieProp *cookie)
{
QValueList<int> fields;
fields << 4 << 5 << 7;
DCOPReply reply = DCOPRef ("kded", "kcookiejar").call ("findCookies",
DCOPArg(fields, "QValueList<int>"),
cookie->domain,
cookie->host,
cookie->path,
cookie->name);
if( !reply.isValid() )
return false;
QStringList fieldVal = reply;
QStringList::Iterator c = fieldVal.begin();
cookie->value = *c++;
unsigned tmp = (*c++).toUInt();
if( tmp == 0 )
cookie->expireDate = i18n("End of session");
else
{
QDateTime expDate;
expDate.setTime_t(tmp);
cookie->expireDate = KGlobal::locale()->formatDateTime(expDate);
}
tmp = (*c).toUInt();
cookie->secure = i18n(tmp ? "Yes" : "No");
cookie->allLoaded = true;
return true;
}
void KCookiesManagement::showCookieDetails(QListViewItem* item)
{
kdDebug () << "::showCookieDetails... " << endl;
CookieProp *cookie = static_cast<CookieListViewItem*>(item)->cookie();
if( cookie )
{
if( cookie->allLoaded || cookieDetails(cookie) )
{
dlg->leName->validateAndSet(cookie->name,0,0,0);
dlg->leValue->validateAndSet(cookie->value,0,0,0);
dlg->leDomain->validateAndSet(cookie->domain,0,0,0);
dlg->lePath->validateAndSet(cookie->path,0,0,0);
dlg->leExpires->validateAndSet(cookie->expireDate,0,0,0);
dlg->leSecure->validateAndSet(cookie->secure,0,0,0);
}
dlg->pbPolicy->setEnabled (true);
}
else
{
clearCookieDetails();
dlg->pbPolicy->setEnabled(false);
}
dlg->pbDelete->setEnabled(true);
}
void KCookiesManagement::doPolicy()
{
// Get current item
CookieListViewItem *item = static_cast<CookieListViewItem*>( dlg->lvCookies->currentItem() );
if( item && item->cookie())
{
CookieProp *cookie = item->cookie();
QString domain = cookie->domain;
if( domain.isEmpty() )
{
CookieListViewItem *parent = static_cast<CookieListViewItem*>( item->parent() );
if ( parent )
domain = parent->domain ();
}
KCookiesMain* mainDlg =static_cast<KCookiesMain*>( mainWidget );
// must be present or something is really wrong.
assert (mainDlg);
KCookiesPolicies* policyDlg = mainDlg->policyDlg();
// must be present unless someone rewrote the widget in which case
// this needs to be re-written as well.
assert (policyDlg);
policyDlg->addNewPolicy(domain);
}
}
void KCookiesManagement::deleteCookie(QListViewItem* deleteItem)
{
CookieListViewItem *item = static_cast<CookieListViewItem*>( deleteItem );
if( item->cookie() )
{
CookieListViewItem *parent = static_cast<CookieListViewItem*>(item->parent());
CookiePropList *list = deletedCookies.find(parent->domain());
if(!list)
{
list = new CookiePropList;
list->setAutoDelete(true);
deletedCookies.insert(parent->domain(), list);
}
list->append(item->leaveCookie());
delete item;
if(parent->childCount() == 0)
delete parent;
}
else
{
deletedDomains.append(item->domain());
delete item;
}
}
void KCookiesManagement::deleteCookie()
{
deleteCookie(dlg->lvCookies->currentItem());
QListViewItem* currentItem = dlg->lvCookies->currentItem();
if ( currentItem )
{
dlg->lvCookies->setSelected( currentItem, true );
showCookieDetails( currentItem );
}
else
clearCookieDetails();
dlg->pbDeleteAll->setEnabled(dlg->lvCookies->childCount());
const bool hasSelectedItem = dlg->lvCookies->selectedItem();
dlg->pbDelete->setEnabled(hasSelectedItem);
dlg->pbPolicy->setEnabled(hasSelectedItem);
emit changed( true );
}
void KCookiesManagement::deleteAllCookies()
{
if ( dlg->kListViewSearchLine->text().isEmpty())
{
reset();
m_bDeleteAll = true;
}
else
{
QListViewItem* item = dlg->lvCookies->firstChild();
while (item)
{
if (item->isVisible())
{
deleteCookie(item);
item = dlg->lvCookies->currentItem();
}
else
item = item->nextSibling();
}
const int count = dlg->lvCookies->childCount();
m_bDeleteAll = (count == 0);
dlg->pbDeleteAll->setEnabled(count);
const bool hasSelectedItem = dlg->lvCookies->selectedItem();
dlg->pbDelete->setEnabled(hasSelectedItem);
dlg->pbPolicy->setEnabled(hasSelectedItem);
}
emit changed( true );
}
#include "kcookiesmanagement.moc"