<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array"/>
  <modified type="array">
    <modified>
      <diff>@@ -1,12 +1,10 @@
-# from http://oauth.googlecode.com/svn/code/python/oauth/oauth.py, r622
-
 import cgi
 import urllib
 import time
 import random
 import urlparse
 import hmac
-import base64
+import binascii
 
 VERSION = '1.0' # Hi Blaine!
 HTTP_METHOD = 'GET'
@@ -26,6 +24,13 @@ def escape(s):
     # escape '/' too
     return urllib.quote(s, safe='~')
 
+# utf-8, please
+def _utf8_str(s):
+    if isinstance(s, unicode):
+        return s.encode(&quot;utf-8&quot;)
+    else:
+        return str(s)
+
 # util function: current timestamp
 # seconds since epoch (UTC)
 def generate_timestamp():
@@ -34,7 +39,7 @@ def generate_timestamp():
 # util function: nonce
 # pseudorandom number
 def generate_nonce(length=8):
-    return ''.join(str(random.randint(0, 9)) for i in range(length))
+    return ''.join([str(random.randint(0, 9)) for i in range(length)])
 
 # OAuthConsumer is a data type that represents the identity of the Consumer
 # via its shared secret with the Service Provider.
@@ -66,12 +71,13 @@ class OAuthToken(object):
 
     # return a token from something like:
     # oauth_token_secret=digg&amp;oauth_token=digg
-    @staticmethod   
+    # @staticmethod   
     def from_string(s):
         params = cgi.parse_qs(s, keep_blank_values=False)
         key = params['oauth_token'][0]
         secret = params['oauth_token_secret'][0]
         return OAuthToken(key, secret)
+    from_string = staticmethod(from_string)
 
     def __str__(self):
         return self.to_string()
@@ -126,12 +132,13 @@ class OAuthRequest(object):
         # add the oauth parameters
         if self.parameters:
             for k, v in self.parameters.iteritems():
-                auth_header += ', %s=&quot;%s&quot;' % (k, escape(str(v)))
+                if k[:6] == 'oauth_':
+                    auth_header += ', %s=&quot;%s&quot;' % (k, escape(str(v)))
         return {'Authorization': auth_header}
 
     # serialize as post data for a POST request
     def to_postdata(self):
-        return '&amp;'.join('%s=%s' % (escape(str(k)), escape(str(v))) for k, v in self.parameters.iteritems())
+        return '&amp;'.join(['%s=%s' % (escape(str(k)), escape(str(v))) for k, v in self.parameters.iteritems()])
 
     # serialize as a url for a GET request
     def to_url(self):
@@ -149,7 +156,7 @@ class OAuthRequest(object):
         # sort lexicographically, first after key, then after value
         key_values.sort()
         # combine key value pairs in string and escape
-        return '&amp;'.join('%s=%s' % (escape(str(k)), escape(str(v))) for k, v in key_values)
+        return '&amp;'.join(['%s=%s' % (escape(_utf8_str(k)), escape(_utf8_str(v))) for k, v in key_values])
 
     # just uppercases the http method
     def get_normalized_http_method(self):
@@ -172,7 +179,7 @@ class OAuthRequest(object):
         # call the build signature method within the signature method
         return signature_method.build_signature(self, consumer, token)
 
-    @staticmethod
+    # @staticmethod
     def from_request(http_method, http_url, headers=None, parameters=None, query_string=None):
         # combine multiple parameter sources
         if parameters is None:
@@ -204,8 +211,9 @@ class OAuthRequest(object):
             return OAuthRequest(http_method, http_url, parameters)
 
         return None
+    from_request = staticmethod(from_request)
 
-    @staticmethod
+    # @staticmethod
     def from_consumer_and_token(oauth_consumer, token=None, http_method=HTTP_METHOD, http_url=None, parameters=None):
         if not parameters:
             parameters = {}
@@ -224,8 +232,9 @@ class OAuthRequest(object):
             parameters['oauth_token'] = token.key
 
         return OAuthRequest(http_method, http_url, parameters)
