Blame vendor/github.com/Azure/go-autorest/autorest/authorization_sas.go

Packit 63bb0d
package autorest
Packit 63bb0d
Packit 63bb0d
// Copyright 2017 Microsoft Corporation
Packit 63bb0d
//
Packit 63bb0d
//  Licensed under the Apache License, Version 2.0 (the "License");
Packit 63bb0d
//  you may not use this file except in compliance with the License.
Packit 63bb0d
//  You may obtain a copy of the License at
Packit 63bb0d
//
Packit 63bb0d
//      http://www.apache.org/licenses/LICENSE-2.0
Packit 63bb0d
//
Packit 63bb0d
//  Unless required by applicable law or agreed to in writing, software
Packit 63bb0d
//  distributed under the License is distributed on an "AS IS" BASIS,
Packit 63bb0d
//  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 63bb0d
//  See the License for the specific language governing permissions and
Packit 63bb0d
//  limitations under the License.
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"fmt"
Packit 63bb0d
	"net/http"
Packit 63bb0d
	"strings"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
// SASTokenAuthorizer implements an authorization for SAS Token Authentication
Packit 63bb0d
// this can be used for interaction with Blob Storage Endpoints
Packit 63bb0d
type SASTokenAuthorizer struct {
Packit 63bb0d
	sasToken string
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// NewSASTokenAuthorizer creates a SASTokenAuthorizer using the given credentials
Packit 63bb0d
func NewSASTokenAuthorizer(sasToken string) (*SASTokenAuthorizer, error) {
Packit 63bb0d
	if strings.TrimSpace(sasToken) == "" {
Packit 63bb0d
		return nil, fmt.Errorf("sasToken cannot be empty")
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	token := sasToken
Packit 63bb0d
	if strings.HasPrefix(sasToken, "?") {
Packit 63bb0d
		token = strings.TrimPrefix(sasToken, "?")
Packit 63bb0d
	}
Packit 63bb0d
Packit 63bb0d
	return &SASTokenAuthorizer{
Packit 63bb0d
		sasToken: token,
Packit 63bb0d
	}, nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
// WithAuthorization returns a PrepareDecorator that adds a shared access signature token to the
Packit 63bb0d
// URI's query parameters.  This can be used for the Blob, Queue, and File Services.
Packit 63bb0d
//
Packit 63bb0d
// See https://docs.microsoft.com/en-us/rest/api/storageservices/delegate-access-with-shared-access-signature
Packit 63bb0d
func (sas *SASTokenAuthorizer) WithAuthorization() PrepareDecorator {
Packit 63bb0d
	return func(p Preparer) Preparer {
Packit 63bb0d
		return PreparerFunc(func(r *http.Request) (*http.Request, error) {
Packit 63bb0d
			r, err := p.Prepare(r)
Packit 63bb0d
			if err != nil {
Packit 63bb0d
				return r, err
Packit 63bb0d
			}
Packit 63bb0d
Packit 63bb0d
			if r.URL.RawQuery != "" {
Packit 63bb0d
				r.URL.RawQuery = fmt.Sprintf("%s&%s", r.URL.RawQuery, sas.sasToken)
Packit 63bb0d
			} else {
Packit 63bb0d
				r.URL.RawQuery = sas.sasToken
Packit 63bb0d
			}
Packit 63bb0d
Packit 63bb0d
			r.RequestURI = r.URL.String()
Packit 63bb0d
			return Prepare(r)
Packit 63bb0d
		})
Packit 63bb0d
	}
Packit 63bb0d
}