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.
tdeutils/kgpg/kgpgview.cpp

410 lines
14 KiB

/***************************************************************************
kgpgview.cpp - description
-------------------
begin : Tue Jul 2 12:31:38 GMT 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. *
* *
***************************************************************************/
////////////////////////////////////////////////////////////// code for the main view (editor)
// include files for TQt
//#include <tqprinter.h>
// application specific includes
#include <tqscrollview.h>
#include <tqregexp.h>
#include <kio/netaccess.h>
#include <klocale.h>
#include <kstdaction.h>
#include <kurldrag.h>
#include <kmessagebox.h>
#include <tqfile.h>
#include <tqlayout.h>
#include <kbuttonbox.h>
#include <unistd.h>
#include <kaction.h>
#include <klineedit.h>
#include <tqtextcodec.h>
#include "kgpgsettings.h"
#include "kgpginterface.h"
#include "kgpgview.h"
#include "keyservers.h"
#include "keyserver.h"
#include "kgpg.h"
#include "kgpgeditor.h"
#include "listkeys.h"
#include "popuppublic.h"
#include "detailedconsole.h"
//////////////// configuration for editor
MyEditor::MyEditor( TQWidget *parent, const char *name )
: KTextEdit( parent, name )
{
setTextFormat(PlainText);
setCheckSpellingEnabled (true);
setAcceptDrops(true);
}
void MyEditor::contentsDragEnterEvent( TQDragEnterEvent *e )
{
//////////////// if a file is dragged into editor ...
e->accept (KURLDrag::canDecode(e) || TQTextDrag::canDecode (e));
//e->accept (TQTextDrag::canDecode (e));
}
void MyEditor::contentsDropEvent( TQDropEvent *e )
{
///////////////// decode dropped file
KURL::List list;
TQString text;
if ( KURLDrag::decode( e, list ) )
slotDroppedFile(list.first());
else if ( TQTextDrag::decode(e, text) )
insert(text);
}
void MyEditor::slotDroppedFile(KURL url)
{
///////////////// decide what to do with dropped file
TQString text;
if (!tempFile.isEmpty()) {
KIO::NetAccess::removeTempFile(tempFile);
tempFile=TQString();
}
if (url.isLocalFile())
tempFile = url.path();
else {
if (KMessageBox::warningContinueCancel(0,i18n("<qt><b>Remote file dropped</b>.<br>The remote file will now be copied to a temporary file to process requested operation. This temporary file will be deleted after operation.</qt>"),0,KStdGuiItem::cont(),"RemoteFileWarning")!=KMessageBox::Continue)
return;
if (!KIO::NetAccess::download (url, tempFile,this)) {
KMessageBox::sorry(this,i18n("Could not download file."));
return;
}
}
///////////// if dropped filename ends with gpg, pgp or asc, try to decode it
if ((tempFile.endsWith(".gpg")) || (tempFile.endsWith(".asc")) || (tempFile.endsWith(".pgp"))) {
slotDecodeFile(tempFile);
}
else slotCheckContent(tempFile);
}
bool MyEditor::slotCheckContent(TQString fileToCheck, bool checkForPgpMessage)
{
TQFile qfile(fileToCheck);
if (qfile.open(IO_ReadOnly)) {
////////// open file
TQTextStream t( &qfile );
TQString result(t.read());
////////////// if pgp data found, decode it
if ((checkForPgpMessage) && (result.startsWith("-----BEGIN PGP MESSAGE"))) {
qfile.close();
slotDecodeFile(fileToCheck);
return true;
} else
if (result.startsWith("-----BEGIN PGP PUBLIC KEY BLOCK")) {////// dropped file is a public key, ask for import
qfile.close();
int result=KMessageBox::warningContinueCancel(this,i18n("<p>The file <b>%1</b> is a public key.<br>Do you want to import it ?</p>").tqarg(fileToCheck),i18n("Warning"));
if (result==KMessageBox::Cancel) {
KIO::NetAccess::removeTempFile(fileToCheck);
return true;
} else {
KgpgInterface *importKeyProcess=new KgpgInterface();
importKeyProcess->importKeyURL(KURL(fileToCheck));
connect(importKeyProcess,TQT_SIGNAL(importfinished(TQStringList)),TQT_TQOBJECT(this),TQT_SLOT(slotProcessResult(TQStringList)));
return true;
}
} else {
if (result.startsWith("-----BEGIN PGP PRIVATE KEY BLOCK")) {
qfile.close();
KMessageBox::information(0,i18n("This file is a private key.\nPlease use kgpg key management to import it."));
KIO::NetAccess::removeTempFile(fileToCheck);
return true;
}
setText(result);
qfile.close();
KIO::NetAccess::removeTempFile(fileToCheck);
}
}
return false;
}
void MyEditor::editorUpdateDecryptedtxt(TQString newtxt)
{
setText(newtxt);
}
void MyEditor::editorFailedDecryptedtxt(TQString newtxt)
{
if (!slotCheckContent(tempFile,false))
KMessageBox::detailedSorry(this,i18n("Decryption failed."),newtxt);
}
void MyEditor::slotDecodeFile(TQString fname)
{
//////////////// decode file from given url into editor
TQFile qfile(TQFile::encodeName(fname));
if (qfile.open(IO_ReadOnly)) {
KgpgInterface *txtDecrypt=new KgpgInterface();
connect (txtDecrypt,TQT_SIGNAL(txtdecryptionfinished(TQString)),TQT_TQOBJECT(this),TQT_SLOT(editorUpdateDecryptedtxt(TQString)));
connect (txtDecrypt,TQT_SIGNAL(txtdecryptionfailed(TQString)),TQT_TQOBJECT(this),TQT_SLOT(editorFailedDecryptedtxt(TQString)));
txtDecrypt->KgpgDecryptFileToText(KURL(fname),TQStringList::split(TQString(" "),KGpgSettings::customDecrypt().simplifyWhiteSpace()));
} else
KMessageBox::sorry(this,i18n("Unable to read file."));
}
void MyEditor::slotProcessResult(TQStringList iKeys)
{
emit refreshImported(iKeys);
KIO::NetAccess::removeTempFile(tempFile);
tempFile=TQString();
}
////////////////////////// main view configuration
KgpgView::KgpgView(TQWidget *parent, const char *name) : TQWidget(parent, name)
{
editor=new MyEditor(this);
windowAutoClose=true;
///// tqlayout
TQVBoxLayout *vbox=new TQVBoxLayout(this,3);
editor->setReadOnly( false );
editor->setUndoRedoEnabled(true);
editor->setUndoDepth(5);
setAcceptDrops(true);
KButtonBox *boutonbox=new KButtonBox(this,Qt::Horizontal,15,12);
boutonbox->addStretch(1);
bouton0=boutonbox->addButton(i18n("S&ign/Verify"),TQT_TQOBJECT(this),TQT_SLOT(clearSign()),TRUE);
bouton1=boutonbox->addButton(i18n("En&crypt"),TQT_TQOBJECT(this),TQT_SLOT(popuppublic()),TRUE);
bouton2=boutonbox->addButton(i18n("&Decrypt"),TQT_TQOBJECT(this),TQT_SLOT(slotdecode()),TRUE);
TQObject::connect(editor,TQT_SIGNAL(textChanged()),TQT_TQOBJECT(this),TQT_SLOT(modified()));
boutonbox->tqlayout();
editor->resize(editor->maximumSize());
vbox->addWidget(editor);
vbox->addWidget(boutonbox);
}
void KgpgView::modified()
{
/////////////// notify for changes in editor window
KgpgApp *win=(KgpgApp *) parent();
if (win->fileSave->isEnabled()==false) {
TQString capt=win->Docname.fileName();
if (capt.isEmpty())
capt=i18n("untitled");
win->setCaption(capt,true);
win->fileSave->setEnabled(true);
win->editUndo->setEnabled(true);
}
}
void KgpgView::slotAskForImport(TQString ID)
{
if (KMessageBox::questionYesNo(0,i18n("<qt><b>Missing signature:</b><br>Key id: %1<br><br>"
"Do you want to import this key from a keyserver?</qt>").tqarg(ID),i18n("Missing Key"), TQString(), i18n("Import"), i18n("Do Not Import"))==KMessageBox::Yes) {
keyServer *kser=new keyServer(0,"server_dialog",false,true);
kser->page->kLEimportid->setText(ID);
kser->slotImport();
windowAutoClose=false;
}
else emit verifyFinished();
}
void KgpgView::slotVerifyResult(TQString mssge,TQString log)
{
emit verifyFinished();
//KMessageBox::information(0,mssge);
(void) new KDetailedInfo(0,"verify_result",mssge,log);
}
void KgpgView::clearSign()
{
TQString mess=editor->text();
if (mess.startsWith("-----BEGIN PGP SIGNED")) {
////////////////////// this is a signed message, verify it
KgpgInterface *verifyProcess=new KgpgInterface();
connect(verifyProcess,TQT_SIGNAL(missingSignature(TQString)),TQT_TQOBJECT(this),TQT_SLOT(slotAskForImport(TQString)));
connect(verifyProcess,TQT_SIGNAL(verifyOver(TQString,TQString)),TQT_TQOBJECT(this),TQT_SLOT(slotVerifyResult(TQString,TQString)));
verifyProcess->KgpgVerifyText(mess);
}
else {
///// Sign the text in Editor
TQString signKeyID;
///// open key selection dialog
KgpgSelKey *opts=new KgpgSelKey(this,0);
if (opts->exec()==TQDialog::Accepted) {
signKeyID=opts->getkeyID();
} else {
delete opts;
return;
}
delete opts;
KgpgInterface *signProcess=new KgpgInterface();
connect(signProcess,TQT_SIGNAL(txtSignOver(TQString)),TQT_TQOBJECT(this),TQT_SLOT(slotSignResult(TQString)));
TQStringList options=NULL;
if (KGpgSettings::pgpCompatibility())
options<<"--pgp6";
signProcess->KgpgSignText(mess,signKeyID,options);
}
}
void KgpgView::slotSignResult(TQString signResult)
{
if (signResult.isEmpty())
KMessageBox::sorry(this,i18n("Signing not possible: bad passphrase or missing key"));
else
{
editor->setText(signResult);
emit resetEncoding(false);
KgpgApp *win=(KgpgApp *) parent();
win->editRedo->setEnabled(false);
win->editUndo->setEnabled(false);
}
}
void KgpgView::popuppublic()
{
///// popup dialog to select public key for encryption
//////// open dialog --> popuppublic.cpp
popupPublic *dialogue=new popupPublic(this, "public_keys", 0,false,((KgpgApp *) parent())->goDefaultKey);
connect(dialogue,TQT_SIGNAL(selectedKey(TQStringList,TQStringList,bool,bool)),TQT_TQOBJECT(this),TQT_SLOT(encodetxt(TQStringList,TQStringList,bool,bool)));
dialogue->exec();
delete dialogue;
}
////////////////////////////////////////////////////////////////////////////////////// decode
void KgpgView::slotdecode()
{
/////////////// decode data from the editor. triggered by the decode button
TQString dests,encUsers;
messages=TQString();
//TQString resultat=KgpgInterface::KgpgDecryptText(editor->text(),encUsers);
KgpgInterface *txtDecrypt=new KgpgInterface();
connect (txtDecrypt,TQT_SIGNAL(txtdecryptionfinished(TQString)),TQT_TQOBJECT(this),TQT_SLOT(updateDecryptedtxt(TQString)));
connect (txtDecrypt,TQT_SIGNAL(txtdecryptionfailed(TQString)),TQT_TQOBJECT(this),TQT_SLOT(failedDecryptedtxt(TQString)));
txtDecrypt->KgpgDecryptText(editor->text(),TQStringList::split(TQString(" "),KGpgSettings::customDecrypt().simplifyWhiteSpace()));
/*
KgpgApp *win=(KgpgApp *) parent();
if (!resultat.isEmpty()) {
editor->setText(resultat);
win->editRedo->setEnabled(false);
win->editUndo->setEnabled(false);
}*/
}
void KgpgView::updateDecryptedtxt(TQString newtxt)
{
//kdDebug(2100)<<"UTF8 Test Result--------------"<<KgpgView::checkForUtf8()<<endl;
editor->setText(newtxt);
emit resetEncoding(false);
}
bool KgpgView::checkForUtf8(TQString text)
{ //// try to guess if the decrypted text uses utf-8 encoding
TQTextCodec *codec =TQTextCodec::codecForLocale ();
if (codec->canEncode(text)) return true;
return false;
}
void KgpgView::failedDecryptedtxt(TQString newtxt)
{
KMessageBox::detailedSorry(this,i18n("Decryption failed."),newtxt);
}
void KgpgView::encodetxt(TQStringList selec,TQStringList encryptOptions,bool, bool symmetric)
{
////////////////// encode from editor
if (KGpgSettings::pgpCompatibility())
encryptOptions<<"--pgp6";
if (symmetric) selec.clear();
KgpgInterface *txtCrypt=new KgpgInterface();
connect (txtCrypt,TQT_SIGNAL(txtencryptionfinished(TQString)),TQT_TQOBJECT(this),TQT_SLOT(updatetxt(TQString)));
txtCrypt->KgpgEncryptText(editor->text(),selec,encryptOptions);
//KMessageBox::sorry(0,"OVER");
//KgpgInterface::KgpgEncryptText(editor->text(),selec,encryptOptions);
//if (!resultat.isEmpty()) editor->setText(resultat);
//else KMessageBox::sorry(this,i18n("Decryption failed."));
}
void KgpgView::updatetxt(TQString newtxt)
{
if (!newtxt.isEmpty())
editor->setText(newtxt);
else
KMessageBox::sorry(this,i18n("Encryption failed."));
}
KgpgView::~KgpgView()
{
delete editor;
}
/*
void KgpgView::print(TQPrinter *pPrinter)
{
TQPainter printpainter;
printpainter.begin(pPrinter);
// TODO: add your printing code here
printpainter.end();
}
*/
#include "kgpgview.moc"