Merge lp:~jderose/usercouch/no-auth into lp:usercouch

Proposed by Jason Gerard DeRose
Status: Merged
Merged at revision: 19
Proposed branch: lp:~jderose/usercouch/no-auth
Merge into: lp:usercouch
Diff against target: 313 lines (+128/-34)
4 files modified
usercouch/__init__.py (+30/-15)
usercouch/misc.py (+2/-2)
usercouch/tests/__init__.py (+59/-7)
usercouch/tests/test_misc.py (+37/-10)
To merge this branch: bzr merge lp:~jderose/usercouch/no-auth
Reviewer Review Type Date Requested Status
Akshat Jain (community) Approve
Novacut Dev Pending
Review via email: mp+85024@code.launchpad.net

Description of the change

UserCouch.bootstrap() now takes an `auth` kwarg, which defaults to 'basic' and must be 'open', 'basic', or 'oauth'.

This required touching a lot of code here and there, but it's still a pretty small change.

To post a comment you must log in.
Revision history for this message
Akshat Jain (akshatj) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'usercouch/__init__.py'
--- usercouch/__init__.py 2011-12-08 12:20:46 +0000
+++ usercouch/__init__.py 2011-12-08 20:51:27 +0000
@@ -37,10 +37,7 @@
3737
38__version__ = '11.12.0'38__version__ = '11.12.0'
3939
40BASIC = """40OPEN = """
41[couch_httpd_auth]
42require_valid_user = true
43
44[httpd]41[httpd]
45bind_address = 127.0.0.142bind_address = 127.0.0.1
46port = {port}43port = {port}
@@ -64,6 +61,11 @@
64[stats]61[stats]
65rate =62rate =
66samples =63samples =
64"""
65
66BASIC = OPEN + """
67[couch_httpd_auth]
68require_valid_user = true
6769
68[admins]70[admins]
69{username} = {hashed}71{username} = {hashed}
@@ -81,6 +83,16 @@
81"""83"""
8284
8385
86def get_template(auth):
87 if auth == 'open':
88 return OPEN
89 if auth == 'basic':
90 return BASIC
91 if auth == 'oauth':
92 return OAUTH
93 raise ValueError('invalid auth: {!r}'.format(auth))
94
95
84def random_port():96def random_port():
85 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)97 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
86 sock.bind(('127.0.0.1', 0))98 sock.bind(('127.0.0.1', 0))
@@ -102,13 +114,17 @@
102 )114 )
103115
104116
105def random_env(port, oauth=False):117def random_env(port, auth):
118 if auth not in ('open', 'basic', 'oauth'):
119 raise ValueError('invalid auth: {!r}'.format(auth))
106 env = {120 env = {
107 'port': port,121 'port': port,
108 'url': 'http://localhost:{}/'.format(port),122 'url': 'http://localhost:{}/'.format(port),
109 'basic': random_basic(),
110 }123 }
111 if oauth:124 if auth == 'basic':
125 env['basic'] = random_basic()
126 elif auth == 'oauth':
127 env['basic'] = random_basic()
112 env['oauth'] = random_oauth()128 env['oauth'] = random_oauth()
113 return env129 return env
114130
@@ -182,14 +198,14 @@
182 def __del__(self):198 def __del__(self):
183 self.kill()199 self.kill()
184200
185 def bootstrap(self, oauth=False, loglevel='notice'):201 def bootstrap(self, auth='basic', loglevel='notice'):
186 if self.__bootstraped:202 if self.__bootstraped:
187 raise Exception(203 raise Exception(
188 '{}.bootstrap() already called'.format(self.__class__.__name__)204 '{}.bootstrap() already called'.format(self.__class__.__name__)
189 )205 )
190 self.__bootstraped = True206 self.__bootstraped = True
191 (sock, port) = random_port()207 (sock, port) = random_port()
192 env = random_env(port, oauth)208 env = random_env(port, auth)
193 self.server = Server(env)209 self.server = Server(env)
194 kw = {210 kw = {
195 'port': port,211 'port': port,
@@ -197,14 +213,13 @@
197 'views': self.paths.views,213 'views': self.paths.views,
198 'logfile': self.paths.logfile,214 'logfile': self.paths.logfile,
199 'loglevel': loglevel,215 'loglevel': loglevel,
200 'username': env['basic']['username'],
201 'hashed': couch_hashed(env['basic']['password'], random_salt()),
202 }216 }
203 if oauth:217 if auth in ('basic', 'oauth'):
218 kw['username'] = env['basic']['username']
219 kw['hashed'] = couch_hashed(env['basic']['password'], random_salt())
220 if auth == 'oauth':
204 kw.update(env['oauth'])221 kw.update(env['oauth'])
205 config = OAUTH.format(**kw)222 config = get_template(auth).format(**kw)
206 else:
207 config = BASIC.format(**kw)
208 open(self.paths.ini, 'w').write(config)223 open(self.paths.ini, 'w').write(config)
209 sock.close()224 sock.close()
210 self.start()225 self.start()
211226
=== modified file 'usercouch/misc.py'
--- usercouch/misc.py 2011-10-02 11:34:55 +0000
+++ usercouch/misc.py 2011-12-08 20:51:27 +0000
@@ -45,11 +45,11 @@
4545
46class CouchTestCase(TestCase):46class CouchTestCase(TestCase):
47 create_databases = []47 create_databases = []
48 oauth = False48 auth = 'basic'
4949
50 def setUp(self):50 def setUp(self):
51 self.tmpcouch = TempCouch()51 self.tmpcouch = TempCouch()
52 self.env = self.tmpcouch.bootstrap(self.oauth)52 self.env = self.tmpcouch.bootstrap(self.auth)
53 for name in self.create_databases:53 for name in self.create_databases:
54 self.tmpcouch.server.put(None, name)54 self.tmpcouch.server.put(None, name)
5555
5656
=== modified file 'usercouch/tests/__init__.py'
--- usercouch/tests/__init__.py 2011-10-02 11:11:04 +0000
+++ usercouch/tests/__init__.py 2011-12-08 20:51:27 +0000
@@ -81,6 +81,13 @@
8181
8282
83class TestFunctions(TestCase):83class TestFunctions(TestCase):
84 def test_get_template(self):
85 self.assertIs(usercouch.get_template('open'), usercouch.OPEN)
86 self.assertIs(usercouch.get_template('basic'), usercouch.BASIC)
87 self.assertIs(usercouch.get_template('oauth'), usercouch.OAUTH)
88 with self.assertRaises(ValueError) as cm:
89 t = usercouch.get_template('nope')
90 self.assertEqual(str(cm.exception), "invalid auth: 'nope'")
8491
85 def test_random_port(self):92 def test_random_port(self):
86 (sock, port) = usercouch.random_port()93 (sock, port) = usercouch.random_port()
@@ -114,8 +121,20 @@
114 self.assertTrue(set(value).issubset(B32ALPHABET))121 self.assertTrue(set(value).issubset(B32ALPHABET))
115122
116 def test_random_env(self):123 def test_random_env(self):
117 # oauth=False124 # Test with bad auth
118 env = usercouch.random_env(5634)125 with self.assertRaises(ValueError) as cm:
126 env = usercouch.random_env(5634, 'magic')
127 self.assertEqual(str(cm.exception), "invalid auth: 'magic'")
128
129 # auth='open'
130 env = usercouch.random_env(5634, 'open')
131 self.assertIsInstance(env, dict)
132 self.assertEqual(set(env), set(['port', 'url']))
133 self.assertEqual(env['port'], 5634)
134 self.assertEqual(env['url'], 'http://localhost:5634/')
135
136 # auth='basic'
137 env = usercouch.random_env(5634, 'basic')
119 self.assertIsInstance(env, dict)138 self.assertIsInstance(env, dict)
120 self.assertEqual(set(env), set(['port', 'url', 'basic']))139 self.assertEqual(set(env), set(['port', 'url', 'basic']))
121 self.assertEqual(env['port'], 5634)140 self.assertEqual(env['port'], 5634)
@@ -130,8 +149,8 @@
130 self.assertEqual(len(value), 24)149 self.assertEqual(len(value), 24)
131 self.assertTrue(set(value).issubset(B32ALPHABET))150 self.assertTrue(set(value).issubset(B32ALPHABET))
132151
133 # oauth=True152 # auth='oauth'
134 env = usercouch.random_env(1718, oauth=True)153 env = usercouch.random_env(1718, 'oauth')
135 self.assertIsInstance(env, dict)154 self.assertIsInstance(env, dict)
136 self.assertEqual(set(env), set(['port', 'url', 'basic', 'oauth']))155 self.assertEqual(set(env), set(['port', 'url', 'basic', 'oauth']))
137 self.assertEqual(env['port'], 1718)156 self.assertEqual(env['port'], 1718)
@@ -317,7 +336,40 @@
317336
318 def test_bootstrap(self):337 def test_bootstrap(self):
319 #######################338 #######################
320 # Test with oauth=False339 # Test with auth='open'
340 tmp = TempDir()
341 uc = usercouch.UserCouch(tmp.dir)
342 self.assertFalse(path.exists(uc.paths.ini))
343 env = uc.bootstrap('open')
344 self.assertTrue(path.isfile(uc.paths.ini))
345
346 # check env
347 self.assertIsInstance(env, dict)
348 self.assertEqual(set(env), set(['port', 'url']))
349 port = env['port']
350 self.assertIsInstance(port, int)
351 self.assertGreater(port, 1024)
352 self.assertEqual(env['url'], 'http://localhost:{}/'.format(port))
353
354 # check UserCouch.server
355 self.assertIsInstance(uc.server, microfiber.Server)
356 self.assertEqual(uc.server.env, env)
357 self.assertIsNot(uc.server.env, env) # Make sure deepcopy() is used
358
359 # check UserCouch.couchdb, make sure UserCouch.start() was called
360 self.assertIsInstance(uc.couchdb, subprocess.Popen)
361 self.assertIsNone(uc.couchdb.returncode)
362
363 # check that Exception is raised if you call bootstrap() more than once
364 with self.assertRaises(Exception) as cm:
365 uc.bootstrap()
366 self.assertEqual(
367 str(cm.exception),
368 'UserCouch.bootstrap() already called'
369 )
370
371 #######################
372 # Test with auth='basic'
321 tmp = TempDir()373 tmp = TempDir()
322 uc = usercouch.UserCouch(tmp.dir)374 uc = usercouch.UserCouch(tmp.dir)
323 self.assertFalse(path.exists(uc.paths.ini))375 self.assertFalse(path.exists(uc.paths.ini))
@@ -359,11 +411,11 @@
359 )411 )
360412
361 #######################413 #######################
362 # Test with oauth=True414 # Test with auth='oauth'
363 tmp = TempDir()415 tmp = TempDir()
364 uc = usercouch.UserCouch(tmp.dir)416 uc = usercouch.UserCouch(tmp.dir)
365 self.assertFalse(path.exists(uc.paths.ini))417 self.assertFalse(path.exists(uc.paths.ini))
366 env = uc.bootstrap(oauth=True)418 env = uc.bootstrap(auth='oauth')
367 self.assertTrue(path.isfile(uc.paths.ini))419 self.assertTrue(path.isfile(uc.paths.ini))
368420
369 # check env421 # check env
370422
=== modified file 'usercouch/tests/test_misc.py'
--- usercouch/tests/test_misc.py 2011-10-02 11:40:27 +0000
+++ usercouch/tests/test_misc.py 2011-12-08 20:51:27 +0000
@@ -44,12 +44,13 @@
44 tc.__del__()44 tc.__del__()
45 self.assertIsNone(tc.couchdb)45 self.assertIsNone(tc.couchdb)
46 self.assertFalse(path.exists(tc.basedir))46 self.assertFalse(path.exists(tc.basedir))
4747
4848
49class SelfTest1(CouchTestCase):49class SelfTest1(CouchTestCase):
50 auth = 'open'
5051
51 def test_self(self):52 def test_self(self):
52 self.assertEqual(set(self.env), set(['port', 'url', 'basic']))53 self.assertEqual(set(self.env), set(['port', 'url']))
53 s = microfiber.Server(self.env)54 s = microfiber.Server(self.env)
54 self.assertEqual(55 self.assertEqual(
55 s.get('_all_dbs'),56 s.get('_all_dbs'),
@@ -58,10 +59,10 @@
5859
5960
60class SelfTest2(CouchTestCase):61class SelfTest2(CouchTestCase):
61 oauth = True62 auth = 'basic'
6263
63 def test_self(self):64 def test_self(self):
64 self.assertEqual(set(self.env), set(['port', 'url', 'basic', 'oauth']))65 self.assertEqual(set(self.env), set(['port', 'url', 'basic']))
65 s = microfiber.Server(self.env)66 s = microfiber.Server(self.env)
66 self.assertEqual(67 self.assertEqual(
67 s.get('_all_dbs'),68 s.get('_all_dbs'),
@@ -70,19 +71,45 @@
7071
7172
72class SelfTest3(CouchTestCase):73class SelfTest3(CouchTestCase):
73 create_databases = ['foo', 'bar']74 auth = 'oauth'
7475
75 def test_self(self):76 def test_self(self):
76 self.assertEqual(set(self.env), set(['port', 'url', 'basic']))77 self.assertEqual(set(self.env), set(['port', 'url', 'basic', 'oauth']))
77 s = microfiber.Server(self.env)78 s = microfiber.Server(self.env)
78 self.assertEqual(79 self.assertEqual(
79 s.get('_all_dbs'),80 s.get('_all_dbs'),
80 ['_replicator', '_users', 'bar', 'foo']81 ['_replicator', '_users']
81 )82 )
8283
8384
84class SelfTest4(CouchTestCase):85class SelfTest4(CouchTestCase):
85 oauth = True86 auth = 'open'
87 create_databases = ['foo', 'bar']
88
89 def test_self(self):
90 self.assertEqual(set(self.env), set(['port', 'url']))
91 s = microfiber.Server(self.env)
92 self.assertEqual(
93 s.get('_all_dbs'),
94 ['_replicator', '_users', 'bar', 'foo']
95 )
96
97
98class SelfTest5(CouchTestCase):
99 auth = 'basic'
100 create_databases = ['foo', 'bar']
101
102 def test_self(self):
103 self.assertEqual(set(self.env), set(['port', 'url', 'basic']))
104 s = microfiber.Server(self.env)
105 self.assertEqual(
106 s.get('_all_dbs'),
107 ['_replicator', '_users', 'bar', 'foo']
108 )
109
110
111class SelfTest6(CouchTestCase):
112 auth = 'oauth'
86 create_databases = ['foo', 'bar']113 create_databases = ['foo', 'bar']
87114
88 def test_self(self):115 def test_self(self):

Subscribers

People subscribed via source and target branches