Esempio n. 1
0
 def get_or_create_client(self):
     client = self.client
     if client is None:
         from oauth import Client, authorization_provider
         existing_client = True
         while existing_client:
             random_int = ''.join([random.choice(UNICODE_ASCII_DIGITS) for x in xrange(5)])
             client_id = Client.get_key_name("{0}-{1}".format(CONTROLLER_CLIENT_ID, random_int))
             client_key = Client.get_key(client_id)
             existing_client = client_key.get()
         client = Client(
             key=client_key,
             client_id=client_id,
             instance_key=self.key,
             redirect_uris=['/'],
             scope=['controller'],
             secret=authorization_provider.generate_client_secret()
         )
         client.put()
         self.client_key = client.key
         self.put()
     return client
Esempio n. 2
0
 def get_or_create_client(self):
     client = self.client
     if client is None:
         from oauth import Client, authorization_provider
         existing_client = True
         while existing_client:
             random_int = ''.join(
                 [random.choice(UNICODE_ASCII_DIGITS) for x in xrange(5)])
             client_id = Client.get_key_name("{0}-{1}".format(
                 CONTROLLER_CLIENT_ID, random_int))
             client_key = Client.get_key(client_id)
             existing_client = client_key.get()
         client = Client(
             key=client_key,
             client_id=client_id,
             instance_key=self.key,
             redirect_uris=['/'],
             scope=['controller'],
             secret=authorization_provider.generate_client_secret())
         client.put()
         self.client_key = client.key
         self.put()
     return client
Esempio n. 3
0
 def create(cls, **kwargs):
     instance = cls(**kwargs)
     instance.put()
     if instance.agent_key is None:
         from oauth import Client, authorization_provider
         existing_agent_client = True
         while existing_agent_client:
             random_int = ''.join([random.choice(UNICODE_ASCII_DIGITS) for x in xrange(5)])
             client_id = Client.get_key_name("{0}-{1}".format(AGENT_CLIENT_ID, random_int))
             agent_client_key = Client.get_key(client_id)
             existing_agent_client = agent_client_key.get()
         agent_client = Client(
             key=agent_client_key,
             client_id=client_id,
             server_key=instance.key,
             redirect_uris=['/'],
             scope=['agent'],
             secret=authorization_provider.generate_client_secret()
         )
         agent_client.put()
         instance.agent_key = agent_client.key
         instance.put()
     return instance
Esempio n. 4
0
 def create(cls, **kwargs):
     instance = cls(**kwargs)
     instance.put()
     if instance.agent_key is None:
         from oauth import Client, authorization_provider
         existing_agent_client = True
         while existing_agent_client:
             random_int = ''.join(
                 [random.choice(UNICODE_ASCII_DIGITS) for x in xrange(5)])
             client_id = Client.get_key_name("{0}-{1}".format(
                 AGENT_CLIENT_ID, random_int))
             agent_client_key = Client.get_key(client_id)
             existing_agent_client = agent_client_key.get()
         agent_client = Client(
             key=agent_client_key,
             client_id=client_id,
             server_key=instance.key,
             redirect_uris=['/'],
             scope=['agent'],
             secret=authorization_provider.generate_client_secret())
         agent_client.put()
         instance.agent_key = agent_client.key
         instance.put()
     return instance
