Class: QingStor::SDK::Signer

Inherits:
Object
  • Object
show all
Defined in:
lib/qingstor/sdk/request/signer.rb

Class Method Summary collapse

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

Returns:

  • (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
    authorization = "QS #{input[:config][:access_key_id]}:#{signature input}"
    input[:request_headers][:Authorization] = authorization

    Logger.debug "QingStor request authorization: [#{input[:id]}] #{authorization}"
  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

Returns:

  • (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