diff options
Diffstat (limited to 'src/manageciscocert.cpp')
-rw-r--r-- | src/manageciscocert.cpp | 384 |
1 files changed, 384 insertions, 0 deletions
diff --git a/src/manageciscocert.cpp b/src/manageciscocert.cpp new file mode 100644 index 0000000..611d185 --- /dev/null +++ b/src/manageciscocert.cpp @@ -0,0 +1,384 @@ +/*************************************************************************** + * Copyright (C) 2004 by Christoph Thielecke * + * crissi99@gmx.de * + * * + * 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., * + * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + ***************************************************************************/ +#include "manageciscocert.h" +#include "utils.h" +#include "importcertificatedialog.h" +#include "displaycertdialog.h" + +#include <qgroupbox.h> +#include <qstringlist.h> +#include <qpopupmenu.h> +#include <qcursor.h> + +#include <kpushbutton.h> +#include <klistview.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kcombobox.h> +#include <kurlrequester.h> +#include <kpassdlg.h> + + +#include <iostream> + +ManageCiscoCert::ManageCiscoCert(QWidget *parent, const char* caption, KVpncConfig *GlobalConfig) : KDialogBase (parent, i18n ( "Manage Cisco certificates..." ).ascii(), true, caption, KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true) +{ + main = new ManageCiscoCertBase ( this ); + setMainWidget ( main ); + main->sizeHint(); +// main->show(); +// main->setMinimumSize ( main->sizeHint() ); + sizeHint(); + + this->GlobalConfig = GlobalConfig; + connect (main->ImportCertFilePushButton,SIGNAL(clicked()),this,SLOT(importCertClicked())); + connect (main->DeleteCertPushButton,SIGNAL(clicked()),this,SLOT(deleteCertClicked())); + connect (main->CertListView,SIGNAL(contextMenuRequested ( QListViewItem *, const QPoint &, int )),this,SLOT(contextMenuRequested ( QListViewItem *, const QPoint &, int ))); + checkList(); +} + + +ManageCiscoCert::~ManageCiscoCert() +{ +} + +void ManageCiscoCert::deleteCertClicked() +{ + if ( main->CertListView->childCount() > 0 && main->CertListView->currentItem()!= 0 ) + { + QListViewItem *item = main->CertListView->currentItem(); + + int result = KMessageBox::questionYesNo ( this, i18n( "Do you really want to delete the cert \"%1\" (type: %2) from cert store?" ).arg(item->text(1).arg(item->text(2))), i18n( "Delete certificate?" ) ); + +// if ( GlobalConfig->KvpncDebugLevel > 2 ) +// GlobalConfig->appendLogEntry( "Result: "+ QString().setNum(result), GlobalConfig->debug ) ; + if ( result == 3) // Yes + { + + + DeleteProcess = new QProcess(0); + DeleteProcess->addArgument ( GlobalConfig->pathToCiscoCertMgr ); + + if (item->text(2) == i18n("User")) + DeleteProcess->addArgument ( "-U" ); + if (item->text(2) == i18n("CA")) + DeleteProcess->addArgument ( "-R" ); + DeleteProcess->addArgument ( "-op" ); + DeleteProcess->addArgument ( "delete" ); + DeleteProcess->addArgument ( "-ct" ); + DeleteProcess->addArgument ( item->text(0) ); + + connect ( DeleteProcess, SIGNAL ( readyReadStdout() ), this, SLOT ( readFromStdout_remove() ) ); + connect ( DeleteProcess, SIGNAL ( readyReadStderr() ), this, SLOT ( readFromStderr_remove() ) ); + connect ( DeleteProcess, SIGNAL ( processExited()) , this, SLOT(deleteProcessFinished())); + + QStringList *env = new QStringList(); + *env << "LC_ALL=C" << "LANG=C" << "PATH=/bin:/usr/bin:/usr/sbin:/sbin"; + + if ( !DeleteProcess->start ( env ) ) + { + + KMessageBox::sorry ( this, i18n ( "Unable to start process (%1)!" ).arg ( "cisco_cert_mgr" ) ); +// GlobalConfig->appPointer->restoreOverrideCursor(); + } + else + { + if ( GlobalConfig->KvpncDebugLevel > 2 ) + GlobalConfig->appendLogEntry ( i18n ( "Process (%1) started." ).arg ("cisco_cert_mgr" ),GlobalConfig->debug ); + + QCString password; + int result = KPasswordDialog::getPassword(password, i18n("Certificate password")); + + if (result == KPasswordDialog::Accepted) + { + + if ( GlobalConfig->KvpncDebugLevel > 2 ) + GlobalConfig->appendLogEntry ( i18n ( "Certicate password got from user, send it..." ),GlobalConfig->debug ); + + DeleteProcess->writeToStdin( QString(password)+"\n"); + while (DeleteProcess->isRunning()) + { + sleep(1); + } + + checkList(); + disconnect ( DeleteProcess, SIGNAL ( readyReadStdout() ), this, SLOT ( readFromStdout_remove() ) ); + disconnect ( DeleteProcess, SIGNAL ( readyReadStderr() ), this, SLOT ( readFromStderr_remove() ) ); + disconnect ( DeleteProcess, SIGNAL ( processExited()) , this, SLOT(deleteProcessFinished())); + delete DeleteProcess; + DeleteProcess=0L; + } + else + { + + // nothing + } + + } + } + + } +} + +void ManageCiscoCert::importCertClicked() +{ + ImportCertificateDialog dlg ( this, i18n ( "Import Certificate..." ).ascii(), GlobalConfig ); + dlg.main->ImporttypeComboBox->setCurrentItem ( ImportCertificateDialog::cisco ); + dlg.typeToggeled ( VpnAccountData::ciscoorig); + dlg.main->ImporttypeComboBox->setEnabled ( false ); + dlg.main->P12GroupBox->setTitle ( i18n ( "Import" ) ); + dlg.main->CertPathTextLabel->hide(); + dlg.main->RacoonCertificatePathUrlrequester->hide(); + dlg.main->PrivateKeyPassGroupBox->setTitle ( i18n ( "Certificate protection" ) ); + dlg.main->PrivateKeyPassTextLabel->setText(i18n ("Certificate password:")); + dlg.main->PrivateKeyPassAgainTextLabel->setText(i18n ("Certificate password again:")); + dlg.main->FilenameUrlrequester->setFilter ( "*" ); + //int result = + dlg.exec(); + + checkList(); +} + +void ManageCiscoCert::showCertClicked() +{ + if ( main->CertListView->childCount() > 0 && main->CertListView->currentItem()!= 0 ) + { + QListViewItem *item = main->CertListView->currentItem(); + CertDataName=item->text(1); + CertStartFound=false; + + ShowProcess = new QProcess(0); + ShowProcess->addArgument ( GlobalConfig->pathToCiscoCertMgr ); + + if (item->text(2) == i18n("User")) + { + ShowProcess->addArgument ( "-U" ); + CertType=i18n("User certificate"); + } + if (item->text(2) == i18n("CA")) + { + ShowProcess->addArgument ( "-R" ); + CertType=i18n("CA certificate"); + } + ShowProcess->addArgument ( "-op" ); + ShowProcess->addArgument ( "view" ); + ShowProcess->addArgument ( "-ct" ); + ShowProcess->addArgument ( item->text(0) ); + + connect ( ShowProcess, SIGNAL ( readyReadStdout() ), this, SLOT ( readFromStdout_display() ) ); + connect ( ShowProcess, SIGNAL ( readyReadStderr() ), this, SLOT ( readFromStderr_display() ) ); + connect ( ShowProcess, SIGNAL ( processExited()) , this, SLOT(showProcessFinished())); + + QStringList *env = new QStringList(); + *env << "LC_ALL=C" << "LANG=C" << "PATH=/bin:/usr/bin:/usr/sbin:/sbin"; + + GlobalConfig->appPointer->setOverrideCursor( QCursor(Qt::WaitCursor) ); + if (GlobalConfig->KvpncDebugLevel > 2) + GlobalConfig->appendLogEntry(i18n("Getting cert info from Cisco certificate store..."), GlobalConfig->debug); + if ( !ShowProcess->start ( env ) ) + { + KMessageBox::sorry ( this, i18n ( "Unable to start process (%1)!" ).arg ( "cisco_cert_mgr" ) ); + } + else + { + if ( GlobalConfig->KvpncDebugLevel > 2 ) + GlobalConfig->appendLogEntry ( i18n ( "Process (%1) started." ).arg ("cisco_cert_mgr" ),GlobalConfig->debug ); + while (ShowProcess->isRunning()) + { + usleep(200); + GlobalConfig->appPointer->processEvents(); + } + } + disconnect ( ShowProcess, SIGNAL ( readyReadStdout() ), this, SLOT ( readFromStdout_display() ) ); + disconnect ( ShowProcess, SIGNAL ( readyReadStderr() ), this, SLOT ( readFromStderr_display() ) ); + disconnect ( ShowProcess, SIGNAL ( processExited()) , this, SLOT(showProcessFinished())); + + } +} + +void ManageCiscoCert::deleteProcessFinished() +{ +// delete DeleteProcess; + checkList(); +} + +void ManageCiscoCert::showProcessFinished() +{ + GlobalConfig->appPointer->restoreOverrideCursor(); + if (GlobalConfig->KvpncDebugLevel > 2) + GlobalConfig->appendLogEntry(i18n("Done."), GlobalConfig->debug); + + GlobalConfig->slotStatusMsg(i18n("Done."), ID_FLASH_MSG); + GlobalConfig->slotStatusMsg(i18n("Ready."), ID_STATUS_MSG); + + delete ShowProcess; + ShowProcess=0L; + std::cout << "certdatalist" << CertDataList.join (" ") << std::endl; + DisplayCertDialog dlg(0,i18n("Certificate data"),GlobalConfig); + dlg.main->CertNameTextLabel->setText(CertDataName); + dlg.main->CertTypeTextLabel->setText(CertType); + dlg.CertDataList = CertDataList; + dlg.parseCertData(); + dlg.exec(); + CertDataName=""; + CertDataList.clear(); + +} + +void ManageCiscoCert::checkList() +{ + main->CertListView->clear(); + + GlobalConfig->appPointer->setOverrideCursor( QCursor(Qt::WaitCursor) ); + + GlobalConfig->slotStatusMsg(i18n("Collecting cisco certs from Cisco certificate store..."), ID_STATUS_MSG); + if (GlobalConfig->KvpncDebugLevel > 2) + GlobalConfig->appendLogEntry(i18n("Looking for certs in Cisco certificate store..."), GlobalConfig->debug); + + QStringList CiscoCerts = Utils(GlobalConfig).getCertsFromCiscoCertStore("user"); + if (GlobalConfig->KvpncDebugLevel > 2) + GlobalConfig->appendLogEntry(i18n("Done."), GlobalConfig->debug); + + GlobalConfig->slotStatusMsg(i18n("Collecting cisco CA certs from Cisco certificate store..."), ID_STATUS_MSG); + if (GlobalConfig->KvpncDebugLevel > 2) + GlobalConfig->appendLogEntry(i18n("Looking for CA certs in Cisco certificate store..."), GlobalConfig->debug); + QStringList CiscoCaCerts = Utils(GlobalConfig).getCertsFromCiscoCertStore("ca"); + if (GlobalConfig->KvpncDebugLevel > 2) + GlobalConfig->appendLogEntry(i18n("Done."), GlobalConfig->debug); + + GlobalConfig->slotStatusMsg(i18n("Done."), ID_FLASH_MSG); + GlobalConfig->slotStatusMsg(i18n("Ready."), ID_STATUS_MSG); + + main->CertListView->takeItem(main->CertListView->currentItem()); + int current_user_idx=0; + int current_ca_idx=0; + for ( QStringList::Iterator it = CiscoCerts.begin(); it != CiscoCerts.end(); ++it ) + { + if (GlobalConfig->KvpncDebugLevel > 2) + std::cout << "insert item (cisco certs): " << QString(*it) << std::endl; + main->CertListView->insertItem( new QListViewItem(main->CertListView, QString().setNum(current_user_idx),QString(*it),i18n("User"))); + current_user_idx++; + } + for ( QStringList::Iterator it = CiscoCaCerts.begin(); it != CiscoCaCerts.end(); ++it ) + { + if (GlobalConfig->KvpncDebugLevel > 2) + std::cout << "insert item (cisco certs): " << QString(*it) << std::endl; + main->CertListView->insertItem( new QListViewItem(main->CertListView, QString().setNum(current_ca_idx),QString(*it),i18n("CA"))); + current_ca_idx++; + } + + + if (main->CertListView->childCount() > 0 && main->CertListView->currentItem()!= 0 ) + { + main->DeleteCertPushButton->setEnabled(true); + } + else + { + main->DeleteCertPushButton->setEnabled(false); + } + GlobalConfig->appPointer->restoreOverrideCursor(); +} + +void ManageCiscoCert::readFromStdout_remove() +{ + while ( DeleteProcess->canReadLineStdout() ) + { + QString line = QString ( DeleteProcess->readLineStdout() ); + + if ( GlobalConfig->KvpncDebugLevel > 2 ) + GlobalConfig->appendLogEntry ( "[cisco_cert_mgr]: "+line,GlobalConfig->debug ); + } +} + +void ManageCiscoCert::readFromStderr_remove() +{ + while ( DeleteProcess->canReadLineStderr() ) + { + QString line = QString ( DeleteProcess->readLineStderr() ); + GlobalConfig->appendLogEntry ( "[cisco_cert_mgr err]: "+line ,GlobalConfig->error ); + } + checkList(); + +} + +void ManageCiscoCert::readFromStdout_display() +{ + while ( ShowProcess->canReadLineStdout() ) + { + QString line = QString ( ShowProcess->readLineStdout() ); + + if ( GlobalConfig->KvpncDebugLevel > 2 ) + GlobalConfig->appendLogEntry ( "[cisco_cert_mgr]: "+line,GlobalConfig->debug ); + + if (CertStartFound) + CertDataList.append(line); + else + { + if ( line.find ( "Common Name:" , 0, FALSE ) > -1) + { + + if ( GlobalConfig->KvpncDebugLevel > 2 ) + GlobalConfig->appendLogEntry ( i18n("Cert start found."),GlobalConfig->debug ); + + + CertStartFound=true; + CertDataList.append(line); + } + } + } +} + +void ManageCiscoCert::readFromStderr_display() +{ + while ( ShowProcess->canReadLineStderr() ) + { + QString line = QString ( ShowProcess->readLineStderr() ); + GlobalConfig->appendLogEntry ( "[cisco_cert_mgr err]: "+line ,GlobalConfig->error ); + } + +} + +void ManageCiscoCert::contextMenuRequested ( QListViewItem * item, const QPoint &pos, int ) +{ + ContextMenu = new QPopupMenu ( 0 ); + if (item != 0) + { + ContextMenu->insertItem(i18n("&Show...")); + ContextMenu->insertSeparator(); + ContextMenu->insertItem(i18n("&Delete...")); + } + ContextMenu->insertItem(i18n("&Add...")); + connect ( ContextMenu, SIGNAL ( activated ( int ) ), this, SLOT ( doContextMenuAction ( int ) ) ); + ContextMenu->show(); + ContextMenu->setGeometry(pos.x(),pos.y(), ContextMenu->width(),ContextMenu->height()); +} + +void ManageCiscoCert::doContextMenuAction ( int action) +{ + QString itemtext = ContextMenu->text ( action ); +// std::cout << "action: " << itemtext << std::endl; + if (itemtext == i18n("&Delete...")) + deleteCertClicked(); + if (itemtext == i18n("&Add...")) + importCertClicked(); + if (itemtext == i18n("&Show...")) + showCertClicked(); +} + |