Esempio n. 5
0
class OauthTest(BaseTest, WebTest):
    APPLICATION = main.application
    URL = None
    ALLOWED = []

    @property
    def url(self):
        return self.URL

    def setUp(self):
        super(OauthTest, self).setUp()
        key = ndb.Key(Client, TEST_CLIENT_ID)
        data = {
            'client_id': TEST_CLIENT_ID,
            'redirect_uris': [TEST_REDIRECT_URI],
            'name': TEST_CLIENT_NAME,
            'uri': TEST_CLIENT_URI,
            'logo_uri': TEST_LOGO_URI,
            'scope': ['data'],
            'secret': TEST_CLIENT_SECRET,
            'secret_expires_at': 0,
            'registration_access_token': TEST_REGISTRATION_ACCESS_TOKEN
        }
        self.client = Client(key=key, **data)
        self.client.put()

    def tearDown(self):
        super(OauthTest, self).tearDown()

    def log_in_user(self, email=None, is_active=True, is_admin=False):
        email = email or TEST_USER_EMAIL
        super(OauthTest, self).log_in_user(email, is_admin=is_admin)
        response = self.app.get('/gae_login_callback')
        cookies = response.headers.get('Set-Cookie')
        self.auth_cookie = cookies[0:cookies.find(';')] if cookies else None
        self.assertRedirects(response)
        self.current_user = models.User.lookup(email=email)
        self.current_user.active = is_active
        self.current_user.put()
        return self.current_user

    def log_in_admin(self, email=TEST_USER_EMAIL):
        return self.log_in_user(email=email, is_admin=True)

    def log_out_user(self):
        response = self.get('/logout')
        self.assertRedirects(response)
        self.auth_cookie = None
        try:
            del os.environ['USER_EMAIL']
        except KeyError:
            pass
        try:
            del os.environ['USER_ID']
        except KeyError:
            pass
        try:
            del os.environ['USER_IS_ADMIN']
        except KeyError:
            pass

    def get_authorization_code(self, email=None):
        self.user = self.log_in_user(email=email)
        url = '/oauth/v1/auth'
        query_params = {
            'client_id': TEST_CLIENT_ID,
            'redirect_uri': TEST_REDIRECT_URI,
            'response_type': 'code',
            'scope': 'data'
        }
        response = self.get(url, params=query_params)
        if response.status_int == 200:
            self.assertOK(response)
            csrf_string = 'name="csrf_token" type="hidden" value="'
            begin = response.body.find(csrf_string) + len(csrf_string)
            end = response.body.find('"', begin)
            csrf_token = response.body[begin:end]
            if query_params:
                query_params = urlencode(query_params, doseq=True)
                if '?' in url:
                    url += '&'
                else:
                    url += '?'
                url += query_params
            params = {'csrf_token': csrf_token, 'grant': 'Grant'}
            response = self.post(url, params)
        self.assertRedirects(response)
        self.assertRegexpMatches(response.headers['Location'], ur"https://localhost/\?code=.+")
        start = response.headers['Location'].find('=')
        code = response.headers['Location'][start+1:]
        self.log_out_user()
        return code

    def get_tokens(self, email=None):
        url = '/oauth/v1/token'
        code = self.get_authorization_code(email=email)
        params = {
            'code': code,
            'grant_type': 'authorization_code',
            'client_id': TEST_CLIENT_ID,
            'client_secret': TEST_CLIENT_SECRET,
            'redirect_uri': TEST_REDIRECT_URI,
            'scope': 'data'
        }
        response = self.post(url, params)
        self.assertOK(response)
        body = json.loads(response.body)
        self.assertLength(4, body)
        return (body['access_token'], body['refresh_token'])

    def assertMethodNotAllowed(self, response):
        error = u'Response did not return a 405 METHOD NOT ALLOWED (status code was {0})\nBody: {1}'.format(response.status_int, response.body)
        self.assertEqual(response.status_int, 405, error)

    def assertCreated(self, response):
        error = u'Response did not return a 201 CREATED (status code was {0})\nBody: {1}'.format(response.status_int, response.body)
        self.assertEqual(response.status_int, 201, error)

    def assertNoContent(self, response):
        error = u'Response did not return a 204 NO CONTENT (status code was {0})\nBody: {1}'.format(response.status_int, response.body)
        self.assertEqual(response.status_int, 204, error)

    def get(self, url, params=None, headers=None, bearer_token=None):
        if bearer_token is not None:
            if headers is None:
                headers = {}
            headers.update({'Authorization': 'Bearer ' + str(bearer_token)})
        return super(OauthTest, self).get(url, params=params, headers=headers)

    def post(self, url, params='', headers=None, upload_files=None, bearer_token=None):
        if bearer_token is not None:
            if headers is None:
                headers = {}
            headers.update({'Authorization': 'Bearer ' + str(bearer_token)})
        return super(OauthTest, self).post(url, params=params, headers=headers, upload_files=upload_files)

    def delete(self, url, headers=None, bearer_token=None):
        if bearer_token is not None:
            if headers is None:
                headers = {}
            headers.update({'Authorization': 'Bearer ' + str(bearer_token)})
        return super(OauthTest, self).delete(url, headers=headers)

    def post_json(self, url, params, headers=None, bearer_token=None):
        if bearer_token is not None:
            if headers is None:
                headers = {}
            headers.update({'Authorization': 'Bearer ' + str(bearer_token)})
        return super(OauthTest, self).post_json(url, params, headers=headers)

    def put_json(self, url, params='', headers=None, bearer_token=None):
        if bearer_token is not None:
            if headers is None:
                headers = {}
            headers.update({'Authorization': 'Bearer ' + str(bearer_token)})
        return super(OauthTest, self).put_json(url, params, headers=headers)
