Page MenuHome GnuPG

No OneTemporary

diff --git a/src/kleo/defaultkeyfilter.cpp b/src/kleo/defaultkeyfilter.cpp
index b61eee46..00fdde62 100644
--- a/src/kleo/defaultkeyfilter.cpp
+++ b/src/kleo/defaultkeyfilter.cpp
@@ -1,508 +1,525 @@
/*
defaultkeyfilter.cpp
This file is part of libkleopatra, the KDE keymanagement library
Copyright (c) 2004 Klarälvdalens Datakonsult AB
2016 by Bundesamt für Sicherheit in der Informationstechnik
Software engineering by Intevation GmbH
Libkleopatra is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
Libkleopatra is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
In addition, as a special exception, the copyright holders give
permission to link the code of this program with any edition of
the Qt library by Trolltech AS, Norway (or with modified versions
of Qt that use the same license as Qt), and distribute linked
combinations including the two. You must obey the GNU General
Public License in all respects for all of the code used other than
Qt. If you modify this file, you may extend this exception to
your version of the file, but you are not obligated to do so. If
you do not wish to do so, delete this exception statement from
your version.
*/
#include "defaultkeyfilter.h"
+#include "utils/formatting.h"
+
#include <functional>
#include <memory>
using namespace GpgME;
using namespace Kleo;
static bool is_card_key(const Key &key)
{
const std::vector<Subkey> sks = key.subkeys();
return std::find_if(sks.begin(), sks.end(),
std::mem_fn(&Subkey::isCardKey)) != sks.end();
}
class DefaultKeyFilter::Private
{
public:
Private() :
mMatchContexts(AnyMatchContext),
mSpecificity(0),
mItalic(false),
mBold(false),
mStrikeOut(false),
mUseFullFont(false),
mRevoked(DoesNotMatter),
mExpired(DoesNotMatter),
mDisabled(DoesNotMatter),
mRoot(DoesNotMatter),
mCanEncrypt(DoesNotMatter),
mCanSign(DoesNotMatter),
mCanCertify(DoesNotMatter),
mCanAuthenticate(DoesNotMatter),
mQualified(DoesNotMatter),
mCardKey(DoesNotMatter),
mHasSecret(DoesNotMatter),
mIsOpenPGP(DoesNotMatter),
mWasValidated(DoesNotMatter),
mOwnerTrust(LevelDoesNotMatter),
mOwnerTrustReferenceLevel(Key::Unknown),
mValidity(LevelDoesNotMatter),
mValidityReferenceLevel(UserID::Unknown)
{}
QColor mFgColor, mBgColor;
QString mName;
QString mIcon;
QString mId;
MatchContexts mMatchContexts;
unsigned int mSpecificity;
bool mItalic;
bool mBold;
bool mStrikeOut;
bool mUseFullFont;
QFont mFont;
TriState mRevoked;
TriState mExpired;
TriState mDisabled;
TriState mRoot;
TriState mCanEncrypt;
TriState mCanSign;
TriState mCanCertify;
TriState mCanAuthenticate;
TriState mQualified;
TriState mCardKey;
TriState mHasSecret;
TriState mIsOpenPGP;
TriState mWasValidated;
+ TriState mIsDeVs;
LevelState mOwnerTrust;
GpgME::Key::OwnerTrust mOwnerTrustReferenceLevel;
LevelState mValidity;
GpgME::UserID::Validity mValidityReferenceLevel;
};
DefaultKeyFilter::DefaultKeyFilter()
: KeyFilter(),
d_ptr(new Private())
{
}
DefaultKeyFilter::~DefaultKeyFilter() {}
bool DefaultKeyFilter::matches(const Key &key, MatchContexts contexts) const
{
if (!(d_ptr->mMatchContexts & contexts)) {
return false;
}
#ifdef MATCH
#undef MATCH
#endif
#define MATCH(member,method) \
if ( member != DoesNotMatter && key.method() != bool( member == Set ) ) \
return false
#define IS_MATCH(what) MATCH( d_ptr->m##what, is##what )
#define CAN_MATCH(what) MATCH( d_ptr->mCan##what, can##what )
IS_MATCH(Revoked);
IS_MATCH(Expired);
IS_MATCH(Disabled);
IS_MATCH(Root);
CAN_MATCH(Encrypt);
CAN_MATCH(Sign);
CAN_MATCH(Certify);
CAN_MATCH(Authenticate);
IS_MATCH(Qualified);
if (d_ptr->mCardKey != DoesNotMatter)
if ((d_ptr->mCardKey == Set && !is_card_key(key)) ||
(d_ptr->mCardKey == NotSet && is_card_key(key))) {
return false;
}
MATCH(d_ptr->mHasSecret, hasSecret);
#undef MATCH
if (d_ptr->mIsOpenPGP != DoesNotMatter &&
bool(key.protocol() == GpgME::OpenPGP) != bool(d_ptr->mIsOpenPGP == Set)) {
return false;
}
if (d_ptr->mWasValidated != DoesNotMatter &&
bool(key.keyListMode() & GpgME::Validate) != bool(d_ptr->mWasValidated == Set)) {
return false;
}
+ if (d_ptr->mIsDeVs != DoesNotMatter &&
+ bool(Formatting::uidsHaveFullValidity(key) && Formatting::isKeyDeVs(key)) != bool(d_ptr->mIsDeVs == Set)) {
+ return false;
+ }
switch (d_ptr->mOwnerTrust) {
default:
case LevelDoesNotMatter:
break;
case Is:
if (key.ownerTrust() != d_ptr->mOwnerTrustReferenceLevel) {
return false;
}
break;
case IsNot:
if (key.ownerTrust() == d_ptr->mOwnerTrustReferenceLevel) {
return false;
}
break;
case IsAtLeast:
if (static_cast<int>(key.ownerTrust()) < static_cast<int>(d_ptr->mOwnerTrustReferenceLevel)) {
return false;
}
break;
case IsAtMost:
if (static_cast<int>(key.ownerTrust()) > static_cast<int>(d_ptr->mOwnerTrustReferenceLevel)) {
return false;
}
break;
}
const UserID uid = key.userID(0);
switch (d_ptr->mValidity) {
default:
case LevelDoesNotMatter:
break;
case Is:
if (uid.validity() != d_ptr->mValidityReferenceLevel) {
return false;
}
break;
case IsNot:
if (uid.validity() == d_ptr->mValidityReferenceLevel) {
return false;
}
break;
case IsAtLeast:
if (static_cast<int>(uid.validity()) < static_cast<int>(d_ptr->mValidityReferenceLevel)) {
return false;
}
break;
case IsAtMost:
if (static_cast<int>(uid.validity()) > static_cast<int>(d_ptr->mValidityReferenceLevel)) {
return false;
}
break;
}
return true;
}
KeyFilter::FontDescription DefaultKeyFilter::fontDescription() const
{
if (d_ptr->mUseFullFont) {
return FontDescription::create(font(), bold(), italic(), strikeOut());
} else {
return FontDescription::create(bold(), italic(), strikeOut());
}
}
void DefaultKeyFilter::setFgColor(const QColor &value) const
{
d_ptr->mFgColor = value;
}
void DefaultKeyFilter::setBgColor(const QColor &value) const
{
d_ptr->mBgColor = value;
}
void DefaultKeyFilter::setName(const QString &value) const
{
d_ptr->mName = value;
}
void DefaultKeyFilter::setIcon(const QString &value) const
{
d_ptr->mIcon = value;
}
void DefaultKeyFilter::setId(const QString &value) const
{
d_ptr->mId = value;
}
void DefaultKeyFilter::setMatchContexts(MatchContexts value) const
{
d_ptr->mMatchContexts = value;
}
void DefaultKeyFilter::setSpecificity(unsigned int value) const
{
d_ptr->mSpecificity = value;
}
void DefaultKeyFilter::setItalic(bool value) const
{
d_ptr->mItalic = value;
}
void DefaultKeyFilter::setBold(bool value) const
{
d_ptr->mBold = value;
}
void DefaultKeyFilter::setStrikeOut(bool value) const
{
d_ptr->mStrikeOut = value;
}
void DefaultKeyFilter::setUseFullFont(bool value) const
{
d_ptr->mUseFullFont = value;
}
void DefaultKeyFilter::setFont(const QFont &value) const
{
d_ptr->mFont = value;
}
void DefaultKeyFilter::setRevoked(DefaultKeyFilter::TriState value) const
{
d_ptr->mRevoked = value;
}
void DefaultKeyFilter::setExpired(DefaultKeyFilter::TriState value) const
{
d_ptr->mExpired = value;
}
void DefaultKeyFilter::setDisabled(DefaultKeyFilter::TriState value) const
{
d_ptr->mDisabled = value;
}
void DefaultKeyFilter::setRoot(DefaultKeyFilter::TriState value) const
{
d_ptr->mRoot = value;
}
void DefaultKeyFilter::setCanEncrypt(DefaultKeyFilter::TriState value) const
{
d_ptr->mCanEncrypt = value;
}
void DefaultKeyFilter::setCanSign(DefaultKeyFilter::TriState value) const
{
d_ptr->mCanSign = value;
}
void DefaultKeyFilter::setCanCertify(DefaultKeyFilter::TriState value) const
{
d_ptr->mCanCertify = value;
}
void DefaultKeyFilter::setCanAuthenticate(DefaultKeyFilter::TriState value) const
{
d_ptr->mCanAuthenticate = value;
}
void DefaultKeyFilter::setQualified(DefaultKeyFilter::TriState value) const
{
d_ptr->mQualified = value;
}
void DefaultKeyFilter::setCardKey(DefaultKeyFilter::TriState value) const
{
d_ptr->mCardKey = value;
}
void DefaultKeyFilter::setHasSecret(DefaultKeyFilter::TriState value) const
{
d_ptr->mHasSecret = value;
}
void DefaultKeyFilter::setIsOpenPGP(DefaultKeyFilter::TriState value) const
{
d_ptr->mIsOpenPGP = value;
}
void DefaultKeyFilter::setWasValidated(DefaultKeyFilter::TriState value) const
{
d_ptr->mWasValidated = value;
}
void DefaultKeyFilter::setOwnerTrust(DefaultKeyFilter::LevelState value) const
{
d_ptr->mOwnerTrust = value;
}
void DefaultKeyFilter::setOwnerTrustReferenceLevel(GpgME::Key::OwnerTrust value) const
{
d_ptr->mOwnerTrustReferenceLevel = value;
}
void DefaultKeyFilter::setValidity(DefaultKeyFilter::LevelState value) const
{
d_ptr->mValidity = value;
}
void DefaultKeyFilter::setValidityReferenceLevel(GpgME::UserID::Validity value) const
{
d_ptr->mValidityReferenceLevel = value;
}
+void DefaultKeyFilter::setIsDeVs(DefaultKeyFilter::TriState value) const
+{
+ d_ptr->mIsDeVs = value;
+}
+
QColor DefaultKeyFilter::fgColor() const
{
return d_ptr->mFgColor;
}
QColor DefaultKeyFilter::bgColor() const
{
return d_ptr->mBgColor;
}
QString DefaultKeyFilter::name() const
{
return d_ptr->mName;
}
QString DefaultKeyFilter::icon() const
{
return d_ptr->mIcon;
}
QString DefaultKeyFilter::id() const
{
return d_ptr->mId;
}
QFont DefaultKeyFilter::font() const
{
return d_ptr->mFont;
}
KeyFilter::MatchContexts DefaultKeyFilter::availableMatchContexts() const
{
return d_ptr->mMatchContexts;
}
unsigned int DefaultKeyFilter::specificity() const
{
return d_ptr->mSpecificity;
}
bool DefaultKeyFilter::italic() const
{
return d_ptr->mItalic;
}
bool DefaultKeyFilter::bold() const
{
return d_ptr->mBold;
}
bool DefaultKeyFilter::strikeOut() const
{
return d_ptr->mStrikeOut;
}
bool DefaultKeyFilter::useFullFont() const
{
return d_ptr->mUseFullFont;
}
DefaultKeyFilter::TriState DefaultKeyFilter::revoked() const
{
return d_ptr->mRevoked;
}
DefaultKeyFilter::TriState DefaultKeyFilter::expired() const
{
return d_ptr->mExpired;
}
DefaultKeyFilter::TriState DefaultKeyFilter::disabled() const
{
return d_ptr->mDisabled;
}
DefaultKeyFilter::TriState DefaultKeyFilter::root() const
{
return d_ptr->mRoot;
}
DefaultKeyFilter::TriState DefaultKeyFilter::canEncrypt() const
{
return d_ptr->mCanEncrypt;
}
DefaultKeyFilter::TriState DefaultKeyFilter::canSign() const
{
return d_ptr->mCanSign;
}
DefaultKeyFilter::TriState DefaultKeyFilter::canCertify() const
{
return d_ptr->mCanCertify;
}
DefaultKeyFilter::TriState DefaultKeyFilter::canAuthenticate() const
{
return d_ptr->mCanAuthenticate;
}
DefaultKeyFilter::TriState DefaultKeyFilter::qualified() const
{
return d_ptr->mQualified;
}
DefaultKeyFilter::TriState DefaultKeyFilter::cardKey() const
{
return d_ptr->mCardKey;
}
DefaultKeyFilter::TriState DefaultKeyFilter::hasSecret() const
{
return d_ptr->mHasSecret;
}
DefaultKeyFilter::TriState DefaultKeyFilter::isOpenPGP() const
{
return d_ptr->mIsOpenPGP;
}
DefaultKeyFilter::TriState DefaultKeyFilter::wasValidated() const
{
return d_ptr->mWasValidated;
}
DefaultKeyFilter::LevelState DefaultKeyFilter::ownerTrust() const
{
return d_ptr->mOwnerTrust;
}
GpgME::Key::OwnerTrust DefaultKeyFilter::ownerTrustReferenceLevel() const
{
return d_ptr->mOwnerTrustReferenceLevel;
}
DefaultKeyFilter::LevelState DefaultKeyFilter::validity() const
{
return d_ptr->mValidity;
}
GpgME::UserID::Validity DefaultKeyFilter::validityReferenceLevel() const
{
return d_ptr->mValidityReferenceLevel;
}
+
+DefaultKeyFilter::TriState DefaultKeyFilter::isDeVS() const
+{
+ return d_ptr->mIsDeVs;
+}
diff --git a/src/kleo/defaultkeyfilter.h b/src/kleo/defaultkeyfilter.h
index e762b0c8..d8d29c1b 100644
--- a/src/kleo/defaultkeyfilter.h
+++ b/src/kleo/defaultkeyfilter.h
@@ -1,154 +1,156 @@
/*
defaultkeyfilter.h
This file is part of libkleopatra, the KDE keymanagement library
Copyright (c) 2004 Klarälvdalens Datakonsult AB
2016 by Bundesamt für Sicherheit in der Informationstechnik
Software engineering by Intevation GmbH
Libkleopatra is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
Libkleopatra is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
In addition, as a special exception, the copyright holders give
permission to link the code of this program with any edition of
the Qt library by Trolltech AS, Norway (or with modified versions
of Qt that use the same license as Qt), and distribute linked
combinations including the two. You must obey the GNU General
Public License in all respects for all of the code used other than
Qt. If you modify this file, you may extend this exception to
your version of the file, but you are not obligated to do so. If
you do not wish to do so, delete this exception statement from
your version.
*/
#ifndef __KLEO_DEFAULTKEYFILTER_H__
#define __KLEO_DEFAULTKEYFILTER_H__
#include "keyfilter.h"
#include "kleo_export.h"
#include <QFont>
#include <QString>
#include <QColor>
#include <QScopedPointer>
#include <gpgme++/key.h>
namespace Kleo
{
/** Default implementation of key filter class. */
class KLEO_EXPORT DefaultKeyFilter : public KeyFilter
{
public:
DefaultKeyFilter();
~DefaultKeyFilter() override;
/** Used for bool checks */
enum TriState {
DoesNotMatter = 0,
Set = 1,
NotSet = 2
};
/** Used for level checks */
enum LevelState {
LevelDoesNotMatter = 0,
Is = 1,
IsNot = 2,
IsAtLeast = 3,
IsAtMost = 4
};
bool matches(const GpgME::Key &key, MatchContexts ctx) const override;
unsigned int specificity() const override;
void setSpecificity(unsigned int value) const;
QString id() const override;
void setId(const QString &value) const;
KeyFilter::MatchContexts availableMatchContexts() const override;
void setMatchContexts(KeyFilter::MatchContexts value) const;
QColor fgColor() const override;
void setFgColor(const QColor &value) const;
QColor bgColor() const override;
void setBgColor(const QColor &value) const;
FontDescription fontDescription() const override;
QString name() const override;
void setName(const QString &value) const;
QString icon() const override;
void setIcon(const QString &value) const;
QFont font() const;
void setFont(const QFont &value) const;
TriState revoked() const;
TriState expired() const;
TriState disabled() const;
TriState root() const;
TriState canEncrypt() const;
TriState canSign() const;
TriState canCertify() const;
TriState canAuthenticate() const;
TriState qualified() const;
TriState cardKey() const;
TriState hasSecret() const;
TriState isOpenPGP() const;
TriState wasValidated() const;
+ TriState isDeVS() const;
LevelState ownerTrust() const;
GpgME::Key::OwnerTrust ownerTrustReferenceLevel() const;
LevelState validity() const;
GpgME::UserID::Validity validityReferenceLevel() const;
bool italic() const;
bool bold() const;
bool strikeOut() const;
bool useFullFont() const;
void setRevoked(const TriState) const;
void setExpired(const TriState) const;
void setDisabled(const TriState) const;
void setRoot(const TriState) const;
void setCanEncrypt(const TriState) const;
void setCanSign(const TriState) const;
void setCanCertify(const TriState) const;
void setCanAuthenticate(const TriState) const;
void setQualified(const TriState) const;
void setCardKey(const TriState) const;
void setHasSecret(const TriState) const;
void setIsOpenPGP(const TriState) const;
void setWasValidated(const TriState) const;
+ void setIsDeVs(const TriState) const;
void setOwnerTrust(const LevelState) const;
void setOwnerTrustReferenceLevel(const GpgME::Key::OwnerTrust) const;
void setValidity(const LevelState) const;
void setValidityReferenceLevel(const GpgME::UserID::Validity) const;
void setItalic(bool value) const;
void setBold(bool value) const;
void setStrikeOut(bool value) const;
void setUseFullFont(bool value) const;
private:
class Private;
const QScopedPointer<Private> d_ptr;
};
} // namespace Kleo
#endif
diff --git a/src/kleo/kconfigbasedkeyfilter.cpp b/src/kleo/kconfigbasedkeyfilter.cpp
index 90deaf74..1aa39256 100644
--- a/src/kleo/kconfigbasedkeyfilter.cpp
+++ b/src/kleo/kconfigbasedkeyfilter.cpp
@@ -1,254 +1,255 @@
/*
kconfigbasedkeyfilter.cpp
This file is part of libkleopatra, the KDE keymanagement library
Copyright (c) 2004 Klarälvdalens Datakonsult AB
Libkleopatra is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
Libkleopatra is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
In addition, as a special exception, the copyright holders give
permission to link the code of this program with any edition of
the Qt library by Trolltech AS, Norway (or with modified versions
of Qt that use the same license as Qt), and distribute linked
combinations including the two. You must obey the GNU General
Public License in all respects for all of the code used other than
Qt. If you modify this file, you may extend this exception to
your version of the file, but you are not obligated to do so. If
you do not wish to do so, delete this exception statement from
your version.
*/
#include "kconfigbasedkeyfilter.h"
#include <kconfigbase.h>
#include <kconfiggroup.h>
#include <algorithm>
#include <QDebug>
using namespace Kleo;
using namespace GpgME;
//
//
// FontDescription - intuitive font property resolving
// (QFont::resolve doesn't work for us)
//
//
struct KeyFilter::FontDescription::Private {
bool bold, italic, strikeOut, fullFont;
QFont font;
};
KeyFilter::FontDescription::FontDescription()
: d(new Private)
{
d->bold = d->italic = d->strikeOut = d->fullFont = false;
}
KeyFilter::FontDescription::FontDescription(const FontDescription &other)
: d(new Private(*other.d))
{
}
KeyFilter::FontDescription::~FontDescription()
{
delete d;
}
KeyFilter::FontDescription KeyFilter::FontDescription::create(bool b, bool i, bool s)
{
FontDescription fd;
fd.d->bold = b;
fd.d->italic = i;
fd.d->strikeOut = s;
return fd;
}
KeyFilter::FontDescription KeyFilter::FontDescription::create(const QFont &f, bool b, bool i, bool s)
{
FontDescription fd;
fd.d->fullFont = true;
fd.d->font = f;
fd.d->bold = b;
fd.d->italic = i;
fd.d->strikeOut = s;
return fd;
}
QFont KeyFilter::FontDescription::font(const QFont &base) const
{
QFont font;
if (d->fullFont) {
font = d->font;
font.setPointSize(base.pointSize());
} else {
font = base;
}
if (d->bold) {
font.setBold(true);
}
if (d->italic) {
font.setItalic(true);
}
if (d->strikeOut) {
font.setStrikeOut(true);
}
return font;
}
KeyFilter::FontDescription KeyFilter::FontDescription::resolve(const FontDescription &other) const
{
FontDescription fd;
fd.d->fullFont = this->d->fullFont || other.d->fullFont;
if (fd.d->fullFont) {
fd.d->font = this->d->fullFont ? this->d->font : other.d->font;
}
fd.d->bold = this->d->bold || other.d->bold;
fd.d->italic = this->d->italic || other.d->italic;
fd.d->strikeOut = this->d->strikeOut || other.d->strikeOut;
return fd;
}
static const struct {
const char *name;
Key::OwnerTrust trust;
UserID::Validity validity;
} ownerTrustAndValidityMap[] = {
{ "unknown", Key::Unknown, UserID::Unknown },
{ "undefined", Key::Undefined, UserID::Undefined },
{ "never", Key::Never, UserID::Never },
{ "marginal", Key::Marginal, UserID::Marginal },
{ "full", Key::Full, UserID::Full },
{ "ultimate", Key::Ultimate, UserID::Ultimate },
};
static Key::OwnerTrust map2OwnerTrust(const QString &s)
{
for (unsigned int i = 0; i < sizeof ownerTrustAndValidityMap / sizeof * ownerTrustAndValidityMap; ++i)
if (s.toLower() == QLatin1String(ownerTrustAndValidityMap[i].name)) {
return ownerTrustAndValidityMap[i].trust;
}
return ownerTrustAndValidityMap[0].trust;
}
static UserID::Validity map2Validity(const QString &s)
{
for (unsigned int i = 0; i < sizeof ownerTrustAndValidityMap / sizeof * ownerTrustAndValidityMap; ++i)
if (s.toLower() == QLatin1String(ownerTrustAndValidityMap[i].name)) {
return ownerTrustAndValidityMap[i].validity;
}
return ownerTrustAndValidityMap[0].validity;
}
KConfigBasedKeyFilter::KConfigBasedKeyFilter(const KConfigGroup &config)
: DefaultKeyFilter()
{
setFgColor(config.readEntry<QColor>("foreground-color", QColor()));
setBgColor(config.readEntry<QColor>("background-color", QColor()));
setName(config.readEntry("Name", config.name()));
setIcon(config.readEntry("icon"));
setId(config.readEntry("id", config.name()));
if (config.hasKey("font")) {
setUseFullFont(true);
setFont(config.readEntry("font"));
} else {
setUseFullFont(false);
setItalic(config.readEntry("font-italic", false));
setBold(config.readEntry("font-bold", false));
}
setStrikeOut(config.readEntry("font-strikeout", false));
#ifdef SET
#undef SET
#endif
#define SET(member,key) \
if ( config.hasKey( key ) ) { \
set##member(config.readEntry( key, false ) ? Set : NotSet); \
setSpecificity(specificity() + 1); \
}
SET(Revoked, "is-revoked");
SET(Expired, "is-expired");
SET(Disabled, "is-disabled");
SET(Root, "is-root-certificate");
SET(CanEncrypt, "can-encrypt");
SET(CanSign, "can-sign");
SET(CanCertify, "can-certify");
SET(CanAuthenticate, "can-authenticate");
SET(Qualified, "is-qualified");
SET(CardKey, "is-cardkey");
SET(HasSecret, "has-secret-key");
SET(IsOpenPGP, "is-openpgp-key");
SET(WasValidated, "was-validated");
+ SET(IsDeVs, "is-de-vs");
#undef SET
static const struct {
const char *prefix;
LevelState state;
} prefixMap[] = {
{ "is-", Is },
{ "is-not-", IsNot },
{ "is-at-least-", IsAtLeast },
{ "is-at-most-", IsAtMost },
};
for (unsigned int i = 0; i < sizeof prefixMap / sizeof * prefixMap; ++i) {
const QString key = QLatin1String(prefixMap[i].prefix) + QLatin1String("ownertrust");
if (config.hasKey(key)) {
setOwnerTrust(prefixMap[i].state);
setOwnerTrustReferenceLevel(map2OwnerTrust(config.readEntry(key, QString())));
setSpecificity(specificity() + 1);
break;
}
}
for (unsigned int i = 0; i < sizeof prefixMap / sizeof * prefixMap; ++i) {
const QString key = QLatin1String(prefixMap[i].prefix) + QLatin1String("validity");
if (config.hasKey(key)) {
setValidity(prefixMap[i].state);
setValidityReferenceLevel(map2Validity(config.readEntry(key, QString())));
setSpecificity(specificity() + 1);
break;
}
}
static const struct {
const char *key;
MatchContext context;
} matchMap[] = {
{ "any", AnyMatchContext },
{ "appearance", Appearance },
{ "filtering", Filtering },
};
const QStringList contexts = config.readEntry("match-contexts", "any").toLower().split(QRegExp(QLatin1String("[^a-zA-Z0-9_-!]+")), QString::SkipEmptyParts);
setMatchContexts(NoMatchContext);
for (const QString & ctx : contexts) {
bool found = false;
for (unsigned int i = 0; i < sizeof matchMap / sizeof * matchMap; ++i)
if (ctx == QLatin1String(matchMap[i].key)) {
setMatchContexts(availableMatchContexts() |= matchMap[i].context);
found = true;
break;
} else if (ctx.startsWith(QLatin1Char('!')) && ctx.mid(1) == QLatin1String(matchMap[i].key)) {
setMatchContexts(availableMatchContexts() &= matchMap[i].context);
found = true;
break;
}
if (!found) {
qWarning() << QStringLiteral("KConfigBasedKeyFilter: found unknown match context '%1' in group '%2'").arg(ctx, config.name());
}
}
if (availableMatchContexts() == NoMatchContext) {
qWarning() << QStringLiteral("KConfigBasedKeyFilter: match context in group '%1' evaluates to NoMatchContext, "
"replaced by AnyMatchContext").arg(config.name());
setMatchContexts(AnyMatchContext);
}
}
diff --git a/src/kleo/keyfiltermanager.cpp b/src/kleo/keyfiltermanager.cpp
index c919812f..afa9a148 100644
--- a/src/kleo/keyfiltermanager.cpp
+++ b/src/kleo/keyfiltermanager.cpp
@@ -1,517 +1,449 @@
/*
keyfiltermanager.cpp
This file is part of libkleopatra, the KDE keymanagement library
Copyright (c) 2004 Klarälvdalens Datakonsult AB
Libkleopatra is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
Libkleopatra is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
In addition, as a special exception, the copyright holders give
permission to link the code of this program with any edition of
the Qt library by Trolltech AS, Norway (or with modified versions
of Qt that use the same license as Qt), and distribute linked
combinations including the two. You must obey the GNU General
Public License in all respects for all of the code used other than
Qt. If you modify this file, you may extend this exception to
your version of the file, but you are not obligated to do so. If
you do not wish to do so, delete this exception statement from
your version.
*/
#include "keyfiltermanager.h"
#include "kconfigbasedkeyfilter.h"
#include "defaultkeyfilter.h"
#include "stl_util.h"
#include "libkleo_debug.h"
#include "utils/formatting.h"
#include <kconfig.h>
#include <kconfiggroup.h>
#include <KSharedConfig>
#include <KLocalizedString>
#include <QIcon>
#include <QCoreApplication>
#include <QRegularExpression>
#include <QStringList>
#include <QAbstractListModel>
#include <QModelIndex>
#include <algorithm>
#include <vector>
#include <climits>
#include <functional>
using namespace Kleo;
using namespace GpgME;
namespace
{
class Model : public QAbstractListModel
{
KeyFilterManager::Private *m_keyFilterManagerPrivate;
public:
explicit Model(KeyFilterManager::Private *p)
: QAbstractListModel(nullptr), m_keyFilterManagerPrivate(p) {}
int rowCount(const QModelIndex &) const override;
QVariant data(const QModelIndex &idx, int role) const override;
/* upgrade to public */ using QAbstractListModel::reset;
};
class AllCertificatesKeyFilter : public DefaultKeyFilter
{
public:
AllCertificatesKeyFilter()
: DefaultKeyFilter()
{
setSpecificity(UINT_MAX); // overly high for ordering
setName(i18n("All Certificates"));
setId(QStringLiteral("all-certificates"));
setMatchContexts(Filtering);
}
};
class MyCertificatesKeyFilter : public DefaultKeyFilter
{
public:
MyCertificatesKeyFilter()
: DefaultKeyFilter()
{
setHasSecret(Set);
setSpecificity(UINT_MAX - 1); // overly high for ordering
setName(i18n("My Certificates"));
setId(QStringLiteral("my-certificates"));
setMatchContexts(AnyMatchContext);
setBold(true);
}
};
class TrustedCertificatesKeyFilter : public DefaultKeyFilter
{
public:
TrustedCertificatesKeyFilter()
: DefaultKeyFilter()
{
setRevoked(NotSet);
setValidity(IsAtLeast);
setValidityReferenceLevel(UserID::Marginal);
setSpecificity(UINT_MAX - 2); // overly high for ordering
setName(i18n("Trusted Certificates"));
setId(QStringLiteral("trusted-certificates"));
setMatchContexts(Filtering);
}
};
class FullCertificatesKeyFilter : public DefaultKeyFilter
{
public:
FullCertificatesKeyFilter()
: DefaultKeyFilter()
{
setRevoked(NotSet);
setValidity(IsAtLeast);
setValidityReferenceLevel(UserID::Full);
setSpecificity(UINT_MAX - 3);
setName(i18n("Fully Trusted Certificates"));
setId(QStringLiteral("full-certificates"));
setMatchContexts(Filtering);
}
};
class OtherCertificatesKeyFilter : public DefaultKeyFilter
{
public:
OtherCertificatesKeyFilter()
: DefaultKeyFilter()
{
setHasSecret(NotSet);
setValidity(IsAtMost);
setValidityReferenceLevel(UserID::Never);
setSpecificity(UINT_MAX - 4); // overly high for ordering
setName(i18n("Other Certificates"));
setId(QStringLiteral("other-certificates"));
setMatchContexts(Filtering);
}
};
-/* This filter selects only VS-NfD-compliant keys if Kleopatra is used in
- * CO_DE_VS mode. */
-class DeVsCompliantKeyFilter : public DefaultKeyFilter
-{
-public:
- DeVsCompliantKeyFilter()
- : DefaultKeyFilter()
- {
- setName(i18n("VS-NfD-compliant Certificates"));
- setId(QStringLiteral("vs-compliant-certificates"));
- setSpecificity(UINT_MAX - 5); // overly high for ordering
- }
- bool matches (const Key &key, MatchContexts contexts) const override
- {
- return (contexts & Filtering) && Formatting::isKeyDeVs(key);
- }
-};
-
/* This filter selects only invalid keys (i.e. those where not all
* UIDs are at least fully valid). */
class KeyNotValidFilter : public DefaultKeyFilter
{
public:
KeyNotValidFilter()
: DefaultKeyFilter()
{
setName(i18n("Not validated Certificates"));
setId(QStringLiteral("not-validated-certificates"));
setSpecificity(UINT_MAX - 6); // overly high for ordering
}
bool matches (const Key &key, MatchContexts contexts) const override
{
return (contexts & Filtering) && !Formatting::uidsHaveFullValidity(key);
}
};
-/* This filter gives valid keys (i.e. those where all UIDs are at
- * least fully valid) a light green background if Kleopatra is used in
- * CO_DE_VS mode. */
-class KeyDeVSValidAppearanceFilter : public DefaultKeyFilter
-{
-public:
- KeyDeVSValidAppearanceFilter()
- : DefaultKeyFilter()
- {
- // Ideally this would come from KColorScheme but we want to
- // avoid a dependency against kconfigwidgets. So we take
- // the color for positive background from breeze.
- setBgColor(QColor(0xD5, 0xFA, 0xE2));
- }
- bool matches (const Key &key, MatchContexts contexts) const override
- {
- return (contexts & Appearance) && Formatting::uidsHaveFullValidity(key) && Formatting::isKeyDeVs(key);
- }
-};
-
-/* This filter gives invalid keys (i.e. those where not all UIDs are
- * at least fully valid) a light red background if Kleopatra is used
- * in CO_DE_VS mode. */
-class KeyNotDeVSValidAppearanceFilter : public DefaultKeyFilter
-{
-public:
- KeyNotDeVSValidAppearanceFilter()
- : DefaultKeyFilter()
- {
- // Ideally this would come from KColorScheme but we want to
- // avoid a dependency against kconfigwidgets. So we take
- // the color for negative background from breeze.
- setBgColor(QColor(0xFA, 0xE9, 0xEB));
- }
- bool matches (const Key &key, MatchContexts contexts) const override
- {
- return (contexts & Appearance) && (!Formatting::uidsHaveFullValidity(key) || !Formatting::isKeyDeVs(key));
- }
-};
-
}
static std::vector<std::shared_ptr<KeyFilter>> defaultFilters()
{
std::vector<std::shared_ptr<KeyFilter> > result;
result.reserve(6);
result.push_back(std::shared_ptr<KeyFilter>(new MyCertificatesKeyFilter));
result.push_back(std::shared_ptr<KeyFilter>(new TrustedCertificatesKeyFilter));
result.push_back(std::shared_ptr<KeyFilter>(new FullCertificatesKeyFilter));
result.push_back(std::shared_ptr<KeyFilter>(new OtherCertificatesKeyFilter));
result.push_back(std::shared_ptr<KeyFilter>(new AllCertificatesKeyFilter));
result.push_back(std::shared_ptr<KeyFilter>(new KeyNotValidFilter));
- if (Formatting::complianceMode() == QStringLiteral("de-vs")) {
- result.push_back(std::shared_ptr<KeyFilter>(new DeVsCompliantKeyFilter));
- }
- return result;
-}
-
-static std::vector<std::shared_ptr<KeyFilter>> defaultAppearanceFilters()
-{
- std::vector<std::shared_ptr<KeyFilter> > result;
- if (Formatting::complianceMode() == QStringLiteral("de-vs")) {
- result.reserve(2);
- result.push_back(std::shared_ptr<KeyFilter>(new KeyDeVSValidAppearanceFilter));
- result.push_back(std::shared_ptr<KeyFilter>(new KeyNotDeVSValidAppearanceFilter));
- }
return result;
}
class KeyFilterManager::Private
{
public:
Private() : filters(), appearanceFilters(), model(this) {}
void clear()
{
filters.clear();
appearanceFilters.clear();
model.reset();
}
std::vector<std::shared_ptr<KeyFilter>> filters;
std::vector<std::shared_ptr<KeyFilter>> appearanceFilters;
Model model;
};
KeyFilterManager *KeyFilterManager::mSelf = nullptr;
KeyFilterManager::KeyFilterManager(QObject *parent)
: QObject(parent), d(new Private)
{
mSelf = this;
// ### DF: doesn't a KStaticDeleter work more reliably?
if (QCoreApplication *app = QCoreApplication::instance()) {
connect(app, &QCoreApplication::aboutToQuit, this, &QObject::deleteLater);
}
reload();
}
KeyFilterManager::~KeyFilterManager()
{
mSelf = nullptr;
if (d) {
d->clear();
}
delete d; d = nullptr;
}
KeyFilterManager *KeyFilterManager::instance()
{
if (!mSelf) {
mSelf = new KeyFilterManager();
}
return mSelf;
}
const std::shared_ptr<KeyFilter> &KeyFilterManager::filterMatching(const Key &key, KeyFilter::MatchContexts contexts) const
{
const auto it = std::find_if(d->filters.cbegin(), d->filters.cend(),
[&key, contexts](const std::shared_ptr<KeyFilter> &filter) {
return filter->matches(key, contexts);
});
if (it != d->filters.cend()) {
return *it;
}
static const std::shared_ptr<KeyFilter> null;
return null;
}
std::vector<std::shared_ptr<KeyFilter>> KeyFilterManager::filtersMatching(const Key &key, KeyFilter::MatchContexts contexts) const
{
std::vector<std::shared_ptr<KeyFilter>> result;
result.reserve(d->filters.size());
std::remove_copy_if(d->filters.begin(), d->filters.end(),
std::back_inserter(result),
[&key, contexts](const std::shared_ptr<KeyFilter> &filter) {
return !filter->matches(key, contexts);
});
return result;
}
namespace
{
struct ByDecreasingSpecificity : std::binary_function<std::shared_ptr<KeyFilter>, std::shared_ptr<KeyFilter>, bool> {
bool operator()(const std::shared_ptr<KeyFilter> &lhs, const std::shared_ptr<KeyFilter> &rhs) const
{
return lhs->specificity() > rhs->specificity();
}
};
}
void KeyFilterManager::reload()
{
d->clear();
d->filters = defaultFilters();
- d->appearanceFilters = defaultAppearanceFilters();
KSharedConfigPtr config = KSharedConfig::openConfig(QStringLiteral("libkleopatrarc"));
const QStringList groups = config->groupList().filter(QRegularExpression(QStringLiteral("^Key Filter #\\d+$")));
+ bool ignoreDeVs = Formatting::complianceMode() != QStringLiteral("de-vs");
for (QStringList::const_iterator it = groups.begin(); it != groups.end(); ++it) {
const KConfigGroup cfg(config, *it);
+ if (cfg.hasKey("is-de-vs") && ignoreDeVs) {
+ /* Don't show de-vs filters in other compliance modes */
+ continue;
+ }
d->filters.push_back(std::shared_ptr<KeyFilter>(new KConfigBasedKeyFilter(cfg)));
}
std::stable_sort(d->filters.begin(), d->filters.end(), ByDecreasingSpecificity());
qCDebug(LIBKLEO_LOG) << "final filter count is" << d->filters.size();
}
QAbstractItemModel *KeyFilterManager::model() const
{
return &d->model;
}
const std::shared_ptr<KeyFilter> &KeyFilterManager::keyFilterByID(const QString &id) const
{
const auto it = std::find_if(d->filters.begin(), d->filters.end(),
[id](const std::shared_ptr<KeyFilter> &filter) {
return filter->id() == id;
});
if (it != d->filters.end()) {
return *it;
}
static const std::shared_ptr<KeyFilter> null;
return null;
}
const std::shared_ptr<KeyFilter> &KeyFilterManager::fromModelIndex(const QModelIndex &idx) const
{
if (!idx.isValid() || idx.model() != &d->model || idx.row() < 0 ||
static_cast<unsigned>(idx.row()) >= d->filters.size()) {
static const std::shared_ptr<KeyFilter> null;
return null;
}
return d->filters[idx.row()];
}
QModelIndex KeyFilterManager::toModelIndex(const std::shared_ptr<KeyFilter> &kf) const
{
if (!kf) {
return QModelIndex();
}
const auto pair = std::equal_range(d->filters.cbegin(), d->filters.cend(), kf, ByDecreasingSpecificity());
const auto it = std::find(pair.first, pair.second, kf);
if (it != pair.second) {
return d->model.index(it - d->filters.begin());
} else {
return QModelIndex();
}
}
int Model::rowCount(const QModelIndex &) const
{
return m_keyFilterManagerPrivate->filters.size();
}
QVariant Model::data(const QModelIndex &idx, int role) const
{
if (!idx.isValid()
|| idx.model() != this
|| idx.row() < 0
|| static_cast<unsigned>(idx.row()) > m_keyFilterManagerPrivate->filters.size()) {
return QVariant();
}
const auto filter = m_keyFilterManagerPrivate->filters[idx.row()];
switch (role) {
case Qt::DecorationRole:
return filter->icon();
case Qt::DisplayRole:
case Qt::EditRole:
case Qt::ToolTipRole: /* Most useless tooltip ever. */
return filter->name();
case Qt::UserRole:
return filter->id();
default:
return QVariant();
}
}
static KeyFilter::FontDescription get_fontdescription(const std::vector<std::shared_ptr<KeyFilter>> &filters, const Key &key, const KeyFilter::FontDescription &initial)
{
return kdtools::accumulate_if(filters.begin(), filters.end(),
[&key](const std::shared_ptr<KeyFilter> &filter) {
return filter->matches(key, KeyFilter::Appearance);
},
initial,
[](const KeyFilter::FontDescription &lhs,
const std::shared_ptr<KeyFilter> &rhs) {
return lhs.resolve(rhs->fontDescription());
});
}
QFont KeyFilterManager::font(const Key &key, const QFont &baseFont) const
{
KeyFilter::FontDescription fd;
fd = get_fontdescription(d->appearanceFilters, key, KeyFilter::FontDescription());
fd = get_fontdescription(d->filters, key, fd);
return fd.font(baseFont);
}
static QColor get_color(const std::vector<std::shared_ptr<KeyFilter>> &filters, const Key &key, QColor(KeyFilter::*fun)() const)
{
const auto it = std::find_if(filters.cbegin(), filters.cend(),
[&fun, &key](const std::shared_ptr<KeyFilter> &filter) {
return filter->matches(key, KeyFilter::Appearance)
&& (filter.get()->*fun)().isValid();
});
if (it == filters.cend()) {
return QColor();
} else {
return (it->get()->*fun)();
}
}
static QString get_string(const std::vector<std::shared_ptr<KeyFilter>> &filters, const Key &key, QString(KeyFilter::*fun)() const)
{
const auto it = std::find_if(filters.cbegin(), filters.cend(),
[&fun, &key](const std::shared_ptr<KeyFilter> &filter) {
return filter->matches(key, KeyFilter::Appearance)
&& !(filter.get()->*fun)().isEmpty();
});
if (it == filters.cend()) {
return QString();
} else {
return (*it)->icon();
}
}
QColor KeyFilterManager::bgColor(const Key &key) const
{
QColor color;
color = get_color(d->appearanceFilters, key, &KeyFilter::bgColor);
if (!color.isValid()) {
color = get_color(d->filters, key, &KeyFilter::bgColor);
}
return color;
}
QColor KeyFilterManager::fgColor(const Key &key) const
{
QColor color;
color = get_color(d->appearanceFilters, key, &KeyFilter::fgColor);
if (!color.isValid()) {
color = get_color(d->filters, key, &KeyFilter::fgColor);
}
return color;
}
QIcon KeyFilterManager::icon(const Key &key) const
{
QString icon;
icon = get_string(d->appearanceFilters, key, &KeyFilter::icon);
if (icon.isEmpty()) {
icon = get_string(d->filters, key, &KeyFilter::icon);
}
return icon.isEmpty() ? QIcon() : QIcon::fromTheme(icon);
}
diff --git a/src/libkleopatrarc-win32.desktop b/src/libkleopatrarc-win32.desktop
index 7fb51753..b302aea0 100644
--- a/src/libkleopatrarc-win32.desktop
+++ b/src/libkleopatrarc-win32.desktop
@@ -1,569 +1,584 @@
[Archive Definition #0]
extensions-openpgp=tar
extensions-cms=tar.gz,tgz
id=tar
Name=TAR (PGP®-compatible)
Name[ar]=‏TAR (متوافق مع PGP®)
Name[ca]=TAR (compatible amb PGP®)
Name[ca@valencia]=TAR (compatible amb PGP®)
Name[cs]=TAR (PGP® kompatibilní)
Name[da]=TAR (PGP®-kompatibel)
Name[de]=TAR (PGP®-kompatibel)
Name[en_GB]=TAR (PGP®-compatible)
Name[es]=TAR (compatible PGP®)
Name[et]=TAR (PGP® ühilduv)
Name[fi]=TAR (PGP-yhteensopiva)
Name[fr]=TAR (compatible PGP®)
Name[gl]=TAR (compatíbel con PGP®)
Name[ia]=TAR (compatibile con PGP®)
Name[it]=TAR (compatibile PGP®)
Name[ja]=TAR (PGP® 互換)
Name[ko]=TAR(PGP® 호환)
Name[nb]=TAR (PGP®-kompatibel)
Name[nl]=TAR (PGP®-compatible)
Name[nn]=TAR (PGP®-kompatibel)
Name[pl]=TAR (zgodny z PGP®)
Name[pt]=TAR (compatível com o PGP®)
Name[pt_BR]=TAR (compatível com PGP®)
Name[ru]=TAR (PGP®-совместимый)
Name[sk]=TAR (PGP® kompatibilné)
Name[sl]=TAR (združljiv s PGP)
Name[sr]=тар (ПГП®-сагласно)
Name[sr@ijekavian]=тар (ПГП®-сагласно)
Name[sr@ijekavianlatin]=tar (PGP®-saglasno)
Name[sr@latin]=tar (PGP®-saglasno)
Name[sv]=TAR (fungerar med PGP®)
Name[tr]=TAR (PGP®-uyumlu)
Name[uk]=TAR (сумісні з PGP®)
Name[x-test]=xxTAR (PGP®-compatible)xx
Name[zh_CN]=TAR(PGP® 兼容)
Name[zh_TW]=TAR (相容 PGP®)
pack-command-openpgp=0|%I/gpgtar --openpgp --skip-crypto --output - --encrypt -T- --null --
pack-command-cms=0|%I/gpgtar --cms --skip-crypto --output - --encrypt -T- --null --
unpack-command-openpgp=%I/gpgtar --openpgp --skip-crypto --set-filename %f --decrypt -- -
unpack-command-cms=%I/gpgtar --cms --skip-crypto --set-filename %f --decrypt -- -
[Checksum Definition #0]
file-patterns=sha256sum.txt,.*\\\\.sha256,.*\\\\.sha2
output-file=sha256sum.txt
id=sha256sum
Name=sha256sum
Name[ar]=تدقيق SHA256
Name[ca]=sha256sum
Name[ca@valencia]=sha256sum
Name[cs]=sha256sum
Name[da]=sha256sum
Name[de]=sha256sum
Name[en_GB]=sha256sum
Name[es]=sha256sum
Name[et]=sha256sum
Name[fi]=sha256sum
Name[fr]=sha256sum
Name[gl]=sha256sum
Name[ia]=sha256sum
Name[it]=sha256sum
Name[ja]=sha256sum
Name[ko]=sha256sum
Name[nb]=sha256sum
Name[nl]=sha256sum
Name[pl]=sha256sum
Name[pt]=sha256sum
Name[pt_BR]=sha256sum
Name[ru]=sha256sum
Name[sk]=sha256sum
Name[sl]=sha256sum
Name[sr]=СХА‑256 сума
Name[sr@ijekavian]=СХА‑256 сума
Name[sr@ijekavianlatin]=SHA‑256 suma
Name[sr@latin]=SHA‑256 suma
Name[sv]=SHA256-summa
Name[tr]=sha256sum
Name[uk]=sha256sum
Name[x-test]=xxsha256sumxx
Name[zh_CN]=sha256sum
Name[zh_TW]=sha256sum
create-command=0|%I/sha256sum -0 -
verify-command=%I/sha256sum -c
[Checksum Definition #1]
file-patterns=sha1sum.txt,.*\\\\.sha1
output-file=sha1sum.txt
id=sha1sum
Name=sha1sum
Name[ar]=تدقيق SHA1
Name[ca]=sha1sum
Name[ca@valencia]=sha1sum
Name[cs]=sha1sum
Name[da]=sha1sum
Name[de]=sha1sum
Name[en_GB]=sha1sum
Name[es]=sha1sum
Name[et]=sha1sum
Name[fi]=sha1sum
Name[fr]=sha1sum
Name[gl]=sha1sum
Name[ia]=sha1sum
Name[it]=sha1sum
Name[ja]=sha1sum
Name[ko]=sha1sum
Name[nb]=sha1sum
Name[nl]=sha1sum
Name[nn]=sha1sum
Name[pl]=sha1sum
Name[pt]=sha1sum
Name[pt_BR]=sha1sum
Name[ru]=sha1sum
Name[sk]=sha1sum
Name[sl]=sha1sum
Name[sr]=СХА‑1 сума
Name[sr@ijekavian]=СХА‑1 сума
Name[sr@ijekavianlatin]=SHA‑1 suma
Name[sr@latin]=SHA‑1 suma
Name[sv]=SHA1-summa
Name[tr]=sha1sum
Name[uk]=sha1sum
Name[x-test]=xxsha1sumxx
Name[zh_CN]=sha1sum
Name[zh_TW]=sha1sum
create-command=0|%I/sha1sum -0 -
verify-command=%I/sha1sum -c
[Checksum Definition #2]
file-patterns=md5sum.txt,.*\\\\.md5
output-file=md5sum.txt
id=md5sum
Name=md5sum
Name[ar]=تدقيق MD5
Name[ca]=md5sum
Name[ca@valencia]=md5sum
Name[cs]=md5sum
Name[da]=md5sum
Name[de]=md5sum
Name[en_GB]=md5sum
Name[es]=md5sum
Name[et]=md5sum
Name[fi]=md5sum
Name[fr]=md5sum
Name[gl]=md5sum
Name[ia]=md5sum
Name[it]=md5sum
Name[ja]=md5sum
Name[ko]=md5sum
Name[nb]=md5sum
Name[nl]=md5sum
Name[nn]=md5sum
Name[pl]=md5sum
Name[pt]=md5sum
Name[pt_BR]=md5sum
Name[ru]=md5sum
Name[sk]=md5sum
Name[sl]=md5sum
Name[sr]=МД5 сума
Name[sr@ijekavian]=МД5 сума
Name[sr@ijekavianlatin]=MD5 suma
Name[sr@latin]=MD5 suma
Name[sv]=MD5-summa
Name[tr]=md5sum
Name[uk]=md5sum
Name[x-test]=xxmd5sumxx
Name[zh_CN]=md5sum
Name[zh_TW]=md5sum
create-command=0|%I/md5sum -0 -
verify-command=%I/md5sum -c
[Key Filter #0]
was-validated=false
Name=Not Validated Key
Name[ar]=ليس مفتاحًا متحقّقًا منه
Name[ca]=Clau no validada
Name[ca@valencia]=Clau no validada
Name[cs]=Neověřený klíč
Name[da]=Ikke godkendt nøgle
Name[de]=Ungeprüfter Schlüssel
Name[en_GB]=Not Validated Key
Name[es]=Clave no validada
Name[et]=Võtme ehtsus kontrollimatu
Name[fi]=Varmistamaton avain
Name[fr]=Clé non validée
Name[gl]=Non hai chave validada
Name[ia]=Clave non validate
Name[it]=Chiave non convalidata
Name[ja]=検証されていない鍵
Name[ko]=검증되지 않은 키
Name[nb]=Nøkkel ikke sjekket for gyldighet
Name[nl]=Geen gevalideerde sleutel
Name[nn]=Ikkje-validert nøkkel
Name[pl]=Niesprawdzony klucz
Name[pt]=Chave Não Validada
Name[pt_BR]=Chave não validada
Name[ru]=Непроверенный ключ
Name[sk]=Neoverený kľúč
Name[sl]=Nepreverjen ključ
Name[sr]=Неоверени кључ
Name[sr@ijekavian]=Неовјерени кључ
Name[sr@ijekavianlatin]=Neovjereni ključ
Name[sr@latin]=Neovereni ključ
Name[sv]=Nyckeln har inte validerats
Name[tr]=Geçerli Olmayan Anahtar
Name[uk]=Неперевірений ключ
Name[x-test]=xxNot Validated Keyxx
Name[zh_CN]=未校验的密钥
Name[zh_TW]=無已驗證的金鑰
[Key Filter #1]
was-validated=true
is-expired=true
is-revoked=false
foreground-color=255,0,0
Name=Expired Key
Name[ar]=مفتاح منقضي
Name[ca]=Clau expirada
Name[ca@valencia]=Clau expirada
Name[cs]=Klíč s prošlou platností
Name[da]=Udløbet nøgle
Name[de]=Abgelaufener Schlüssel
Name[en_GB]=Expired Key
Name[es]=Clave expirada
Name[et]=Aegunud võti
Name[fi]=Vanhentunut avain
Name[fr]=Clé expirée
Name[gl]=Chave caducada
Name[ia]=Clave expirate
Name[it]=Chiave scaduta
Name[ja]=期限切れの鍵
Name[ko]=만료된 키
Name[nb]=Utgått nøkkel
Name[nl]=Verlopen sleutel
Name[nn]=Forelda nøkkel
Name[pl]=Klucz, który utracił ważność
Name[pt]=Chave Expirada
Name[pt_BR]=Chave expirada
Name[ru]=Устаревший ключ
Name[sk]=Vypršaný kľúč
Name[sl]=Pretečen ključ
Name[sr]=Истекли кључ
Name[sr@ijekavian]=Истекли кључ
Name[sr@ijekavianlatin]=Istekli ključ
Name[sr@latin]=Istekli ključ
Name[sv]=Utgången nyckel
Name[tr]=Süresi Dolmuş Anahtar
Name[uk]=Застарілий ключ
Name[x-test]=xxExpired Keyxx
Name[zh_CN]=过期密钥
Name[zh_TW]=過期的金鑰
[Key Filter #2]
was-validated=true
is-revoked=true
Name=Revoked Key
Name[ar]=مفتاح مسحوب
Name[ca]=Clau revocada
Name[ca@valencia]=Clau revocada
Name[cs]=Odvolaný klíč
Name[da]=Fjernet nøgle
Name[de]=Widerrufener Schlüssel
Name[en_GB]=Revoked Key
Name[es]=Clave revocada
Name[et]=Tühistatud võti
Name[fi]=Peruttu avain
Name[fr]=Clé révoquée
Name[gl]=Chave revogada
Name[ia]=Clave revocate
Name[it]=Chiave revocata
Name[ja]=破棄された鍵
Name[ko]=취소된 키
Name[nb]=Tilbakekalt nøkkel
Name[nl]=Ingetrokken sleutel
Name[nn]=Tilbakekalla nøkkel
Name[pl]=Odwołany klucz
Name[pt]=Chave Revogada
Name[pt_BR]=Chave revogada
Name[ru]=Отозванный ключ
Name[sk]=Kľúč so zrušenou platnosťou
Name[sl]=Preklican ključ
Name[sr]=Опозвани кључ
Name[sr@ijekavian]=Опозвани кључ
Name[sr@ijekavianlatin]=Opozvani ključ
Name[sr@latin]=Opozvani ključ
Name[sv]=Återkallad nyckel
Name[tr]=İptal Edilmiş Anahtar
Name[uk]=Анульований ключ
Name[x-test]=xxRevoked Keyxx
Name[zh_CN]=吊销的密钥
Name[zh_TW]=已撤回的金鑰
[Key Filter #3]
was-validated=true
is-root-certificate=true
is-validity=ultimate
Name=Trusted Root Certificate
Name[ar]=شهادة جذر موثوقة
Name[ca]=Certificat arrel de confiança
Name[ca@valencia]=Certificat arrel de confiança
Name[cs]=Důvěryhodný kořenový certifikát
Name[da]=Root-certifikat der stoles på
Name[de]=Vertrauenswürdiges Wurzelzertifikat
Name[en_GB]=Trusted Root Certificate
Name[es]=Certificado raíz confiable
Name[et]=Usaldusväärne juursertifikaat
Name[fi]=Luotettu juurivarmenne
Name[fr]=Certificat racine de confiance
Name[gl]=Certificado raíz autenticado
Name[ia]=Certificato de radice con fide
Name[it]=Certificato radice affidabile
Name[ja]=信頼されたルート証明書
Name[ko]=신뢰하는 루트 인증 기관
Name[nb]=Tiltrodd rot-sertifikat
Name[nl]=Vertrouwd hoofdcertificaat
Name[nn]=Tiltrudd rotsertifikat
Name[pl]=Zaufany główny certyfikat
Name[pt]=Certificado de Raiz Fidedigno
Name[pt_BR]=Certificado raiz confiável
Name[ru]=Доверенный корневой сертификат
Name[sk]=Dôveryhodný koreňový certifikát
Name[sl]=Zaupanja vredno korensko potrdilo
Name[sr]=Поуздани корени сертификат
Name[sr@ijekavian]=Поуздани корјени сертификат
Name[sr@ijekavianlatin]=Pouzdani korjeni sertifikat
Name[sr@latin]=Pouzdani koreni sertifikat
Name[sv]=Pålitligt rotcertifikat
Name[tr]=Güvenilir Kök Sertifikası
Name[uk]=Кореневий сертифікат з довірою
Name[x-test]=xxTrusted Root Certificatexx
Name[zh_CN]=可信任的根证书
Name[zh_TW]=信任的根憑證
background-color=95,135,255
font-bold=true
[Key Filter #4]
was-validated=true
is-root-certificate=true
is-not-validity=ultimate
Name=Not Trusted Root Certificate
Name[ar]=شهادة جذر غير موثوقة
Name[ca]=Certificat arrel sense confiança
Name[ca@valencia]=Certificat arrel sense confiança
Name[cs]=Nedůvěryhodný kořenový certifikát
Name[da]=Root-certifikat der ikke stoles på
Name[de]=Nicht vertrauenswürdiges Wurzelzertifikat
Name[en_GB]=Not Trusted Root Certificate
Name[es]=Certificado raíz no confiable
Name[et]=Ebausaldusväärne juursertifikaat
Name[fi]=Ei-luotettu juurivarmenne
Name[fr]=Certificat racine non fiable
Name[gl]=Certificado raíz non autenticado
Name[ia]=Certificato de radice sin fide
Name[it]=Certificato radice non affidabile
Name[ja]=信頼されてないルート証明書
Name[ko]=신뢰하지 않는 루트 인증 기관
Name[nb]=Ikke tiltrodd rot-sertifikat
Name[nl]=Niet vertrouwd hoofdcertificaat
Name[nn]=Ikkje tiltrudd rotsertifikat
Name[pl]=Niezaufany główny certyfikat
Name[pt]=Certificado de Raiz Não Fidedigno
Name[pt_BR]=Certificado raiz não confiável
Name[ru]=Недоверенный корневой сертификат
Name[sk]=Nedôveryhodný koreňový certifikát
Name[sl]=Korensko potrdilo, ki ni zaupanja vredno
Name[sr]=Непоуздани корени сертификат
Name[sr@ijekavian]=Непоуздани корјени сертификат
Name[sr@ijekavianlatin]=Nepouzdani korjeni sertifikat
Name[sr@latin]=Nepouzdani koreni sertifikat
Name[sv]=Opålitligt rotcertifikat
Name[tr]=Güvenilmeyen Kök Sertifikası
Name[uk]=Кореневий сертифікат без довіри
Name[x-test]=xxNot Trusted Root Certificatexx
Name[zh_CN]=未信任的根证书
Name[zh_TW]=不被信任的根憑證
[Key Filter #5]
was-validated=true
is-qualified=true
font-bold=true
Name=Keys for Qualified Signatures
Name[ar]=مفاتيح لشهادات مؤهّلة
Name[ca]=Claus per a les signatures qualificades
Name[ca@valencia]=Claus per a les signatures qualificades
Name[cs]=Klíče kvalifikovaných podpisů
Name[da]=Nøgler til kvalificerede signaturer
Name[de]=Schlüssel für qualifizierte Signaturen
Name[en_GB]=Keys for Qualified Signatures
Name[es]=Claves para firmas cualificadas
Name[et]=Kvalifitseeritud allkirjade võtmed
Name[fi]=Hyväksyttyjen allekirjoitusten avaimet
Name[fr]=Clés pour les signatures qualifiées
Name[gl]=Chaves para sinaturas cualificadas
Name[ia]=Claves pro signaturas qualificate
Name[it]=Chiavi per le firme qualificate
Name[ja]=適格電子署名用の鍵
Name[ko]=신뢰하는 서명에 사용할 키
Name[nb]=Nøkler for kvalifiserte signaturer
Name[nl]=Sleutels voor gekwalificeerde ondertekeningen
Name[nn]=Nøklar for kvalifiserte signaturar
Name[pl]=Klucze do podpisów kwalifikowanych
Name[pt]=Chaves para as Assinaturas Qualificadas
Name[pt_BR]=Chaves para assinaturas qualificadas
Name[ru]=Ключи для подписывания
Name[sk]=Kľúče pre kvalifikované podpisy
Name[sl]=Ključi za kvalificirane podpise
Name[sr]=Кључеви за важеће потписе
Name[sr@ijekavian]=Кључеви за важеће потписе
Name[sr@ijekavianlatin]=Ključevi za važeće potpise
Name[sr@latin]=Ključevi za važeće potpise
Name[sv]=Nycklar för kvalificerade signaturer
Name[tr]=Yetkilendirilmiş İmzalar için Anahtarlar
Name[uk]=Ключі підписів обмеженого використання
Name[x-test]=xxKeys for Qualified Signaturesxx
Name[zh_CN]=合格签名的密钥
Name[zh_TW]=合格簽證的金鑰
[Key Filter #6]
was-validated=true
Name=Other Keys
Name[ar]=مفاتيح أخرى
Name[ca]=Altres claus
Name[ca@valencia]=Altres claus
Name[cs]=Ostatní klíče
Name[da]=Andre nøgler
Name[de]=Andere Schlüssel
Name[en_GB]=Other Keys
Name[es]=Otras claves
Name[et]=Muud võtmed
Name[fi]=Muut avaimet
Name[fr]=Autres clés
Name[gl]=Outras chaves
Name[ia]=Altere claves
Name[it]=Altre chiavi
Name[ja]=その他の鍵
Name[ko]=다른 키
Name[nb]=Andre nøkler
Name[nl]=Andere sleutels
Name[nn]=Andre nøklar
Name[pl]=Inne klucze
Name[pt]=Outras 'Cache'
Name[pt_BR]=Outras chaves
Name[ru]=Другие ключи
Name[sk]=Ostatné kľuče
Name[sl]=Drugi ključi
Name[sr]=Остали кључеви
Name[sr@ijekavian]=Остали кључеви
Name[sr@ijekavianlatin]=Ostali ključevi
Name[sr@latin]=Ostali ključevi
Name[sv]=Andra nycklar
Name[tr]=Diğer Anahtarlar
Name[uk]=Інші ключі
Name[x-test]=xxOther Keysxx
Name[zh_CN]=其它密钥
Name[zh_TW]=其他金鑰
[Key Filter #7]
is-cardkey=true
Name=Smartcard Key
Name[ar]=مفتاح بطاقة ذكيّة
Name[ca]=Clau de targeta intel·ligent
Name[ca@valencia]=Clau de targeta intel·ligent
Name[cs]=Klíč SmartCard
Name[da]=Smartcard-nøgle
Name[de]=Smartcard-Zertifikat
Name[en_GB]=Smartcard Key
Name[es]=Clave de tarjeta inteligente
Name[et]=Kiipkaardi võti
Name[fi]=Smartcard-avain
Name[fr]=Clé SmartCard
Name[gl]=Chave de smartcard
Name[ia]=Clave de carta intelligente
Name[it]=Chiave smartcard
Name[ja]=スマートカードの鍵
Name[ko]=스마트카드 키
Name[nb]=Smartkort-nøkkel
Name[nl]=Smartcard-sleutel
Name[nn]=Smartkort-nøkkel
Name[pl]=Klucz na karcie inteligentnej
Name[pt]=Chave do 'Smartcard'
Name[pt_BR]=Chave do Smartcard
Name[ru]=Ключ смарт-карты
Name[sk]=Smartcard kľúč
Name[sl]=Ključ na pametni kartici
Name[sr]=Кључ смарт-картица
Name[sr@ijekavian]=Кључ смарт-картица
Name[sr@ijekavianlatin]=Ključ smart-kartica
Name[sr@latin]=Ključ smart-kartica
Name[sv]=Smartkortsnyckel
Name[tr]=Akıllı Kart Anahtarı
Name[uk]=Ключ картки пам’яті
Name[x-test]=xxSmartcard Keyxx
Name[zh_CN]=智能卡密钥
Name[zh_TW]=智慧卡金鑰
icon=smartcard
[Key Filter #8]
is-openpgp-key=true
Name=OpenPGP Certificates
Name[ar]=شهادات OpenPGP
Name[ca]=Certificats OpenPGP
Name[ca@valencia]=Certificats OpenPGP
Name[cs]=Certifikáty OpenPGP
Name[da]=OpenPGP-certifikater
Name[de]=OpenPGP-Zertifikate
Name[en_GB]=OpenPGP Certificates
Name[es]=Certificados OpenPGP
Name[et]=OpenPGP sertifikaadid
Name[fi]=OpenPGP-varmenteet
Name[fr]=Certificats OpenPGP
Name[gl]=Certificados OpenPGP
Name[it]=Certificati OpenPGP
Name[ko]=OpenPGP 인증서
Name[nl]=OpenPGP-certificaten
Name[pl]=Certyfikaty OpenPGP
Name[pt]=Certificados do OpenPGP
Name[pt_BR]=Certificados OpenPGP
Name[ru]=Сертификаты OpenPGP
Name[sk]=Certifikáty OpenPGP
Name[sl]=Potrdila OpenPGP
Name[sr]=ОпенПГП сертификати
Name[sr@ijekavian]=ОпенПГП сертификати
Name[sr@ijekavianlatin]=OpenPGP sertifikati
Name[sr@latin]=OpenPGP sertifikati
Name[sv]=OpenPGP-certifikat
Name[tr]=OpenPGP Sertifikaları
Name[uk]=Сертифікати OpenPGP
Name[x-test]=xxOpenPGP Certificatesxx
Name[zh_CN]=OpenPGP 证书
Name[zh_TW]=OpenPGP 憑證
[Key Filter #9]
is-openpgp-key=false
Name=X509 Certificates
Name[ar]=شهادات X509
Name[ca]=Certificats X509
Name[ca@valencia]=Certificats X509
Name[cs]=Certifikáty X509
Name[da]=X509-certifikater
Name[de]=X509-Zertifikate
Name[en_GB]=X509 Certificates
Name[es]=Certificados X509
Name[et]=X509 sertifikaadid
Name[fi]=X509-varmenteet
Name[fr]=Certificats X509
Name[gl]=Certificados X509
Name[it]=Certificati X509
Name[ko]=X509 인증서
Name[nl]=X509-certificaten
Name[pl]=Certyfikaty X509
Name[pt]=Certificados X509
Name[pt_BR]=Certificados X.509
Name[ru]=Сертификаты X.509
Name[sk]=Certifikáty X509
Name[sl]=Potrdila X509
Name[sr]=Икс.509 сертификати
Name[sr@ijekavian]=Икс.509 сертификати
Name[sr@ijekavianlatin]=X.509 sertifikati
Name[sr@latin]=X.509 sertifikati
Name[sv]=X509-certifikat
Name[tr]=X509 Sertifikaları
Name[uk]=Сертифікати X509
Name[x-test]=xxX509 Certificatesxx
Name[zh_CN]=X509 证书
Name[zh_TW]=X509 憑證
+
+# Filters that filter for is-de-vs
+# are only shown in compliance mode
+# de-vs
+[Key Filter #10]
+is-de-vs=true
+Name=VS-NfD Compliant
+Name[de]=VS-NfD Konform
+background-color=213,250,226
+
+[Key Filter #11]
+is-de-vs=false
+Name=Not VS-NfD Compliant
+Name[de]=Nicht VS-NfD Konform
+background-color=250,233,235
diff --git a/src/libkleopatrarc.desktop b/src/libkleopatrarc.desktop
index a8fe10f4..2e7dc636 100644
--- a/src/libkleopatrarc.desktop
+++ b/src/libkleopatrarc.desktop
@@ -1,687 +1,702 @@
[Archive Definition #0]
extensions-openpgp=tar
extensions-cms=tar.gz,tgz
id=tar
Name=TAR (PGP®-compatible)
Name[ar]=‏TAR (متوافق مع PGP®)
Name[ca]=TAR (compatible amb PGP®)
Name[ca@valencia]=TAR (compatible amb PGP®)
Name[cs]=TAR (PGP® kompatibilní)
Name[da]=TAR (PGP®-kompatibel)
Name[de]=TAR (PGP®-kompatibel)
Name[en_GB]=TAR (PGP®-compatible)
Name[es]=TAR (compatible PGP®)
Name[et]=TAR (PGP® ühilduv)
Name[fi]=TAR (PGP-yhteensopiva)
Name[fr]=TAR (compatible PGP®)
Name[gl]=TAR (compatíbel con PGP®)
Name[ia]=TAR (compatibile con PGP®)
Name[it]=TAR (compatibile PGP®)
Name[ja]=TAR (PGP® 互換)
Name[ko]=TAR(PGP® 호환)
Name[nb]=TAR (PGP®-kompatibel)
Name[nl]=TAR (PGP®-compatible)
Name[nn]=TAR (PGP®-kompatibel)
Name[pl]=TAR (zgodny z PGP®)
Name[pt]=TAR (compatível com o PGP®)
Name[pt_BR]=TAR (compatível com PGP®)
Name[ru]=TAR (PGP®-совместимый)
Name[sk]=TAR (PGP® kompatibilné)
Name[sl]=TAR (združljiv s PGP)
Name[sr]=тар (ПГП®-сагласно)
Name[sr@ijekavian]=тар (ПГП®-сагласно)
Name[sr@ijekavianlatin]=tar (PGP®-saglasno)
Name[sr@latin]=tar (PGP®-saglasno)
Name[sv]=TAR (fungerar med PGP®)
Name[tr]=TAR (PGP®-uyumlu)
Name[uk]=TAR (сумісні з PGP®)
Name[x-test]=xxTAR (PGP®-compatible)xx
Name[zh_CN]=TAR(PGP® 兼容)
Name[zh_TW]=TAR (相容 PGP®)
pack-command-openpgp=0|tar cf - -T- --null
pack-command-cms=0|tar cfz - -T- --null
unpack-command-openpgp=tar xf -
unpack-command-cms=tar xfz -
## ZIP can't unpack from stdin, so commented out:
#[Archive Definition #1]
#extensions=zip
#id=zip
#Name=ZIP
#Name[ca]=ZIP
#Name[ca@valencia]=ZIP
#Name[cs]=ZIP
#Name[da]=ZIP
#Name[de]=ZIP
#Name[el]=ZIP
#Name[en_GB]=ZIP
#Name[eo]=ZIP
#Name[es]=ZIP
#Name[et]=ZIP
#Name[fr]=ZIP
#Name[gl]=ZIP
#Name[it]=ZIP
#Name[ja]=ZIP
#Name[kk]=ZIP
#Name[km]=ZIP
#Name[lt]=ZIP
#Name[lv]=ZIP
#Name[nb]=ZIP
#Name[nds]=Zip
#Name[nl]=ZIP
#Name[nn]=ZIP
#Name[pa]=ZIP
#Name[pl]=ZIP
#Name[pt]=ZIP
#Name[pt_BR]=ZIP
#Name[sl]=ZIP
#Name[sv]=ZIP
#Name[tr]=ZIP
#Name[uk]=ZIP
#Name[x-test]=xxZIPxx
#Name[zh_CN]=ZIP
#Name[zh_TW]=ZIP
#pack-command=zip -r - %f
[Archive Definition #3]
extensions=tar.bz2,tbz2
id=bzip2
Name=TAR (with bzip2 compression)
Name[ar]=‏TAR (بضغط bzip2)
Name[ca]=TAR (amb compressió bzip2)
Name[ca@valencia]=TAR (amb compressió bzip2)
Name[cs]=TAR (s bzip2 kompresí)
Name[da]=TAR (med bzip2-komprimering)
Name[de]=TAR (mit bzip2-Kompression)
Name[en_GB]=TAR (with bzip2 compression)
Name[es]=TAR (con compresión bzip2)
Name[et]=TAR (bzip2 tihendusega)
Name[fi]=TAR (bzip2-pakattu)
Name[fr]=TAR (avec compression bzip2)
Name[gl]=TAR (con compresión bzip2)
Name[ia]=TAR (con compression bzip2)
Name[it]=TAR (con compressione bzip2)
Name[ja]=TAR (bzip2 圧縮)
Name[ko]=TAR(bzip2 압축)
Name[nb]=TAR (med bzip2-komprimering)
Name[nl]=TAR (met bzip2 compressie)
Name[nn]=TAR (med bzip2-komprimering)
Name[pl]=TAR (z kompresją bzip2)
Name[pt]=TAR (com a compressão 'bzip2')
Name[pt_BR]=TAR (compressão com bzip2)
Name[ru]=TAR (со сжатием bzip2)
Name[sk]=TAR (s bzip2 kompresiou)
Name[sl]=TAR (s stiskanjem bzip2)
Name[sr]=тар 1.1 (уз компресију бзип2)
Name[sr@ijekavian]=тар 1.1 (уз компресију бзип2)
Name[sr@ijekavianlatin]=tar 1.1 (uz kompresiju bzip2)
Name[sr@latin]=tar 1.1 (uz kompresiju bzip2)
Name[sv]=TAR (med komprimering av bzip2)
Name[tr]=TAR (bzip2 sıkıştırmalı)
Name[uk]=TAR (зі стисканням bzip2)
Name[x-test]=xxTAR (with bzip2 compression)xx
Name[zh_CN]=TAR(bzip2 压缩)
Name[zh_TW]=TAR (藉由 bzip2 壓縮)
pack-command=0|tar cfj - -T- --null
unpack-command=tar xfj -
[Checksum Definition #0]
file-patterns=sha256sum.txt,.*\\\\.sha256,.*\\\\.sha2
output-file=sha256sum.txt
id=sha256sum
Name=sha256sum
Name[ar]=تدقيق SHA256
Name[ca]=sha256sum
Name[ca@valencia]=sha256sum
Name[cs]=sha256sum
Name[da]=sha256sum
Name[de]=sha256sum
Name[en_GB]=sha256sum
Name[es]=sha256sum
Name[et]=sha256sum
Name[fi]=sha256sum
Name[fr]=sha256sum
Name[gl]=sha256sum
Name[ia]=sha256sum
Name[it]=sha256sum
Name[ja]=sha256sum
Name[ko]=sha256sum
Name[nb]=sha256sum
Name[nl]=sha256sum
Name[pl]=sha256sum
Name[pt]=sha256sum
Name[pt_BR]=sha256sum
Name[ru]=sha256sum
Name[sk]=sha256sum
Name[sl]=sha256sum
Name[sr]=СХА‑256 сума
Name[sr@ijekavian]=СХА‑256 сума
Name[sr@ijekavianlatin]=SHA‑256 suma
Name[sr@latin]=SHA‑256 suma
Name[sv]=SHA256-summa
Name[tr]=sha256sum
Name[uk]=sha256sum
Name[x-test]=xxsha256sumxx
Name[zh_CN]=sha256sum
Name[zh_TW]=sha256sum
create-command=0|xargs -0 sha256sum --
verify-command=sha256sum -c --
[Checksum Definition #1]
file-patterns=sha1sum.txt,.*\\\\.sha1
output-file=sha1sum.txt
id=sha1sum
Name=sha1sum
Name[ar]=تدقيق SHA1
Name[ca]=sha1sum
Name[ca@valencia]=sha1sum
Name[cs]=sha1sum
Name[da]=sha1sum
Name[de]=sha1sum
Name[en_GB]=sha1sum
Name[es]=sha1sum
Name[et]=sha1sum
Name[fi]=sha1sum
Name[fr]=sha1sum
Name[gl]=sha1sum
Name[ia]=sha1sum
Name[it]=sha1sum
Name[ja]=sha1sum
Name[ko]=sha1sum
Name[nb]=sha1sum
Name[nl]=sha1sum
Name[nn]=sha1sum
Name[pl]=sha1sum
Name[pt]=sha1sum
Name[pt_BR]=sha1sum
Name[ru]=sha1sum
Name[sk]=sha1sum
Name[sl]=sha1sum
Name[sr]=СХА‑1 сума
Name[sr@ijekavian]=СХА‑1 сума
Name[sr@ijekavianlatin]=SHA‑1 suma
Name[sr@latin]=SHA‑1 suma
Name[sv]=SHA1-summa
Name[tr]=sha1sum
Name[uk]=sha1sum
Name[x-test]=xxsha1sumxx
Name[zh_CN]=sha1sum
Name[zh_TW]=sha1sum
create-command=0|xargs -0 sha1sum --
verify-command=sha1sum -c --
[Checksum Definition #2]
file-patterns=sha512sum.txt,.*\\\\.sha1
output-file=sha512sum.txt
id=sha512sum
Name=sha512sum
Name[ar]=تدقيق SHA512
Name[ca]=sha512sum
Name[ca@valencia]=sha512sum
Name[de]=sha512sum
Name[en_GB]=sha512sum
Name[es]=suma sha512
Name[fi]=sha512sum
Name[fr]=sha512sum
Name[gl]=sha512sum
Name[it]=sha512sum
Name[ko]=sha512sum
Name[nl]=sha512sum
Name[pl]=sha512sum
Name[pt]=sha512sum
Name[pt_BR]=sha512sum
Name[ru]=sha512sum
Name[sk]=sha512sum
Name[sl]=sha512sum
Name[sr]=СХА‑512 сума
Name[sr@ijekavian]=СХА‑512 сума
Name[sr@ijekavianlatin]=SHA‑512 suma
Name[sr@latin]=SHA‑512 suma
Name[sv]=SHA512-summa
Name[tr]=sha512sum
Name[uk]=sha512sum
Name[x-test]=xxsha512sumxx
Name[zh_CN]=sha512sum
Name[zh_TW]=sha512sum
create-command=0|xargs -0 sha512sum --
verify-command=sha512sum -c --
[Checksum Definition #3]
file-patterns=md5sum.txt,.*\\\\.md5
output-file=md5sum.txt
id=md5sum
Name=md5sum
Name[ar]=تدقيق MD5
Name[ca]=md5sum
Name[ca@valencia]=md5sum
Name[cs]=md5sum
Name[da]=md5sum
Name[de]=md5sum
Name[en_GB]=md5sum
Name[es]=md5sum
Name[et]=md5sum
Name[fi]=md5sum
Name[fr]=md5sum
Name[gl]=md5sum
Name[ia]=md5sum
Name[it]=md5sum
Name[ja]=md5sum
Name[ko]=md5sum
Name[nb]=md5sum
Name[nl]=md5sum
Name[nn]=md5sum
Name[pl]=md5sum
Name[pt]=md5sum
Name[pt_BR]=md5sum
Name[ru]=md5sum
Name[sk]=md5sum
Name[sl]=md5sum
Name[sr]=МД5 сума
Name[sr@ijekavian]=МД5 сума
Name[sr@ijekavianlatin]=MD5 suma
Name[sr@latin]=MD5 suma
Name[sv]=MD5-summa
Name[tr]=md5sum
Name[uk]=md5sum
Name[x-test]=xxmd5sumxx
Name[zh_CN]=md5sum
Name[zh_TW]=md5sum
create-command=0|xargs -0 md5sum --
verify-command=md5sum -c --
[Key Filter #0]
was-validated=false
Name=Not Validated Key
Name[ar]=ليس مفتاحًا متحقّقًا منه
Name[ca]=Clau no validada
Name[ca@valencia]=Clau no validada
Name[cs]=Neověřený klíč
Name[da]=Ikke godkendt nøgle
Name[de]=Ungeprüfter Schlüssel
Name[en_GB]=Not Validated Key
Name[es]=Clave no validada
Name[et]=Võtme ehtsus kontrollimatu
Name[fi]=Varmistamaton avain
Name[fr]=Clé non validée
Name[gl]=Non hai chave validada
Name[ia]=Clave non validate
Name[it]=Chiave non convalidata
Name[ja]=検証されていない鍵
Name[ko]=검증되지 않은 키
Name[nb]=Nøkkel ikke sjekket for gyldighet
Name[nl]=Geen gevalideerde sleutel
Name[nn]=Ikkje-validert nøkkel
Name[pl]=Niesprawdzony klucz
Name[pt]=Chave Não Validada
Name[pt_BR]=Chave não validada
Name[ru]=Непроверенный ключ
Name[sk]=Neoverený kľúč
Name[sl]=Nepreverjen ključ
Name[sr]=Неоверени кључ
Name[sr@ijekavian]=Неовјерени кључ
Name[sr@ijekavianlatin]=Neovjereni ključ
Name[sr@latin]=Neovereni ključ
Name[sv]=Nyckeln har inte validerats
Name[tr]=Geçerli Olmayan Anahtar
Name[uk]=Неперевірений ключ
Name[x-test]=xxNot Validated Keyxx
Name[zh_CN]=未校验的密钥
Name[zh_TW]=無已驗證的金鑰
[Key Filter #1]
was-validated=true
is-expired=true
is-revoked=false
foreground-color=255,0,0
Name=Expired Key
Name[ar]=مفتاح منقضي
Name[ca]=Clau expirada
Name[ca@valencia]=Clau expirada
Name[cs]=Klíč s prošlou platností
Name[da]=Udløbet nøgle
Name[de]=Abgelaufener Schlüssel
Name[en_GB]=Expired Key
Name[es]=Clave expirada
Name[et]=Aegunud võti
Name[fi]=Vanhentunut avain
Name[fr]=Clé expirée
Name[gl]=Chave caducada
Name[ia]=Clave expirate
Name[it]=Chiave scaduta
Name[ja]=期限切れの鍵
Name[ko]=만료된 키
Name[nb]=Utgått nøkkel
Name[nl]=Verlopen sleutel
Name[nn]=Forelda nøkkel
Name[pl]=Klucz, który utracił ważność
Name[pt]=Chave Expirada
Name[pt_BR]=Chave expirada
Name[ru]=Устаревший ключ
Name[sk]=Vypršaný kľúč
Name[sl]=Pretečen ključ
Name[sr]=Истекли кључ
Name[sr@ijekavian]=Истекли кључ
Name[sr@ijekavianlatin]=Istekli ključ
Name[sr@latin]=Istekli ključ
Name[sv]=Utgången nyckel
Name[tr]=Süresi Dolmuş Anahtar
Name[uk]=Застарілий ключ
Name[x-test]=xxExpired Keyxx
Name[zh_CN]=过期密钥
Name[zh_TW]=過期的金鑰
[Key Filter #2]
was-validated=true
is-revoked=true
Name=Revoked Key
Name[ar]=مفتاح مسحوب
Name[ca]=Clau revocada
Name[ca@valencia]=Clau revocada
Name[cs]=Odvolaný klíč
Name[da]=Fjernet nøgle
Name[de]=Widerrufener Schlüssel
Name[en_GB]=Revoked Key
Name[es]=Clave revocada
Name[et]=Tühistatud võti
Name[fi]=Peruttu avain
Name[fr]=Clé révoquée
Name[gl]=Chave revogada
Name[ia]=Clave revocate
Name[it]=Chiave revocata
Name[ja]=破棄された鍵
Name[ko]=취소된 키
Name[nb]=Tilbakekalt nøkkel
Name[nl]=Ingetrokken sleutel
Name[nn]=Tilbakekalla nøkkel
Name[pl]=Odwołany klucz
Name[pt]=Chave Revogada
Name[pt_BR]=Chave revogada
Name[ru]=Отозванный ключ
Name[sk]=Kľúč so zrušenou platnosťou
Name[sl]=Preklican ključ
Name[sr]=Опозвани кључ
Name[sr@ijekavian]=Опозвани кључ
Name[sr@ijekavianlatin]=Opozvani ključ
Name[sr@latin]=Opozvani ključ
Name[sv]=Återkallad nyckel
Name[tr]=İptal Edilmiş Anahtar
Name[uk]=Анульований ключ
Name[x-test]=xxRevoked Keyxx
Name[zh_CN]=吊销的密钥
Name[zh_TW]=已撤回的金鑰
[Key Filter #3]
was-validated=true
is-root-certificate=true
is-validity=ultimate
Name=Trusted Root Certificate
Name[ar]=شهادة جذر موثوقة
Name[ca]=Certificat arrel de confiança
Name[ca@valencia]=Certificat arrel de confiança
Name[cs]=Důvěryhodný kořenový certifikát
Name[da]=Root-certifikat der stoles på
Name[de]=Vertrauenswürdiges Wurzelzertifikat
Name[en_GB]=Trusted Root Certificate
Name[es]=Certificado raíz confiable
Name[et]=Usaldusväärne juursertifikaat
Name[fi]=Luotettu juurivarmenne
Name[fr]=Certificat racine de confiance
Name[gl]=Certificado raíz autenticado
Name[ia]=Certificato de radice con fide
Name[it]=Certificato radice affidabile
Name[ja]=信頼されたルート証明書
Name[ko]=신뢰하는 루트 인증 기관
Name[nb]=Tiltrodd rot-sertifikat
Name[nl]=Vertrouwd hoofdcertificaat
Name[nn]=Tiltrudd rotsertifikat
Name[pl]=Zaufany główny certyfikat
Name[pt]=Certificado de Raiz Fidedigno
Name[pt_BR]=Certificado raiz confiável
Name[ru]=Доверенный корневой сертификат
Name[sk]=Dôveryhodný koreňový certifikát
Name[sl]=Zaupanja vredno korensko potrdilo
Name[sr]=Поуздани корени сертификат
Name[sr@ijekavian]=Поуздани корјени сертификат
Name[sr@ijekavianlatin]=Pouzdani korjeni sertifikat
Name[sr@latin]=Pouzdani koreni sertifikat
Name[sv]=Pålitligt rotcertifikat
Name[tr]=Güvenilir Kök Sertifikası
Name[uk]=Кореневий сертифікат з довірою
Name[x-test]=xxTrusted Root Certificatexx
Name[zh_CN]=可信任的根证书
Name[zh_TW]=信任的根憑證
background-color=95,135,255
font-bold=true
[Key Filter #4]
was-validated=true
is-root-certificate=true
is-not-validity=ultimate
Name=Not Trusted Root Certificate
Name[ar]=شهادة جذر غير موثوقة
Name[ca]=Certificat arrel sense confiança
Name[ca@valencia]=Certificat arrel sense confiança
Name[cs]=Nedůvěryhodný kořenový certifikát
Name[da]=Root-certifikat der ikke stoles på
Name[de]=Nicht vertrauenswürdiges Wurzelzertifikat
Name[en_GB]=Not Trusted Root Certificate
Name[es]=Certificado raíz no confiable
Name[et]=Ebausaldusväärne juursertifikaat
Name[fi]=Ei-luotettu juurivarmenne
Name[fr]=Certificat racine non fiable
Name[gl]=Certificado raíz non autenticado
Name[ia]=Certificato de radice sin fide
Name[it]=Certificato radice non affidabile
Name[ja]=信頼されてないルート証明書
Name[ko]=신뢰하지 않는 루트 인증 기관
Name[nb]=Ikke tiltrodd rot-sertifikat
Name[nl]=Niet vertrouwd hoofdcertificaat
Name[nn]=Ikkje tiltrudd rotsertifikat
Name[pl]=Niezaufany główny certyfikat
Name[pt]=Certificado de Raiz Não Fidedigno
Name[pt_BR]=Certificado raiz não confiável
Name[ru]=Недоверенный корневой сертификат
Name[sk]=Nedôveryhodný koreňový certifikát
Name[sl]=Korensko potrdilo, ki ni zaupanja vredno
Name[sr]=Непоуздани корени сертификат
Name[sr@ijekavian]=Непоуздани корјени сертификат
Name[sr@ijekavianlatin]=Nepouzdani korjeni sertifikat
Name[sr@latin]=Nepouzdani koreni sertifikat
Name[sv]=Opålitligt rotcertifikat
Name[tr]=Güvenilmeyen Kök Sertifikası
Name[uk]=Кореневий сертифікат без довіри
Name[x-test]=xxNot Trusted Root Certificatexx
Name[zh_CN]=未信任的根证书
Name[zh_TW]=不被信任的根憑證
[Key Filter #5]
was-validated=true
is-qualified=true
font-bold=true
Name=Keys for Qualified Signatures
Name[ar]=مفاتيح لشهادات مؤهّلة
Name[ca]=Claus per a les signatures qualificades
Name[ca@valencia]=Claus per a les signatures qualificades
Name[cs]=Klíče kvalifikovaných podpisů
Name[da]=Nøgler til kvalificerede signaturer
Name[de]=Schlüssel für qualifizierte Signaturen
Name[en_GB]=Keys for Qualified Signatures
Name[es]=Claves para firmas cualificadas
Name[et]=Kvalifitseeritud allkirjade võtmed
Name[fi]=Hyväksyttyjen allekirjoitusten avaimet
Name[fr]=Clés pour les signatures qualifiées
Name[gl]=Chaves para sinaturas cualificadas
Name[ia]=Claves pro signaturas qualificate
Name[it]=Chiavi per le firme qualificate
Name[ja]=適格電子署名用の鍵
Name[ko]=신뢰하는 서명에 사용할 키
Name[nb]=Nøkler for kvalifiserte signaturer
Name[nl]=Sleutels voor gekwalificeerde ondertekeningen
Name[nn]=Nøklar for kvalifiserte signaturar
Name[pl]=Klucze do podpisów kwalifikowanych
Name[pt]=Chaves para as Assinaturas Qualificadas
Name[pt_BR]=Chaves para assinaturas qualificadas
Name[ru]=Ключи для подписывания
Name[sk]=Kľúče pre kvalifikované podpisy
Name[sl]=Ključi za kvalificirane podpise
Name[sr]=Кључеви за важеће потписе
Name[sr@ijekavian]=Кључеви за важеће потписе
Name[sr@ijekavianlatin]=Ključevi za važeće potpise
Name[sr@latin]=Ključevi za važeće potpise
Name[sv]=Nycklar för kvalificerade signaturer
Name[tr]=Yetkilendirilmiş İmzalar için Anahtarlar
Name[uk]=Ключі підписів обмеженого використання
Name[x-test]=xxKeys for Qualified Signaturesxx
Name[zh_CN]=合格签名的密钥
Name[zh_TW]=合格簽證的金鑰
[Key Filter #6]
was-validated=true
Name=Other Keys
Name[ar]=مفاتيح أخرى
Name[ca]=Altres claus
Name[ca@valencia]=Altres claus
Name[cs]=Ostatní klíče
Name[da]=Andre nøgler
Name[de]=Andere Schlüssel
Name[en_GB]=Other Keys
Name[es]=Otras claves
Name[et]=Muud võtmed
Name[fi]=Muut avaimet
Name[fr]=Autres clés
Name[gl]=Outras chaves
Name[ia]=Altere claves
Name[it]=Altre chiavi
Name[ja]=その他の鍵
Name[ko]=다른 키
Name[nb]=Andre nøkler
Name[nl]=Andere sleutels
Name[nn]=Andre nøklar
Name[pl]=Inne klucze
Name[pt]=Outras 'Cache'
Name[pt_BR]=Outras chaves
Name[ru]=Другие ключи
Name[sk]=Ostatné kľuče
Name[sl]=Drugi ključi
Name[sr]=Остали кључеви
Name[sr@ijekavian]=Остали кључеви
Name[sr@ijekavianlatin]=Ostali ključevi
Name[sr@latin]=Ostali ključevi
Name[sv]=Andra nycklar
Name[tr]=Diğer Anahtarlar
Name[uk]=Інші ключі
Name[x-test]=xxOther Keysxx
Name[zh_CN]=其它密钥
Name[zh_TW]=其他金鑰
[Key Filter #7]
is-cardkey=true
Name=Smartcard Key
Name[ar]=مفتاح بطاقة ذكيّة
Name[ca]=Clau de targeta intel·ligent
Name[ca@valencia]=Clau de targeta intel·ligent
Name[cs]=Klíč SmartCard
Name[da]=Smartcard-nøgle
Name[de]=Smartcard-Zertifikat
Name[en_GB]=Smartcard Key
Name[es]=Clave de tarjeta inteligente
Name[et]=Kiipkaardi võti
Name[fi]=Smartcard-avain
Name[fr]=Clé SmartCard
Name[gl]=Chave de smartcard
Name[ia]=Clave de carta intelligente
Name[it]=Chiave smartcard
Name[ja]=スマートカードの鍵
Name[ko]=스마트카드 키
Name[nb]=Smartkort-nøkkel
Name[nl]=Smartcard-sleutel
Name[nn]=Smartkort-nøkkel
Name[pl]=Klucz na karcie inteligentnej
Name[pt]=Chave do 'Smartcard'
Name[pt_BR]=Chave do Smartcard
Name[ru]=Ключ смарт-карты
Name[sk]=Smartcard kľúč
Name[sl]=Ključ na pametni kartici
Name[sr]=Кључ смарт-картица
Name[sr@ijekavian]=Кључ смарт-картица
Name[sr@ijekavianlatin]=Ključ smart-kartica
Name[sr@latin]=Ključ smart-kartica
Name[sv]=Smartkortsnyckel
Name[tr]=Akıllı Kart Anahtarı
Name[uk]=Ключ картки пам’яті
Name[x-test]=xxSmartcard Keyxx
Name[zh_CN]=智能卡密钥
Name[zh_TW]=智慧卡金鑰
icon=smartcard
[Key Filter #8]
is-openpgp-key=true
Name=OpenPGP Certificates
Name[ar]=شهادات OpenPGP
Name[ca]=Certificats OpenPGP
Name[ca@valencia]=Certificats OpenPGP
Name[cs]=Certifikáty OpenPGP
Name[da]=OpenPGP-certifikater
Name[de]=OpenPGP-Zertifikate
Name[en_GB]=OpenPGP Certificates
Name[es]=Certificados OpenPGP
Name[et]=OpenPGP sertifikaadid
Name[fi]=OpenPGP-varmenteet
Name[fr]=Certificats OpenPGP
Name[gl]=Certificados OpenPGP
Name[it]=Certificati OpenPGP
Name[ko]=OpenPGP 인증서
Name[nl]=OpenPGP-certificaten
Name[pl]=Certyfikaty OpenPGP
Name[pt]=Certificados do OpenPGP
Name[pt_BR]=Certificados OpenPGP
Name[ru]=Сертификаты OpenPGP
Name[sk]=Certifikáty OpenPGP
Name[sl]=Potrdila OpenPGP
Name[sr]=ОпенПГП сертификати
Name[sr@ijekavian]=ОпенПГП сертификати
Name[sr@ijekavianlatin]=OpenPGP sertifikati
Name[sr@latin]=OpenPGP sertifikati
Name[sv]=OpenPGP-certifikat
Name[tr]=OpenPGP Sertifikaları
Name[uk]=Сертифікати OpenPGP
Name[x-test]=xxOpenPGP Certificatesxx
Name[zh_CN]=OpenPGP 证书
Name[zh_TW]=OpenPGP 憑證
[Key Filter #9]
is-openpgp-key=false
Name=X509 Certificates
Name[ar]=شهادات X509
Name[ca]=Certificats X509
Name[ca@valencia]=Certificats X509
Name[cs]=Certifikáty X509
Name[da]=X509-certifikater
Name[de]=X509-Zertifikate
Name[en_GB]=X509 Certificates
Name[es]=Certificados X509
Name[et]=X509 sertifikaadid
Name[fi]=X509-varmenteet
Name[fr]=Certificats X509
Name[gl]=Certificados X509
Name[it]=Certificati X509
Name[ko]=X509 인증서
Name[nl]=X509-certificaten
Name[pl]=Certyfikaty X509
Name[pt]=Certificados X509
Name[pt_BR]=Certificados X.509
Name[ru]=Сертификаты X.509
Name[sk]=Certifikáty X509
Name[sl]=Potrdila X509
Name[sr]=Икс.509 сертификати
Name[sr@ijekavian]=Икс.509 сертификати
Name[sr@ijekavianlatin]=X.509 sertifikati
Name[sr@latin]=X.509 sertifikati
Name[sv]=X509-certifikat
Name[tr]=X509 Sertifikaları
Name[uk]=Сертифікати X509
Name[x-test]=xxX509 Certificatesxx
Name[zh_CN]=X509 证书
Name[zh_TW]=X509 憑證
+
+# Filters that filter for is-de-vs
+# are only shown in compliance mode
+# de-vs
+[Key Filter #10]
+is-de-vs=true
+Name=VS-NfD Compliant
+Name[de]=VS-NfD Konform
+background-color=213,250,226
+
+[Key Filter #11]
+is-de-vs=false
+Name=Not VS-NfD Compliant
+Name[de]=Nicht VS-NfD Konform
+background-color=250,233,235

File Metadata

Mime Type
text/x-diff
Expires
Sat, May 10, 8:37 AM (1 d, 12 h)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
2d/df/7a12cdd0ca7ee2956bb6af015ca1

Event Timeline