/*************************************************************************** * 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 #include #include #include #include #include #include #include #include #include #include #include ManageCiscoCert::ManageCiscoCert(TQWidget *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,TQ_SIGNAL(clicked()),this,TQ_SLOT(importCertClicked())); connect (main->DeleteCertPushButton,TQ_SIGNAL(clicked()),this,TQ_SLOT(deleteCertClicked())); connect (main->CertListView,TQ_SIGNAL(contextMenuRequested ( TQListViewItem *, const TQPoint &, int )),this,TQ_SLOT(contextMenuRequested ( TQListViewItem *, const TQPoint &, int ))); checkList(); } ManageCiscoCert::~ManageCiscoCert() { } void ManageCiscoCert::deleteCertClicked() { if ( main->CertListView->childCount() > 0 && main->CertListView->currentItem()!= 0 ) { TQListViewItem *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: "+ TQString().setNum(result), GlobalConfig->debug ) ; if ( result == 3) // Yes { DeleteProcess = new TQProcess(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, TQ_SIGNAL ( readyReadStdout() ), this, TQ_SLOT ( readFromStdout_remove() ) ); connect ( DeleteProcess, TQ_SIGNAL ( readyReadStderr() ), this, TQ_SLOT ( readFromStderr_remove() ) ); connect ( DeleteProcess, TQ_SIGNAL ( processExited()) , this, TQ_SLOT(deleteProcessFinished())); TQStringList *env = new TQStringList(); *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 ); TQString 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( password+"\n"); while (DeleteProcess->isRunning()) { sleep(1); } checkList(); disconnect ( DeleteProcess, TQ_SIGNAL ( readyReadStdout() ), this, TQ_SLOT ( readFromStdout_remove() ) ); disconnect ( DeleteProcess, TQ_SIGNAL ( readyReadStderr() ), this, TQ_SLOT ( readFromStderr_remove() ) ); disconnect ( DeleteProcess, TQ_SIGNAL ( processExited()) , this, TQ_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 ) { TQListViewItem *item = main->CertListView->currentItem(); CertDataName=item->text(1); CertStartFound=false; ShowProcess = new TQProcess(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, TQ_SIGNAL ( readyReadStdout() ), this, TQ_SLOT ( readFromStdout_display() ) ); connect ( ShowProcess, TQ_SIGNAL ( readyReadStderr() ), this, TQ_SLOT ( readFromStderr_display() ) ); connect ( ShowProcess, TQ_SIGNAL ( processExited()) , this, TQ_SLOT(showProcessFinished())); TQStringList *env = new TQStringList(); *env << "LC_ALL=C" << "LANG=C" << "PATH=/bin:/usr/bin:/usr/sbin:/sbin"; GlobalConfig->appPointer->setOverrideCursor( TQCursor(TQt::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, TQ_SIGNAL ( readyReadStdout() ), this, TQ_SLOT ( readFromStdout_display() ) ); disconnect ( ShowProcess, TQ_SIGNAL ( readyReadStderr() ), this, TQ_SLOT ( readFromStderr_display() ) ); disconnect ( ShowProcess, TQ_SIGNAL ( processExited()) , this, TQ_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 (" ").local8Bit() << 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( TQCursor(TQt::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); TQStringList 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); TQStringList 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 ( TQStringList::Iterator it = CiscoCerts.begin(); it != CiscoCerts.end(); ++it ) { if (GlobalConfig->KvpncDebugLevel > 2) std::cout << "insert item (cisco certs): " << TQString(*it).local8Bit() << std::endl; main->CertListView->insertItem( new TQListViewItem(main->CertListView, TQString().setNum(current_user_idx),TQString(*it),i18n("User"))); current_user_idx++; } for ( TQStringList::Iterator it = CiscoCaCerts.begin(); it != CiscoCaCerts.end(); ++it ) { if (GlobalConfig->KvpncDebugLevel > 2) std::cout << "insert item (cisco certs): " << TQString(*it).local8Bit() << std::endl; main->CertListView->insertItem( new TQListViewItem(main->CertListView, TQString().setNum(current_ca_idx),TQString(*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() ) { TQString line = TQString ( DeleteProcess->readLineStdout() ); if ( GlobalConfig->KvpncDebugLevel > 2 ) GlobalConfig->appendLogEntry ( "[cisco_cert_mgr]: "+line,GlobalConfig->debug ); } } void ManageCiscoCert::readFromStderr_remove() { while ( DeleteProcess->canReadLineStderr() ) { TQString line = TQString ( DeleteProcess->readLineStderr() ); GlobalConfig->appendLogEntry ( "[cisco_cert_mgr err]: "+line ,GlobalConfig->error ); } checkList(); } void ManageCiscoCert::readFromStdout_display() { while ( ShowProcess->canReadLineStdout() ) { TQString line = TQString ( 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() ) { TQString line = TQString ( ShowProcess->readLineStderr() ); GlobalConfig->appendLogEntry ( "[cisco_cert_mgr err]: "+line ,GlobalConfig->error ); } } void ManageCiscoCert::contextMenuRequested ( TQListViewItem * item, const TQPoint &pos, int ) { ContextMenu = new TQPopupMenu ( 0 ); if (item != 0) { ContextMenu->insertItem(i18n("&Show...")); ContextMenu->insertSeparator(); ContextMenu->insertItem(i18n("&Delete...")); } ContextMenu->insertItem(i18n("&Add...")); connect ( ContextMenu, TQ_SIGNAL ( activated ( int ) ), this, TQ_SLOT ( doContextMenuAction ( int ) ) ); ContextMenu->show(); ContextMenu->setGeometry(pos.x(),pos.y(), ContextMenu->width(),ContextMenu->height()); } void ManageCiscoCert::doContextMenuAction ( int action) { TQString 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(); } #include "manageciscocert.moc"