@@ -29,20 +29,24 @@ const (
29
29
30
30
// Backend implements sotrage.Backend for Azure Blob Storage.
31
31
type Backend struct {
32
- logger log.Logger
33
- httpClient * http.Client
34
- cfg Config
35
- containerURL azblob.ContainerURL
36
- sasToken string
37
- // sharedKeyCredential * azblob.SharedKeyCredential
32
+ logger log.Logger
33
+ httpClient * http.Client
34
+ cfg Config
35
+ containerURL azblob.ContainerURL
36
+ sasToken string
37
+ sharedKeyCredential azblob.StorageAccountCredential
38
38
}
39
39
40
40
// New creates an AzureBlob backend.
41
41
func New (l log.Logger , c Config ) (* Backend , error ) {
42
42
var credential azblob.Credential
43
43
44
44
var err error
45
-
45
+ b := & Backend {
46
+ logger : l ,
47
+ cfg : c ,
48
+ httpClient : http .DefaultClient ,
49
+ }
46
50
if c .AccountName == "" {
47
51
return nil , errors .New ("azure account name is required" )
48
52
}
@@ -57,6 +61,11 @@ func New(l log.Logger, c Config) (*Backend, error) {
57
61
if err != nil {
58
62
return nil , fmt .Errorf ("azure, invalid credentials, %w" , err )
59
63
}
64
+ var ok bool
65
+ b .sharedKeyCredential , ok = credential .(azblob.StorageAccountCredential )
66
+ if ! ok {
67
+ return nil , errors .New ("azure, invalid credentials" )
68
+ }
60
69
}
61
70
62
71
// 3. Azurite has different URL pattern than production Azure Blob Storage.
@@ -98,13 +107,9 @@ func New(l log.Logger, c Config) (*Backend, error) {
98
107
level .Error (l ).Log ("msg" , "container already exists" , "err" , err )
99
108
}
100
109
}
101
-
102
- return & Backend {
103
- logger : l ,
104
- cfg : c ,
105
- containerURL : containerURL ,
106
- httpClient : http .DefaultClient ,
107
- }, nil
110
+ b .containerURL = containerURL
111
+ b .sasToken = c .SASToken
112
+ return b , nil
108
113
}
109
114
110
115
// Get writes downloaded content to the given writer.
@@ -207,14 +212,31 @@ func (b *Backend) generateSASTokenWithCDN(containerName, blobPath string) (strin
207
212
containerName = strings .Replace (containerName , "\\ " , "/" , - 1 ) // Replace backslashes with forward slashes
208
213
blobPath = strings .Replace (blobPath , "\\ " , "/" , - 1 ) // Replace backslashes with forward slashes
209
214
}
210
-
211
215
parts := azblob.BlobURLParts {
212
216
Scheme : "https" ,
213
217
Host : b .cfg .CDNHost ,
214
218
ContainerName : containerName ,
215
219
BlobName : blobPath ,
216
220
}
217
- rawURL := parts .URL ()
218
- rawURL .RawQuery = b .sasToken
221
+ var rawURL url.URL
222
+ if b .sasToken == "" {
223
+ sasDefaultSignature := azblob.BlobSASSignatureValues {
224
+ Protocol : azblob .SASProtocolHTTPS ,
225
+ ExpiryTime : time .Now ().UTC ().Add (12 * time .Hour ),
226
+ ContainerName : containerName ,
227
+ BlobName : blobPath ,
228
+ Permissions : azblob.BlobSASPermissions {Read : true , List : true }.String (),
229
+ }
230
+ sasQueryParams , err := sasDefaultSignature .NewSASQueryParameters (b .sharedKeyCredential )
231
+ if err != nil {
232
+ return "" , err
233
+ }
234
+ parts .SAS = sasQueryParams
235
+ rawURL = parts .URL ()
236
+ } else {
237
+ rawURL = parts .URL ()
238
+ rawURL .RawQuery = b .sasToken
239
+ }
240
+
219
241
return rawURL .String (), nil
220
242
}
0 commit comments