def get_normalized_parameters(self): """ Return a string that contains the parameters that must be signed. """ items = [] for key, value in self.items(): if key == 'oauth_signature': continue # 1.0a/9.1.1 states that kvp must be sorted by key, then by value, # so we unpack sequence values into multiple items for sorting. if isinstance(value, STRING_TYPES): items.append( (oauth2.to_utf8_if_string(key), oauth2.to_utf8(value)) ) else: try: value = list(value) except TypeError as e: assert 'is not iterable' in str(e) items.append( (oauth2.to_utf8_if_string(key), oauth2.to_utf8_if_string(value)) ) else: items.extend( (oauth2.to_utf8_if_string(key), oauth2.to_utf8_if_string(item)) for item in value ) # Include any query string parameters from the provided URL query = urlparse(self.url)[4] url_items = self._split_url_string(query).items() url_items = [ (oauth2.to_utf8(k), oauth2.to_utf8_optional_iterator(v)) for k, v in url_items if k != 'oauth_signature' ] # Merge together URL and POST parameters. # Eliminates parameters duplicated between URL and POST. items_dict = {} for k, v in items: items_dict.setdefault(k, []).append(v) for k, v in url_items: if not (k in items_dict and v in items_dict[k]): items.append((k, v)) items.sort() encoded_str = urlencode(items, True) # Encode signature parameters per Oauth Core 1.0 protocol # spec draft 7, section 3.6 # (http://tools.ietf.org/html/draft-hammer-oauth-07#section-3.6) # Spaces must be encoded with "%20" instead of "+" return encoded_str.replace('+', '%20').replace('%7E', '~')
def get_normalized_parameters(request): """Returns a string that contains the parameters that must be signed. This function is called by oauth2 SignatureMethod subclass CustomSignatureMethod_HMAC_SHA1 """ if request.data is None: request.data = [] data_and_params = dict(request.data + request.params.items()) items = [] for key, value in data_and_params.iteritems(): if key == 'oauth_signature': continue # 1.0a/9.1.1 states that kvp must be sorted by key, then by value, # so we unpack sequence values into multiple items for sorting. if isinstance(value, basestring): items.append((to_utf8_if_string(key), to_utf8(value))) else: try: value = list(value) except TypeError, e: assert 'is not iterable' in str(e) items.append((to_utf8_if_string(key), to_utf8_if_string(value))) else: items.extend((to_utf8_if_string(key), to_utf8_if_string(item)) for item in value)