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"