awsraw 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/awsraw/s3/signer.rb +18 -3
- data/lib/awsraw/version.rb +1 -1
- data/spec/s3/signer_spec.rb +57 -35
- metadata +3 -8
data/lib/awsraw/s3/signer.rb
CHANGED
@@ -10,6 +10,7 @@ module AWSRaw
|
|
10
10
|
#
|
11
11
|
# See http://docs.amazonwebservices.com/AmazonS3/latest/dev/RESTAuthentication.html
|
12
12
|
class Signer
|
13
|
+
SUBRESOURCES = %w(acl lifecycle location logging notification partNumber policy requestPayment torrent uploadId uploads versionId versioning versions website)
|
13
14
|
|
14
15
|
def initialize(access_key_id, secret_access_key)
|
15
16
|
@access_key_id = access_key_id
|
@@ -56,12 +57,26 @@ module AWSRaw
|
|
56
57
|
end
|
57
58
|
|
58
59
|
def canonicalized_resource(request)
|
59
|
-
# TODO: Should also append the sub-resource.
|
60
60
|
if request.host =~ /^(.+)\.s3\.amazonaws\.com/
|
61
61
|
bucket = request.host.split(/\./).first
|
62
|
-
'/' + bucket + request.path
|
62
|
+
resource = '/' + bucket + request.path
|
63
63
|
else
|
64
|
-
request.path
|
64
|
+
resource = request.path
|
65
|
+
end
|
66
|
+
resource + canonicalized_subresource(request)
|
67
|
+
end
|
68
|
+
|
69
|
+
def canonicalized_subresource(request)
|
70
|
+
return "" unless request.query
|
71
|
+
subresources =
|
72
|
+
request.query.split('&')
|
73
|
+
.map { |s| s.split('=') }
|
74
|
+
.select { |k,v| SUBRESOURCES.include? k }
|
75
|
+
.map { |k,v| k + (v ? "=#{v}" : "") }
|
76
|
+
if subresources.any?
|
77
|
+
"?" + subresources.join("&")
|
78
|
+
else
|
79
|
+
""
|
65
80
|
end
|
66
81
|
end
|
67
82
|
|
data/lib/awsraw/version.rb
CHANGED
data/spec/s3/signer_spec.rb
CHANGED
@@ -7,45 +7,67 @@ describe AWSRaw::S3::Signer do
|
|
7
7
|
subject { AWSRaw::S3::Signer.new(access_key_id, secret_access_key) }
|
8
8
|
|
9
9
|
context "examples from Amazon docs" do
|
10
|
-
|
11
|
-
request
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
10
|
+
context "Example Object GET" do
|
11
|
+
it "signs a get request correctly" do
|
12
|
+
request = stub(
|
13
|
+
:method => "GET",
|
14
|
+
:host => "s3.amazonaws.com",
|
15
|
+
:path => "/johnsmith/photos/puppy.jpg",
|
16
|
+
:query => nil,
|
17
|
+
:headers => { "Date" => "Tue, 27 Mar 2007 19:36:42 +0000" }
|
18
|
+
)
|
17
19
|
|
18
|
-
|
19
|
-
|
20
|
+
subject.string_to_sign(request).should ==
|
21
|
+
"GET\n\n\nTue, 27 Mar 2007 19:36:42 +0000\n/johnsmith/photos/puppy.jpg"
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
+
subject.signature(request).should == "AWS #{access_key_id}:bWq2s1WEIj+Ydj0vQ697zp+IXMU="
|
24
|
+
end
|
25
|
+
|
26
|
+
it "signs an upload correctly" do
|
27
|
+
request = stub(
|
28
|
+
:method => "PUT",
|
29
|
+
:host => "s3.amazonaws.com",
|
30
|
+
:path => "/static.johnsmith.net/db-backup.dat.gz",
|
31
|
+
:query => nil,
|
32
|
+
:headers => {
|
33
|
+
"User-Agent" => "curl/7.15.5",
|
34
|
+
"Date" => "Tue, 27 Mar 2007 21:06:08 +0000",
|
35
|
+
"x-amz-acl" => "public-read",
|
36
|
+
"Content-Type" => "application/x-download",
|
37
|
+
"Content-MD5" => "4gJE4saaMU4BqNR0kLY+lw==",
|
38
|
+
"X-Amz-Meta-ReviewedBy" => "joe@johnsmith.net,jane@johnsmith.net",
|
39
|
+
"X-Amz-Meta-FileChecksum" => "0x02661779",
|
40
|
+
"X-Amz-Meta-ChecksumAlgorithm" => "crc32",
|
41
|
+
"Content-Disposition" => "attachment; filename=database.dat",
|
42
|
+
"Content-Encoding" => "gzip",
|
43
|
+
"Content-Length" => "5913339"
|
44
|
+
}
|
45
|
+
)
|
46
|
+
|
47
|
+
subject.string_to_sign(request).should ==
|
48
|
+
"PUT\n4gJE4saaMU4BqNR0kLY+lw==\napplication/x-download\nTue, 27 Mar 2007 21:06:08 +0000\nx-amz-acl:public-read\nx-amz-meta-checksumalgorithm:crc32\nx-amz-meta-filechecksum:0x02661779\nx-amz-meta-reviewedby:joe@johnsmith.net,jane@johnsmith.net\n/static.johnsmith.net/db-backup.dat.gz"
|
23
49
|
|
24
|
-
|
25
|
-
|
26
|
-
:method => "PUT",
|
27
|
-
:host => "s3.amazonaws.com",
|
28
|
-
:path => "/static.johnsmith.net/db-backup.dat.gz",
|
29
|
-
:headers => {
|
30
|
-
"User-Agent" => "curl/7.15.5",
|
31
|
-
"Date" => "Tue, 27 Mar 2007 21:06:08 +0000",
|
32
|
-
"x-amz-acl" => "public-read",
|
33
|
-
"Content-Type" => "application/x-download",
|
34
|
-
"Content-MD5" => "4gJE4saaMU4BqNR0kLY+lw==",
|
35
|
-
"X-Amz-Meta-ReviewedBy" => "joe@johnsmith.net,jane@johnsmith.net",
|
36
|
-
"X-Amz-Meta-FileChecksum" => "0x02661779",
|
37
|
-
"X-Amz-Meta-ChecksumAlgorithm" => "crc32",
|
38
|
-
"Content-Disposition" => "attachment; filename=database.dat",
|
39
|
-
"Content-Encoding" => "gzip",
|
40
|
-
"Content-Length" => "5913339"
|
41
|
-
}
|
42
|
-
)
|
43
|
-
|
44
|
-
subject.string_to_sign(request).should ==
|
45
|
-
"PUT\n4gJE4saaMU4BqNR0kLY+lw==\napplication/x-download\nTue, 27 Mar 2007 21:06:08 +0000\nx-amz-acl:public-read\nx-amz-meta-checksumalgorithm:crc32\nx-amz-meta-filechecksum:0x02661779\nx-amz-meta-reviewedby:joe@johnsmith.net,jane@johnsmith.net\n/static.johnsmith.net/db-backup.dat.gz"
|
46
|
-
|
47
|
-
subject.signature(request).should == "AWS #{access_key_id}:ilyl83RwaSoYIEdixDQcA4OnAnc="
|
50
|
+
subject.signature(request).should == "AWS #{access_key_id}:ilyl83RwaSoYIEdixDQcA4OnAnc="
|
51
|
+
end
|
48
52
|
end
|
49
53
|
|
54
|
+
context "Example Fetch" do
|
55
|
+
let(:request) { stub(
|
56
|
+
:method => "GET",
|
57
|
+
:host => "johnsmith.s3.amazonaws.com",
|
58
|
+
:path => "/",
|
59
|
+
:query => "acl",
|
60
|
+
:headers => { "Date" => "Tue, 27 Mar 2007 19:44:46 +0000" }
|
61
|
+
)}
|
62
|
+
|
63
|
+
it "generates the correct string to sign" do
|
64
|
+
subject.string_to_sign(request).should ==
|
65
|
+
"GET\n\n\nTue, 27 Mar 2007 19:44:46 +0000\n/johnsmith/?acl"
|
66
|
+
end
|
67
|
+
|
68
|
+
it "signs the request correctly" do
|
69
|
+
subject.signature(request).should == "AWS #{access_key_id}:c2WLPFtWHVgbEmeEG93a4cG37dM="
|
70
|
+
end
|
71
|
+
end
|
50
72
|
end
|
51
73
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: awsraw
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2013-04
|
14
|
+
date: 2013-06-04 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: rake
|
@@ -87,18 +87,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
87
87
|
- - ! '>='
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: '0'
|
90
|
-
segments:
|
91
|
-
- 0
|
92
|
-
hash: -2102654929379621144
|
93
90
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
94
91
|
none: false
|
95
92
|
requirements:
|
96
93
|
- - ! '>='
|
97
94
|
- !ruby/object:Gem::Version
|
98
95
|
version: '0'
|
99
|
-
segments:
|
100
|
-
- 0
|
101
|
-
hash: -2102654929379621144
|
102
96
|
requirements: []
|
103
97
|
rubyforge_project: awsraw
|
104
98
|
rubygems_version: 1.8.23
|
@@ -111,3 +105,4 @@ test_files:
|
|
111
105
|
- spec/s3/md5_digester_spec.rb
|
112
106
|
- spec/s3/query_string_signer_spec.rb
|
113
107
|
- spec/s3/signer_spec.rb
|
108
|
+
has_rdoc:
|