Skip to content

Commit be8c122

Browse files
authored
Merge pull request #12 from dbt-labs/mp/add_cache_recovery_for_unexpected_perms
fix(adbc/go): mismatched file permissions no longer prevent cache write access
2 parents 1113023 + 60cfb95 commit be8c122

1 file changed

Lines changed: 37 additions & 4 deletions

File tree

secure_storage_manager.go

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -179,14 +179,19 @@ func (ssm *fileBasedSecureStorageManager) withCacheFile(lease *Lease, action fun
179179
logger.Warnf("Unable to lease cache. %v", err)
180180
return err
181181
}
182-
cacheFile, err := os.OpenFile(ssm.credFilePath(), os.O_CREATE|os.O_RDWR, 0600)
182+
183+
const cachefilePermissions = 0600
184+
185+
path := ssm.credFilePath()
186+
187+
cacheFile, err := os.OpenFile(path, os.O_CREATE|os.O_RDWR, cachefilePermissions)
183188
if err != nil {
184-
logger.Warnf("cannot access %v. %v", ssm.credFilePath(), err)
189+
logger.Warnf("cannot access %v. %v", path, err)
185190
return err
186191
}
187192
defer func(file *os.File) {
188193
if err := file.Close(); err != nil {
189-
logger.Warnf("cannot release file descriptor for %v. %v", ssm.credFilePath(), err)
194+
logger.Warnf("cannot release file descriptor for %v. %v", path, err)
190195
}
191196
}(cacheFile)
192197

@@ -208,7 +213,9 @@ func (ssm *fileBasedSecureStorageManager) withCacheFile(lease *Lease, action fun
208213
logger.Warnf("failed to ensure owner for temporary cache file. %v", err)
209214
return err
210215
}
211-
if err := ensureFilePermissions(cacheFile, 0600); err != nil {
216+
217+
tryRemediateFilePermissions(cacheFile, cachefilePermissions)
218+
if err := ensureFilePermissions(cacheFile, cachefilePermissions); err != nil {
212219
logger.Warnf("failed to ensure permission for temporary cache file. %v", err)
213220
return err
214221
}
@@ -306,6 +313,32 @@ func ensureFileOwner(f *os.File) error {
306313
return nil
307314
}
308315

316+
// Users may manually create or save over the credential cache file leading to the presence of
317+
// a zombie cache file with no path to recovery. This gives a path to recovery.
318+
// If the file exists, try to secure its perms before opening
319+
func tryRemediateFilePermissions(f *os.File, expectedMode os.FileMode) {
320+
info, err := f.Stat()
321+
if err != nil {
322+
// With an open FD, ENOENT is unlikely; warn on real errors and return.
323+
if !errors.Is(err, os.ErrNotExist) {
324+
logger.Warnf("could not stat %s: %v", f.Name(), err)
325+
}
326+
return
327+
}
328+
329+
current := info.Mode().Perm()
330+
if current == expectedMode {
331+
// No-op: silently return
332+
return
333+
}
334+
335+
if chmodErr := f.Chmod(expectedMode); chmodErr == nil {
336+
logger.Infof("Set existing file %s to %04o permissions", f.Name(), expectedMode)
337+
} else {
338+
logger.Warnf("could not force %04o on existing file %s: %v", expectedMode, f.Name(), chmodErr)
339+
}
340+
}
341+
309342
func ensureFilePermissions(f *os.File, expectedMode os.FileMode) error {
310343
fileInfo, err := f.Stat()
311344
if err != nil {

0 commit comments

Comments
 (0)