1b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport webapp2 2b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom webapp2_extras import sessions 3b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 4b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom webapp2_extras import auth 5b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom webapp2_extras.appengine.auth import models 6b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 7b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikfrom google.appengine.ext.ndb import model 8b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 9b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikimport test_base 10b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 11b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 12b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikclass TestAuth(test_base.BaseTestCase): 13b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 14b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def setUp(self): 15b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik super(TestAuth, self).setUp() 16b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.register_model('User', models.User) 17b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.register_model('UserToken', models.UserToken) 18b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.register_model('Unique', models.Unique) 19b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 20b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def _check_token(self, user_id, token, subject='auth'): 21b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = models.UserToken.get(user=user_id, subject=subject, token=token) 22b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik return rv is not None 23b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 24b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_get_user_by_session(self): 25b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication(config={ 26b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'webapp2_extras.sessions': { 27b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'secret_key': 'foo', 28b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik } 29b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik }) 30b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 31b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 32b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 33b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = auth.get_store(app=app) 34b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik a = auth.Auth(request=req) 35b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session_store = sessions.get_store(request=req) 36b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 37b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # This won't work. 38b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik a.set_session_data({}) 39b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(a.session.get('_user'), None) 40b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 41b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # This won't work. 42b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik a.session['_user'] = {} 43b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(a.get_session_data(), None) 44b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(a.session.get('_user'), None) 45b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 46b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Create a user. 47b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik m = models.User 48b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik success, user = m.create_user(auth_id='auth_id', 49b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik password_raw='password') 50b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 51b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik user_id = user.key.id() 52b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 53b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Get user with session. An anonymous_user is returned. 54b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = a.get_user_by_session() 55b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(rv is None) 56b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 57b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Login with password. User dict is returned. 58b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = a.get_user_by_password('auth_id', 'password') 59b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv['user_id'], user_id) 60b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 61b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Save sessions. 62b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session_store.save_sessions(rsp) 63b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 64b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Get user with session. Voila! 65b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik cookies = rsp.headers.get('Set-Cookie') 66b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/', headers=[('Cookie', cookies)]) 67b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rsp = webapp2.Response() 68b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 69b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik a = auth.Auth(request=req) 70b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 71b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # only auth_id is returned when there're no 72b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # custom user attributes defined. 73b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = a.get_user_by_session() 74b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv['user_id'], user_id) 75b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 76b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # If we call get_user_by_token() now, the same user is returned. 77b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv2 = a.get_user_by_token(rv['user_id'], rv['token']) 78b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(rv is rv2) 79b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 80b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Let's get it again and check that token is the same. 81b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik token = rv['token'] 82b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik a._user = None 83b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = a.get_user_by_session() 84b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv['user_id'], user_id) 85b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv['token'], token) 86b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 87b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Now let's force token to be renewed and check that we have a new one. 88b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s.config['token_new_age'] = -300 89b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik a._user = None 90b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = a.get_user_by_session() 91b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv['user_id'], user_id) 92b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertNotEqual(rv['token'], token) 93b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 94b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Now let's force token to be invalid. 95b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s.config['token_max_age'] = -300 96b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik a._user = None 97b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = a.get_user_by_session() 98b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv, None) 99b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 100b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_get_user_by_password(self): 101b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication(config={ 102b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'webapp2_extras.sessions': { 103b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'secret_key': 'foo', 104b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik } 105b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik }) 106b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 107b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 108b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = auth.get_store(app=app) 109b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik a = auth.get_auth(request=req) 110b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik session_store = sessions.get_store(request=req) 111b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 112b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik m = models.User 113b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik success, user = m.create_user(auth_id='auth_id', 114b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik password_raw='password') 115b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 116b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik user_id = user.key.id() 117b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Lets test the cookie max_age when we use remember=True or False. 118b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = a.get_user_by_password('auth_id', 'password', remember=True) 119b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv['user_id'], user_id) 120b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session_store.sessions['auth'].session_args['max_age'], 121b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 86400 * 7 * 3) 122b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 123b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Now remember=False. 124b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = a.get_user_by_password('auth_id', 'password') 125b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv['user_id'], user_id) 126b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(session_store.sessions['auth'].session_args['max_age'], 127b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik None) 128b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 129b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # User was set so getting it from session will return the same one. 130b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = a.get_user_by_session() 131b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv['user_id'], user_id) 132b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 133b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Now try a failed password submission: user will be unset. 134b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = a.get_user_by_password('auth_id', 'password_2', silent=True) 135b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(rv is None) 136b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 137b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # And getting by session will no longer work. 138b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = a.get_user_by_session() 139b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(rv is None) 140b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 141b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_validate_password(self): 142b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication() 143b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 144b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 145b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = auth.get_store(app=app) 146b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 147b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik m = models.User 148b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik success, user = m.create_user(auth_id='auth_id', 149b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik password_raw='foo') 150b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 151b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik u = s.validate_password('auth_id', 'foo') 152b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(u, s.user_to_dict(user)) 153b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertRaises(auth.InvalidPasswordError, 154b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s.validate_password, 'auth_id', 'bar') 155b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertRaises(auth.InvalidAuthIdError, 156b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s.validate_password, 'auth_id_2', 'foo') 157b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 158b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_validate_token(self): 159b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication() 160b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 161b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 162b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = auth.get_store(app=app) 163b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 164b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = s.validate_token('auth_id', 'token') 165b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv, (None, None)) 166b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 167b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Expired timestamp. 168b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = s.validate_token('auth_id', 'token', -300) 169b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv, (None, None)) 170b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 171b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik m = models.User 172b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik success, user = m.create_user(auth_id='auth_id', 173b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik password_raw='foo') 174b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 175b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik user_id = user.key.id() 176b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik token = m.create_auth_token(user_id) 177b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = s.validate_token(user_id, token) 178b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv, (s.user_to_dict(user), token)) 179b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Token must still be there. 180b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(self._check_token(user_id, token)) 181b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 182b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Expired timestamp. 183b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik token = m.create_auth_token(user_id) 184b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = s.validate_token(user_id, token, -300) 185b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv, (None, None)) 186b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Token must have been deleted. 187b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertFalse(self._check_token(user_id, token)) 188b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 189b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Force expiration. 190b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik token = m.create_auth_token(user_id) 191b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s.config['token_max_age'] = -300 192b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = s.validate_token(user_id, token) 193b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv, (None, None)) 194b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Token must have been deleted. 195b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertFalse(self._check_token(user_id, token)) 196b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 197b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Revert expiration, force renewal. 198b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik token = m.create_auth_token(user_id) 199b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s.config['token_max_age'] = 86400 * 7 * 3 200b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s.config['token_new_age'] = -300 201b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = s.validate_token(user_id, token) 202b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv, (s.user_to_dict(user), None)) 203b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik # Token must have been deleted. 204b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertFalse(self._check_token(user_id, token)) 205b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 206b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_set_auth_store(self): 207b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication() 208b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 209b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 210b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik store = auth.AuthStore(app) 211b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 212b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(app.registry), 0) 213b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik auth.set_store(store, app=app) 214b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(app.registry), 1) 215b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = auth.get_store(app=app) 216b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(isinstance(s, auth.AuthStore)) 217b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 218b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_get_auth_store(self): 219b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication() 220b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 221b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 222b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(app.registry), 0) 223b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = auth.get_store(app=app) 224b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(app.registry), 1) 225b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(isinstance(s, auth.AuthStore)) 226b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 227b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_set_auth(self): 228b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication() 229b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 230b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 231b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik a = auth.Auth(req) 232b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 233b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(req.registry), 0) 234b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik auth.set_auth(a, request=req) 235b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(req.registry), 1) 236b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik a = auth.get_auth(request=req) 237b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(isinstance(a, auth.Auth)) 238b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 239b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_get_auth(self): 240b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication() 241b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 242b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 243b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(req.registry), 0) 244b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik a = auth.get_auth(request=req) 245b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(len(req.registry), 1) 246b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(isinstance(a, auth.Auth)) 247b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 248b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik ''' 249b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_set_callables(self): 250b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication() 251b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req = webapp2.Request.blank('/') 252b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik req.app = app 253b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = auth.get_store(app=app) 254b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 255b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def validate_password(store, auth_id, password): 256b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(store is s) 257b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(auth_id, 'auth_id') 258b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(password, 'password') 259b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik return 'validate_password' 260b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 261b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def validate_token(store, auth_id, token, token_ts=None): 262b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(store is s) 263b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(auth_id, 'auth_id') 264b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(token, 'token') 265b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(token_ts, 'token_ts') 266b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik return 'validate_token' 267b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 268b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s.set_password_validator(validate_password) 269b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = s.validate_password('auth_id', 'password') 270b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv, 'validate_password') 271b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 272b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s.set_token_validator(validate_token) 273b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik rv = s.validate_token('auth_id', 'token', 'token_ts') 274b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(rv, 'validate_token') 275b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik ''' 276b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 277b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik def test_extended_user(self): 278b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik class MyUser(models.User): 279b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik newsletter = model.BooleanProperty() 280b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik age = model.IntegerProperty() 281b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 282b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik auth_id = 'own:username' 283b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik success, info = MyUser.create_user(auth_id, newsletter=True, age=22) 284b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(success) 285b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 286b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik app = webapp2.WSGIApplication(config={ 287b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'webapp2_extras.auth': { 288b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 'user_model': MyUser, 289b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik } 290b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik }) 291b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik s = auth.get_store(app=app) 292b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik user = s.user_model.get_by_auth_id(auth_id) 293b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(info, user) 294b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertEqual(user.age, 22) 295b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik self.assertTrue(user.newsletter is True) 296b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 297b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik 298b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craikif __name__ == '__main__': 299b2cbf1594f8d6e4ba32d384cf379f62a74ed7654Chris Craik test_base.main() 300