Skip to content

Commit 230f4b2

Browse files
sfc-gh-jszczerbinskisfc-gh-pfus
authored andcommitted
Fix
1 parent e981129 commit 230f4b2

3 files changed

+83
-37
lines changed

secure_storage_manager.go

+39-37
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ const (
2323
)
2424

2525
const (
26-
driverName = "SNOWFLAKE-GO-DRIVER"
2726
credCacheDirEnv = "SF_TEMPORARY_CREDENTIAL_CACHE_DIR"
2827
credCacheFileName = "temporary_credential.json"
2928
)
@@ -167,6 +166,23 @@ func buildCredCacheDirPath() string {
167166
return ""
168167
}
169168

169+
func (ssm *fileBasedSecureStorageManager) getTokens(data map[string]any) map[string]interface{} {
170+
val, ok := data["tokens"]
171+
emptyMap := map[string]interface{}{}
172+
if !ok {
173+
data["tokens"] = emptyMap
174+
return emptyMap
175+
}
176+
177+
tokens, ok := val.(map[string]interface{})
178+
if !ok {
179+
data["tokens"] = emptyMap
180+
return emptyMap
181+
}
182+
183+
return tokens
184+
}
185+
170186
func (ssm *fileBasedSecureStorageManager) setCredential(tokenSpec *secureTokenSpec, value string) {
171187
credentialsKey := tokenSpec.buildKey()
172188
err := ssm.lockFile()
@@ -176,13 +192,8 @@ func (ssm *fileBasedSecureStorageManager) setCredential(tokenSpec *secureTokenSp
176192
}
177193
defer ssm.unlockFile()
178194

179-
credCache, err := ssm.readTemporaryCacheFile()
180-
if err != nil {
181-
logger.Warnf("Set credential failed. Unable to read cache. %v", err)
182-
return
183-
}
184-
185-
credCache["tokens"][credentialsKey] = value
195+
credCache := ssm.readTemporaryCacheFile()
196+
ssm.getTokens(credCache)[credentialsKey] = value
186197

187198
err = ssm.writeTemporaryCacheFile(credCache)
188199
if err != nil {
@@ -212,6 +223,7 @@ func (ssm *fileBasedSecureStorageManager) lockFile() error {
212223
return fmt.Errorf("failed to create cache lock: %v, err: %v", lockPath, err)
213224
}
214225
locked = true
226+
break
215227
}
216228

217229
if !locked {
@@ -232,7 +244,6 @@ func (ssm *fileBasedSecureStorageManager) lockFile() error {
232244
return fmt.Errorf("failed to recreate cache lock after removing stale lock. %v, err: %v", lockPath, err)
233245
}
234246
}
235-
return fmt.Errorf("failed to lock cache lock %v", lockPath)
236247
}
237248
return nil
238249
}
@@ -247,29 +258,25 @@ func (ssm *fileBasedSecureStorageManager) unlockFile() {
247258

248259
func (ssm *fileBasedSecureStorageManager) getCredential(tokenSpec *secureTokenSpec) string {
249260
credentialsKey := tokenSpec.buildKey()
250-
credCache := map[string]map[string]string{}
251-
252261
err := ssm.lockFile()
253262
if err != nil {
254263
logger.Warn("Failed to lock credential cache file.")
255264
return ""
256265
}
257266

258-
credCache, err = ssm.readTemporaryCacheFile()
267+
credCache := ssm.readTemporaryCacheFile()
259268
ssm.unlockFile()
260-
if err != nil {
261-
logger.Warnf("Failed to read temporary cache file. %v.\n", err)
269+
cred, ok := ssm.getTokens(credCache)[credentialsKey]
270+
if !ok {
262271
return ""
263272
}
264273

265-
cred := credCache["tokens"][credentialsKey]
266-
if cred != "" {
267-
logger.Debug("Successfully read token. Returning as string")
268-
} else {
269-
logger.Debug("Returned credential is empty")
274+
credStr, ok := cred.(string)
275+
if !ok {
276+
return ""
270277
}
271278

272-
return cred
279+
return credStr
273280
}
274281

275282
func (ssm *fileBasedSecureStorageManager) credFilePath() string {
@@ -303,24 +310,26 @@ func (ssm *fileBasedSecureStorageManager) ensurePermissions() error {
303310
return nil
304311
}
305312

306-
func (ssm *fileBasedSecureStorageManager) readTemporaryCacheFile() (map[string]map[string]string, error) {
313+
func (ssm *fileBasedSecureStorageManager) readTemporaryCacheFile() map[string]any {
307314
err := ssm.ensurePermissions()
308315
if err != nil {
309-
return nil, err
316+
logger.Warnf("Failed to ensure permission for temporary cache file. %v.\n", err)
317+
return map[string]any{}
310318
}
311319

312320
jsonData, err := os.ReadFile(ssm.credFilePath())
313321
if err != nil {
314-
return nil, fmt.Errorf("failed to read credential cache file: %w", err)
322+
logger.Warnf("Failed to read credential cache file. %v.\n", err)
323+
return map[string]any{}
315324
}
316325

317-
credentialsMap := map[string]map[string]string{}
326+
credentialsMap := map[string]any{}
318327
err = json.Unmarshal([]byte(jsonData), &credentialsMap)
319328
if err != nil {
320-
return nil, fmt.Errorf("failed to unmarshal credential cache file: %w", err)
329+
logger.Warnf("Failed to unmarshal credential cache file. %v.\n", err)
321330
}
322331

323-
return credentialsMap, nil
332+
return credentialsMap
324333
}
325334

326335
func (ssm *fileBasedSecureStorageManager) deleteCredential(tokenSpec *secureTokenSpec) {
@@ -332,13 +341,8 @@ func (ssm *fileBasedSecureStorageManager) deleteCredential(tokenSpec *secureToke
332341
}
333342
defer ssm.unlockFile()
334343

335-
credCache, err := ssm.readTemporaryCacheFile()
336-
if err != nil {
337-
logger.Warnf("Set credential failed. Unable to read cache. %v", err)
338-
return
339-
}
340-
341-
delete(credCache["tokens"], credentialsKey)
344+
credCache := ssm.readTemporaryCacheFile()
345+
delete(ssm.getTokens(credCache), credentialsKey)
342346

343347
err = ssm.writeTemporaryCacheFile(credCache)
344348
if err != nil {
@@ -349,7 +353,7 @@ func (ssm *fileBasedSecureStorageManager) deleteCredential(tokenSpec *secureToke
349353
return
350354
}
351355

352-
func (ssm *fileBasedSecureStorageManager) writeTemporaryCacheFile(cache map[string]map[string]string) error {
356+
func (ssm *fileBasedSecureStorageManager) writeTemporaryCacheFile(cache map[string]any) error {
353357
bytes, err := json.Marshal(cache)
354358
if err != nil {
355359
return fmt.Errorf("failed to marshal credential cache map. %w", err)
@@ -458,9 +462,7 @@ func (ssm *keyringSecureStorageManager) deleteCredential(tokenSpec *secureTokenS
458462
}
459463

460464
func buildCredentialsKey(host, user string, credType tokenType) string {
461-
host = strings.ToUpper(host)
462-
user = strings.ToUpper(user)
463-
credTypeStr := strings.ToUpper(string(credType))
465+
credTypeStr := string(credType)
464466
return host + ":" + user + ":" + credTypeStr
465467
}
466468

secure_storage_manager_test.go

+38
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,47 @@
33
package gosnowflake
44

55
import (
6+
"os"
67
"testing"
78
)
89

10+
type EnvOverride struct {
11+
env string
12+
oldValue string
13+
}
14+
15+
func (e *EnvOverride) rollback() {
16+
if e.oldValue != "" {
17+
os.Setenv(e.env, e.oldValue)
18+
} else {
19+
os.Unsetenv(e.env)
20+
}
21+
}
22+
23+
func override_env(env string, value string) EnvOverride {
24+
oldValue := os.Getenv(env)
25+
os.Setenv(env, value)
26+
return EnvOverride{env, oldValue}
27+
}
28+
29+
func TestSnowflakeFileBasedSecureStorageManager(t *testing.T) {
30+
//skipOnNonLinux(t, "Not supported on non-linux")
31+
os.Mkdir("./testdata", 0777)
32+
credCacheDirEnvOverride := override_env(credCacheDirEnv, "./testdata")
33+
defer credCacheDirEnvOverride.rollback()
34+
fbss, err := newFileBasedSecureStorageManager()
35+
if err != nil {
36+
t.Fatal(err)
37+
}
38+
39+
tokenSpec := newMfaTokenSpec("host.xd", "johndoe")
40+
cred := "token123"
41+
fbss.setCredential(tokenSpec, cred)
42+
assertEqualE(t, fbss.getCredential(tokenSpec), cred)
43+
fbss.deleteCredential(tokenSpec)
44+
assertEqualE(t, fbss.getCredential(tokenSpec), "")
45+
}
46+
947
func TestSetAndGetCredentialMfa(t *testing.T) {
1048
for _, tokenSpec := range []*secureTokenSpec{
1149
newMfaTokenSpec("testhost", "testuser"),

util_test.go

+6
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,12 @@ func skipOnMac(t *testing.T, reason string) {
404404
}
405405
}
406406

407+
func skipOnNonLinux(t *testing.T, reason string) {
408+
if runtime.GOOS != "linux" {
409+
t.Skip("skipped on non-linux OS: " + reason)
410+
}
411+
}
412+
407413
func randomString(n int) string {
408414
r := rand.New(rand.NewSource(time.Now().UnixNano()))
409415
alpha := []rune("abcdefghijklmnopqrstuvwxyz")

0 commit comments

Comments
 (0)