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.
tdenetwork/kopete/plugins/cryptography/kgpginterface.cpp

177 lines
5.1 KiB

#include "cryptographyplugin.h" //(for the cached passphrase)
//Code from KGPG
/***************************************************************************
kgpginterface.cpp - description
-------------------
begin : Mon Jul 8 2002
copyright : (C) 2002 by y0k0
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 <klocale.h>
#include <kpassdlg.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <tqfile.h>
#include <kprocio.h>
//#include "kdetailedconsole.h"
#include "kgpginterface.h"
KgpgInterface::KgpgInterface()
{}
KgpgInterface::~KgpgInterface()
{}
TQString KgpgInterface::KgpgEncryptText(TQString text,TQString userIDs, TQString Options)
{
FILE *fp;
TQString dests,encResult;
char buffer[200];
userIDs=userIDs.stripWhiteSpace();
userIDs=userIDs.simplifyWhiteSpace();
Options=Options.stripWhiteSpace();
int ct=userIDs.find(" ");
while (ct!=-1) // if multiple keys...
{
dests+=" --recipient "+userIDs.section(' ',0,0);
userIDs.remove(0,ct+1);
ct=userIDs.find(" ");
}
dests+=" --recipient "+userIDs;
TQCString gpgcmd = "echo -n ";
gpgcmd += KShellProcess::quote( text ).utf8();
gpgcmd += " | gpg --no-secmem-warning --no-tty ";
gpgcmd += Options.local8Bit();
gpgcmd += " -e ";
gpgcmd += dests.local8Bit();
////////// encode with untrusted keys or armor if checked by user
fp = popen( gpgcmd, "r");
while ( fgets( buffer, sizeof(buffer), fp))
encResult+=buffer;
pclose(fp);
if( !encResult.isEmpty() )
return encResult;
else
return TQString();
}
TQString KgpgInterface::KgpgDecryptText(TQString text,TQString userID)
{
FILE *fp,*pass;
TQString encResult;
char buffer[200];
int counter=0,ppass[2];
TQCString password = CryptographyPlugin::cachedPass();
bool passphraseHandling=CryptographyPlugin::passphraseHandling();
while ((counter<3) && (encResult.isEmpty()))
{
counter++;
if(passphraseHandling && password.isNull())
{
/// pipe for passphrase
//userID=TQString::fromUtf8(userID);
userID.replace('<',"&lt;");
TQString passdlg=i18n("Enter passphrase for <b>%1</b>:").tqarg(userID);
if (counter>1)
passdlg.prepend(i18n("<b>Bad passphrase</b><br> You have %1 tries left.<br>").tqarg(TQString::number(4-counter)));
/// pipe for passphrase
int code=KPasswordDialog::getPassword(password,passdlg);
if (code!=TQDialog::Accepted)
return TQString();
CryptographyPlugin::setCachedPass(password);
}
if(passphraseHandling)
{
pipe(ppass);
pass = fdopen(ppass[1], "w");
fwrite(password, sizeof(char), strlen(password), pass);
// fwrite("\n", sizeof(char), 1, pass);
fclose(pass);
}
TQCString gpgcmd="echo ";
gpgcmd += KShellProcess::quote(text).utf8();
gpgcmd += " | gpg --no-secmem-warning --no-tty ";
if(passphraseHandling)
gpgcmd += "--passphrase-fd " + TQString::number(ppass[0]).local8Bit();
gpgcmd += " -d ";
////////// encode with untrusted keys or armor if checked by user
fp = popen(gpgcmd, "r");
while ( fgets( buffer, sizeof(buffer), fp))
encResult += TQString::fromUtf8(buffer);
pclose(fp);
password = TQCString();
}
if( !encResult.isEmpty() )
return encResult;
else
return TQString();
}
TQString KgpgInterface::checkForUtf8(TQString txt)
{
// code borrowed from gpa
const char *s;
/* Make sure the encoding is UTF-8.
* Test structure suggested by Werner Koch */
if (txt.isEmpty())
return TQString();
for (s = txt.ascii(); *s && !(*s & 0x80); s++)
;
if (*s && !strchr (txt.ascii(), 0xc3) && (txt.find("\\x")==-1))
return txt;
/* The string is not in UTF-8 */
//if (strchr (txt.ascii(), 0xc3)) return (txt+" +++");
if (txt.find("\\x")==-1)
return TQString::fromUtf8(txt.ascii());
// if (!strchr (txt.ascii(), 0xc3) || (txt.find("\\x")!=-1)) {
for ( int idx = 0 ; (idx = txt.find( "\\x", idx )) >= 0 ; ++idx ) {
char str[2] = "x";
str[0] = (char) TQString( txt.mid( idx + 2, 2 ) ).toShort( 0, 16 );
txt.replace( idx, 4, str );
}
if (!strchr (txt.ascii(), 0xc3))
return TQString::fromUtf8(txt.ascii());
else
return TQString::fromUtf8(TQString::fromUtf8(txt.ascii()).ascii()); // perform Utf8 twice, or some keys display badly
}
#include "kgpginterface.moc"