Skip to content

Commit ef531e7

Browse files
Fix: add label to keyring entry (#34)
1 parent f8da0aa commit ef531e7

10 files changed

Lines changed: 146 additions & 145 deletions

internal/auth/auth.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,26 +12,26 @@ import (
1212
)
1313

1414
type Auth struct {
15-
keyring Keyring
15+
tokenStorage AuthTokenStorage
1616
browserLogin LoginProvider
1717
sink output.Sink
1818
}
1919

2020
func New(sink output.Sink, platformClient api.PlatformAPI) (*Auth, error) {
21-
kr, err := newSystemKeyring()
21+
storage, err := newAuthTokenStorage()
2222
if err != nil {
2323
return nil, err
2424
}
2525
return &Auth{
26-
keyring: kr,
26+
tokenStorage: storage,
2727
browserLogin: newBrowserLogin(sink, platformClient),
2828
sink: sink,
2929
}, nil
3030
}
3131

3232
// GetToken tries in order: 1) keyring 2) LOCALSTACK_AUTH_TOKEN env var 3) browser login
3333
func (a *Auth) GetToken(ctx context.Context) (string, error) {
34-
if token, err := a.keyring.Get(keyringService, keyringUser); err == nil && token != "" {
34+
if token, err := a.tokenStorage.GetAuthToken(); err == nil && token != "" {
3535
return token, nil
3636
}
3737

@@ -46,7 +46,7 @@ func (a *Auth) GetToken(ctx context.Context) (string, error) {
4646
return "", err
4747
}
4848

49-
if err := a.keyring.Set(keyringService, keyringUser, token); err != nil {
49+
if err := a.tokenStorage.SetAuthToken(token); err != nil {
5050
output.EmitWarning(a.sink, fmt.Sprintf("could not store token in keyring: %v", err))
5151
}
5252

@@ -56,7 +56,7 @@ func (a *Auth) GetToken(ctx context.Context) (string, error) {
5656

5757
// Logout removes the stored auth token from the keyring
5858
func (a *Auth) Logout() error {
59-
err := a.keyring.Delete(keyringService, keyringUser)
59+
err := a.tokenStorage.DeleteAuthToken()
6060
if errors.Is(err, keyring.ErrKeyNotFound) {
6161
return nil
6262
}

internal/auth/auth_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ func TestMain(m *testing.M) {
2121
// we log a warning but still return the token obtained from login.
2222
func TestGetToken_ReturnsTokenWhenKeyringStoreFails(t *testing.T) {
2323
ctrl := gomock.NewController(t)
24-
mockKeyring := NewMockKeyring(ctrl)
24+
mockStorage := NewMockAuthTokenStorage(ctrl)
2525
mockLogin := NewMockLoginProvider(ctrl)
2626

2727
var events []any
@@ -30,17 +30,17 @@ func TestGetToken_ReturnsTokenWhenKeyringStoreFails(t *testing.T) {
3030
})
3131

3232
auth := &Auth{
33-
keyring: mockKeyring,
33+
tokenStorage: mockStorage,
3434
browserLogin: mockLogin,
3535
sink: sink,
3636
}
3737

3838
// Keyring returns empty (no stored token)
39-
mockKeyring.EXPECT().Get(keyringService, keyringUser).Return("", errors.New("not found"))
39+
mockStorage.EXPECT().GetAuthToken().Return("", errors.New("not found"))
4040
// Login succeeds
4141
mockLogin.EXPECT().Login(gomock.Any()).Return("test-token", nil)
4242
// Setting token in keyring fails
43-
mockKeyring.EXPECT().Set(keyringService, keyringUser, "test-token").Return(errors.New("keyring unavailable"))
43+
mockStorage.EXPECT().SetAuthToken("test-token").Return(errors.New("keyring unavailable"))
4444

4545
token, err := auth.GetToken(context.Background())
4646

internal/auth/mock_keyring_test.go

Lines changed: 0 additions & 83 deletions
This file was deleted.

internal/auth/mock_token_storage_test.go

Lines changed: 83 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package auth
22

3-
//go:generate mockgen -source=keyring.go -destination=mock_keyring_test.go -package=auth
3+
//go:generate mockgen -source=token_storage.go -destination=mock_token_storage_test.go -package=auth
44

55
import (
66
"errors"
@@ -13,31 +13,34 @@ import (
1313
)
1414

1515
const (
16-
keyringService = "localstack"
17-
keyringUser = "auth-token"
16+
keyringService = "lstk"
17+
keyringAuthTokenKey = "lstk.auth-token"
18+
keyringPassword = "lstk-keyring"
19+
keyringFilename = "keyring"
20+
keyringAuthTokenLabel = "lstk auth token"
1821
)
1922

20-
type Keyring interface {
21-
Get(service, user string) (string, error)
22-
Set(service, user, password string) error
23-
Delete(service, user string) error
23+
type AuthTokenStorage interface {
24+
GetAuthToken() (string, error)
25+
SetAuthToken(token string) error
26+
DeleteAuthToken() error
2427
}
2528

26-
type systemKeyring struct {
29+
type authTokenStorage struct {
2730
ring keyring.Keyring
2831
}
2932

30-
func newSystemKeyring() (*systemKeyring, error) {
33+
func newAuthTokenStorage() (*authTokenStorage, error) {
3134
configDir, err := config.ConfigDir()
3235
if err != nil {
3336
return nil, err
3437
}
3538

3639
keyringConfig := keyring.Config{
3740
ServiceName: keyringService,
38-
FileDir: filepath.Join(configDir, "keyring"),
41+
FileDir: filepath.Join(configDir, keyringFilename),
3942
FilePasswordFunc: func(prompt string) (string, error) {
40-
return "localstack-keyring", nil
43+
return keyringPassword, nil
4144
},
4245
}
4346

@@ -55,11 +58,11 @@ func newSystemKeyring() (*systemKeyring, error) {
5558
}
5659
}
5760

58-
return &systemKeyring{ring: ring}, nil
61+
return &authTokenStorage{ring: ring}, nil
5962
}
6063

61-
func (k *systemKeyring) Get(service, user string) (string, error) {
62-
item, err := k.ring.Get(k.makeKey(service, user))
64+
func (s *authTokenStorage) GetAuthToken() (string, error) {
65+
item, err := s.ring.Get(keyringAuthTokenKey)
6366
if err != nil {
6467
if errors.Is(err, keyring.ErrKeyNotFound) {
6568
return "", fmt.Errorf("credential not found")
@@ -69,21 +72,18 @@ func (k *systemKeyring) Get(service, user string) (string, error) {
6972
return string(item.Data), nil
7073
}
7174

72-
func (k *systemKeyring) Set(service, user, password string) error {
73-
return k.ring.Set(keyring.Item{
74-
Key: k.makeKey(service, user),
75-
Data: []byte(password),
75+
func (s *authTokenStorage) SetAuthToken(token string) error {
76+
return s.ring.Set(keyring.Item{
77+
Key: keyringAuthTokenKey,
78+
Data: []byte(token),
79+
Label: keyringAuthTokenLabel,
7680
})
7781
}
7882

79-
func (k *systemKeyring) Delete(service, user string) error {
80-
err := k.ring.Remove(k.makeKey(service, user))
83+
func (s *authTokenStorage) DeleteAuthToken() error {
84+
err := s.ring.Remove(keyringAuthTokenKey)
8185
if errors.Is(err, keyring.ErrKeyNotFound) || os.IsNotExist(err) {
8286
return nil
8387
}
8488
return err
8589
}
86-
87-
func (k *systemKeyring) makeKey(service, user string) string {
88-
return fmt.Sprintf("%s/%s", service, user)
89-
}

test/integration/login_browser_flow_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ func TestBrowserFlowStoresToken(t *testing.T) {
7070
assert.Contains(t, string(out), "Login successful")
7171

7272
// Verify token was stored in keyring
73-
storedToken, err := keyringGet(keyringService, keyringUser)
73+
storedToken, err := GetAuthTokenFromKeyring()
7474
require.NoError(t, err, "token should be stored in keyring")
7575
assert.Equal(t, "mock-token", storedToken)
7676
}

test/integration/login_device_flow_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func TestDeviceFlowSuccess(t *testing.T) {
116116
assert.Contains(t, output, "Login successful")
117117

118118
// Verify token was stored in keyring
119-
storedToken, err := keyringGet(keyringService, keyringUser)
119+
storedToken, err := GetAuthTokenFromKeyring()
120120
require.NoError(t, err)
121121
assert.Equal(t, licenseToken, storedToken)
122122

@@ -171,7 +171,7 @@ func TestDeviceFlowFailure_RequestNotConfirmed(t *testing.T) {
171171
assert.Contains(t, output, "auth request not confirmed")
172172

173173
// Verify no token was stored in keyring
174-
_, err := keyringGet(keyringService, keyringUser)
174+
_, err := GetAuthTokenFromKeyring()
175175
assert.Error(t, err, "no token should be stored when login fails")
176176

177177
case <-time.After(10 * time.Second):

0 commit comments

Comments
 (0)