diff --git a/src/selftest/enginecheck.cpp b/src/selftest/enginecheck.cpp index ad275dbd7..95f1813d8 100644 --- a/src/selftest/enginecheck.cpp +++ b/src/selftest/enginecheck.cpp @@ -1,193 +1,195 @@ /* -*- mode: c++; c-basic-offset:4 -*- selftest/enginecheck.cpp This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2008 Klarälvdalens Datakonsult AB SPDX-License-Identifier: GPL-2.0-or-later */ #include #include "enginecheck.h" #include #include "implementation_p.h" #include #include #include #include #include #include "kleopatra_debug.h" #include #include #include #include using namespace Kleo; using namespace Kleo::_detail; using namespace GpgME; static QString engine_name(GpgME::Engine eng) { static const char *engines[] = { "gpg", "gpgsm", "gpgconf" }; return QString::fromLatin1(engines[eng]); } static QString test_name(GpgME::Engine eng) { - static const char *names[] = { - I18NC_NOOP("@title", "GPG (OpenPGP Backend) installation"), - I18NC_NOOP("@title", "GpgSM (S/MIME Backend) installation"), - I18NC_NOOP("@title", "GpgConf (Configuration) installation"), - }; - return i18nc("@title", names[eng]); + if (eng == GpgME::GpgEngine) { + return i18nc("@title", "GPG (OpenPGP Backend) installation"); + } else if (eng == GpgME::GpgSMEngine) { + return i18nc("@title", "GpgSM (S/MIME Backend) installation"); + } else if (eng == GpgME::GpgConfEngine) { + return i18nc ("@title", "GpgConf (Configuration) installation"); + } + return QStringLiteral("unknown"); } namespace { class EngineCheck : public SelfTestImplementation { public: explicit EngineCheck(GpgME::Engine eng) : SelfTestImplementation(test_name(eng)) { runTest(eng); } void runTest(GpgME::Engine eng) { // First use the crypto config which is much faster because it is only // created once and then kept in memory. Only if the crypoconfig is // bad we check into the engine info. const auto conf = QGpgME::cryptoConfig(); if (conf && eng == GpgME::GpgEngine) { m_passed = true; return; } else if (conf) { const auto comp = conf->component(engine_name(eng)); if (comp) { m_passed = true; return; } } // Problem with the config. Try to get more details: const Error err = GpgME::checkEngine(eng); Q_ASSERT(!err.code() || err.code() == GPG_ERR_INV_ENGINE); m_passed = !err; if (m_passed) { return; } m_explanation = xi18nc("@info", "A problem was detected with the %1 backend.", engine_name(eng)); const EngineInfo ei = engineInfo(eng); if (ei.isNull()) { m_error = i18n("not supported"); m_explanation += xi18nc("@info", "It seems that the gpgme library was compiled without " "support for this backend."); m_proposedFix += xi18nc("@info", "Replace the gpgme library with a version compiled " "with %1 support.", engine_name(eng)); } else if (ei.fileName() && (!ei.version() || !strcmp(ei.version(), "1.0.0"))) { // GPGSM only got the ei.version() working with 1.0.0 so 1.0.0 is returned as // a fallback if the version could not be checked. We assume that it's not properly // installed in that case. m_error = i18n("not properly installed"); m_explanation += xi18nc("@info", "Backend %1 is not installed properly.", QFile::decodeName(ei.fileName())); m_proposedFix += xi18nc("@info", "Please check the output of %1 --version manually.", QFile::decodeName(ei.fileName())); } else if (ei.fileName() && ei.version() && ei.requiredVersion()) { m_error = i18n("too old"); m_explanation += xi18nc("@info", "Backend %1 is installed in version %2, " "but at least version %3 is required.", QFile::decodeName(ei.fileName()), QString::fromUtf8(ei.version()), QString::fromUtf8(ei.requiredVersion())); m_proposedFix += xi18nc("@info", "Install %1 version %2 or higher.", engine_name(eng), QString::fromUtf8(ei.requiredVersion())); } else { m_error = m_explanation = i18n("unknown problem"); m_proposedFix += xi18nc("@info", "Make sure %1 is installed and " "in PATH.", engine_name(eng)); } } }; } std::shared_ptr Kleo::makeGpgEngineCheckSelfTest() { return std::shared_ptr(new EngineCheck(GpgME::GpgEngine)); } std::shared_ptr Kleo::makeGpgSmEngineCheckSelfTest() { return std::shared_ptr(new EngineCheck(GpgME::GpgSMEngine)); } std::shared_ptr Kleo::makeGpgConfEngineCheckSelfTest() { return std::shared_ptr(new EngineCheck(GpgME::GpgConfEngine)); } // // SelfTestImplementation (parts) // bool SelfTestImplementation::ensureEngineVersion(GpgME::Engine engine, int major, int minor, int patch) { const Error err = GpgME::checkEngine(engine); Q_ASSERT(!err || err.code() == GPG_ERR_INV_ENGINE); m_skipped = err || !engineIsVersion(major, minor, patch, engine); if (!m_skipped) { return true; } const char *version = GpgME::engineInfo(engine).version(); if (!err && version) { // properly installed, but too old m_explanation = xi18nc("@info", "%1 v%2.%3.%4 is required for this test, but only %5 is installed.", engine_name(engine), major, minor, patch, QString::fromUtf8(version)); m_proposedFix += xi18nc("@info", "Install %1 version %2 or higher.", engine_name(engine), QStringLiteral("%1.%2.%3").arg(major).arg(minor).arg(patch)); } else { // not properly installed m_explanation = xi18nc("@info", "%1 is required for this test, but does not seem available." "See tests further up for more information.", engine_name(engine)); m_proposedFix = xi18nc("@info %1: test name", "See \"%1\" above.", test_name(engine)); } return false; }