Ejemplo n.º 1
0
def urlencode(params, encode_list_key=False, array_braces=True):
    """Urlencode a multidimensional dict.

    >>> try:
    ...     from urllib.parse import quote, unquote
    ... except ImportError:
    ...     from urllib import quote, unquote
    ...
    >>> unquote(urlencode({'a': {"b": [1, 2, 3]}}))
    'a[b][]=1&a[b][]=2&a[b][]=3'
    >>> unquote(urlencode({'a': {"b": [1, 2, 3]}}, array_braces=False))
    'a[b]=1&a[b]=2&a[b]=3'
    >>> unquote(urlencode({'a': {"b": [1, 2, 3]}}, encode_list_key=True))
    'a[b][0]=1&a[b][1]=2&a[b][2]=3'

    """

    # Not doing duck typing here. Will make debugging easier.
    if not isinstance(params, dict):
        raise TypeError("Only dicts are supported.")

    params = flatten(params, encode_list_key)

    url_params = OrderedDict()
    for param in params:
        value = param.pop()

        name = parametrize(param)
        if isinstance(value, (list, tuple)) and array_braces:
            name += "[]"

        url_params[name] = value

    return urllib_urlencode(url_params, doseq=True)
 def postRequestRaw(self, sAction, dParams):
     """
     Posts a request to the test manager and gets the response.  The dParams
     argument is a dictionary of unencoded key-value pairs (will be
     modified).
     Raises exception on failure.
     """
     dHeader = \
     {
         'Content-Type':     'application/x-www-form-urlencoded; charset=utf-8',
         'User-Agent':       'TestBoxScript/%s.0 (%s, %s)' % (__version__, utils.getHostOs(), utils.getHostArch()),
         'Accept':           'text/plain,application/x-www-form-urlencoded',
         'Accept-Encoding':  'identity',
         'Cache-Control':    'max-age=0',
         'Connection':       'keep-alive',
     };
     sServerPath = '/%s/testboxdisp.py' % (self._oParsedUrl.path.strip('/'),); # pylint: disable=E1101
     dParams[constants.tbreq.ALL_PARAM_ACTION] = sAction;
     sBody = urllib_urlencode(dParams);
     ##testboxcommons.log2('sServerPath=%s' % (sServerPath,));
     try:
         self._oConn.request('POST', sServerPath, sBody, dHeader);
         oResponse = self._oConn.getresponse();
         oResponse2 = TestBoxResponse(oResponse);
     except:
         testboxcommons.log2Xcpt();
         raise
     return oResponse2;
Ejemplo n.º 3
0
 def postRequestRaw(self, sAction, dParams):
     """
     Posts a request to the test manager and gets the response.  The dParams
     argument is a dictionary of unencoded key-value pairs (will be
     modified).
     Raises exception on failure.
     """
     dHeader = \
     {
         'Content-Type':     'application/x-www-form-urlencoded; charset=utf-8',
         'User-Agent':       'TestBoxScript/%s.0 (%s, %s)' % (__version__, utils.getHostOs(), utils.getHostArch()),
         'Accept':           'text/plain,application/x-www-form-urlencoded',
         'Accept-Encoding':  'identity',
         'Cache-Control':    'max-age=0',
         'Connection':       'keep-alive',
     }
     sServerPath = '/%s/testboxdisp.py' % (
         self._oParsedUrl.path.strip('/'), )
     # pylint: disable=no-member
     dParams[constants.tbreq.ALL_PARAM_ACTION] = sAction
     sBody = urllib_urlencode(dParams)
     ##testboxcommons.log2('sServerPath=%s' % (sServerPath,));
     try:
         self._oConn.request('POST', sServerPath, sBody, dHeader)
         oResponse = self._oConn.getresponse()
         oResponse2 = TestBoxResponse(oResponse)
     except:
         testboxcommons.log2Xcpt()
         raise
     return oResponse2
Ejemplo n.º 4
0
 def head_request(self, url, params=None):
     if not self.token:
         logging.debug("No token set in head_request(()")
         return None
     if params:
         url = url + '?' + urllib_urlencode(params)
     logging.debug('Oauth HEAD request: ' + url)
     try:
         response = self.config.module["urlfetch"].head(
             url=url, headers={'Authorization': 'Bearer ' + self.token})
         self.last_response_code = response.status_code
         self.last_response_message = response.content
     except (self.config.module["urlfetch"].UrlfetchException,
             self.config.module["urlfetch"].URLError,
             self.config.module["urlfetch"].Timeout,
             self.config.module["urlfetch"].TooManyRedirects):
         self.last_response_code = 0
         self.last_response_message = 'No response'
         logging.warning("Oauth HEAD failed with exception")
         return None
     if response.status_code < 200 or response.status_code > 299:
         logging.warning('Error when sending HEAD request to Oauth: ' +
                         str(response.status_code) + str(response.content))
         return None
     return response.headers
