/* * Copyright (C) 2004 Robert Hogan */ #include #include "kuarantine.h" #include "dbviewer.h" #include "klamav.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include Kuarantine::Kuarantine(TQWidget *parent, const char *name) : TQWidget(parent, name) { config = TDEGlobal::config(); config->setGroup("Kuarantine"); lastQuarLocations = config->readListEntry("KuarantineLocations"); //kdDebug() << "in quarantine " << endl; if (lastQuarLocations.isEmpty()){ createQuarDir(); }else{ for (TQStringList::Iterator it = lastQuarLocations.begin(); it == lastQuarLocations.begin(); it++ ) quarloc = *it; if (!(TDEIO::NetAccess::exists(quarloc,TRUE,NULL))){ KMessageBox::information (this,i18n( "Your current quarantine location ('%1') no longer exists. I'm going to attempt to create a new one.").arg(quarloc)); createQuarDir(); } } //Get Items for this location lastQuarItems = config->readListEntry(TQString("Items %1").arg(quarloc)); if (lastQuarItems.isEmpty()){ config->writeEntry(TQString("Items %1").arg(quarloc), ""); lastQuarItems = config->readListEntry(TQString("Items %1").arg(quarloc)); } //Get History for this location lastHistoryItems = config->readListEntry(TQString("History %1").arg(quarloc)); if (lastHistoryItems.isEmpty()){ config->writeEntry(TQString("History %1").arg(quarloc), ""); config->sync(); lastHistoryItems = config->readListEntry(TQString("History %1").arg(quarloc)); } //Create GUI TQVBoxLayout *vbox = new TQVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint(), "vbox"); TQGroupBox *group = new TQGroupBox(i18n("Quarantine Location"), this); vbox->addWidget(group); TQGridLayout *layout = new TQGridLayout( group, 9, 3, KDialog::spacingHint(), KDialog::spacingHint(), "layout"); layout->addRowSpacing(0, group->fontMetrics().height()); layout->setColStretch(0, 1); layout->setColStretch(1, 1); TQWidget *hlp = new TQWidget( group ); layout->addMultiCellWidget(hlp, 1,1, 0,2); TQHBoxLayout *dir_layout = new TQHBoxLayout(hlp, KDialog::spacingHint() ); TQLabel *dir_label = new TQLabel(i18n("&Directory:"), hlp); dir_label->setFixedSize(dir_label->sizeHint()); dir_label->adjustSize(); dir_layout->addWidget(dir_label); // anders: KDE is an amazing tool:) dir_combo = new KURLRequester( new KComboBox(true, hlp), hlp, "dir combo" ); dir_combo->completionObject()->setMode(KURLCompletion::DirCompletion); dir_combo->comboBox()->insertStringList(lastQuarLocations); dir_combo->setMode( KFile::Directory|KFile::LocalOnly ); dir_layout->addWidget(dir_combo); dir_label->setBuddy(dir_combo); connect( dir_combo, SIGNAL(urlSelected(const TQString &)), SLOT(updateLastQuarLocations()) ); connect( dir_combo, SIGNAL(textChanged(const TQString &)), SLOT(updateLastQuarLocations()) ); TQGroupBox *group2 = new TQGroupBox(i18n("Contents Of Quarantine"), this); vbox->addWidget(group2); TQGridLayout *layout2 = new TQGridLayout( group2, 9, 3, KDialog::spacingHint(), KDialog::spacingHint(), "layout2"); layout2->addRowSpacing(0, group2->fontMetrics().height()); layout2->setColStretch(0, 1); layout2->setColStretch(1, 1); TQWidget *hlp2 = new TQWidget( group2 ); layout2->addMultiCellWidget(hlp2, 1,1, 0,2); TQHBoxLayout *dir_layout2 = new TQHBoxLayout(hlp2, KDialog::spacingHint() ); // currentbox = new TQListBox(hlp2); // TQFontMetrics rb_fm(currentbox->fontMetrics()); // currentbox->setMinimumSize(rb_fm.width("0")*25, // rb_fm.lineSpacing()*8); // dir_layout2->addWidget(currentbox); currentbox = new TQListView(hlp2); currentbox->setShowSortIndicator(true); TQFontMetrics rb_fm(currentbox->fontMetrics()); //currentbox->setMinimumSize(rb_fm.width("0")*55, // rb_fm.lineSpacing()*15); //kdDebug() << ((currentbox->width())/3) << endl; currentbox->addColumn( i18n( "Name of File" ),0); currentbox->addColumn( i18n( "Name of Virus Found" ),0); currentbox->addColumn( i18n( "Date Quarantined" ),0); currentbox->setResizeMode(TQListView::AllColumns); currentbox->setSelectionMode( TQListView::Extended ); currentbox->setAllColumnsShowFocus(true); qmenu = new TQPopupMenu( currentbox ); connect(currentbox, SIGNAL( contextMenuRequested( TQListViewItem *, const TQPoint& , int ) ), this, SLOT( slotRMB( TQListViewItem *, const TQPoint &, int ) ) ); dir_layout2->addWidget(currentbox); //layout->addMultiCellWidget(currentbox); refresh(); KButtonBox *actionbox = new KButtonBox(hlp2, TQt::Vertical); actionbox->addStretch(); refresh_button = actionbox->addButton(i18n("&Refresh")); refresh_button->setDefault(true); search_button = actionbox->addButton(i18n("&Restore")); search_button->setDefault(true); cancel_button = actionbox->addButton(i18n("&Delete")); actionbox->addStretch(); actionbox->adjustSize(); actionbox->layout(); dir_layout2->addWidget(actionbox); connect( refresh_button, SIGNAL(clicked()), SLOT(refresh()) ); connect( search_button, SIGNAL(clicked()), SLOT(slotSearch()) ); connect( cancel_button, SIGNAL(clicked()), SLOT(slotCancel()) ); TQGroupBox *group3 = new TQGroupBox(i18n("Quarantine History"), this); vbox->addWidget(group3); TQGridLayout *layout3 = new TQGridLayout( group3, 9, 2, KDialog::spacingHint(), KDialog::spacingHint(), "layout3"); layout3->addRowSpacing(0, group3->fontMetrics().height()); layout3->setColStretch(0, 1); layout3->setColStretch(1, 1); TQWidget *hlp3 = new TQWidget( group3 ); layout3->addMultiCellWidget(hlp3, 1,1, 0,2); TQHBoxLayout *dir_layout3 = new TQHBoxLayout(hlp3, KDialog::spacingHint() ); // historybox = new TQListBox(hlp3); // TQFontMetrics rb_fm3(historybox->fontMetrics()); // historybox->setMinimumSize(rb_fm3.width("0")*25, // rb_fm3.lineSpacing()*8); // dir_layout3->addWidget(historybox); historybox = new TQListView(hlp3); historybox->setShowSortIndicator(true); TQFontMetrics rb_fm2(historybox->fontMetrics()); //historybox->setMinimumSize(rb_fm2.width("0")*55, // rb_fm2.lineSpacing()*15); historybox->addColumn( i18n( "Name of File" ),(historybox->width())); historybox->addColumn( i18n( "Name of Virus Found" ),(historybox->width())); historybox->addColumn( i18n( "Date Quarantined" ),(historybox->width())); historybox->setResizeMode(TQListView::AllColumns); historybox->setSelectionMode( TQListView::Extended ); historybox->setAllColumnsShowFocus(true); hmenu = new TQPopupMenu( historybox ); connect(historybox, SIGNAL( contextMenuRequested( TQListViewItem *, const TQPoint& , int ) ), this, SLOT( slotRMB( TQListViewItem *, const TQPoint &, int ) ) ); dir_layout3->addWidget(historybox); //layout->addMultiCellWidget(historybox, 2, 2, 0, 2); KButtonBox *actionbox3 = new KButtonBox(hlp3, TQt::Vertical); actionbox3->addStretch(); search_button3 = actionbox3->addButton(i18n("&Clear All")); search_button3->setDefault(true); cancel_button3 = actionbox3->addButton(i18n("&Delete")); cancel_button3->setEnabled(true); actionbox3->addStretch(); actionbox3->layout(); dir_layout3->addWidget(actionbox3); refreshhistory(); connect( search_button3, SIGNAL(clicked()), SLOT(slotClearHistory()) ); connect( cancel_button3, SIGNAL(clicked()), SLOT(slotDeleteHistory()) ); } Kuarantine::~Kuarantine() { } void Kuarantine::refresh() { TQStringList obsoleteQuarItems; config = TDEGlobal::config(); config->setGroup("Kuarantine"); lastQuarItems = config->readListEntry(TQString("Items %1").arg(quarloc)); if (!(TDEIO::NetAccess::exists(quarloc,TRUE,NULL))){ KMessageBox::information (this,i18n("Your current quarantine location ('%1') no longer exists. I'm going to attempt to create a new one.").arg(quarloc)); createQuarDir(); }else{ currentbox->clear(); for (TQStringList::Iterator it = lastQuarItems.begin(); it != lastQuarItems.end(); it++ ){ TQString fname = getFileName(*it); TQString itemname = getVirusName(*it); TQString when = getWhen(*it); TQStringList tokens = TQStringList::split ( "/", fname, FALSE ); TQString qname = tokens.last(); qname.prepend("/"); qname.prepend(quarloc); qname.append(":"+when); //kdDebug() << qname << endl; if (TDEIO::NetAccess::exists(qname,TRUE,NULL)){ //currentbox->insertItem(*it); new TQListViewItem( currentbox, fname, itemname,when); }else{ //kdDebug() << qname << "doesna exist" << endl; obsoleteQuarItems.append(*it); } } for (TQStringList::Iterator it = obsoleteQuarItems.begin(); it != obsoleteQuarItems.end(); it++ ) lastQuarItems.remove(*it); config->writeEntry(TQString("Items %1").arg(quarloc), lastQuarItems); } config->sync(); } void Kuarantine::refreshhistory() { config = TDEGlobal::config(); config->setGroup("Kuarantine"); lastHistoryItems = config->readListEntry(TQString("History %1").arg(quarloc)); historybox->clear(); for (TQStringList::Iterator it = lastHistoryItems.begin(); it != lastHistoryItems.end(); it++ ){ TQString fname = getFileName(*it); TQString itemname = getVirusName(*it); TQString when = getWhen(*it); new TQListViewItem( historybox, fname, itemname,when); } } void Kuarantine::load() { TQString target; // the below code is what you should normally do. in this // example case, we want the url to our own. you probably // want to use this code instead for your app currentbox->clear(); for (TQStringList::Iterator it = lastQuarItems.begin(); it != lastQuarItems.end(); it++ ){ TQString fname = getFileName(*it); TQString itemname = getVirusName(*it); TQString when = getWhen(*it); new TQListViewItem( currentbox, fname, itemname,when); } } void Kuarantine::slotSearch() { //if (!(currentbox->selectedItem())) // return; TQPtrList list; TQListViewItemIterator it( currentbox, TQListViewItemIterator::Selected ); while ( it.current() ) { TQListViewItem* tItem = it.current(); config = TDEGlobal::config(); config->setGroup("Kuarantine"); lastQuarItems = config->readListEntry(TQString("Items %1").arg(quarloc)); lastHistoryItems = config->readListEntry(TQString("History %1").arg(quarloc)); TQString fname = tItem->text(0); TQStringList tokens = TQStringList::split ( "/", fname, FALSE ); TQString qname = tokens.last(); qname.prepend("/"); qname.prepend(quarloc); qname.append(":"+tItem->text(2)); if (TDEIO::NetAccess::file_move(qname,fname)){ lastQuarItems.remove(tItem->text(0)+":"+tItem->text(1)+":"+tItem->text(2)); //currentbox->takeItem(currentbox->currentItem()); list.prepend( it.current() ); config->writeEntry(TQString("Items %1").arg(quarloc), lastQuarItems); config->sync(); }else{ KMessageBox::information (this,i18n("

