| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- package repository
- import (
- "context"
- "testing"
- "github.com/Wei-Shaw/sub2api/internal/service"
- "github.com/stretchr/testify/require"
- )
- func TestLegacyAPIKeyLookupAndInvalidationHandle(t *testing.T) {
- repo, client := newAPIKeyRepoSQLite(t)
- ctx := context.Background()
- user := mustCreateAPIKeyRepoUser(t, ctx, client, "legacy-key@test.invalid")
- const raw = "sk-legacy-kept-by-client"
- digest := legacyAPIKeyDigest(raw)
- row, err := client.APIKey.Create().SetUserID(user.ID).SetName("Legacy").SetKeyHash(digest).SetKeyPrefix("sk-legac").Save(ctx)
- require.NoError(t, err)
- got, err := repo.GetByKeyForAuth(ctx, raw)
- require.NoError(t, err)
- require.Equal(t, row.ID, got.ID)
- stored, err := repo.GetByID(ctx, row.ID)
- require.NoError(t, err)
- require.Empty(t, stored.Key, "a hash cannot recover the original key")
- require.Equal(t, digest, stored.KeyHash)
- handle, owner, err := repo.GetKeyAndOwnerID(ctx, row.ID)
- require.NoError(t, err)
- require.Equal(t, user.ID, owner)
- require.Equal(t, stored.AuthCacheInvalidationKey(), handle)
- keys, err := repo.ListKeysByUserID(ctx, user.ID)
- require.NoError(t, err)
- require.Contains(t, keys, handle)
- _, err = repo.GetByKeyForAuth(ctx, handle)
- require.ErrorIs(t, err, service.ErrAPIKeyNotFound, "invalidation handles must never authenticate")
- fresh := &service.APIKey{UserID: user.ID, Name: "Fresh", Key: "sk-fresh-plain-key", Status: service.StatusActive}
- require.NoError(t, repo.Create(ctx, fresh))
- freshRead, err := repo.GetByID(ctx, fresh.ID)
- require.NoError(t, err)
- require.Equal(t, fresh.Key, freshRead.Key)
- require.Empty(t, freshRead.KeyHash, "new keys must keep the official storage path")
- }
|