Ejemplo n.º 5
0
def AuthorizeTokens(client_id, client_secret, authorization_code):
    """Obtains OAuth access token and refresh token.

  This uses the application portion of the "OAuth2 for Installed Applications"
  flow at https://developers.google.com/accounts/docs/OAuth2InstalledApp#handlingtheresponse

  Args:
    client_id: Client ID obtained by registering your app.
    client_secret: Client secret obtained by registering your app.
    authorization_code: code generated by Google Accounts after user grants
        permission.
  Returns:
    The decoded response from the Google Accounts server, as a dict. Expected
    fields include 'access_token', 'expires_in', and 'refresh_token'.
  """
    params = {}
    params['client_id'] = client_id
    params['client_secret'] = client_secret
    params['code'] = authorization_code
    params['redirect_uri'] = REDIRECT_URI
    params['grant_type'] = 'authorization_code'
    request_url = AccountsUrl('o/oauth2/token')

    response = urllib_urlopen(request_url,
                              urllib_urlencode(params).encode("utf-8")).read()
    return json.loads(response.decode('utf-8'))
Ejemplo n.º 6
0
 def get_resource(self, path=None, params=None):
     if not path or len(path) == 0:
         return None
     if not params:
         params = {}
     if not self.trust or not self.trust["baseuri"] or not self.trust[
             "secret"]:
         return None
     url = self.trust["baseuri"].strip('/') + '/' + path.strip('/')
     if params:
         url = url + '?' + urllib_urlencode(params)
     headers = {
         'Authorization': 'Bearer ' + self.trust["secret"],
     }
     logging.debug('Getting trust peer resource at (' + url + ')')
     try:
         if self.config.env == 'appengine':
             response = self.config.module["urlfetch"].fetch(
                 url=url,
                 method=self.config.module["urlfetch"].GET,
                 headers=headers)
         else:
             response = self.config.module["urlfetch"].get(url=url,
                                                           headers=headers)
         self.last_response_code = response.status_code
         self.last_response_message = response.content
     except (self.config.module["urlfetch"].UrlfetchException,
             self.config.module["urlfetch"].URLError,
             self.config.module["urlfetch"].Timeout,
             self.config.module["urlfetch"].TooManyRedirects):
         logging.debug('Not able to get peer resource')
         self.last_response_code = 408
         return {
             'error': {
                 'code': 408,
                 'message':
                 'Unable to communciate with trust peer service.',
             },
         }
     logging.debug('Get trust peer resource POST response:(' +
                   str(response.status_code) + ') ' + str(response.content))
     if response.status_code < 200 or response.status_code > 299:
         logging.info('Not able to get trust peer resource.')
     try:
         result = json.loads(response.content.decode('utf-8', 'ignore'))
     except (TypeError, ValueError, KeyError):
         logging.debug(
             "Not able to parse response when getting resource at(" + url +
             ")")
         result = {}
     return result
Ejemplo n.º 7
0
 def get_request(self, url, params=None):
     if not self.token:
         logging.debug("No token set in get_request()")
         return None
     if params:
         url = url + '?' + urllib_urlencode(params)
     logging.debug('Oauth GET request: ' + url)
     try:
         if self.config.env == 'appengine':
             self.config.module["urlfetch"].set_default_fetch_deadline(60)
             response = self.config.module["urlfetch"].fetch(
                 url=url,
                 method=self.config.module["urlfetch"].GET,
                 headers={
                     'Authorization': 'Bearer ' + self.token,
                 })
         else:
             response = self.config.module["urlfetch"].get(
                 url, headers={
                     'Authorization': 'Bearer ' + self.token,
                 })
         self.last_response_code = response.status_code
         self.last_response_message = response.content
     except (self.config.module["urlfetch"].UrlfetchException,
             self.config.module["urlfetch"].URLError,
             self.config.module["urlfetch"].Timeout,
             self.config.module["urlfetch"].TooManyRedirects):
         self.last_response_code = 0
         self.last_response_message = 'No response'
         logging.warning("Oauth GET failed with exception")
         return None
     if response.status_code < 200 or response.status_code > 299:
         logging.info('Error when sending GET request to Oauth: ' +
                      str(response.status_code) + str(response.content))
         return None
     links = pagination_links(response)
     self.next = None
     self.first = None
     self.prev = None
     for link in links:
         logging.debug('Links:' + link['rel'] + ':' + link['url'])
         if link['rel'] == 'next':
             self.next = link['url']
         elif link['rel'] == 'first':
             self.first = link['url']
         elif link['rel'] == 'prev':
             self.prev = link['url']
     return json.loads(response.content.decode('utf-8', 'ignore'))
