summaryrefslogtreecommitdiff
path: root/extra/gnome-keyring/gpg-agent-fix-encoding.patch
blob: e6a7412b3bf450c196d91d14fecd6e728f3648d0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
From d31a26df7ce8d9c084b9c66fe00458683dde9864 Mon Sep 17 00:00:00 2001
From: Stef Walter <stefw@gnome.org>
Date: Thu, 28 Jun 2012 15:51:54 +0200
Subject: [PATCH] gpg-agent: Encode passwords when --data was requested

 * Use URI encoding to return passwords when gnupg calls us with
   a --data argument.

https://bugzilla.gnome.org/show_bug.cgi?id=678771
---
 daemon/gpg-agent/gkd-gpg-agent-ops.c |   41 ++++++++++++++++++++++++++++++----
 1 file changed, 37 insertions(+), 4 deletions(-)

diff --git a/daemon/gpg-agent/gkd-gpg-agent-ops.c b/daemon/gpg-agent/gkd-gpg-agent-ops.c
index be6c4d3..a1a21ff 100644
--- a/daemon/gpg-agent/gkd-gpg-agent-ops.c
+++ b/daemon/gpg-agent/gkd-gpg-agent-ops.c
@@ -632,11 +632,12 @@ command_has_option (gchar *command, gchar *option)
 	return has_option;
 }
 
+static const char HEXC[] = "0123456789abcdef";
+
 /* Encode a password in hex */
 static gchar*
-encode_password (const gchar *pass)
+hex_encode_password (const gchar *pass)
 {
-	static const char HEXC[] = "0123456789abcdef";
 	int j, c;
 	gchar *enc, *k;
 
@@ -656,6 +657,36 @@ encode_password (const gchar *pass)
 	return enc;
 }
 
+static gchar*
+uri_encode_password (const gchar *value)
+{
+	gchar *p;
+	gchar *result;
+
+	/* Just allocate for worst case */
+	result = egg_secure_alloc ((strlen (value) * 3) + 1);
+
+	/* Now loop through looking for escapes */
+	p = result;
+	while (*value) {
+
+		/* These characters we let through verbatim */
+		if (*value && (g_ascii_isalnum (*value) || strchr ("_-.", *value) != NULL)) {
+			*(p++) = *(value++);
+
+		/* All others get encoded */
+		} else {
+			*(p++) = '%';
+			*(p++) = HEXC[((unsigned char)*value) >> 4];
+			*(p++) = HEXC[((unsigned char)*value) & 0x0F];
+			++value;
+		}
+	}
+
+	*p = 0;
+	return result;
+}
+
 /* ----------------------------------------------------------------------------------
  * OPERATIONS
  */
@@ -737,10 +768,12 @@ gkd_gpg_agent_ops_getpass (GkdGpgAgentCall *call, gchar *args)
 	if (password == NULL) {
 		gkd_gpg_agent_send_reply (call, FALSE, "111 cancelled");
 	} else if (flags & GKD_GPG_AGENT_PASS_AS_DATA) {
-		gkd_gpg_agent_send_data (call, password);
+		encoded = uri_encode_password (password);
+		gkd_gpg_agent_send_data (call, encoded);
 		gkd_gpg_agent_send_reply (call, TRUE, NULL);
+		egg_secure_strfree (encoded);
 	} else {
-		encoded = encode_password (password);
+		encoded = hex_encode_password (password);
 		gkd_gpg_agent_send_reply (call, TRUE, encoded);
 		egg_secure_strfree (encoded);
 	}
-- 
1.7.10.2