File indexing completed on 2024-06-23 05:13:42

0001 /*  commands/importcertificatefrompivcardcommand.cpp
0002 
0003     This file is part of Kleopatra, the KDE keymanager
0004     SPDX-FileCopyrightText: 2020 g10 Code GmbH
0005     SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de>
0006 
0007     SPDX-License-Identifier: GPL-2.0-or-later
0008 */
0009 
0010 #include "importcertificatefrompivcardcommand.h"
0011 
0012 #include "cardcommand_p.h"
0013 
0014 #include "smartcard/pivcard.h"
0015 #include "smartcard/readerstatus.h"
0016 
0017 #include "commands/importcertificatefromdatacommand.h"
0018 
0019 #include <KLocalizedString>
0020 
0021 #include "kleopatra_debug.h"
0022 
0023 using namespace Kleo;
0024 using namespace Kleo::Commands;
0025 using namespace Kleo::SmartCard;
0026 
0027 class ImportCertificateFromPIVCardCommand::Private : public CardCommand::Private
0028 {
0029     friend class ::Kleo::Commands::ImportCertificateFromPIVCardCommand;
0030     ImportCertificateFromPIVCardCommand *q_func() const
0031     {
0032         return static_cast<ImportCertificateFromPIVCardCommand *>(q);
0033     }
0034 
0035 public:
0036     explicit Private(ImportCertificateFromPIVCardCommand *qq, const std::string &slot, const std::string &serialno);
0037     ~Private() override;
0038 
0039 private:
0040     void start();
0041     void importFinished();
0042     void importCanceled();
0043 
0044 private:
0045     std::string cardSlot;
0046     bool hasBeenCanceled = false;
0047 };
0048 
0049 ImportCertificateFromPIVCardCommand::Private *ImportCertificateFromPIVCardCommand::d_func()
0050 {
0051     return static_cast<Private *>(d.get());
0052 }
0053 const ImportCertificateFromPIVCardCommand::Private *ImportCertificateFromPIVCardCommand::d_func() const
0054 {
0055     return static_cast<const Private *>(d.get());
0056 }
0057 
0058 #define q q_func()
0059 #define d d_func()
0060 
0061 ImportCertificateFromPIVCardCommand::Private::Private(ImportCertificateFromPIVCardCommand *qq, const std::string &slot, const std::string &serialno)
0062     : CardCommand::Private(qq, serialno, nullptr)
0063     , cardSlot(slot)
0064 {
0065 }
0066 
0067 ImportCertificateFromPIVCardCommand::Private::~Private()
0068 {
0069 }
0070 
0071 void ImportCertificateFromPIVCardCommand::Private::start()
0072 {
0073     qCDebug(KLEOPATRA_LOG) << "ImportCertificateFromPIVCardCommand::Private::start()";
0074 
0075     const auto pivCard = ReaderStatus::instance()->getCard<PIVCard>(serialNumber());
0076     if (!pivCard) {
0077         error(i18n("Failed to find the PIV card with the serial number: %1", QString::fromStdString(serialNumber())));
0078         finished();
0079         return;
0080     }
0081 
0082     const std::string certificateData = pivCard->certificateData(cardSlot);
0083     if (certificateData.empty()) {
0084         error(i18n("Sorry! No certificate to import from this card slot was found."));
0085         finished();
0086         return;
0087     }
0088 
0089     auto cmd = new ImportCertificateFromDataCommand(QByteArray::fromStdString(certificateData), GpgME::CMS, i18n("Card Certificate"));
0090     connect(cmd, &ImportCertificateFromDataCommand::finished, q, [this]() {
0091         importFinished();
0092     });
0093     connect(cmd, &ImportCertificateFromDataCommand::canceled, q, [this]() {
0094         importCanceled();
0095     });
0096     cmd->start();
0097 }
0098 
0099 void ImportCertificateFromPIVCardCommand::Private::importFinished()
0100 {
0101     qCDebug(KLEOPATRA_LOG) << "ImportCertificateFromPIVCardCommand::importFinished()";
0102     if (!hasBeenCanceled) {
0103         finished();
0104     }
0105 }
0106 
0107 void ImportCertificateFromPIVCardCommand::Private::importCanceled()
0108 {
0109     qCDebug(KLEOPATRA_LOG) << "ImportCertificateFromPIVCardCommand::importCanceled()";
0110     hasBeenCanceled = true;
0111     canceled();
0112 }
0113 
0114 ImportCertificateFromPIVCardCommand::ImportCertificateFromPIVCardCommand(const std::string &cardSlot, const std::string &serialno)
0115     : CardCommand(new Private(this, cardSlot, serialno))
0116 {
0117 }
0118 
0119 ImportCertificateFromPIVCardCommand::~ImportCertificateFromPIVCardCommand()
0120 {
0121     qCDebug(KLEOPATRA_LOG) << "ImportCertificateFromPIVCardCommand::~ImportCertificateFromPIVCardCommand()";
0122 }
0123 
0124 void ImportCertificateFromPIVCardCommand::doStart()
0125 {
0126     qCDebug(KLEOPATRA_LOG) << "ImportCertificateFromPIVCardCommand::doStart()";
0127 
0128     d->start();
0129 }
0130 
0131 void ImportCertificateFromPIVCardCommand::doCancel()
0132 {
0133 }
0134 
0135 #undef q_func
0136 #undef d_func
0137 
0138 #include "moc_importcertificatefrompivcardcommand.cpp"