Merge lp:~cjwatson/launchpad/add-webhook-secret into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 17832
Proposed branch: lp:~cjwatson/launchpad/add-webhook-secret
Merge into: lp:launchpad
Diff against target: 77 lines (+24/-4)
2 files modified
lib/lp/services/webhooks/browser.py (+6/-3)
lib/lp/services/webhooks/tests/test_browser.py (+18/-1)
To merge this branch: bzr merge lp:~cjwatson/launchpad/add-webhook-secret
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Review via email: mp+275695@code.launchpad.net

Commit message

Allow setting a secret when creating a new webhook.

Description of the change

Allow setting a secret when creating a new webhook.

For now, this field is disabled when editing an existing webhook. It will need some custom handling to, at minimum, not reveal the existing secret, and probably also do some clever JavaScript thing to obscure the entered secret except when you're editing the value. Secrets for existing webhooks can still be edited using the API though.

To post a comment you must log in.
Revision history for this message
Colin Watson (cjwatson) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'lib/lp/services/webhooks/browser.py'
2--- lib/lp/services/webhooks/browser.py 2015-10-05 11:11:47 +0000
3+++ lib/lp/services/webhooks/browser.py 2015-10-26 12:21:56 +0000
4@@ -110,8 +110,8 @@
5
6
7 class WebhookEditSchema(Interface):
8- # XXX wgrant 2015-08-04: Need custom widget for secret.
9- use_template(IWebhook, include=['delivery_url', 'event_types', 'active'])
10+ use_template(
11+ IWebhook, include=['delivery_url', 'event_types', 'active', 'secret'])
12
13
14 class WebhookAddView(LaunchpadFormView):
15@@ -140,7 +140,8 @@
16 def new_action(self, action, data):
17 webhook = self.context.newWebhook(
18 registrant=self.user, delivery_url=data['delivery_url'],
19- event_types=data['event_types'], active=data['active'])
20+ event_types=data['event_types'], active=data['active'],
21+ secret=data['secret'])
22 self.next_url = canonical_url(webhook)
23
24
25@@ -149,6 +150,8 @@
26 label = "Manage webhook"
27
28 schema = WebhookEditSchema
29+ # XXX wgrant 2015-08-04: Need custom widget for secret.
30+ field_names = ['delivery_url', 'event_types', 'active']
31 custom_widget('event_types', LabeledMultiCheckBoxWidget)
32
33 def initialize(self):
34
35=== modified file 'lib/lp/services/webhooks/tests/test_browser.py'
36--- lib/lp/services/webhooks/tests/test_browser.py 2015-10-19 10:48:28 +0000
37+++ lib/lp/services/webhooks/tests/test_browser.py 2015-10-26 12:21:56 +0000
38@@ -188,6 +188,7 @@
39 "field.delivery_url": "http://example.com/test",
40 "field.active": "on", "field.event_types-empty-marker": "1",
41 "field.event_types": self.event_type,
42+ "field.secret": "secret code",
43 "field.actions.new": "Add webhook"})
44 self.assertEqual([], view.errors)
45 hook = self.target.webhooks.one()
46@@ -198,7 +199,8 @@
47 registrant=self.owner,
48 delivery_url="http://example.com/test",
49 active=True,
50- event_types=[self.event_type]))
51+ event_types=[self.event_type],
52+ secret="secret code"))
53
54 def test_rejects_bad_scheme(self):
55 transaction.commit()
56@@ -212,6 +214,21 @@
57 ['delivery_url'], [error.field_name for error in view.errors])
58 self.assertIs(None, self.target.webhooks.one())
59
60+ def test_no_secret(self):
61+ # If the secret field is left empty, the secret is set to None
62+ # rather than to the empty string.
63+ view = self.makeView(
64+ "+new-webhook", method="POST",
65+ form={
66+ "field.delivery_url": "http://example.com/test",
67+ "field.active": "on", "field.event_types-empty-marker": "1",
68+ "field.event_types": self.event_type,
69+ "field.secret": "",
70+ "field.actions.new": "Add webhook"})
71+ self.assertEqual([], view.errors)
72+ hook = self.target.webhooks.one()
73+ self.assertIsNone(hook.secret)
74+
75 def test_event_types(self):
76 # Only event types that are valid for the target are offered.
77 browser = self.getUserBrowser(