diff --git a/src/commands/changepincommand.cpp b/src/commands/changepincommand.cpp index fec5ac603a6b0534007cc7a2fbf7158388b7d94c..7c440a4cbcd1f74262e67b177f5e308f58b097a9 100644 --- a/src/commands/changepincommand.cpp +++ b/src/commands/changepincommand.cpp @@ -34,7 +34,7 @@ class ChangePinCommand::Private : public CardCommand::Private return static_cast(q); } public: - explicit Private(ChangePinCommand *qq, const std::string &serialNumber, QWidget *p); + explicit Private(ChangePinCommand *qq, const std::string &serialNumber, const std::string &appName, QWidget *p); ~Private(); void init(); @@ -46,6 +46,7 @@ private: void changePin(); private: + std::string appName; std::string keyRef; }; @@ -61,8 +62,9 @@ const ChangePinCommand::Private *ChangePinCommand::d_func() const #define d d_func() #define q q_func() -ChangePinCommand::Private::Private(ChangePinCommand *qq, const std::string &serialNumber, QWidget *p) +ChangePinCommand::Private::Private(ChangePinCommand *qq, const std::string &serialNumber, const std::string &appName_, QWidget *p) : CardCommand::Private(qq, serialNumber, p) + , appName(appName_) { } @@ -71,8 +73,8 @@ ChangePinCommand::Private::~Private() qCDebug(KLEOPATRA_LOG) << "ChangePinCommand::Private::~Private()"; } -ChangePinCommand::ChangePinCommand(const std::string &serialNumber, QWidget *p) - : CardCommand(new Private(this, serialNumber, p)) +ChangePinCommand::ChangePinCommand(const std::string &serialNumber, const std::string &appName, QWidget *p) + : CardCommand(new Private(this, serialNumber, appName, p)) { d->init(); } @@ -106,7 +108,7 @@ void ChangePinCommand::Private::changePin() { qCDebug(KLEOPATRA_LOG) << "ChangePinCommand::changePin()"; - const auto card = SmartCard::ReaderStatus::instance()->getCard(serialNumber()); + const auto card = SmartCard::ReaderStatus::instance()->getCard(serialNumber(), appName); if (!card) { error(i18n("Failed to find the smartcard with the serial number: %1", QString::fromStdString(serialNumber()))); finished(); diff --git a/src/commands/changepincommand.h b/src/commands/changepincommand.h index 164c56a9e66d42d44167869fb0f19d79973642dc..6a46e38dd33899614b9dc64e10d1b1271f0622b8 100644 --- a/src/commands/changepincommand.h +++ b/src/commands/changepincommand.h @@ -25,7 +25,7 @@ class ChangePinCommand : public CardCommand { Q_OBJECT public: - explicit ChangePinCommand(const std::string &serialNumber, QWidget *parent); + explicit ChangePinCommand(const std::string &serialNumber, const std::string &appName, QWidget *parent); ~ChangePinCommand() override; void setKeyRef(const std::string &keyRef); diff --git a/src/commands/keytocardcommand.cpp b/src/commands/keytocardcommand.cpp index 61f457025d44ba6356c465856aa37ededc3ee44b..a28c1270bc7f0eac67a029b1dca24132828d0274 100644 --- a/src/commands/keytocardcommand.cpp +++ b/src/commands/keytocardcommand.cpp @@ -50,8 +50,8 @@ class KeyToCardCommand::Private : public CardCommand::Private return static_cast(q); } public: - explicit Private(KeyToCardCommand *qq, const GpgME::Subkey &subkey, const std::string &serialno); - explicit Private(KeyToCardCommand *qq, const std::string &slot, const std::string &serialno); + explicit Private(KeyToCardCommand *qq, const GpgME::Subkey &subkey, const std::string &serialNumber, const std::string &appName); + explicit Private(KeyToCardCommand *qq, const std::string &slot, const std::string &serialNumber, const std::string &appName); ~Private(); private: @@ -67,6 +67,7 @@ private: void authenticationCanceled(); private: + std::string appName; GpgME::Subkey subkey; std::string cardSlot; bool overwriteExistingAlreadyApproved = false; @@ -88,14 +89,18 @@ const KeyToCardCommand::Private *KeyToCardCommand::d_func() const KeyToCardCommand::Private::Private(KeyToCardCommand *qq, const GpgME::Subkey &subkey_, - const std::string &serialno) - : CardCommand::Private(qq, serialno, nullptr), - subkey(subkey_) + const std::string &serialNumber, + const std::string &appName_ + ) + : CardCommand::Private(qq, serialNumber, nullptr) + , appName(appName_) + , subkey(subkey_) { } -KeyToCardCommand::Private::Private(KeyToCardCommand *qq, const std::string &slot, const std::string &serialno) - : CardCommand::Private(qq, serialno, nullptr) +KeyToCardCommand::Private::Private(KeyToCardCommand *qq, const std::string &slot, const std::string &serialNumber, const std::string &appName_) + : CardCommand::Private(qq, serialNumber, nullptr) + , appName(appName_) , cardSlot(slot) { } @@ -108,7 +113,7 @@ void KeyToCardCommand::Private::start() { qCDebug(KLEOPATRA_LOG) << "KeyToCardCommand::Private::start()"; - const auto card = SmartCard::ReaderStatus::instance()->getCard(serialNumber()); + const auto card = SmartCard::ReaderStatus::instance()->getCard(serialNumber(), appName); if (!card) { error(i18n("Failed to find the card with the serial number: %1", QString::fromStdString(serialNumber()))); finished(); @@ -359,13 +364,13 @@ void KeyToCardCommand::Private::authenticationCanceled() canceled(); } -KeyToCardCommand::KeyToCardCommand(const GpgME::Subkey &key, const std::string &serialno) - : CardCommand(new Private(this, key, serialno)) +KeyToCardCommand::KeyToCardCommand(const GpgME::Subkey &key, const std::string &serialNumber, const std::string &appName) + : CardCommand(new Private(this, key, serialNumber, appName)) { } -KeyToCardCommand::KeyToCardCommand(const std::string& cardSlot, const std::string &serialno) - : CardCommand(new Private(this, cardSlot, serialno)) +KeyToCardCommand::KeyToCardCommand(const std::string& cardSlot, const std::string &serialNumber, const std::string &appName) + : CardCommand(new Private(this, cardSlot, serialNumber, appName)) { } diff --git a/src/commands/keytocardcommand.h b/src/commands/keytocardcommand.h index e1898634f7ca78879f9c4b406ef1853feb7d3915..7ba6f90a6a12bf8f56f7b3b94112267b095095bb 100644 --- a/src/commands/keytocardcommand.h +++ b/src/commands/keytocardcommand.h @@ -25,8 +25,8 @@ class KeyToCardCommand : public CardCommand { Q_OBJECT public: - KeyToCardCommand(const GpgME::Subkey &key, const std::string &serialno); - KeyToCardCommand(const std::string& cardSlot, const std::string &serialno); + KeyToCardCommand(const GpgME::Subkey &key, const std::string &serialNumber, const std::string &appName); + KeyToCardCommand(const std::string &cardSlot, const std::string &serialNumber, const std::string &appName); ~KeyToCardCommand() override; static bool supported(); diff --git a/src/dialogs/subkeyswidget.cpp b/src/dialogs/subkeyswidget.cpp index 9841f03d46bb7abd9acc51b6a5e58ac108c1418f..02ce3a11c0702c4056a6bacb14bd0e2b33ca5198 100644 --- a/src/dialogs/subkeyswidget.cpp +++ b/src/dialogs/subkeyswidget.cpp @@ -134,7 +134,7 @@ void SubKeysWidget::Private::tableContextMenuRequested(const QPoint &p) menu->addAction(QIcon::fromTheme(QStringLiteral("send-to-symbolic")), i18n("Transfer to smartcard"), q, [this, subkey, card]() { - auto cmd = new Kleo::Commands::KeyToCardCommand(subkey, card->serialNumber()); + auto cmd = new Kleo::Commands::KeyToCardCommand(subkey, card->serialNumber(), card->appName()); ui.subkeysTree->setEnabled(false); connect(cmd, &Kleo::Commands::KeyToCardCommand::finished, q, [this]() { ui.subkeysTree->setEnabled(true); }); diff --git a/src/smartcard/readerstatus.cpp b/src/smartcard/readerstatus.cpp index 3b73b5d6ba97123c92eb71344817004e800bcd04..31cbd8dc188da9a7fef906aade13e950f488eb5c 100644 --- a/src/smartcard/readerstatus.cpp +++ b/src/smartcard/readerstatus.cpp @@ -934,4 +934,16 @@ std::vector > ReaderStatus::getCards() const return d->cardInfos(); } +std::shared_ptr ReaderStatus::getCard(const std::string &serialNumber, const std::string &appName) const +{ + for (const auto &card: d->cardInfos()) { + if (card->serialNumber() == serialNumber && card->appName() == appName) { + qCDebug(KLEOPATRA_LOG) << "ReaderStatus::getCard() - Found card with serial number" << serialNumber << "and app" << appName; + return card; + } + } + qCWarning(KLEOPATRA_LOG) << "ReaderStatus::getCard() - Did not find card with serial number" << serialNumber << "and app" << appName; + return std::shared_ptr(); +} + #include "readerstatus.moc" diff --git a/src/smartcard/readerstatus.h b/src/smartcard/readerstatus.h index 55c6cff3b31350e31f66c93b654a36c6ef2ac62a..b15ce3361574eb2b23daed5f7b63f4c0d1e362b6 100644 --- a/src/smartcard/readerstatus.h +++ b/src/smartcard/readerstatus.h @@ -50,17 +50,12 @@ public: std::vector > getCards() const; + std::shared_ptr getCard(const std::string &serialNumber, const std::string &appName) const; + template std::shared_ptr getCard(const std::string &serialNumber) const { - for (const auto &card: getCards()) { - if (card->serialNumber() == serialNumber) { - qCDebug(KLEOPATRA_LOG) << "ReaderStatus::getCard() - Found card with serial number" << QString::fromStdString(serialNumber); - return std::dynamic_pointer_cast(card); - } - } - qCDebug(KLEOPATRA_LOG) << "ReaderStatus::getCard() - Did not find card with serial number" << QString::fromStdString(serialNumber); - return std::shared_ptr(); + return std::dynamic_pointer_cast(getCard(serialNumber, T::AppName)); } public Q_SLOTS: diff --git a/src/view/pgpcardwidget.cpp b/src/view/pgpcardwidget.cpp index 57a174b94402ec629f02d0f8f334ef526bb2282e..2b8786749464217e3b9365a77ddb6d0b2ed97d0d 100644 --- a/src/view/pgpcardwidget.cpp +++ b/src/view/pgpcardwidget.cpp @@ -237,7 +237,7 @@ void PGPCardWidget::setCard(const OpenPGPCard *card) void PGPCardWidget::doChangePin(const std::string &keyRef) { - auto cmd = new ChangePinCommand(mRealSerial, this); + auto cmd = new ChangePinCommand(mRealSerial, OpenPGPCard::AppName, this); this->setEnabled(false); connect(cmd, &ChangePinCommand::finished, this, [this]() { diff --git a/src/view/pivcardwidget.cpp b/src/view/pivcardwidget.cpp index 397c68dfc5f5d8fc79278349d88f9317174e6072..854c5bdcd5d58a29bb7b640b0bb35eff862ed9a7 100644 --- a/src/view/pivcardwidget.cpp +++ b/src/view/pivcardwidget.cpp @@ -329,7 +329,7 @@ void PIVCardWidget::importCertificateFromCard(const std::string &keyref) void PIVCardWidget::writeKeyToCard(const std::string &keyref) { - auto cmd = new KeyToCardCommand(keyref, mCardSerialNumber); + auto cmd = new KeyToCardCommand(keyref, mCardSerialNumber, PIVCard::AppName); this->setEnabled(false); connect(cmd, &KeyToCardCommand::finished, this, [this]() { @@ -341,7 +341,7 @@ void PIVCardWidget::writeKeyToCard(const std::string &keyref) void PIVCardWidget::changePin(const std::string &keyRef) { - auto cmd = new ChangePinCommand(mCardSerialNumber, this); + auto cmd = new ChangePinCommand(mCardSerialNumber, PIVCard::AppName, this); this->setEnabled(false); connect(cmd, &ChangePinCommand::finished, this, [this]() {