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"