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 &currentFile)
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