/***************************************************************************
*   Copyright (C) 2004 by Christoph Thielecke                             *
*   crissi99@gmx.de                                                       *
*                                                                         *
*   @description This class imports a certificate                             *
*                                                                         *
*   @author 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.             *
***************************************************************************/
//BEGIN includes
#include "importcertificatedialog.h"
#include <tdemessagebox.h>
#include <tdelocale.h>
#include <kurlrequester.h>
#include <kpassdlg.h>
#include <kcombobox.h>
#include <kdebug.h>
#include <klineedit.h>
#include <iostream>
#include <tqfile.h>
#include <tqdir.h>
#include <tqtextstream.h>
#include <tqcursor.h>
#include <tqcheckbox.h>
#include <tqurl.h>
#include <iostream>
#include "kvpncconfig.h"
#include "utils.h"
//END includes

ImportCertificateDialog::ImportCertificateDialog ( TQWidget *parent, const char* caption, KVpncConfig *GlobalConfig )
		: KDialogBase ( parent, i18n ( "Import Certificate" ).ascii(), true, caption,
		                KDialogBase::Ok|KDialogBase::Cancel, KDialogBase::Ok, true )
{
	main = new ImportCertificateDialogBase ( this );
	setMainWidget ( main );
	main->setMinimumSize ( main->sizeHint() );

	this->GlobalConfig = GlobalConfig;
	filename = "";
	certHash = "";
	CertFullPath="";
	CaCertFullPath="";
	importOk = false;
	importSuccess = true;
	doHash = false;
	doExit=true;
	error_found=false;
	certName = "";
	certpath = "/etc/racoon/certs/";
	pathToOpenSSL = GlobalConfig->pathToOpenssl;
	main->RacoonCertificatePathUrlrequester->setMode ( 2 ); // directory
	main->FilenameUrlrequester->setFilter ( "*" );
	askpasscount=0;

	env = new TQStringList();
	*env << "LC_ALL=C" << "LANG=C" << "PATH=/bin:/usr/bin:/usr/sbin:/sbin";

	connect ( main->ImporttypeComboBox, TQ_SIGNAL ( activated ( int ) ), this, TQ_SLOT ( typeToggeled ( int ) ) );
	typeToggeled ( main->ImporttypeComboBox->currentItem() );

	connect (main->UsePrivateKeyPasswordCheckBox, TQ_SIGNAL( toggled(bool)), this, TQ_SLOT(usePrivateKeyPassToggled(bool)));
	usePrivateKeyPassToggled(main->UsePrivateKeyPasswordCheckBox->isChecked());

	// TMP
	/*
		main->FilenameUrlrequester->setURL( "/home/crissi/thielecke.p12" );
		//main->RacoonCertificatePathUrlrequester->setURL( "/etc/racoon/certs/" );
	main->ImporttypeComboBox->setCurrentItem( 1 );
		main->PrivateKeyPasswordEdit->setText( "12345678" );
		main->PrivateKeyAgainPasswordEdit->setText( "12345678" );
	*/
	//main->ImportPasswordEdit->setText( "blah99" );


}

ImportCertificateDialog::~ImportCertificateDialog()
{
	delete main;
}

void ImportCertificateDialog::accept()
{

	importOk = true;
	done=false;
	error_found=false;

	filename = main->FilenameUrlrequester->url();
	importpassword = main->ImportPasswordEdit->text();
	certpath = main->RacoonCertificatePathUrlrequester->url();

	if ( filename.isEmpty() )
	{
		KMessageBox::sorry ( 0, i18n ( "File name cannot be empty!" ), i18n ( "Empty File Name" ) );
		importOk = false;
		importSuccess=false;
		GlobalConfig->appPointer->restoreOverrideCursor();
		return;
	}

	// 	if ( filename.right( 3 ) != "p12" || filename.right (3) != "der" || filename.right (3) != "crt" ) {
	// 		KMessageBox::sorry( 0, i18n( "File name isnt ended by \'p12\', 'der' or \'crt\'!" ), i18n( "Wrong File Name" ) );
	// 		importOk = false;
	// 		return;
	// 	}

	GlobalConfig->appPointer->setOverrideCursor ( TQCursor ( TQt::WaitCursor ) );

	TQFile f ( filename );
	if ( f.exists() )
	{
		if ( f.open ( IO_ReadOnly ) )
		{
			f.close();
		}
		else
		{
			KMessageBox::sorry ( 0, i18n ( "File does not exist!" ), i18n ( "No File" ) );
			GlobalConfig->appendLogEntry ( i18n ( "Certificate import: file \"%1\" does not exist." ).arg ( filename ),GlobalConfig->error );

			importOk = false;
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}
	}
	else
	{
		KMessageBox::sorry ( 0, i18n ( "File not readable!" ), i18n ( "Insufficient Rights" ) );

		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: file \"%1\" is not readable." ).arg ( filename ),GlobalConfig->error );
		importOk = false;
		GlobalConfig->appPointer->restoreOverrideCursor();
		return;
	}

	if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
	{
		certpath="/etc/ipsec.d";
		if ( !TQDir ( certpath ).exists() )
		{
			if ( !TQDir().mkdir ( certpath ) )
			{
				KMessageBox::error ( this, i18n ( "\"%1\" could not be created!" ).arg ( "/etc/ipsec.d" ) );
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import: directory \"%1\" does not exist and could not be created." ).arg ( "/etc/ipsec.d" ),GlobalConfig->error );
			}
			else
			{
				if ( GlobalConfig->KvpncDebugLevel > 0 )
					GlobalConfig->appendLogEntry ( i18n ( "Certificate import: directory \"%1\" does not exist but was successful created." ).arg ( "/etc/ipsec.d" ),GlobalConfig->debug );
				if ( !TQDir ( "/etc/ipsec.d/certs" ).exists() )
				{
					if ( !TQDir().mkdir ( "/etc/ipsec.d/certs" ) )
					{
						KMessageBox::error ( this, i18n ( "\"%1\" could not be created!" ).arg ( "/etc/ipsec.d/certs" ) );
						GlobalConfig->appendLogEntry ( i18n ( "Certificate import: directory \"%1\" does not exist and could not be created." ).arg ( "/etc/ipsec.d/certs" ),GlobalConfig->error );
						GlobalConfig->appPointer->restoreOverrideCursor();
						return;
					}
					else
					{
						GlobalConfig->appendLogEntry ( i18n ( "Certificate import: directory \"%1\" does not exist but was successful created." ).arg ( "/etc/ipsec.d/certs" ),GlobalConfig->debug );
						if ( !TQDir ( "/etc/ipsec.d/cacerts" ).exists() )
							if ( !TQDir().mkdir ( "/etc/ipsec.d/cacerts" ) )
							{
								KMessageBox::error ( this, i18n ( "\"%1\" could not be created!" ).arg ( "/etc/ipsec.d/cacerts" ) );
								GlobalConfig->appendLogEntry ( i18n ( "Certificate import: directory \"%1\" does not exist and could not  be created." ).arg ( "/etc/ipsec.d/cacerts" ),GlobalConfig->error );
								GlobalConfig->appPointer->restoreOverrideCursor();
								return;
							}
							else
							{
								if ( GlobalConfig->KvpncDebugLevel > 0 )
									GlobalConfig->appendLogEntry ( i18n ( "Certificate import: directory \"%1\" does not exist but was successful created." ).arg ( "/etc/ipsec.d/cacerts" ),GlobalConfig->debug );
							}
					}
				}
			}
		}
	}
	else if ( main->ImporttypeComboBox->currentItem() == pkcs12_racoon || main->ImporttypeComboBox->currentItem() == ca_der )
	{
		certpath="/etc/racoon/certs";
		if ( !TQDir ( certpath ).exists() )
			if ( !TQDir().mkdir ( certpath ) )
			{
				KMessageBox::error ( this, i18n ( "\"%1\" could not be created!" ).arg ( certpath ) );
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import: directory \"%1\" does not exist." ).arg ( certpath ),GlobalConfig->error );
				GlobalConfig->appPointer->restoreOverrideCursor();
				return;
			}
			else
			{
				if ( GlobalConfig->KvpncDebugLevel > 3 )
					GlobalConfig->appendLogEntry ( i18n ( "Certificate import: directory \"%1\" does not exist but was successful created." ).arg ( certpath ),GlobalConfig->debug );
			}
	}
	else if ( main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
	{
		certpath = main->RacoonCertificatePathUrlrequester->url();
		if ( !TQDir ( certpath ).exists() )
			if ( !TQDir().mkdir ( certpath ) )
			{
				KMessageBox::error ( this, i18n ( "\"%1\" could not be created!" ).arg ( certpath ) );
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import: directory \"%1\" does not exist." ).arg ( certpath ),GlobalConfig->error );
				GlobalConfig->appPointer->restoreOverrideCursor();
				return;
			}
			else
			{
				if ( GlobalConfig->KvpncDebugLevel > 3 )
					GlobalConfig->appendLogEntry ( i18n ( "Certificate import: directory \"%1\" does not exist but was successful created." ).arg ( certpath ),GlobalConfig->debug );
			}
	}

