mirror of
https://bitbucket.org/smil3y/kde-extraapps.git
synced 2025-02-24 02:42:52 +00:00
141 lines
4 KiB
C++
141 lines
4 KiB
C++
/*
|
|
* Copyright (C) 2010,2011,2012 Rolf Eike Beer <kde@opensource.sf-tec.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. *
|
|
* *
|
|
***************************************************************************/
|
|
|
|
#include "kgpgdecrypt.h"
|
|
|
|
#include "gpgproc.h"
|
|
#include "kgpgsettings.h"
|
|
|
|
#include <KLocale>
|
|
|
|
KGpgDecrypt::KGpgDecrypt(QObject *parent, const QString &text)
|
|
: KGpgTextOrFileTransaction(parent, text),
|
|
m_fileIndex(-1),
|
|
m_plainLength(-1)
|
|
{
|
|
}
|
|
|
|
KGpgDecrypt::KGpgDecrypt(QObject *parent, const KUrl::List &files)
|
|
: KGpgTextOrFileTransaction(parent, files),
|
|
m_fileIndex(0),
|
|
m_plainLength(-1)
|
|
{
|
|
}
|
|
|
|
KGpgDecrypt::KGpgDecrypt(QObject* parent, const KUrl& infile, const KUrl& outfile)
|
|
: KGpgTextOrFileTransaction(parent, KUrl::List(infile)),
|
|
m_fileIndex(0),
|
|
m_plainLength(-1),
|
|
m_outFilename(outfile.toLocalFile())
|
|
{
|
|
}
|
|
|
|
KGpgDecrypt::~KGpgDecrypt()
|
|
{
|
|
}
|
|
|
|
QStringList
|
|
KGpgDecrypt::command() const
|
|
{
|
|
QStringList ret;
|
|
|
|
ret << QLatin1String("--decrypt") << QLatin1String("--command-fd=0");
|
|
|
|
if (!m_outFilename.isEmpty())
|
|
ret << QLatin1String("-o") << m_outFilename;
|
|
|
|
ret << KGpgSettings::customDecrypt().simplified().split(QLatin1Char(' '), QString::SkipEmptyParts);
|
|
|
|
return ret;
|
|
}
|
|
|
|
QStringList
|
|
KGpgDecrypt::decryptedText() const
|
|
{
|
|
QStringList result;
|
|
int txtlength = 0;
|
|
|
|
foreach (const QString &line, getMessages())
|
|
if (!line.startsWith(QLatin1String("[GNUPG:] "))) {
|
|
result.append(line);
|
|
txtlength += line.length() + 1;
|
|
}
|
|
|
|
if (result.isEmpty())
|
|
return result;
|
|
|
|
QString last = result.last();
|
|
// this may happen when the original text did not end with a newline
|
|
if (last.endsWith(QLatin1String("[GNUPG:] DECRYPTION_OKAY"))) {
|
|
// if GnuPG doesn't tell us the length assume that this happend
|
|
// if it told us the length then check if it _really_ happend
|
|
if (((m_plainLength != -1) && (txtlength != m_plainLength)) ||
|
|
(m_plainLength == -1)) {
|
|
last.chop(24);
|
|
result[result.count() - 1] = last;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
}
|
|
|
|
bool
|
|
KGpgDecrypt::isEncryptedText(const QString &text, int *startPos, int *endPos)
|
|
{
|
|
int posStart = text.indexOf(QLatin1String("-----BEGIN PGP MESSAGE-----"));
|
|
if (posStart == -1)
|
|
return false;
|
|
|
|
int posEnd = text.indexOf(QLatin1String("-----END PGP MESSAGE-----"), posStart);
|
|
if (posEnd == -1)
|
|
return false;
|
|
|
|
if (startPos != NULL)
|
|
*startPos = posStart;
|
|
if (endPos != NULL)
|
|
*endPos = posEnd;
|
|
|
|
return true;
|
|
}
|
|
|
|
bool
|
|
KGpgDecrypt::nextLine(const QString& line)
|
|
{
|
|
const KUrl::List &inputFiles = getInputFiles();
|
|
|
|
if (!inputFiles.isEmpty()) {
|
|
if (line == QLatin1String("[GNUPG:] BEGIN_DECRYPTION")) {
|
|
emit statusMessage(i18nc("Status message 'Decrypting <filename>' (operation starts)", "Decrypting %1", inputFiles.at(m_fileIndex).fileName()));
|
|
emit infoProgress(2 * m_fileIndex + 1, inputFiles.count() * 2);
|
|
} else if (line == QLatin1String("[GNUPG:] END_DECRYPTION")) {
|
|
emit statusMessage(i18nc("Status message 'Decrypted <filename>' (operation was completed)", "Decrypted %1", inputFiles.at(m_fileIndex).fileName()));
|
|
m_fileIndex++;
|
|
emit infoProgress(2 * m_fileIndex, inputFiles.count() * 2);
|
|
}
|
|
} else {
|
|
if (line.startsWith(QLatin1String("[GNUPG:] PLAINTEXT_LENGTH "))) {
|
|
bool ok;
|
|
m_plainLength = line.mid(26).toInt(&ok);
|
|
if (!ok)
|
|
m_plainLength = -1;
|
|
} else if (line == QLatin1String("[GNUPG:] BEGIN_DECRYPTION")) {
|
|
// close the command channel (if any) to signal GnuPG that it
|
|
// can start sending the output.
|
|
getProcess()->closeWriteChannel();
|
|
}
|
|
}
|
|
|
|
return KGpgTextOrFileTransaction::nextLine(line);
|
|
}
|
|
|
|
#include "moc_kgpgdecrypt.cpp"
|