diff --git a/src/kleo/dn.h b/src/kleo/dn.h index e24a94a10..c121f3ee5 100644 --- a/src/kleo/dn.h +++ b/src/kleo/dn.h @@ -1,140 +1,140 @@ /* dn.h This file is part of libkleopatra, the KDE keymanagement library SPDX-FileCopyrightText: 2004 Klarälvdalens Datakonsult AB SPDX-License-Identifier: GPL-2.0-or-later */ #ifndef __KLEO_DN_H__ #define __KLEO_DN_H__ #include "kleo_export.h" #include #include class QStringList; class QWidget; namespace Kleo { class DNAttributeOrderConfigWidget; } namespace Kleo { /** @short DN Attribute mapper */ class KLEO_EXPORT DNAttributeMapper { DNAttributeMapper(); ~DNAttributeMapper(); public: static const DNAttributeMapper *instance(); QString name2label(const QString &s) const; QStringList names() const; const QStringList &attributeOrder() const; void setAttributeOrder(const QStringList &order); DNAttributeOrderConfigWidget *configWidget(QWidget *parent = nullptr) const; private: class Private; Private *d; static DNAttributeMapper *mSelf; }; /** @short DN parser and reorderer */ class KLEO_EXPORT DN { public: class Attribute; - typedef QVector AttributeList; - typedef AttributeList::const_iterator const_iterator; + using AttributeList = QVector; + using const_iterator = AttributeList::const_iterator; DN(); explicit DN(const QString &dn); explicit DN(const char *utf8DN); DN(const DN &other); ~DN(); const DN &operator=(const DN &other); /** @return the value in rfc-2253-escaped form */ static QString escape(const QString &value); /** @return the DN in a reordered form, according to the settings in the [DN] group of the application's config file */ QString prettyDN() const; /** @return the DN in the original form */ QString dn() const; /** \overload Uses \a sep as separator (default: ,) */ QString dn(const QString &sep) const; QString operator[](const QString &attr) const; void append(const Attribute &attr); const_iterator begin() const; const_iterator end() const; private: void detach(); private: class Private; Private *d; }; class KLEO_EXPORT DN::Attribute { public: - typedef DN::AttributeList List; + using List = DN::AttributeList; explicit Attribute(const QString &name = QString(), const QString &value = QString()) : mName(name.toUpper()), mValue(value) {} Attribute(const Attribute &other) : mName(other.name()), mValue(other.value()) {} const Attribute &operator=(const Attribute &other) { if (this != &other) { mName = other.name(); mValue = other.value(); } return *this; } const QString &name() const { return mName; } const QString &value() const { return mValue; } void setValue(const QString &value) { mValue = value; } private: QString mName; QString mValue; }; } #endif // __KLEO_DN_H__ diff --git a/src/kleo/keyfiltermanager.cpp b/src/kleo/keyfiltermanager.cpp index ad82898c6..9e0e769c2 100644 --- a/src/kleo/keyfiltermanager.cpp +++ b/src/kleo/keyfiltermanager.cpp @@ -1,427 +1,427 @@ /* keyfiltermanager.cpp This file is part of libkleopatra, the KDE keymanagement library SPDX-FileCopyrightText: 2004 Klarälvdalens Datakonsult AB SPDX-License-Identifier: GPL-2.0-or-later */ #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 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::beginResetModel; /* upgrade to public */ using QAbstractListModel::endResetModel; }; 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 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); } }; } 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)); return result; } class KeyFilterManager::Private { public: Private() : filters(), appearanceFilters(), model(this) {} void clear() { model.beginResetModel(); filters.clear(); appearanceFilters.clear(); model.endResetModel(); } 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(); KSharedConfigPtr config = KSharedConfig::openConfig(QStringLiteral("libkleopatrarc")); const QStringList groups = config->groupList().filter(QRegularExpression(QStringLiteral("^Key Filter #\\d+$"))); bool ignoreDeVs = Formatting::complianceMode() != QLatin1String("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(); + return {}; } 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(); + return {}; } 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/kleo/stl_util.h b/src/kleo/stl_util.h index 01ce8b212..6c1b4eeaa 100644 --- a/src/kleo/stl_util.h +++ b/src/kleo/stl_util.h @@ -1,262 +1,262 @@ /**************************************************************************** ** SPDX-FileCopyrightText: 2001-2007 Klarälvdalens Datakonsult AB. All rights reserved. ** ** This file is part of the KD Tools library. ** ** SPDX-License-Identifier: GPL-2.0-or-later ** **********************************************************************/ #ifndef __KDTOOLSCORE_STL_UTIL_H__ #define __KDTOOLSCORE_STL_UTIL_H__ #include #include #include #include #include namespace kdtools { template struct filter_iterator { using value_type = typename std::iterator_traits<_Iterator>::value_type; using reference = typename std::iterator_traits<_Iterator>::reference; using pointer = typename std::iterator_traits<_Iterator>::pointer; using difference_type = typename std::iterator_traits<_Iterator>::difference_type; filter_iterator(UnaryPredicate pred, _Iterator it, _Iterator last) : it(it), last(last), pred(pred) {} template filter_iterator(const filter_iterator<_OtherIter, UnaryPredicate> &other) : it(other.it), last(other.last), pred(other.pred) {} filter_iterator &operator++() { while (++it != last && !pred(*it)){} return *this; } filter_iterator operator++(int) { auto retval = *this; while(++it != last && !pred(*it)){} return retval; } bool operator==(filter_iterator other) const { return it == other.it; } bool operator!=(filter_iterator other) const { return it != other.it; } typename _Iterator::reference operator*() const { return *it; } private: _Iterator it, last; UnaryPredicate pred; }; template filter_iterator::type, UnaryPredicate> make_filter_iterator(UnaryPredicate &&pred, _Iterator &&it, _Iterator &&last) { return filter_iterator::type, UnaryPredicate>( std::forward(pred), std::forward<_Iterator>(it), std::forward<_Iterator>(last)); } template OutputIterator copy_if(InputIterator first, InputIterator last, OutputIterator dest, UnaryPredicate pred) { while (first != last) { if (pred(*first)) { *dest = *first; ++dest; } ++first; } return dest; } template void transform_if(InputIterator first, InputIterator last, OutputIterator dest, UnaryPredicate pred, UnaryFunction filter) { for (; first != last; ++first) { if (filter(*first)) { *dest++ = pred(*first); } } } template OutputIterator copy_1st_if(InputIterator first, InputIterator last, OutputIterator dest, Predicate pred) { const auto trans = [](typename std::iterator_traits::reference v) { return std::get<0>(v); }; kdtools::transform_if(first, last, dest, trans, [&pred, &trans](typename std::iterator_traits::reference v) { return pred(trans(v)); }); return dest; } template OutputIterator copy_2nd_if(InputIterator first, InputIterator last, OutputIterator dest, Predicate pred) { const auto trans = [](typename std::iterator_traits::reference v) { return std::get<1>(v); }; kdtools::transform_if(first, last, dest, trans, [&pred, &trans](typename std::iterator_traits::reference v) { return pred(trans(v)); }); return dest; } template OutputIterator transform_1st(InputIterator first, InputIterator last, OutputIterator dest, UnaryFunction func) { return std::transform(first, last, dest, [func](typename std::iterator_traits::reference v) { return func(std::get<0>(v)); }); } template OutputIterator transform_2nd(InputIterator first, InputIterator last, OutputIterator dest, UnaryFunction func) { return std::transform(first, last, dest, [func](typename std::iterator_traits::reference v) { return func(std::get<1>(v)); }); } template Value accumulate_if(InputIterator first, InputIterator last, UnaryPredicate filter, const Value &value = Value()) { return std::accumulate(make_filter_iterator(filter, first, last), make_filter_iterator(filter, last, last), value); } template Value accumulate_if(InputIterator first, InputIterator last, UnaryPredicate filter, const Value &value, BinaryOperation op) { return std::accumulate(make_filter_iterator(filter, first, last), make_filter_iterator(filter, last, last), value, op); } template Value accumulate_transform(InputIterator first, InputIterator last, UnaryFunction map, const Value &value = Value()) { return std::accumulate(first, last, value, [map](Value lhs, typename std::iterator_traits::reference rhs) { return lhs + map(rhs); }); } template Value accumulate_transform(InputIterator first, InputIterator last, UnaryFunction map, const Value &value, BinaryOperation op) { return std::accumulate(first, last, value, [map, op](typename InputIterator::reference lhs, typename InputIterator::reference rhs) { return op(map(lhs), map(rhs)); }); } template Value accumulate_transform_if(InputIterator first, InputIterator last, UnaryFunction map, UnaryPredicate filter, const Value &value, BinaryOperation op) { return accumulate_transform(make_filter_iterator(filter, first, last), make_filter_iterator(filter, last, last), map, value, op); } template BinaryOperation for_each_adjacent_pair(InputIterator first, InputIterator last, BinaryOperation op) { - typedef typename std::iterator_traits::value_type ValueType; + using ValueType = typename std::iterator_traits::value_type; if (first == last) { return op; } ValueType value = *first; while (++first != last) { ValueType tmp = *first; op(value, tmp); value = tmp; } return op; } template std::pair separate_if(InputIterator first, InputIterator last, OutputIterator1 dest1, OutputIterator2 dest2, UnaryPredicate pred) { while (first != last) { if (pred(*first)) { *dest1 = *first; ++dest1; } else { *dest2 = *first; ++dest2; } ++first; } return std::make_pair(dest1, dest2); } //@{ /** Versions of std::set_intersection optimized for ForwardIterator's */ template OutputIterator set_intersection(ForwardIterator first1, ForwardIterator last1, ForwardIterator2 first2, ForwardIterator2 last2, OutputIterator result) { while (first1 != last1 && first2 != last2) { if (*first1 < *first2) { first1 = std::lower_bound(++first1, last1, *first2); } else if (*first2 < *first1) { first2 = std::lower_bound(++first2, last2, *first1); } else { *result = *first1; ++first1; ++first2; ++result; } } return result; } template OutputIterator set_intersection(ForwardIterator first1, ForwardIterator last1, ForwardIterator2 first2, ForwardIterator2 last2, OutputIterator result, BinaryPredicate pred) { while (first1 != last1 && first2 != last2) { if (pred(*first1, *first2)) { first1 = std::lower_bound(++first1, last1, *first2, pred); } else if (pred(*first2, *first1)) { first2 = std::lower_bound(++first2, last2, *first1, pred); } else { *result = *first1; ++first1; ++first2; ++result; } } return result; } //@} template bool set_intersects(ForwardIterator first1, ForwardIterator last1, ForwardIterator2 first2, ForwardIterator2 last2, BinaryPredicate pred) { while (first1 != last1 && first2 != last2) { if (pred(*first1, *first2)) { first1 = std::lower_bound(++first1, last1, *first2, pred); } else if (pred(*first2, *first1)) { first2 = std::lower_bound(++first2, last2, *first1, pred); } else { return true; } } return false; } //@{ } #endif /* __KDTOOLSCORE_STL_UTIL_H__ */ diff --git a/src/models/keycache.cpp b/src/models/keycache.cpp index 67ec27149..72c7e30f5 100644 --- a/src/models/keycache.cpp +++ b/src/models/keycache.cpp @@ -1,1355 +1,1355 @@ /* -*- mode: c++; c-basic-offset:4 -*- models/keycache.cpp This file is part of Kleopatra, the KDE keymanager SPDX-FileCopyrightText: 2007, 2008 Klarälvdalens Datakonsult AB SPDX-FileCopyrightText: 2018 Intevation GmbH SPDX-FileCopyrightText: 2020 g10 Code GmbH SPDX-FileContributor: Ingo Klöcker SPDX-License-Identifier: GPL-2.0-or-later */ #include "keycache.h" #include "keycache_p.h" #include "libkleo_debug.h" #include "kleo/predicates.h" #include "kleo/stl_util.h" #include "kleo/dn.h" #include "utils/filesystemwatcher.h" #include #include #include #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include using namespace Kleo; using namespace GpgME; using namespace KMime::Types; static const unsigned int hours2ms = 1000 * 60 * 60; // // // KeyCache // // namespace { make_comparator_str(ByEMail, .first.c_str()); } class KeyCache::Private { friend class ::Kleo::KeyCache; KeyCache *const q; public: explicit Private(KeyCache *qq) : q(qq), m_refreshInterval(1), m_initalized(false), m_pgpOnly(true), m_remarks_enabled(false) { connect(&m_autoKeyListingTimer, &QTimer::timeout, q, [this]() { q->startKeyListing(); }); updateAutoKeyListingTimer(); } ~Private() { if (m_refreshJob) { m_refreshJob->cancel(); } } template < template