// 	if ( (main->ImporttypeComboBox->currentItem() == pkcs12_freeswan ||
// 	        main->ImporttypeComboBox->currentItem() == pkcs12_racoon ||
// 					main->ImporttypeComboBox->currentItem() == pkcs12_racoon
// 			) &&
// 	        importpassword.isEmpty() )
// 	{
// 		importOk = false;
// 		KMessageBox::sorry( 0, i18n( "Password can't be empty!" ), i18n( "Empty Password" ) );
// 		return;
// 	}

	if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan || main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
	{
		
		if ( main->UsePrivateKeyPasswordCheckBox->isChecked() && (main->PrivateKeyPasswordEdit->text().isEmpty() || main->PrivateKeyPasswordEdit->text().length() < 4) )
		{
			importOk = false;
			KMessageBox::sorry ( 0, i18n ( "Private key password field can not be empty or less than 4 characters!" ), i18n ( "Password Empty or Too Short" ) );
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}

		if ( main->UsePrivateKeyPasswordCheckBox->isChecked() && (main->PrivateKeyAgainPasswordEdit->text().isEmpty() || main->PrivateKeyAgainPasswordEdit->text().length() < 4 ))
		{
			importOk = false;
			KMessageBox::sorry ( 0, i18n ( "Private key password (again) field can not be empty!" ), i18n ( "Password Empty or Too Short" ) );
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}
		if ( importOk )
		{
			if ( main->PrivateKeyPasswordEdit->password() != main->PrivateKeyAgainPasswordEdit->password() )
			{
				importOk = false;
				KMessageBox::sorry ( 0, i18n ( "Private key passwords does not match!" ), i18n ( "Passwords Do Not Match" ) );
				GlobalConfig->appPointer->restoreOverrideCursor();
				return;
			}
			else
			{
				privatekeypassword = main->PrivateKeyAgainPasswordEdit->password();
			}
		}
	}
	if ( main->ImporttypeComboBox->currentItem() == cisco || main->ImporttypeComboBox->currentItem() == ciscoca || main->ImporttypeComboBox->currentItem() == ciscouserca )
	{
		if (main->UsePrivateKeyPasswordCheckBox->isChecked() && ( main->PrivateKeyPasswordEdit->text().isEmpty() || main->PrivateKeyPasswordEdit->text().length() < 4 ))
		{
			importOk = false;
			KMessageBox::sorry ( 0, i18n ( "Certificate password field can not be empty or less than 4 characters!" ), i18n ( "Password Empty or Too Short" ) );
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}

		if (main->UsePrivateKeyPasswordCheckBox->isChecked() && ( main->PrivateKeyAgainPasswordEdit->text().isEmpty() || main->PrivateKeyAgainPasswordEdit->text().length() < 4 ))
		{
			importOk = false;
			KMessageBox::sorry ( 0, i18n ( "Certificate password (again) field can not be empty!" ), i18n ( "Password Empty or Too Short" ) );
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}
		if ( importOk )
		{
			if ( main->UsePrivateKeyPasswordCheckBox->isChecked() && (main->PrivateKeyPasswordEdit->password() != main->PrivateKeyAgainPasswordEdit->password() ))
			{
				importOk = false;
				KMessageBox::sorry ( 0, i18n ( "Certificate passwords does not match!" ), i18n ( "Passwords Do Not Match" ) );
				GlobalConfig->appPointer->restoreOverrideCursor();
				return;
			}
			else
			{
				if (main->UsePrivateKeyPasswordCheckBox->isChecked() )
					privatekeypassword = main->PrivateKeyAgainPasswordEdit->password();
			}
		}
	}
	if ( GlobalConfig->KvpncDebugLevel > 3 )
		kdDebug() << "file: " << filename << ", type: " << main->ImporttypeComboBox->currentItem() << endl;

	bool found=true;
	if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan || main->ImporttypeComboBox->currentItem() == pkcs12_openvpn || main->ImporttypeComboBox->currentItem() == pkcs12_racoon || main->ImporttypeComboBox->currentItem() == ca_der )
	{
		// looking for openssl

		TQString bin="openssl";
		ToolInfo *tool = Utils ( GlobalConfig ).getToolInfo ( "openssl" );
		//std::cout << "Tool (bin): " << bin << std::endl;

		if ( tool->PathToExec.section ( '/',-1 ) != bin )
		{
			// program is NOT installed
			KMessageBox::error ( this, i18n ( "The required tool (%1) is not installed, please install it first and restart kvpnc." ).arg ( bin ), i18n ( "Tool missing" ) );
			found=false;
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}

		if ( !found )
		{
			KMessageBox::error ( this, i18n ( "Unable to find \"%1\"!" ).arg ( "openssl" ) );
			GlobalConfig->appendLogEntry ( i18n ( "Unable to find \"%1\"!" ).arg ( "openssl" ) ,GlobalConfig->error );
			importOk = false;
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}


		TQString file = Utils ( this->GlobalConfig ).removeSpecialCharsForFilename ( TQUrl ( filename ).fileName() );
		certName = file.left ( file.length() - 4 ); // peter_pan.p12 -> peter_pan

		if ( main->ImporttypeComboBox->currentItem() == pkcs12_racoon || main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
		{
			TQString type="";
			if ( main->ImporttypeComboBox->currentItem() == pkcs12_racoon )
				type="racoon";
			else
				type="OpenVPN";
			TQFile certpathtest ( certpath + "/." );

			if ( !certpathtest.exists() )
			{
				KMessageBox::error ( this, i18n ( "%1 certificate path (%2) does not exist!" ).arg ( type ).arg ( certpath ) );
				GlobalConfig->appendLogEntry ( i18n ( "%1 certificate path (%2) does not exist!" ).arg ( type ).arg ( certpath ) ,GlobalConfig->error );
				importOk=false;
				GlobalConfig->appPointer->restoreOverrideCursor();
				return;
			}
			else
			{
				TQFile testfile ( TQString ( certpath + "/test" ) );
				if ( !testfile.open ( IO_WriteOnly ) )
				{
					KMessageBox::error ( this, i18n ( "%1 certificate path (%2) is not writeable!" ).arg ( type ).arg ( certpath ) );
					GlobalConfig->appendLogEntry ( i18n ( "%1 certificate path (%2) is not writeable!" ).arg ( type ).arg ( certpath )  ,GlobalConfig->error );
					importOk = false;
					GlobalConfig->appPointer->restoreOverrideCursor();
					return;
				}
				else
				{
					testfile.remove();
				}
			}
		}
	}

	// here we go
	if ( importOk )
	{

		/*
		FreeSWAN/Racoon:
		openssl pkcs12 -in cert.p12 -clcerts -out /etc/racoon/certs/mykeys_company.pem -nodes

		DER:
		openssl x509 -in cert.crt -out ca_company.pem -inform DER

		*/
		// 		 		std::cout << "[std]:" << "settings ok." << std::endl;

		ImportProcess = new TQProcess ( this );


		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan || main->ImporttypeComboBox->currentItem() == pkcs12_openvpn || main->ImporttypeComboBox->currentItem() == pkcs12_racoon || main->ImporttypeComboBox->currentItem() == ca_der )
		{
			ImportProcess->addArgument ( pathToOpenSSL );
		}
		if ( main->ImporttypeComboBox->currentItem() == cisco || main->ImporttypeComboBox->currentItem() == ciscoca || main->ImporttypeComboBox->currentItem() == ciscouserca )
		{
			ImportProcess->addArgument ( GlobalConfig->pathToCiscoCertMgr );
		}

		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan ||
		        main->ImporttypeComboBox->currentItem() == pkcs12_racoon ||
		        main->ImporttypeComboBox->currentItem() == pkcs12_openvpn
		   )
		{
			ImportProcess->addArgument ( "pkcs12" );
			ImportProcess->addArgument ( "-in" );
			ImportProcess->addArgument ( filename );
			ImportProcess->addArgument ( "-nodes" );
			ImportProcess->addArgument ( "-clcerts" );
			ImportProcess->addArgument ( "-out" );
		}
		else if ( main->ImporttypeComboBox->currentItem() == ca_der )
		{

			ImportProcess->addArgument ( "x509" );
			ImportProcess->addArgument ( "-in" );
			ImportProcess->addArgument ( filename );
			ImportProcess->addArgument ( "-out" );
			ImportProcess->addArgument ( certpath + "/ca_" + certName + ".pem" );
			ImportProcess->addArgument ( "-inform" );
			ImportProcess->addArgument ( "DER" );
		}
		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
		{
			ImportProcess->addArgument ( "/etc/ipsec.d/certs/mykeys_" + certName + ".pem" ); // warning: static
		}
		else if ( main->ImporttypeComboBox->currentItem() == pkcs12_racoon || main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
		{
			ImportProcess->addArgument ( certpath + "/mykeys_" + certName + ".pem" );
		}
		else if ( main->ImporttypeComboBox->currentItem() == cisco || main->ImporttypeComboBox->currentItem() == ciscoca || main->ImporttypeComboBox->currentItem() == ciscouserca )
		{
			if (main->ImporttypeComboBox->currentItem() == cisco)
				ImportProcess->addArgument ( "-U" );
			if (main->ImporttypeComboBox->currentItem() == ciscoca)
				ImportProcess->addArgument ( "-R" );
			if (main->ImporttypeComboBox->currentItem() == ciscouserca)
			{
				ImportProcess->addArgument ( "-U" );
				ImportProcess->addArgument ( "-R" );
			}
			ImportProcess->addArgument ( "-op" );
			ImportProcess->addArgument ( "import" );
			ImportProcess->addArgument ( "-f" );
			ImportProcess->addArgument ( filename );

		}


		connect ( ImportProcess, TQ_SIGNAL ( readyReadStdout() ), this, TQ_SLOT ( readFromStdout_import() ) );
		connect ( ImportProcess, TQ_SIGNAL ( readyReadStderr() ), this, TQ_SLOT ( readFromStderr_import() ) );
		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan ||
		        main->ImporttypeComboBox->currentItem() == pkcs12_racoon ||
		        main->ImporttypeComboBox->currentItem() == pkcs12_openvpn
		   )
		{
			connect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( doCacert() ) );
		}
		if ( main->ImporttypeComboBox->currentItem() == ca_der )
		{
			connect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( doCreateHash() ) );
		}

		if ( main->ImporttypeComboBox->currentItem() == cisco || main->ImporttypeComboBox->currentItem() == ciscoca)
		{
			connect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( ciscoCertMgrExited() ) );
		}

		if ( !ImportProcess->start ( env ) )
		{
			if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan || main->ImporttypeComboBox->currentItem() == pkcs12_openvpn || main->ImporttypeComboBox->currentItem() == pkcs12_racoon || main->ImporttypeComboBox->currentItem() == ca_der )
				KMessageBox::sorry ( this, i18n ( "Unable to start process (%1)!" ).arg ( "openssl" ) );
			if ( main->ImporttypeComboBox->currentItem() == cisco  )
				KMessageBox::sorry ( this, i18n ( "Unable to start process (%1)!" ).arg ( "cisco_cert_mgr" ) );
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}
		else
		{
			doExit=true;

			TQString processname = "";

			if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan || main->ImporttypeComboBox->currentItem() == pkcs12_openvpn || main->ImporttypeComboBox->currentItem() == pkcs12_racoon || main->ImporttypeComboBox->currentItem() == ca_der )
			{
				processname="openssl";

				if ( GlobalConfig->KvpncDebugLevel >3 )
					GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1: send %2" ).arg("accept()").arg ( i18n ( " import password" ) ),GlobalConfig->debug );

				if ( main->ImportPasswordEdit->text().isEmpty() )
					ImportProcess->writeToStdin ( "\n" );
				else
					ImportProcess->writeToStdin ( main->ImportPasswordEdit->text() + "\n" );
		
			}
			if ( main->ImporttypeComboBox->currentItem() == cisco  )
				processname="cisco_cert_mgr";

			if ( GlobalConfig->KvpncDebugLevel > 3 )
				GlobalConfig->appendLogEntry ( i18n ( "Process (%1) started." ).arg (processname ),GlobalConfig->debug );

			if ( main->ImporttypeComboBox->currentItem() == cisco /*|| main->ImporttypeComboBox->currentItem() == ciscoca*/  )
			{
				ImportProcess->writeToStdin ( main->ImportPasswordEdit->text() +"\n");
				if (main->UsePrivateKeyPasswordCheckBox->isChecked() )
				{
					ImportProcess->writeToStdin ( main->PrivateKeyPasswordEdit->password() + "\n" );
					ImportProcess->writeToStdin ( main->PrivateKeyPasswordEdit->password() + "\n" );
				}
			}
		}
	}
}

