Merge lp:~alecu/ubuntuone-client/txweb-ssl-3-0 into lp:ubuntuone-client/stable-3-0

Proposed by Alejandro J. Cura
Status: Merged
Approved by: Alejandro J. Cura
Approved revision: 1193
Merged at revision: 1193
Proposed branch: lp:~alecu/ubuntuone-client/txweb-ssl-3-0
Merge into: lp:ubuntuone-client/stable-3-0
Diff against target: 156 lines (+78/-22)
2 files modified
tests/syncdaemon/test_action_queue.py (+67/-12)
ubuntuone/syncdaemon/action_queue.py (+11/-10)
To merge this branch: bzr merge lp:~alecu/ubuntuone-client/txweb-ssl-3-0
Reviewer Review Type Date Requested Status
Roberto Alsina (community) Approve
dobey (community) Approve
Review via email: mp+110165@code.launchpad.net

Commit message

- Add SSL verification to webapi calls (LP: #882062).

To post a comment you must log in.
Revision history for this message
dobey (dobey) :
review: Approve
Revision history for this message
Roberto Alsina (ralsina) wrote :

+1 on code review

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'tests/syncdaemon/test_action_queue.py'
--- tests/syncdaemon/test_action_queue.py 2012-05-16 22:01:56 +0000
+++ tests/syncdaemon/test_action_queue.py 2012-06-13 20:39:18 +0000
@@ -329,6 +329,8 @@
329329
330class BasicTests(BasicTestCase):330class BasicTests(BasicTestCase):
331 """Basic tests to check ActionQueue."""331 """Basic tests to check ActionQueue."""
332 fake_host = "fake_host"
333 fake_iri = u"http://%s/" % fake_host
332334
333 def test_implements_interface(self):335 def test_implements_interface(self):
334 """Verify ActionQueue and FakeActionQueue interface."""336 """Verify ActionQueue and FakeActionQueue interface."""
@@ -433,19 +435,54 @@
433 self.assertEqual(set(defined_args[1:]), set(evtargs))435 self.assertEqual(set(defined_args[1:]), set(evtargs))
434436
435 @defer.inlineCallbacks437 @defer.inlineCallbacks
438 def test_get_webclient_called_with_iri(self):
439 """The call to get_webclient includes the iri."""
440 called_args = []
441 real_get_webclient = action_queue.ActionQueue.get_webclient
442
443 def fake_get_webclient(aq, *args):
444 """A fake get_webclient."""
445 called_args.append(args)
446 return real_get_webclient(aq, *args)
447
448 self.patch(action_queue.ActionQueue, "get_webclient",
449 fake_get_webclient)
450 self.patch(action_queue.txweb.WebClient, "request",
451 lambda *args, **kwargs: defer.succeed(None))
452
453 yield self.action_queue.webcall(self.fake_iri)
454 self.assertEqual(called_args, [(self.fake_iri,)])
455
456 @defer.inlineCallbacks
436 def test_get_webclient(self):457 def test_get_webclient(self):
437 """The webclient is created if it does not exist."""458 """The webclient is created every time."""
438 self.assertEqual(self.action_queue.webclient, None)459 webclient1 = yield self.action_queue.get_webclient(self.fake_iri)
439 webclient = yield self.action_queue.get_webclient()460 webclient2 = yield self.action_queue.get_webclient(self.fake_iri)
440 self.assertNotEqual(webclient, None)461 self.assertNotEqual(webclient1, webclient2)
441462
442 @defer.inlineCallbacks463 @defer.inlineCallbacks
443 def test_get_webclient_existing(self):464 def test_get_webclient_creates_context_with_host(self):
444 """The webclient is not created again if it exists."""465 """The ssl context is created with the right host."""
445 fake_wc = object()466 used_host = []
446 self.patch(self.action_queue, "webclient", fake_wc)467
447 webclient = yield self.action_queue.get_webclient()468 def fake_get_ssl_context(disable_ssl_verify, host):
448 self.assertEqual(webclient, fake_wc)469 """The host is used to call get_ssl_context."""
470 used_host.append(host)
471
472 self.patch(action_queue, "get_ssl_context", fake_get_ssl_context)
473 yield self.action_queue.get_webclient(self.fake_iri)
474 self.assertEqual(used_host, [self.fake_host])
475
476 @defer.inlineCallbacks
477 def test_get_webclient_uses_just_created_context(self):
478 """The freshly created context is used to create the webclient."""
479 calls = []
480 fake_context = object()
481 self.patch(action_queue, "get_ssl_context", lambda *args: fake_context)
482 self.patch(action_queue.txweb.WebClient, "__init__",
483 lambda *args, **kwargs: calls.append(kwargs))
484 yield self.action_queue.get_webclient(self.fake_iri)
485 self.assertEqual(calls[1]["context_factory"], fake_context)
449486
450487
451class TestLoggingStorageClient(TwistedTestCase):488class TestLoggingStorageClient(TwistedTestCase):
@@ -1395,6 +1432,24 @@
1395 "connectSSL is called on the client.")1432 "connectSSL is called on the client.")
13961433
13971434
1435class ContextRequestedWithHost(FactoryBaseTestCase):
1436 """Test that the context is requested passing the host."""
1437
1438 tunnel_runner_class = SavingConnectionTunnelRunner
1439
1440 @defer.inlineCallbacks
1441 def test_context_request_passes_host(self):
1442 """The context is requested passing the host."""
1443 fake_host = "fake_host"
1444
1445 def fake_get_ssl_context(disable_ssl_verify, host):
1446 """The host is used to call get_ssl_context."""
1447 self.assertEqual(host, fake_host)
1448
1449 self.patch(action_queue, "get_ssl_context", fake_get_ssl_context)
1450 yield self.action_queue._make_connection((fake_host, 1234))
1451
1452
1398class ConnectedBaseTestCase(FactoryBaseTestCase):1453class ConnectedBaseTestCase(FactoryBaseTestCase):
1399 """Base test case generating a connected factory."""1454 """Base test case generating a connected factory."""
14001455
14011456
=== modified file 'ubuntuone/syncdaemon/action_queue.py'
--- ubuntuone/syncdaemon/action_queue.py 2012-06-06 20:55:28 +0000
+++ ubuntuone/syncdaemon/action_queue.py 2012-06-13 20:39:18 +0000
@@ -43,7 +43,7 @@
43from collections import deque, defaultdict43from collections import deque, defaultdict
44from functools import partial44from functools import partial
45from urllib import urlencode45from urllib import urlencode
46from urlparse import urljoin46from urlparse import urljoin, urlparse
4747
48import OpenSSL.SSL48import OpenSSL.SSL
4949
@@ -697,7 +697,6 @@
697 self.token = None697 self.token = None
698 self.consumer = None698 self.consumer = None
699 self.credentials = None699 self.credentials = None
700 self.webclient = None
701700
702 self.client = None # an instance of self.protocol701 self.client = None # an instance of self.protocol
703702
@@ -836,20 +835,22 @@
836 @defer.inlineCallbacks835 @defer.inlineCallbacks
837 def webcall(self, iri, **kwargs):836 def webcall(self, iri, **kwargs):
838 """Perform a web call to the api servers."""837 """Perform a web call to the api servers."""
839 webclient = yield self.get_webclient()838 webclient = yield self.get_webclient(iri)
840 response = yield webclient.request(iri,839 response = yield webclient.request(iri,
841 oauth_credentials=self.credentials, **kwargs)840 oauth_credentials=self.credentials, **kwargs)
842 defer.returnValue(response)841 defer.returnValue(response)
843842
844 @defer.inlineCallbacks843 @defer.inlineCallbacks
845 def get_webclient(self):844 def get_webclient(self, iri):
846 """Get the webclient, creating it if needed."""845 """Get the webclient, creating it if needed."""
847 if self.webclient is None:846 uri = txweb.WebClient().iri_to_uri(iri)
848 client = yield self.tunnel_runner.get_client()847 host = urlparse(uri).netloc.split(":")[0]
849 self.webclient = txweb.WebClient(connector=client,848 ssl_context = get_ssl_context(self.disable_ssl_verify, host)
850 appname="Ubuntu One",849 connector = yield self.tunnel_runner.get_client()
851 oauth_sign_plain=True)850 webclient = txweb.WebClient(connector=connector, appname="Ubuntu One",
852 defer.returnValue(self.webclient)851 oauth_sign_plain=True,
852 context_factory=ssl_context)
853 defer.returnValue(webclient)
853854
854 @defer.inlineCallbacks855 @defer.inlineCallbacks
855 def _make_connection(self, result):856 def _make_connection(self, result):

Subscribers

People subscribed via source and target branches