+    from_consumer_and_token = staticmethod(from_consumer_and_token)
 
-    @staticmethod
+    # @staticmethod
     def from_token_and_callback(token, callback=None, http_method=HTTP_METHOD, http_url=None, parameters=None):
         if not parameters:
             parameters = {}
@@ -233,12 +242,13 @@ class OAuthRequest(object):
         parameters['oauth_token'] = token.key
 
         if callback:
-            parameters['oauth_callback'] = escape(callback)
+            parameters['oauth_callback'] = callback
 
         return OAuthRequest(http_method, http_url, parameters)
+    from_token_and_callback = staticmethod(from_token_and_callback)
 
     # util function: turn Authorization: header into parameters, has to do some unescaping
-    @staticmethod
+    # @staticmethod
     def _split_header(header):
         params = {}
         parts = header.split(',')
@@ -253,14 +263,16 @@ class OAuthRequest(object):
             # remove quotes and unescape the value
             params[param_parts[0]] = urllib.unquote(param_parts[1].strip('\&quot;'))
         return params
+    _split_header = staticmethod(_split_header)
     
     # util function: turn url string into parameters, has to do some unescaping
-    @staticmethod
+    # @staticmethod
     def _split_url_string(param_str):
         parameters = cgi.parse_qs(param_str, keep_blank_values=False)
         for k, v in parameters.iteritems():
             parameters[k] = urllib.unquote(v[0])
         return parameters
+    _split_url_string = staticmethod(_split_url_string)
 
 # OAuthServer is a worker to check a requests validity against a data store
 class OAuthServer(object):
@@ -273,7 +285,7 @@ class OAuthServer(object):
         self.data_store = data_store
         self.signature_methods = signature_methods or {}
 
-    def set_data_store(self, oauth_data_store):
+    def set_data_store(self, data_store):
         self.data_store = data_store
 
     def get_data_store(self):
@@ -507,7 +519,7 @@ class OAuthSignatureMethod_HMAC_SHA1(OAuthSignatureMethod):
             hashed = hmac.new(key, raw, sha)
 
         # calculate the digest base 64
-        return base64.b64encode(hashed.digest())
+        return binascii.b2a_base64(hashed.digest())[:-1]
 
 class OAuthSignatureMethod_PLAINTEXT(OAuthSignatureMethod):
 
@@ -516,10 +528,11 @@ class OAuthSignatureMethod_PLAINTEXT(OAuthSignatureMethod):
 
     def build_signature_base_string(self, oauth_request, consumer, token):
         # concatenate the consumer key and secret
-        sig = escape(consumer.secret) + '&amp;'
+        sig = '%s&amp;' % escape(consumer.secret)
         if token:
             sig = sig + escape(token.secret)
-        return sig
+        return sig, sig
 
     def build_signature(self, oauth_request, consumer, token):
-        return self.build_signature_base_string(oauth_request, consumer, token)
+        key, raw = self.build_signature_base_string(oauth_request, consumer, token)
+        return key
\ No newline at end of file</diff>
      <filename>oauth.py</filename>
    </modified>
  </modified>
  <removed type="array"/>
  <parents type="array">
    <parent>
      <id>9c235b7f3414a193f2145f85cbcf1480ceb8f0cf</id>
    </parent>
  </parents>
  <author>
    <name>Seth Fitzsimmons</name>
    <email>seth@mojodna.net</email>
  </author>
  <url>http://github.com/SteveMarshall/fire-eagle-python-binding/commit/7254b8af50a61f9bb5b5e6b19fdc3ddc8f16705f</url>
  <id>7254b8af50a61f9bb5b5e6b19fdc3ddc8f16705f</id>
  <committed-date>2009-05-26T19:00:58-07:00</committed-date>
  <authored-date>2009-05-26T19:00:58-07:00</authored-date>
  <message>oauth.py from leah/python-oauth (e7aabc)</message>
  <tree>e7a1f0d048921257e82015b6a847b274ec9b8b1d</tree>
  <committer>
    <name>Seth Fitzsimmons</name>
    <email>seth@mojodna.net</email>
  </committer>
</commit>
