File indexing completed on 2024-06-23 05:13:41
0001 /* -*- mode: c++; c-basic-offset:4 -*- 0002 importcertificatefromclipboardcommand.cpp 0003 0004 This clipboard is part of Kleopatra, the KDE keymanager 0005 SPDX-FileCopyrightText: 2007 Klarälvdalens Datakonsult AB 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 #include <config-kleopatra.h> 0011 0012 #include "importcertificatefromclipboardcommand.h" 0013 0014 #ifndef QT_NO_CLIPBOARD 0015 0016 #include "importcertificatescommand_p.h" 0017 0018 #include <Libkleo/Classify> 0019 0020 #include <gpgme++/global.h> 0021 0022 #include <KLocalizedString> 0023 0024 #include <QApplication> 0025 #include <QByteArray> 0026 #include <QClipboard> 0027 #include <QMimeData> 0028 0029 using namespace GpgME; 0030 using namespace Kleo; 0031 0032 class ImportCertificateFromClipboardCommand::Private : public ImportCertificatesCommand::Private 0033 { 0034 friend class ::ImportCertificateFromClipboardCommand; 0035 ImportCertificateFromClipboardCommand *q_func() const 0036 { 0037 return static_cast<ImportCertificateFromClipboardCommand *>(q); 0038 } 0039 0040 public: 0041 explicit Private(ImportCertificateFromClipboardCommand *qq, KeyListController *c); 0042 ~Private() override; 0043 0044 bool ensureHaveClipboard(); 0045 0046 private: 0047 QByteArray input; 0048 }; 0049 0050 ImportCertificateFromClipboardCommand::Private *ImportCertificateFromClipboardCommand::d_func() 0051 { 0052 return static_cast<Private *>(d.get()); 0053 } 0054 const ImportCertificateFromClipboardCommand::Private *ImportCertificateFromClipboardCommand::d_func() const 0055 { 0056 return static_cast<const Private *>(d.get()); 0057 } 0058 0059 ImportCertificateFromClipboardCommand::Private::Private(ImportCertificateFromClipboardCommand *qq, KeyListController *c) 0060 : ImportCertificatesCommand::Private(qq, c) 0061 { 0062 } 0063 0064 ImportCertificateFromClipboardCommand::Private::~Private() 0065 { 0066 } 0067 0068 // static 0069 bool ImportCertificateFromClipboardCommand::canImportCurrentClipboard() 0070 { 0071 if (const QClipboard *clip = QApplication::clipboard()) 0072 if (const QMimeData *mime = clip->mimeData()) 0073 return mime->hasText() && mayBeAnyCertStoreType(classifyContent(mime->text().toUtf8())); 0074 return false; 0075 } 0076 0077 #define d d_func() 0078 #define q q_func() 0079 0080 ImportCertificateFromClipboardCommand::ImportCertificateFromClipboardCommand(KeyListController *p) 0081 : ImportCertificatesCommand(new Private(this, p)) 0082 { 0083 } 0084 0085 ImportCertificateFromClipboardCommand::ImportCertificateFromClipboardCommand(QAbstractItemView *v, KeyListController *p) 0086 : ImportCertificatesCommand(v, new Private(this, p)) 0087 { 0088 } 0089 0090 ImportCertificateFromClipboardCommand::~ImportCertificateFromClipboardCommand() 0091 { 0092 } 0093 0094 void ImportCertificateFromClipboardCommand::doStart() 0095 { 0096 if (!d->ensureHaveClipboard()) { 0097 Q_EMIT canceled(); 0098 d->finished(); 0099 return; 0100 } 0101 0102 d->setWaitForMoreJobs(true); 0103 const unsigned int classification = classifyContent(d->input); 0104 if (!mayBeAnyCertStoreType(classification)) { 0105 d->error(i18n("Clipboard contents do not look like a certificate."), i18n("Certificate Import Failed")); 0106 } else { 0107 const GpgME::Protocol protocol = findProtocol(classification); 0108 if (protocol == GpgME::UnknownProtocol) { 0109 d->error(i18n("Could not determine certificate type of clipboard contents."), i18n("Certificate Import Failed")); 0110 } else { 0111 d->startImport(protocol, d->input, i18n("Clipboard")); 0112 } 0113 } 0114 d->setWaitForMoreJobs(false); 0115 } 0116 0117 bool ImportCertificateFromClipboardCommand::Private::ensureHaveClipboard() 0118 { 0119 if (input.isEmpty()) 0120 if (const QClipboard *cb = qApp->clipboard()) { 0121 input = cb->text().toUtf8(); 0122 } 0123 return !input.isEmpty(); 0124 } 0125 0126 #undef d 0127 #undef q 0128 0129 #endif // QT_NO_CLIPBOARD 0130 0131 #include "moc_importcertificatefromclipboardcommand.cpp"