Page Menu
Home
GnuPG
Search
Configure Global Search
Log In
Files
F40366693
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Size
28 KB
Subscribers
None
View Options
diff --git a/Makefile.am b/Makefile.am
index 6299f180..283f61ad 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,166 +1,164 @@
# Makefile.am - Installer for GnuPG 4 Windows Makefile.
# Copyright (C) 2005, 2008, 2012 g10 Code GmbH
#
# This file is part of GPG4Win.
#
# GPG4Win 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.
#
# GPG4Win 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, see <http://www.gnu.org/licenses/>.
ACLOCAL_AMFLAGS = -I m4
AUTOMAKE_OPTIONS = dist-xz no-dist-gzip
DISTCHECK_CONFIGURE_FLAGS = --host=i686-w64-mingw32
if BUILD_GPG4WIN
po = po
else
po =
endif
if BUILD_GPG4WIN
doc = doc
else
doc =
endif
SUBDIRS = ${po} packages ${doc} src
# find patches -type f | sort | sed 's/$/ \\/' | sed 's/^/ /'
# find patches-appimage -type f | sort | sed 's/$/ \\/' | sed 's/^/ /'
EXTRA_DIST = autogen.rc autogen.sh README.GIT ONEWS \
doc/license-page doc/GPLv3 \
build-aux/git-log-footer build-aux/git-log-fix \
build-aux/authenticode-sign.sh \
docker/appimage/Dockerfile \
docker/build-appimage-docker-image.sh \
docker/build-gpg4win-docker-image.sh \
docker/gpg4win-bullseye/Dockerfile \
docker/run-appimage-build.sh \
docker/run-gpg4win-build.sh \
patches/breeze-icons/0001-Add-folder-edit-sign-encrypt-icon.patch \
patches/breeze-icons/add-the-nose.patch \
patches/breeze-icons/azz-Make-all-breeze-icons-available-in-breeze-dark.patch \
patches/breeze-icons/subset-crossbuild.patch \
patches/extra-cmake-modules/0001-Use-BIN_INSTALL_DIR-data-for-DATAROOTDIR-on-Windows.patch \
- patches/gpgme-1.24.2/0002-cpp-Validate-the-transition-map.patch \
- patches/gpgme-1.24.2/0001-cpp-Ensure-that-all-transitions-go-from-one-state-to.patch \
- patches/gpgme-1.24.2/0003-cpp-Add-missing-transition-remove-two-ignored.patch \
+ patches/gpgme-1.24.3/0001-gpgsm-Introduce-two-phase-interactions.patch \
+ patches/gpgme-1.24.3/0002-gpgsm-Extend-gpgsm_assuan_simple_command.patch \
patches/gpgol-2.6.0/0001-Fix-fixing-T6646.patch \
patches/jpeg/fix-redefine.patch \
patches/kconfig/0001-Read-defaults-from-Windows-registry.patch \
patches/kconfigwidgets/0001-Fix-crash-on-exit-on-Windows.patch \
patches/kconfigwidgets/0001-Make-QDbus-optional.patch \
patches/kcoreaddons/0001-Fix-MINGW-build.patch \
patches/kguiaddons/0001-DRAFT-There-is-no-dark-mode-on-old-Windows.patch \
patches/ki18n/0001-Undef-snprintf-for-windows.patch \
patches/kiconthemes/0001-Make-DBus-optional.patch \
patches/kiconthemes/dark-mode-detection.patch \
patches/kio/0001-WIP-Remove-dependency-to-dbus.patch \
patches/kio/FileManagerWindowJob.patch \
patches/kleopatra/0001-Revert-change-of-selection-of-own-keys-to-selection-.patch \
patches/kleopatra/0001-Update-status-bar-when-distribution-settings-change.patch \
patches/kleopatra/0002-Use-RSAKeySizes-and-PGPKeyType-again.patch \
patches/kleopatra/set-windows-registry.patch \
patches/kparts/0001-Apply-implicit-android-DBUS-fix-for-Win.patch \
patches/kparts/disable-jobuidelegate.patch \
patches/kwidgetsaddons/0001-Set-the-modes-on-the-date-picker.patch \
patches/kwidgetsaddons/0002-Remove-No-date-option-from-date-picker-popup-used-by.patch \
patches/kwidgetsaddons/fix-height-of-text-after-update.patch \
patches/kxmlgui/0001-make-qdbus-optional.patch \
patches/kxmlgui/0002-stretch-aboutpage.patch \
patches/kxmlgui/0004-Cruedly-disable-KSendbugmail.patch \
patches/libical/workaround-weird-mingw-10.0.0-issue.patch \
patches/libkleo/0001-Use-RSAKeySizes-and-PGPKeyType-again.patch \
patches/okular/0001-Add-GnuPG-specific-manifest-to-okular.patch \
patches/okular/0001-Add-support-to-customize-about-data.patch \
patches/okular/lower-cmake-requirement.patch \
patches/qtbase/0001-Gpg4win-qstandardpaths-patch.patch \
patches/qtbase/0002-Gpg4win-theme-names-and-relpaths.patch \
patches/qtbase/add-kleopatras-mime-types.patch \
patches/qtbase/CVE-2023-32763-qtbase-5.15.patch \
patches/qtbase/CVE-2023-37369-qtbase-5.15.patch \
patches/qtbase/CVE-2023-43114-5.15.patch \
patches/qtbase/fix-high-contrast-item-view-selection-color.patch \
patches/qtbase/fix-tooltip-text-color-with-dark-theme.patch \
patches/qtsvg/CVE-2023-32573-qtsvg-5.15.patch \
patches/qttools/disable-most-tools.patch \
patches/sonnet/0001-W32-Force-ispellchecker-for-sonnet.patch \
- patches-appimage/gpgme-1.24.2/0002-cpp-Validate-the-transition-map.patch \
- patches-appimage/gpgme-1.24.2/0001-cpp-Ensure-that-all-transitions-go-from-one-state-to.patch \
- patches-appimage/gpgme-1.24.2/0003-cpp-Add-missing-transition-remove-two-ignored.patch \
+ patches-appimage/gpgme-1.24.3/0001-gpgsm-Introduce-two-phase-interactions.patch \
+ patches-appimage/gpgme-1.24.3/0002-gpgsm-Extend-gpgsm_assuan_simple_command.patch \
patches-appimage/kwidgetsaddons/0001-Set-the-modes-on-the-date-picker.patch \
patches-appimage/kwidgetsaddons/0002-Remove-No-date-option-from-date-picker-popup-used-by.patch \
patches-appimage/kwidgetsaddons/fix-height-of-text-after-update.patch \
patches-appimage/kleopatra/0001-Revert-change-of-selection-of-own-keys-to-selection-.patch \
patches-appimage/kleopatra/0001-Update-status-bar-when-distribution-settings-change.patch \
patches-appimage/kleopatra/0002-Use-RSAKeySizes-and-PGPKeyType-again.patch \
patches-appimage/okular/0001-Make-KF5Pty-dependency-optional.patch \
patches-appimage/okular/0001-Add-support-to-customize-about-data.patch \
patches-appimage/okular/lower-cmake-requirement.patch \
patches-appimage/poppler/fix-gpg-error-include.patch \
patches-appimage/qtbase/CVE-2023-32763-qtbase-5.15.patch \
patches-appimage/qtbase/CVE-2023-37369-qtbase-5.15.patch \
patches-appimage/qtbase/CVE-2023-43114-5.15.patch \
patches-appimage/qtbase/add-kleopatras-mime-types.patch \
patches-appimage/qtsvg/CVE-2023-32573-qtsvg-5.15.patch \
patches-appimage/qtwayland-5.15.0/00-disable-wayland-server.patch
copy-news:
cp NEWS doc/website/NEWS.last
copy-release: gpg4win-$(VERSION).tar.bz2 installers/gpg4win-$(VERSION).exe \
installers/gpg4win-light-$(VERSION).exe \
installers/gpg4win-vanilla-$(VERSION).exe
@echo Copying $(VERSION) to $(RELEASEHOST) >&2
@set -e;\
if ssh "$$(echo $(RELEASEHOST)|cut -d: -f -1)" \
test -f "$$(echo $(RELEASEHOST)/gpg4win-$(VERSION).exe|cut -d: -f2-)";\
then echo "This release has already been copied to the server" >&2 ;\
else scp gpg4win-$(VERSION).tar.bz2 \
installers/gpg4win-$(VERSION).exe \
installers/gpg4win-light-$(VERSION).exe \
installers/gpg4win-vanilla-$(VERSION).exe \
installers/gpg4win-src-$(VERSION).exe $(RELEASEHOST)/ ;\
for f in en de ; do \
scp src/README.$$f.txt \
$(RELEASEHOST)/README-$(VERSION).$$f.txt; \
done;\
fi
dist-hook: gen-ChangeLog
gen_start_date = 2012-03-26T00:00:00
.PHONY: gen-ChangeLog
gen-ChangeLog:
set -e; \
if test -d $(top_srcdir)/.git; then \
(cd $(top_srcdir) && \
$(GITLOG_TO_CHANGELOG) --append-dot --tear-off \
--amend=build-aux/git-log-fix \
--since=$(gen_start_date) ) > $(distdir)/cl-t; \
cat $(top_srcdir)/build-aux/git-log-footer >> $(distdir)/cl-t;\
rm -f $(distdir)/ChangeLog; \
mv $(distdir)/cl-t $(distdir)/ChangeLog; \
fi
download: packages/packages.common packages/packages.4 packages/packages.3
(cd packages; ./download.sh)
msi:
$(MAKE) $(AM_MAKEFLAGS) -C src msi
msi-signed:
$(MAKE) $(AM_MAKEFLAGS) -C src msi-signed
msi-upload:
$(MAKE) $(AM_MAKEFLAGS) -C src msi-upload
diff --git a/patches-appimage/gpgme-1.24.2 b/patches-appimage/gpgme-1.24.2
deleted file mode 120000
index a2ba404d..00000000
--- a/patches-appimage/gpgme-1.24.2
+++ /dev/null
@@ -1 +0,0 @@
-../patches/gpgme-1.24.2
\ No newline at end of file
diff --git a/patches-appimage/gpgme-1.24.3 b/patches-appimage/gpgme-1.24.3
new file mode 120000
index 00000000..7e2b3bb9
--- /dev/null
+++ b/patches-appimage/gpgme-1.24.3
@@ -0,0 +1 @@
+../patches/gpgme-1.24.3
\ No newline at end of file
diff --git a/patches/gpgme-1.24.2/0001-cpp-Ensure-that-all-transitions-go-from-one-state-to.patch b/patches/gpgme-1.24.2/0001-cpp-Ensure-that-all-transitions-go-from-one-state-to.patch
deleted file mode 100755
index 650e60d5..00000000
--- a/patches/gpgme-1.24.2/0001-cpp-Ensure-that-all-transitions-go-from-one-state-to.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-#! /bin/sh
-patch -p1 -f $* < $0
-exit $?
-
-From a4945675ece2c1e915fc49298adfd927737ede3d Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= <dev@ingo-kloecker.de>
-Date: Fri, 11 Apr 2025 10:26:31 +0200
-Subject: [PATCH 1/2] cpp: Ensure that all transitions go from one state to a
- different state
-
-* src/gpgsignkeyeditinteractor.cpp (makeTable): Replace transitions from
-CONFIRM to CONFIRM with transitions from CONFIRM to CONFIRM2 and vice
-versa. Add transitions from CONFIRM2 to some other state for all
-transitions from CONFIRM to some other state.
---
-
-The state machine gets stuck if a transition doesn't change the state
-but an action is required. To avoid this situation the CONFIRM2 state
-was introduced, but it was not used correctly.
-
-GnuPG-bug-id: 7600
-
-Taken from gpgmepp commit aee2b30482406e677dbddf1a68b2a11a5dc70adf
----
- lang/cpp/src/gpgsignkeyeditinteractor.cpp | 11 ++++++++---
- 1 file changed, 8 insertions(+), 3 deletions(-)
-
-diff --git a/lang/cpp/src/gpgsignkeyeditinteractor.cpp b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-index 164cfc03..f2e0ba04 100644
---- a/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-+++ b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-@@ -196,7 +196,7 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
- addEntry(COMMAND, GET_BOOL, "keyedit.sign_all.okay", UIDS_ANSWER_SIGN_ALL);
- addEntry(COMMAND, GET_BOOL, "sign_uid.expired_okay", REJECT_SIGN_EXPIRED);
- addEntry(COMMAND, GET_BOOL, "sign_uid.okay", CONFIRM);
-- addEntry(COMMAND, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM2);
-+ addEntry(COMMAND, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM);
- addEntry(COMMAND, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK);
- addEntry(COMMAND, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(UIDS_ANSWER_SIGN_ALL, GET_BOOL, "sign_uid.okay", CONFIRM);
-@@ -209,17 +209,22 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
- addEntry(SET_TRUST_REGEXP, GET_BOOL, "sign_uid.okay", CONFIRM);
- addEntry(SET_CHECK_LEVEL, GET_BOOL, "sign_uid.okay", CONFIRM);
- addEntry(SET_EXPIRE, GET_BOOL, "sign_uid.class", SET_CHECK_LEVEL);
-- addEntry(CONFIRM, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM);
-+ addEntry(CONFIRM, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM2);
-+ addEntry(CONFIRM2, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM);
- addEntry(DUPE_OK, GET_BOOL, "sign_uid.okay", CONFIRM);
- addEntry(DUPE_OK2, GET_BOOL, "sign_uid.okay", CONFIRM);
- addEntry(DUPE_OK, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(DUPE_OK2, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
-- addEntry(CONFIRM, GET_BOOL, "sign_uid.okay", CONFIRM);
-+ addEntry(CONFIRM, GET_BOOL, "sign_uid.okay", CONFIRM2);
- addEntry(CONFIRM2, GET_BOOL, "sign_uid.okay", CONFIRM);
- addEntry(CONFIRM, GET_LINE, "keyedit.prompt", COMMAND);
-+ addEntry(CONFIRM2, GET_LINE, "keyedit.prompt", COMMAND);
- addEntry(CONFIRM, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
-+ addEntry(CONFIRM2, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(CONFIRM, GET_LINE, "sign_uid.expire", SET_EXPIRE);
-+ addEntry(CONFIRM2, GET_LINE, "sign_uid.expire", SET_EXPIRE);
- addEntry(CONFIRM, GET_LINE, "sign_uid.class", SET_CHECK_LEVEL);
-+ addEntry(CONFIRM2, GET_LINE, "sign_uid.class", SET_CHECK_LEVEL);
- addEntry(UIDS_LIST_SEPARATELY_DONE, GET_BOOL, "sign_uid.local_promote_okay", CONFIRM);
- addEntry(UIDS_LIST_SEPARATELY_DONE, GET_LINE, "keyedit.prompt", COMMAND);
- addEntry(UIDS_LIST_SEPARATELY_DONE, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
---
-2.39.2
diff --git a/patches/gpgme-1.24.2/0002-cpp-Validate-the-transition-map.patch b/patches/gpgme-1.24.2/0002-cpp-Validate-the-transition-map.patch
deleted file mode 100755
index 72e19046..00000000
--- a/patches/gpgme-1.24.2/0002-cpp-Validate-the-transition-map.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-#! /bin/sh
-patch -p1 -f $* < $0
-exit $?
-
-
-From 64bb704a25ea1384666d5f0d5202363f4271d948 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= <dev@ingo-kloecker.de>
-Date: Fri, 11 Apr 2025 10:28:20 +0200
-Subject: [PATCH 2/2] cpp: Validate the transition map
-
-* lang/cpp/src/gpgsignkeyeditinteractor.cpp (makeTable): Assert that
-all transitions go from one state to a different state.
---
-
-The state machine gets stuck if a transition doesn't change the state.
-Make sure that this cannot happen again by mistake.
-
-GnuPG-bug-id: 7600
-Taken from gpgmepp commit 6f2e91d4d25afa6934ceaf1563a4d826a904d644
----
- lang/cpp/src/gpgsignkeyeditinteractor.cpp | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/lang/cpp/src/gpgsignkeyeditinteractor.cpp b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-index f2e0ba04..b1ecad3b 100644
---- a/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-+++ b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-@@ -239,6 +239,10 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
- addEntry(ERROR, GET_LINE, "keyedit.prompt", QUIT);
- addEntry(QUIT, GET_BOOL, "keyedit.save.okay", SAVE);
- #undef addEntry
-+ // validate the transition map; there must not be a transition without state change
-+ for (auto it = tab.cbegin(); it != tab.cend(); ++it) {
-+ assert(std::get<0>(it->first) != it->second);
-+ }
- return tab;
- }
-
---
-2.39.2
diff --git a/patches/gpgme-1.24.2/0003-cpp-Add-missing-transition-remove-two-ignored.patch b/patches/gpgme-1.24.2/0003-cpp-Add-missing-transition-remove-two-ignored.patch
deleted file mode 100755
index b09f9c6e..00000000
--- a/patches/gpgme-1.24.2/0003-cpp-Add-missing-transition-remove-two-ignored.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-#! /bin/sh
-patch -p1 -f $* < $0
-exit $?
-
-From e327305b9669107235ebe5e1e929988c1adefce9 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Ingo=20Kl=C3=B6cker?= <dev@ingo-kloecker.de>
-Date: Tue, 15 Apr 2025 09:15:59 +0200
-Subject: [PATCH] cpp: Add missing transition, remove two ignored (and wrong)
- transitions
-
-* lang/cpp/src/gpgsignkeyeditinteractor.cpp (makeTable): Remove two
-transitions. Add one transition.
-
-* lang/cpp/src/gpgsignkeyeditinteractor.cpp (makeTable)
-<sign_uid.dupe_okay>: Add one more transition.
---
-
-This adds a missing transition for the CONFIRM2 state which ensures
-that the certification is properly completed in case two confirmations
-were requested. And it removes two useless (and wrong) transitions
-which are overwritten by two later correct transitions in the map.
-
-GnuPG-bug-id: 7600
-This is gpgmepp commit 5b77f4072d03342b8719bbe93fc77641fffb476a
-
-The second patch fixed a bug seen before we could test Ingo's
-patch. - wk
----
- lang/cpp/src/gpgsignkeyeditinteractor.cpp | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/lang/cpp/src/gpgsignkeyeditinteractor.cpp b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-index b1ecad3b..8ce54abd 100644
---- a/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-+++ b/lang/cpp/src/gpgsignkeyeditinteractor.cpp
-@@ -217,8 +217,6 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
- addEntry(DUPE_OK2, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(CONFIRM, GET_BOOL, "sign_uid.okay", CONFIRM2);
- addEntry(CONFIRM2, GET_BOOL, "sign_uid.okay", CONFIRM);
-- addEntry(CONFIRM, GET_LINE, "keyedit.prompt", COMMAND);
-- addEntry(CONFIRM2, GET_LINE, "keyedit.prompt", COMMAND);
- addEntry(CONFIRM, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(CONFIRM2, GET_LINE, "trustsig_prompt.trust_value", SET_TRUST_VALUE);
- addEntry(CONFIRM, GET_LINE, "sign_uid.expire", SET_EXPIRE);
-@@ -234,7 +232,9 @@ static GpgSignKeyEditInteractor_Private::TransitionMap makeTable()
- addEntry(UIDS_LIST_SEPARATELY_DONE, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK);
- addEntry(DUPE_OK, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK2);
- addEntry(DUPE_OK2, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK);
-+ addEntry(CONFIRM, GET_BOOL, "sign_uid.dupe_okay", DUPE_OK);
- addEntry(CONFIRM, GET_LINE, "keyedit.prompt", QUIT);
-+ addEntry(CONFIRM2, GET_LINE, "keyedit.prompt", QUIT);
- addEntry(REJECT_SIGN_EXPIRED, GET_LINE, "keyedit.prompt", QUIT);
- addEntry(ERROR, GET_LINE, "keyedit.prompt", QUIT);
- addEntry(QUIT, GET_BOOL, "keyedit.save.okay", SAVE);
---
-2.39.2
diff --git a/patches/gpgme-1.24.3/0001-gpgsm-Introduce-two-phase-interactions.patch b/patches/gpgme-1.24.3/0001-gpgsm-Introduce-two-phase-interactions.patch
new file mode 100755
index 00000000..670c9dad
--- /dev/null
+++ b/patches/gpgme-1.24.3/0001-gpgsm-Introduce-two-phase-interactions.patch
@@ -0,0 +1,284 @@
+#! /bin/sh
+patch -p1 -l -f $* < $0
+exit $?
+
+
+From 52bde50b879c2b9318c87eb9f377bed6557366e2 Mon Sep 17 00:00:00 2001
+From: NIIBE Yutaka <gniibe@fsij.org>
+Date: Fri, 29 Aug 2025 09:28:06 +0900
+Subject: [PATCH 1/2] gpgsm: Introduce two phase interactions to consume diag
+ output.
+
+* src/engine-gpgsm.c (prepare): Move the first part from...
+(start): ... here.
+(gpgsm_decrypt, gpgsm_delete, gpgsm_encrypt)
+(gpgsm_export, gpgsm_export_ext, gpgsm_genkey)
+(gpgsm_import, gpgsm_keylist, gpgsm_keylist_ext)
+(gpgsm_sign, gpgsm_verify, gpgsm_getauditlog)
+(gpgsm_passwd): Follow the change.
+
+--
+
+GnuPG-bug-id: 7759
+Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
+---
+ src/engine-gpgsm.c | 113 +++++++++++++++++++++++++++++++++++----------
+ 1 file changed, 89 insertions(+), 24 deletions(-)
+
+diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c
+index e9d69d7a..37236bc2 100644
+--- a/src/engine-gpgsm.c
++++ b/src/engine-gpgsm.c
+@@ -1166,34 +1166,15 @@ add_io_cb (engine_gpgsm_t gpgsm, iocb_data_t *iocbd, gpgme_io_cb_t handler)
+
+
+ static gpgme_error_t
+-start (engine_gpgsm_t gpgsm, const char *command)
++prepare (engine_gpgsm_t gpgsm)
+ {
+- gpgme_error_t err;
++ gpgme_error_t err = 0;
+ assuan_fd_t afdlist[5];
++ /* FIXME: the type int and assuan_fd_t may be incompatible. */
+ int fdlist[5];
+ int nfds;
+ int i;
+
+- if (*gpgsm->request_origin)
+- {
+- char *cmd;
+-
+- cmd = _gpgme_strconcat ("OPTION request-origin=",
+- gpgsm->request_origin, NULL);
+- if (!cmd)
+- return gpg_error_from_syserror ();
+- err = gpgsm_assuan_simple_command (gpgsm, cmd, NULL, NULL);
+- free (cmd);
+- if (err && gpg_err_code (err) != GPG_ERR_UNKNOWN_OPTION)
+- return err;
+- }
+-
+- gpgsm_assuan_simple_command (gpgsm,
+- gpgsm->flags.offline ?
+- "OPTION offline=1":
+- "OPTION offline=0" ,
+- NULL, NULL);
+-
+ /* We need to know the fd used by assuan for reads. We do this by
+ using the assumption that the first returned fd from
+ assuan_get_active_fds() is always this one. */
+@@ -1217,7 +1198,36 @@ start (engine_gpgsm_t gpgsm, const char *command)
+
+ gpgsm->status_cb.fd = _gpgme_io_dup (fdlist[0]);
+ if (gpgsm->status_cb.fd < 0)
+- return gpg_error_from_syserror ();
++ err = gpg_error_from_syserror ();
++
++ return err;
++}
++
++
++static gpgme_error_t
++start (engine_gpgsm_t gpgsm, const char *command)
++{
++ gpgme_error_t err;
++
++ if (*gpgsm->request_origin)
++ {
++ char *cmd;
++
++ cmd = _gpgme_strconcat ("OPTION request-origin=",
++ gpgsm->request_origin, NULL);
++ if (!cmd)
++ return gpg_error_from_syserror ();
++ err = gpgsm_assuan_simple_command (gpgsm, cmd, NULL, NULL);
++ free (cmd);
++ if (err && gpg_err_code (err) != GPG_ERR_UNKNOWN_OPTION)
++ return err;
++ }
++
++ gpgsm_assuan_simple_command (gpgsm,
++ gpgsm->flags.offline ?
++ "OPTION offline=1":
++ "OPTION offline=0" ,
++ NULL, NULL);
+
+ if (_gpgme_io_set_close_notify (gpgsm->status_cb.fd,
+ close_notify_handler, gpgsm))
+@@ -1319,6 +1329,10 @@ gpgsm_decrypt (void *engine,
+ if (!gpgsm)
+ return gpg_error (GPG_ERR_INV_VALUE);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ err = send_input_size_hint (gpgsm, ciph);
+ if (err)
+ return err;
+@@ -1334,7 +1348,7 @@ gpgsm_decrypt (void *engine,
+ gpgsm_clear_fd (gpgsm, MESSAGE_FD);
+ gpgsm->inline_data = NULL;
+
+- err = start (engine, "DECRYPT");
++ err = start (gpgsm, "DECRYPT");
+ return err;
+ }
+
+@@ -1397,12 +1411,17 @@ gpgsm_delete (void *engine, gpgme_key_t key, unsigned int flags)
+ }
+ *linep = '\0';
+
++ err = prepare (gpgsm);
++ if (err)
++ goto leave;
++
+ gpgsm_clear_fd (gpgsm, OUTPUT_FD);
+ gpgsm_clear_fd (gpgsm, INPUT_FD);
+ gpgsm_clear_fd (gpgsm, MESSAGE_FD);
+ gpgsm->inline_data = NULL;
+
+ err = start (gpgsm, line);
++ leave:
+ free (line);
+
+ return err;
+@@ -1539,6 +1558,10 @@ gpgsm_encrypt (void *engine, gpgme_key_t recp[], const char *recpstring,
+ if (flags & (GPGME_ENCRYPT_ARCHIVE | GPGME_ENCRYPT_FILE))
+ return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ if ((flags & GPGME_ENCRYPT_NO_ENCRYPT_TO))
+ {
+ err = gpgsm_assuan_simple_command (gpgsm,
+@@ -1621,6 +1644,10 @@ gpgsm_export (void *engine, const char *pattern, gpgme_export_mode_t mode,
+ }
+ strcat (cmd, pattern);
+
++ err = prepare (gpgsm);
++ if (err)
++ goto leave;
++
+ gpgsm->output_cb.data = keydata;
+ err = gpgsm_set_fd (gpgsm, OUTPUT_FD, use_armor ? "--armor"
+ : map_data_enc (gpgsm->output_cb.data));
+@@ -1631,6 +1658,7 @@ gpgsm_export (void *engine, const char *pattern, gpgme_export_mode_t mode,
+ gpgsm->inline_data = NULL;
+
+ err = start (gpgsm, cmd);
++ leave:
+ free (cmd);
+ return err;
+ }
+@@ -1728,6 +1756,10 @@ gpgsm_export_ext (void *engine, const char *pattern[], gpgme_export_mode_t mode,
+ }
+ *linep = '\0';
+
++ err = prepare (gpgsm);
++ if (err)
++ goto leave;
++
+ gpgsm->output_cb.data = keydata;
+ err = gpgsm_set_fd (gpgsm, OUTPUT_FD, use_armor ? "--armor"
+ : map_data_enc (gpgsm->output_cb.data));
+@@ -1738,6 +1770,7 @@ gpgsm_export_ext (void *engine, const char *pattern[], gpgme_export_mode_t mode,
+ gpgsm->inline_data = NULL;
+
+ err = start (gpgsm, line);
++ leave:
+ free (line);
+ return err;
+ }
+@@ -1764,6 +1797,10 @@ gpgsm_genkey (void *engine,
+ if (!pubkey || seckey)
+ return gpg_error (GPG_ERR_INV_VALUE);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ gpgsm->input_cb.data = help_data;
+ err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data));
+ if (err)
+@@ -1815,6 +1852,10 @@ gpgsm_import (void *engine, gpgme_data_t keydata, gpgme_key_t *keyarray,
+ if (keydata && keyarray)
+ return gpg_error (GPG_ERR_INV_VALUE); /* Only one is allowed. */
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ dataenc = gpgme_data_get_encoding (keydata);
+
+ if (keyarray)
+@@ -1918,6 +1959,10 @@ gpgsm_keylist (void *engine, const char *pattern, int secret_only,
+ if (!pattern)
+ pattern = "";
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ /* Hack to make sure that the agent is started. Only if the agent
+ has been started an application may connect to the agent via
+ GPGME_PROTOCOL_ASSUAN - for example to look for smartcards. We
+@@ -2007,6 +2052,10 @@ gpgsm_keylist_ext (void *engine, const char *pattern[], int secret_only,
+ if (mode & GPGME_KEYLIST_MODE_EXTERN)
+ list_mode |= 2;
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ /* Always send list-mode option because RESET does not reset it. */
+ if (gpgrt_asprintf (&line, "OPTION list-mode=%d", (list_mode & 3)) < 0)
+ return gpg_error_from_syserror ();
+@@ -2134,6 +2183,10 @@ gpgsm_sign (void *engine, gpgme_data_t in, gpgme_data_t out,
+ | GPGME_SIG_MODE_FILE))
+ return gpg_error (GPG_ERR_INV_VALUE);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ /* FIXME: This does not work as RESET does not reset it so we can't
+ revert back to default. */
+ if (include_certs != GPGME_INCLUDE_CERTS_DEFAULT)
+@@ -2208,6 +2261,10 @@ gpgsm_verify (void *engine, gpgme_verify_flags_t flags, gpgme_data_t sig,
+ if (flags & GPGME_VERIFY_ARCHIVE)
+ return gpg_error (GPG_ERR_NOT_IMPLEMENTED);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ gpgsm->input_cb.data = sig;
+ err = gpgsm_set_fd (gpgsm, INPUT_FD, map_data_enc (gpgsm->input_cb.data));
+ if (err)
+@@ -2293,6 +2350,10 @@ gpgsm_getauditlog (void *engine, gpgme_data_t output, unsigned int flags)
+ if (!gpgsm->assuan_ctx)
+ return gpg_error (GPG_ERR_INV_VALUE);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ #if USE_DESCRIPTOR_PASSING
+ gpgsm->output_cb.data = output;
+ err = gpgsm_set_fd (gpgsm, OUTPUT_FD, 0);
+@@ -2386,6 +2447,10 @@ gpgsm_passwd (void *engine, gpgme_key_t key, unsigned int flags)
+ if (!key || !key->subkeys || !key->subkeys->fpr)
+ return gpg_error (GPG_ERR_INV_CERT_OBJ);
+
++ err = prepare (gpgsm);
++ if (err)
++ return err;
++
+ if (gpgrt_asprintf (&line, "PASSWD -- %s", key->subkeys->fpr) < 0)
+ return gpg_error_from_syserror ();
+
+--
+2.39.2
diff --git a/patches/gpgme-1.24.3/0002-gpgsm-Extend-gpgsm_assuan_simple_command.patch b/patches/gpgme-1.24.3/0002-gpgsm-Extend-gpgsm_assuan_simple_command.patch
new file mode 100755
index 00000000..ffc80206
--- /dev/null
+++ b/patches/gpgme-1.24.3/0002-gpgsm-Extend-gpgsm_assuan_simple_command.patch
@@ -0,0 +1,70 @@
+#! /bin/sh
+patch -p1 -l -f $* < $0
+exit $?
+
+From cff9df67d34fa21fc8f3ba47300e1671c4526629 Mon Sep 17 00:00:00 2001
+From: NIIBE Yutaka <gniibe@fsij.org>
+Date: Fri, 29 Aug 2025 14:49:42 +0900
+Subject: [PATCH 2/2] gpgsm: Extend gpgsm_assuan_simple_command to consule diag
+ output.
+
+* src/engine-gpgsm.c (gpgsm_assuan_simple_command): Take care about
+diag output.
+
+--
+
+GnuPG-bug-id: 7759
+Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
+
+
+--- a/src/engine-gpgsm.c 2025-09-17 12:31:24.359626906 +0200
++++ b/src/engine-gpgsm.c 2025-09-17 12:33:35.415622806 +0200
+@@ -691,6 +691,23 @@
+ gpg_error_t err, cb_err;
+ char *line;
+ size_t linelen;
++ struct io_select_fd_s fds[2];
++ struct io_cb_data iocb_data;
++ int nfds = 0;
++
++ iocb_data.handler_value = gpgsm->diag_cb.data;
++ iocb_data.op_err = 0;
++
++ memset (fds, 0, sizeof (struct io_select_fd_s)*2);
++ fds[nfds].fd = gpgsm->status_cb.fd;
++ fds[nfds].for_read = 1;
++ nfds++;
++ if (gpgsm->diag_cb.fd != -1)
++ {
++ fds[nfds].fd = gpgsm->diag_cb.fd;
++ fds[nfds].for_read = 1;
++ nfds++;
++ }
+
+ err = assuan_write_line (ctx, cmd);
+ if (err)
+@@ -699,6 +716,24 @@
+ cb_err = 0;
+ do
+ {
++ fds[0].signaled = fds[1].signaled = 0;
++ if (gpgsm->status_cb.fd != -1
++ && _gpgme_io_select (fds, nfds, 0) < 0)
++ {
++ err = gpg_error_from_syserror ();
++ break;
++ }
++
++ if (gpgsm->diag_cb.fd != -1 && fds[1].signaled)
++ {
++ err = _gpgme_data_inbound_handler (&iocb_data, gpgsm->diag_cb.fd);
++ if (err)
++ break;
++ }
++
++ if (gpgsm->status_cb.fd != -1 && !fds[0].signaled)
++ continue;
++
+ err = assuan_read_line (ctx, &line, &linelen);
+ if (err)
+ break;
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Apr 14, 9:23 PM (3 h, 47 m)
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
7f/b3/2d3663ef101cebe8e531b615c5be
Attached To
rW Gpg4win
Event Timeline
Log In to Comment