Merge ~cjwatson/launchpad:py3-signing-proxy into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 4c6e2c957557b1680864e0ce79cff6a1e8e6c421
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:py3-signing-proxy
Merge into: launchpad:master
Diff against target: 151 lines (+25/-18)
3 files modified
lib/lp/services/signing/proxy.py (+11/-6)
lib/lp/services/signing/tests/test_proxy.py (+13/-11)
lib/lp/services/signing/tests/test_signingkey.py (+1/-1)
Reviewer Review Type Date Requested Status
Cristian Gonzalez (community) Approve
Review via email: mp+399081@code.launchpad.net

Commit message

lp.services.signing.proxy: Fix up bytes vs. text for Python 3

Description of the change

base64 operates on bytes while json generally operates on text, so a good deal of explicit encoding and decoding is needed.

To post a comment you must log in.
Revision history for this message
Cristian Gonzalez (cristiangsp) wrote :

Looks well encoded :)!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/services/signing/proxy.py b/lib/lp/services/signing/proxy.py
2index 8d78e65..2cb5393 100644
3--- a/lib/lp/services/signing/proxy.py
4+++ b/lib/lp/services/signing/proxy.py
5@@ -64,7 +64,8 @@ class SigningServiceClient:
6 def _decryptResponseJson(self, response, response_nonce):
7 box = Box(self.private_key, self.service_public_key)
8 return json.loads(box.decrypt(
9- response.content, response_nonce, encoder=Base64Encoder))
10+ response.content, response_nonce,
11+ encoder=Base64Encoder).decode("UTF-8"))
12
13 def _requestJson(self, path, method="GET", encrypt=False, **kwargs):
14 """Helper method to do an HTTP request and get back a json from the
15@@ -138,8 +139,9 @@ class SigningServiceClient:
16 return {
17 "Content-Type": "application/x-boxed-json",
18 "X-Client-Public-Key": config.signing.client_public_key,
19- "X-Nonce": base64.b64encode(nonce),
20- "X-Response-Nonce": base64.b64encode(response_nonce),
21+ "X-Nonce": base64.b64encode(nonce).decode("UTF-8"),
22+ "X-Response-Nonce": (
23+ base64.b64encode(response_nonce).decode("UTF-8")),
24 }
25
26 def _encryptPayload(self, nonce, message):
27@@ -178,7 +180,8 @@ class SigningServiceClient:
28 "/generate", "POST", encrypt=True, json=payload)
29 return {
30 "fingerprint": ret["fingerprint"],
31- "public-key": base64.b64decode(ret["public-key"])}
32+ "public-key": base64.b64decode(ret["public-key"].encode("UTF-8")),
33+ }
34
35 def sign(self, key_type, fingerprint, message_name, message, mode):
36 valid_modes = {SigningMode.ATTACHED, SigningMode.DETACHED}
37@@ -199,8 +202,10 @@ class SigningServiceClient:
38
39 ret = self._requestJson("/sign", "POST", encrypt=True, json=payload)
40 return {
41- "public-key": base64.b64decode(ret["public-key"]),
42- "signed-message": base64.b64decode(ret["signed-message"])}
43+ "public-key": base64.b64decode(ret["public-key"].encode("UTF-8")),
44+ "signed-message": base64.b64decode(
45+ ret["signed-message"].encode("UTF-8")),
46+ }
47
48 def inject(self, key_type, private_key, public_key, description,
49 created_at):
50diff --git a/lib/lp/services/signing/tests/test_proxy.py b/lib/lp/services/signing/tests/test_proxy.py
51index 4405fe7..5f7fe7e 100644
52--- a/lib/lp/services/signing/tests/test_proxy.py
53+++ b/lib/lp/services/signing/tests/test_proxy.py
54@@ -69,11 +69,11 @@ class SigningServiceResponseFactory:
55
56 self.generated_public_key = PrivateKey.generate().public_key
57 self.b64_generated_public_key = base64.b64encode(
58- bytes(self.generated_public_key))
59+ bytes(self.generated_public_key)).decode("UTF-8")
60 self.generated_fingerprint = (
61 u'338D218488DFD597D8FCB9C328C3E9D9ADA16CEE')
62
63- self.signed_msg_template = "%s::signed!"
64+ self.signed_msg_template = b"%d::signed!"
65
66 @classmethod
67 def getUrl(cls, path):
68@@ -86,7 +86,8 @@ class SigningServiceResponseFactory:
69 lp-signing would do."""
70 box = Box(self.service_private_key, self.client_public_key)
71 return box.encrypt(
72- json.dumps(data), nonce, encoder=Base64Encoder).ciphertext
73+ json.dumps(data).encode("UTF-8"), nonce,
74+ encoder=Base64Encoder).ciphertext
75
76 def _decryptPayload(self, value):
77 """Decrypt a payload we encrypted.
78@@ -137,18 +138,18 @@ class SigningServiceResponseFactory:
79
80 responses.add(
81 responses.GET, self.getUrl("/service-key"),
82- json={"service-key": self.b64_service_public_key.decode('utf8')},
83+ json={"service-key": self.b64_service_public_key},
84 status=200)
85
86 responses.add(
87 responses.POST, self.getUrl("/nonce"),
88- json={"nonce": self.b64_nonce.decode('utf8')}, status=201)
89+ json={"nonce": self.b64_nonce}, status=201)
90
91 responses.add(
92 responses.POST, self.getUrl("/generate"),
93 body=self._encryptPayload({
94 'fingerprint': self.generated_fingerprint,
95- 'public-key': self.b64_generated_public_key.decode('utf8')
96+ 'public-key': self.b64_generated_public_key,
97 }, nonce=self.response_nonce),
98 status=201)
99
100@@ -169,9 +170,9 @@ class SigningServiceResponseFactory:
101 def sign_callback(request):
102 call_counts['/sign'] += 1
103 signed_msg = self.signed_msg_template % call_counts['/sign']
104- signed = base64.b64encode(signed_msg.encode('utf8'))
105+ signed = base64.b64encode(signed_msg)
106 data = {'signed-message': signed.decode('utf8'),
107- 'public-key': self.b64_generated_public_key.decode('utf8')}
108+ 'public-key': self.b64_generated_public_key}
109 return 201, {}, self._encryptPayload(data, self.response_nonce)
110
111 responses.add_callback(
112@@ -222,7 +223,7 @@ class SigningServiceProxyTest(TestCaseWithFactory, TestWithFixtures):
113 self.assertIsInstance(key, PublicKey)
114 self.assertEqual(
115 key.encode(Base64Encoder),
116- self.response_factory.b64_service_public_key)
117+ self.response_factory.b64_service_public_key.encode("UTF-8"))
118
119 # Checks that the HTTP call was made
120 self.assertEqual(1, len(responses.calls))
121@@ -241,7 +242,8 @@ class SigningServiceProxyTest(TestCaseWithFactory, TestWithFixtures):
122 nonce = signing.getNonce()
123
124 self.assertEqual(
125- base64.b64encode(nonce), self.response_factory.b64_nonce)
126+ base64.b64encode(nonce),
127+ self.response_factory.b64_nonce.encode("UTF-8"))
128
129 # Checks that the HTTP call was made
130 self.assertEqual(1, len(responses.calls))
131@@ -422,7 +424,7 @@ class SigningServiceProxyTest(TestCaseWithFactory, TestWithFixtures):
132 key_type = SigningKeyType.KMOD
133 mode = SigningMode.DETACHED
134 message_name = 'my test msg'
135- message = 'this is the message content'
136+ message = b'this is the message content'
137
138 signing = getUtility(ISigningServiceClient)
139 data = signing.sign(
140diff --git a/lib/lp/services/signing/tests/test_signingkey.py b/lib/lp/services/signing/tests/test_signingkey.py
141index 00714f9..03e0a74 100644
142--- a/lib/lp/services/signing/tests/test_signingkey.py
143+++ b/lib/lp/services/signing/tests/test_signingkey.py
144@@ -88,7 +88,7 @@ class TestSigningKey(TestCaseWithFactory, TestWithFixtures):
145 self.assertEqual(
146 self.signing_service.generated_fingerprint, db_key.fingerprint)
147 self.assertEqual(
148- self.signing_service.b64_generated_public_key,
149+ self.signing_service.b64_generated_public_key.encode("UTF-8"),
150 base64.b64encode(db_key.public_key))
151 self.assertEqual("this is my key", db_key.description)
152

Subscribers

People subscribed via source and target branches

to status/vote changes: