@@ -124,12 +124,14 @@ func lookupCacheDir(envVar string, pathSegments ...string) (string, error) {
124
124
}
125
125
126
126
cacheDir := filepath .Join (envVal , filepath .Join (pathSegments ... ))
127
+ parentOfCacheDir := cacheDir [:strings .LastIndex (cacheDir , "/" )]
127
128
128
- if err = os .MkdirAll (cacheDir , os .FileMode (0o755 )); err != nil {
129
+ if err = os .MkdirAll (parentOfCacheDir , os .FileMode (0755 )); err != nil {
129
130
return "" , err
130
131
}
131
132
132
- if err = os .Chmod (cacheDir , os .FileMode (0700 )); err != nil {
133
+ // We don't check if permissions are incorrect here if a directory exists, because we check it later.
134
+ if err = os .Mkdir (cacheDir , os .FileMode (0700 )); err != nil && ! errors .Is (err , os .ErrExist ) {
133
135
return "" , err
134
136
}
135
137
@@ -164,6 +166,17 @@ func (ssm *fileBasedSecureStorageManager) getTokens(data map[string]any) map[str
164
166
return tokens
165
167
}
166
168
169
+ func (ssm * fileBasedSecureStorageManager ) withLock (action func (cacheFile * os.File )) {
170
+ err := ssm .lockFile ()
171
+ if err != nil {
172
+ logger .Warnf ("Unable to lock cache. %v" , err )
173
+ return
174
+ }
175
+ defer ssm .unlockFile ()
176
+
177
+ ssm .withCacheFile (action )
178
+ }
179
+
167
180
func (ssm * fileBasedSecureStorageManager ) withCacheFile (action func (* os.File )) {
168
181
cacheFile , err := os .OpenFile (ssm .credFilePath (), os .O_CREATE | os .O_RDWR , 0600 )
169
182
if err != nil {
@@ -184,14 +197,8 @@ func (ssm *fileBasedSecureStorageManager) setCredential(tokenSpec *secureTokenSp
184
197
logger .Warn (err )
185
198
return
186
199
}
187
- err = ssm .lockFile ()
188
- if err != nil {
189
- logger .Warnf ("Set credential failed. Unable to lock cache. %v" , err )
190
- return
191
- }
192
- defer ssm .unlockFile ()
193
200
194
- ssm .withCacheFile (func (cacheFile * os.File ) {
201
+ ssm .withLock (func (cacheFile * os.File ) {
195
202
credCache , err := ssm .readTemporaryCacheFile (cacheFile )
196
203
if err != nil {
197
204
logger .Warnf ("Error while reading cache file. %v" , err )
@@ -233,7 +240,7 @@ func (ssm *fileBasedSecureStorageManager) lockFile() error {
233
240
234
241
locked := false
235
242
for i := 0 ; i < numRetries ; i ++ {
236
- err := os .Mkdir (lockPath , 0o700 )
243
+ err := os .Mkdir (lockPath , 0700 )
237
244
if err != nil {
238
245
if errors .Is (err , os .ErrExist ) {
239
246
time .Sleep (retryInterval )
@@ -264,15 +271,9 @@ func (ssm *fileBasedSecureStorageManager) getCredential(tokenSpec *secureTokenSp
264
271
logger .Warn (err )
265
272
return ""
266
273
}
267
- err = ssm .lockFile ()
268
- if err != nil {
269
- logger .Warnf ("Failed to lock credential cache file. %v" , err )
270
- return ""
271
- }
272
- defer ssm .unlockFile ()
273
274
274
275
ret := ""
275
- ssm .withCacheFile (func (cacheFile * os.File ) {
276
+ ssm .withLock (func (cacheFile * os.File ) {
276
277
credCache , err := ssm .readTemporaryCacheFile (cacheFile )
277
278
if err != nil {
278
279
logger .Warnf ("Error while reading cache file. %v" , err )
@@ -303,7 +304,7 @@ func (ssm *fileBasedSecureStorageManager) ensurePermissions(cacheFile *os.File)
303
304
return err
304
305
}
305
306
306
- if dirInfo .Mode ().Perm () != 0o700 & os .ModePerm {
307
+ if dirInfo .Mode ().Perm () != 0700 & os .ModePerm {
307
308
return fmt .Errorf ("incorrect permissions(%o, expected 700) for %s" , dirInfo .Mode ().Perm (), ssm .credDirPath )
308
309
}
309
310
@@ -312,7 +313,7 @@ func (ssm *fileBasedSecureStorageManager) ensurePermissions(cacheFile *os.File)
312
313
return err
313
314
}
314
315
315
- if fileInfo .Mode ().Perm () != 0o600 & os .ModePerm {
316
+ if fileInfo .Mode ().Perm () != 0600 & os .ModePerm {
316
317
return fmt .Errorf ("incorrect permissions(%v, expected 600) for credential file" , fileInfo .Mode ().Perm ())
317
318
}
318
319
@@ -335,15 +336,15 @@ func (ssm *fileBasedSecureStorageManager) ensureOwnerForFile(file *os.File) erro
335
336
return ssm .ensureOwner (ownerUID )
336
337
}
337
338
338
- func (ssm * fileBasedSecureStorageManager ) ensureOwner (ownerId uint32 ) error {
339
+ func (ssm * fileBasedSecureStorageManager ) ensureOwner (ownerID uint32 ) error {
339
340
currentUser , err := user .Current ()
340
341
if err != nil {
341
342
return err
342
343
}
343
344
if errors .Is (err , os .ErrNotExist ) {
344
345
return nil
345
346
}
346
- if strconv .Itoa (int (ownerId )) != currentUser .Uid {
347
+ if strconv .Itoa (int (ownerID )) != currentUser .Uid {
347
348
return errors .New ("incorrect owner of " + ssm .credDirPath )
348
349
}
349
350
return nil
@@ -389,14 +390,8 @@ func (ssm *fileBasedSecureStorageManager) deleteCredential(tokenSpec *secureToke
389
390
logger .Warn (err )
390
391
return
391
392
}
392
- err = ssm .lockFile ()
393
- if err != nil {
394
- logger .Warnf ("Set credential failed. Unable to lock cache. %v" , err )
395
- return
396
- }
397
- defer ssm .unlockFile ()
398
393
399
- ssm .withCacheFile (func (cacheFile * os.File ) {
394
+ ssm .withLock (func (cacheFile * os.File ) {
400
395
credCache , err := ssm .readTemporaryCacheFile (cacheFile )
401
396
if err != nil {
402
397
logger .Warnf ("Error while reading cache file. %v" , err )
0 commit comments