/* * Copyright (C) 2004 Robert Hogan */ #include "klamd.h" #include "klamav.h" #include "freshklam.h" #include "klamavconfig.h" #include "collectiondb.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include const char *check_desc1[] = { "1", "2", "3", "4", "5", 0 }; const char *check_desc2[] = { "On Access", "On Execute", 0 }; Klamd::Klamd(QWidget *_parent, const char *name) : QWidget(_parent, name) { parent = _parent; klamdAlive = FALSE; //Data Directory Widget //QString dt = QDateTime::currentDateTime().toString(); //KMessageBox::information (this,dt); QVBoxLayout *vbox = new QVBoxLayout(this, KDialog::marginHint(), KDialog::spacingHint(), "vbox"); QGroupBox *group = new QGroupBox(i18n("Include Directories"), this); vbox->addWidget(group); QGridLayout *layout = new QGridLayout( group, 9, 3, KDialog::spacingHint(), KDialog::spacingHint(), "layout"); layout->addRowSpacing(0, group->fontMetrics().height()); layout->setColStretch(0, 1); layout->setColStretch(1, 1); hlp = new QWidget( group ); layout->addMultiCellWidget(hlp, 1,1, 0,2); QHBoxLayout *dir_layout = new QHBoxLayout(hlp, KDialog::spacingHint() ); KURL root = KURL( "/" ); m_fileTreeView = new KFileTreeView( hlp ); m_fileTreeView->addColumn( i18n("Include") ); treeBranch = m_fileTreeView->addBranch( root, i18n("Root"), SmallIcon("folder_red") ); m_fileTreeView->setDirOnlyMode( treeBranch, true ); treeBranch->setShowingDotFiles( true ); treeBranch->setOpen( true ); btnup = new KArrowButton(hlp, LeftArrow); btnup->setFixedSize(20, 20); connect(btnup, SIGNAL( clicked() ), SLOT( slotDelIncludeDir() )); btndown = new KArrowButton(hlp, RightArrow); btndown->setEnabled(true); btndown->setFixedSize(20, 20); connect(btndown,SIGNAL( clicked() ), SLOT( slotAddIncludeDir())); sessionslb = new MyListBox(hlp); config = KGlobal::config(); config->setGroup("Klamd"); includePaths = config->readListEntry("IncludePaths"); if (!(includePaths.isEmpty())) btnup->setEnabled(true); sessionslb->insertStringList(includePaths); dir_layout->addWidget(m_fileTreeView); dir_layout->addWidget(btnup); dir_layout->addWidget(btndown); dir_layout->addWidget(sessionslb); QGroupBox *group2 = new QGroupBox(i18n("Exclude Directories"), this); vbox->addWidget(group2); QGridLayout *layout2 = new QGridLayout( group2, 9, 3, KDialog::spacingHint(), KDialog::spacingHint(), "layout2"); layout2->addRowSpacing(0, group2->fontMetrics().height()); layout2->setColStretch(0, 1); layout2->setColStretch(1, 1); hlp2 = new QWidget( group2 ); layout2->addMultiCellWidget(hlp2, 1,1, 0,2); QHBoxLayout *dir_layout2 = new QHBoxLayout(hlp2, KDialog::spacingHint() ); KURL root2 = KURL( "/" ); m_fileTreeView2 = new KFileTreeView( hlp2 ); m_fileTreeView2->addColumn( i18n("Exclude") ); treeBranch2 = m_fileTreeView2->addBranch( root2, i18n("Root"), SmallIcon("folder_red") ); m_fileTreeView2->setDirOnlyMode( treeBranch2, true ); treeBranch2->setShowingDotFiles( true ); treeBranch2->setOpen( true ); btnup2 = new KArrowButton(hlp2, LeftArrow); btnup2->setFixedSize(20, 20); connect(btnup2, SIGNAL( clicked() ), SLOT( slotDelExcludeDir() )); btndown2 = new KArrowButton(hlp2, RightArrow); btndown2->setEnabled(true); btndown2->setFixedSize(20, 20); connect(btndown2,SIGNAL( clicked() ), SLOT( slotAddExcludeDir())); sessionslb2 = new MyListBox(hlp2); //config = KGlobal::config(); config->setGroup("Klamd"); excludePaths = config->readListEntry("ExcludePaths"); if (!(excludePaths.isEmpty())) btnup2->setEnabled(true); sessionslb2->insertStringList(excludePaths); dir_layout2->addWidget(m_fileTreeView2); dir_layout2->addWidget(btnup2); dir_layout2->addWidget(btndown2); dir_layout2->addWidget(sessionslb2); QGroupBox *group3 = new QGroupBox(i18n("Options"), this); vbox->addWidget(group3); QGridLayout *layout3 = new QGridLayout( group3, 9, 10, KDialog::spacingHint(), KDialog::spacingHint(), "layout3"); layout3->addRowSpacing(0, group3->fontMetrics().height()); //layout3->setColStretch(0, 1); //layout3->setColStretch(1, 1); hlp3 = new QWidget( group3 ); layout3->addMultiCellWidget(hlp3, 1,1, 0,10); QHBoxLayout *dir_layout3 = new QHBoxLayout(hlp3, KDialog::spacingHint() ); recursive_box = new QCheckBox(i18n("&Quarantine"), hlp3); //recursive_box->setMinimumWidth(recursive_box->sizeHint().width()); if ((config->readEntry("Quarantine")) == "Yes") recursive_box->setChecked(true); connect( recursive_box, SIGNAL(toggled(bool)), SLOT(handleChecks()) ); //dir_layout3->addSpacing(10); dir_layout3->addWidget(recursive_box); recursive_box1 = new QCheckBox(i18n("&Display Warnings"), hlp3); //recursive_box1->setMinimumWidth(recursive_box1->sizeHint().width()); if ((config->readEntry("Warn")) == "Yes") recursive_box1->setChecked(true); connect( recursive_box1, SIGNAL(toggled(bool)), SLOT(handleChecks()) ); //dir_layout3->addSpacing(10); dir_layout3->addWidget(recursive_box1); recursive_box2 = new QCheckBox(i18n("&Run Docked"), hlp3); //recursive_box2->setMinimumWidth(recursive_box2->sizeHint().width()); if ((config->readEntry("Run Docked")) == "Yes") recursive_box2->setChecked(true); connect( recursive_box2, SIGNAL(toggled(bool)), SLOT(handleChecks()) ); dir_layout3->addWidget(recursive_box2); dir_layout3->addSpacing(40); QLabel *combo_label = new QLabel(i18n("Max File Size (MBs):"), hlp3); //combo_label->setFixedSize(combo_label->sizeHint()); dir_layout3->addWidget(combo_label); check_combo = new QComboBox(false, hlp3); check_combo->insertStrList(check_desc1); check_combo->adjustSize(); //check_combo->setFixedSize(check_combo->size()); dir_layout3->addWidget(check_combo); dir_layout3->addSpacing(20); QToolButton* adv_options = new QToolButton( hlp3,"play" ); adv_options->setIconSet( SmallIconSet( "configure" ) ); adv_options->setTextLabel("Options"); adv_options->setTextPosition(QToolButton::Right); adv_options->setUsesTextLabel(true); // adv_options = new QPushButton ("Advanced", hlp3); dir_layout3->addWidget(adv_options); //adv_options->setFixedSize(adv_options->sizeHint()); connect( adv_options, SIGNAL(clicked()), SLOT(slotAdvOptions()) ); /* QLabel *combo_label2 = new QLabel(i18n("Scan:"), hlp3); combo_label2->setFixedSize(combo_label2->sizeHint()); dir_layout3->addWidget(combo_label2); check_combo2 = new QComboBox(false, hlp3); check_combo2->insertStrList(check_desc2); check_combo2->adjustSize(); check_combo2->setFixedSize(check_combo2->size()); dir_layout3->addWidget(check_combo2); QToolTip::add( check_combo2, "'On Access' scans every file accessed. 'On Execute' only scans files/programs that your system tries to execute." );*/ KButtonBox *actionbox = new KButtonBox(this, Qt::Horizontal); vbox->addWidget(actionbox, 2, 0); actionbox->addStretch(); search_button = actionbox->addButton(i18n("&Enable Auto-Scan")); search_button->setDefault(true); cancel_button = actionbox->addButton(i18n("&Disable Auto-Scan")); cancel_button->setEnabled(false); actionbox->addStretch(); actionbox->layout(); /* connect( search_button, SIGNAL(clicked()), SLOT(startKlamd()) ); connect( cancel_button, SIGNAL(clicked()), SLOT(slotCancel()) ); */ if (KApplication::kApplication()->isRestored()) restoreKlamd(); // KStdAction::quit(this, SLOT(hide()), actionCollection()); } Klamd::~Klamd() { if (klamdAlive){ delete childproc; childproc = 0; } if (!(tempFileName.isEmpty())) KIO::NetAccess::del(tempFileName,NULL); } void Klamd::processOutput() { if(!childproc) return; item2 = ""; int pos; if ((pos = (childproc->readln(item2))) != -1) { //kdDebug() << item2 << endl; if ((pos = (item2.find(" FOUND"))) != -1){ item2 = item2.stripWhiteSpace(); int fnameStartPoint = (item2.find(":") + 1); int fnameEndPoint = item2.findRev(":"); QString tmpFName = item2.mid(fnameStartPoint,(fnameEndPoint - fnameStartPoint)); QString tmpVirusName = item2.mid((fnameEndPoint+1),(item2.length() - (fnameEndPoint+1))); tmpVirusName.replace("FOUND",""); CollectionDB::instance()->insertEvent("Virus Found",tmpVirusName,tmpFName); if (recursive_box1->isChecked()) KNotifyClient::event(kmain->_tray->winId(),i18n( "ScanCompleteNoVirus" ), i18n( "Virus %1 Found In %2 by Auto-Scan!" ).arg(tmpVirusName).arg(tmpFName)); if (recursive_box->isChecked()) Quarantine(tmpFName.stripWhiteSpace(),tmpVirusName.stripWhiteSpace()); } if ((pos = (item2.find("ERROR: Clamuko: Can't register with Dazuko"))) != -1){ finish(); KMessageBox::information (this,i18n( "Can't Start On-Access Scanning! Check you have read permissions on file /dev/dazuko.") ); KNotifyClient::event(kmain->_tray->winId(),i18n( "Can't Start On-Access Scanning!" ), i18n( "Check you have read permissions on file /dev/dazuko." )); return; } } childproc->ackRead(); item2 = ""; buf = ""; } bool Klamd::startKlamd() { config = KGlobal::config(); config->setGroup("Klamd"); if ((config->readListEntry("IncludePaths")).isEmpty()){ KMessageBox::information (this,i18n("You haven't specified any paths to scan. Select the directories you want to KlamAV to keep an eye on and try again.")); return FALSE; } if (recursive_box2->isChecked()){ if (!(this->topLevelWidget()->isHidden())) KMessageBox::information (this,i18n("I'm going into the background now. You can restore me by clicking on the icon in the system tray on the bottom right.")); this->topLevelWidget()->hide(); }/*else{ this->topLevelWidget()->show(); }*/ if (runDazuko(true)) return TRUE; else return FALSE; //this->topLevelWidget()->hide(); } void Klamd::finish() { search_button->setEnabled(true); cancel_button->setEnabled(false); //config = KGlobal::config(); if (!KApplication::kApplication()->closingDown()){ config->setGroup("Klamd"); config->writeEntry("Enabled", "No"); } kmain->clamdStopped(); buf += '\n'; if (childproc){ processOutput(); childproc->closeAll(); childproc->kill(9); delete childproc; childproc = 0; } klamdAlive = FALSE; enableInputs(); if (!(tempFileName.isEmpty())) KIO::NetAccess::del(tempFileName,NULL); } void Klamd::slotCancel() { finish(); CollectionDB::instance()->insertEvent("Auto-Scan","Scanning Cancelled",""); } void Klamd::childExited() { // int status = childproc->exitStatus(); // // kdDebug() << "klamd status" << status << endl; kmain->contextDisable(); KMessageBox::information (this,i18n( "The auto-scan process died unexpectedly!") ); //if (status != 0) //matches_label->setText(""); } void Klamd::receivedOutput(KProcIO *) { //buf += QCString(buffer, buflen+1); processOutput(); } void Klamd::slotClear() { finish(); } void Klamd::setDirName(QString dir){ // dir_combo->setEditText(dir); dir_combo->setURL(dir); } void Klamd::slotAddIncludeDir() { KURL filepattern = m_fileTreeView->currentURL(); QString filepa = filepattern.path(); if(filepa) if ((includePaths.contains(filepa) == 0) && (excludePaths.contains(filepa) == 0)){ sessionslb->insertItem(filepa); //config = KGlobal::config(); config->setGroup("Klamd"); if (includePaths.contains(filepa) == 0) { includePaths.prepend(filepa); }else{ includePaths.remove(filepa); includePaths.prepend(filepa); } config->writeEntry("IncludePaths", includePaths); config->sync(); btnup->setEnabled(true); } } void Klamd::slotDelIncludeDir() { while (includePaths.contains(sessionslb->currentText())) { includePaths.remove(sessionslb->currentText()); } sessionslb->removeItem(sessionslb->currentItem()); //config = KGlobal::config(); config->setGroup("Klamd"); config->writeEntry("IncludePaths", includePaths); config->sync(); if ( sessionslb->count() == 0 ) btnup->setEnabled(false); } void Klamd::slotAddExcludeDir() { //KFileTreeViewItem* treeItem = dynamic_cast(KFileTreeViewItem::currentKFileTreeViewItem()); KURL filepattern = m_fileTreeView2->currentURL(); QString filepa = filepattern.path(); if(filepa) if ((includePaths.contains(filepa) == 0) && (excludePaths.contains(filepa) == 0)){ sessionslb2->insertItem(filepa); //config = KGlobal::config(); config->setGroup("Klamd"); if (excludePaths.contains(filepa) == 0) { excludePaths.prepend(filepa); }else{ excludePaths.remove(filepa); excludePaths.prepend(filepa); } config->writeEntry("ExcludePaths", excludePaths); config->sync(); btnup2->setEnabled(true); } } void Klamd::slotDelExcludeDir() { while (excludePaths.contains(sessionslb2->currentText())) { excludePaths.remove(sessionslb2->currentText()); } sessionslb2->removeItem(sessionslb2->currentItem()); //config = KGlobal::config(); config->setGroup("Klamd"); config->writeEntry("ExcludePaths", excludePaths); config->sync(); if ( sessionslb2->count() == 0 ) btnup2->setEnabled(false); } void Klamd::writeConf() { KTempFile tf; if ( tf.status() != 0 ) { tf.close(); //delete tf; KMessageBox::information (this,"KMFilterActionWithCommand: Could not create temp file!"); return; } //config = KGlobal::config(); config->setGroup("Kuarantine"); QStringList lastQuarLocations = config->readListEntry("KuarantineLocations"); QString quarloc; for (QStringList::Iterator ita = lastQuarLocations.begin(); ita == lastQuarLocations.begin() ; ita++){ quarloc = *ita; } QString db = kmain->freshklam->getCurrentDBDir(); //tf->setAutoDelete(TRUE); tempFileName = tf.name(); QTextStream &ts = *(tf.textStream()); for ( QListBoxItem *bi = sessionslb->firstItem() ; bi != 0; bi = bi->next() ) ts << "ClamukoIncludePath " << bi->text() << "\n"; ts << "ClamukoExcludePath " <firstItem() ; bi != 0; bi = bi->next() ) ts << "ClamukoExcludePath " << bi->text() << "\n"; config->setGroup("Klamd"); if (KlamavConfig::created()){ ts << "ClamukoScanOnCloseModified" << "\n"; clamdcommand = "klamd"; ts << "TCPSocket 9888 " << "\n"; ts << "Foreground" << "\n"; ts << "LogFile /dev/stdout" << "\n"; ts << "ScanArchive" << "\n"; ts << "FixStaleSocket" << "\n"; ts << "SelfCheck 1800" << "\n"; ts << QString("DatabaseDirectory %1").arg(db) << "\n"; ts << "ClamukoScanOnLine" << "\n"; if (KlamavConfig::executed()) ts << "ClamukoScanOnExec " << "\n"; }else{ clamdcommand = "clamd"; ts << "TCPSocket 9888 " << "\n"; ts << "Foreground True" << "\n"; ts << "LogFile /dev/stdout" << "\n"; ts << "ScanArchive True" << "\n"; ts << "FixStaleSocket True" << "\n"; ts << "SelfCheck 1800" << "\n"; ts << QString("DatabaseDirectory %1").arg(db) << "\n"; ts << "ClamukoScanOnAccess True" << "\n"; if (KlamavConfig::executed()) ts << "ClamukoScanOnExec True" << "\n"; if (KlamavConfig::opened()) ts << "ClamukoScanOnOpen True" << "\n"; if (KlamavConfig::closed()) ts << "ClamukoScanOnClose True" << "\n"; } QString curtex = check_combo->currentText(); ts << "ClamukoMaxFileSize " << curtex << "M\n"; tf.close(); } void Klamd::Quarantine(QString fname, QString virusname){ //config = KGlobal::config(); config->setGroup("Kuarantine"); //object.replace("Clamuko:",""); //object = object.stripWhiteSpace(); ////kdDebug() << object << endl; //QString QuarLocation = config->readEntry("KuarantineLocations"); QStringList lastQuarLocations = config->readListEntry("KuarantineLocations"); QString quarloc; for (QStringList::Iterator it = lastQuarLocations.begin(); it == lastQuarLocations.begin() ; it++){ quarloc = *it; } lastQuarItems = config->readListEntry(QString("Items %1").arg(quarloc)); if (!(fname.isEmpty())){ QDate today = QDate::currentDate(); QTime now = QTime::currentTime(); QString suffix = QString(":%1 %2") .arg(today.toString("ddd MMMM d yyyy")) .arg(now.toString("hh-mm-ss ap")); QString object = fname + ": " + virusname + suffix; QStringList tokens = QStringList::split ( "/", fname, FALSE ); QString qname = tokens.last(); qname.prepend("/"); qname.prepend(quarloc); qname.append(suffix); bufmv = ""; //kdDebug() << fname << endl; //kdDebug() << qname << endl; //kdDebug() << object << endl; if (rename ((const char *)fname, (const char *)qname) != 0){ QString suCommand=QString("mv '%1' '%2'").arg(fname).arg(qname); //kdDebug() << suCommand << endl; proc = new KProcIO(); proc->setUseShell(TRUE); *proc<start(KProcIO::NotifyOnExit,TRUE); // ouch proc->wait(); //kdDebug() << "finished " << suCommand << endl; if (((bufmv.find("Permission denied"))) != -1){ KMessageBox::information (this,i18n("

