diff options
Diffstat (limited to 'src/klamd.cpp')
-rw-r--r-- | src/klamd.cpp | 960 |
1 files changed, 960 insertions, 0 deletions
diff --git a/src/klamd.cpp b/src/klamd.cpp new file mode 100644 index 0000000..55a934d --- /dev/null +++ b/src/klamd.cpp @@ -0,0 +1,960 @@ +/* + * Copyright (C) 2004 Robert Hogan <robert at roberthogan dot net> + */ + +#include "klamd.h" +#include "klamav.h" +#include "freshklam.h" +#include "klamavconfig.h" +#include "collectiondb.h" + + + +#include <klocale.h> +#include <kiconloader.h> +#include <kio/netaccess.h> +#include <karrowbutton.h> + + +#include <kaction.h> + +#include <qcheckbox.h> +#include <kbuttonbox.h> +#include <kprocio.h> +#include <kurlrequester.h> +#include <qlayout.h> +#include <kmessagebox.h> +#include <ktempfile.h> +#include <ksystemtray.h> +#include <qtoolbutton.h> +#include <knotifyclient.h> + + +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*>(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 " <<quarloc << "\n"; + + for ( QListBoxItem *bi = sessionslb2->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<<suCommand; + + + connect( proc, SIGNAL(readReady(KProcIO *)), + SLOT(receivedmvOutput(KProcIO *)) ); + + proc->start(KProcIO::NotifyOnExit,TRUE); + // ouch + proc->wait(); + //kdDebug() << "finished " << suCommand << endl; + if (((bufmv.find("Permission denied"))) != -1){ + KMessageBox::information (this,i18n("<p>Don't have permission to move <b>%1</b> to the quarantine folder.</p>").arg(fname)); + }else if (((bufmv.find("No space"))) != -1){ + KMessageBox::information (this,i18n("<p>Don't have enough space to move <b>%1</b> to the quarantine folder.</p>").arg(fname)); + + }else{ + if (recursive_box1->isChecked()) + KMessageBox::queuedMessageBox(0, KMessageBox::Information, i18n("<p>Infected file found: <br><br>Filename: <b>%1</b> <br>Virus found: <b>%2</b> <br><br>I'm going to quarantine this file. You can restore it later if you want.<br></p>").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("<p>Infected file found: <br><br>Filename: <b>%1</b> <br>Virus found: <b>%2</b> <br><br>I'm going to quarantine this file. You can restore it later if you want.<br> If the file already exists in the quarantine directory it will be overwritten.</p>").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<<lsmodCommand; + + connect( lsmodproc, SIGNAL(readReady(KProcIO *)), + SLOT(checkForDazuko()) ); + if (caller){ + connect( lsmodproc, SIGNAL(processExited(KProcess *)), + SLOT(lsmodOutput()) ); + }else{ + connect( lsmodproc, SIGNAL(processExited(KProcess *)), + SLOT(lsmodCheck()) ); + } + + + bool succ = 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<<suCommand; + + connect( childproc, SIGNAL(readReady(KProcIO *)), + SLOT(receivedOutput(KProcIO *)) ); + 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"<<insmodCommand; + + connect( insmodproc, SIGNAL(processExited(KProcess *)), + SLOT(moduleLoaded()) ); + + insmodproc->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" |