void ImportCertificateDialog::canAccept()
{
	if ( importSuccess )
	{
		KMessageBox::information ( 0, i18n ( "Certificate was sucessfully imported." ), i18n ( "Import Successful" ) );
		if ( GlobalConfig->KvpncDebugLevel > 0 )
			GlobalConfig->appendLogEntry ( i18n ( "Certificate import: certificate was successfully imported." ),GlobalConfig->debug );
	}
	else
	{
		KMessageBox::sorry ( 0, i18n ( "Certificate import failed." ), i18n ( "Import Failed" ) );
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: certificate could not be imported." ),GlobalConfig->error );
		GlobalConfig->appPointer->restoreOverrideCursor();
		return;
	}

	if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
	{
		TQString bin="ipsec";
		ToolInfo *tool;
		//std::cout << "Tool (bin): " << bin << std::endl;
		if ( !GlobalConfig->ToolList->isEmpty() )
		{
			for ( tool = GlobalConfig->ToolList->first(); tool; tool = GlobalConfig->ToolList->next() )
			{
				if ( bin == tool->Name )
				{
					if ( tool->PathToExec.section ( '/',-1 ) != bin )
					{
						// program is NOT installed
						KMessageBox::information ( this, i18n ( "The required tool (%1) is not installed, please install it before you are connecting and restart kvpnc." ).arg ( bin ), i18n ( "Tool Missing" ) );
						GlobalConfig->appPointer->restoreOverrideCursor();
						return;
					}
					break;
				}
			}
		}
	}
	else if ( main->ImporttypeComboBox->currentItem() == pkcs12_racoon )
	{
		TQString bin="racoon";
		ToolInfo *tool;
		//std::cout << "Tool (bin): " << bin << std::endl;
		if ( !GlobalConfig->ToolList->isEmpty() )
		{
			for ( tool = GlobalConfig->ToolList->first(); tool; tool = GlobalConfig->ToolList->next() )
			{
				if ( bin == tool->Name )
				{
					if ( tool->PathToExec.section ( '/',-1 ) != bin )
					{
						// program is NOT installed
						KMessageBox::information ( this, i18n ( "The required tool (%1) is not installed, please install it before you are connecting and restart kvpnc." ).arg ( bin ), i18n ( "Tool Missing" ) );
						GlobalConfig->appPointer->restoreOverrideCursor();
						return;
					}
					break;
				}
			}
		}
	}
	else if ( main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
	{
		TQString bin="openvpn";
		ToolInfo *tool;
		//std::cout << "Tool (bin): " << bin << std::endl;
		if ( !GlobalConfig->ToolList->isEmpty() )
		{
			for ( tool = GlobalConfig->ToolList->first(); tool; tool = GlobalConfig->ToolList->next() )
			{
				if ( bin == tool->Name )
				{
					if ( tool->PathToExec.section ( '/',-1 ) != bin )
					{
						// program is NOT installed
						KMessageBox::information ( this, i18n ( "The required tool (%1) is not installed, please install it before you are connecting and restart kvpnc." ).arg ( bin ), i18n ( "Tool Missing" ) );
						GlobalConfig->appPointer->restoreOverrideCursor();
						return;
					}
					break;
				}
			}
		}
	}
	else if ( main->ImporttypeComboBox->currentItem() == cisco || main->ImporttypeComboBox->currentItem() == ciscoca || main->ImporttypeComboBox->currentItem() == ciscouserca )
	{
		TQString bin="cisco_cert_mgr";
		ToolInfo *tool;
		//std::cout << "Tool (bin): " << bin << std::endl;
		if ( !GlobalConfig->ToolList->isEmpty() )
		{
			for ( tool = GlobalConfig->ToolList->first(); tool; tool = GlobalConfig->ToolList->next() )
			{
				if ( bin == tool->Name )
				{
					if ( tool->PathToExec.section ( '/',-1 ) != bin )
					{
						// program is NOT installed
						KMessageBox::information ( this, i18n ( "The required tool (%1) is not installed, please install it before you are connecting and restart kvpnc." ).arg ( bin ), i18n ( "Tool Missing" ) );
						GlobalConfig->appPointer->restoreOverrideCursor();
						return;
					}
					break;
				}
			}
		}
	}
	GlobalConfig->appPointer->restoreOverrideCursor();

	if ( doExit )
		TQDialog::accept();
}

void ImportCertificateDialog::reject()
{
	importOk=false;
	importSuccess=false;
	TQDialog::reject();
}

void ImportCertificateDialog::doCacert()
{
	disconnect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( doCacert() ) );
	if ( GlobalConfig->KvpncDebugLevel > 3 )
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1" ).arg("doCacert()"),GlobalConfig->debug );

	if ( ImportProcess->normalExit () )
	{
		
		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
		{
			Utils ( GlobalConfig,this ).doChmod ( "/etc/ipsec.d/certs/mykeys_" + certName + ".pem","go-rwx" );
		}
		else if ( main->ImporttypeComboBox->currentItem() == pkcs12_racoon || main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
		{
			Utils ( GlobalConfig,this ).doChmod ( certpath + "/mykeys_" + certName + ".pem","go-rwx" );
		}

		/*
		openssl pkcs12 -in cert.p12 -nokeys -cacerts -out /etc/racoon/certs/ca_company.pem -nodes
		*/
		ImportProcess->clearArguments();
		ImportProcess->addArgument ( pathToOpenSSL );
		ImportProcess->addArgument ( "pkcs12" );
		ImportProcess->addArgument ( "-in" );
		ImportProcess->addArgument ( filename );
		ImportProcess->addArgument ( "-nokeys" );
		ImportProcess->addArgument ( "-cacerts" );
		ImportProcess->addArgument ( "-out" );

		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
		{
			ImportProcess->addArgument ( "/etc/ipsec.d/cacerts/ca_" + certName + ".pem" ); // warning: static
			CaCertFullPath="/etc/ipsec.d/cacerts/ca_" + certName + ".pem";
		}
		else
		{
			ImportProcess->addArgument ( certpath + "/ca_" + certName + ".pem" );
			CaCertFullPath=certpath + "/ca_" + certName + ".pem";
		}

		ImportProcess->addArgument ( "-nodes" );

		connect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( doCreateHash() ) );

		if ( ! ImportProcess->start ( env ) )
		{
			KMessageBox::error ( this, i18n ( "Unable to extract CA certificate!" ), i18n ( "Extract Failed" ) );
			GlobalConfig->appendLogEntry ( i18n ( "Certificate import: CA certificate could not be extracted." ),GlobalConfig->error );
			importSuccess=false;
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}
		else
		{

			if ( GlobalConfig->KvpncDebugLevel > 3 )
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1: send %2" ).arg("doCacert()").arg ( i18n ( " import password" ) ),GlobalConfig->debug );

			if ( main->ImportPasswordEdit->text().isEmpty() )
				ImportProcess->writeToStdin ( "\n" );
			else
				ImportProcess->writeToStdin ( main->ImportPasswordEdit->text() + "\n" );

			doExit=true;
			if ( GlobalConfig->KvpncDebugLevel > 0 )
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import: CA certificate successful extracted." ),GlobalConfig->debug );
		}
	}
	else
	{
		importSuccess=false;
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: import process from accept() failed." ),GlobalConfig->error );
	}
}