Ejemplo n.º 8
0
def urlencode(query, doseq=0):
    """
    Same as urllib.urlencode, but supports unicode strings.
    
        >>> urlencode({'text':'foo bar'})
        'text=foo+bar'
        >>> urlencode({'x': [1, 2]}, doseq=True)
        'x=1&x=2'
    """
    def convert(value, doseq=False):
        if doseq and isinstance(value, list):
            return [convert(v) for v in value]
        else:
            return utils.safestr(value)
        
    query = dict([(k, convert(v, doseq)) for k, v in query.items()])
    return urllib_urlencode(query, doseq=doseq)
Ejemplo n.º 9
0
def urlencode(query, doseq=0):
    """
    Same as urllib.urlencode, but supports unicode strings.
    
        >>> urlencode({'text':'foo bar'})
        'text=foo+bar'
        >>> urlencode({'x': [1, 2]}, doseq=True)
        'x=1&x=2'
    """
    def convert(value, doseq=False):
        if doseq and isinstance(value, list):
            return [convert(v) for v in value]
        else:
            return utils.safestr(value)
        
    query = dict([(k, convert(v, doseq)) for k, v in query.items()])
    return urllib_urlencode(query, doseq=doseq)
Ejemplo n.º 10
0
def oauth_login(request):
  assert oauth is not None

  consumer = oauth.Consumer(OAUTH.CONSUMER_KEY.get(), OAUTH.CONSUMER_SECRET.get())
  client = oauth.Client(consumer)
  resp, content = client.request(OAUTH.REQUEST_TOKEN_URL.get(), "POST", body=urllib_urlencode({
                      'oauth_callback': 'http://' + request.get_host() + '/login/oauth_authenticated/'
                  }))

  if resp['status'] != '200':
    raise Exception(_("Invalid response from OAuth provider: %s") % resp)

  request.session['request_token'] = dict(cgi.parse_qsl(content))

  url = "%s?oauth_token=%s" % (OAUTH.AUTHENTICATE_URL.get(), request.session['request_token']['oauth_token'])

  return HttpResponseRedirect(url)
Ejemplo n.º 11
0
 def oauth_redirect_uri(self, state='', creator=None):
     params = {
         'response_type': self.config.oauth['response_type'],
         'client_id': self.config.oauth['client_id'],
         'redirect_uri': self.config.oauth['redirect_uri'],
         'scope': self.config.oauth['scope'],
         'state': state,
     }
     if 'oauth_extras' in self.config.oauth:
         for k, v in self.config.oauth['oauth_extras'].items():
             if isinstance(v, str) and 'dynamic:' in v:
                 if v[8:] == 'creator' and creator:
                     v = creator
             params[k] = v
     uri = self.config.oauth['auth_uri'] + "?" + urllib_urlencode(params)
     logging.debug('OAuth redirect with url: ' + uri + ' and state:' +
                   state)
     return uri
    def _get_escaped_full_path(self, request):
        """
        Django considers "safe" some characters that aren't so for oauthlib.
        We have to search for them and properly escape.
        """
        parsed = list(urlparse(request.get_full_path()))
        unsafe = set(c for c in parsed[4]).difference(urlencoded)
        for c in unsafe:
            parsed[4] = parsed[4].replace(c, quote(c, safe=b""))
        uri = urlsplit(urlunparse(parsed))
        query = uri.query
        params = parse_qsl(query)
        encoded_params = urllib_urlencode(params, doseq=False)

        parsed_url = SplitResult(uri.scheme, uri.netloc, uri.path,
                                 encoded_params, uri.fragment)

        return parsed_url.geturl()
Ejemplo n.º 13
0
def urlencode(params):
    """Urlencode a multidimensional dict."""

    # Not doing duck typing here. Will make debugging easier.
    if not isinstance(params, dict):
        raise TypeError("Only dicts are supported.")

    params = flatten(params)

    url_params = OrderedDict()
    for param in params:
        value = param.pop()

        name = parametrize(param)
        if isinstance(value, (list, tuple)):
            name += "[]"

        url_params[name] = value

    return urllib_urlencode(url_params, doseq=True)
