From ea7aba6e605d0469fc5c9cf38bafa7eb46e69c22 Mon Sep 17 00:00:00 2001 From: Werner Koch Date: Tue, 2 Aug 2022 12:25:23 +0200 Subject: [PATCH] gpgconf: Improve registry dumping. * common/w32-reg.c (read_w32_reg_string): Add arg r_hklm_fallback and change all callers. (show_configs): Indicate whether the HKLM fallback was used. * tools/gpgconf.c (show_other_registry_entries): Fix the Outlook Addin Registry key. Indicate whether the HKLM fallback was used. -- Note that this is backport from 2.2. The new support there for REG_DWORD needs to be implemented in libgpg-error, though. --- common/t-w32-reg.c | 4 ++-- common/w32-reg.c | 20 +++++++++++++++++--- common/w32help.h | 2 +- tools/gpgconf.c | 20 +++++++++++--------- 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/common/t-w32-reg.c b/common/t-w32-reg.c index 9665003ea..1a44e385c 100644 --- a/common/t-w32-reg.c +++ b/common/t-w32-reg.c @@ -56,7 +56,7 @@ test_read_registry (void) string2 = read_w32_reg_string ("HKCU\\Software\\Microsoft\\Windows\\CurrentVersion" - "\\Internet Settings:User Agent"); + "\\Internet Settings:User Agent", NULL); if (!string2) fail (1); fprintf (stderr, "User agent: %s\n", string2); @@ -76,7 +76,7 @@ main (int argc, char **argv) { if (argc > 1) { - char *string = read_w32_reg_string (argv[1]); + char *string = read_w32_reg_string (argv[1], NULL); printf ("%s -> %s\n", argv[1], string? string : "(null)"); xfree (string); } diff --git a/common/w32-reg.c b/common/w32-reg.c index 94049a283..9af7d2d28 100644 --- a/common/w32-reg.c +++ b/common/w32-reg.c @@ -71,14 +71,19 @@ read_w32_registry_string (const char *root, const char *dir, const char *name) * * Note that the first backslash and the first colon act as delimiters. * - * Returns a malloced string or NULL if not found. + * Returns a malloced string or NULL if not found. If R_HKLM_FALLBACK + * is not NULL, no class was given, and the result came from HKLM, + * true is stored there. */ char * -read_w32_reg_string (const char *key_arg) +read_w32_reg_string (const char *key_arg, int *r_hklm_fallback) { char *key; char *p1, *p2; - char *result; + char *result, *result2; + + if (r_hklm_fallback) + *r_hklm_fallback = 0; if (!key_arg) return NULL; @@ -101,6 +106,15 @@ read_w32_reg_string (const char *key_arg) *p2++ = 0; result = gpgrt_w32_reg_query_string (*key? key : NULL, p1, p2); + if (result && !*key && r_hklm_fallback) + { + /* No key given - see whether the result came from HKCU or HKLM. */ + result2 = gpgrt_w32_reg_query_string ("HKCU", p1, p2); + if (result2) + xfree (result2); + else + *r_hklm_fallback = 1; + } xfree (key); return result; } diff --git a/common/w32help.h b/common/w32help.h index 33000acc7..5a4e5752c 100644 --- a/common/w32help.h +++ b/common/w32help.h @@ -44,7 +44,7 @@ char **w32_parse_commandline (char *cmdline, int globing, int *r_argv, /*-- w32-reg.c --*/ char *read_w32_registry_string (const char *root, const char *dir, const char *name ); -char *read_w32_reg_string (const char *key); +char *read_w32_reg_string (const char *key, int *r_hklm_fallback); #endif /*HAVE_W32_SYSTEM*/ diff --git a/tools/gpgconf.c b/tools/gpgconf.c index 2e693ac93..7c5db792b 100644 --- a/tools/gpgconf.c +++ b/tools/gpgconf.c @@ -1357,7 +1357,7 @@ show_other_registry_entries (estream_t outfp) { 1, "HKLM\\Software\\Gpg4win:VS-Desktop-Version" }, { 1, "\\" GNUPG_REGISTRY_DIR ":HomeDir" }, { 1, "\\" GNUPG_REGISTRY_DIR ":DefaultLogFile" }, - { 2, "Software\\Microsoft\\Office\\Outlook\\Addins\\GNU.GpgOL" + { 2, "\\Software\\Microsoft\\Office\\Outlook\\Addins\\GNU.GpgOL" ":LoadBehavior" }, { 2, "HKCU\\Software\\Microsoft\\Office\\16.0\\Outlook\\Options\\Mail:" "ReadAsPlain" }, @@ -1389,6 +1389,7 @@ show_other_registry_entries (estream_t outfp) int group = 0; char *namebuf = NULL; const char *name; + int from_hklm; for (idx=0; (name = names[idx].name); idx++) { @@ -1402,7 +1403,7 @@ show_other_registry_entries (estream_t outfp) name = namebuf; } - value = read_w32_reg_string (name); + value = read_w32_reg_string (name, &from_hklm); if (!value) continue; @@ -1417,12 +1418,11 @@ show_other_registry_entries (estream_t outfp) } if (group == 3) - es_fprintf (outfp, "### %s=%s\n", names[idx].name, value); + es_fprintf (outfp, "### %s=%s%s\n", names[idx].name, value, + from_hklm? " [hklm]":""); else - es_fprintf (outfp, "### %s\n### ->%s<-\n", name, value); - - /* FIXME: We may want to add an indiction whethe found via HKLM - * or HKCU. */ + es_fprintf (outfp, "### %s\n### ->%s<-%s\n", name, value, + from_hklm? " [hklm]":""); xfree (value); } @@ -1521,14 +1521,16 @@ show_configs (estream_t outfp) if ((sl->flags & 1)) { char *p; + int from_hklm; if (!any) { any = 1; es_fprintf (outfp, "###\n### Encountered in config files:\n"); } - if ((p = read_w32_reg_string (sl->d))) - es_fprintf (outfp, "### %s ->%s<-\n", sl->d, p); + if ((p = read_w32_reg_string (sl->d, &from_hklm))) + es_fprintf (outfp, "### %s ->%s<-%s\n", sl->d, p, + from_hklm? " [hklm]":""); else es_fprintf (outfp, "### %s [not set]\n", sl->d); xfree (p);