Merge lp:~gary/charms/precise/juju-gui/authtoken2 into lp:~juju-gui/charms/precise/juju-gui/trunk

Proposed by Gary Poster
Status: Merged
Merged at revision: 137
Proposed branch: lp:~gary/charms/precise/juju-gui/authtoken2
Merge into: lp:~juju-gui/charms/precise/juju-gui/trunk
Prerequisite: lp:~gary/charms/precise/juju-gui/authtoken1
Diff against target: 170 lines (+40/-9)
7 files modified
server/guiserver/apps.py (+3/-0)
server/guiserver/auth.py (+3/-1)
server/guiserver/handlers.py (+6/-4)
server/guiserver/tests/test_apps.py (+7/-0)
server/guiserver/tests/test_auth.py (+6/-1)
server/guiserver/tests/test_handlers.py (+9/-3)
server/guiserver/tests/test_utils.py (+6/-0)
To merge this branch: bzr merge lp:~gary/charms/precise/juju-gui/authtoken2
Reviewer Review Type Date Requested Status
charmers Pending
Review via email: mp+196351@code.launchpad.net

Description of the change

No-op integration of AuthenticationTokenHandler

This branch simply hooks up the AuthenticationTokenHandler everywhere it needs to be. It isn't actually utilized yet.

https://codereview.appspot.com/30980044/

To post a comment you must log in.
Revision history for this message
Gary Poster (gary) wrote :
Download full text (8.5 KiB)

Reviewers: mp+196351_code.launchpad.net,

Message:
Please take a look.

Description:
No-op integration of AuthenticationTokenHandler

This branch simply hooks up the AuthenticationTokenHandler everywhere it
needs to be. It isn't actually utilized yet. That will be the next
branch (which has been sketched but will not arrive within the next 30
minutes :-) ). No QA.

https://code.launchpad.net/~gary/charms/precise/juju-gui/authtoken2/+merge/196351

Requires:
https://code.launchpad.net/~gary/charms/precise/juju-gui/authtoken1/+merge/196347

(do not edit description out of merge proposal)

Please review this at https://codereview.appspot.com/30980044/

Affected files (+42, -9 lines):
   A [revision details]
   M server/guiserver/apps.py
   M server/guiserver/auth.py
   M server/guiserver/handlers.py
   M server/guiserver/tests/test_apps.py
   M server/guiserver/tests/test_auth.py
   M server/guiserver/tests/test_handlers.py
   M server/guiserver/tests/test_utils.py

Index: [revision details]
=== added file '[revision details]'
--- [revision details] 2012-01-01 00:00:00 +0000
+++ [revision details] 2012-01-01 00:00:00 +0000
@@ -0,0 +1,2 @@
+Old revision: <email address hidden>
+New revision: <email address hidden>

Index: server/guiserver/apps.py
=== modified file 'server/guiserver/apps.py'
--- server/guiserver/apps.py 2013-11-14 14:08:23 +0000
+++ server/guiserver/apps.py 2013-11-22 15:53:02 +0000
@@ -44,6 +44,7 @@
      # Set up handlers.
      server_handlers = []
      if not options.sandbox:
