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"