Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 21 additions & 36 deletions internal/pkg/auth/storage.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,31 +60,31 @@ func SetAuthFieldMap(keyMap map[authFieldKey]string) error {
}

func SetAuthField(key authFieldKey, value string) error {
err := setAuthFieldInKeyring(key, value)
activeProfile, err := config.GetProfile()
if err != nil {
return fmt.Errorf("get profile: %w", err)
}

err = setAuthFieldInKeyring(activeProfile, key, value)
if err != nil {
errFallback := setAuthFieldInEncodedTextFile(key, value)
errFallback := setAuthFieldInEncodedTextFile(activeProfile, key, value)
if errFallback != nil {
return fmt.Errorf("write to keyring failed (%w), try writing to encoded text file: %w", err, errFallback)
}
}
return nil
}

func setAuthFieldInKeyring(key authFieldKey, value string) error {
activeProfile, err := config.GetProfile()
if err != nil {
return fmt.Errorf("get profile: %w", err)
}

func setAuthFieldInKeyring(activeProfile string, key authFieldKey, value string) error {
if activeProfile != "" {
activeProfileKeyring := filepath.Join(keyringService, activeProfile)
return keyring.Set(activeProfileKeyring, string(key), value)
}
return keyring.Set(keyringService, string(key), value)
}

func setAuthFieldInEncodedTextFile(key authFieldKey, value string) error {
err := createEncodedTextFile()
func setAuthFieldInEncodedTextFile(activeProfile string, key authFieldKey, value string) error {
err := createEncodedTextFile(activeProfile)
if err != nil {
return err
}
Expand All @@ -94,11 +94,6 @@ func setAuthFieldInEncodedTextFile(key authFieldKey, value string) error {
return fmt.Errorf("get config dir: %w", err)
}

activeProfile, err := config.GetProfile()
if err != nil {
return fmt.Errorf("get profile: %w", err)
}

profileTextFileFolderName := textFileFolderName
if activeProfile != "" {
profileTextFileFolderName = filepath.Join(activeProfile, textFileFolderName)
Expand Down Expand Up @@ -153,32 +148,32 @@ func GetAuthFlow() (AuthFlow, error) {
}

func GetAuthField(key authFieldKey) (string, error) {
value, err := getAuthFieldFromKeyring(key)
activeProfile, err := config.GetProfile()
if err != nil {
return "", fmt.Errorf("get profile: %w", err)
}

value, err := getAuthFieldFromKeyring(activeProfile, key)
if err != nil {
var errFallback error
value, errFallback = getAuthFieldFromEncodedTextFile(key)
value, errFallback = getAuthFieldFromEncodedTextFile(activeProfile, key)
if errFallback != nil {
return "", fmt.Errorf("read from keyring: %w, read from encoded file as fallback: %w", err, errFallback)
}
}
return value, nil
}

func getAuthFieldFromKeyring(key authFieldKey) (string, error) {
activeProfile, err := config.GetProfile()
if err != nil {
return "", fmt.Errorf("get profile: %w", err)
}

func getAuthFieldFromKeyring(activeProfile string, key authFieldKey) (string, error) {
if activeProfile != "" {
activeProfileKeyring := filepath.Join(keyringService, activeProfile)
return keyring.Get(activeProfileKeyring, string(key))
}
return keyring.Get(keyringService, string(key))
}

func getAuthFieldFromEncodedTextFile(key authFieldKey) (string, error) {
err := createEncodedTextFile()
func getAuthFieldFromEncodedTextFile(activeProfile string, key authFieldKey) (string, error) {
err := createEncodedTextFile(activeProfile)
if err != nil {
return "", err
}
Expand All @@ -188,11 +183,6 @@ func getAuthFieldFromEncodedTextFile(key authFieldKey) (string, error) {
return "", fmt.Errorf("get config dir: %w", err)
}

activeProfile, err := config.GetProfile()
if err != nil {
return "", fmt.Errorf("get profile: %w", err)
}

profileTextFileFolderName := textFileFolderName
if activeProfile != "" {
profileTextFileFolderName = filepath.Join(activeProfile, textFileFolderName)
Expand Down Expand Up @@ -224,17 +214,12 @@ func getAuthFieldFromEncodedTextFile(key authFieldKey) (string, error) {
// Checks if the encoded text file exist.
// If it doesn't, creates it with the content "{}" encoded.
// If it does, does nothing (and returns nil).
func createEncodedTextFile() error {
func createEncodedTextFile(activeProfile string) error {
configDir, err := os.UserConfigDir()
if err != nil {
return fmt.Errorf("get config dir: %w", err)
}

activeProfile, err := config.GetProfile()
if err != nil {
return fmt.Errorf("get profile: %w", err)
}

profileTextFileFolderName := textFileFolderName
if activeProfile != "" {
profileTextFileFolderName = filepath.Join(activeProfile, textFileFolderName)
Expand Down
36 changes: 23 additions & 13 deletions internal/pkg/auth/storage_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,11 @@ func TestSetGetAuthField(t *testing.T) {

for _, tt := range tests {
t.Run(tt.description, func(t *testing.T) {
activeProfile, err := config.GetProfile()
if err != nil {
t.Errorf("get profile: %v", err)
}

if !tt.keyringFails {
keyring.MockInit()
} else {
Expand Down Expand Up @@ -147,7 +152,7 @@ func TestSetGetAuthField(t *testing.T) {
t.Errorf("Post-test cleanup failed: remove field \"%s\" from keyring: %v. Please remove it manually", key, err)
}
} else {
err = deleteAuthFieldInEncodedTextFile(key)
err = deleteAuthFieldInEncodedTextFile(activeProfile, key)
if err != nil {
t.Errorf("Post-test cleanup failed: remove field \"%s\" from text file: %v. Please remove it manually", key, err)
}
Expand Down Expand Up @@ -219,8 +224,13 @@ func TestSetGetAuthFieldKeyring(t *testing.T) {
t.Run(tt.description, func(t *testing.T) {
keyring.MockInit()

activeProfile, err := config.GetProfile()
if err != nil {
t.Errorf("get profile: %v", err)
}

for _, assignment := range tt.valueAssignments {
err := setAuthFieldInKeyring(assignment.key, assignment.value)
err := setAuthFieldInKeyring(activeProfile, assignment.key, assignment.value)
if err != nil {
t.Fatalf("Failed to set \"%s\" as \"%s\": %v", assignment.key, assignment.value, err)
}
Expand All @@ -231,7 +241,7 @@ func TestSetGetAuthFieldKeyring(t *testing.T) {
}

for key, valueExpected := range tt.expectedValues {
value, err := getAuthFieldFromKeyring(key)
value, err := getAuthFieldFromKeyring(activeProfile, key)
if err != nil {
t.Errorf("Failed to get value of \"%s\": %v", key, err)
continue
Expand Down Expand Up @@ -308,8 +318,13 @@ func TestSetGetAuthFieldEncodedTextFile(t *testing.T) {

for _, tt := range tests {
t.Run(tt.description, func(t *testing.T) {
activeProfile, err := config.GetProfile()
if err != nil {
t.Errorf("get profile: %v", err)
}

for _, assignment := range tt.valueAssignments {
err := setAuthFieldInEncodedTextFile(assignment.key, assignment.value)
err := setAuthFieldInEncodedTextFile(activeProfile, assignment.key, assignment.value)
if err != nil {
t.Fatalf("Failed to set \"%s\" as \"%s\": %v", assignment.key, assignment.value, err)
}
Expand All @@ -320,15 +335,15 @@ func TestSetGetAuthFieldEncodedTextFile(t *testing.T) {
}

for key, valueExpected := range tt.expectedValues {
value, err := getAuthFieldFromEncodedTextFile(key)
value, err := getAuthFieldFromEncodedTextFile(activeProfile, key)
if err != nil {
t.Errorf("Failed to get value of \"%s\": %v", key, err)
continue
} else if value != valueExpected {
t.Errorf("Value of field \"%s\" is wrong: expected \"%s\", got \"%s\"", key, valueExpected, value)
}

err = deleteAuthFieldInEncodedTextFile(key)
err = deleteAuthFieldInEncodedTextFile(activeProfile, key)
if err != nil {
t.Errorf("Post-test cleanup failed: remove field \"%s\" from text file: %v. Please remove it manually", key, err)
}
Expand All @@ -351,8 +366,8 @@ func deleteAuthFieldInKeyring(key authFieldKey) error {
return keyring.Delete(keyringService, string(key))
}

func deleteAuthFieldInEncodedTextFile(key authFieldKey) error {
err := createEncodedTextFile()
func deleteAuthFieldInEncodedTextFile(activeProfile string, key authFieldKey) error {
err := createEncodedTextFile(activeProfile)
if err != nil {
return err
}
Expand All @@ -362,11 +377,6 @@ func deleteAuthFieldInEncodedTextFile(key authFieldKey) error {
return fmt.Errorf("get config dir: %w", err)
}

activeProfile, err := config.GetProfile()
if err != nil {
return fmt.Errorf("get profile: %w", err)
}

profileTextFileFolderName := textFileFolderName
if activeProfile != "" {
profileTextFileFolderName = filepath.Join(activeProfile, textFileFolderName)
Expand Down