1 /*  commands/importcertificatefrompivcardcommand.cpp
2 
3     This file is part of Kleopatra, the KDE keymanager
4     SPDX-FileCopyrightText: 2020 g10 Code GmbH
5     SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de>
6 
7     SPDX-License-Identifier: GPL-2.0-or-later
8 */
9 
10 #include "importcertificatefrompivcardcommand.h"
11 
12 #include "cardcommand_p.h"
13 
14 #include "smartcard/pivcard.h"
15 #include "smartcard/readerstatus.h"
16 
17 #include "commands/importcertificatefromdatacommand.h"
18 
19 #include <KLocalizedString>
20 
21 #include "kleopatra_debug.h"
22 
23 using namespace Kleo;
24 using namespace Kleo::Commands;
25 using namespace Kleo::SmartCard;
26 
27 class ImportCertificateFromPIVCardCommand::Private : public CardCommand::Private
28 {
29     friend class ::Kleo::Commands::ImportCertificateFromPIVCardCommand;
q_func() const30     ImportCertificateFromPIVCardCommand *q_func() const
31     {
32         return static_cast<ImportCertificateFromPIVCardCommand *>(q);
33     }
34 public:
35     explicit Private(ImportCertificateFromPIVCardCommand *qq,
36                      const std::string &slot, const std::string &serialno);
37     ~Private() override;
38 
39 private:
40     void start();
41     void importFinished();
42     void importCanceled();
43 
44 private:
45     std::string cardSlot;
46     bool hasBeenCanceled = false;
47 };
48 
d_func()49 ImportCertificateFromPIVCardCommand::Private *ImportCertificateFromPIVCardCommand::d_func()
50 {
51     return static_cast<Private *>(d.get());
52 }
d_func() const53 const ImportCertificateFromPIVCardCommand::Private *ImportCertificateFromPIVCardCommand::d_func() const
54 {
55     return static_cast<const Private *>(d.get());
56 }
57 
58 #define q q_func()
59 #define d d_func()
60 
61 
Private(ImportCertificateFromPIVCardCommand * qq,const std::string & slot,const std::string & serialno)62 ImportCertificateFromPIVCardCommand::Private::Private(ImportCertificateFromPIVCardCommand *qq,
63                                                       const std::string &slot, const std::string &serialno)
64     : CardCommand::Private(qq, serialno, nullptr)
65     , cardSlot(slot)
66 {
67 }
68 
~Private()69 ImportCertificateFromPIVCardCommand::Private::~Private()
70 {
71 }
72 
start()73 void ImportCertificateFromPIVCardCommand::Private::start()
74 {
75     qCDebug(KLEOPATRA_LOG) << "ImportCertificateFromPIVCardCommand::Private::start()";
76 
77     const auto pivCard = ReaderStatus::instance()->getCard<PIVCard>(serialNumber());
78     if (!pivCard) {
79         error(i18n("Failed to find the PIV card with the serial number: %1", QString::fromStdString(serialNumber())));
80         finished();
81         return;
82     }
83 
84     const std::string certificateData = pivCard->certificateData(cardSlot);
85     if (certificateData.empty()) {
86         error(i18n("Sorry! No certificate to import from this card slot was found."));
87         finished();
88         return;
89     }
90 
91     auto cmd = new ImportCertificateFromDataCommand(QByteArray::fromStdString(certificateData), GpgME::CMS, i18n("Card Certificate"));
92     connect(cmd, &ImportCertificateFromDataCommand::finished,
93             q, [this]() { importFinished(); });
94     connect(cmd, &ImportCertificateFromDataCommand::canceled,
95             q, [this]() { importCanceled(); });
96     cmd->start();
97 }
98 
importFinished()99 void ImportCertificateFromPIVCardCommand::Private::importFinished()
100 {
101     qCDebug(KLEOPATRA_LOG) << "ImportCertificateFromPIVCardCommand::importFinished()";
102     if (!hasBeenCanceled) {
103         finished();
104     }
105 }
106 
importCanceled()107 void ImportCertificateFromPIVCardCommand::Private::importCanceled()
108 {
109     qCDebug(KLEOPATRA_LOG) << "ImportCertificateFromPIVCardCommand::importCanceled()";
110     hasBeenCanceled = true;
111     canceled();
112 }
113 
ImportCertificateFromPIVCardCommand(const std::string & cardSlot,const std::string & serialno)114 ImportCertificateFromPIVCardCommand::ImportCertificateFromPIVCardCommand(const std::string& cardSlot, const std::string &serialno)
115     : CardCommand(new Private(this, cardSlot, serialno))
116 {
117 }
118 
~ImportCertificateFromPIVCardCommand()119 ImportCertificateFromPIVCardCommand::~ImportCertificateFromPIVCardCommand()
120 {
121     qCDebug(KLEOPATRA_LOG) << "ImportCertificateFromPIVCardCommand::~ImportCertificateFromPIVCardCommand()";
122 }
123 
doStart()124 void ImportCertificateFromPIVCardCommand::doStart()
125 {
126     qCDebug(KLEOPATRA_LOG) << "ImportCertificateFromPIVCardCommand::doStart()";
127 
128     d->start();
129 }
130 
doCancel()131 void ImportCertificateFromPIVCardCommand::doCancel()
132 {
133 }
134 
135 #undef q_func
136 #undef d_func
137