...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package authn
16
17 import (
18 "encoding/base64"
19 "encoding/json"
20 "fmt"
21 "strings"
22 )
23
24
25 type Authenticator interface {
26
27 Authorization() (*AuthConfig, error)
28 }
29
30
31
32 type AuthConfig struct {
33 Username string `json:"username,omitempty"`
34 Password string `json:"password,omitempty"`
35 Auth string `json:"auth,omitempty"`
36
37
38
39 IdentityToken string `json:"identitytoken,omitempty"`
40
41
42 RegistryToken string `json:"registrytoken,omitempty"`
43 }
44
45
46
47 type authConfig AuthConfig
48
49
50 func (a *AuthConfig) UnmarshalJSON(data []byte) error {
51 var shadow authConfig
52 err := json.Unmarshal(data, &shadow)
53 if err != nil {
54 return err
55 }
56
57 *a = (AuthConfig)(shadow)
58
59 if len(shadow.Auth) != 0 {
60 var derr error
61 a.Username, a.Password, derr = decodeDockerConfigFieldAuth(shadow.Auth)
62 if derr != nil {
63 err = fmt.Errorf("unable to decode auth field: %w", derr)
64 }
65 } else if len(a.Username) != 0 && len(a.Password) != 0 {
66 a.Auth = encodeDockerConfigFieldAuth(shadow.Username, shadow.Password)
67 }
68
69 return err
70 }
71
72
73 func (a AuthConfig) MarshalJSON() ([]byte, error) {
74 shadow := (authConfig)(a)
75 shadow.Auth = encodeDockerConfigFieldAuth(shadow.Username, shadow.Password)
76 return json.Marshal(shadow)
77 }
78
79
80
81
82
83
84
85 func decodeDockerConfigFieldAuth(field string) (username, password string, err error) {
86 var decoded []byte
87
88
89 if strings.HasSuffix(strings.TrimSpace(field), "=") {
90
91 decoded, err = base64.StdEncoding.DecodeString(field)
92 } else {
93
94 decoded, err = base64.RawStdEncoding.DecodeString(field)
95 }
96
97 if err != nil {
98 return
99 }
100
101 parts := strings.SplitN(string(decoded), ":", 2)
102 if len(parts) != 2 {
103 err = fmt.Errorf("must be formatted as base64(username:password)")
104 return
105 }
106
107 username = parts[0]
108 password = parts[1]
109
110 return
111 }
112
113 func encodeDockerConfigFieldAuth(username, password string) string {
114 return base64.StdEncoding.EncodeToString([]byte(username + ":" + password))
115 }
116
View as plain text