Class: QingStor::SDK::Signer
- Inherits:
-
Object
- Object
- QingStor::SDK::Signer
- Defined in:
- lib/qingstor/sdk/request/signer.rb
Class Method Summary collapse
- .canonicalized_headers(input) ⇒ Object
- .canonicalized_resource(input) ⇒ Object
- .is_anonymous?(input) ⇒ Boolean
- .query_signature(input, expires) ⇒ Object
- .query_string_to_sign(input, expires) ⇒ Object
- .sign(input) ⇒ Object
- .sign_query(input, expires) ⇒ Object
- .signature(input) ⇒ Object
- .string_to_sign(input) ⇒ Object
- .sub_resource?(key) ⇒ Boolean
Class Method Details
.canonicalized_headers(input) ⇒ Object
91 92 93 94 95 |
# File 'lib/qingstor/sdk/request/signer.rb', line 91 def self.canonicalized_headers(input) h = {} input[:request_headers].each { |k, v| h[k.to_s.strip.downcase] = v.to_s.strip } h.keys.sort.select { |k| k.start_with? 'x-qs-' }.map { |k| "#{k}:#{h[k]}\n" }.join '' end |
.canonicalized_resource(input) ⇒ Object
97 98 99 100 101 102 103 104 105 106 |
# File 'lib/qingstor/sdk/request/signer.rb', line 97 def self.canonicalized_resource(input) params = input[:request_params].keys.sort.map { |k| if sub_resource? k.to_s v = input[:request_params][k].to_s.strip !v.nil? && v != '' ? "#{k}=#{CGI.unescape v}" : k end }.compact.join '&' params = input[:request_uri].include?('?') ? "&#{params}" : "?#{params}" if params != '' "#{input[:request_uri]}#{params}" end |
.is_anonymous?(input) ⇒ Boolean
117 118 119 120 121 122 123 |
# File 'lib/qingstor/sdk/request/signer.rb', line 117 def self.is_anonymous?(input) if input[:config].nil? return true end input[:config][:access_key_id].blank? && input[:config][:secret_access_key].blank? end |
.query_signature(input, expires) ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 73 |
# File 'lib/qingstor/sdk/request/signer.rb', line 62 def self.query_signature(input, expires) string_to_sign = query_string_to_sign(input, expires) Logger.debug "QingStor query request string to sign: [#{input[:id]}] #{string_to_sign}" CGI.escape Base64.encode64( OpenSSL::HMAC.digest( OpenSSL::Digest.new('sha256'), input[:config][:secret_access_key].to_s, string_to_sign, ), ).strip end |
.query_string_to_sign(input, expires) ⇒ Object
83 84 85 86 87 88 89 |
# File 'lib/qingstor/sdk/request/signer.rb', line 83 def self.query_string_to_sign(input, expires) string_to_sign = "#{input[:request_method]}\n" \ "#{input[:request_headers][:'Content-MD5']}\n" \ "#{input[:request_headers][:'Content-Type']}\n" \ "#{expires}\n" "#{string_to_sign}#{canonicalized_headers input}#{canonicalized_resource input}" end |
.sign(input) ⇒ Object
26 27 28 29 30 31 32 33 34 35 |
# File 'lib/qingstor/sdk/request/signer.rb', line 26 def self.sign(input) unless is_anonymous? input = "QS #{input[:config][:access_key_id]}:#{signature input}" input[:request_headers][:Authorization] = Logger.debug "QingStor request authorization: [#{input[:id]}] #{}" end input end |
.sign_query(input, expires) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/qingstor/sdk/request/signer.rb', line 37 def self.sign_query(input, expires) unless is_anonymous? input input[:request_params][:signature] = query_signature input, expires input[:request_params][:access_key_id] = input[:config][:access_key_id] input[:request_params][:expires] = expires Logger.debug "QingStor query signature: [#{input[:id]}] #{input[:request_params][:signature]}" end input end |
.signature(input) ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/qingstor/sdk/request/signer.rb', line 49 def self.signature(input) string_to_sign = string_to_sign(input) Logger.debug "QingStor request string to sign: [#{input[:id]}] #{string_to_sign}" Base64.encode64( OpenSSL::HMAC.digest( OpenSSL::Digest.new('sha256'), input[:config][:secret_access_key].to_s, string_to_sign, ), ).strip end |
.string_to_sign(input) ⇒ Object
75 76 77 78 79 80 81 |
# File 'lib/qingstor/sdk/request/signer.rb', line 75 def self.string_to_sign(input) string_to_sign = "#{input[:request_method]}\n" \ "#{input[:request_headers][:'Content-MD5']}\n" \ "#{input[:request_headers][:'Content-Type']}\n" \ "#{input[:request_headers][:Date]}\n" "#{string_to_sign}#{canonicalized_headers input}#{canonicalized_resource input}" end |
.sub_resource?(key) ⇒ Boolean
108 109 110 111 112 113 114 115 |
# File 'lib/qingstor/sdk/request/signer.rb', line 108 def self.sub_resource?(key) %w[ acl append cname cors delete image lifecycle logging mirror notification part_number policy position stats upload_id uploads response-expires response-cache-control response-content-type response-content-language response-content-encoding response-content-disposition ].include? key end |