...

Source file src/github.com/Azure/azure-sdk-for-go/storage/blobsasuri_test.go

Documentation: github.com/Azure/azure-sdk-for-go/storage

     1  package storage
     2  
     3  // Copyright (c) Microsoft Corporation. All rights reserved.
     4  // Licensed under the MIT License. See License.txt in the project root for license information.
     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  //Gets a SASURI for the entire container
    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  // Trying to use SignedIP and Protocol but using an older version of the API.
   123  // Should ignore the signedIP/protocol and just use what the older version requires.
   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) // not implemented SAS for versions earlier than 2013-08-15
   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  	// check format for 2015-04-05 version
   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