...
1
2
3 package management
4
5
6
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
19
20
21 func ClientFromPublishSettingsData(settingsData []byte, subscriptionID string) (client Client, err error) {
22 return ClientFromPublishSettingsDataWithConfig(settingsData, subscriptionID, DefaultConfig())
23 }
24
25
26
27 func ClientFromPublishSettingsFile(filePath, subscriptionID string) (client Client, err error) {
28 return ClientFromPublishSettingsFileWithConfig(filePath, subscriptionID, DefaultConfig())
29 }
30
31
32
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
47
48
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