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