Ejemplo n.º 14
0
def urlencode(params):
    """Urlencode a multidimensional dict."""

    # Not doing duck typing here. Will make debugging easier.
    if not isinstance(params, dict):
        raise TypeError("Only dicts are supported.")

    params = flatten(params)

    url_params = OrderedDict()
    for param in params:
        value = param.pop()

        name = parametrize(param)
        if isinstance(value, (list, tuple)):
            name += "[]"

        url_params[name] = value

    return urllib_urlencode(url_params, doseq=True)
Ejemplo n.º 15
0
def RefreshToken(client_id, client_secret, refresh_token):
    """Obtains a new token given a refresh token.

  See https://developers.google.com/accounts/docs/OAuth2InstalledApp#refresh

  Args:
    client_id: Client ID obtained by registering your app.
    client_secret: Client secret obtained by registering your app.
    refresh_token: A previously-obtained refresh token.
  Returns:
    The decoded response from the Google Accounts server, as a dict. Expected
    fields include 'access_token', 'expires_in', and 'refresh_token'.
  """
    params = {}
    params['client_id'] = client_id
    params['client_secret'] = client_secret
    params['refresh_token'] = refresh_token
    params['grant_type'] = 'refresh_token'
    request_url = AccountsUrl('o/oauth2/token')

    response = urllib_urlopen(request_url,
                              urllib_urlencode(params).encode("utf-8")).read()
    return json.loads(response.decode('utf-8'))
Ejemplo n.º 16
0
def urlencode(value):
    """Urlencode dictionary and return as UTF-8 string."""
    return urllib_urlencode(value).encode("utf-8")
Ejemplo n.º 17
0
 def post_request(self,
                  url,
                  params=None,
                  urlencode=False,
                  basic_auth=False):
     if params:
         if urlencode:
             data = urllib_urlencode(params)
             logging.debug('Oauth POST request with urlencoded payload: ' +
                           url + ' ' + data)
         else:
             data = json.dumps(params)
             logging.debug('Oauth POST request with JSON payload: ' + url +
                           ' ' + data)
     else:
         data = None
         logging.debug('Oauth POST request: ' + url)
     if urlencode:
         if self.token:
             if basic_auth:
                 headers = {
                     'Content-Type':
                     'application/x-www-form-urlencoded',
                     'Authorization':
                     'Basic ' + base64.b64encode(
                         self.token.encode("utf-8")).decode("utf-8"),
                 }
             else:
                 headers = {
                     'Content-Type': 'application/x-www-form-urlencoded',
                     'Authorization': 'Bearer ' + self.token,
                 }
         else:
             headers = {
                 'Content-Type': 'application/x-www-form-urlencoded',
             }
     else:
         if self.token:
             headers = {
                 'Content-Type': 'application/json',
                 'Authorization': 'Bearer ' + self.token,
             }
         else:
             headers = {'Content-Type': 'application/json'}
     try:
         if self.config.env == 'appengine':
             self.config.module["urlfetch"].set_default_fetch_deadline(20)
             response = self.config.module["urlfetch"].fetch(
                 url=url,
                 payload=data,
                 method=self.config.module["urlfetch"].POST,
                 headers=headers)
         else:
             response = self.config.module["urlfetch"].post(url=url,
                                                            data=data,
                                                            headers=headers)
         self.last_response_code = response.status_code
         self.last_response_message = response.content
     except (self.config.module["urlfetch"].UrlfetchException,
             self.config.module["urlfetch"].URLError,
             self.config.module["urlfetch"].Timeout,
             self.config.module["urlfetch"].TooManyRedirects):
         self.last_response_code = 0
         self.last_response_message = 'No response'
         logging.warning("Oauth POST failed with exception")
         return None
     if response.status_code == 204:
         return {}
     if response.status_code != 200 and response.status_code != 201:
         logging.info('Error when sending POST request: ' +
                      str(response.status_code) + str(response.content))
         return None
     logging.debug('Oauth POST response JSON:' + str(response.content))
     return json.loads(response.content.decode('utf-8', 'ignore'))
Ejemplo n.º 18
0
def urlencode(items):
    """A Unicode-safe URLencoder."""
    try:
        return urllib_urlencode(items)
    except UnicodeEncodeError:
        return urllib_urlencode([(k, force_bytes(v)) for k, v in items])