Advertisement
Guest User

Untitled

a guest
Jul 25th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.93 KB | None | 0 0
  1. class CFAgent
  2.  
  3. RFC8601BASIC = "%Y%m%dT%H%M%SZ"
  4. CF_AGENT_ACCESS_KEY = "validaccesskey"
  5. CF_AGENT_SECRET_ACCESS_KEY = "validsecret"
  6.  
  7. def self.cf_dist_invalidation_status
  8. dist_id = "abc123"
  9. invalidation_id = "xyz"
  10. url = "https://cloudfront.amazonaws.com/2017-03-25/#{dist_id}/invalidation/#{invalidation_id}"
  11.  
  12. headers = {
  13. "Content-Type" => "application/json; charset=utf8"
  14. }
  15. headers = sign("GET", URI.parse(url), headers, "{}", CF_AGENT_ACCESS_KEY, CF_AGENT_SECRET_ACCESS_KEY, "us-east-1")
  16. puts "signed headers:", headers
  17.  
  18. res = SimpleHttp.get(url, headers)
  19. puts "Status:", res.code
  20. puts "Body:", res.body
  21. end
  22.  
  23. def self.sign(method, uri, headers, body, access_key, secret_key, region, service_name=nil)
  24. method = method.upcase
  25. service = service_name || uri.host.split(".", 2)[0]
  26.  
  27. date_header = headers["Date"] || headers["DATE"] || headers["date"]
  28. date = (date_header ? Time.parse(date_header) : Time.zone.now).utc.strftime(RFC8601BASIC)
  29.  
  30. body_digest = hexdigest(body)
  31.  
  32. headers['X-Amz-Date'] = date
  33. headers['Host'] = host(uri)
  34. headers['X-Amz-Content-Sha256'] ||= body_digest
  35.  
  36. headers['Authorization'] = authorization(method, uri, headers, body_digest, date, access_key, secret_key, region, service)
  37. headers
  38. end
  39.  
  40. private
  41.  
  42. def self.host(uri)
  43. if ((uri.scheme == 'http' && uri.port == 80) || (uri.scheme == 'https' && uri.port = 443))
  44. uri.host
  45. else
  46. "#{uri.host}:#{uri.port}"
  47. end
  48. end
  49.  
  50. def self.authorization(method, uri, headers, body_digest, date, access_key, secret_key, region, service)
  51. [
  52. "AWS4-HMAC-SHA256 Credential=#{credential(access_key, date, region, service)}",
  53. "SignedHeaders=#{signed_headers(headers)}",
  54. "Signature=#{signature(method, uri, headers, body_digest, date, access_key, secret_key, region, service)}"
  55. ].join(', ')
  56. end
  57.  
  58. def self.credential(access_key, date, region, service)
  59. "#{access_key}/#{credential_string(date, region, service)}"
  60. end
  61.  
  62. def self.signature(method, uri, headers, body_digest, date, access_key, secret_key, region, service)
  63. k_date = hmac("AWS4" + secret_key, date[0,8])
  64. k_region = hmac(k_date, region)
  65. k_service = hmac(k_region, service)
  66. k_credentials = hmac(k_service, "aws4_request")
  67. hexhmac(k_credentials, string_to_sign(method, uri, headers, body_digest, date, access_key, secret_key, region, service))
  68. end
  69.  
  70. def self.string_to_sign(method, uri, headers, body_digest, date, access_key, secret_key, region, service)
  71. [
  72. 'AWS4-HMAC-SHA256',
  73. date,
  74. credential_string(date, region, service),
  75. hexdigest(canonical_request(method, uri, headers, body_digest))
  76. ].join("n")
  77. end
  78.  
  79. def self.credential_string(date, region, service)
  80. [
  81. date[0,8],
  82. region,
  83. service,
  84. "aws4_request"
  85. ].join("/")
  86. end
  87.  
  88. def self.canonical_request(method, uri, headers, body_digest)
  89. [
  90. method,
  91. Pathname.new(uri.path).cleanpath.to_s,
  92. uri.query,
  93. canonical_headers(headers),
  94. signed_headers(headers),
  95. body_digest
  96. ].join("n")
  97. end
  98.  
  99. def self.canonical_headers(headers)
  100. c_headers = []
  101. headers.each_pair do |k,v|
  102. k = k.downcase
  103. c_headers << [k,v]
  104. end
  105. c_headers = c_headers.sort_by(&:first)
  106. c_headers.map{|k,v| "#{k}:#{canonical_header_value(v.to_s)}" }.join("n")
  107. end
  108.  
  109. def self.canonical_header_value(value)
  110. value.match(/^".*"$/) ? value : value.gsub(/s+/, ' ').strip
  111. end
  112.  
  113. def self.signed_headers(headers)
  114. headers.keys.inject([]) do |signed_headers, header_key|
  115. header_key = header_key.downcase
  116. signed_headers << header_key
  117. signed_headers
  118. end.sort.join(';')
  119. end
  120.  
  121. def self.hexdigest(value)
  122. Digest::SHA256.new.update(value).hexdigest
  123. end
  124.  
  125. def self.hmac(key, value)
  126. OpenSSL::HMAC.digest(OpenSSL::Digest.new('sha256'), key, value)
  127. end
  128.  
  129. def self.hexhmac(key, value)
  130. OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new('sha256'), key, value)
  131. end
  132.  
  133. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement