Пример #1
0
def test_parse_xml():
    resp = Response('<foo>bar</foo>',
                    headers={
                        'status-code': 200,
                        'content-type': 'text/xml'
                    })
    parse_response(resp, resp.read())
Пример #2
0
def test_parse_xml():
    resp = Response(
        '<foo>bar</foo>', headers={
            'status-code': 200,
            'content-type': 'text/xml'
        }
    )
    parse_response(resp, resp.read())
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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
Пример #7
0
    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
Пример #8
0
    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
Пример #9
0
    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
Пример #10
0
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
Пример #11
0
    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
Пример #12
0
    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
Пример #13
0
    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