/** * This file is part of GPGFrontend. * * GPGFrontend is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Foobar is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . * * The initial version of the source code is inherited from gpg4usb-team. * Their source code version also complies with GNU General Public License. * * The source code version of this software was modified and released * by Saturneric starting on May 12, 2021. * */ #ifndef __SGPGMEPP_CONTEXT_H__ #define __SGPGMEPP_CONTEXT_H__ #include #include "GpgConstants.h" #include "GpgGenKeyInfo.h" #include "GpgKey.h" using GpgKeyList = std::list; class GpgImportedKey { public: QString fpr; int importStatus; }; typedef std::list GpgImportedKeyList; class GpgImportInformation { public: GpgImportInformation() = default; int considered = 0; int no_user_id = 0; int imported = 0; int imported_rsa = 0; int unchanged = 0; int new_user_ids = 0; int new_sub_keys = 0; int new_signatures = 0; int new_revocations = 0; int secret_read = 0; int secret_imported = 0; int secret_unchanged = 0; int not_imported = 0; GpgImportedKeyList importedKeys; }; namespace GpgME { class GpgContext : public QObject { Q_OBJECT public: GpgContext(); ~GpgContext() override; [[nodiscard]] bool isGood() const; GpgImportInformation importKey(QByteArray inBuffer); [[nodiscard]] const GpgKeyList &getKeys() const; bool exportKeys(QStringList *uidList, QByteArray *outBuffer); bool exportKeys(const QVector &keys, QByteArray &outBuffer); bool generateKey(GenKeyInfo *params); bool generateSubkey(const GpgKey &key, GenKeyInfo *params); void deleteKeys(QStringList *uidList); gpg_error_t encrypt(QVector &keys, const QByteArray &inBuffer, QByteArray *outBuffer, gpgme_encrypt_result_t *result); gpgme_error_t encryptSign(QVector &keys, const QByteArray &inBuffer, QByteArray *outBuffer, gpgme_encrypt_result_t *encr_result, gpgme_sign_result_t *sign_result); gpgme_error_t decrypt(const QByteArray &inBuffer, QByteArray *outBuffer, gpgme_decrypt_result_t *result); gpgme_error_t decryptVerify(const QByteArray &inBuffer, QByteArray *outBuffer, gpgme_decrypt_result_t *decrypt_result, gpgme_verify_result_t *verify_result); void clearPasswordCache(); bool exportSecretKey(const GpgKey &key, QByteArray *outBuffer); void getSigners(QVector &signer); void setSigners(const QVector &keys); bool signKey(const GpgKey &target, const QString &uid, const QDateTime *expires); bool revSign(const GpgKey &key, const GpgKeySignature &signature); gpgme_error_t verify(QByteArray *inBuffer, QByteArray *sigBuffer, gpgme_verify_result_t *result); gpg_error_t sign(const QVector &keys, const QByteArray &inBuffer, QByteArray *outBuffer, bool detached = false, gpgme_sign_result_t *result = nullptr); bool addUID(const GpgKey &key, const GpgUID &uid); bool revUID(const GpgKey &key, const GpgUID &uid); bool setPrimaryUID(const GpgKey &key, const GpgUID &uid); bool setExpire(const GpgKey &key, const GpgSubKey *subkey, QDateTime *expires); QProcess * generateRevokeCert(const GpgKey &key, const QString &outputFileName); static bool checkIfKeyCanSign(const GpgKey &key); static bool checkIfKeyCanCert(const GpgKey &key); static bool checkIfKeyCanAuth(const GpgKey &key); static bool checkIfKeyCanEncr(const GpgKey &key); /** * @details If text contains PGP-message, put a linebreak before the message, * so that gpgme can decrypt correctly * * @param in Pointer to the QBytearray to check. */ static void preventNoDataErr(QByteArray *in); GpgKey getKeyByFpr(const QString &fpr); const GpgKey &getKeyById(const QString &id); static QString gpgErrString(gpgme_error_t err); static QString getGpgmeVersion(); /** * @brief * * @param text * @return \li 2, if the text is completly signed, * \li 1, if the text is partially signed, * \li 0, if the text is not signed at all. */ static int textIsSigned(const QByteArray &text); static QString beautifyFingerprint(QString fingerprint); signals: void signalKeyDBChanged(); void signalKeyUpdated(QString key_id); void signalKeyInfoChanged(); private slots: void slotRefreshKeyList(); void slotUpdateKeyList(const QString &key_id); private: gpgme_ctx_t mCtx{}; gpgme_data_t in{}; gpgme_error_t err; bool debug; bool good = true; static gpgme_error_t readToBuffer(gpgme_data_t dataIn, QByteArray *outBuffer); QByteArray mPasswordCache; QSettings settings; GpgKeyList mKeyList; QMap mKeyMap; void fetch_keys(); static void checkErr(gpgme_error_t gpgmeError); static void checkErr(gpgme_error_t gpgmeError, const QString &comment); static gpgme_error_t passphraseCb(void *hook, const char *uid_hint, const char *passphrase_info, int last_was_bad, int fd); gpgme_error_t passphrase(const char *uid_hint, const char *passphrase_info, int last_was_bad, int fd); QProcess * executeGpgCommand(const QStringList &arguments, QByteArray *stdOut, QByteArray *stdErr, const std::function &interactFunc); QString gpgExec; QString gpgKeys; }; } // namespace GpgME #endif // __SGPGMEPP_CONTEXT_H__