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