File indexing completed on 2024-03-24 05:53:30
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 }