Don't have permission to move %1 to the quarantine folder.

").arg(fname)); }else if (((bufmv.find("No space"))) != -1){ KMessageBox::information (this,i18n("

Don't have enough space to move %1 to the quarantine folder.

").arg(fname)); }else{ if (recursive_box1->isChecked()) KMessageBox::queuedMessageBox(0, KMessageBox::Information, i18n("

Infected file found:

Filename: %1
Virus found: %2

I'm going to quarantine this file. You can restore it later if you want.

").arg(fname).arg(QString(virusname).replace("FOUND","")), //i18n( "Infected File Found!" ), //i18n( "Quarantine" ) 0); if (lastQuarItems.contains(object)) lastQuarItems.remove(object); lastQuarItems.prepend(object); CollectionDB::instance()->insertEvent("Quarantine",virusname,fname); } }else{ //kdDebug() << "rename worked" << endl; if (recursive_box1->isChecked()) KMessageBox::queuedMessageBox(0, KMessageBox::Information, i18n("

Infected file found:

Filename: %1
Virus found: %2

I'm going to quarantine this file. You can restore it later if you want.
If the file already exists in the quarantine directory it will be overwritten.

").arg(fname).arg(QString(virusname).replace("FOUND","")), //i18n( "Infected File Found!" ), //i18n( "Quarantine" ) 0); if (lastQuarItems.contains(object)) lastQuarItems.remove(object); lastQuarItems.prepend(object); CollectionDB::instance()->insertEvent("Quarantine",virusname,fname); } } config->writeEntry(QString("Items %1").arg(quarloc), lastQuarItems); //config->sync(); //kmain->kuarantine->refresh(); //kdDebug() << "finished klamd quar" << endl; } void Klamd::receivedmvOutput(KProcIO *) { //kdDebug() << "in receivedmvoutput" << endl; mvbuffer = ""; proc->readln(mvbuffer); bufmv += QString(mvbuffer); } int Klamd::runDazuko(bool caller){ dazukoLoaded = FALSE; QString lsmodCommand="lsmod"; lsmodproc = new KProcIO(); QString curpath = (QString) getenv("PATH"); lsmodproc->setEnvironment("PATH",curpath + ":/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin"); lsmodproc->setUseShell(TRUE); *lsmodproc<start(KProcIO::NotifyOnExit,TRUE); if (!(succ)) KMessageBox::information (this,i18n( "There was a problem detecting the loaded status of dazuko.") ); return 1; } void Klamd::lsmodOutput() { if (!(dazukoLoaded)){ int result; result = KMessageBox::warningContinueCancel(this, i18n( "I need to load a module called 'dazuko' first. This module will allow KlamAV to gain real-time access to files. If you don't want this message to appear in future, put the following command in your initialization scripts: 'modprobe dazuko.o'. You will next be asked for the root password."), i18n( "Load Module" ), i18n( "Load Module" ), i18n( "Delete2" )); switch (result) { case 2 : KMessageBox::information (this,i18n( "Loading of Module Cancelled.") ); break; case 5 : loadDazuko(); break; } }else{ loadKlamd(); } } void Klamd::loadKlamd() { writeConf(); klamdAlive = TRUE; //QString suCommand=QString("kdesu -t -c '" +clamdcommand+" -c '%1'").arg(tempFileName)+"'"; QString suCommand=QString(clamdcommand+" -c '%1'").arg(tempFileName); childproc = new KProcIO(); childproc->setUseShell(TRUE); childproc->setUsePty (KProcIO::Stdout,TRUE); QString curpath = (QString) getenv("PATH"); childproc->setEnvironment("PATH",curpath + ":/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin"); kdDebug() << suCommand << endl; *childproc<start(KProcIO::NotifyOnExit); connect( childproc, SIGNAL(processExited(KProcess *)), SLOT(childExited()) ); search_button->setEnabled(false); cancel_button->setEnabled(true); /* if (kmain->freshklam->isFreshklamAlive()) kmain->_tray->setPixmap(KSystemTray::loadIcon("klamavdl")); else*/ kmain->_tray->setPixmap(KSystemTray::loadIcon("klamav")); kmain->EnableKlamd->setEnabled(FALSE); kmain->DisableKlamd->setEnabled(TRUE); //config = KGlobal::config(); config->setGroup("Klamd"); config->writeEntry("Enabled", "Yes"); config->sync(); disableInputs(); CollectionDB::instance()->insertEvent("Auto-Scan","Scanning Started",""); } void Klamd::loadDazuko() { // struct utsname info; // // if (uname(&info) == -1) // { // kdError(0) << "uname() failed: errno = " << errno << endl; // return; // } // // QString release = QString(info.release); // // //kdDebug() << release << endl; // QString insmodCommand="insmod /lib/modules/" + release + "/dazuko.o"; QString insmodCommand="modprobe dazuko"; //QString insmodCommand="insmod /opt/kde/bin/dazuko.o"; KProcIO *insmodproc = new KProcIO(); QString curpath = (QString) getenv("PATH"); insmodproc->setEnvironment("PATH",curpath + ":/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin"); insmodproc->setUseShell(TRUE); *insmodproc<<"kdesu -i klamav"<<"-c"<start(KProcIO::NotifyOnExit); } void Klamd::moduleLoaded() { runDazuko(false); } void Klamd::lsmodCheck() { if (!(dazukoLoaded)){ KMessageBox::information (this,i18n( "Dazuko was not loaded successfully. Please check your installation." )); }else{ int result; result = KMessageBox::warningContinueCancel(this, i18n( "Module has been loaded. Will now continue to start up real-time scanning."), i18n( "Continue" ), i18n( "Continue" ), i18n( "Delete2" )); switch (result) { case 2 : break; case 5 : loadKlamd();break; } } } void Klamd::checkForDazuko() { QString item = ""; int pos; pos = lsmodproc->readln(item,TRUE); //KMessageBox::information (this,item); if (pos != -1) { //KMessageBox::information (this,item); if ((pos = (item.find("dazuko"))) != -1){ //KMessageBox::information (this,"found dazuko"); dazukoLoaded = TRUE; lsmodproc->kill(); } lsmodproc->ackRead(); } } void Klamd::restoreKlamd(){ config = KGlobal::config(); config->setGroup("Klamd"); QString RunKlamd = config->readEntry("Enabled"); if (RunKlamd == "Yes"){ startKlamd(); } } void Klamd::handleChecks(){ //config = KGlobal::config(); config->setGroup("Klamd"); if (recursive_box->isChecked()) config->writeEntry("Quarantine","Yes"); else config->writeEntry("Quarantine","No"); if (recursive_box1->isChecked()) config->writeEntry("Warn","Yes"); else config->writeEntry("Warn","No"); if (recursive_box2->isChecked()) config->writeEntry("Run Docked","Yes"); else config->writeEntry("Run Docked","No"); config->sync(); } bool Klamd::isKlamdAlive(){ if (klamdAlive) return true; return false; } QString Klamd::getKlamdConfFile(){ return tempFileName; } void Klamd::slotAdvOptions(){ /* config = KGlobal::config(); config->setGroup("Klamd"); QString RunKlamd = config->readEntry("Enabled"); KlamdOptions *dialog = new KlamdOptions( this, "settings"); // connect( dialog, SIGNAL(settingsChanged()), SLOT(applySettings()) ); dialog->show(); dialog->raise(); dialog->setActiveWindow();*/ kmain->slotConfigKlamav( "Auto-Scan" ); } void Klamd::disableInputs(){ hlp->setEnabled(false); hlp2->setEnabled(false); hlp3->setEnabled(false); } void Klamd::enableInputs(){ hlp->setEnabled(true); hlp2->setEnabled(true); hlp3->setEnabled(true); } #include "klamd.moc"