api_key_legacy_compat_test.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package repository
  2. import (
  3. "context"
  4. "testing"
  5. "github.com/Wei-Shaw/sub2api/internal/service"
  6. "github.com/stretchr/testify/require"
  7. )
  8. func TestLegacyAPIKeyLookupAndInvalidationHandle(t *testing.T) {
  9. repo, client := newAPIKeyRepoSQLite(t)
  10. ctx := context.Background()
  11. user := mustCreateAPIKeyRepoUser(t, ctx, client, "legacy-key@test.invalid")
  12. const raw = "sk-legacy-kept-by-client"
  13. digest := legacyAPIKeyDigest(raw)
  14. row, err := client.APIKey.Create().SetUserID(user.ID).SetName("Legacy").SetKeyHash(digest).SetKeyPrefix("sk-legac").Save(ctx)
  15. require.NoError(t, err)
  16. got, err := repo.GetByKeyForAuth(ctx, raw)
  17. require.NoError(t, err)
  18. require.Equal(t, row.ID, got.ID)
  19. stored, err := repo.GetByID(ctx, row.ID)
  20. require.NoError(t, err)
  21. require.Empty(t, stored.Key, "a hash cannot recover the original key")
  22. require.Equal(t, digest, stored.KeyHash)
  23. handle, owner, err := repo.GetKeyAndOwnerID(ctx, row.ID)
  24. require.NoError(t, err)
  25. require.Equal(t, user.ID, owner)
  26. require.Equal(t, stored.AuthCacheInvalidationKey(), handle)
  27. keys, err := repo.ListKeysByUserID(ctx, user.ID)
  28. require.NoError(t, err)
  29. require.Contains(t, keys, handle)
  30. _, err = repo.GetByKeyForAuth(ctx, handle)
  31. require.ErrorIs(t, err, service.ErrAPIKeyNotFound, "invalidation handles must never authenticate")
  32. fresh := &service.APIKey{UserID: user.ID, Name: "Fresh", Key: "sk-fresh-plain-key", Status: service.StatusActive}
  33. require.NoError(t, repo.Create(ctx, fresh))
  34. freshRead, err := repo.GetByID(ctx, fresh.ID)
  35. require.NoError(t, err)
  36. require.Equal(t, fresh.Key, freshRead.Key)
  37. require.Empty(t, freshRead.KeyHash, "new keys must keep the official storage path")
  38. }