You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
386 lines
14 KiB
386 lines
14 KiB
/***************************************************************************
|
|
* 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 <tqgroupbox.h>
|
|
#include <tqstringlist.h>
|
|
#include <tqpopupmenu.h>
|
|
#include <tqcursor.h>
|
|
|
|
#include <kpushbutton.h>
|
|
#include <tdelistview.h>
|
|
#include <tdelocale.h>
|
|
#include <tdemessagebox.h>
|
|
#include <kcombobox.h>
|
|
#include <kurlrequester.h>
|
|
#include <kpassdlg.h>
|
|
|
|
|
|
#include <iostream>
|
|
|
|
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,TQT_SIGNAL(clicked()),this,TQT_SLOT(importCertClicked()));
|
|
connect (main->DeleteCertPushButton,TQT_SIGNAL(clicked()),this,TQT_SLOT(deleteCertClicked()));
|
|
connect (main->CertListView,TQT_SIGNAL(contextMenuRequested ( TQListViewItem *, const TQPoint &, int )),this,TQT_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, TQT_SIGNAL ( readyReadStdout() ), this, TQT_SLOT ( readFromStdout_remove() ) );
|
|
connect ( DeleteProcess, TQT_SIGNAL ( readyReadStderr() ), this, TQT_SLOT ( readFromStderr_remove() ) );
|
|
connect ( DeleteProcess, TQT_SIGNAL ( processExited()) , this, TQT_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, TQT_SIGNAL ( readyReadStdout() ), this, TQT_SLOT ( readFromStdout_remove() ) );
|
|
disconnect ( DeleteProcess, TQT_SIGNAL ( readyReadStderr() ), this, TQT_SLOT ( readFromStderr_remove() ) );
|
|
disconnect ( DeleteProcess, TQT_SIGNAL ( processExited()) , this, TQT_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, TQT_SIGNAL ( readyReadStdout() ), this, TQT_SLOT ( readFromStdout_display() ) );
|
|
connect ( ShowProcess, TQT_SIGNAL ( readyReadStderr() ), this, TQT_SLOT ( readFromStderr_display() ) );
|
|
connect ( ShowProcess, TQT_SIGNAL ( processExited()) , this, TQT_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, TQT_SIGNAL ( readyReadStdout() ), this, TQT_SLOT ( readFromStdout_display() ) );
|
|
disconnect ( ShowProcess, TQT_SIGNAL ( readyReadStderr() ), this, TQT_SLOT ( readFromStderr_display() ) );
|
|
disconnect ( ShowProcess, TQT_SIGNAL ( processExited()) , this, TQT_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, TQT_SIGNAL ( activated ( int ) ), this, TQT_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"
|