File indexing completed on 2024-04-28 09:46:02

0001 #include "common.h"
0002 #include "../kgpginterface.h"
0003 #include "../kgpgsettings.h"
0004 #include "../transactions/kgpgtransaction.h"
0005 
0006 #include <gpgme.h>
0007 #include <QDir>
0008 #include <QFile>
0009 #include <QIODevice>
0010 #include <QProcess>
0011 #include <QTemporaryDir>
0012 #include <QDebug>
0013 
0014 bool resetGpgConf(QTemporaryDir &basedir)
0015 {
0016     if (!basedir.isValid())
0017         return false;
0018 
0019     // export path from which kgpgsettings will pick up the kgpgrc
0020     qputenv("XDG_CONFIG_HOME", basedir.path().toUtf8());
0021 
0022     QFile kgpgconf(basedir.filePath(QLatin1String("kgpgrc")));
0023     if (!kgpgconf.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))
0024         return false;
0025 
0026     QDir dir(basedir.filePath(QLatin1String(".gnupg")));
0027     QString confPath = dir.filePath(QLatin1String("gpg.conf"));
0028 
0029     kgpgconf.write("[GPG Settings]\n"
0030             "gpg_config_path[$e]=" + confPath.toUtf8() + "\n"
0031             "[General Options]\n"
0032             "first run=false\n"
0033             );
0034     kgpgconf.close();
0035 
0036     // (re)create the home directory for GnuPG
0037     dir.removeRecursively();
0038     if (!dir.mkpath(dir.path()))
0039         return false;
0040     if (!QFile::setPermissions(dir.path(),
0041                    QFileDevice::ReadOwner | QFileDevice::WriteOwner |
0042                        QFileDevice::ExeOwner))
0043         return false;
0044 
0045     QFile conf(confPath);
0046     if (!conf.open(QIODevice::WriteOnly))
0047         return false;
0048 
0049     conf.write("keyserver  hkp://pool.sks-keyservers.net\n");
0050 
0051     return true;
0052 }
0053 
0054 QString readFile(const QString &filename)
0055 {
0056     QFile file(filename);
0057     if (file.open(QIODevice::ReadOnly))
0058         return QLatin1String(file.readAll());
0059     else
0060         return QString();
0061 }
0062 
0063 static QStringList configArguments(const QTemporaryDir &dir)
0064 {
0065     const QString conf = dir.filePath(QLatin1String(".gnupg/gpg.conf"));
0066     const QString gpgHome = dir.filePath(QLatin1String(".gnupg"));
0067     return { QLatin1String("--options"), conf, QLatin1String("--homedir"), gpgHome };
0068 }
0069 
0070 void addGpgKey(const QTemporaryDir &dir, const QString &file, const QString &password)
0071 {
0072     QString command = QLatin1String("gpg");
0073     QStringList args;
0074     args.push_back(QLatin1String("--no-secmem-warning"));
0075     args.push_back(QLatin1String("--no-tty"));
0076     args.push_back(QLatin1String("--batch"));
0077     if (!password.isEmpty()) {
0078         args.push_back(QLatin1String("--passphrase"));
0079         args.push_back(password);
0080     }
0081     args << configArguments(dir);
0082     args.push_back(QLatin1String("--debug-level"));
0083     args.push_back(QLatin1String("none"));
0084     args.push_back(QLatin1String("--status-fd=1"));
0085     args.push_back(QLatin1String("--import"));
0086     args.push_back(QLatin1String("--allow-secret-key-import"));
0087     args.push_back(QLatin1String("--command-fd=0"));
0088     args.push_back(file);
0089     QProcess process;
0090     process.execute(command, args);
0091     qDebug() << "Added Gpg key: " << file;
0092 }
0093 
0094 void addPasswordArguments(KGpgTransaction *transaction, const QString &passphrase)
0095 {
0096     QStringList args;
0097     args.push_back(QLatin1String("--batch"));
0098     args.push_back(QLatin1String("--passphrase"));
0099     args.push_back(passphrase);
0100     args.push_back(QLatin1String("--pinentry-mode"));
0101     args.push_back(QLatin1String("loopback"));
0102     transaction->insertArguments(1, args);
0103 }
0104 
0105 bool hasPhoto(const QTemporaryDir &dir, const QString &id)
0106 {
0107     QStringList args{ QLatin1String("--list-keys"), id };
0108     QString command = QLatin1String("gpg");
0109     QProcess process;
0110     process.start(command, configArguments(dir) << args);
0111     process.waitForFinished();
0112     QString output = QLatin1String(process.readAllStandardOutput());
0113     qDebug()<< output;
0114     return output.contains(QLatin1String("image"));
0115 }