...

Source file src/github.com/Azure/azure-sdk-for-go/services/classic/management/publishSettings.go

Documentation: github.com/Azure/azure-sdk-for-go/services/classic/management

     1  // +build go1.7
     2  
     3  package management
     4  
     5  // Copyright (c) Microsoft Corporation. All rights reserved.
     6  // Licensed under the MIT License. See License.txt in the project root for license information.
     7  
     8  import (
     9  	"encoding/base64"
    10  	"encoding/pem"
    11  	"encoding/xml"
    12  	"fmt"
    13  	"io/ioutil"
    14  
    15  	"golang.org/x/crypto/pkcs12"
    16  )
    17  
    18  // ClientFromPublishSettingsData unmarshalls the contents of a publish settings file
    19  // from https://manage.windowsazure.com/publishsettings.
    20  // If subscriptionID is left empty, the first subscription in the file is used.
    21  func ClientFromPublishSettingsData(settingsData []byte, subscriptionID string) (client Client, err error) {
    22  	return ClientFromPublishSettingsDataWithConfig(settingsData, subscriptionID, DefaultConfig())
    23  }
    24  
    25  // ClientFromPublishSettingsFile reads a publish settings file downloaded from https://manage.windowsazure.com/publishsettings.
    26  // If subscriptionID is left empty, the first subscription in the file is used.
    27  func ClientFromPublishSettingsFile(filePath, subscriptionID string) (client Client, err error) {
    28  	return ClientFromPublishSettingsFileWithConfig(filePath, subscriptionID, DefaultConfig())
    29  }
    30  
    31  // ClientFromPublishSettingsFileWithConfig reads a publish settings file downloaded from https://manage.windowsazure.com/publishsettings.
    32  // If subscriptionID is left empty, the first subscription in the file is used.
    33  func ClientFromPublishSettingsFileWithConfig(filePath, subscriptionID string, config ClientConfig) (client Client, err error) {
    34  	if filePath == "" {
    35  		return client, fmt.Errorf(errParamNotSpecified, "filePath")
    36  	}
    37  
    38  	publishSettingsContent, err := ioutil.ReadFile(filePath)
    39  	if err != nil {
    40  		return client, err
    41  	}
    42  
    43  	return ClientFromPublishSettingsDataWithConfig(publishSettingsContent, subscriptionID, config)
    44  }
    45  
    46  // ClientFromPublishSettingsDataWithConfig unmarshalls the contents of a publish settings file
    47  // from https://manage.windowsazure.com/publishsettings.
    48  // If subscriptionID is left empty, the first subscription in the string is used.
    49  func ClientFromPublishSettingsDataWithConfig(data []byte, subscriptionID string, config ClientConfig) (client Client, err error) {
    50  	publishData := publishData{}
    51  	if err = xml.Unmarshal(data, &publishData); err != nil {
    52  		return client, err
    53  	}
    54  
    55  	for _, profile := range publishData.PublishProfiles {
    56  		for _, sub := range profile.Subscriptions {
    57  			if sub.ID == subscriptionID || subscriptionID == "" {
    58  				base64Cert := sub.ManagementCertificate
    59  				if base64Cert == "" {
    60  					base64Cert = profile.ManagementCertificate
    61  				}
    62  
    63  				pfxData, err := base64.StdEncoding.DecodeString(base64Cert)
    64  				if err != nil {
    65  					return client, err
    66  				}
    67  
    68  				pems, err := pkcs12.ToPEM(pfxData, "")
    69  				if err != nil {
    70  					return client, err
    71  				}
    72  
    73  				cert := []byte{}
    74  				for _, b := range pems {
    75  					cert = append(cert, pem.EncodeToMemory(b)...)
    76  				}
    77  
    78  				config.ManagementURL = sub.ServiceManagementURL
    79  				return makeClient(sub.ID, cert, config)
    80  			}
    81  		}
    82  	}
    83  
    84  	return client, fmt.Errorf("could not find subscription '%s' in settings provided", subscriptionID)
    85  }
    86  
    87  type publishSettings struct {
    88  	SubscriptionID   string
    89  	SubscriptionCert []byte
    90  	SubscriptionKey  []byte
    91  }
    92  
    93  type publishData struct {
    94  	XMLName         xml.Name         `xml:"PublishData"`
    95  	PublishProfiles []publishProfile `xml:"PublishProfile"`
    96  }
    97  
    98  type publishProfile struct {
    99  	XMLName               xml.Name       `xml:"PublishProfile"`
   100  	SchemaVersion         string         `xml:",attr"`
   101  	PublishMethod         string         `xml:",attr"`
   102  	URL                   string         `xml:"Url,attr"`
   103  	ManagementCertificate string         `xml:",attr"`
   104  	Subscriptions         []subscription `xml:"Subscription"`
   105  }
   106  
   107  type subscription struct {
   108  	XMLName               xml.Name `xml:"Subscription"`
   109  	ServiceManagementURL  string   `xml:"ServiceManagementUrl,attr"`
   110  	ID                    string   `xml:"Id,attr"`
   111  	Name                  string   `xml:",attr"`
   112  	ManagementCertificate string   `xml:",attr"`
   113  }
   114  

View as plain text