summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJinWang An <jinwang.an@samsung.com>2021-12-01 16:54:35 +0900
committerJinWang An <jinwang.an@samsung.com>2021-12-01 16:54:35 +0900
commit89f8f4e0a5b2aa091a5a63b67a97ef4089ae466c (patch)
tree40f799e1f1ef078c06d2559bd20da7408a2fe3c4 /src
parentad62d9510e9c28596872f53b263b96ca7210dcbe (diff)
downloadgpgme-89f8f4e0a5b2aa091a5a63b67a97ef4089ae466c.tar.gz
gpgme-89f8f4e0a5b2aa091a5a63b67a97ef4089ae466c.tar.bz2
gpgme-89f8f4e0a5b2aa091a5a63b67a97ef4089ae466c.zip
Imported Upstream version 1.5.2upstream/1.5.2
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am10
-rw-r--r--src/Makefile.in116
-rw-r--r--src/debug.h4
-rw-r--r--src/engine-gpg.c57
-rw-r--r--src/gpgme-tool.c21
-rw-r--r--src/gpgme.m459
-rw-r--r--src/sign.c104
7 files changed, 272 insertions, 99 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 82f5327..b7ddbc1 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -18,7 +18,7 @@
## Process this file with automake to produce Makefile.in
-# Note: moc_kdpipeiodevice should actually be a dependcy below.
+# Note: moc_kdpipeiodevice should actually be a dependecy below.
EXTRA_DIST = gpgme-config.in gpgme.m4 libgpgme.vers ChangeLog-2011 \
gpgme.h.in versioninfo.rc.in gpgme.def moc_kdpipeiodevice.cpp
@@ -27,6 +27,8 @@ m4datadir = $(datadir)/aclocal
m4data_DATA = gpgme.m4
nodist_include_HEADERS = gpgme.h
+bin_PROGRAMS = gpgme-tool
+
if HAVE_PTHREAD
ltlib_gpgme_pthread = libgpgme-pthread.la
else
@@ -126,6 +128,9 @@ endif
AM_CPPFLAGS = @GPG_ERROR_CFLAGS@ @QT4_CORE_CFLAGS@
AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GLIB_CFLAGS@ @QT4_CORE_CFLAGS@
+gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@
+
+
if HAVE_W32_SYSTEM
# Windows provides us with an endless stream of Tough Love. To spawn
# processes with a controlled set of inherited handles, we need a
@@ -201,9 +206,6 @@ libgpgme_qt_la_LIBADD = $(gpgme_res) @LIBASSUAN_LIBS@ @LTLIBOBJS@ \
@GPG_ERROR_LIBS@ @QT4_CORE_LIBS@
endif
-noinst_PROGRAMS = gpgme-tool
-gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@
-
install-data-local: install-def-file
uninstall-local: uninstall-def-file
diff --git a/src/Makefile.in b/src/Makefile.in
index cd55a3f..bd5f999 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -73,9 +73,9 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
+bin_PROGRAMS = gpgme-tool$(EXEEXT)
@HAVE_W32CE_SYSTEM_TRUE@am__append_1 = w32-ce.h w32-ce.c
@HAVE_W32CE_SYSTEM_FALSE@@HAVE_W32_SYSTEM_TRUE@libexec_PROGRAMS = gpgme-w32spawn$(EXEEXT)
-noinst_PROGRAMS = gpgme-tool$(EXEEXT)
subdir = src
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/gpgme-config.in $(srcdir)/gpgme.h.in \
@@ -122,9 +122,9 @@ am__uninstall_files_from_dir = { \
|| { echo " ( cd '$$dir' && rm -f" $$files ")"; \
$(am__cd) "$$dir" && rm -f $$files; }; \
}
-am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libexecdir)" \
- "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" \
- "$(DESTDIR)$(includedir)"
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" \
+ "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(includedir)"
LTLIBRARIES = $(lib_LTLIBRARIES)
@HAVE_W32_SYSTEM_TRUE@am__DEPENDENCIES_1 = versioninfo.lo
am__libgpgme_glib_la_SOURCES_DIST = util.h conversion.c get-env.c \
@@ -244,7 +244,7 @@ libgpgme_la_OBJECTS = $(am_libgpgme_la_OBJECTS)
libgpgme_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
$(libgpgme_la_LDFLAGS) $(LDFLAGS) -o $@
-PROGRAMS = $(libexec_PROGRAMS) $(noinst_PROGRAMS)
+PROGRAMS = $(bin_PROGRAMS) $(libexec_PROGRAMS)
gpgme_tool_SOURCES = gpgme-tool.c
gpgme_tool_OBJECTS = gpgme-tool.$(OBJEXT)
gpgme_tool_DEPENDENCIES = libgpgme.la
@@ -358,6 +358,8 @@ GPGME_CONFIG_LIBS = @GPGME_CONFIG_LIBS@
GPG_ERROR_CFLAGS = @GPG_ERROR_CFLAGS@
GPG_ERROR_CONFIG = @GPG_ERROR_CONFIG@
GPG_ERROR_LIBS = @GPG_ERROR_LIBS@
+GPG_ERROR_MT_CFLAGS = @GPG_ERROR_MT_CFLAGS@
+GPG_ERROR_MT_LIBS = @GPG_ERROR_MT_LIBS@
GREP = @GREP@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
@@ -406,6 +408,7 @@ SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
+SYSROOT = @SYSROOT@
VERSION = @VERSION@
VERSION_NUMBER = @VERSION_NUMBER@
abs_builddir = @abs_builddir@
@@ -465,7 +468,7 @@ top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
-# Note: moc_kdpipeiodevice should actually be a dependcy below.
+# Note: moc_kdpipeiodevice should actually be a dependecy below.
EXTRA_DIST = gpgme-config.in gpgme.m4 libgpgme.vers ChangeLog-2011 \
gpgme.h.in versioninfo.rc.in gpgme.def moc_kdpipeiodevice.cpp
@@ -544,6 +547,7 @@ libgpgme_pthread_la_SOURCES = $(main_sources) \
# versions, because then every object file is only compiled once.
AM_CPPFLAGS = @GPG_ERROR_CFLAGS@ @QT4_CORE_CFLAGS@
AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GLIB_CFLAGS@ @QT4_CORE_CFLAGS@
+gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@
@HAVE_W32_SYSTEM_TRUE@RCCOMPILE = $(RC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES)
@HAVE_W32_SYSTEM_TRUE@LTRCCOMPILE = $(LIBTOOL) --mode=compile --tag=RC $(RCCOMPILE)
@HAVE_W32_SYSTEM_TRUE@SUFFIXES = .rc .lo
@@ -589,7 +593,6 @@ libgpgme_pthread_la_LIBADD = $(gpgme_res) @LIBASSUAN_LIBS@ @LTLIBOBJS@ \
@BUILD_W32_QT_TRUE@libgpgme_qt_la_LIBADD = $(gpgme_res) @LIBASSUAN_LIBS@ @LTLIBOBJS@ \
@BUILD_W32_QT_TRUE@ @GPG_ERROR_LIBS@ @QT4_CORE_LIBS@
-gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@
all: all-am
.SUFFIXES:
@@ -670,6 +673,52 @@ libgpgme-qt.la: $(libgpgme_qt_la_OBJECTS) $(libgpgme_qt_la_DEPENDENCIES) $(EXTRA
$(AM_V_CXXLD)$(libgpgme_qt_la_LINK) $(am_libgpgme_qt_la_rpath) $(libgpgme_qt_la_OBJECTS) $(libgpgme_qt_la_LIBADD) $(LIBS)
libgpgme.la: $(libgpgme_la_OBJECTS) $(libgpgme_la_DEPENDENCIES) $(EXTRA_libgpgme_la_DEPENDENCIES)
$(AM_V_CCLD)$(libgpgme_la_LINK) -rpath $(libdir) $(libgpgme_la_OBJECTS) $(libgpgme_la_LIBADD) $(LIBS)
+install-binPROGRAMS: $(bin_PROGRAMS)
+ @$(NORMAL_INSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ if test -n "$$list"; then \
+ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \
+ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \
+ fi; \
+ for p in $$list; do echo "$$p $$p"; done | \
+ sed 's/$(EXEEXT)$$//' | \
+ while read p p1; do if test -f $$p || test -f $$p1; \
+ then echo "$$p"; echo "$$p"; else :; fi; \
+ done | \
+ sed -e 'p;s,.*/,,;n;h' -e 's|.*|.|' \
+ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \
+ sed 'N;N;N;s,\n, ,g' | \
+ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \
+ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \
+ if ($$2 == $$4) files[d] = files[d] " " $$1; \
+ else { print "f", $$3 "/" $$4, $$1; } } \
+ END { for (d in files) print "f", d, files[d] }' | \
+ while read type dir files; do \
+ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \
+ test -z "$$files" || { \
+ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \
+ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \
+ } \
+ ; done
+
+uninstall-binPROGRAMS:
+ @$(NORMAL_UNINSTALL)
+ @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \
+ files=`for p in $$list; do echo "$$p"; done | \
+ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \
+ -e 's/$$/$(EXEEXT)/' `; \
+ test -n "$$list" || exit 0; \
+ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \
+ cd "$(DESTDIR)$(bindir)" && rm -f $$files
+
+clean-binPROGRAMS:
+ @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \
+ echo " rm -f" $$list; \
+ rm -f $$list || exit $$?; \
+ test -n "$(EXEEXT)" || exit 0; \
+ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+ echo " rm -f" $$list; \
+ rm -f $$list
install-libexecPROGRAMS: $(libexec_PROGRAMS)
@$(NORMAL_INSTALL)
@list='$(libexec_PROGRAMS)'; test -n "$(libexecdir)" || list=; \
@@ -716,15 +765,6 @@ clean-libexecPROGRAMS:
list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
echo " rm -f" $$list; \
rm -f $$list
-
-clean-noinstPROGRAMS:
- @list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
- echo " rm -f" $$list; \
- rm -f $$list || exit $$?; \
- test -n "$(EXEEXT)" || exit 0; \
- list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
- echo " rm -f" $$list; \
- rm -f $$list
gpgme-tool$(EXEEXT): $(gpgme_tool_OBJECTS) $(gpgme_tool_DEPENDENCIES) $(EXTRA_gpgme_tool_DEPENDENCIES)
@rm -f gpgme-tool$(EXEEXT)
$(AM_V_CCLD)$(LINK) $(gpgme_tool_OBJECTS) $(gpgme_tool_LDADD) $(LIBS)
@@ -1025,8 +1065,10 @@ check-am: all-am
check: check-am
all-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(DATA) \
$(HEADERS)
+install-binPROGRAMS: install-libLTLIBRARIES
+
installdirs:
- for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(includedir)"; do \
+ for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libexecdir)" "$(DESTDIR)$(bindir)" "$(DESTDIR)$(m4datadir)" "$(DESTDIR)$(includedir)"; do \
test -z "$$dir" || $(MKDIR_P) "$$dir"; \
done
install: install-am
@@ -1061,8 +1103,8 @@ maintainer-clean-generic:
@echo "it deletes files that may require special tools to rebuild."
clean: clean-am
-clean-am: clean-generic clean-libLTLIBRARIES clean-libexecPROGRAMS \
- clean-libtool clean-noinstPROGRAMS mostlyclean-am
+clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
+ clean-libexecPROGRAMS clean-libtool mostlyclean-am
distclean: distclean-am
-rm -rf $(DEPDIR) ./$(DEPDIR)
@@ -1089,8 +1131,8 @@ install-dvi: install-dvi-am
install-dvi-am:
-install-exec-am: install-binSCRIPTS install-libLTLIBRARIES \
- install-libexecPROGRAMS
+install-exec-am: install-binPROGRAMS install-binSCRIPTS \
+ install-libLTLIBRARIES install-libexecPROGRAMS
install-html: install-html-am
@@ -1130,27 +1172,29 @@ ps: ps-am
ps-am:
-uninstall-am: uninstall-binSCRIPTS uninstall-libLTLIBRARIES \
- uninstall-libexecPROGRAMS uninstall-local uninstall-m4dataDATA \
+uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \
+ uninstall-libLTLIBRARIES uninstall-libexecPROGRAMS \
+ uninstall-local uninstall-m4dataDATA \
uninstall-nodist_includeHEADERS
.MAKE: install-am install-strip
-.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \
- clean-libLTLIBRARIES clean-libexecPROGRAMS clean-libtool \
- clean-noinstPROGRAMS ctags distclean distclean-compile \
+.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \
+ clean-generic clean-libLTLIBRARIES clean-libexecPROGRAMS \
+ clean-libtool ctags distclean distclean-compile \
distclean-generic distclean-libtool distclean-tags distdir dvi \
dvi-am html html-am info info-am install install-am \
- install-binSCRIPTS install-data install-data-am \
- install-data-local install-dvi install-dvi-am install-exec \
- install-exec-am install-html install-html-am install-info \
- install-info-am install-libLTLIBRARIES install-libexecPROGRAMS \
- install-m4dataDATA install-man install-nodist_includeHEADERS \
- install-pdf install-pdf-am install-ps install-ps-am \
- install-strip installcheck installcheck-am installdirs \
- maintainer-clean maintainer-clean-generic mostlyclean \
- mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
- pdf pdf-am ps ps-am tags uninstall uninstall-am \
+ install-binPROGRAMS install-binSCRIPTS install-data \
+ install-data-am install-data-local install-dvi install-dvi-am \
+ install-exec install-exec-am install-html install-html-am \
+ install-info install-info-am install-libLTLIBRARIES \
+ install-libexecPROGRAMS install-m4dataDATA install-man \
+ install-nodist_includeHEADERS install-pdf install-pdf-am \
+ install-ps install-ps-am install-strip installcheck \
+ installcheck-am installdirs maintainer-clean \
+ maintainer-clean-generic mostlyclean mostlyclean-compile \
+ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+ tags uninstall uninstall-am uninstall-binPROGRAMS \
uninstall-binSCRIPTS uninstall-libLTLIBRARIES \
uninstall-libexecPROGRAMS uninstall-local uninstall-m4dataDATA \
uninstall-nodist_includeHEADERS
diff --git a/src/debug.h b/src/debug.h
index c99b700..d0db573 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -187,8 +187,8 @@ _gpgme_trace_gpgme_error (gpgme_error_t err, const char *file, int line)
#define TRACE_ERR(err) \
err == 0 ? (TRACE_SUC ()) : \
- (_gpgme_debug (_gpgme_trace_level, "%s: error: %s <%s>\n", \
- _gpgme_trace_func, gpgme_strerror (err), \
+ (_gpgme_debug (_gpgme_trace_level, "%s:%d: error: %s <%s>\n", \
+ _gpgme_trace_func, __LINE__, gpgme_strerror (err), \
gpgme_strsource (err)), _gpgme_debug_frame_end (), (err))
/* The cast to void suppresses GCC warnings. */
#define TRACE_SYSRES(res) \
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index 4df0f3e..30c3bfb 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -779,7 +779,7 @@ build_argv (engine_gpg_t gpg, const char *pgmname)
argc++;
if (!gpg->cmd.used)
argc++; /* --batch */
- argc += 1; /* --no-sk-comment */
+ argc += 1; /* --no-sk-comments */
argv = calloc (argc + 1, sizeof *argv);
if (!argv)
@@ -864,7 +864,7 @@ build_argv (engine_gpg_t gpg, const char *pgmname)
}
argc++;
}
- argv[argc] = strdup ("--no-sk-comment");
+ argv[argc] = strdup ("--no-sk-comments");
if (!argv[argc])
{
int saved_err = gpg_error_from_syserror ();
@@ -1242,10 +1242,26 @@ read_colon_line (engine_gpg_t gpg)
}
assert (gpg->colon.fnc);
- gpg->colon.fnc (gpg->colon.fnc_value, line ? line : buffer);
- if (line)
- free (line);
- }
+ if (line)
+ {
+ char *linep = line;
+ char *endp;
+
+ do
+ {
+ endp = strchr (linep, '\n');
+ if (endp)
+ *endp++ = 0;
+ gpg->colon.fnc (gpg->colon.fnc_value, linep);
+ linep = endp;
+ }
+ while (linep && *linep);
+
+ free (line);
+ }
+ else
+ gpg->colon.fnc (gpg->colon.fnc_value, buffer);
+ }
/* To reuse the buffer for the next line we have to
shift the remaining data to the buffer start and
@@ -2071,6 +2087,7 @@ gpg_keylist_preprocess (char *line, char **r_line)
#define NR_FIELDS 16
char *field[NR_FIELDS];
int fields = 0;
+ size_t n;
*r_line = NULL;
@@ -2106,16 +2123,34 @@ gpg_keylist_preprocess (char *line, char **r_line)
pub:<keyid>:<algo>:<keylen>:<creationdate>:<expirationdate>:<flags>
as defined in 5.2. Machine Readable Indexes of the OpenPGP
- HTTP Keyserver Protocol (draft).
+ HTTP Keyserver Protocol (draft). Modern versions of the SKS
+ keyserver return the fingerprint instead of the keyid. We
+ detect this here and use the v4 fingerprint format to convert
+ it to a key id.
We want:
pub:o<flags>:<keylen>:<algo>:<keyid>:<creatdate>:<expdate>::::::::
*/
- if (asprintf (r_line, "pub:o%s:%s:%s:%s:%s:%s::::::::",
- field[6], field[3], field[2], field[1],
- field[4], field[5]) < 0)
- return gpg_error_from_syserror ();
+ n = strlen (field[1]);
+ if (n > 16)
+ {
+ if (asprintf (r_line,
+ "pub:o%s:%s:%s:%s:%s:%s::::::::\n"
+ "fpr:::::::::%s:",
+ field[6], field[3], field[2], field[1] + n - 16,
+ field[4], field[5], field[1]) < 0)
+ return gpg_error_from_syserror ();
+ }
+ else
+ {
+ if (asprintf (r_line,
+ "pub:o%s:%s:%s:%s:%s:%s::::::::",
+ field[6], field[3], field[2], field[1],
+ field[4], field[5]) < 0)
+ return gpg_error_from_syserror ();
+ }
+
return 0;
case RT_UID:
diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c
index f02fffa..d42179b 100644
--- a/src/gpgme-tool.c
+++ b/src/gpgme-tool.c
@@ -831,14 +831,17 @@ result_xml_escape (const char *data, char **buf)
membuf_t mb;
init_membuf (&mb, 128);
- data_len = strlen (data);
- for (i = 0; i < data_len; i++)
+ if (data)
{
- r = result_xml_escape_replacement (data[i]);
- if (r)
- put_membuf (&mb, r, strlen (r));
- else
- put_membuf (&mb, data+i, 1);
+ data_len = strlen (data);
+ for (i = 0; i < data_len; i++)
+ {
+ r = result_xml_escape_replacement (data[i]);
+ if (r)
+ put_membuf (&mb, r, strlen (r));
+ else
+ put_membuf (&mb, data+i, 1);
+ }
}
put_membuf (&mb, "", 1);
*buf = get_membuf (&mb, NULL);
@@ -3302,7 +3305,9 @@ cmd_keylist (assuan_context_t ctx, char *line)
while (subkey) {
result_xml_tag_start (&state, "subkey", NULL);
/* FIXME: more data */
- result_add_fpr (&state, "fpr", subkey->fpr);
+ result_add_keyid (&state, "keyid", subkey->keyid);
+ if (subkey->fpr)
+ result_add_fpr (&state, "fpr", subkey->fpr);
result_add_value (&state, "secret", subkey->secret);
result_add_value (&state, "is_cardkey", subkey->is_cardkey);
if (subkey->card_number)
diff --git a/src/gpgme.m4 b/src/gpgme.m4
index fe17f21..6c2be44 100644
--- a/src/gpgme.m4
+++ b/src/gpgme.m4
@@ -1,5 +1,5 @@
# gpgme.m4 - autoconf macro to detect GPGME.
-# Copyright (C) 2002, 2003, 2004 g10 Code GmbH
+# Copyright (C) 2002, 2003, 2004, 2014 g10 Code GmbH
#
# This file is free software; as a special exception the author gives
# unlimited permission to copy and/or distribute it, with or without
@@ -8,6 +8,8 @@
# This file is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+#
+# Last-changed: 2014-10-02
AC_DEFUN([_AM_PATH_GPGME_CONFIG],
@@ -15,9 +17,25 @@ AC_DEFUN([_AM_PATH_GPGME_CONFIG],
AC_HELP_STRING([--with-gpgme-prefix=PFX],
[prefix where GPGME is installed (optional)]),
gpgme_config_prefix="$withval", gpgme_config_prefix="")
- if test "x$gpgme_config_prefix" != x ; then
- GPGME_CONFIG="$gpgme_config_prefix/bin/gpgme-config"
+ if test x"${GPGME_CONFIG}" = x ; then
+ if test x"${gpgme_config_prefix}" != x ; then
+ GPGME_CONFIG="${gpgme_config_prefix}/bin/gpgme-config"
+ else
+ case "${SYSROOT}" in
+ /*)
+ if test -x "${SYSROOT}/bin/gpgme-config" ; then
+ GPGME_CONFIG="${SYSROOT}/bin/gpgme-config"
+ fi
+ ;;
+ '')
+ ;;
+ *)
+ AC_MSG_WARN([Ignoring \$SYSROOT as it is not an absolute path.])
+ ;;
+ esac
+ fi
fi
+
AC_PATH_PROG(GPGME_CONFIG, gpgme-config, no)
if test "$GPGME_CONFIG" != "no" ; then
@@ -31,10 +49,35 @@ AC_DEFUN([_AM_PATH_GPGME_CONFIG],
sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'`
])
+
+AC_DEFUN([_AM_PATH_GPGME_CONFIG_HOST_CHECK],
+[
+ gpgme_config_host=`$GPGME_CONFIG --host 2>/dev/null || echo none`
+ if test x"$gpgme_config_host" != xnone ; then
+ if test x"$gpgme_config_host" != x"$host" ; then
+ AC_MSG_WARN([[
+***
+*** The config script $GPGME_CONFIG was
+*** built for $gpgme_config_host and thus may not match the
+*** used host $host.
+*** You may want to use the configure option --with-gpgme-prefix
+*** to specify a matching config script or use \$SYSROOT.
+***]])
+ gpg_config_script_warn="$gpg_config_script_warn gpgme"
+ fi
+ fi
+])
+
+
dnl AM_PATH_GPGME([MINIMUM-VERSION,
dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]])
dnl Test for libgpgme and define GPGME_CFLAGS and GPGME_LIBS.
dnl
+dnl If a prefix option is not used, the config script is first
+dnl searched in $SYSROOT/bin and then along $PATH. If the used
+dnl config script does not match the host specification the script
+dnl is added to the gpg_config_script_warn variable.
+dnl
AC_DEFUN([AM_PATH_GPGME],
[ AC_REQUIRE([_AM_PATH_GPGME_CONFIG])dnl
tmp=ifelse([$1], ,1:0.4.2,$1)
@@ -57,7 +100,7 @@ AC_DEFUN([AM_PATH_GPGME],
sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
if test "$gpgme_version_major" -gt "$req_major"; then
ok=yes
- else
+ else
if test "$gpgme_version_major" -eq "$req_major"; then
if test "$gpgme_version_minor" -gt "$req_minor"; then
ok=yes
@@ -88,6 +131,7 @@ AC_DEFUN([AM_PATH_GPGME],
GPGME_LIBS=`$GPGME_CONFIG --libs`
AC_MSG_RESULT(yes)
ifelse([$2], , :, [$2])
+ _AM_PATH_GPGME_CONFIG_HOST_CHECK
else
GPGME_CFLAGS=""
GPGME_LIBS=""
@@ -126,7 +170,7 @@ AC_DEFUN([AM_PATH_GPGME_PTHREAD],
sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
if test "$gpgme_version_major" -gt "$req_major"; then
ok=yes
- else
+ else
if test "$gpgme_version_major" -eq "$req_major"; then
if test "$gpgme_version_minor" -gt "$req_minor"; then
ok=yes
@@ -158,6 +202,7 @@ AC_DEFUN([AM_PATH_GPGME_PTHREAD],
GPGME_PTHREAD_LIBS=`$GPGME_CONFIG --thread=pthread --libs`
AC_MSG_RESULT(yes)
ifelse([$2], , :, [$2])
+ _AM_PATH_GPGME_CONFIG_HOST_CHECK
else
GPGME_PTHREAD_CFLAGS=""
GPGME_PTHREAD_LIBS=""
@@ -195,7 +240,7 @@ AC_DEFUN([AM_PATH_GPGME_GLIB],
sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\)/\3/'`
if test "$gpgme_version_major" -gt "$req_major"; then
ok=yes
- else
+ else
if test "$gpgme_version_major" -eq "$req_major"; then
if test "$gpgme_version_minor" -gt "$req_minor"; then
ok=yes
@@ -226,6 +271,7 @@ AC_DEFUN([AM_PATH_GPGME_GLIB],
GPGME_GLIB_LIBS=`$GPGME_CONFIG --glib --libs`
AC_MSG_RESULT(yes)
ifelse([$2], , :, [$2])
+ _AM_PATH_GPGME_CONFIG_HOST_CHECK
else
GPGME_GLIB_CFLAGS=""
GPGME_GLIB_LIBS=""
@@ -235,4 +281,3 @@ AC_DEFUN([AM_PATH_GPGME_GLIB],
AC_SUBST(GPGME_GLIB_CFLAGS)
AC_SUBST(GPGME_GLIB_LIBS)
])
-
diff --git a/src/sign.c b/src/sign.c
index c55441d..ffbde56 100644
--- a/src/sign.c
+++ b/src/sign.c
@@ -55,11 +55,23 @@ typedef struct
static void
+release_signatures (gpgme_new_signature_t sig)
+{
+ while (sig)
+ {
+ gpgme_new_signature_t next = sig->next;
+ free (sig->fpr);
+ free (sig);
+ sig = next;
+ }
+}
+
+
+static void
release_op_data (void *hook)
{
op_data_t opd = (op_data_t) hook;
gpgme_invalid_key_t invalid_signer = opd->result.invalid_signers;
- gpgme_new_signature_t sig = opd->result.signatures;
while (invalid_signer)
{
@@ -70,13 +82,7 @@ release_op_data (void *hook)
invalid_signer = next;
}
- while (sig)
- {
- gpgme_new_signature_t next = sig->next;
- free (sig->fpr);
- free (sig);
- sig = next;
- }
+ release_signatures (opd->result.signatures);
}
@@ -86,6 +92,10 @@ gpgme_op_sign_result (gpgme_ctx_t ctx)
void *hook;
op_data_t opd;
gpgme_error_t err;
+ gpgme_invalid_key_t inv_key, key;
+ gpgme_new_signature_t sig;
+ unsigned int inv_signers = 0;
+ unsigned int signatures = 0;
TRACE_BEG (DEBUG_CTX, "gpgme_op_sign_result", ctx);
@@ -97,49 +107,81 @@ gpgme_op_sign_result (gpgme_ctx_t ctx)
return NULL;
}
- if (_gpgme_debug_trace ())
- {
- gpgme_invalid_key_t inv_key = opd->result.invalid_signers;
- gpgme_new_signature_t sig = opd->result.signatures;
- int inv_signers = 0;
- int signatures = 0;
+ for (inv_key = opd->result.invalid_signers; inv_key; inv_key = inv_key->next)
+ inv_signers++;
+ for (sig = opd->result.signatures; sig; sig = sig->next)
+ signatures++;
- while (inv_key)
- {
- inv_signers++;
- inv_key = inv_key->next;
- }
- while (sig)
- {
- signatures++;
- sig = sig->next;
- }
+ if (gpgme_signers_count (ctx)
+ && signatures + inv_signers != gpgme_signers_count (ctx))
+ {
+ /* In this case at least one signatures was not created perhaps
+ due to a bad passphrase etc. Thus the entire message is
+ broken and should not be used. We add the already created
+ signatures to the invalid signers list and thus this case can
+ be detected. */
+ TRACE_LOG3 ("result: invalid signers: %u, signatures: %u, count: %u",
+ inv_signers, signatures, gpgme_signers_count (ctx));
+
+ for (sig = opd->result.signatures; sig; sig = sig->next)
+ {
+ key = calloc (1, sizeof *key);
+ if (!key)
+ {
+ TRACE_SUC0 ("out of core; result=(null)");
+ return NULL;
+ }
+ if (sig->fpr)
+ {
+ key->fpr = strdup (sig->fpr);
+ if (!key->fpr)
+ {
+ free (key);
+ TRACE_SUC0 ("out of core; result=(null)");
+ return NULL;
+ }
+ }
+ key->reason = GPG_ERR_GENERAL;
+
+ inv_key = opd->result.invalid_signers;
+ if (inv_key)
+ {
+ for (; inv_key->next; inv_key = inv_key->next)
+ ;
+ inv_key->next = key;
+ }
+ else
+ opd->result.invalid_signers = key;
+ }
+
+ release_signatures (opd->result.signatures);
+ opd->result.signatures = NULL;
+ }
+ if (_gpgme_debug_trace())
+ {
TRACE_LOG2 ("result: invalid signers: %i, signatures: %i",
inv_signers, signatures);
- inv_key = opd->result.invalid_signers;
- while (inv_key)
+ for (inv_key=opd->result.invalid_signers; inv_key; inv_key=inv_key->next)
{
TRACE_LOG3 ("result: invalid signer: fpr=%s, reason=%s <%s>",
inv_key->fpr, gpgme_strerror (inv_key->reason),
gpgme_strsource (inv_key->reason));
- inv_key = inv_key->next;
}
- sig = opd->result.signatures;
- while (sig)
+ for (sig = opd->result.signatures; sig; sig = sig->next)
{
TRACE_LOG6 ("result: signature: type=%i, pubkey_algo=%i, "
"hash_algo=%i, timestamp=%li, fpr=%s, sig_class=%i",
sig->type, sig->pubkey_algo, sig->hash_algo,
sig->timestamp, sig->fpr, sig->sig_class);
- sig = sig->next;
}
- }
+ }
TRACE_SUC1 ("result=%p", &opd->result);
return &opd->result;
}
+
static gpgme_error_t
parse_sig_created (char *args, gpgme_new_signature_t *sigp,