1 package storage
2
3
4
5
6 import (
7 "io/ioutil"
8 "net/http"
9 "net/url"
10 "time"
11
12 chk "gopkg.in/check.v1"
13 )
14
15 type BlobSASURISuite struct{}
16
17 var _ = chk.Suite(&BlobSASURISuite{})
18
19 const (
20 oldAPIVer = "2013-08-15"
21 newerAPIVer = "2015-04-05"
22 latestAPIVer = "2018-11-09"
23 )
24
25 func (s *BlobSASURISuite) TestGetBlobSASURI(c *chk.C) {
26 api, err := NewClient("foo", dummyMiniStorageKey, DefaultBaseURL, oldAPIVer, true)
27 c.Assert(err, chk.IsNil)
28 cli := api.GetBlobService()
29 cnt := cli.GetContainerReference("container")
30 b := cnt.GetBlobReference("name")
31
32 expectedParts := url.URL{
33 Scheme: "https",
34 Host: "foo.blob.core.windows.net",
35 Path: "container/name",
36 RawQuery: url.Values{
37 "sv": {oldAPIVer},
38 "sig": {"/OXG7rWh08jYwtU03GzJM0DHZtidRGpC6g69rSGm3I0="},
39 "sr": {"b"},
40 "sp": {"r"},
41 "se": {"0001-01-01T00:00:00Z"},
42 }.Encode(),
43 }
44
45 sasuriOptions := BlobSASOptions{}
46 sasuriOptions.Read = true
47 sasuriOptions.UseHTTPS = true
48
49 u, err := b.GetSASURI(sasuriOptions)
50 c.Assert(err, chk.IsNil)
51 sasParts, err := url.Parse(u)
52 c.Assert(err, chk.IsNil)
53 c.Assert(expectedParts.String(), chk.Equals, sasParts.String())
54 c.Assert(expectedParts.Query(), chk.DeepEquals, sasParts.Query())
55 }
56
57
58 func (s *BlobSASURISuite) TestGetBlobSASURIContainer(c *chk.C) {
59 api, err := NewClient("foo", dummyMiniStorageKey, DefaultBaseURL, oldAPIVer, true)
60 c.Assert(err, chk.IsNil)
61 cli := api.GetBlobService()
62 cnt := cli.GetContainerReference("container")
63
64 expectedParts := url.URL{
65 Scheme: "https",
66 Host: "foo.blob.core.windows.net",
67 Path: "container",
68 RawQuery: url.Values{
69 "sv": {oldAPIVer},
70 "sig": {"KMjYyQODKp6uK9EKR3yGhO2M84e1LfoztypU32kHj4s="},
71 "sr": {"c"},
72 "sp": {"r"},
73 "se": {"0001-01-01T00:00:00Z"},
74 }.Encode(),
75 }
76
77 sasuriOptions := ContainerSASOptions{}
78 sasuriOptions.Read = true
79
80 u, err := cnt.GetSASURI(sasuriOptions)
81 c.Assert(err, chk.IsNil)
82 sasParts, err := url.Parse(u)
83 c.Assert(err, chk.IsNil)
84 c.Assert(expectedParts.String(), chk.Equals, sasParts.String())
85 c.Assert(expectedParts.Query(), chk.DeepEquals, sasParts.Query())
86 }
87
88 func (s *BlobSASURISuite) TestGetBlobSASURIWithSignedIPAndProtocolValidAPIVersionPassed(c *chk.C) {
89 api, err := NewClient("foo", dummyMiniStorageKey, DefaultBaseURL, newerAPIVer, true)
90 c.Assert(err, chk.IsNil)
91 cli := api.GetBlobService()
92 cnt := cli.GetContainerReference("container")
93 b := cnt.GetBlobReference("name")
94
95 expectedParts := url.URL{
96 Scheme: "https",
97 Host: "foo.blob.core.windows.net",
98 Path: "/container/name",
99 RawQuery: url.Values{
100 "sv": {newerAPIVer},
101 "sig": {"VBOYJmt89UuBRXrxNzmsCMoC+8PXX2yklV71QcL1BfM="},
102 "sr": {"b"},
103 "sip": {"127.0.0.1"},
104 "sp": {"r"},
105 "se": {"0001-01-01T00:00:00Z"},
106 "spr": {"https"},
107 }.Encode(),
108 }
109
110 sasuriOptions := BlobSASOptions{}
111 sasuriOptions.Read = true
112 sasuriOptions.IP = "127.0.0.1"
113 sasuriOptions.UseHTTPS = true
114
115 u, err := b.GetSASURI(sasuriOptions)
116 c.Assert(err, chk.IsNil)
117 sasParts, err := url.Parse(u)
118 c.Assert(err, chk.IsNil)
119 c.Assert(sasParts.Query(), chk.DeepEquals, expectedParts.Query())
120 }
121
122
123
124 func (s *BlobSASURISuite) TestGetBlobSASURIWithSignedIPAndProtocolUsingOldAPIVersion(c *chk.C) {
125 api, err := NewClient("foo", dummyMiniStorageKey, DefaultBaseURL, oldAPIVer, true)
126 c.Assert(err, chk.IsNil)
127 cli := api.GetBlobService()
128 cnt := cli.GetContainerReference("container")
129 b := cnt.GetBlobReference("name")
130
131 expectedParts := url.URL{
132 Scheme: "https",
133 Host: "foo.blob.core.windows.net",
134 Path: "/container/name",
135 RawQuery: url.Values{
136 "sv": {oldAPIVer},
137 "sig": {"/OXG7rWh08jYwtU03GzJM0DHZtidRGpC6g69rSGm3I0="},
138 "sr": {"b"},
139 "sp": {"r"},
140 "se": {"0001-01-01T00:00:00Z"},
141 }.Encode(),
142 }
143
144 sasuriOptions := BlobSASOptions{}
145 sasuriOptions.Read = true
146 sasuriOptions.UseHTTPS = true
147
148 u, err := b.GetSASURI(sasuriOptions)
149 c.Assert(err, chk.IsNil)
150 sasParts, err := url.Parse(u)
151 c.Assert(err, chk.IsNil)
152 c.Assert(expectedParts.String(), chk.Equals, sasParts.String())
153 c.Assert(expectedParts.Query(), chk.DeepEquals, sasParts.Query())
154 }
155
156 func (s *BlobSASURISuite) TestBlobSASURICorrectness(c *chk.C) {
157 cli := getBlobClient(c)
158 simpleClient := &http.Client{}
159 rec := cli.client.appendRecorder(c)
160 simpleClient.Transport = rec
161 defer rec.Stop()
162
163 cnt := cli.GetContainerReference(containerName(c))
164 c.Assert(cnt.Create(nil), chk.IsNil)
165 b := cnt.GetBlobReference(contentWithSpecialChars(5))
166 defer cnt.Delete(nil)
167
168 body := content(100)
169 c.Assert(b.putSingleBlockBlob(body), chk.IsNil)
170
171 sasuriOptions := BlobSASOptions{}
172 sasuriOptions.Expiry = fixedTime.UTC().Add(time.Hour)
173 sasuriOptions.Read = true
174
175 sasURI, err := b.GetSASURI(sasuriOptions)
176 c.Assert(err, chk.IsNil)
177
178 resp, err := simpleClient.Get(sasURI)
179 c.Assert(err, chk.IsNil)
180
181 blobResp, err := ioutil.ReadAll(resp.Body)
182 defer resp.Body.Close()
183 c.Assert(err, chk.IsNil)
184
185 c.Assert(resp.StatusCode, chk.Equals, http.StatusOK)
186 c.Assert(string(blobResp), chk.Equals, string(body))
187
188 }
189
190 func (s *BlobSASURISuite) Test_blobSASStringToSign(c *chk.C) {
191 _, err := blobSASStringToSign("2012-02-12", "CS", "SE", "SP", "", "", "", "", "", "", OverrideHeaders{})
192 c.Assert(err, chk.NotNil)
193
194 out, err := blobSASStringToSign("SP", "", "SE", "CS", "", "", "", oldAPIVer, "", "", OverrideHeaders{})
195 c.Assert(err, chk.IsNil)
196 c.Assert(out, chk.Equals, "SP\n\nSE\nCS\n\n2013-08-15\n\n\n\n\n")
197
198
199 out, err = blobSASStringToSign("SP", "", "SE", "CS", "", "127.0.0.1", "https,http", newerAPIVer, "", "", OverrideHeaders{})
200 c.Assert(err, chk.IsNil)
201 c.Assert(out, chk.Equals, "SP\n\nSE\n/blobCS\n\n127.0.0.1\nhttps,http\n2015-04-05\n\n\n\n\n")
202
203 out, err = blobSASStringToSign("SP", "", "SE", "CS", "", "127.0.0.1", "https,http", latestAPIVer, "b", "", OverrideHeaders{})
204 c.Assert(err, chk.IsNil)
205 c.Assert(out, chk.Equals, "SP\n\nSE\n/blobCS\n\n127.0.0.1\nhttps,http\n2018-11-09\nb\n\n\n\n\n\n")
206 }
207
208 func (s *BlobSASURISuite) TestGetBlobSASURIStorageEmulator(c *chk.C) {
209 client, err := NewEmulatorClient()
210 c.Assert(err, chk.IsNil)
211 blobService := client.GetBlobService()
212 container := blobService.GetContainerReference("testfolder")
213 blob := container.GetBlobReference("testfile")
214 options := BlobSASOptions{
215 SASOptions: SASOptions{
216 Expiry: time.Date(2017, 9, 30, 16, 0, 0, 0, time.UTC),
217 },
218 BlobServiceSASPermissions: BlobServiceSASPermissions{
219 Write: true,
220 },
221 }
222 url, err := blob.GetSASURI(options)
223 c.Assert(err, chk.IsNil)
224 c.Assert(url, chk.Equals, "http://127.0.0.1:10000/devstoreaccount1/testfolder/testfile?se=2017-09-30T16%3A00%3A00Z&sig=rwds%2FhX%2F239%2FCtdi4VuomG8oRyoQ2SwBfL3%2BkoWpToQ%3D&sp=w&sr=b&sv=2018-03-28")
225 }
226
View as plain text