void ImportCertificateDialog::doPrivateKey()
{

	if ( GlobalConfig->KvpncDebugLevel > 3 )
		GlobalConfig->appendLogEntry ( "[dbg]: doPrivateKey()",GlobalConfig->debug );
	disconnect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( doPrivateKey() ) );

	if ( ImportProcess->normalExit () )
	{

		/*
		openssl pkcs12 -in cert.p12 -nocerts -out /etc/racoon/certs/ca_company.pem
		*/
		ImportProcess->clearArguments();
		ImportProcess->addArgument ( pathToOpenSSL );
		ImportProcess->addArgument ( "pkcs12" );
		ImportProcess->addArgument ( "-nocerts" );
		ImportProcess->addArgument ( "-in" );
		ImportProcess->addArgument ( filename );
		ImportProcess->addArgument ( "-out" );


		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
			ImportProcess->addArgument ( certpath+"/private/" + certName + ".pem" ); // warning: static
		else if ( main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
			ImportProcess->addArgument ( certpath+"/" + certName + ".pem" ); // warning: static

		if ( !certpath.isEmpty() )
			if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
				CertFullPath=certpath+"/private/" + certName + ".pem";
		if ( main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
			CertFullPath=certpath+"/" + certName + ".pem";

		if ( main->UsePrivateKeyPasswordCheckBox->isChecked() )
			connect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( exit() ) );
		else
			connect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( removePrivateKey() ) );

		//LogOutput->append( "priv key: we starting..." );
		if ( !ImportProcess->start( ) )
		{
			KMessageBox::sorry ( this, i18n ( "Unable to start process (private key)!" ) );

			GlobalConfig->appendLogEntry ( i18n ( "Certificate import: private key could not extracted." ),GlobalConfig->error );
			importSuccess=false;
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}
		else
		{

			if ( GlobalConfig->KvpncDebugLevel > 3 )
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1: send %2" ).arg("doPrivateKey()").arg ( i18n ( " import password" ) ),GlobalConfig->debug );

// 			if ( main->ImportPasswordEdit->text().isEmpty() )
// 				ImportProcess->writeToStdin ( "\n" );
// 			else
				ImportProcess->writeToStdin ( main->ImportPasswordEdit->text() + "\n" );


				if ( main->UsePrivateKeyPasswordCheckBox->isChecked() )
				{
					if ( GlobalConfig->KvpncDebugLevel > 3 )
						GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1: send %2..." ).arg("doPrivateKey").arg ( i18n ( " private key password" ) ),GlobalConfig->debug );

					ImportProcess->writeToStdin ( main->PrivateKeyPasswordEdit->text() + "\n" );
				}
				else
				{
					if ( GlobalConfig->KvpncDebugLevel > 3 )
						GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1: send %2..." ).arg("doPrivateKey").arg ( i18n ( " private key password dummy" ) ),GlobalConfig->debug );

					// we need 4 chars here
					ImportProcess->writeToStdin ( "abcd\n" );

				}

				if ( main->UsePrivateKeyPasswordCheckBox->isChecked() )
				{
					if ( GlobalConfig->KvpncDebugLevel > 3 )
						GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1: send %2..." ).arg("doPrivateKey").arg ( i18n ( " private key password" ) ),GlobalConfig->debug );

					ImportProcess->writeToStdin ( main->PrivateKeyPasswordEdit->text() + "\n" );
				}
				else
				{
					if ( GlobalConfig->KvpncDebugLevel > 3 )
						GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1: send %2..." ).arg("doPrivateKey").arg ( i18n ( " private key password dummy" ) ),GlobalConfig->debug );

					// we need 4 chars here
					ImportProcess->writeToStdin ( "abcd\n" );

				}

		}

	}
	else
	{
		importSuccess=false;
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: import process from doLink() failed." ),GlobalConfig->error );
		GlobalConfig->appPointer->restoreOverrideCursor();
		return;
	}
}

