1 #include "common.h"
2 #include "../kgpginterface.h"
3 #include "../kgpgsettings.h"
4 #include "../transactions/kgpgtransaction.h"
5 
6 #include <gpgme.h>
7 #include <QDir>
8 #include <QFile>
9 #include <QIODevice>
10 #include <QProcess>
11 #include <QTemporaryDir>
12 #include <QDebug>
13 
resetGpgConf(QTemporaryDir & basedir)14 bool resetGpgConf(QTemporaryDir &basedir)
15 {
16 	if (!basedir.isValid())
17 		return false;
18 
19 	// export path from which kgpgsettings will pick up the kgpgrc
20 	qputenv("XDG_CONFIG_HOME", basedir.path().toUtf8());
21 
22 	QFile kgpgconf(basedir.filePath(QLatin1String("kgpgrc")));
23 	if (!kgpgconf.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
24 		return false;
25 
26 	QDir dir(basedir.filePath(QLatin1String(".gnupg")));
27 	QString confPath = dir.filePath(QLatin1String("gpg.conf"));
28 
29 	kgpgconf.write("[GPG Settings]\n"
30 			"gpg_config_path[$e]=" + confPath.toUtf8() + "\n"
31 			"[General Options]\n"
32 			"first run=false\n"
33 			);
34 	kgpgconf.close();
35 
36 	// (re)create the home directory for GnuPG
37 	dir.removeRecursively();
38 	if (!dir.mkpath(dir.path()))
39 		return false;
40 	if (!QFile::setPermissions(dir.path(),
41 				   QFileDevice::ReadOwner | QFileDevice::WriteOwner |
42 					   QFileDevice::ExeOwner))
43 		return false;
44 
45 	QFile conf(confPath);
46 	if (!conf.open(QIODevice::WriteOnly))
47 		return false;
48 
49 	conf.write("keyserver  hkp://pool.sks-keyservers.net\n");
50 
51 	return true;
52 }
53 
readFile(const QString & filename)54 QString readFile(const QString &filename)
55 {
56 	QFile file(filename);
57 	if (file.open(QIODevice::ReadOnly))
58 		return QLatin1String(file.readAll());
59 	else
60 		return QString();
61 }
62 
configArguments(const QTemporaryDir & dir)63 static QStringList configArguments(const QTemporaryDir &dir)
64 {
65 	const QString conf = dir.filePath(QLatin1String(".gnupg/gpg.conf"));
66 	const QString gpgHome = dir.filePath(QLatin1String(".gnupg"));
67 	return { QLatin1String("--options"), conf, QLatin1String("--homedir"), gpgHome };
68 }
69 
addGpgKey(QTemporaryDir & dir,const QString & file,const QString & password)70 void addGpgKey(QTemporaryDir &dir, const QString &file, const QString &password)
71 {
72 	QString command = QLatin1String("gpg");
73 	QStringList args;
74 	args.push_back(QLatin1String("--no-secmem-warning"));
75 	args.push_back(QLatin1String("--no-tty"));
76 	args.push_back(QLatin1String("--batch"));
77 	if (!password.isEmpty()) {
78 		args.push_back(QLatin1String("--passphrase"));
79 		args.push_back(password);
80 	}
81 	args << configArguments(dir);
82 	args.push_back(QLatin1String("--debug-level"));
83 	args.push_back(QLatin1String("none"));
84 	args.push_back(QLatin1String("--status-fd=1"));
85 	args.push_back(QLatin1String("--import"));
86 	args.push_back(QLatin1String("--allow-secret-key-import"));
87 	args.push_back(QLatin1String("--command-fd=0"));
88 	args.push_back(file);
89 	QProcess process;
90 	process.execute(command, args);
91 	qDebug() << "Added Gpg key: " << file;
92 }
93 
addPasswordArguments(KGpgTransaction * transaction,const QString & passphrase)94 void addPasswordArguments(KGpgTransaction *transaction, const QString &passphrase)
95 {
96 	QStringList args;
97 	args.push_back(QLatin1String("--batch"));
98 	args.push_back(QLatin1String("--passphrase"));
99 	args.push_back(passphrase);
100 	args.push_back(QLatin1String("--pinentry-mode"));
101 	args.push_back(QLatin1String("loopback"));
102 	transaction->insertArguments(1, args);
103 }
104 
hasPhoto(QTemporaryDir & dir,const QString & id)105 bool hasPhoto(QTemporaryDir &dir, const QString &id)
106 {
107 	QStringList args{ QLatin1String("--list-keys"), id };
108 	QString command = QLatin1String("gpg");
109 	QProcess process;
110 	process.start(command, configArguments(dir) << args);
111 	process.waitForFinished();
112 	QString output = QLatin1String(process.readAllStandardOutput());
113 	qDebug()<< output;
114 	return output.contains(QLatin1String("image"));
115 }
116