[rubygems/rubygems] Do not mutate uri.query during s3 signature creation
https://github.com/rubygems/rubygems/commit/c0275ee537
This commit is contained in:
parent
c4f7c260f9
commit
25a327d41b
@ -49,12 +49,12 @@ class Gem::S3URISigner
|
|||||||
credential_info = "#{date}/#{s3_config.region}/s3/aws4_request"
|
credential_info = "#{date}/#{s3_config.region}/s3/aws4_request"
|
||||||
canonical_host = "#{uri.host}.s3.#{s3_config.region}.amazonaws.com"
|
canonical_host = "#{uri.host}.s3.#{s3_config.region}.amazonaws.com"
|
||||||
|
|
||||||
uri.query = generate_canonical_query_params(s3_config, date_time, credential_info, expiration)
|
query_params = generate_canonical_query_params(s3_config, date_time, credential_info, expiration)
|
||||||
canonical_request = generate_canonical_request(canonical_host)
|
canonical_request = generate_canonical_request(canonical_host, query_params)
|
||||||
string_to_sign = generate_string_to_sign(date_time, credential_info, canonical_request)
|
string_to_sign = generate_string_to_sign(date_time, credential_info, canonical_request)
|
||||||
signature = generate_signature(s3_config, date, string_to_sign)
|
signature = generate_signature(s3_config, date, string_to_sign)
|
||||||
|
|
||||||
URI.parse("https://#{canonical_host}#{uri.path}?#{uri.query}&X-Amz-Signature=#{signature}")
|
URI.parse("https://#{canonical_host}#{uri.path}?#{query_params}&X-Amz-Signature=#{signature}")
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
@ -76,11 +76,11 @@ class Gem::S3URISigner
|
|||||||
end.join("&")
|
end.join("&")
|
||||||
end
|
end
|
||||||
|
|
||||||
def generate_canonical_request(canonical_host)
|
def generate_canonical_request(canonical_host, query_params)
|
||||||
[
|
[
|
||||||
"GET",
|
"GET",
|
||||||
uri.path,
|
uri.path,
|
||||||
uri.query,
|
query_params,
|
||||||
"host:#{canonical_host}",
|
"host:#{canonical_host}",
|
||||||
"", # empty params
|
"", # empty params
|
||||||
"host",
|
"host",
|
||||||
@ -131,11 +131,11 @@ class Gem::S3URISigner
|
|||||||
else
|
else
|
||||||
id = auth[:id] || auth["id"]
|
id = auth[:id] || auth["id"]
|
||||||
secret = auth[:secret] || auth["secret"]
|
secret = auth[:secret] || auth["secret"]
|
||||||
raise ConfigurationError.new("s3_source for #{host} missing id or secret") unless id && secret
|
|
||||||
|
|
||||||
security_token = auth[:security_token] || auth["security_token"]
|
security_token = auth[:security_token] || auth["security_token"]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
raise ConfigurationError.new("s3_source for #{host} missing id or secret") unless id && secret
|
||||||
|
|
||||||
region = auth[:region] || auth["region"] || "us-east-1"
|
region = auth[:region] || auth["region"] || "us-east-1"
|
||||||
S3Config.new(id, secret, security_token, region)
|
S3Config.new(id, secret, security_token, region)
|
||||||
end
|
end
|
||||||
|
@ -675,6 +675,9 @@ PeIQQkFng2VVot/WAQbv3ePqWq07g1BBcwIBAg==
|
|||||||
def s3_uri_signer.ec2_metadata_credentials_json
|
def s3_uri_signer.ec2_metadata_credentials_json
|
||||||
JSON.parse($instance_profile)
|
JSON.parse($instance_profile)
|
||||||
end
|
end
|
||||||
|
# Running sign operation to make sure uri.query is not mutated
|
||||||
|
s3_uri_signer.sign
|
||||||
|
raise "URI query is not empty: #{uri.query}" unless uri.query.nil?
|
||||||
s3_uri_signer
|
s3_uri_signer
|
||||||
end
|
end
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user