void ImportCertificateDialog::doCreateHash()
{

	disconnect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( doCreateHash() ) );

	if ( GlobalConfig->KvpncDebugLevel > 3 )
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1" ).arg("doCreateHash()"),GlobalConfig->debug );

	if ( ImportProcess->normalExit () )
	{

		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
			Utils ( GlobalConfig,this ).doChmod ( certpath+"/cacerts/ca_" + certName + ".pem","go-rwx" );
		else
			Utils ( GlobalConfig,this ).doChmod ( certpath + "/ca_" + certName + ".pem","go-rwx" );

		/*
		openssl x509 -noout -hash < /etc/racoon/certs/ca_company.pem
		*/
		ImportProcess->clearArguments();
		ImportProcess->addArgument ( pathToOpenSSL );
		ImportProcess->addArgument ( "x509" );
		ImportProcess->addArgument ( "-noout" );
		ImportProcess->addArgument ( "-hash" );
		ImportProcess->addArgument ( "-in" );
		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
			ImportProcess->addArgument ( certpath+"/cacerts/ca_" + certName + ".pem" ); // warning: static
		else
			ImportProcess->addArgument ( certpath + "/ca_" + certName + ".pem" );

		connect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( doLink() ) );


		//		LogOutput->append( "hash: we starting..." );
		if ( !ImportProcess->start( ) )
		{
			KMessageBox::sorry ( this, i18n ( "Unable to start process (%1)!" ).arg ( "hash" ) );
			GlobalConfig->appendLogEntry ( i18n ( "Certificate import: hash could not created." ),GlobalConfig->error );
			importSuccess=false;
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}
		else
		{

			if ( GlobalConfig->KvpncDebugLevel > 3 )
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1: send %2" ).arg("doCreateHash()").arg ( i18n ( " import password" ) ),GlobalConfig->debug );

			if ( main->ImportPasswordEdit->text().isEmpty() )
				ImportProcess->writeToStdin ( "\n" );
			else
				ImportProcess->writeToStdin ( main->ImportPasswordEdit->text() + "\n" );
			while (ImportProcess->isRunning())
			{
				sleep (1);
			}

			doExit=true;
			doHash = true;
			if ( GlobalConfig->KvpncDebugLevel > 0 )
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import: hash successful created." ),GlobalConfig->debug );
		}
	}
	else
	{
		importSuccess=false;
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: import process from doCert() failed." ),GlobalConfig->error );
	}
}

