Page MenuHome GnuPG

importcertificatefromfilecommand.cpp
No OneTemporary

importcertificatefromfilecommand.cpp

/* -*- mode: c++; c-basic-offset:4 -*-
importcertificatefromfilecommand.cpp
This file is part of Kleopatra, the KDE keymanager
SPDX-FileCopyrightText: 2007 Klarälvdalens Datakonsult AB
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <config-kleopatra.h>
#include "importcertificatefromfilecommand.h"
#include "importcertificatescommand_p.h"
#include <kleopatra_debug.h>
#include <QGpgME/Protocol>
#include <Libkleo/Classify>
#include <gpgme++/global.h>
#include <gpgme++/importresult.h>
#include <KConfigGroup>
#include <KLocalizedString>
#include <QDir>
#include <QFile>
#include <QFileDialog>
#include <QFileInfo>
#include <QString>
#include <QTextCodec>
#include <QWidget>
#include <KSharedConfig>
#include <memory>
using namespace GpgME;
using namespace Kleo;
using namespace QGpgME;
class ImportCertificateFromFileCommand::Private : public ImportCertificatesCommand::Private
{
friend class ::ImportCertificateFromFileCommand;
ImportCertificateFromFileCommand *q_func() const
{
return static_cast<ImportCertificateFromFileCommand *>(q);
}
public:
explicit Private(ImportCertificateFromFileCommand *qq, KeyListController *c);
~Private() override;
bool ensureHaveFile();
private:
QStringList files;
};
ImportCertificateFromFileCommand::Private *ImportCertificateFromFileCommand::d_func()
{
return static_cast<Private *>(d.get());
}
const ImportCertificateFromFileCommand::Private *ImportCertificateFromFileCommand::d_func() const
{
return static_cast<const Private *>(d.get());
}
ImportCertificateFromFileCommand::Private::Private(ImportCertificateFromFileCommand *qq, KeyListController *c)
: ImportCertificatesCommand::Private(qq, c)
, files()
{
}
ImportCertificateFromFileCommand::Private::~Private()
{
}
#define d d_func()
#define q q_func()
ImportCertificateFromFileCommand::ImportCertificateFromFileCommand()
: ImportCertificatesCommand(new Private(this, nullptr))
{
}
ImportCertificateFromFileCommand::ImportCertificateFromFileCommand(KeyListController *p)
: ImportCertificatesCommand(new Private(this, p))
{
}
ImportCertificateFromFileCommand::ImportCertificateFromFileCommand(QAbstractItemView *v, KeyListController *p)
: ImportCertificatesCommand(v, new Private(this, p))
{
}
ImportCertificateFromFileCommand::ImportCertificateFromFileCommand(const QStringList &files, KeyListController *p)
: ImportCertificatesCommand(new Private(this, p))
{
d->files = files;
}
ImportCertificateFromFileCommand::ImportCertificateFromFileCommand(const QStringList &files, QAbstractItemView *v, KeyListController *p)
: ImportCertificatesCommand(v, new Private(this, p))
{
d->files = files;
}
ImportCertificateFromFileCommand::~ImportCertificateFromFileCommand()
{
}
void ImportCertificateFromFileCommand::setFiles(const QStringList &files)
{
d->files = files;
}
void ImportCertificateFromFileCommand::doStart()
{
if (!d->ensureHaveFile()) {
Q_EMIT canceled();
d->finished();
return;
}
d->setProgressWindowTitle(i18nc("@title:window", "Importing Certificates"));
d->setProgressLabelText(i18np("Importing certificates from 1 file...", "Importing certificates from %1 files...", d->files.size()));
// TODO: use KIO here
d->setWaitForMoreJobs(true);
for (const QString &fn : std::as_const(d->files)) {
QFile in(fn);
if (!in.open(QIODevice::ReadOnly)) {
d->error(i18n("Could not open file %1 for reading: %2", in.fileName(), in.errorString()), i18n("Certificate Import Failed"));
d->addImportResult({fn, GpgME::UnknownProtocol, ImportType::Local, ImportResult{}, AuditLogEntry{}});
continue;
}
auto data = in.readAll();
// check for UTF-16- (or UTF-32- or UTF-8-with-BOM-)encoded text file;
// binary certificate files don't start with a BOM, so that it's safe
// to assume that data starting with a BOM is UTF-encoded text
if (const auto codec = QTextCodec::codecForUtfText(data, nullptr)) {
qCDebug(KLEOPATRA_LOG) << this << __func__ << "Decoding" << codec->name() << "encoded data";
data = codec->toUnicode(data).toUtf8();
}
d->startImport(GpgME::OpenPGP, data, fn);
d->startImport(GpgME::CMS, data, fn);
d->importGroupsFromFile(fn);
}
d->setWaitForMoreJobs(false);
}
static QStringList get_file_name(QWidget *parent)
{
const QString certificateFilter = i18n("Certificates") + QLatin1String(" (*.asc *.cer *.cert *.crt *.der *.pem *.gpg *.p7c *.p12 *.pfx *.pgp *.kgrp)");
const QString anyFilesFilter = i18n("Any files") + QLatin1String(" (*)");
QString previousDir;
if (const KSharedConfig::Ptr config = KSharedConfig::openConfig()) {
const KConfigGroup group(config, QLatin1String("Import Certificate"));
previousDir = group.readPathEntry("last-open-file-directory", QDir::homePath());
}
const QStringList files =
QFileDialog::getOpenFileNames(parent, i18n("Select Certificate File"), previousDir, certificateFilter + QLatin1String(";;") + anyFilesFilter);
if (!files.empty())
if (const KSharedConfig::Ptr config = KSharedConfig::openConfig()) {
KConfigGroup group(config, QLatin1String("Import Certificate"));
group.writePathEntry("last-open-file-directory", QFileInfo(files.front()).path());
}
return files;
}
bool ImportCertificateFromFileCommand::Private::ensureHaveFile()
{
if (files.empty()) {
files = get_file_name(parentWidgetOrView());
}
return !files.empty();
}
#undef d
#undef q
#include "moc_importcertificatefromfilecommand.cpp"

File Metadata

Mime Type
text/x-c++
Expires
Thu, Feb 26, 6:54 PM (21 h, 54 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
29/ee/08e4ea4af2608eb35079f5471249

Event Timeline