There was a problem restoring %1. Check your diskspace, the permissions on the location you are restoring to, and whether a file with the same name already exists in that location.

").arg(fname)); } ++it; } for( TQListViewItem *item = list.first(); item; item = list.next() ) { delete item; } } void Kuarantine::updateLastQuarLocations() { config = TDEGlobal::config(); config->setGroup("Kuarantine"); lastQuarLocations = config->readListEntry("KuarantineLocations"); if (lastQuarLocations.contains(dir_combo->url()) == 0) { dir_combo->comboBox()->insertItem(dir_combo->url(), 0); lastQuarLocations.prepend(dir_combo->url()); if (lastQuarLocations.count() > 10) { lastQuarLocations.remove(lastQuarLocations.fromLast()); dir_combo->comboBox()->removeItem(dir_combo->comboBox()->count() - 1); } }else{ lastQuarLocations.remove(dir_combo->url()); lastQuarLocations.prepend(dir_combo->url()); } config->writeEntry("KuarantineLocations", lastQuarLocations); config->sync(); quarloc = dir_combo->url(); refresh(); refreshhistory(); } void Kuarantine::slotCancel() { //if (!(currentbox->selectedItem())) // return; TQPtrList list; TQListViewItemIterator it( currentbox, TQListViewItemIterator::Selected ); while ( it.current() ) { //TQListViewItem* tItem = ( *it ); //if (tItem->isSelected()){ config = TDEGlobal::config(); config->setGroup("Kuarantine"); lastQuarItems = config->readListEntry(TQString("Items %1").arg(quarloc)); lastHistoryItems = config->readListEntry(TQString("History %1").arg(quarloc)); TQString QuarLocation = dir_combo->url(); //TQStringList tokens = TQStringList::split ( ":", ( it.current() )->text(), FALSE ); TQString fname = ( it.current() )->text(0); TQString itemname = ( it.current() )->text(1); TQString when = ( it.current() )->text(2); TQStringList tokens = TQStringList::split ( "/", fname, FALSE ); TQString qname = tokens.last(); qname.prepend("/"); qname.prepend(QuarLocation); qname.append(":"+( it.current() )->text(2)); if (TDEIO::NetAccess::del(qname,NULL)){ lastQuarItems.remove(( it.current() )->text(0)+":"+( it.current() )->text(1)+":"+( it.current() )->text(2)); lastHistoryItems.prepend(( it.current() )->text(0)+":"+( it.current() )->text(1)+":"+( it.current() )->text(2)); new TQListViewItem( historybox, fname, itemname,when); //historybox->inser( it.current() )(( it.current() )->text()); //currentbox->takeItem(( it.current() )); list.prepend( it.current() ); }else{ KMessageBox::information (this,i18n( "There was a problem deleting the file. Is there a problem with the permissions on the quarantine folder? " )); } //} ++it; } for( TQListViewItem *item = list.first(); item; item = list.next() ) { delete item; } config->writeEntry(TQString("Items %1").arg(quarloc), lastQuarItems); config->writeEntry(TQString("History %1").arg(quarloc), lastHistoryItems); config->sync(); } void Kuarantine::slotClearHistory() { historybox->clear(); config = TDEGlobal::config(); config->setGroup("Kuarantine"); lastHistoryItems = config->readListEntry(TQString("History %1").arg(quarloc)); if (lastHistoryItems.isEmpty()) return; lastHistoryItems.clear(); config->writeEntry(TQString("History %1").arg(quarloc), lastHistoryItems); config->sync(); } void Kuarantine::slotDeleteHistory() { //if (!(historybox->selectedItem())) // return; //TQListViewItem* tItem = historybox->selectedItem(); config->setGroup("Kuarantine"); lastHistoryItems = config->readListEntry(TQString("History %1").arg(quarloc)); TQPtrList list; TQListViewItemIterator it( historybox, TQListViewItemIterator::Selected ); while ( it.current() ) { lastHistoryItems.remove(( it.current() )->text(0)+":"+( it.current() )->text(1)+":"+( it.current() )->text(2)); //historybox->takeItem(historybox->curren( it.current() )()); list.prepend( it.current() ); ++it; } for( TQListViewItem *item = list.first(); item; item = list.next() ) { delete item; } config->writeEntry(TQString("History %1").arg(quarloc), lastHistoryItems); config->sync(); } void Kuarantine::setDirName(TQString dir){ // dir_combo->setEditText(dir); dir_combo->setURL(dir); } void Kuarantine::createQuarDir(){ TQString path = getenv("HOME"); bool ok = true; // directory exist? path += "/.klamav"; TQDir klamavdir(path); if (!klamavdir.exists() && !klamavdir.mkdir(path)) ok = false; path += "/quarantine"; if (ok) { TQDir klamavqdir(path); if (!klamavqdir.exists() && !klamavqdir.mkdir(path)) ok = false; else chmod((const char *)path,0700); } if (ok){ quarloc = TQString("%1").arg(path); lastQuarLocations.append( TQString("%1").arg(path)); config = TDEGlobal::config(); config->setGroup("Kuarantine"); config->writeEntry("KuarantineLocations", lastQuarLocations); config->sync(); lastQuarLocations = config->readListEntry("KuarantineLocations"); } KMessageBox::information (this,TQString(ok ? i18n( "Your default quarantine location has been set up as '%1'. You can change this to something else if you want to." ) : i18n( "I cannot create the directory '%1' for you. Something is wrong with your HOME or klamav directory. You have to adjust your quarantine directory by your self." )).arg(path)); } TQString Kuarantine::getFileName(TQString entry){ int fnameStartPoint = 0; int dtStartPoint = entry.findRev(":"); int fnameEndPoint = entry.findRev(":", (signed int)-((entry.length() - dtStartPoint)+1)); TQString fname = entry.mid(fnameStartPoint,(fnameEndPoint - fnameStartPoint)); //kdDebug() << fname << endl; return fname; } TQString Kuarantine::getVirusName(TQString entry){ int dtStartPoint = entry.findRev(":"); int fnameEndPoint = entry.findRev(":", (signed int)-((entry.length() - dtStartPoint)+1)); TQString itemName = entry.mid((fnameEndPoint+1),((dtStartPoint+1) - (fnameEndPoint+2))); //kdDebug() << itemName << endl; return itemName.stripWhiteSpace(); } TQString Kuarantine::getWhen(TQString entry){ int dtStartPoint = entry.findRev(":"); TQString when = entry.mid((dtStartPoint+1),(entry.length() - (dtStartPoint+1))); //kdDebug() << when << endl; return when; } void Kuarantine::slotRMB( TQListViewItem* Item, const TQPoint & point, int ) { if( Item ){ TQPixmap gicon; TQPixmap vicon; TQPixmap ticon; TQPixmap vlicon; TQString iconPath = locate("cache", KMimeType::favIconForURL("http://www.viruspool.net")+".png"); if ( iconPath.isEmpty() ) vicon = SmallIcon("edit-find"); else vicon = TQPixmap( iconPath ); iconPath = locate("cache", KMimeType::favIconForURL("http://www.google.com")+".png"); if ( iconPath.isEmpty() ) gicon = SmallIcon("edit-find"); else gicon = TQPixmap( iconPath ); iconPath = locate("cache", KMimeType::favIconForURL("http://www.trendmicro.com")+".png"); if ( iconPath.isEmpty() ) ticon = SmallIcon("edit-find"); else ticon = TQPixmap( iconPath ); iconPath = locate("cache", KMimeType::favIconForURL("http://www.viruslist.com")+".png"); if ( iconPath.isEmpty() ) vlicon = SmallIcon("edit-find"); else vlicon = TQPixmap( iconPath ); if (Item->listView() == currentbox){ qmenu->clear(); qmenu->insertItem( ticon,i18n("Search for %1 with Trend Micro").arg(Item->text(1)), this, SLOT(slotTrendMicroCurrent()) ); qmenu->insertItem( gicon,i18n("Search for %1 with Google").arg(Item->text(1)), this, SLOT(slotGoogleCurrent()) ); qmenu->popup( point ); }else if (Item->listView() == historybox){ hmenu->clear(); hmenu->insertItem( ticon,i18n("Search for %1 with Trend Micro").arg(Item->text(1)), this, SLOT(slotTrendMicroHistory()) ); hmenu->insertItem( gicon,i18n("Search for %1 with Google").arg(Item->text(1)), this, SLOT(slotGoogleHistory()) ); hmenu->popup( point ); } } } void Kuarantine::slotGoogleCurrent() { TQString name = currentbox->currentItem()->text(1); tdemain->klamdb->slotExternal(name,"Google"); } void Kuarantine::slotTrendMicroCurrent() { TQString name = currentbox->currentItem()->text(1); tdemain->klamdb->slotExternal(name, "TrendMicro"); } void Kuarantine::slotGoogleHistory() { TQString name = historybox->currentItem()->text(1); tdemain->klamdb->slotExternal(name,"Google"); } void Kuarantine::slotTrendMicroHistory() { TQString name = historybox->currentItem()->text(1); tdemain->klamdb->slotExternal(name, "TrendMicro"); } #include "kuarantine.moc"