void ImportCertificateDialog::doLink()
{
	disconnect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( doLink() ) );
	if ( GlobalConfig->KvpncDebugLevel > 3 )
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1" ).arg("doLink()"),GlobalConfig->debug );

	if ( ImportProcess->normalExit () )
	{

		doHash = false;
		ImportProcess->clearArguments();
		/*
		ln -s /etc/racoon/certs/ca_company.pem /etc/racoon/certs/<hash>.0
		*/
		ImportProcess->addArgument ( "ln" );
		ImportProcess->addArgument ( "-sf" );
		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
		{
			ImportProcess->addArgument ( certpath+"/cacerts/ca_" + certName + ".pem" );
			ImportProcess->addArgument ( certpath+"/cacerts/" + certHash + ".0" );
		}
		else
		{
			ImportProcess->addArgument ( certpath + "/ca_" + certName + ".pem" );
			ImportProcess->addArgument ( certpath +"/"+ certHash + ".0" );
		}

		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan ||
		        main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
			connect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( doPrivateKey() ) );
		else
			connect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( exit() ) );


		if ( !ImportProcess->start( ) )
		{
			KMessageBox::sorry ( this, i18n ( "Unable to start process (%1)!" ).arg ( "ln -s" ) );
			GlobalConfig->appendLogEntry ( i18n ( "Certificate import: Link could not created." ),GlobalConfig->error );
			importSuccess=false;
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}
		else
		{
			while (ImportProcess->isRunning())
			{
				usleep (500);
			}

			delete ImportProcess;
			GlobalConfig->appPointer->restoreOverrideCursor();
			if ( GlobalConfig->KvpncDebugLevel > 3 )
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import: Link creation sucessful." ),GlobalConfig->error );
			ImportProcess =0L;
			exit();
		}
	}
	else
	{
		importSuccess=false;
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: Skipping link creation." ),GlobalConfig->error );
	}
}

