@@ -78,6 +78,14 @@ type AskPassCredentialHelper struct {
78
78
Program string
79
79
}
80
80
81
+ type credValueType int
82
+
83
+ const (
84
+ credValueTypeUnknown credValueType = iota
85
+ credValueTypeUsername
86
+ credValueTypePassword
87
+ )
88
+
81
89
// Fill implements fill by running the ASKPASS program and returning its output
82
90
// as a password encoded in the Creds type given the key "password".
83
91
//
@@ -98,54 +106,72 @@ func (a *AskPassCredentialHelper) Fill(what Creds) (Creds, error) {
98
106
99
107
creds := make (Creds )
100
108
101
- if givenUser , ok := what ["username" ]; ok {
102
- creds ["username" ] = givenUser
103
- } else {
104
- username , err := a .getFromProgram ("Username" , u )
105
- if err != nil {
106
- return nil , err
107
- }
108
-
109
- creds ["username" ] = username
109
+ username , err := a .getValue (what , credValueTypeUsername , u )
110
+ if err != nil {
111
+ return nil , err
110
112
}
113
+ creds ["username" ] = username
111
114
112
- if len (creds [ " username" ] ) > 0 {
115
+ if len (username ) > 0 {
113
116
// If a non-empty username was given, add it to the URL via func
114
117
// 'net/url.User()'.
115
118
u .User = url .User (creds ["username" ])
116
119
}
117
120
118
- if givenPass , ok := what ["password" ]; ok {
119
- creds ["password" ] = givenPass
120
- } else {
121
- password , err := a .getFromProgram ("Password" , u )
122
- if err != nil {
123
- return nil , err
124
- }
125
-
126
- creds ["password" ] = password
121
+ password , err := a .getValue (what , credValueTypePassword , u )
122
+ if err != nil {
123
+ return nil , err
127
124
}
128
-
129
- creds ["username" ] = strings .TrimSpace (creds ["username" ])
130
- creds ["password" ] = strings .TrimSpace (creds ["password" ])
125
+ creds ["password" ] = password
131
126
132
127
return creds , nil
133
128
}
134
129
135
- func (a * AskPassCredentialHelper ) getFromProgram (valueType string , u * url.URL ) (string , error ) {
130
+ func (a * AskPassCredentialHelper ) getValue (what Creds , valueType credValueType , u * url.URL ) (string , error ) {
131
+ var valueString string
132
+
133
+ switch valueType {
134
+ case credValueTypeUsername :
135
+ valueString = "username"
136
+ case credValueTypePassword :
137
+ valueString = "password"
138
+ default :
139
+ return "" , errors .Errorf ("Invalid Credential type queried from AskPass" )
140
+ }
141
+
142
+ // Return the existing credential if it was already provided, otherwise
143
+ // query AskPass for it
144
+ if given , ok := what [valueString ]; ok {
145
+ return given , nil
146
+ }
147
+ return a .getFromProgram (valueType , u )
148
+ }
149
+
150
+ func (a * AskPassCredentialHelper ) getFromProgram (valueType credValueType , u * url.URL ) (string , error ) {
136
151
var (
137
152
value bytes.Buffer
138
153
err bytes.Buffer
154
+
155
+ valueString string
139
156
)
140
157
141
- // 'ucmd' will run the GIT_ASKPASS (or core.askpass) command prompting
158
+ switch valueType {
159
+ case credValueTypeUsername :
160
+ valueString = "Username"
161
+ case credValueTypePassword :
162
+ valueString = "Password"
163
+ default :
164
+ return "" , errors .Errorf ("Invalid Credential type queried from AskPass" )
165
+ }
166
+
167
+ // 'cmd' will run the GIT_ASKPASS (or core.askpass) command prompting
142
168
// for the desired valueType (`Username` or `Password`)
143
- ucmd := exec .Command (a .Program , a .args (fmt .Sprintf ("%s for %q" , valueType , u ))... )
144
- ucmd .Stderr = & err
145
- ucmd .Stdout = & value
169
+ cmd := exec .Command (a .Program , a .args (fmt .Sprintf ("%s for %q" , valueString , u ))... )
170
+ cmd .Stderr = & err
171
+ cmd .Stdout = & value
146
172
147
- tracerx .Printf ("creds: filling with GIT_ASKPASS: %s" , strings .Join (ucmd .Args , " " ))
148
- if err := ucmd .Run (); err != nil {
173
+ tracerx .Printf ("creds: filling with GIT_ASKPASS: %s" , strings .Join (cmd .Args , " " ))
174
+ if err := cmd .Run (); err != nil {
149
175
return "" , err
150
176
}
151
177
0 commit comments