File indexing completed on 2024-06-02 05:24:20

0001 /* -*- mode: c++; c-basic-offset:4 -*-
0002     conf/smartcardconfigpage.cpp
0003 
0004     This file is part of Kleopatra, the KDE keymanager
0005     SPDX-FileCopyrightText: 2022 g10 Code GmbH
0006     SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de>
0007 
0008     SPDX-License-Identifier: GPL-2.0-or-later
0009 */
0010 
0011 #include <config-kleopatra.h>
0012 
0013 #include "smartcardconfigpage.h"
0014 
0015 #include <Libkleo/Compat>
0016 #include <Libkleo/ReaderPortSelection>
0017 
0018 #include <KLocalizedString>
0019 
0020 #include <QGpgME/CryptoConfig>
0021 #include <QGpgME/Protocol>
0022 
0023 #include <QHBoxLayout>
0024 #include <QLabel>
0025 #include <QVBoxLayout>
0026 
0027 using namespace Kleo;
0028 using namespace Kleo::Config;
0029 using namespace QGpgME;
0030 
0031 class SmartCardConfigurationPage::Private
0032 {
0033 public:
0034     Private(SmartCardConfigurationPage *q);
0035 
0036     static CryptoConfigEntry *readerPortConfigEntry(const CryptoConfig *config = nullptr);
0037 
0038 public:
0039     ReaderPortSelection *const mReaderPort;
0040 };
0041 
0042 SmartCardConfigurationPage::Private::Private(SmartCardConfigurationPage *qq)
0043     : mReaderPort{new ReaderPortSelection{qq->widget()}}
0044 {
0045 }
0046 
0047 // static
0048 CryptoConfigEntry *SmartCardConfigurationPage::Private::readerPortConfigEntry(const CryptoConfig *config)
0049 {
0050     if (!config) {
0051         config = QGpgME::cryptoConfig();
0052     }
0053     return Kleo::getCryptoConfigEntry(config, "scdaemon", "reader-port");
0054 }
0055 
0056 SmartCardConfigurationPage::SmartCardConfigurationPage(QObject *parent, const KPluginMetaData &data)
0057     : KCModule(parent, data)
0058     , d{std::make_unique<Private>(this)}
0059 {
0060     auto mainLayout = new QVBoxLayout{widget()};
0061 
0062     {
0063         auto l = new QHBoxLayout{};
0064         l->setContentsMargins(0, 0, 0, 0);
0065 
0066         auto label = new QLabel{i18n("Smart card reader to use:"), widget()};
0067         label->setBuddy(d->mReaderPort);
0068 
0069         l->addWidget(label);
0070         l->addWidget(d->mReaderPort, 1);
0071 
0072         mainLayout->addLayout(l);
0073 
0074         connect(d->mReaderPort, &ReaderPortSelection::valueChanged, this, &SmartCardConfigurationPage::markAsChanged);
0075     }
0076 
0077     mainLayout->addStretch();
0078 
0079     load();
0080 }
0081 
0082 SmartCardConfigurationPage::~SmartCardConfigurationPage() = default;
0083 
0084 void SmartCardConfigurationPage::load()
0085 {
0086     const auto *const entry = d->readerPortConfigEntry();
0087     if (entry) {
0088         d->mReaderPort->setEnabled(!entry->isReadOnly());
0089         d->mReaderPort->setValue(entry->stringValue());
0090     } else {
0091         d->mReaderPort->setEnabled(false);
0092         d->mReaderPort->setValue(i18n("Cannot be configured with Kleopatra"));
0093     }
0094 }
0095 
0096 void SmartCardConfigurationPage::save()
0097 {
0098     auto config = QGpgME::cryptoConfig();
0099 
0100     auto const entry = d->readerPortConfigEntry(config);
0101     if (entry && !entry->isReadOnly()) {
0102         entry->setStringValue(d->mReaderPort->value());
0103     }
0104 
0105     config->sync(true);
0106 }
0107 
0108 void SmartCardConfigurationPage::defaults()
0109 {
0110     const auto *const entry = d->readerPortConfigEntry();
0111     if (entry && !entry->isReadOnly()) {
0112         d->mReaderPort->setValue({});
0113     }
0114 }
0115 
0116 #include "moc_smartcardconfigpage.cpp"