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.
246 lines
9.3 KiB
246 lines
9.3 KiB
/***************************************************************************
|
|
kgpglibrary.cpp - description
|
|
-------------------
|
|
begin : Mon Jul 8 2002
|
|
copyright : (C) 2002 by Jean-Baptiste Mardelle
|
|
email : bj@altern.org
|
|
***************************************************************************/
|
|
|
|
/***************************************************************************
|
|
* *
|
|
* 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. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include <qhbox.h>
|
|
#include <qvbox.h>
|
|
|
|
#include <klocale.h>
|
|
#include <kapplication.h>
|
|
#include <kconfig.h>
|
|
#include <kmessagebox.h>
|
|
#include <krun.h>
|
|
#include <qfile.h>
|
|
#include <kpassivepopup.h>
|
|
#include <kiconloader.h>
|
|
#include "kgpglibrary.h"
|
|
#include "popuppublic.h"
|
|
#include "kgpginterface.h"
|
|
#include <kio/renamedlg.h>
|
|
|
|
KgpgLibrary::KgpgLibrary(QWidget *parent, bool pgpExtension)
|
|
{
|
|
if (pgpExtension)
|
|
extension=".pgp";
|
|
else
|
|
extension=".gpg";
|
|
popIsActive=false;
|
|
panel=parent;
|
|
}
|
|
|
|
KgpgLibrary::~KgpgLibrary()
|
|
{}
|
|
|
|
|
|
void KgpgLibrary::slotFileEnc(KURL::List urls,QStringList opts,QStringList defaultKey,KShortcut goDefaultKey)
|
|
{
|
|
///////////////////////////////////////////////////////////////////////// encode file file
|
|
if (!urls.empty()) {
|
|
urlselecteds=urls;
|
|
if (defaultKey.isEmpty()) {
|
|
QString fileNames=urls.first().fileName();
|
|
if (urls.count()>1) fileNames+=",...";
|
|
popupPublic *dialogue=new popupPublic(0,"Public keys",fileNames,true,goDefaultKey);
|
|
connect(dialogue,SIGNAL(selectedKey(QStringList,QStringList,bool,bool)),this,SLOT(startencode(QStringList,QStringList,bool,bool)));
|
|
dialogue->exec();
|
|
delete dialogue;
|
|
} else
|
|
startencode(defaultKey,opts,false,false);
|
|
}
|
|
}
|
|
|
|
void KgpgLibrary::startencode(QStringList encryptKeys,QStringList encryptOptions,bool shred,bool symetric)
|
|
{
|
|
popIsActive=false;
|
|
//KURL::List::iterator it;
|
|
//filesToEncode=urlselecteds.count();
|
|
_encryptKeys=encryptKeys;
|
|
_encryptOptions=encryptOptions;
|
|
_shred=shred;
|
|
_symetric=symetric;
|
|
fastencode(urlselecteds.first(),encryptKeys,encryptOptions,symetric);
|
|
}
|
|
|
|
|
|
void KgpgLibrary::fastencode(KURL &fileToCrypt,QStringList selec,QStringList encryptOptions,bool symetric)
|
|
{
|
|
////////////////// encode from file
|
|
if ((selec.isEmpty()) && (!symetric)) {
|
|
KMessageBox::sorry(0,i18n("You have not chosen an encryption key."));
|
|
return;
|
|
}
|
|
urlselected=fileToCrypt;
|
|
KURL dest;
|
|
if (encryptOptions.find("--armor")!=encryptOptions.end())
|
|
dest.setPath(urlselected.path()+".asc");
|
|
else
|
|
dest.setPath(urlselected.path()+extension);
|
|
|
|
QFile fgpg(dest.path());
|
|
|
|
if (fgpg.exists()) {
|
|
KIO::RenameDlg *over=new KIO::RenameDlg(0,i18n("File Already Exists"),QString::null,dest.path(),KIO::M_OVERWRITE);
|
|
if (over->exec()==QDialog::Rejected)
|
|
{
|
|
delete over;
|
|
emit systemMessage(QString::null,true);
|
|
return;
|
|
}
|
|
dest=over->newDestURL();
|
|
delete over;
|
|
}
|
|
int filesToEncode=urlselecteds.count();
|
|
if (filesToEncode>1)
|
|
emit systemMessage(i18n("<b>%1 Files left.</b>\nEncrypting </b>%2").arg(filesToEncode).arg(urlselecteds.first().path()));
|
|
else emit systemMessage(i18n("<b>Encrypting </b>%2").arg(urlselecteds.first().path()));
|
|
KgpgInterface *cryptFileProcess=new KgpgInterface();
|
|
pop = new KPassivePopup(panel);
|
|
cryptFileProcess->KgpgEncryptFile(selec,urlselected,dest,encryptOptions,symetric);
|
|
if (!popIsActive)
|
|
{
|
|
//connect(cryptFileProcess,SIGNAL(processstarted(QString)),this,SLOT(processpopup2(QString)));
|
|
popIsActive=true;
|
|
}
|
|
connect(cryptFileProcess,SIGNAL(encryptionfinished(KURL)),this,SLOT(processenc(KURL)));
|
|
connect(cryptFileProcess,SIGNAL(errormessage(QString)),this,SLOT(processencerror(QString)));
|
|
}
|
|
|
|
void KgpgLibrary::processpopup2(QString fileName)
|
|
{
|
|
|
|
//pop->setTimeout(0);
|
|
pop->setView(i18n("Processing encryption (%1)").arg(fileName),i18n("Please wait..."),KGlobal::iconLoader()->loadIcon("kgpg",KIcon::Desktop));
|
|
pop->show();
|
|
/*QRect qRect(QApplication::desktop()->screenGeometry());
|
|
int iXpos=qRect.width()/2-pop->width()/2;
|
|
int iYpos=qRect.height()/2-pop->height()/2;
|
|
pop->move(iXpos,iYpos);*/
|
|
|
|
}
|
|
|
|
void KgpgLibrary::shredpreprocessenc(KURL fileToShred)
|
|
{
|
|
popIsActive=false;
|
|
emit systemMessage(QString::null);
|
|
shredprocessenc(fileToShred);
|
|
}
|
|
|
|
void KgpgLibrary::shredprocessenc(KURL::List filesToShred)
|
|
{
|
|
emit systemMessage(i18n("Shredding %n file","Shredding %n files",filesToShred.count()));
|
|
|
|
KIO::Job *job;
|
|
job = KIO::del( filesToShred, true );
|
|
connect( job, SIGNAL( result( KIO::Job * ) ),SLOT( slotShredResult( KIO::Job * ) ) );
|
|
}
|
|
|
|
void KgpgLibrary::slotShredResult( KIO::Job * job )
|
|
{
|
|
emit systemMessage(QString::null);
|
|
if (job && job->error())
|
|
{
|
|
job->showErrorDialog( (QWidget*)parent() );
|
|
emit systemMessage(QString::null,true);
|
|
KPassivePopup::message(i18n("KGpg Error"),i18n("Process halted, not all files were shredded."),KGlobal::iconLoader()->loadIcon("kgpg",KIcon::Desktop),panel,"kgpg_error",0);
|
|
}
|
|
}
|
|
|
|
|
|
void KgpgLibrary::processenc(KURL)
|
|
{
|
|
emit systemMessage(QString::null);
|
|
if (_shred) shredprocessenc(urlselecteds.first());
|
|
urlselecteds.pop_front ();
|
|
if (urlselecteds.count()>0)
|
|
fastencode(urlselecteds.first(),_encryptKeys,_encryptOptions,_symetric);
|
|
}
|
|
|
|
void KgpgLibrary::processencerror(QString mssge)
|
|
{
|
|
popIsActive=false;
|
|
emit systemMessage(QString::null,true);
|
|
KMessageBox::detailedSorry(panel,i18n("<b>Process halted</b>.<br>Not all files were encrypted."),mssge);
|
|
}
|
|
|
|
|
|
|
|
void KgpgLibrary::slotFileDec(KURL srcUrl,KURL destUrl,QStringList customDecryptOption)
|
|
{
|
|
////////////////////////////////////////////////////////////////// decode file from konqueror or menu
|
|
KgpgInterface *decryptFileProcess=new KgpgInterface();
|
|
pop = new KPassivePopup();
|
|
urlselected=srcUrl;
|
|
decryptFileProcess->KgpgDecryptFile(srcUrl,destUrl,customDecryptOption);
|
|
connect(decryptFileProcess,SIGNAL(processaborted(bool)),this,SLOT(processdecover()));
|
|
connect(decryptFileProcess,SIGNAL(processstarted(QString)),this,SLOT(processpopup(QString)));
|
|
connect(decryptFileProcess,SIGNAL(decryptionfinished()),this,SLOT(processdecover()));
|
|
connect(decryptFileProcess,SIGNAL(errormessage(QString)),this,SLOT(processdecerror(QString)));
|
|
}
|
|
|
|
void KgpgLibrary::processpopup(QString fileName)
|
|
{
|
|
emit systemMessage(i18n("Decrypting %1").arg(fileName));
|
|
pop->setTimeout(0);
|
|
pop->setView(i18n("Processing decryption"),i18n("Please wait..."),KGlobal::iconLoader()->loadIcon("kgpg",KIcon::Desktop));
|
|
pop->show();
|
|
QRect qRect(QApplication::desktop()->screenGeometry());
|
|
int iXpos=qRect.width()/2-pop->width()/2;
|
|
int iYpos=qRect.height()/2-pop->height()/2;
|
|
pop->move(iXpos,iYpos);
|
|
}
|
|
|
|
void KgpgLibrary::processdecover()
|
|
{
|
|
emit systemMessage(QString::null);
|
|
delete pop;
|
|
emit decryptionOver();
|
|
}
|
|
|
|
|
|
void KgpgLibrary::processdecerror(QString mssge)
|
|
{
|
|
delete pop;
|
|
emit systemMessage(QString::null);
|
|
///// test if file is a public key
|
|
QFile qfile(QFile::encodeName(urlselected.path()));
|
|
if (qfile.open(IO_ReadOnly)) {
|
|
QTextStream t( &qfile );
|
|
QString result(t.read());
|
|
qfile.close();
|
|
////////////// if pgp data found, decode it
|
|
if (result.startsWith("-----BEGIN PGP PUBLIC KEY BLOCK")) {////// dropped file is a public key, ask for import
|
|
int result=KMessageBox::warningContinueCancel(0,i18n("<p>The file <b>%1</b> is a public key.<br>Do you want to import it ?</p>").arg(urlselected.path()),i18n("Warning"));
|
|
if (result==KMessageBox::Cancel)
|
|
return;
|
|
else {
|
|
KgpgInterface *importKeyProcess=new KgpgInterface();
|
|
importKeyProcess->importKeyURL(urlselected);
|
|
connect(importKeyProcess,SIGNAL(importfinished(QStringList)),this,SIGNAL(importOver(QStringList)));
|
|
return;
|
|
}
|
|
} else if (result.startsWith("-----BEGIN PGP PRIVATE KEY BLOCK")) {////// dropped file is a public key, ask for import
|
|
qfile.close();
|
|
KMessageBox::information(0,i18n("<p>The file <b>%1</b> is a private key block. Please use KGpg key manager to import it.</p>").arg(urlselected.path()));
|
|
return;
|
|
}
|
|
}
|
|
KMessageBox::detailedSorry(0,i18n("Decryption failed."),mssge);
|
|
}
|
|
|
|
|
|
|
|
#include "kgpglibrary.moc"
|