def test_parse_xml(): resp = Response('<foo>bar</foo>', headers={ 'status-code': 200, 'content-type': 'text/xml' }) parse_response(resp, resp.read())
def test_parse_xml(): resp = Response( '<foo>bar</foo>', headers={ 'status-code': 200, 'content-type': 'text/xml' } ) parse_response(resp, resp.read())
def reddit_handle_oauth2_response(): access_args = { 'code': flask.request.args.get('code'), 'client_id': reddit.consumer_key, 'redirect_uri': flask.session.get('%s_oauthredir' % reddit.name), } access_args.update(reddit.access_token_params) auth_header = 'Basic %s' % base64.b64encode( ('%s:%s' % (reddit.consumer_key, reddit.consumer_secret) ).encode('latin1')).strip().decode('latin1') response, content = reddit.http_request( reddit.expand_url(reddit.access_token_url), method=reddit.access_token_method, data=urls.url_encode(access_args), headers={ 'Authorization': auth_header, 'User-Agent': config.USER_AGENT, }, ) data = client.parse_response(response, content) if response.code not in (200, 201): raise client.OAuthException( 'Invalid response from %s' % reddit.name, type='invalid_response', data=data, ) return data
def yahoo_handle_oauth2_response(args): access_args = { 'code': args.get('code'), 'client_id': yahoo.consumer_key, 'client_secret': yahoo.consumer_secret, 'redirect_uri': flask.session.get('%s_oauthredir' % yahoo.name), 'state': args.get('state'), } access_args.update(yahoo.access_token_params) auth_header = 'Basic %s' % base64.b64encode( ('%s:%s' % (yahoo.consumer_key, yahoo.consumer_secret)).encode('latin1') ).strip().decode('latin1') response, content = yahoo.http_request( yahoo.expand_url(yahoo.access_token_url), method=yahoo.access_token_method, data=urls.url_encode(access_args), headers={ 'Authorization': auth_header, 'User-Agent': config.USER_AGENT, 'Content-Type': 'application/x-www-form-urlencoded', }, ) data = client.parse_response(response, content) if response.code not in (200, 201): raise client.OAuthException( 'Invalid response from %s' % yahoo.name, type='invalid_response', data=data, ) return data
def reddit_handle_oauth2_response(): access_args = { 'code': flask.request.args.get('code'), 'client_id': reddit.consumer_key, 'redirect_uri': flask.session.get('%s_oauthredir' % reddit.name), } access_args.update(reddit.access_token_params) auth_header = 'Basic %s' % base64.b64encode( ('%s:%s' % (reddit.consumer_key, reddit.consumer_secret)).encode('latin1') ).strip().decode('latin1') response, content = reddit.http_request( reddit.expand_url(reddit.access_token_url), method=reddit.access_token_method, data=urls.url_encode(access_args), headers={ 'Authorization': auth_header, 'User-Agent': config.USER_AGENT, }, ) data = client.parse_response(response, content) if response.code not in (200, 201): raise client.OAuthException( 'Invalid response from %s' % reddit.name, type='invalid_response', data=data, ) return data
def yahoo_handle_oauth2_response(args): access_args = { 'code': args.get('code'), 'client_id': yahoo.consumer_key, 'client_secret': yahoo.consumer_secret, 'redirect_uri': flask.session.get('%s_oauthredir' % yahoo.name), 'state': args.get('state'), } access_args.update(yahoo.access_token_params) auth_header = 'Basic %s' % base64.b64encode( ('%s:%s' % (yahoo.consumer_key, yahoo.consumer_secret) ).encode('latin1')).strip().decode('latin1') response, content = yahoo.http_request( yahoo.expand_url(yahoo.access_token_url), method=yahoo.access_token_method, data=urls.url_encode(access_args), headers={ 'Authorization': auth_header, 'User-Agent': config.USER_AGENT, 'Content-Type': 'application/x-www-form-urlencoded', }, ) data = client.parse_response(response, content) if response.code not in (200, 201): raise client.OAuthException( 'Invalid response from %s' % yahoo.name, type='invalid_response', data=data, ) return data
def handle_oauth2_response(self): """Handles an oauth2 authorization response. This method overrides the one provided by OAuthRemoteApp in order to support Basic HTTP Authentication. """ if self.access_token_method != 'POST': raise OAuthException( ('Unsupported access_token_method: {}. ' 'Only POST is supported.').format(self.access_token_method) ) client = self.make_client() remote_args = { 'code': request.args.get('code'), 'client_secret': self.consumer_secret, 'redirect_uri': ( session.get('%s_oauthredir' % self.name) or url_for('invenio_oauthclient.authorized', remote_app=self.name, _external=True) ), } remote_args.update(self.access_token_params) # build the Basic HTTP Authentication code b2access_basic_auth = base64.encodestring(bytes('{0}:{1}'.format( self.consumer_key, self.consumer_secret), 'utf-8')).decode('ascii').replace('\n', '') body = client.prepare_request_body(**remote_args) resp, content = self.http_request( self.expand_url(self.access_token_url), # set the Authentication header headers={ 'Authorization': 'Basic {}'.format(b2access_basic_auth), }, data=to_bytes(body, self.encoding), method=self.access_token_method, ) data = parse_response(resp, content, content_type=self.content_type) if resp.code not in (200, 201): raise OAuthException( 'Invalid response from %s' % self.name, type='invalid_response', data=data ) return data
def exchange_token(self, token): """Authorizes user by exchanging short-lived token for long-lived.""" url = self.expand_url(self.access_token_url) data = dict(client_id=self.consumer_key, # XXX: Add appsecret_proof client_secret=self.consumer_secret, fb_exchange_token=token, grant_type='fb_exchange_token') url = oauth_common.add_params_to_uri(url, data) resp, content = self.http_request(url) data = f_oauth_client.parse_response(resp, content, self.content_type) if resp.code not in (200, 201): try: message = data['error']['message'] except (KeyError, TypeError): message = 'Failed to exchange token for {}'.format(self.name) raise f_oauth_client.OAuthException( message, type='token_exchange_failed', data=data) return data
def handle_oauth2_response(self): """Handles an oauth2 authorization response. This method overrides the one provided by OAuthRemoteApp in order to support Basic HTTP Authentication. """ if self.access_token_method != 'POST': raise OAuthException( ('Unsupported access_token_method: {}. ' 'Only POST is supported.').format(self.access_token_method)) client = self.make_client() remote_args = { 'code': request.args.get('code'), 'client_secret': self.consumer_secret, 'redirect_uri': (session.get('%s_oauthredir' % self.name) or url_for('invenio_oauthclient.authorized', remote_app=self.name, _external=True)), } remote_args.update(self.access_token_params) # build the Basic HTTP Authentication code b2access_basic_auth = base64.encodestring( bytes('{0}:{1}'.format(self.consumer_key, self.consumer_secret), 'utf-8')).decode('ascii').replace('\n', '') body = client.prepare_request_body(**remote_args) resp, content = self.http_request( self.expand_url(self.access_token_url), # set the Authentication header headers={ 'Authorization': 'Basic {}'.format(b2access_basic_auth), }, data=to_bytes(body, self.encoding), method=self.access_token_method, ) data = parse_response(resp, content, content_type=self.content_type) if resp.code not in (200, 201): raise OAuthException('Invalid response from %s' % self.name, type='invalid_response', data=data) return data
def reddit_handle_oauth2_response(): access_args = { "code": flask.request.args.get("code"), "client_id": reddit.consumer_key, "redirect_uri": flask.session.get("%s_oauthredir" % reddit.name), } access_args.update(reddit.access_token_params) auth_header = "Basic %s" % base64.b64encode( ("%s:%s" % (reddit.consumer_key, reddit.consumer_secret)).encode("latin1") ).strip().decode("latin1") response, content = reddit.http_request( reddit.expand_url(reddit.access_token_url), method=reddit.access_token_method, data=urls.url_encode(access_args), headers={"Authorization": auth_header, "User-Agent": config.USER_AGENT}, ) data = client.parse_response(response, content) if response.code not in (200, 201): raise client.OAuthException("Invalid response from %s" % reddit.name, type="invalid_response", data=data) return data
def handle_oauth2_response_spotify(self, args): """Handles an oauth2 authorization response.""" client = self.make_client() remote_args = { "code": args.get("code"), "redirect_uri": session.get("%s_oauthredir" % self.name) } log.debug("Prepare oauth2 remote args %r", remote_args) remote_args.update(self.access_token_params) data = f"{self._consumer_key}:{self._consumer_secret}" encoded = str(base64.b64encode(data.encode("utf-8")), "utf-8") headers = {"Authorization": f"Basic {encoded}"} if self.access_token_method == "POST": headers.update( {"Content-Type": "application/x-www-form-urlencoded"}) body = client.prepare_request_body(**remote_args) resp, content = self.http_request( self.expand_url(self.access_token_url), headers=headers, data=to_bytes(body, self.encoding), method=self.access_token_method, ) elif self.access_token_method == "GET": qs = client.prepare_request_body(**remote_args) url = self.expand_url(self.access_token_url) url += ("?" in url and "&" or "?") + qs resp, content = self.http_request(url, headers=headers, method=self.access_token_method) else: raise OAuthException("Unsupported access_token_method: %s" % self.access_token_method) data = parse_response(resp, content, content_type=self.content_type) if resp.code not in (200, 201): raise OAuthException("Invalid response from %s" % self.name, type="invalid_response", data=data) return data
def handle_oauth2_response(self): if self.access_token_method != 'POST': raise OAuthException('Unsupported access_token_method: %s' % self.access_token_method) client = self.make_client() remote_args = { 'code': request.args.get('code'), 'client_secret': self.consumer_secret, 'redirect_uri': session.get('%s_oauthredir' % self.name) } remote_args.update(self.access_token_params) reddit_basic_auth = base64.encodestring( '%s:%s' % (REDDIT_APP_ID, REDDIT_APP_SECRET)).replace('\n', '') body = client.prepare_request_body(**remote_args) while True: resp, content = self.http_request( self.expand_url(self.access_token_url), headers={ 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic %s' % reddit_basic_auth, 'User-Agent': REDDIT_USER_AGENT }, data=to_bytes(body, self.encoding), method=self.access_token_method, ) # Reddit API is rate-limited, so if we get 429, we need to retry if resp.code != 429: break time.sleep(1) data = parse_response(resp, content, content_type=self.content_type) if resp.code not in (200, 201): raise OAuthException('Invalid response from %s' % self.name, type='invalid_response', data=data) return data
def handle_oauth2_response(self): if self.access_token_method != 'POST': raise OAuthException( 'Unsupported access_token_method: %s' % self.access_token_method ) client = self.make_client() remote_args = { 'code': request.args.get('code'), 'client_secret': self.consumer_secret, 'redirect_uri': session.get('%s_oauthredir' % self.name) } remote_args.update(self.access_token_params) reddit_basic_auth = base64.encodestring('%s:%s' % (REDDIT_APP_ID, REDDIT_APP_SECRET)).replace('\n', '') body = client.prepare_request_body(**remote_args) while True: resp, content = self.http_request( self.expand_url(self.access_token_url), headers={'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Basic %s' % reddit_basic_auth, 'User-Agent': REDDIT_USER_AGENT}, data=to_bytes(body, self.encoding), method=self.access_token_method, ) # Reddit API is rate-limited, so if we get 429, we need to retry if resp.code != 429: break time.sleep(1) data = parse_response(resp, content, content_type=self.content_type) if resp.code not in (200, 201): raise OAuthException( 'Invalid response from %s' % self.name, type='invalid_response', data=data ) return data