void ImportCertificateDialog::exit()
{
	if ( GlobalConfig->KvpncDebugLevel > 0 )
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1" ).arg("exit()"),GlobalConfig->debug );

	
	if ( (ImportProcess != 0L && ImportProcess->normalExit() ) || ImportProcess == 0L )
	{
		doExit=true;
		if ( GlobalConfig->KvpncDebugLevel > 0 )
			GlobalConfig->appendLogEntry ( i18n ( "Certificate import: Link successful created." ),GlobalConfig->debug );

		// 	if ( ImportProcess->normalExit() )
		// 		importOk=true;
		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
			Utils ( GlobalConfig,this ).doChmod ( certpath+"/private/" + certName + ".pem","go-rwx" );

		if ( main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
			Utils ( GlobalConfig,this ).doChmod ( certpath+"/" + certName + ".pem","go-rwx" );
		done=true;
		canAccept();
	}
	else
	{
		GlobalConfig->appPointer->restoreOverrideCursor();
		importSuccess=false;
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: import process from doPrivateKey() failed." ),GlobalConfig->error );
	}
}

void ImportCertificateDialog::readFromStdout_import()
{

// 	TQString line = TQString( ImportProcess->readStdout() );
	while ( ImportProcess->canReadLineStdout() )
	{
		TQString line = TQString ( ImportProcess->readLineStdout() );

		if ( GlobalConfig->KvpncDebugLevel > 0 )
			GlobalConfig->appendLogEntry ( i18n ( "Certificate import stdout: %1" ).arg ( line ),GlobalConfig->debug );
		if ( doHash )
		{
			certHash = line.left ( line.length() - 1 );
			doHash = false;
			//		LogOutput->append( "<font color=\"red\">[std]: hash" + line + "</font>" );
		}

		if ( line.find ( "Enter Import Password" , 0, false ) > -1 )
		{
			if ( GlobalConfig->KvpncDebugLevel > 0 )
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1 was requested, send it..." ).arg ( i18n ( " import password" ) ),GlobalConfig->debug );

			if ( main->ImportPasswordEdit->text().isEmpty() )
				ImportProcess->writeToStdin ( "\n" );
			else
				ImportProcess->writeToStdin ( main->ImportPasswordEdit->text() + "\n" );
		}

		else if ( line.find ( "Enter PEM pass phrase" , 0, false ) > -1 )
		{

			if ( askpasscount < 10 )
			{

				if ( main->UsePrivateKeyPasswordCheckBox->isChecked() )
				{
					if ( GlobalConfig->KvpncDebugLevel > 3 )
						GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1: send %2..." ).arg("doPrivateKey").arg ( i18n ( " private key password" ) ),GlobalConfig->debug );

					ImportProcess->writeToStdin ( main->PrivateKeyPasswordEdit->text() + "\n" );
				}
				else
				{
					if ( GlobalConfig->KvpncDebugLevel > 3 )
						GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1: send %2..." ).arg("doPrivateKey").arg ( i18n ( " private key password dummy" ) ),GlobalConfig->debug );

					// we need 4 chars here
					ImportProcess->writeToStdin ( "abcd\n" );

				}
				askpasscount+=1;
			}
			else
			{
				// whats happen???
				// 			doExit=true;
			}
		}


		if ( main->ImporttypeComboBox->currentItem() == cisco  )
		{

			if ( GlobalConfig->KvpncDebugLevel > 2 )
					GlobalConfig->appendLogEntry ("[cisco_cert_mgr raw] "+line,GlobalConfig->debug);

			if ( line.find ( "Password:" , 0, false ) > -1 ||  line.find ( "Confirm Password:" , 0, false ) > -1 )
			{
				if ( GlobalConfig->KvpncDebugLevel > 0 )
					GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1 was requested, send it..." ).arg ( i18n ( "certificate password" ) ),GlobalConfig->debug );
				ImportProcess->writeToStdin ( main->PrivateKeyPasswordEdit->password() + "\n" );

			}
			if ( line.find ( "Success: certificate imported from path:", 0, false ) > -1 )
			{
				
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import was successful." ) ,GlobalConfig->info );
				importOk=true;
				importSuccess=true;
				doExit=true;
				done=true;
			}
		
		}
	}
}

void ImportCertificateDialog::readFromStderr_import()
{
// 	TQString line = TQString ( ImportProcess->readStderr() );
	while ( ImportProcess->canReadLineStderr() )
	{
		TQString line = TQString ( ImportProcess->readLineStderr() );
		if ( GlobalConfig->KvpncDebugLevel > 3 )
		{
			if ( line.find ( "Enter Import Pass", 0, false ) > -1 || line.find ( "Enter PEM pass phrase", 0, false ) > -1 || line.find ( "MAC verified OK", 0, false ) > -1  || line.find ( "Enter pass phrase for", 0, false ) > -1 || line.find ( "writing RSA key", 0, false ) > -1 )
			{
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1" ).arg ( line ),GlobalConfig->info );
			}
			else
			{
				GlobalConfig->appendLogEntry ( i18n ( "Certificate import stderr: %1" ).arg ( line ),GlobalConfig->error );
			}
		}
		if ( line.find ( "Error",9, false ) > -1 )
		{
			GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1" ).arg ( line ),GlobalConfig->error );
			importSuccess=false;
			importOk = false;
			doExit=false;
// 			error_found=true;
		}

		else if ( line.find ( "invalid password" , 0, false ) > -1  || line.find ( "Mac verify error: invalid password?", 0, false ) > -1 )
		{
			if (error_found==false)
				KMessageBox::sorry ( this , i18n ( "Wrong password." ), i18n ( "Password Failed" ) );
			GlobalConfig->appendLogEntry ( i18n ( "Certificate import: password was invalid" ),GlobalConfig->error );
			importSuccess=false;
			importOk = false;
			doExit=false;
			error_found=true;
			GlobalConfig->appPointer->restoreOverrideCursor();
		}

		else if ( line.find ( "unable to load certificate", 0, false ) > -1 )
		{
			if (error_found==false)
				KMessageBox::error ( this, i18n ( "Unable to load certificate!" ), i18n ( "Load Failed" ) );
			GlobalConfig->appendLogEntry ( i18n ( "Unable to load certificate!" ) ,GlobalConfig->error );
			importOk=false;
			importSuccess=false;
			doExit=false;
			error_found=true;
// 			if ( ImportProcess != 0L && ImportProcess->isRunning() )
// 			{
// 				disconnect ( ImportProcess, TQ_SIGNAL ( readyReadStdout() ), this, TQ_SLOT ( readFromStdout_import() ) );
// 				disconnect ( ImportProcess, TQ_SIGNAL ( readyReadStderr() ), this, TQ_SLOT ( readFromStderr_import() ) );
// 				ImportProcess->kill();
// 				ImportProcess = 0L;
// 			}
			GlobalConfig->appPointer->restoreOverrideCursor();
			done=true;
			return;
		}
		else if ( line.find ( "unable to load Private Key", 0, false ) > -1 )
		{
			if (error_found==false)
				KMessageBox::error ( this, i18n ( "unable to load Private Key!" ), i18n ( "Load Failed" ) );
			GlobalConfig->appendLogEntry ( i18n ( "unable to load Private Key!" ) ,GlobalConfig->error );
			importOk=false;
			importSuccess=false;
			doExit=false;
			error_found=true;
			GlobalConfig->appPointer->restoreOverrideCursor();
			if ( ImportProcess->isRunning() )
			{
				ImportProcess->kill();
			}
			done=true;
		}

		else if ( line.find ( "Error opening output file", 0, false ) > -1 )
		{
			if (error_found==false)
				KMessageBox::error ( this, i18n ( "Error opening output file." ), i18n ( "File open failed" ) );
			GlobalConfig->appendLogEntry ( i18n ( "Error opening output file!" ) ,GlobalConfig->error );
			importOk=false;
			importSuccess=false;
			doExit=true;
			error_found=true;
			GlobalConfig->appPointer->restoreOverrideCursor();
			done=true;
		}
		else if ( line.find ( "Verify failure", 0, false ) > -1 )
		{
			if (error_found==false)
				KMessageBox::error ( this, i18n ( "Verify failure at private key password." ), i18n ( "Verify failure" ) );
			GlobalConfig->appendLogEntry ( i18n ( "Verify failure at private key password." ) ,GlobalConfig->error );
			importOk=false;
			importSuccess=false;
			doExit=true;
			error_found=true;
			GlobalConfig->appPointer->restoreOverrideCursor();
			done=true;
		}

		else if ( line.find ( "MAC verified OK", 0, false ) > -1 )
		{
			GlobalConfig->appendLogEntry ( i18n ( "Import password was ok." ) ,GlobalConfig->debug );
			importSuccess=true;
		}

		else if ( main->ImporttypeComboBox->currentItem() == cisco  )
		{

			if ( GlobalConfig->KvpncDebugLevel > 2 )
				GlobalConfig->appendLogEntry ("[cisco_cert_mgr raw err] "+line,GlobalConfig->debug);

			if ( line.find ( "error: unable to import certificate from path:", 0, false ) > -1 )
			{
				if (error_found==false)
					KMessageBox::error ( this, i18n ( "Unable to load certificate!" ), i18n ( "Load Failed" ) );
				GlobalConfig->appendLogEntry ( i18n ( "Unable to load certificate!" ) ,GlobalConfig->error );
				importOk=false;
				importSuccess=false;
				doExit=false;
				error_found=true;
				GlobalConfig->appPointer->restoreOverrideCursor();
				if ( ImportProcess->isRunning() )
				{
					ImportProcess->kill();
				}
				done=true;
			}

			else if ( line.find ( "Success: certificate imported from path:", 0, false ) > -1 )
			{
				GlobalConfig->appendLogEntry ( i18n ( "Certificate imported from path." ) ,GlobalConfig->error );
				importOk=true;
				importSuccess=true;
				doExit=false;
				done=true;
			}
		}
	}
}

void ImportCertificateDialog::typeToggeled ( int type )
{
	if ( GlobalConfig->KvpncDebugLevel > 0 )
		GlobalConfig->appendLogEntry ( TQString ( "type: "+TQString().setNum ( type ) ),GlobalConfig->debug );
	if ( type == pkcs12_freeswan )
	{
		certpath = "/etc/ipsec.d/certs";
// 		main->PrivateKeyPasswordEdit->setEnabled ( true );
// 		main->PrivateKeyAgainPasswordEdit->setEnabled ( true );
		main->RacoonCertificatePathUrlrequester->setEnabled ( false );
		main->ImportPasswordEdit->setEnabled ( true );
		main->P12GroupBox->setEnabled ( true );
// 		main->PrivateKeyPassGroupBox->setEnabled ( true );
		main->FilenameUrlrequester->setFilter ( "*.p12" );
	}
	else if ( type == pkcs12_racoon )
	{
		certpath = "/etc/racoon/certs/";
// 		main->PrivateKeyPasswordEdit->setEnabled ( false );
// 		main->PrivateKeyAgainPasswordEdit->setEnabled ( false );
		main->RacoonCertificatePathUrlrequester->setEnabled ( true );
		main->ImportPasswordEdit->setEnabled ( true );
		main->P12GroupBox->setEnabled ( true );
// 		main->PrivateKeyPassGroupBox->setEnabled ( false );
		main->FilenameUrlrequester->setFilter ( "*.p12" );
	}
	else if ( type == ca_der )
	{
		certpath = "/etc/certs/";
// 		main->PrivateKeyPasswordEdit->setEnabled ( false );
// 		main->PrivateKeyAgainPasswordEdit->setEnabled ( false );
		main->RacoonCertificatePathUrlrequester->setEnabled ( true );
		main->ImportPasswordEdit->setEnabled ( false );
		main->P12GroupBox->setEnabled ( false );
// 		main->PrivateKeyPassGroupBox->setEnabled ( false );
		main->FilenameUrlrequester->setFilter ( "*.der *.crt" );
	}
	else if ( type == pkcs12_openvpn )
	{
		certpath = "/etc/openvpn";
		main->PrivateKeyPasswordEdit->setEnabled ( true );
		main->PrivateKeyAgainPasswordEdit->setEnabled ( true );
		main->RacoonCertificatePathUrlrequester->setEnabled ( true );
		main->RacoonCertificatePathUrlrequester->setURL( certpath );
		main->ImportPasswordEdit->setEnabled ( true );
		main->P12GroupBox->setEnabled ( true );
		main->PrivateKeyPassGroupBox->setEnabled ( true );
		main->FilenameUrlrequester->setFilter ( "*.p12" );
	}
	else if ( type == cisco )
	{
		main->P12GroupBox->setTitle ( i18n ( "Import" ) );
		main->CertPathTextLabel->hide();
		main->RacoonCertificatePathUrlrequester->hide();
		main->PrivateKeyPassGroupBox->setTitle ( i18n ( "Certificate protection" ) );
		main->PrivateKeyPassTextLabel->setText(i18n ("Certificate password:"));
		main->PrivateKeyPassAgainTextLabel->setText(i18n ("Certificate password again:"));
		main->FilenameUrlrequester->setFilter ( "*" );
	}

	else
	{
		main->P12GroupBox->setTitle ( i18n ( "P12" ) );
		main->CertPathTextLabel->hide();
		main->RacoonCertificatePathUrlrequester->hide();
		main->PrivateKeyPassGroupBox->setTitle ( i18n ( "FreeS/WAN (Openswan)" ) );
		main->PrivateKeyPassTextLabel->setText(i18n ("Private key passphrase:"));
		main->PrivateKeyPassAgainTextLabel->setText(i18n ("Passphrase again:"));
		main->FilenameUrlrequester->setFilter ( "*" );
	}

	main->RacoonCertificatePathUrlrequester->setURL ( certpath );
}

void ImportCertificateDialog::ciscoCertMgrExited()
{
	doExit=true;
	importOk=true;
	importSuccess=true;
	done=true;
	if ( GlobalConfig->KvpncDebugLevel > 0 )
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: certificate successful imported." ),GlobalConfig->debug );
	canAccept();
}

void ImportCertificateDialog::usePrivateKeyPassToggled(bool)
{
	if (main->UsePrivateKeyPasswordCheckBox->isChecked())
	{
		main->PrivateKeyPassGroupBox->setEnabled(true);
	}
	else
	{
		main->PrivateKeyPassGroupBox->setEnabled(false);
	}
}

void ImportCertificateDialog::removePrivateKey()
{
	disconnect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( removePrivateKey() ) );
	if ( GlobalConfig->KvpncDebugLevel > 3 )
		GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1" ).arg("removePrivateKey()"),GlobalConfig->debug );

	if ( ImportProcess->normalExit () )
	{
		ImportProcess->clearArguments();
		ImportProcess->addArgument ( pathToOpenSSL );
		ImportProcess->addArgument ( "rsa" );
		ImportProcess->addArgument ( "-in" );

		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
			ImportProcess->addArgument ( certpath+"/private/" + certName + ".pem" ); // warning: static
		else if ( main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
			ImportProcess->addArgument ( certpath+"/" + certName + ".pem" ); // warning: static

		ImportProcess->addArgument ( "-out" );

		if ( main->ImporttypeComboBox->currentItem() == pkcs12_freeswan )
			ImportProcess->addArgument ( certpath+"/private/" + certName + ".pem" ); // warning: static
		else if ( main->ImporttypeComboBox->currentItem() == pkcs12_openvpn )
			ImportProcess->addArgument ( certpath+"/" + certName + ".pem" ); // warning: static

		connect ( ImportProcess, TQ_SIGNAL ( processExited () ), this, TQ_SLOT ( exit() ) );


		if ( !ImportProcess->start( ) )
		{
			KMessageBox::sorry ( this, i18n ( "Unable to start process (%1)!" ).arg ( "ln -s" ) );
			GlobalConfig->appendLogEntry ( i18n ( "Certificate import: passphrase could not removed." ),GlobalConfig->error );
			importSuccess=false;
			GlobalConfig->appPointer->restoreOverrideCursor();
			return;
		}
		else
		{

				if ( GlobalConfig->KvpncDebugLevel > 3 )
					GlobalConfig->appendLogEntry ( i18n ( "Certificate import: %1: send %2..." ).arg("removePrivateKey()").arg ( i18n ( " private key password dummy" ) ),GlobalConfig->debug );

				// we need 4 chars here
				ImportProcess->writeToStdin ( "abcd\n" );
		}
	}
	else
	{
		importSuccess=false;
	}
}

#include "importcertificatedialog.moc"
