diff --git a/src/kleo/defaultkeyfilter.cpp b/src/kleo/defaultkeyfilter.cpp index b61eee4..00fdde6 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 #include using namespace GpgME; using namespace Kleo; static bool is_card_key(const Key &key) { const std::vector 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(key.ownerTrust()) < static_cast(d_ptr->mOwnerTrustReferenceLevel)) { return false; } break; case IsAtMost: if (static_cast(key.ownerTrust()) > static_cast(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(uid.validity()) < static_cast(d_ptr->mValidityReferenceLevel)) { return false; } break; case IsAtMost: if (static_cast(uid.validity()) > static_cast(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 e762b0c..d8d29c1 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 #include #include #include #include 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 d_ptr; }; } // namespace Kleo #endif diff --git a/src/kleo/kconfigbasedkeyfilter.cpp b/src/kleo/kconfigbasedkeyfilter.cpp index 90deaf7..1aa3925 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 #include #include #include 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("foreground-color", QColor())); setBgColor(config.readEntry("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 c919812..afa9a14 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 #include #include #include #include #include #include #include #include #include #include #include #include #include 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> defaultFilters() { std::vector > result; result.reserve(6); result.push_back(std::shared_ptr(new MyCertificatesKeyFilter)); result.push_back(std::shared_ptr(new TrustedCertificatesKeyFilter)); result.push_back(std::shared_ptr(new FullCertificatesKeyFilter)); result.push_back(std::shared_ptr(new OtherCertificatesKeyFilter)); result.push_back(std::shared_ptr(new AllCertificatesKeyFilter)); result.push_back(std::shared_ptr(new KeyNotValidFilter)); - if (Formatting::complianceMode() == QStringLiteral("de-vs")) { - result.push_back(std::shared_ptr(new DeVsCompliantKeyFilter)); - } - return result; -} - -static std::vector> defaultAppearanceFilters() -{ - std::vector > result; - if (Formatting::complianceMode() == QStringLiteral("de-vs")) { - result.reserve(2); - result.push_back(std::shared_ptr(new KeyDeVSValidAppearanceFilter)); - result.push_back(std::shared_ptr(new KeyNotDeVSValidAppearanceFilter)); - } return result; } class KeyFilterManager::Private { public: Private() : filters(), appearanceFilters(), model(this) {} void clear() { filters.clear(); appearanceFilters.clear(); model.reset(); } std::vector> filters; std::vector> 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 &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 &filter) { return filter->matches(key, contexts); }); if (it != d->filters.cend()) { return *it; } static const std::shared_ptr null; return null; } std::vector> KeyFilterManager::filtersMatching(const Key &key, KeyFilter::MatchContexts contexts) const { std::vector> 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 &filter) { return !filter->matches(key, contexts); }); return result; } namespace { struct ByDecreasingSpecificity : std::binary_function, std::shared_ptr, bool> { bool operator()(const std::shared_ptr &lhs, const std::shared_ptr &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(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 &KeyFilterManager::keyFilterByID(const QString &id) const { const auto it = std::find_if(d->filters.begin(), d->filters.end(), [id](const std::shared_ptr &filter) { return filter->id() == id; }); if (it != d->filters.end()) { return *it; } static const std::shared_ptr null; return null; } const std::shared_ptr &KeyFilterManager::fromModelIndex(const QModelIndex &idx) const { if (!idx.isValid() || idx.model() != &d->model || idx.row() < 0 || static_cast(idx.row()) >= d->filters.size()) { static const std::shared_ptr null; return null; } return d->filters[idx.row()]; } QModelIndex KeyFilterManager::toModelIndex(const std::shared_ptr &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(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> &filters, const Key &key, const KeyFilter::FontDescription &initial) { return kdtools::accumulate_if(filters.begin(), filters.end(), [&key](const std::shared_ptr &filter) { return filter->matches(key, KeyFilter::Appearance); }, initial, [](const KeyFilter::FontDescription &lhs, const std::shared_ptr &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> &filters, const Key &key, QColor(KeyFilter::*fun)() const) { const auto it = std::find_if(filters.cbegin(), filters.cend(), [&fun, &key](const std::shared_ptr &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> &filters, const Key &key, QString(KeyFilter::*fun)() const) { const auto it = std::find_if(filters.cbegin(), filters.cend(), [&fun, &key](const std::shared_ptr &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 7fb5175..b302aea 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 a8fe10f..2e7dc63 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