13#include <config-libkleo.h>
15#include "defaultkeyfilter.h"
16#include "utils/compliance.h"
18#if GPGMEPP_KEY_HAS_HASCERTIFY_SIGN_ENCRYPT_AUTHENTICATE
20#include <libkleo/compat.h>
22#include <libkleo/compliance.h>
23#include <libkleo/formatting.h>
24#include <libkleo/keyhelpers.h>
31static bool is_card_key(
const Key &key)
33 const std::vector<Subkey> sks = key.subkeys();
34 return std::find_if(sks.begin(), sks.end(), std::mem_fn(&Subkey::isCardKey)) != sks.end();
37class DefaultKeyFilter::Private
50 MatchContexts mMatchContexts = AnyMatchContext;
51 unsigned int mSpecificity = 0;
54 bool mStrikeOut =
false;
55 bool mUseFullFont =
false;
58 TriState mRevoked = DoesNotMatter;
59 TriState mExpired = DoesNotMatter;
60 TriState mInvalid = DoesNotMatter;
61 TriState mDisabled = DoesNotMatter;
62 TriState mRoot = DoesNotMatter;
63 TriState mCanEncrypt = DoesNotMatter;
64 TriState mCanSign = DoesNotMatter;
65 TriState mCanCertify = DoesNotMatter;
66 TriState mCanAuthenticate = DoesNotMatter;
67 TriState mHasEncrypt = DoesNotMatter;
68 TriState mHasSign = DoesNotMatter;
69 TriState mHasCertify = DoesNotMatter;
70 TriState mHasAuthenticate = DoesNotMatter;
71 TriState mQualified = DoesNotMatter;
72 TriState mCardKey = DoesNotMatter;
73 TriState mHasSecret = DoesNotMatter;
74 TriState mIsOpenPGP = DoesNotMatter;
75 TriState mWasValidated = DoesNotMatter;
76 TriState mIsDeVs = DoesNotMatter;
77 TriState mBad = DoesNotMatter;
78 TriState mValidIfSMIME = DoesNotMatter;
80 LevelState mOwnerTrust = LevelDoesNotMatter;
81 GpgME::Key::OwnerTrust mOwnerTrustReferenceLevel = Key::OwnerTrust::Unknown;
82 LevelState mValidity = LevelDoesNotMatter;
83 GpgME::UserID::Validity mValidityReferenceLevel = UserID::Validity::Unknown;
86DefaultKeyFilter::DefaultKeyFilter()
92DefaultKeyFilter::~DefaultKeyFilter() =
default;
94bool DefaultKeyFilter::matches(
const Key &key, MatchContexts contexts)
const
96 if (!(d->mMatchContexts & contexts)) {
102#define MATCH(member, method) \
104 if (member != DoesNotMatter && key.method() != bool(member == Set)) { \
108#define IS_MATCH(what) MATCH(d->m##what, is##what)
109#define CAN_MATCH(what) MATCH(d->mCan##what, can##what)
110#if GPGMEPP_KEY_HAS_HASCERTIFY_SIGN_ENCRYPT_AUTHENTICATE
111#define HAS_MATCH(what) MATCH(d->mHas##what, has##what)
113#define HAS_MATCH(what) \
115 if (d->mHas##what != DoesNotMatter && Kleo::keyHas##what(key) != bool(d->mHas##what == Set)) { \
128 CAN_MATCH(Authenticate);
132 HAS_MATCH(Authenticate);
134 if (d->mCardKey != DoesNotMatter) {
135 if ((d->mCardKey == Set && !is_card_key(key)) || (d->mCardKey == NotSet && is_card_key(key))) {
139 MATCH(d->mHasSecret, hasSecret);
141 if (d->mIsOpenPGP != DoesNotMatter &&
bool(key.protocol() == GpgME::OpenPGP) !=
bool(d->mIsOpenPGP == Set)) {
144 if (d->mWasValidated != DoesNotMatter &&
bool(key.keyListMode() & GpgME::Validate) !=
bool(d->mWasValidated == Set)) {
147 if (d->mIsDeVs != DoesNotMatter &&
bool(DeVSCompliance::keyIsCompliant(key)) !=
bool(d->mIsDeVs == Set)) {
150 if (d->mBad != DoesNotMatter &&
152 bool(key.isNull() || key.isRevoked() || key.isExpired() || key.isDisabled() || key.isInvalid()) !=
bool(d->mBad == Set)) {
155 const UserID uid = key.userID(0);
156 if ((key.protocol() == GpgME::CMS)
157 && (d->mValidIfSMIME != DoesNotMatter)
158 && (
bool(uid.validity() >= UserID::Full) !=
bool(d->mValidIfSMIME == Set))) {
161 switch (d->mOwnerTrust) {
163 case LevelDoesNotMatter:
166 if (key.ownerTrust() != d->mOwnerTrustReferenceLevel) {
171 if (key.ownerTrust() == d->mOwnerTrustReferenceLevel) {
176 if (
static_cast<int>(key.ownerTrust()) <
static_cast<int>(d->mOwnerTrustReferenceLevel)) {
181 if (
static_cast<int>(key.ownerTrust()) >
static_cast<int>(d->mOwnerTrustReferenceLevel)) {
186 switch (d->mValidity) {
188 case LevelDoesNotMatter:
191 if (uid.validity() != d->mValidityReferenceLevel) {
196 if (uid.validity() == d->mValidityReferenceLevel) {
201 if (
static_cast<int>(uid.validity()) <
static_cast<int>(d->mValidityReferenceLevel)) {
206 if (
static_cast<int>(uid.validity()) >
static_cast<int>(d->mValidityReferenceLevel)) {
214bool DefaultKeyFilter::matches(
const UserID &userID, MatchContexts contexts)
const
216 if (!(d->mMatchContexts & contexts)) {
222#define MATCH_KEY(member, method) \
224 if (member != DoesNotMatter && userID.parent().method() != bool(member == Set)) { \
228#define IS_MATCH_KEY(what) MATCH_KEY(d->m##what, is##what)
229#define CAN_MATCH_KEY(what) MATCH_KEY(d->mCan##what, can##what)
230#if GPGMEPP_KEY_HAS_HASCERTIFY_SIGN_ENCRYPT_AUTHENTICATE
231#define HAS_MATCH_KEY(what) MATCH_KEY(d->mHas##what, has##what)
233#define HAS_MATCH_KEY(what) \
235 if (d->mHas##what != DoesNotMatter && Kleo::keyHas##what(userID.parent()) != bool(d->mHas##what == Set)) { \
244#define MATCH(member, method) \
246 if (member != DoesNotMatter && (userID.parent().method() != bool(member == Set) || userID.method() != bool(member == Set))) { \
250#define IS_MATCH(what) MATCH(d->m##what, is##what)
252 IS_MATCH_KEY(Expired);
254 if (d->mExpired != DoesNotMatter && (userID.parent().isExpired() !=
bool(d->mExpired == Set) || isExpired(userID) !=
bool(d->mExpired == Set))) {
258 IS_MATCH_KEY(Disabled);
260 CAN_MATCH_KEY(Encrypt);
262 CAN_MATCH_KEY(Certify);
263 CAN_MATCH_KEY(Authenticate);
264 HAS_MATCH_KEY(Encrypt);
266 HAS_MATCH_KEY(Certify);
267 HAS_MATCH_KEY(Authenticate);
268 IS_MATCH_KEY(Qualified);
269 if (d->mCardKey != DoesNotMatter) {
270 if ((d->mCardKey == Set && !is_card_key(userID.parent())) || (d->mCardKey == NotSet && is_card_key(userID.parent()))) {
274 MATCH_KEY(d->mHasSecret, hasSecret);
276 if (d->mIsOpenPGP != DoesNotMatter &&
bool(userID.parent().protocol() == GpgME::OpenPGP) !=
bool(d->mIsOpenPGP == Set)) {
279 if (d->mWasValidated != DoesNotMatter &&
bool(userID.parent().keyListMode() & GpgME::Validate) !=
bool(d->mWasValidated == Set)) {
282 if (d->mIsDeVs != DoesNotMatter &&
bool(DeVSCompliance::userIDIsCompliant(userID)) !=
bool(d->mIsDeVs == Set)) {
285 if (d->mBad != DoesNotMatter &&
287 bool(userID.parent().isNull() || userID.isNull() || userID.parent().isRevoked() || userID.isRevoked() || userID.parent().isExpired()
288 || userID.parent().isDisabled() || userID.parent().isInvalid() || userID.isInvalid())
289 !=
bool(d->mBad == Set)) {
292 if ((userID.parent().protocol() == GpgME::CMS)
293 && (d->mValidIfSMIME != DoesNotMatter)
294 && (
bool(userID.validity() >= UserID::Full) !=
bool(d->mValidIfSMIME == Set))) {
297 switch (d->mOwnerTrust) {
299 case LevelDoesNotMatter:
302 if (userID.parent().ownerTrust() != d->mOwnerTrustReferenceLevel) {
307 if (userID.parent().ownerTrust() == d->mOwnerTrustReferenceLevel) {
312 if (
static_cast<int>(userID.parent().ownerTrust()) <
static_cast<int>(d->mOwnerTrustReferenceLevel)) {
317 if (
static_cast<int>(userID.parent().ownerTrust()) >
static_cast<int>(d->mOwnerTrustReferenceLevel)) {
322 switch (d->mValidity) {
324 case LevelDoesNotMatter:
327 if (userID.validity() != d->mValidityReferenceLevel) {
332 if (userID.validity() == d->mValidityReferenceLevel) {
337 if (
static_cast<int>(userID.validity()) <
static_cast<int>(d->mValidityReferenceLevel)) {
342 if (
static_cast<int>(userID.validity()) >
static_cast<int>(d->mValidityReferenceLevel)) {
350KeyFilter::FontDescription DefaultKeyFilter::fontDescription()
const
352 if (d->mUseFullFont) {
353 return FontDescription::create(font(), bold(), italic(), strikeOut());
355 return FontDescription::create(bold(), italic(), strikeOut());
359void DefaultKeyFilter::setFgColor(
const QColor &value)
364void DefaultKeyFilter::setBgColor(
const QColor &value)
369void DefaultKeyFilter::setName(
const QString &value)
374void DefaultKeyFilter::setIcon(
const QString &value)
379void DefaultKeyFilter::setId(
const QString &value)
384void DefaultKeyFilter::setMatchContexts(MatchContexts value)
386 d->mMatchContexts = value;
389void DefaultKeyFilter::setSpecificity(
unsigned int value)
391 d->mSpecificity = value;
394void DefaultKeyFilter::setItalic(
bool value)
399void DefaultKeyFilter::setBold(
bool value)
404void DefaultKeyFilter::setStrikeOut(
bool value)
406 d->mStrikeOut = value;
409void DefaultKeyFilter::setUseFullFont(
bool value)
411 d->mUseFullFont = value;
414void DefaultKeyFilter::setFont(
const QFont &value)
436 d->mDisabled = value;
446 d->mCanEncrypt = value;
456 d->mCanCertify = value;
461 d->mCanAuthenticate = value;
466 d->mHasEncrypt = value;
476 d->mHasCertify = value;
481 d->mHasAuthenticate = value;
486 d->mQualified = value;
496 d->mHasSecret = value;
501 d->mIsOpenPGP = value;
506 d->mWasValidated = value;
511 d->mOwnerTrust = value;
514void DefaultKeyFilter::setOwnerTrustReferenceLevel(GpgME::Key::OwnerTrust value)
516 d->mOwnerTrustReferenceLevel = value;
521 d->mValidity = value;
524void DefaultKeyFilter::setValidityReferenceLevel(GpgME::UserID::Validity value)
526 d->mValidityReferenceLevel = value;
541 d->mValidIfSMIME = value;
544QColor DefaultKeyFilter::fgColor()
const
549QColor DefaultKeyFilter::bgColor()
const
554QString DefaultKeyFilter::name()
const
559QString DefaultKeyFilter::icon()
const
564QString DefaultKeyFilter::id()
const
569QFont DefaultKeyFilter::font()
const
576 return d->mMatchContexts;
579unsigned int DefaultKeyFilter::specificity()
const
581 return d->mSpecificity;
584bool DefaultKeyFilter::italic()
const
589bool DefaultKeyFilter::bold()
const
594bool DefaultKeyFilter::strikeOut()
const
596 return d->mStrikeOut;
599bool DefaultKeyFilter::useFullFont()
const
601 return d->mUseFullFont;
631 return d->mCanEncrypt;
641 return d->mCanCertify;
646 return d->mCanAuthenticate;
651 return d->mHasEncrypt;
661 return d->mHasCertify;
666 return d->mHasAuthenticate;
671 return d->mQualified;
681 return d->mHasSecret;
686 return d->mIsOpenPGP;
691 return d->mWasValidated;
696 return d->mOwnerTrust;
699GpgME::Key::OwnerTrust DefaultKeyFilter::ownerTrustReferenceLevel()
const
701 return d->mOwnerTrustReferenceLevel;
709GpgME::UserID::Validity DefaultKeyFilter::validityReferenceLevel()
const
711 return d->mValidityReferenceLevel;
726 return d->mValidIfSMIME;
729QString DefaultKeyFilter::description()
const
731 return d->mDescription;
734void DefaultKeyFilter::setDescription(
const QString &description)
736 d->mDescription = description;
TriState
Used for bool checks.
LevelState
Used for level checks.
void setValidIfSMIME(TriState value)
If value is Set, then invalid S/MIME certificates do not match.
An abstract base class key filters.