+ tokens = auth.AuthenticationTokenHandler()
          websocket_handler_options = {
              # The Juju API backend url.
              'apiurl': options.apiurl,
@@ -51,6 +52,8 @@
              'auth_backend': auth.get_backend(options.apiversion),
              # The Juju deployer to use for importing bundles.
              'deployer': deployer,
+ # The tokens collection for authentication token requests.
+ 'tokens': tokens,
          }
          server_handlers.append(
              # Handle WebSocket connections.

Index: server/guiserver/auth.py
=== modified file 'server/guiserver/auth.py'
--- server/guiserver/auth.py 2013-11-22 18:06:17 +0000
+++ server/guiserver/auth.py 2013-11-22 18:10:50 +0000
@@ -71,9 +71,11 @@
      user logs out, there is no need to handle the log out process.
      """

- def __init__(self, user, backend):
+ def __init__(self, user, backend, tokens, write_message):
          self._user = user
          self._backend = backend
+ self._tokens = tokens
+ self._write_message = write_message
          self._request_id = None

      def in_progress(self):

Index: server/guiserver/handlers.py
=== modified file 'server/guiserver/handlers.py'
--- server/guiserver/handlers.py 2013-11-07 18:04:32 +0000
+++ server/guiserver/handlers.py 2013-11-22 15:53:02 +0000
@@ -69,7 +69,7 @@
      """

      @gen.coroutine
- def initialize(self, apiurl, auth_backend, deployer, io_loop=None):
+ def initialize(self, apiurl, auth_backend, deployer, tokens,
io_loop=None):
          """Initialize the WebSocket server.

  ...

Read more...

142. By Gary Poster

merge from parent

Revision history for this message
Gary Poster (gary) wrote :
Revision history for this message
Francesco Banconi (frankban) wrote :
Revision history for this message
Gary Poster (gary) wrote :

*** Submitted:

No-op integration of AuthenticationTokenHandler

This branch simply hooks up the AuthenticationTokenHandler everywhere it
needs to be. It isn't actually utilized yet.

R=frankban
CC=
https://codereview.appspot.com/30980044

https://codereview.appspot.com/30980044/

Revision history for this message
Gary Poster (gary) wrote :

On 2013/11/25 11:39:48, frankban wrote:
> LGTM thank you!

Thank you for the review, Francesco.

https://codereview.appspot.com/30980044/

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'server/guiserver/apps.py'
2--- server/guiserver/apps.py 2013-11-14 14:08:23 +0000
3+++ server/guiserver/apps.py 2013-11-23 02:14:50 +0000
4@@ -44,6 +44,7 @@
5 # Set up handlers.
6 server_handlers = []
7 if not options.sandbox:
8+ tokens = auth.AuthenticationTokenHandler()
9 websocket_handler_options = {
10 # The Juju API backend url.
11 'apiurl': options.apiurl,
12@@ -51,6 +52,8 @@
13 'auth_backend': auth.get_backend(options.apiversion),
14 # The Juju deployer to use for importing bundles.
15 'deployer': deployer,
16+ # The tokens collection for authentication token requests.
17+ 'tokens': tokens,
18 }
19 server_handlers.append(
20 # Handle WebSocket connections.
21
22=== modified file 'server/guiserver/auth.py'
23--- server/guiserver/auth.py 2013-11-23 02:10:14 +0000
24+++ server/guiserver/auth.py 2013-11-23 02:14:50 +0000
25@@ -71,9 +71,11 @@
26 user logs out, there is no need to handle the log out process.
27 """
28
29- def __init__(self, user, backend):
30+ def __init__(self, user, backend, tokens, write_message):
31 self._user = user
32 self._backend = backend
33+ self._tokens = tokens
34+ self._write_message = write_message
35 self._request_id = None
36
37 def in_progress(self):
38
39=== modified file 'server/guiserver/handlers.py'
40--- server/guiserver/handlers.py 2013-11-07 18:04:32 +0000
41+++ server/guiserver/handlers.py 2013-11-23 02:14:50 +0000
42@@ -69,7 +69,7 @@
43 """
44
45 @gen.coroutine
46- def initialize(self, apiurl, auth_backend, deployer, io_loop=None):
47+ def initialize(self, apiurl, auth_backend, deployer, tokens, io_loop=None):
48 """Initialize the WebSocket server.
49
50 Create a new WebSocket client and connect it to the Juju API.
51@@ -85,11 +85,13 @@
52 self.juju_connected = False
53 self._juju_message_queue = queue = deque()
54 # Set up the authentication infrastructure.
55+ self.tokens = tokens
56+ write_message = wrap_write_message(self)
57 self.user = User()
58- self.auth = AuthMiddleware(self.user, auth_backend)
59+ self.auth = AuthMiddleware(
60+ self.user, auth_backend, tokens, write_message)
61 # Set up the bundle deployment infrastructure.
62- self.deployment = DeployMiddleware(
63- self.user, deployer, wrap_write_message(self))
64+ self.deployment = DeployMiddleware(self.user, deployer, write_message)
65 # Juju requires the Origin header to be included in the WebSocket
66 # client handshake request. Propagate the client origin if present;
67 # use the Juju API server as origin otherwise.
68
69=== modified file 'server/guiserver/tests/test_apps.py'
70--- server/guiserver/tests/test_apps.py 2013-08-28 17:07:25 +0000
71+++ server/guiserver/tests/test_apps.py 2013-11-23 02:14:50 +0000
72@@ -102,6 +102,13 @@
73 deployer = self.assert_in_spec(spec, 'deployer')
74 self.assertIsInstance(deployer, base.Deployer)
75
76+ def test_tokens(self):
77+ # The tokens instance is correctly passed to the WebSocket handler.
78+ app = self.get_app()
79+ spec = self.get_url_spec(app, r'^/ws$')
80+ tokens = self.assert_in_spec(spec, 'tokens')
81+ self.assertIsInstance(tokens, auth.AuthenticationTokenHandler)
82+
83 def test_sandbox(self):
84 # The WebSocket handler is excluded if sandbox mode is enabled.
85 app = self.get_app(sandbox=True)
86
87=== modified file 'server/guiserver/tests/test_auth.py'
88--- server/guiserver/tests/test_auth.py 2013-11-23 02:07:58 +0000
89+++ server/guiserver/tests/test_auth.py 2013-11-23 02:14:50 +0000
90@@ -62,7 +62,12 @@
91
92 def setUp(self):
93 self.user = auth.User()
94- self.auth = auth.AuthMiddleware(self.user, self.get_auth_backend())
95+ self.io_loop = mock.Mock()
96+ self.write_message = mock.Mock()
97+ self.tokens = auth.AuthenticationTokenHandler(io_loop=self.io_loop)
98+ self.auth = auth.AuthMiddleware(
99+ self.user, self.get_auth_backend(), self.tokens,
100+ self.write_message)
101
102 def assert_user(self, username, password, is_authenticated):
103 """Ensure the current user reflects the given values."""
104
105=== modified file 'server/guiserver/tests/test_handlers.py'
106--- server/guiserver/tests/test_handlers.py 2013-11-07 18:01:12 +0000
107+++ server/guiserver/tests/test_handlers.py 2013-11-23 02:14:50 +0000
108@@ -66,6 +66,7 @@
109 self.api_close_future = concurrent.Future()
110 self.deployer = base.Deployer(
111 self.apiurl, manage.DEFAULT_API_VERSION, io_loop=self.io_loop)
112+ self.tokens = auth.AuthenticationTokenHandler(io_loop=self.io_loop)
113 echo_options = {
114 'close_future': self.api_close_future,
115 'io_loop': self.io_loop,
116@@ -75,6 +76,7 @@
117 'auth_backend': self.auth_backend,
118 'deployer': self.deployer,
119 'io_loop': self.io_loop,
120+ 'tokens': self.tokens,
121 }
122 return web.Application([
123 (r'/echo', helpers.EchoWebSocketHandler, echo_options),
124@@ -108,7 +110,8 @@
125 handler = self.make_handler(
126 headers=headers, mock_protocol=mock_protocol)
127 yield handler.initialize(
128- apiurl, self.auth_backend, self.deployer, self.io_loop)
129+ apiurl, self.auth_backend, self.deployer, self.tokens,
130+ self.io_loop)
131 raise gen.Return(handler)
132
133
134@@ -228,7 +231,8 @@
135 mock_path = 'guiserver.clients.WebSocketClientConnection.write_message'
136 with mock.patch(mock_path) as mock_write_message:
137 initialization = handler.initialize(
138- self.apiurl, self.auth_backend, self.io_loop)
139+ self.apiurl, self.auth_backend, self.deployer, self.tokens,
140+ io_loop=self.io_loop)
141 handler.on_message(self.hello_message)
142 self.assertFalse(mock_write_message.called)
143 yield initialization
144@@ -279,7 +283,9 @@
145 def setUp(self):
146 super(TestWebSocketHandlerAuthentication, self).setUp()
147 self.handler = self.make_handler(mock_protocol=True)
148- self.handler.initialize(self.apiurl, self.auth_backend, self.io_loop)
149+ self.handler.initialize(
150+ self.apiurl, self.auth_backend, self.deployer, self.tokens,
151+ io_loop=self.io_loop)
152
153 def send_login_request(self):
154 """Create a login request and send it to the handler."""
155
156=== modified file 'server/guiserver/tests/test_utils.py'
157--- server/guiserver/tests/test_utils.py 2013-10-17 12:47:15 +0000
158+++ server/guiserver/tests/test_utils.py 2013-11-23 02:14:50 +0000
159@@ -158,6 +158,12 @@
160 self.wrapped('hello')
161 self.assertEqual([], self.messages)
162
163+ def test_unicode(self):
164+ # It handles unicode properly.
165+ snowman = u'{"Here is a snowman\u00a1": "\u2603"}'
166+ self.wrapped(snowman)
167+ self.assertEqual(snowman, json.loads(self.messages[0]))
168+
169
170 class TestWsToHttp(unittest.TestCase):
171

Subscribers

People subscribed via source and target branches

to all changes: