11# -*- coding: utf-8 -*-
22
3+ from six .moves .urllib .parse import quote , unquote , urlparse , urlencode
34import hmac
45import time
5- import urllib
66import hashlib
77import logging
8- from urllib import quote
9- from urlparse import urlparse
108from requests .auth import AuthBase
9+ from .cos_comm import to_unicode , to_bytes
1110logger = logging .getLogger (__name__ )
1211
1312
@@ -18,62 +17,53 @@ def filter_headers(data):
1817 :return(dict): 计算进签名的头部.
1918 """
2019 headers = {}
21- for i in data . keys () :
20+ for i in data :
2221 if i == 'Content-Type' or i == 'Host' or i [0 ] == 'x' or i [0 ] == 'X' :
2322 headers [i ] = data [i ]
2423 return headers
2524
2625
27- def to_string (data ):
28- """转换unicode为string.
29-
30- :param data(unicode|string): 待转换的unicode|string.
31- :return(string): 转换后的string.
32- """
33- if isinstance (data , unicode ):
34- return data .encode ('utf8' )
35- return data
36-
37-
3826class CosS3Auth (AuthBase ):
3927
40- def __init__ (self , secret_id , secret_key , key = '' , params = {}, expire = 10000 ):
41- self ._secret_id = to_string ( secret_id )
42- self ._secret_key = to_string ( secret_key )
28+ def __init__ (self , secret_id , secret_key , key = None , params = {}, expire = 10000 ):
29+ self ._secret_id = secret_id
30+ self ._secret_key = secret_key
4331 self ._expire = expire
4432 self ._params = params
4533 if key :
46- if key [0 ] == '/' :
34+ key = to_unicode (key )
35+ if key [0 ] == u'/' :
4736 self ._path = key
4837 else :
49- self ._path = '/' + key
38+ self ._path = u '/' + key
5039 else :
51- self ._path = '/'
40+ self ._path = u '/'
5241
5342 def __call__ (self , r ):
5443 path = self ._path
5544 uri_params = self ._params
5645 headers = filter_headers (r .headers )
5746 uri_params = dict ([(k .lower (), v ) for k , v in uri_params .items ()])
5847 # reserved keywords in headers urlencode are -_.~, notice that / should be encoded and space should not be encoded to plus sign(+)
59- headers = dict ([(k .lower (), quote (v , '-_.~' )) for k , v in headers .items ()]) # headers中的key转换为小写,value进行encode
60- format_str = "{method}\n {host}\n {params}\n {headers}\n " .format (
48+ headers = dict ([(k .lower (), quote (to_bytes (v ), '-_.~' )) for k , v in headers .items ()]) # headers中的key转换为小写,value进行encode
49+ uri_params = dict ([(k .lower (), v ) for k , v in uri_params .items ()])
50+ format_str = u"{method}\n {host}\n {params}\n {headers}\n " .format (
6151 method = r .method .lower (),
6252 host = path ,
63- params = urllib . urlencode (sorted (uri_params .items ())).replace ('+' , '%20' ),
64- headers = '&' .join (map (lambda ( x , y ) : "%s=%s" % (x , y ), sorted (headers .items ())))
53+ params = urlencode (sorted (uri_params .items ())).replace ('+' , '%20' ),
54+ headers = '&' .join (map (lambda tupl : "%s=%s" % (tupl [ 0 ], tupl [ 1 ] ), sorted (headers .items ())))
6555 )
6656 logger .debug ("format str: " + format_str )
6757
6858 start_sign_time = int (time .time ())
6959 sign_time = "{bg_time};{ed_time}" .format (bg_time = start_sign_time - 60 , ed_time = start_sign_time + self ._expire )
7060 sha1 = hashlib .sha1 ()
71- sha1 .update (format_str )
61+ sha1 .update (to_bytes ( format_str ) )
7262
7363 str_to_sign = "sha1\n {time}\n {sha1}\n " .format (time = sign_time , sha1 = sha1 .hexdigest ())
7464 logger .debug ('str_to_sign: ' + str (str_to_sign ))
75- sign_key = hmac .new (self ._secret_key , sign_time , hashlib .sha1 ).hexdigest ()
76- sign = hmac .new (sign_key , str_to_sign , hashlib .sha1 ).hexdigest ()
65+ sign_key = hmac .new (to_bytes ( self ._secret_key ), to_bytes ( sign_time ) , hashlib .sha1 ).hexdigest ()
66+ sign = hmac .new (to_bytes ( sign_key ), to_bytes ( str_to_sign ) , hashlib .sha1 ).hexdigest ()
7767 logger .debug ('sign_key: ' + str (sign_key ))
7868 logger .debug ('sign: ' + str (sign ))
7969 sign_tpl = "q-sign-algorithm=sha1&q-ak={ak}&q-sign-time={sign_time}&q-key-time={key_time}&q-header-list={headers}&q-url-param-list={params}&q-signature={sign}"
0 commit comments