Page Menu
Home
GnuPG
Search
Configure Global Search
Log In
Files
F35401168
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Size
24 KB
Subscribers
None
View Options
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 889c2754..abedab40 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,400 +1,403 @@
# SPDX-License-Identifier: CC0-1.0
# SPDX-FileCopyrightText: none
# target_include_directories does not handle empty include paths
include_directories(
${Boost_INCLUDE_DIRS}
${GPGME_INCLUDES}
)
add_definitions(-DTRANSLATION_DOMAIN=\"libkleopatra6\")
#add_definitions( -DQT_NO_CAST_FROM_ASCII )
#add_definitions( -DQT_NO_CAST_TO_ASCII )
kde_enable_exceptions()
add_definitions( -DGPGMEPP_ERR_SOURCE_DEFAULT=13 ) # 13 is GPG_ERR_SOURCE_KLEO, even if gpg-error's too old to know about
add_subdirectory( pics )
add_library(KPim6Libkleo)
add_library(KPim6::Libkleo ALIAS KPim6Libkleo)
########### next target ###############
target_sources(KPim6Libkleo PRIVATE
kleo/auditlogentry.cpp
kleo/auditlogentry.h
kleo/checksumdefinition.cpp
kleo/checksumdefinition.h
kleo/debug.cpp
kleo/debug.h
kleo/defaultkeyfilter.cpp
kleo/defaultkeyfilter.h
kleo/defaultkeygenerationjob.cpp
kleo/defaultkeygenerationjob.h
kleo/docaction.cpp kleo/docaction.h
kleo/dn.cpp
kleo/dn.h
kleo/enum.cpp
kleo/enum.h
kleo/expirychecker.cpp
kleo/expirychecker.h
kleo/expirycheckerconfig.cpp
kleo/expirycheckerconfig.h
kleo/expirycheckersettings.cpp
kleo/expirycheckersettings.h
kleo/kconfigbasedkeyfilter.cpp
kleo/kconfigbasedkeyfilter.h
kleo/keyfilter.h
kleo/keyfiltermanager.cpp
kleo/keyfiltermanager.h
kleo/keygroup.cpp
kleo/keygroup.h
kleo/keygroupconfig.cpp
kleo/keygroupconfig.h
kleo/keygroupimportexport.cpp
kleo/keygroupimportexport.h
kleo/keyresolver.cpp
kleo/keyresolver.h
kleo/keyresolvercore.cpp
kleo/keyresolvercore.h
kleo/keyserverconfig.cpp
kleo/keyserverconfig.h
kleo/kleoexception.cpp
kleo/kleoexception.h
kleo/oidmap.cpp
kleo/oidmap.h
kleo/predicates.h
kleo/stl_util.h
models/keycache.cpp
models/keycache.h
models/keycache_p.h
models/keylist.h
models/keylistmodel.cpp
models/keylistmodel.h
models/keylistmodelinterface.cpp
models/keylistmodelinterface.h
models/keylistsortfilterproxymodel.cpp
models/keylistsortfilterproxymodel.h
models/keyrearrangecolumnsproxymodel.cpp
models/keyrearrangecolumnsproxymodel.h
models/subkeylistmodel.cpp
models/subkeylistmodel.h
models/useridlistmodel.cpp
+ models/useridlistproxymodel.cpp
+ models/useridlistproxymodel.h
models/useridlistmodel.h
models/useridproxymodel.cpp
models/useridproxymodel.h
utils/algorithm.h
utils/assuan.cpp
utils/assuan.h
utils/chrono.h
utils/classify.cpp
utils/classify.h
utils/compat.cpp
utils/compat.h
utils/compliance.cpp
utils/compliance.h
utils/cryptoconfig.cpp
utils/cryptoconfig.h
utils/cryptoconfig_p.h
utils/filesystemwatcher.cpp
utils/filesystemwatcher.h
utils/formatting.cpp
utils/formatting.h
utils/gnupg-registry.c
utils/gnupg-registry.h
utils/gnupg.cpp
utils/gnupg.h
utils/hex.cpp
utils/hex.h
utils/keyhelpers.cpp
utils/keyhelpers.h
utils/keyusage.h
utils/qtstlhelpers.cpp
utils/qtstlhelpers.h
utils/scdaemon.cpp
utils/scdaemon.h
utils/stringutils.cpp
utils/stringutils.h
utils/systeminfo.cpp
utils/systeminfo.h
utils/test.cpp
utils/test.h
utils/uniquelock.cpp
utils/uniquelock.h
)
ecm_qt_declare_logging_category(KPim6Libkleo HEADER libkleo_debug.h IDENTIFIER LIBKLEO_LOG CATEGORY_NAME org.kde.pim.libkleo
DESCRIPTION "libkleo (kleo_core)"
EXPORT LIBKLEO
)
target_sources(KPim6Libkleo PRIVATE
ui/adjustingscrollarea.cpp
ui/adjustingscrollarea.h
ui/auditlogviewer.cpp
ui/auditlogviewer.h
ui/cryptoconfigentryreaderport.cpp
ui/cryptoconfigentryreaderport_p.h
ui/cryptoconfigmodule.cpp
ui/cryptoconfigmodule.h
ui/cryptoconfigmodule_p.h
ui/directoryserviceswidget.cpp
ui/directoryserviceswidget.h
ui/dnattributeorderconfigwidget.cpp
ui/dnattributeorderconfigwidget.h
ui/editdirectoryservicedialog.cpp
ui/editdirectoryservicedialog.h
ui/filenamerequester.cpp
ui/filenamerequester.h
ui/messagebox.cpp
ui/messagebox.h
ui/treeview.cpp
ui/treeview.h
ui/treewidget.cpp
ui/treewidget.h
ui/progressbar.cpp
ui/progressbar.h
ui/progressdialog.cpp
ui/progressdialog.h
ui/readerportselection.cpp
ui/readerportselection.h
)
ecm_qt_declare_logging_category(KPim6Libkleo HEADER kleo_ui_debug.h IDENTIFIER KLEO_UI_LOG CATEGORY_NAME org.kde.pim.kleo_ui
DESCRIPTION "libkleo (kleo_ui)"
OLD_CATEGORY_NAMES log_kleo_ui
EXPORT LIBKLEO
)
target_sources(KPim6Libkleo PRIVATE # make this a separate lib.
ui/keyapprovaldialog.cpp
ui/keyapprovaldialog.h
ui/keylistview.cpp
ui/keylistview.h
ui/keyrequester.cpp
ui/keyrequester.h
ui/keyselectioncombo.cpp
ui/keyselectioncombo.h
ui/keyselectiondialog.cpp
ui/keyselectiondialog.h
ui/newkeyapprovaldialog.cpp
ui/newkeyapprovaldialog.h
ui/useridselectioncombo.cpp
ui/useridselectioncombo.h
)
if(MINGW)
# we do not care about different signedness of passed pointer arguments
set_source_files_properties(utils/gnupg-registry.c PROPERTIES COMPILE_OPTIONS "-Wno-pointer-sign")
endif()
target_link_libraries(KPim6Libkleo PUBLIC Gpgmepp PRIVATE Qt::Widgets
KF6::I18n
KF6::Completion
KF6::ConfigCore
KF6::ColorScheme
KF6::ConfigGui
KF6::CoreAddons
KF6::WidgetsAddons
KF6::ItemModels
KF6::Codecs
LibGpgError::LibGpgError)
target_link_libraries(KPim6Libkleo PUBLIC QGpgmeQt6)
# Boost::headers may not be available for old versions of Boost
if (TARGET Boost::headers)
target_link_libraries(KPim6Libkleo PRIVATE Boost::headers)
endif()
if (TARGET KF6::TextCustomEditor)
add_definitions(-DHAVE_PIMTEXTEDIT)
target_link_libraries(KPim6Libkleo PRIVATE KF6::TextCustomEditor)
endif()
if (COMPILE_WITH_UNITY_CMAKE_SUPPORT)
set_target_properties(KPim6Libkleo PROPERTIES UNITY_BUILD ON)
endif()
ecm_generate_export_header(KPim6Libkleo
BASE_NAME kleo
VERSION ${PIM_VERSION}
DEPRECATED_BASE_VERSION 0
DEPRECATION_VERSIONS 5.23
)
if(WIN32)
target_link_libraries(KPim6Libkleo ${GPGME_VANILLA_LIBRARIES} )
endif()
set_target_properties(KPim6Libkleo PROPERTIES
VERSION ${LIBKLEO_VERSION}
SOVERSION ${LIBKLEO_SOVERSION}
EXPORT_NAME Libkleo
)
install(TARGETS
KPim6Libkleo
EXPORT KPim6LibkleoTargets ${KDE_INSTALL_TARGETS_DEFAULT_ARGS}
)
target_include_directories(KPim6Libkleo INTERFACE "$<INSTALL_INTERFACE:${KDE_INSTALL_INCLUDEDIR}/KPim6/Libkleo>")
target_include_directories(KPim6Libkleo PUBLIC "$<BUILD_INTERFACE:${libkleo_SOURCE_DIR}/src;${libkleo_BINARY_DIR}/src>")
ecm_generate_headers(libkleo_CamelCase_HEADERS
HEADER_NAMES
AuditLogEntry
ChecksumDefinition
Debug
DefaultKeyFilter
DefaultKeyGenerationJob
DocAction
Dn
Enum
ExpiryChecker
ExpiryCheckerConfig
ExpiryCheckerSettings
KConfigBasedKeyFilter
KeyFilter
KeyFilterManager
KeyGroup
KeyGroupConfig
KeyGroupImportExport
KeyResolver
KeyResolverCore
KeyserverConfig
KleoException
OidMap
Predicates
Stl_Util
REQUIRED_HEADERS libkleo_HEADERS
PREFIX Libkleo
RELATIVE kleo
)
ecm_generate_headers(libkleo_CamelCase_models_HEADERS
HEADER_NAMES
KeyCache
KeyList
KeyListModel
KeyListModelInterface
KeyListSortFilterProxyModel
KeyRearrangeColumnsProxyModel
SubkeyListModel
UserIDListModel
+ UserIDListProxyModel
UserIDProxyModel
REQUIRED_HEADERS libkleo_models_HEADERS
PREFIX Libkleo
RELATIVE models
)
ecm_generate_headers(libkleo_CamelCase_utils_HEADERS
HEADER_NAMES
Algorithm
Assuan
Chrono
Classify
Compat
Compliance
CryptoConfig
FileSystemWatcher
Formatting
GnuPG
Hex
KeyHelpers
KeyUsage
QtStlHelpers
SCDaemon
StringUtils
SystemInfo
Test
UniqueLock
REQUIRED_HEADERS libkleo_utils_HEADERS
PREFIX Libkleo
RELATIVE utils
)
ecm_generate_headers(libkleo_CamelCase_ui_HEADERS
HEADER_NAMES
AdjustingScrollArea
AuditLogViewer
CryptoConfigModule
DNAttributeOrderConfigWidget
DirectoryServicesWidget
EditDirectoryServiceDialog
FileNameRequester
KeyApprovalDialog
KeyListView
KeyRequester
KeySelectionCombo
KeySelectionDialog
MessageBox
TreeView
TreeWidget
NewKeyApprovalDialog
ProgressDialog
ReaderPortSelection
UserIDSelectionCombo
REQUIRED_HEADERS libkleo_ui_HEADERS
PREFIX Libkleo
RELATIVE ui
)
kconfig_add_kcfg_files(KPim6Libkleo
kcfg/expirycheckerconfigbase.kcfgc
kcfg/classifyconfig.kcfgc
)
install(FILES
${libkleo_CamelCase_HEADERS}
${libkleo_CamelCase_models_HEADERS}
${libkleo_CamelCase_ui_HEADERS}
${libkleo_CamelCase_utils_HEADERS}
DESTINATION ${KDE_INSTALL_INCLUDEDIR}/KPim6/Libkleo/Libkleo
COMPONENT Devel
)
install(FILES
${CMAKE_CURRENT_BINARY_DIR}/expirycheckerconfigbase.h
${CMAKE_CURRENT_BINARY_DIR}/kleo_export.h
${libkleo_HEADERS}
${libkleo_models_HEADERS}
${libkleo_ui_HEADERS}
${libkleo_utils_HEADERS}
${CMAKE_CURRENT_BINARY_DIR}/classifyconfig.h
DESTINATION ${KDE_INSTALL_INCLUDEDIR}/KPim6/Libkleo/libkleo
COMPONENT Devel
)
if ( WIN32 )
install ( FILES libkleopatrarc-win32.desktop DESTINATION ${KDE_INSTALL_CONFDIR} RENAME libkleopatrarc )
else ()
install ( FILES libkleopatrarc.desktop DESTINATION ${KDE_INSTALL_CONFDIR} RENAME libkleopatrarc )
endif ()
if (BUILD_QCH)
ecm_add_qch(
KPim6Libkleo_QCH
NAME KPim6Libkleo
BASE_NAME KPim6Libkleo
VERSION ${PIM_VERSION}
ORG_DOMAIN org.kde
SOURCES # using only public headers, to cover only public API
${libkleo_HEADERS}
${libkleo_models_HEADERS}
${libkleo_ui_HEADERS}
${libkleo_utils_HEADERS}
#MD_MAINPAGE "${CMAKE_SOURCE_DIR}/README.md"
#IMAGE_DIRS "${CMAKE_SOURCE_DIR}/docs/pics"
LINK_QCHS
Qt6Core_QCH
Qt6Gui_QCH
Qt6Widgets_QCH
INCLUDE_DIRS
${CMAKE_CURRENT_BINARY_DIR}
BLANK_MACROS
KLEO_EXPORT
TAGFILE_INSTALL_DESTINATION ${KDE_INSTALL_QTQCHDIR}
QCH_INSTALL_DESTINATION ${KDE_INSTALL_QTQCHDIR}
COMPONENT Devel
)
endif()
diff --git a/src/models/useridlistmodel.cpp b/src/models/useridlistmodel.cpp
index d1064386..c1479000 100644
--- a/src/models/useridlistmodel.cpp
+++ b/src/models/useridlistmodel.cpp
@@ -1,388 +1,398 @@
/* -*- mode: c++; c-basic-offset:4 -*-
models/useridlistmodel.cpp
This file is part of Kleopatra, the KDE keymanager
SPDX-FileCopyrightText: 2007 Klarälvdalens Datakonsult AB
SPDX-FileCopyrightText: 2016 Andre Heinecke <aheinecke@gnupg.org>
SPDX-FileCopyrightText: 2021 g10 Code GmbH
SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <config-libkleo.h>
#include "useridlistmodel.h"
#include "keycache.h"
#include <libkleo/formatting.h>
#include <KLocalizedString>
#include <QDate>
#include <QIcon>
#include <QVariant>
#include <gpgme++/key.h>
using namespace GpgME;
using namespace Kleo;
class UIDModelItem
{
// A uid model item can either be a UserID::Signature or a UserID.
// you can find out which it is if the uid or the signature return
// null values. (Not null but isNull)
//
public:
explicit UIDModelItem(const UserID::Signature &sig, UIDModelItem *parentItem, bool showRemarks)
: mParentItem{parentItem}
, mSig{sig}
{
const auto name = Formatting::prettyName(sig);
const auto email = Formatting::prettyEMail(sig);
mItemData = {
Formatting::prettyID(sig.signerKeyID()),
name,
email,
Formatting::creationDateString(sig),
Formatting::expirationDateString(sig),
Formatting::validityShort(sig),
sig.isExportable() ? QStringLiteral("✓") : QString{},
};
QString lastNotation;
if (showRemarks && parentItem) {
for (const auto ¬ation : sig.notations()) {
if (notation.name() && !strcmp(notation.name(), "rem@gnupg.org")) {
lastNotation = QString::fromUtf8(notation.value());
}
}
}
mItemData.push_back(lastNotation);
const auto trustSignatureDomain = Formatting::trustSignatureDomain(sig);
mItemData.push_back(trustSignatureDomain);
mAccessibleText = {
Formatting::accessibleHexID(sig.signerKeyID()),
name.isEmpty() ? i18nc("text for screen readers for an empty name", "no name") : QVariant{},
email.isEmpty() ? i18nc("text for screen readers for an empty email address", "no email") : QVariant{},
Formatting::accessibleDate(Formatting::creationDate(sig)),
Formatting::accessibleExpirationDate(sig),
{}, // display text is always okay
sig.isExportable() ? i18nc("yes, is exportable", "yes") : i18nc("no, is not exportable", "no"),
lastNotation.isEmpty() ? i18nc("accessible text for empty list of tags", "none") : QVariant{},
trustSignatureDomain.isEmpty() ? i18n("not applicable") : QVariant{},
};
Q_ASSERT(mAccessibleText.size() == mItemData.size());
+
+ mKey = QString::fromLatin1(sig.signerKeyID());
}
explicit UIDModelItem(const UserID &uid, UIDModelItem *parentItem)
: mParentItem{parentItem}
, mUid{uid}
{
mItemData = {Formatting::prettyUserID(uid)};
// for the empty cells of the user ID rows we announce "User ID"
mAccessibleText = {
{}, // use displayed user ID
i18n("User ID"),
i18n("User ID"),
i18n("User ID"),
i18n("User ID"),
i18n("User ID"),
i18n("User ID"),
i18n("User ID"),
i18n("User ID"),
};
}
// The root item
UIDModelItem()
{
mItemData = {
i18n("User ID / Certification Key ID"),
i18n("Name"),
i18n("E-Mail"),
i18n("Valid From"),
i18n("Valid Until"),
i18n("Status"),
i18n("Exportable"),
i18n("Tags"),
i18n("Trust Signature For"),
};
// mAccessibleText is explicitly left empty
}
~UIDModelItem()
{
qDeleteAll(mChildItems);
}
void appendChild(UIDModelItem *child)
{
mChildItems << child;
}
UIDModelItem *child(int row) const
{
return mChildItems.value(row);
}
const UIDModelItem *constChild(int row) const
{
return mChildItems.value(row);
}
int childCount() const
{
return mChildItems.count();
}
int columnCount() const
{
if (childCount()) {
// We take the value from the first child
// as we are likely a UID and our children
// are UID Signatures.
return constChild(0)->columnCount();
}
return mItemData.count();
}
QVariant data(int column) const
{
return mItemData.value(column);
}
QVariant accessibleText(int column) const
{
return mAccessibleText.value(column);
}
QVariant toolTip(int column) const
{
if (!mSig.isNull()) {
if (column == static_cast<int>(UserIDListModel::Column::TrustSignatureDomain)) {
return Formatting::trustSignature(mSig);
}
}
return mItemData.value(column);
}
QVariant icon(int column) const
{
if (!mSig.isNull() && column == static_cast<int>(UserIDListModel::Column::Status)) {
return Formatting::validityIcon(mSig);
}
return {};
}
int row() const
{
if (mParentItem) {
return mParentItem->mChildItems.indexOf(const_cast<UIDModelItem *>(this));
}
return 0;
}
UIDModelItem *parentItem() const
{
return mParentItem;
}
UserID::Signature signature() const
{
return mSig;
}
UserID uid() const
{
return mUid;
}
+ QString key() const
+ {
+ return mKey;
+ }
+
private:
QList<UIDModelItem *> mChildItems;
QList<QVariant> mItemData;
QList<QVariant> mAccessibleText;
UIDModelItem *mParentItem = nullptr;
UserID::Signature mSig;
UserID mUid;
+ QString mKey;
};
UserIDListModel::UserIDListModel(QObject *p)
: QAbstractItemModel{p}
{
}
UserIDListModel::~UserIDListModel() = default;
Key UserIDListModel::key() const
{
return mKey;
}
void UserIDListModel::setKey(const Key &key)
{
beginResetModel();
mKey = key;
mRootItem.reset(new UIDModelItem);
for (int i = 0, ids = key.numUserIDs(); i < ids; ++i) {
UserID uid = key.userID(i);
auto uidItem = new UIDModelItem(uid, mRootItem.get());
mRootItem->appendChild(uidItem);
std::vector<UserID::Signature> sigs = uid.signatures();
std::sort(sigs.begin(), sigs.end());
for (const auto &sig : sigs) {
auto sigItem = new UIDModelItem(sig, uidItem, mRemarksEnabled);
uidItem->appendChild(sigItem);
}
}
endResetModel();
}
int UserIDListModel::columnCount(const QModelIndex &parent) const
{
if (parent.isValid()) {
return static_cast<UIDModelItem *>(parent.internalPointer())->columnCount();
}
if (!mRootItem) {
return 0;
}
return mRootItem->columnCount();
}
int UserIDListModel::rowCount(const QModelIndex &parent) const
{
if (parent.column() > 0 || !mRootItem) {
return 0;
}
const UIDModelItem *const parentItem = !parent.isValid() ? mRootItem.get() : static_cast<UIDModelItem *>(parent.internalPointer());
return parentItem->childCount();
}
QModelIndex UserIDListModel::index(int row, int column, const QModelIndex &parent) const
{
if (!hasIndex(row, column, parent)) {
return {};
}
const UIDModelItem *const parentItem = !parent.isValid() ? mRootItem.get() : static_cast<UIDModelItem *>(parent.internalPointer());
UIDModelItem *const childItem = parentItem->child(row);
if (childItem) {
return createIndex(row, column, childItem);
} else {
return QModelIndex();
}
}
QModelIndex UserIDListModel::parent(const QModelIndex &index) const
{
if (!index.isValid()) {
return {};
}
auto childItem = static_cast<UIDModelItem *>(index.internalPointer());
UIDModelItem *parentItem = childItem->parentItem();
if (parentItem == mRootItem.get()) {
return QModelIndex();
}
return createIndex(parentItem->row(), 0, parentItem);
}
QVariant UserIDListModel::headerData(int section, Qt::Orientation o, int role) const
{
if (o == Qt::Horizontal && mRootItem) {
if (role == Qt::DisplayRole || role == Qt::EditRole || role == Qt::ToolTipRole) {
return mRootItem->data(section);
} else if (role == Qt::AccessibleTextRole) {
return mRootItem->accessibleText(section);
}
}
return QVariant();
}
QVariant UserIDListModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid()) {
return QVariant();
}
auto item = static_cast<UIDModelItem *>(index.internalPointer());
switch (role) {
case Qt::DisplayRole:
case Qt::EditRole:
return item->data(index.column());
case Qt::AccessibleTextRole:
return item->accessibleText(index.column());
case Qt::ToolTipRole:
return item->toolTip(index.column());
case Qt::DecorationRole:
return item->icon(index.column());
+ case Qt::UserRole:
+ return item->key();
default:;
}
return {};
}
UserID UserIDListModel::userID(const QModelIndex &index) const
{
if (!index.isValid()) {
return UserID();
}
UIDModelItem *item = static_cast<UIDModelItem *>(index.internalPointer());
return item->uid();
}
QList<UserID> UserIDListModel::userIDs(const QModelIndexList &indexes) const
{
QList<GpgME::UserID> ret;
for (const QModelIndex &idx : indexes) {
if (!idx.isValid()) {
continue;
}
auto item = static_cast<UIDModelItem *>(idx.internalPointer());
if (!item->uid().isNull()) {
ret << item->uid();
}
}
return ret;
}
UserID::Signature UserIDListModel::signature(const QModelIndex &index) const
{
if (!index.isValid()) {
return UserID::Signature();
}
UIDModelItem *item = static_cast<UIDModelItem *>(index.internalPointer());
return item->signature();
}
QList<UserID::Signature> UserIDListModel::signatures(const QModelIndexList &indexes) const
{
QList<GpgME::UserID::Signature> ret;
for (const QModelIndex &idx : indexes) {
if (!idx.isValid()) {
continue;
}
auto item = static_cast<UIDModelItem *>(idx.internalPointer());
if (!item->signature().isNull()) {
ret << item->signature();
}
}
return ret;
}
void UserIDListModel::enableRemarks(bool value)
{
mRemarksEnabled = value;
}
#include "moc_useridlistmodel.cpp"
diff --git a/src/models/useridlistproxymodel.cpp b/src/models/useridlistproxymodel.cpp
new file mode 100644
index 00000000..988ff0df
--- /dev/null
+++ b/src/models/useridlistproxymodel.cpp
@@ -0,0 +1,41 @@
+// SPDX-FileCopyrightText: 2024 g10 Code GmbH
+// SPDX-FileContributor: Tobias Fella <tobias.fella@gnupg.com>
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#include "useridlistproxymodel.h"
+
+#include "keycache.h"
+
+#include <gpgme++/key.h>
+
+using namespace Kleo;
+
+class UserIDListProxyModel::Private
+{
+public:
+ bool showOnlyOwnCertifications = false;
+};
+
+UserIDListProxyModel::UserIDListProxyModel()
+ : QSortFilterProxyModel()
+ , d(std::make_unique<Private>())
+{
+}
+
+UserIDListProxyModel::~UserIDListProxyModel() = default;
+
+bool UserIDListProxyModel::filterAcceptsRow(int source_row, const QModelIndex &source_parent) const
+{
+ if (!d->showOnlyOwnCertifications || !source_parent.isValid()) {
+ return true;
+ }
+ const auto id = sourceModel()->index(source_row, (int)0, source_parent).data(Qt::UserRole).toString();
+ const auto key = KeyCache::instance()->findByKeyIDOrFingerprint(id.toLatin1().data());
+ return !key.isNull() && key.hasSecret();
+}
+
+void UserIDListProxyModel::setShowOnlyOwnCertifications(bool showOnlyOwnCertifications)
+{
+ d->showOnlyOwnCertifications = showOnlyOwnCertifications;
+ invalidateFilter();
+}
diff --git a/src/models/useridlistproxymodel.h b/src/models/useridlistproxymodel.h
new file mode 100644
index 00000000..529e739b
--- /dev/null
+++ b/src/models/useridlistproxymodel.h
@@ -0,0 +1,31 @@
+// SPDX-FileCopyrightText: 2024 g10 Code GmbH
+// SPDX-FileContributor: Tobias Fella <tobias.fella@gnupg.com>
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#pragma once
+
+#include "kleo_export.h"
+
+#include <QSortFilterProxyModel>
+
+namespace Kleo
+{
+class UserIDListModel;
+
+class KLEO_EXPORT UserIDListProxyModel : public QSortFilterProxyModel
+{
+ Q_OBJECT
+
+public:
+ UserIDListProxyModel();
+ ~UserIDListProxyModel() override;
+
+ bool filterAcceptsRow(int source_row, const QModelIndex &source_parent) const override;
+ void setShowOnlyOwnCertifications(bool showOnlyOwnCertifications);
+
+private:
+ class Private;
+ std::unique_ptr<Private> d;
+};
+
+}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Feb 7, 5:32 PM (1 d, 10 h)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
35/60/b72992a99090d130bc3db0bb0178
Attached To
rLIBKLEO Libkleo
Event Timeline
Log In to Comment