origin_cert_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package credentials
  2. import (
  3. "fmt"
  4. "io/fs"
  5. "os"
  6. "path/filepath"
  7. "testing"
  8. "github.com/rs/zerolog"
  9. "github.com/stretchr/testify/assert"
  10. "github.com/stretchr/testify/require"
  11. )
  12. const (
  13. originCertFile = "cert.pem"
  14. )
  15. var nopLog = zerolog.Nop().With().Logger()
  16. func TestLoadOriginCert(t *testing.T) {
  17. cert, err := decodeOriginCert([]byte{})
  18. assert.Equal(t, fmt.Errorf("cannot decode empty certificate"), err)
  19. assert.Nil(t, cert)
  20. blocks, err := os.ReadFile("test-cert-unknown-block.pem")
  21. require.NoError(t, err)
  22. cert, err = decodeOriginCert(blocks)
  23. assert.Equal(t, fmt.Errorf("unknown block RSA PRIVATE KEY in the certificate"), err)
  24. assert.Nil(t, cert)
  25. }
  26. func TestJSONArgoTunnelTokenEmpty(t *testing.T) {
  27. blocks, err := os.ReadFile("test-cert-no-token.pem")
  28. require.NoError(t, err)
  29. cert, err := decodeOriginCert(blocks)
  30. assert.Equal(t, fmt.Errorf("missing token in the certificate"), err)
  31. assert.Nil(t, cert)
  32. }
  33. func TestJSONArgoTunnelToken(t *testing.T) {
  34. // The given cert's Argo Tunnel Token was generated by base64 encoding this JSON:
  35. // {
  36. // "zoneID": "7b0a4d77dfb881c1a3b7d61ea9443e19",
  37. // "apiToken": "test-service-key",
  38. // "accountID": "abcdabcdabcdabcd1234567890abcdef"
  39. // }
  40. CloudflareTunnelTokenTest(t, "test-cloudflare-tunnel-cert-json.pem")
  41. }
  42. func CloudflareTunnelTokenTest(t *testing.T, path string) {
  43. blocks, err := os.ReadFile(path)
  44. require.NoError(t, err)
  45. cert, err := decodeOriginCert(blocks)
  46. require.NoError(t, err)
  47. assert.NotNil(t, cert)
  48. assert.Equal(t, "7b0a4d77dfb881c1a3b7d61ea9443e19", cert.ZoneID)
  49. key := "test-service-key"
  50. assert.Equal(t, key, cert.APIToken)
  51. }
  52. func TestFindOriginCert_Valid(t *testing.T) {
  53. file, err := os.ReadFile("test-cloudflare-tunnel-cert-json.pem")
  54. require.NoError(t, err)
  55. dir := t.TempDir()
  56. certPath := filepath.Join(dir, originCertFile)
  57. _ = os.WriteFile(certPath, file, fs.ModePerm)
  58. path, err := FindOriginCert(certPath, &nopLog)
  59. require.NoError(t, err)
  60. require.Equal(t, certPath, path)
  61. }
  62. func TestFindOriginCert_Missing(t *testing.T) {
  63. dir := t.TempDir()
  64. certPath := filepath.Join(dir, originCertFile)
  65. _, err := FindOriginCert(certPath, &nopLog)
  66. require.Error(t, err)
  67. }
  68. func TestEncodeDecodeOriginCert(t *testing.T) {
  69. cert := OriginCert{
  70. ZoneID: "zone",
  71. AccountID: "account",
  72. APIToken: "token",
  73. Endpoint: "FED",
  74. }
  75. blocks, err := cert.EncodeOriginCert()
  76. require.NoError(t, err)
  77. decodedCert, err := DecodeOriginCert(blocks)
  78. require.NoError(t, err)
  79. assert.NotNil(t, cert)
  80. assert.Equal(t, "zone", decodedCert.ZoneID)
  81. assert.Equal(t, "account", decodedCert.AccountID)
  82. assert.Equal(t, "token", decodedCert.APIToken)
  83. assert.Equal(t, FedEndpoint, decodedCert.Endpoint)
  84. }
  85. func TestEncodeDecodeNilOriginCert(t *testing.T) {
  86. var cert *OriginCert
  87. blocks, err := cert.EncodeOriginCert()
  88. assert.Equal(t, fmt.Errorf("originCert cannot be nil"), err)
  89. require.Nil(t, blocks)
  90. }