1 /*
2 SPDX-FileCopyrightText: 2011, 2012, 2013, 2016, 2017 Rolf Eike Beer <kde@opensource.sf-tec.de>
3 SPDX-License-Identifier: GPL-2.0-or-later
4 */
5
6 #include "kgpgencrypt.h"
7
8 #include "kgpgsettings.h"
9 #include "gpgproc.h"
10
trustOptions(const QString & binary)11 static QStringList trustOptions(const QString &binary)
12 {
13 const int gpgver = GPGProc::gpgVersion(GPGProc::gpgVersionString(binary));
14 QStringList args;
15 if (gpgver >= 0x10302)
16 args << QLatin1String("--trust-model")
17 << QLatin1String("always");
18 else
19 args << QLatin1String("--always-trust");
20
21 return args;
22 }
23
KGpgEncrypt(QObject * parent,const QStringList & userIds,const QString & text,const EncryptOptions & options,const QStringList & extraOptions)24 KGpgEncrypt::KGpgEncrypt(QObject *parent, const QStringList &userIds, const QString &text, const EncryptOptions &options, const QStringList &extraOptions)
25 : KGpgTextOrFileTransaction(parent, text),
26 m_fileIndex(-1),
27 m_options(options),
28 m_userIds(userIds),
29 m_extraOptions(extraOptions)
30 {
31 if ((m_options & AllowUntrustedEncryption) && !m_userIds.isEmpty())
32 m_extraOptions << trustOptions(getProcess()->program().at(0));
33 }
34
KGpgEncrypt(QObject * parent,const QStringList & userIds,const QList<QUrl> & files,const EncryptOptions & options,const QStringList & extraOptions)35 KGpgEncrypt::KGpgEncrypt(QObject *parent, const QStringList &userIds, const QList<QUrl> &files, const EncryptOptions &options, const QStringList &extraOptions)
36 : KGpgTextOrFileTransaction(parent, files),
37 m_fileIndex(0),
38 m_options(options),
39 m_userIds(userIds),
40 m_extraOptions(extraOptions)
41 {
42 if ((m_options & AllowUntrustedEncryption) && !m_userIds.isEmpty())
43 m_extraOptions << trustOptions(getProcess()->program().at(0));
44 }
45
~KGpgEncrypt()46 KGpgEncrypt::~KGpgEncrypt()
47 {
48 }
49
50 QStringList
command() const51 KGpgEncrypt::command() const
52 {
53 QStringList ret = m_extraOptions;
54
55 if (m_options.testFlag(AsciiArmored))
56 ret << QLatin1String("--armor");
57
58 if (m_userIds.isEmpty()) {
59 ret << QLatin1String( "--symmetric" );
60 } else {
61 if (m_options.testFlag(HideKeyId))
62 ret << QLatin1String("--throw-keyid");
63
64 ret.reserve(ret.size() + 2 * m_userIds.size() + 1);
65 for (const QString &uid : m_userIds)
66 ret << QLatin1String( "--recipient" ) << uid;
67 ret << QLatin1String( "--encrypt" );
68 }
69
70 return ret;
71 }
72
73 QStringList
encryptedText() const74 KGpgEncrypt::encryptedText() const
75 {
76 QStringList result;
77
78 for (const QString &line : getMessages())
79 if (!line.startsWith(QLatin1String("[GNUPG:] ")))
80 result.append(line);
81
82 return result;
83 }
84
85 bool
nextLine(const QString & line)86 KGpgEncrypt::nextLine(const QString &line)
87 {
88 const QList<QUrl> &inputFiles = getInputFiles();
89
90 if (!inputFiles.isEmpty()) {
91 static const QString encStart = QLatin1String("[GNUPG:] FILE_START 2 ");
92 static const QString encDone = QLatin1String("[GNUPG:] FILE_DONE");
93
94 if (line.startsWith(encStart)) {
95 m_currentFile = line.mid(encStart.length());
96 Q_EMIT statusMessage(i18nc("Status message 'Encrypting <filename>' (operation starts)", "Encrypting %1", m_currentFile));
97 Q_EMIT infoProgress(2 * m_fileIndex + 1, inputFiles.count() * 2);
98 } else if (line == encDone) {
99 Q_EMIT statusMessage(i18nc("Status message 'Encrypted <filename>' (operation was completed)", "Encrypted %1", m_currentFile));
100 m_fileIndex++;
101 Q_EMIT infoProgress(2 * m_fileIndex, inputFiles.count() * 2);
102 }
103 }
104
105 return KGpgTextOrFileTransaction::nextLine(line);
106 }
107
108 KGpgTransaction::ts_boolanswer
confirmOverwrite(QUrl & currentFile)109 KGpgEncrypt::confirmOverwrite(QUrl ¤tFile)
110 {
111 const QString ext = encryptExtension(m_options.testFlag(AsciiArmored));
112
113 if (m_currentFile.isEmpty())
114 currentFile = QUrl::fromLocalFile(getInputFiles().at(m_fileIndex).toLocalFile() + ext);
115 else
116 currentFile = QUrl::fromLocalFile(m_currentFile + ext);
117 return BA_UNKNOWN;
118 }
119
120
121 QString
encryptExtension(const bool ascii)122 KGpgEncrypt::encryptExtension(const bool ascii)
123 {
124 if (ascii)
125 return QLatin1String( ".asc" );
126 else if (KGpgSettings::pgpExtension())
127 return QLatin1String( ".pgp" );
128 else
129 return QLatin1String( ".gpg" );
130 }
131