Esempio n. 6
0
class OauthTest(BaseTest, WebTest):
    APPLICATION = main.application
    URL = None
    ALLOWED = []

    @property
    def url(self):
        return self.URL

    def setUp(self):
        super(OauthTest, self).setUp()
        key = ndb.Key(Client, TEST_CLIENT_ID)
        data = {
            'client_id': TEST_CLIENT_ID,
            'redirect_uris': [TEST_REDIRECT_URI],
            'name': TEST_CLIENT_NAME,
            'uri': TEST_CLIENT_URI,
            'logo_uri': TEST_LOGO_URI,
            'scope': ['data'],
            'secret': TEST_CLIENT_SECRET,
            'secret_expires_at': 0,
            'registration_access_token': TEST_REGISTRATION_ACCESS_TOKEN
        }
        self.client = Client(key=key, **data)
        self.client.put()

    def tearDown(self):
        super(OauthTest, self).tearDown()

    def log_in_user(self, email=None, is_active=True, is_admin=False):
        email = email or TEST_USER_EMAIL
        super(OauthTest, self).log_in_user(email, is_admin=is_admin)
        response = self.app.get('/gae_login_callback')
        cookies = response.headers.get('Set-Cookie')
        self.auth_cookie = cookies[0:cookies.find(';')] if cookies else None
        self.assertRedirects(response)
        self.current_user = models.User.lookup(email=email)
        self.current_user.active = is_active
        self.current_user.put()
        return self.current_user

    def log_in_admin(self, email=TEST_USER_EMAIL):
        return self.log_in_user(email=email, is_admin=True)

    def log_out_user(self):
        response = self.get('/logout')
        self.assertRedirects(response)
        self.auth_cookie = None
        try:
            del os.environ['USER_EMAIL']
        except KeyError:
            pass
        try:
            del os.environ['USER_ID']
        except KeyError:
            pass
        try:
            del os.environ['USER_IS_ADMIN']
        except KeyError:
            pass

    def get_authorization_code(self, email=None):
        self.user = self.log_in_user(email=email)
        url = '/oauth/v1/auth'
        query_params = {
            'client_id': TEST_CLIENT_ID,
            'redirect_uri': TEST_REDIRECT_URI,
            'response_type': 'code',
            'scope': 'data'
        }
        response = self.get(url, params=query_params)
        if response.status_int == 200:
            self.assertOK(response)
            csrf_string = 'name="csrf_token" type="hidden" value="'
            begin = response.body.find(csrf_string) + len(csrf_string)
            end = response.body.find('"', begin)
            csrf_token = response.body[begin:end]
            if query_params:
                query_params = urlencode(query_params, doseq=True)
                if '?' in url:
                    url += '&'
                else:
                    url += '?'
                url += query_params
            params = {'csrf_token': csrf_token, 'grant': 'Grant'}
            response = self.post(url, params)
        self.assertRedirects(response)
        self.assertRegexpMatches(response.headers['Location'],
                                 ur"https://localhost/\?code=.+")
        start = response.headers['Location'].find('=')
        code = response.headers['Location'][start + 1:]
        self.log_out_user()
        return code

    def get_tokens(self, email=None):
        url = '/oauth/v1/token'
        code = self.get_authorization_code(email=email)
        params = {
            'code': code,
            'grant_type': 'authorization_code',
            'client_id': TEST_CLIENT_ID,
            'client_secret': TEST_CLIENT_SECRET,
            'redirect_uri': TEST_REDIRECT_URI,
            'scope': 'data'
        }
        response = self.post(url, params)
        self.assertOK(response)
        body = json.loads(response.body)
        self.assertLength(4, body)
        return (body['access_token'], body['refresh_token'])

    def assertMethodNotAllowed(self, response):
        error = u'Response did not return a 405 METHOD NOT ALLOWED (status code was {0})\nBody: {1}'.format(
            response.status_int, response.body)
        self.assertEqual(response.status_int, 405, error)

    def assertCreated(self, response):
        error = u'Response did not return a 201 CREATED (status code was {0})\nBody: {1}'.format(
            response.status_int, response.body)
        self.assertEqual(response.status_int, 201, error)

    def assertNoContent(self, response):
        error = u'Response did not return a 204 NO CONTENT (status code was {0})\nBody: {1}'.format(
            response.status_int, response.body)
        self.assertEqual(response.status_int, 204, error)

    def get(self, url, params=None, headers=None, bearer_token=None):
        if bearer_token is not None:
            if headers is None:
                headers = {}
            headers.update({'Authorization': 'Bearer ' + str(bearer_token)})
        return super(OauthTest, self).get(url, params=params, headers=headers)

    def post(self,
             url,
             params='',
             headers=None,
             upload_files=None,
             bearer_token=None):
        if bearer_token is not None:
            if headers is None:
                headers = {}
            headers.update({'Authorization': 'Bearer ' + str(bearer_token)})
        return super(OauthTest, self).post(url,
                                           params=params,
                                           headers=headers,
                                           upload_files=upload_files)

    def delete(self, url, headers=None, bearer_token=None):
        if bearer_token is not None:
            if headers is None:
                headers = {}
            headers.update({'Authorization': 'Bearer ' + str(bearer_token)})
        return super(OauthTest, self).delete(url, headers=headers)

    def post_json(self, url, params, headers=None, bearer_token=None):
        if bearer_token is not None:
            if headers is None:
                headers = {}
            headers.update({'Authorization': 'Bearer ' + str(bearer_token)})
        return super(OauthTest, self).post_json(url, params, headers=headers)

    def put_json(self, url, params='', headers=None, bearer_token=None):
        if bearer_token is not None:
            if headers is None:
                headers = {}
            headers.update({'Authorization': 'Bearer ' + str(bearer_token)})
        return super(OauthTest, self).put_json(url, params, headers=headers)