template_test.go 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855
  1. /*
  2. Licensed under the Apache License, Version 2.0 (the "License");
  3. you may not use this file except in compliance with the License.
  4. You may obtain a copy of the License at
  5. http://www.apache.org/licenses/LICENSE-2.0
  6. Unless required by applicable law or agreed to in writing, software
  7. distributed under the License is distributed on an "AS IS" BASIS,
  8. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  9. See the License for the specific language governing permissions and
  10. limitations under the License.
  11. */
  12. package template
  13. import (
  14. "os"
  15. "strings"
  16. "testing"
  17. "github.com/google/go-cmp/cmp"
  18. "github.com/stretchr/testify/assert"
  19. "github.com/stretchr/testify/require"
  20. corev1 "k8s.io/api/core/v1"
  21. v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
  22. esapi "github.com/external-secrets/external-secrets/apis/externalsecrets/v1"
  23. )
  24. const (
  25. pkcs12ContentNoPass = `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`
  26. pkcs12ContentWithPass = `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`
  27. pkcs12Cert = `-----BEGIN CERTIFICATE-----
  28. MIIDHTCCAgWgAwIBAgIRAKC4yxy9QGocND+6avTf7BgwDQYJKoZIhvcNAQELBQAw
  29. EjEQMA4GA1UEChMHQWNtZSBDbzAeFw0yMTAzMjAyMDA4MDhaFw0yMTAzMjAyMDM4
  30. MDhaMBIxEDAOBgNVBAoTB0FjbWUgQ28wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw
  31. ggEKAoIBAQC3o6/JdZEqNbqNRkopHhJtJG5c4qS5d0tQ/kZYpfD/v/izAYum4Nzj
  32. aG15owr92/11W0pxPUliRLti3y6iScTs+ofm2D7p4UXj/Fnho/2xoWSOoWAodgvW
  33. Y8jh8A0LQALZiV/9QsrJdXZdS47DYZLsQ3z9yFC/CdXkg1l7AQ3fIVGKdrQBr9kE
  34. 1gEDqnKfRxXI8DEQKXr+CKPUwCAytegmy0SHp53zNAvY+kopHytzmJpXLoEhxq4e
  35. ugHe52vXHdh/HJ9VjNp0xOH1waAgAGxHlltCW0PVd5AJ0SXROBS/a3V9sZCbCrJa
  36. YOOonQSEswveSv6PcG9AHvpNPot2Xs6hAgMBAAGjbjBsMA4GA1UdDwEB/wQEAwIC
  37. pDATBgNVHSUEDDAKBggrBgEFBQcDATAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQW
  38. BBR00805mrpoonp95RmC3B6oLl+cGTAVBgNVHREEDjAMggpnb29ibGUuY29tMA0G
  39. CSqGSIb3DQEBCwUAA4IBAQAipc1b6JrEDayPjpz5GM5krcI8dCWVd8re0a9bGjjN
  40. ioWGlu/eTr5El0ffwCNZ2WLmL9rewfHf/bMvYz3ioFZJ2OTxfazqYXNggQz6cMfa
  41. lbedDCdt5XLVX2TyerGvFram+9Uyvk3l0uM7rZnwAmdirG4Tv94QRaD3q4xTj/c0
  42. mv+AggtK0aRFb9o47z/BypLdk5mhbf3Mmr88C8XBzEnfdYyf4JpTlZrYLBmDCu5d
  43. 9RLLsjXxhag8xqMtd1uLUM8XOTGzVWacw8iGY+CTtBKqyA+AE6/bDwZvEwVtsKtC
  44. QJ85ioEpy00NioqcF0WyMZH80uMsPycfpnl5uF7RkW8u
  45. -----END CERTIFICATE-----
  46. `
  47. pkcs12Key = `-----BEGIN PRIVATE KEY-----
  48. MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQC3o6/JdZEqNbqN
  49. RkopHhJtJG5c4qS5d0tQ/kZYpfD/v/izAYum4NzjaG15owr92/11W0pxPUliRLti
  50. 3y6iScTs+ofm2D7p4UXj/Fnho/2xoWSOoWAodgvWY8jh8A0LQALZiV/9QsrJdXZd
  51. S47DYZLsQ3z9yFC/CdXkg1l7AQ3fIVGKdrQBr9kE1gEDqnKfRxXI8DEQKXr+CKPU
  52. wCAytegmy0SHp53zNAvY+kopHytzmJpXLoEhxq4eugHe52vXHdh/HJ9VjNp0xOH1
  53. waAgAGxHlltCW0PVd5AJ0SXROBS/a3V9sZCbCrJaYOOonQSEswveSv6PcG9AHvpN
  54. Pot2Xs6hAgMBAAECggEACTGPrmVNZDCWa1Y2hkJ0J7SoNcw+9O4M/jwMp4l/PD6P
  55. I98S78LYLCZhPLK17SmjUcnFO1AXKW1JeFS2D/fjfP256guvcqQNjLFoioxcOhVb
  56. ZGyd1Mi8JPqP5wfOj16gBeYDwTkjz9wqldcfiZaL9XoXetkZecbzR2JwC2FtIVuC
  57. 0njTjMNYpaBKnoLb8OTR0EQz7lYEo2MkQiWryz8wseONnFmdfh18p+p10YgCbuCH
  58. qesrWfDLLxaxZelNtDhDngg9LoCLmarYy7BgShacmUEgJTZ/x3xFC75thK3ln0OY
  59. +ktTgvVotYYaZi7qAjQiEsTvkTAPg5RMpQLd2UIWsQKBgQDCBp+1vURbwGzmTNUg
  60. HMipD6WDFdLc9DCacx6+ZqsEPTMWQbCpVZrDKiY0Rjt5F+xOCyMr00J5RDJXRC0G
  61. +L7NcJdywOFutT7vB+cmETg7l/6PHweNYBnE66706eTL/KVYZMi4tEinarPWhHmL
  62. jasfdLANtpDjdWkRt299TkPRbQKBgQDyS8Rr7KZdv04Csqkf+ASmiJpT5R6Y72kc
  63. 3XYpKETyB2FyPZkuh/zInMut9SkkSI9O/jA3zf956jj6sF1DHvp7T8KkIp5OAQeD
  64. J9AF65m2MnZfHFUeJ6ZQsggwMWqrD0ycIWP7YWtiBHH+D1wGkjYrssq+bvG/yNpA
  65. LtqdKq9lhQKBgQCZA2hIhy61vRckuEsLvCdzTGeW7UsR/XGnHEqOlaEhArKbRsrv
  66. gBdA+qiOaSTV5svw8E+YbE7sG6AnuhhYeyreEYEeeoZOLJmpIG5mUwYp2UBj1nC6
  67. SaOI7OVZOGu7g09SWokBQQxbG4cgEfFY4Sym7fs5lVTGTP3Dfwppo6NQMQKBgQCo
  68. J5NDP3Lafwk58BpV+H/pv8YzUUDh7M2rXbtCpxLqUdr8OOnVlEUISWFF8m5CIyVq
  69. MhjuscWLK9Wtjba7/YTjDaDM3sW05xv6lyfU5ATCoNTr/zLHgcb4HAZ4w+L+otiN
  70. RtMnxB2NYf5mzuwUF2cG/secUEzwyAlIH/xStSwTLQKBgQCRvqF+rqxnegoOgwVW
  71. qrWPv06wXD8dW2FlPpY5GXqA0l6erSK3YsQQToRmbem9ibPD7bd5P4gNbWfxwK4C
  72. Wt+1Rcb8OrDhDJbYz85bXBnPecKp4EN0b9SHO0/dsCqn2w30emc+9T/4m1ZDkpBd
  73. BixHvI/EJ8YK3ta5WdJWKC6hnA==
  74. -----END PRIVATE KEY-----
  75. `
  76. jwkPubRSA = `{"kid":"ex","kty":"RSA","key_ops":["sign","verify","wrapKey","unwrapKey","encrypt","decrypt"],"n":"p2VQo8qCfWAZmdWBVaYuYb-a-tWWm78K6Sr9poCvNcmv8rUPSLACxitQWR8gZaSH1DklVkqz-Ed8Cdlf8lkDg4Ex5tkB64jRdC1Uvn4CDpOH6cp-N2s8hTFLqy9_YaDmyQS7HiqthOi9oVjil1VMeWfaAbClGtFt6UnKD0Vb_DvLoWYQSqlhgBArFJi966b4E1pOq5Ad02K8pHBDThlIIx7unibLehhDU6q3DCwNH_OOLx6bgNtmvGYJDd1cywpkLQ3YzNCUPWnfMBJRP3iQP_WI21uP6cvo0DqBPBM4wvVzHbCT0vnIflwkbgEWkq1FprqAitZlop9KjLqzjp9vyQ","e":"AQAB"}`
  77. jwkPubRSAPKIX = `-----BEGIN PUBLIC KEY-----
  78. MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAp2VQo8qCfWAZmdWBVaYu
  79. Yb+a+tWWm78K6Sr9poCvNcmv8rUPSLACxitQWR8gZaSH1DklVkqz+Ed8Cdlf8lkD
  80. g4Ex5tkB64jRdC1Uvn4CDpOH6cp+N2s8hTFLqy9/YaDmyQS7HiqthOi9oVjil1VM
  81. eWfaAbClGtFt6UnKD0Vb/DvLoWYQSqlhgBArFJi966b4E1pOq5Ad02K8pHBDThlI
  82. Ix7unibLehhDU6q3DCwNH/OOLx6bgNtmvGYJDd1cywpkLQ3YzNCUPWnfMBJRP3iQ
  83. P/WI21uP6cvo0DqBPBM4wvVzHbCT0vnIflwkbgEWkq1FprqAitZlop9KjLqzjp9v
  84. yQIDAQAB
  85. -----END PUBLIC KEY-----
  86. `
  87. jwkPrivRSA = `{"kty" : "RSA","kid" : "cc34c0a0-bd5a-4a3c-a50d-a2a7db7643df","use" : "sig","n" : "pjdss8ZaDfEH6K6U7GeW2nxDqR4IP049fk1fK0lndimbMMVBdPv_hSpm8T8EtBDxrUdi1OHZfMhUixGaut-3nQ4GG9nM249oxhCtxqqNvEXrmQRGqczyLxuh-fKn9Fg--hS9UpazHpfVAFnB5aCfXoNhPuI8oByyFKMKaOVgHNqP5NBEqabiLftZD3W_lsFCPGuzr4Vp0YS7zS2hDYScC2oOMu4rGU1LcMZf39p3153Cq7bS2Xh6Y-vw5pwzFYZdjQxDn8x8BG3fJ6j8TGLXQsbKH1218_HcUJRvMwdpbUQG5nvA2GXVqLqdwp054Lzk9_B_f1lVrmOKuHjTNHq48w","e" : "AQAB","d" : "ksDmucdMJXkFGZxiomNHnroOZxe8AmDLDGO1vhs-POa5PZM7mtUPonxwjVmthmpbZzla-kg55OFfO7YcXhg-Hm2OWTKwm73_rLh3JavaHjvBqsVKuorX3V3RYkSro6HyYIzFJ1Ek7sLxbjDRcDOj4ievSX0oN9l-JZhaDYlPlci5uJsoqro_YrE0PRRWVhtGynd-_aWgQv1YzkfZuMD-hJtDi1Im2humOWxA4eZrFs9eG-whXcOvaSwO4sSGbS99ecQZHM2TcdXeAs1PvjVgQ_dKnZlGN3lTWoWfQP55Z7Tgt8Nf1q4ZAKd-NlMe-7iqCFfsnFwXjSiaOa2CRGZn-Q","p" : "4A5nU4ahEww7B65yuzmGeCUUi8ikWzv1C81pSyUKvKzu8CX41hp9J6oRaLGesKImYiuVQK47FhZ--wwfpRwHvSxtNU9qXb8ewo-BvadyO1eVrIk4tNV543QlSe7pQAoJGkxCia5rfznAE3InKF4JvIlchyqs0RQ8wx7lULqwnn0","q" : "ven83GM6SfrmO-TBHbjTk6JhP_3CMsIvmSdo4KrbQNvp4vHO3w1_0zJ3URkmkYGhz2tgPlfd7v1l2I6QkIh4Bumdj6FyFZEBpxjE4MpfdNVcNINvVj87cLyTRmIcaGxmfylY7QErP8GFA-k4UoH_eQmGKGK44TRzYj5hZYGWIC8","dp" : "lmmU_AG5SGxBhJqb8wxfNXDPJjf__i92BgJT2Vp4pskBbr5PGoyV0HbfUQVMnw977RONEurkR6O6gxZUeCclGt4kQlGZ-m0_XSWx13v9t9DIbheAtgVJ2mQyVDvK4m7aRYlEceFh0PsX8vYDS5o1txgPwb3oXkPTtrmbAGMUBpE","dq" : "mxRTU3QDyR2EnCv0Nl0TCF90oliJGAHR9HJmBe__EjuCBbwHfcT8OG3hWOv8vpzokQPRl5cQt3NckzX3fs6xlJN4Ai2Hh2zduKFVQ2p-AF2p6Yfahscjtq-GY9cB85NxLy2IXCC0PF--Sq9LOrTE9QV988SJy_yUrAjcZ5MmECk","qi" : "ldHXIrEmMZVaNwGzDF9WG8sHj2mOZmQpw9yrjLK9hAsmsNr5LTyqWAqJIYZSwPTYWhY4nu2O0EY9G9uYiqewXfCKw_UngrJt8Xwfq1Zruz0YY869zPN4GiE9-9rzdZB33RBw8kIOquY3MK74FMwCihYx_LiU2YTHkaoJ3ncvtvg"}`
  88. jwkPrivRSAPKCS8 = `-----BEGIN PRIVATE KEY-----
  89. MIIEwAIBADANBgkqhkiG9w0BAQEFAASCBKowggSmAgEAAoIBAQCmN2yzxloN8Qfo
  90. rpTsZ5bafEOpHgg/Tj1+TV8rSWd2KZswxUF0+/+FKmbxPwS0EPGtR2LU4dl8yFSL
  91. EZq637edDgYb2czbj2jGEK3Gqo28ReuZBEapzPIvG6H58qf0WD76FL1SlrMel9UA
  92. WcHloJ9eg2E+4jygHLIUowpo5WAc2o/k0ESppuIt+1kPdb+WwUI8a7OvhWnRhLvN
  93. LaENhJwLag4y7isZTUtwxl/f2nfXncKrttLZeHpj6/DmnDMVhl2NDEOfzHwEbd8n
  94. qPxMYtdCxsofXbXz8dxQlG8zB2ltRAbme8DYZdWoup3CnTngvOT38H9/WVWuY4q4
  95. eNM0erjzAgMBAAECggEBAJLA5rnHTCV5BRmcYqJjR566DmcXvAJgywxjtb4bPjzm
  96. uT2TO5rVD6J8cI1ZrYZqW2c5WvpIOeThXzu2HF4YPh5tjlkysJu9/6y4dyWr2h47
  97. warFSrqK191d0WJEq6Oh8mCMxSdRJO7C8W4w0XAzo+Inr0l9KDfZfiWYWg2JT5XI
  98. ubibKKq6P2KxND0UVlYbRsp3fv2loEL9WM5H2bjA/oSbQ4tSJtobpjlsQOHmaxbP
  99. XhvsIV3Dr2ksDuLEhm0vfXnEGRzNk3HV3gLNT741YEP3Sp2ZRjd5U1qFn0D+eWe0
  100. 4LfDX9auGQCnfjZTHvu4qghX7JxcF40omjmtgkRmZ/kCgYEA4A5nU4ahEww7B65y
  101. uzmGeCUUi8ikWzv1C81pSyUKvKzu8CX41hp9J6oRaLGesKImYiuVQK47FhZ++wwf
  102. pRwHvSxtNU9qXb8ewo+BvadyO1eVrIk4tNV543QlSe7pQAoJGkxCia5rfznAE3In
  103. KF4JvIlchyqs0RQ8wx7lULqwnn0CgYEAven83GM6SfrmO+TBHbjTk6JhP/3CMsIv
  104. mSdo4KrbQNvp4vHO3w1/0zJ3URkmkYGhz2tgPlfd7v1l2I6QkIh4Bumdj6FyFZEB
  105. pxjE4MpfdNVcNINvVj87cLyTRmIcaGxmfylY7QErP8GFA+k4UoH/eQmGKGK44TRz
  106. Yj5hZYGWIC8CgYEAlmmU/AG5SGxBhJqb8wxfNXDPJjf//i92BgJT2Vp4pskBbr5P
  107. GoyV0HbfUQVMnw977RONEurkR6O6gxZUeCclGt4kQlGZ+m0/XSWx13v9t9DIbheA
  108. tgVJ2mQyVDvK4m7aRYlEceFh0PsX8vYDS5o1txgPwb3oXkPTtrmbAGMUBpECgYEA
  109. mxRTU3QDyR2EnCv0Nl0TCF90oliJGAHR9HJmBe//EjuCBbwHfcT8OG3hWOv8vpzo
  110. kQPRl5cQt3NckzX3fs6xlJN4Ai2Hh2zduKFVQ2p+AF2p6Yfahscjtq+GY9cB85Nx
  111. Ly2IXCC0PF++Sq9LOrTE9QV988SJy/yUrAjcZ5MmECkCgYEAldHXIrEmMZVaNwGz
  112. DF9WG8sHj2mOZmQpw9yrjLK9hAsmsNr5LTyqWAqJIYZSwPTYWhY4nu2O0EY9G9uY
  113. iqewXfCKw/UngrJt8Xwfq1Zruz0YY869zPN4GiE9+9rzdZB33RBw8kIOquY3MK74
  114. FMwCihYx/LiU2YTHkaoJ3ncvtvg=
  115. -----END PRIVATE KEY-----
  116. `
  117. jwkPubEC = `{"kid":"https://kv-test-mj.vault.azure.net/keys/ec-p-521/e3d0e9c179b54988860c69c6ae172c65","kty":"EC","key_ops":["sign","verify"],"crv":"P-521","x":"AedOAtb7H7Oz1C_cPKI_R4CN_eai5nteY6KFW07FOoaqgQfVCSkQDK22fCOiMT_28c8LZYJRsiIFz_IIbQUW7bXj","y":"AOnchHnmBphIWXvanmMAmcCDkaED6ycW8GsAl9fQ43BMVZTqcTkJYn6vGnhn7MObizmkNSmgZYTwG-vZkIg03HHs"}`
  118. jwkPubECPKIX = `-----BEGIN PUBLIC KEY-----
  119. MIGbMBAGByqGSM49AgEGBSuBBAAjA4GGAAQB504C1vsfs7PUL9w8oj9HgI395qLm
  120. e15jooVbTsU6hqqBB9UJKRAMrbZ8I6IxP/bxzwtlglGyIgXP8ghtBRbtteMA6dyE
  121. eeYGmEhZe9qeYwCZwIORoQPrJxbwawCX19DjcExVlOpxOQlifq8aeGfsw5uLOaQ1
  122. KaBlhPAb69mQiDTccew=
  123. -----END PUBLIC KEY-----
  124. `
  125. jwkPrivEC = `{"kty": "EC","kid": "rie3pHe8u8gjSa0IaJfqk7_iEfHeYfDYx-Bqi7vQc0s","crv": "P-256","x": "fDjg3Nq4jPf8IOZ0277aPVal_8iXySnzLUJAZghUzZM","y": "d863PeyBOK_Q4duiSmWwgIRzi1RPlFZTR-vACMlPg-Q","d": "jJs5xsoHUetdMabtt8H2KyX5T92nGul1chFeMT5hlr0"}`
  126. jwkPrivECPKCS8 = `-----BEGIN PRIVATE KEY-----
  127. MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgjJs5xsoHUetdMabt
  128. t8H2KyX5T92nGul1chFeMT5hlr2hRANCAAR8OODc2riM9/wg5nTbvto9VqX/yJfJ
  129. KfMtQkBmCFTNk3fOtz3sgTiv0OHbokplsICEc4tUT5RWU0frwAjJT4Pk
  130. -----END PRIVATE KEY-----
  131. `
  132. )
  133. func TestExecute(t *testing.T) {
  134. tbl := []struct {
  135. name string
  136. tpl map[string][]byte
  137. labelsTpl map[string][]byte
  138. annotationsTpl map[string][]byte
  139. stringDataTpl map[string][]byte
  140. data map[string][]byte
  141. expectedData map[string][]byte
  142. expectedStringData map[string]string
  143. expectedLabels map[string]string
  144. expectedAnnotations map[string]string
  145. leftDelimiter string
  146. rightDelimiter string
  147. expErr string
  148. expLblErr string
  149. expAnnoErr string
  150. expStrErr string
  151. }{
  152. {
  153. name: "test empty",
  154. tpl: nil,
  155. labelsTpl: nil,
  156. annotationsTpl: nil,
  157. data: nil,
  158. },
  159. {
  160. name: "b64dec func",
  161. tpl: map[string][]byte{
  162. "foo": []byte("{{ .secret | b64dec }}"),
  163. },
  164. data: map[string][]byte{
  165. "secret": []byte("MTIzNA=="),
  166. },
  167. expectedData: map[string][]byte{
  168. "foo": []byte("1234"),
  169. },
  170. },
  171. {
  172. name: "fromJson func",
  173. tpl: map[string][]byte{
  174. "foo": []byte("{{ $var := .secret | fromJson }}{{ $var.foo }}"),
  175. },
  176. data: map[string][]byte{
  177. "secret": []byte(`{"foo": "bar"}`),
  178. },
  179. expectedData: map[string][]byte{
  180. "foo": []byte("bar"),
  181. },
  182. },
  183. {
  184. name: "from & toJson func",
  185. tpl: map[string][]byte{
  186. "foo": []byte("{{ $var := .secret | fromJson }}{{ $var.foo | toJson }}"),
  187. },
  188. data: map[string][]byte{
  189. "secret": []byte(`{"foo": {"baz":"bang"}}`),
  190. },
  191. expectedData: map[string][]byte{
  192. "foo": []byte(`{"baz":"bang"}`),
  193. },
  194. },
  195. {
  196. name: "fromJson & toYaml func",
  197. tpl: map[string][]byte{
  198. "foo": []byte("{{ $var := .secret | fromJson | toYaml }}{{ $var }}"),
  199. },
  200. data: map[string][]byte{
  201. "secret": []byte(`{"foo": "bar"}`),
  202. },
  203. expectedData: map[string][]byte{
  204. "foo": []byte(`foo: bar`),
  205. },
  206. },
  207. {
  208. name: "fromYaml & toJson func",
  209. tpl: map[string][]byte{
  210. "foo": []byte("{{ $var := .secret | fromYaml | toJson }}{{ $var }}"),
  211. },
  212. data: map[string][]byte{
  213. "secret": []byte(`foo: bar`),
  214. },
  215. expectedData: map[string][]byte{
  216. "foo": []byte(`{"foo":"bar"}`),
  217. },
  218. },
  219. {
  220. name: "use sprig functions",
  221. tpl: map[string][]byte{
  222. "foo": []byte(`{{ .path | ext }}`),
  223. },
  224. data: map[string][]byte{
  225. "path": []byte(`foo/bar/baz.exe`),
  226. },
  227. expectedData: map[string][]byte{
  228. "foo": []byte(`.exe`),
  229. },
  230. },
  231. {
  232. name: "use replace function",
  233. tpl: map[string][]byte{
  234. "foo": []byte(`{{ .conn | replace "postgres://" "db+postgresql://"}}`),
  235. },
  236. data: map[string][]byte{
  237. "conn": []byte(`postgres://user:pass@db.host:5432/dbname`),
  238. },
  239. expectedData: map[string][]byte{
  240. "foo": []byte(`db+postgresql://user:pass@db.host:5432/dbname`),
  241. },
  242. },
  243. {
  244. name: "use upper function",
  245. tpl: map[string][]byte{
  246. "foo": []byte(`{{ .value | upper }}`),
  247. },
  248. data: map[string][]byte{
  249. "value": []byte(`username`),
  250. },
  251. expectedData: map[string][]byte{
  252. "foo": []byte(`USERNAME`),
  253. },
  254. },
  255. {
  256. name: "multiline template",
  257. tpl: map[string][]byte{
  258. "cfg": []byte(`
  259. datasources:
  260. - name: Graphite
  261. type: graphite
  262. access: proxy
  263. url: http://localhost:8080
  264. password: "{{ .password }}"
  265. user: "{{ .user }}"`),
  266. },
  267. data: map[string][]byte{
  268. "user": []byte(`foobert`),
  269. "password": []byte("harharhar"),
  270. },
  271. expectedData: map[string][]byte{
  272. "cfg": []byte(`
  273. datasources:
  274. - name: Graphite
  275. type: graphite
  276. access: proxy
  277. url: http://localhost:8080
  278. password: "harharhar"
  279. user: "foobert"`),
  280. },
  281. },
  282. {
  283. name: "base64 pipeline",
  284. tpl: map[string][]byte{
  285. "foo": []byte(`{{ "123412341234" | b64enc | b64dec }}`),
  286. },
  287. data: map[string][]byte{},
  288. expectedData: map[string][]byte{
  289. "foo": []byte("123412341234"),
  290. },
  291. },
  292. {
  293. name: "base64 pkcs12 extract",
  294. tpl: map[string][]byte{
  295. "key": []byte(`{{ .secret | b64dec | pkcs12key }}`),
  296. "cert": []byte(`{{ .secret | b64dec | pkcs12cert }}`),
  297. },
  298. data: map[string][]byte{
  299. "secret": []byte(pkcs12ContentNoPass),
  300. },
  301. expectedData: map[string][]byte{
  302. "key": []byte(pkcs12Key),
  303. "cert": []byte(pkcs12Cert),
  304. },
  305. },
  306. {
  307. name: "base64 pkcs12 extract with password",
  308. tpl: map[string][]byte{
  309. "key": []byte(`{{ .secret | b64dec | pkcs12keyPass "123456" }}`),
  310. "cert": []byte(`{{ .secret | b64dec | pkcs12certPass "123456" }}`),
  311. },
  312. data: map[string][]byte{
  313. "secret": []byte(pkcs12ContentWithPass),
  314. },
  315. expectedData: map[string][]byte{
  316. "key": []byte(pkcs12Key),
  317. "cert": []byte(pkcs12Cert),
  318. },
  319. },
  320. {
  321. name: "base64 decode error",
  322. tpl: map[string][]byte{
  323. "key": []byte(`{{ .example | b64dec }}`),
  324. },
  325. data: map[string][]byte{
  326. "example": []byte("iam_no_base64"),
  327. },
  328. expErr: "", // silent error
  329. },
  330. {
  331. name: "pkcs12 key wrong password",
  332. tpl: map[string][]byte{
  333. "key": []byte(`{{ .secret | b64dec | pkcs12keyPass "wrong" }}`),
  334. },
  335. data: map[string][]byte{
  336. "secret": []byte(pkcs12ContentWithPass),
  337. },
  338. expErr: "unable to decode pkcs12",
  339. },
  340. {
  341. name: "pkcs12 cert wrong password",
  342. tpl: map[string][]byte{
  343. "cert": []byte(`{{ .secret | b64dec | pkcs12certPass "wrong" }}`),
  344. },
  345. data: map[string][]byte{
  346. "secret": []byte(pkcs12ContentWithPass),
  347. },
  348. expErr: "unable to decode pkcs12",
  349. },
  350. {
  351. name: "fromJson error",
  352. tpl: map[string][]byte{
  353. "key": []byte(`{{ "{ # no json # }" | fromJson }}`),
  354. },
  355. data: map[string][]byte{},
  356. expErr: "", // silent error
  357. },
  358. {
  359. name: "template syntax error",
  360. tpl: map[string][]byte{
  361. "key": []byte(`{{ #xx }}`),
  362. },
  363. data: map[string][]byte{},
  364. expErr: "unable to parse template",
  365. },
  366. {
  367. name: "unknown key error",
  368. tpl: map[string][]byte{
  369. "key": []byte(`{{ .unknown }}`),
  370. },
  371. data: map[string][]byte{},
  372. expErr: "unable to execute template at key key",
  373. },
  374. {
  375. name: "jwk rsa pub pem",
  376. tpl: map[string][]byte{
  377. "fn": []byte(`{{ .secret | jwkPublicKeyPem }}`),
  378. },
  379. data: map[string][]byte{
  380. "secret": []byte(jwkPubRSA),
  381. },
  382. expectedData: map[string][]byte{
  383. "fn": []byte(jwkPubRSAPKIX),
  384. },
  385. },
  386. {
  387. name: "jwk rsa priv pem",
  388. tpl: map[string][]byte{
  389. "fn": []byte(`{{ .secret | jwkPrivateKeyPem }}`),
  390. },
  391. data: map[string][]byte{
  392. "secret": []byte(jwkPrivRSA),
  393. },
  394. expectedData: map[string][]byte{
  395. "fn": []byte(jwkPrivRSAPKCS8),
  396. },
  397. },
  398. {
  399. name: "jwk ecdsa pub pem",
  400. tpl: map[string][]byte{
  401. "fn": []byte(`{{ .secret | jwkPublicKeyPem }}`),
  402. },
  403. data: map[string][]byte{
  404. "secret": []byte(jwkPubEC),
  405. },
  406. expectedData: map[string][]byte{
  407. "fn": []byte(jwkPubECPKIX),
  408. },
  409. },
  410. {
  411. name: "jwk ecdsa priv pem",
  412. tpl: map[string][]byte{
  413. "fn": []byte(`{{ .secret | jwkPrivateKeyPem }}`),
  414. },
  415. data: map[string][]byte{
  416. "secret": []byte(jwkPrivEC),
  417. },
  418. expectedData: map[string][]byte{
  419. "fn": []byte(jwkPrivECPKCS8),
  420. },
  421. },
  422. {
  423. name: "filter pem certificate",
  424. tpl: map[string][]byte{
  425. "fn": []byte(`{{ .secret | filterPEM "CERTIFICATE" }}`),
  426. },
  427. data: map[string][]byte{
  428. "secret": []byte(jwkPrivRSAPKCS8 + pkcs12Cert),
  429. },
  430. expectedData: map[string][]byte{
  431. "fn": []byte(pkcs12Cert),
  432. },
  433. },
  434. {
  435. name: "labels",
  436. tpl: map[string][]byte{
  437. "foo": []byte("{{ .secret | b64dec }}"),
  438. },
  439. labelsTpl: map[string][]byte{
  440. "bar": []byte("{{ .env | b64dec }}"),
  441. },
  442. data: map[string][]byte{
  443. "secret": []byte("MTIzNA=="),
  444. "env": []byte("ZGV2"),
  445. },
  446. expectedData: map[string][]byte{
  447. "foo": []byte("1234"),
  448. },
  449. expectedLabels: map[string]string{
  450. "bar": "dev",
  451. },
  452. },
  453. {
  454. name: "annotations",
  455. tpl: map[string][]byte{
  456. "foo": []byte("{{ .secret | b64dec }}"),
  457. },
  458. annotationsTpl: map[string][]byte{
  459. "bar": []byte("{{ .env | b64dec }}"),
  460. },
  461. data: map[string][]byte{
  462. "secret": []byte("MTIzNA=="),
  463. "env": []byte("ZGV2"),
  464. },
  465. expectedData: map[string][]byte{
  466. "foo": []byte("1234"),
  467. },
  468. expectedAnnotations: map[string]string{
  469. "bar": "dev",
  470. },
  471. },
  472. {
  473. name: "stringData",
  474. stringDataTpl: map[string][]byte{
  475. "foo": []byte("{{ .secret | b64dec }}"),
  476. },
  477. data: map[string][]byte{
  478. "secret": []byte("MTIzNA=="),
  479. "env": []byte("ZGV2"),
  480. },
  481. expectedStringData: map[string]string{
  482. "foo": "1234",
  483. },
  484. },
  485. {
  486. name: "NonStandardDelimiters",
  487. stringDataTpl: map[string][]byte{
  488. "foo": []byte("<< .secret | b64dec >>"),
  489. },
  490. leftDelimiter: "<<",
  491. rightDelimiter: ">>",
  492. data: map[string][]byte{
  493. "secret": []byte("MTIzNA=="),
  494. "env": []byte("ZGV2"),
  495. },
  496. expectedStringData: map[string]string{
  497. "foo": "1234",
  498. },
  499. },
  500. }
  501. for i := range tbl {
  502. row := tbl[i]
  503. t.Run(row.name, func(t *testing.T) {
  504. sec := &corev1.Secret{
  505. Data: make(map[string][]byte),
  506. StringData: make(map[string]string),
  507. ObjectMeta: v1.ObjectMeta{Labels: make(map[string]string), Annotations: make(map[string]string)},
  508. }
  509. oldLeftDelim := leftDelim
  510. oldRightDelim := rightDelim
  511. if row.leftDelimiter != "" {
  512. leftDelim = row.leftDelimiter
  513. }
  514. if row.rightDelimiter != "" {
  515. rightDelim = row.rightDelimiter
  516. }
  517. defer func() {
  518. leftDelim = oldLeftDelim
  519. rightDelim = oldRightDelim
  520. }()
  521. err := Execute(row.tpl, row.data, esapi.TemplateScopeValues, esapi.TemplateTargetData, sec)
  522. if !ErrorContains(err, row.expErr) {
  523. t.Errorf("unexpected error: %s, expected: %s", err, row.expErr)
  524. }
  525. err = Execute(row.labelsTpl, row.data, esapi.TemplateScopeValues, esapi.TemplateTargetLabels, sec)
  526. if !ErrorContains(err, row.expLblErr) {
  527. t.Errorf("unexpected error: %s, expected: %s", err, row.expErr)
  528. }
  529. err = Execute(row.annotationsTpl, row.data, esapi.TemplateScopeValues, esapi.TemplateTargetAnnotations, sec)
  530. if !ErrorContains(err, row.expAnnoErr) {
  531. t.Errorf("unexpected error: %s, expected: %s", err, row.expErr)
  532. }
  533. if row.expectedData != nil {
  534. assert.EqualValues(t, row.expectedData, sec.Data)
  535. }
  536. if row.expectedLabels != nil {
  537. assert.EqualValues(t, row.expectedLabels, sec.ObjectMeta.Labels)
  538. }
  539. if row.expectedAnnotations != nil {
  540. assert.EqualValues(t, row.expectedAnnotations, sec.ObjectMeta.Annotations)
  541. }
  542. })
  543. }
  544. }
  545. func TestScopeValuesWithSecretFieldsNil(t *testing.T) {
  546. tbl := []struct {
  547. name string
  548. tpl map[string][]byte
  549. target esapi.TemplateTarget
  550. data map[string][]byte
  551. expectedData map[string][]byte
  552. expectedStringData map[string]string
  553. expErr string
  554. }{
  555. {
  556. name: "test empty",
  557. tpl: map[string][]byte{},
  558. target: esapi.TemplateTargetData,
  559. data: nil,
  560. },
  561. {
  562. name: "test byte",
  563. tpl: map[string][]byte{"foo": []byte("bar")},
  564. target: esapi.TemplateTargetData,
  565. data: map[string][]byte{
  566. "key": []byte("foo"),
  567. "value": []byte("bar"),
  568. },
  569. expectedData: map[string][]byte{
  570. "foo": []byte("bar"),
  571. },
  572. },
  573. {
  574. name: "test Annotations",
  575. tpl: map[string][]byte{"foo": []byte("bar")},
  576. target: esapi.TemplateTargetAnnotations,
  577. data: map[string][]byte{
  578. "key": []byte("foo"),
  579. "value": []byte("bar"),
  580. },
  581. expectedStringData: map[string]string{
  582. "foo": "bar",
  583. },
  584. },
  585. {
  586. name: "test Labels",
  587. tpl: map[string][]byte{"foo": []byte("bar")},
  588. target: esapi.TemplateTargetLabels,
  589. data: map[string][]byte{
  590. "key": []byte("foo"),
  591. "value": []byte("bar"),
  592. },
  593. expectedStringData: map[string]string{
  594. "foo": "bar",
  595. },
  596. },
  597. }
  598. for i := range tbl {
  599. row := tbl[i]
  600. t.Run(row.name, func(t *testing.T) {
  601. sec := &corev1.Secret{}
  602. err := Execute(row.tpl, row.data, esapi.TemplateScopeValues, row.target, sec)
  603. if !ErrorContains(err, row.expErr) {
  604. t.Errorf("unexpected error: %s, expected: %s", err, row.expErr)
  605. }
  606. switch row.target {
  607. case esapi.TemplateTargetData:
  608. if row.expectedData != nil {
  609. assert.EqualValues(t, row.expectedData, sec.Data)
  610. }
  611. case esapi.TemplateTargetLabels:
  612. if row.expectedStringData != nil {
  613. assert.EqualValues(t, row.expectedStringData, sec.Labels)
  614. }
  615. case esapi.TemplateTargetAnnotations:
  616. if row.expectedStringData != nil {
  617. assert.EqualValues(t, row.expectedStringData, sec.Annotations)
  618. }
  619. }
  620. })
  621. }
  622. }
  623. func TestExecuteInvalidTemplateScope(t *testing.T) {
  624. sec := &corev1.Secret{}
  625. err := Execute(map[string][]byte{"foo": []byte("bar")}, nil, "invalid", esapi.TemplateTargetData, sec)
  626. require.Error(t, err)
  627. assert.ErrorContains(t, err, "expected 'Values' or 'KeysAndValues'")
  628. }
  629. func TestScopeKeysAndValues(t *testing.T) {
  630. tbl := []struct {
  631. name string
  632. tpl map[string][]byte
  633. target esapi.TemplateTarget
  634. data map[string][]byte
  635. expectedData map[string][]byte
  636. expectedStringData map[string]string
  637. expErr string
  638. }{
  639. {
  640. name: "test empty",
  641. tpl: map[string][]byte{"literal": []byte("")},
  642. target: "Data",
  643. data: nil,
  644. },
  645. {
  646. name: "test base64",
  647. tpl: map[string][]byte{"literal": []byte("{{ .key }}: {{ .value }}")},
  648. target: esapi.TemplateTargetData,
  649. data: map[string][]byte{
  650. "key": []byte("foo"),
  651. "value": []byte("bar"),
  652. },
  653. expectedData: map[string][]byte{
  654. "foo": []byte("bar"),
  655. },
  656. },
  657. {
  658. name: "test Annotations",
  659. tpl: map[string][]byte{"literal": []byte("{{ .key }}: {{ .value }}")},
  660. target: esapi.TemplateTargetAnnotations,
  661. data: map[string][]byte{
  662. "key": []byte("foo"),
  663. "value": []byte("bar"),
  664. },
  665. expectedStringData: map[string]string{
  666. "foo": "bar",
  667. },
  668. },
  669. {
  670. name: "test Labels",
  671. tpl: map[string][]byte{"literal": []byte("{{ .key }}: {{ .value }}")},
  672. target: esapi.TemplateTargetLabels,
  673. data: map[string][]byte{
  674. "key": []byte("foo"),
  675. "value": []byte("bar"),
  676. },
  677. expectedStringData: map[string]string{
  678. "foo": "bar",
  679. },
  680. },
  681. }
  682. for i := range tbl {
  683. row := tbl[i]
  684. t.Run(row.name, func(t *testing.T) {
  685. sec := &corev1.Secret{
  686. Data: make(map[string][]byte),
  687. StringData: make(map[string]string),
  688. ObjectMeta: v1.ObjectMeta{Labels: make(map[string]string), Annotations: make(map[string]string)},
  689. }
  690. err := Execute(row.tpl, row.data, esapi.TemplateScopeKeysAndValues, row.target, sec)
  691. if !ErrorContains(err, row.expErr) {
  692. t.Errorf("unexpected error: %s, expected: %s", err, row.expErr)
  693. }
  694. switch row.target {
  695. case esapi.TemplateTargetData:
  696. if row.expectedData != nil {
  697. assert.EqualValues(t, row.expectedData, sec.Data)
  698. }
  699. case esapi.TemplateTargetLabels:
  700. if row.expectedStringData != nil {
  701. assert.EqualValues(t, row.expectedStringData, sec.Labels)
  702. }
  703. case esapi.TemplateTargetAnnotations:
  704. if row.expectedStringData != nil {
  705. assert.EqualValues(t, row.expectedStringData, sec.Annotations)
  706. }
  707. }
  708. })
  709. }
  710. }
  711. func ErrorContains(out error, want string) bool {
  712. if out == nil {
  713. return want == ""
  714. }
  715. if want == "" {
  716. return false
  717. }
  718. return strings.Contains(out.Error(), want)
  719. }
  720. func TestPkcs12certPass(t *testing.T) {
  721. const (
  722. leafCertPath = "_testdata/foo.crt"
  723. intermediateCertPath = "_testdata/intermediate-ca.crt"
  724. rootCertPath = "_testdata/root-ca.crt"
  725. disjunctCertPath = "_testdata/disjunct-root-ca.crt"
  726. )
  727. type args struct {
  728. pass string
  729. filename string
  730. }
  731. type testCase struct {
  732. name string
  733. args args
  734. want []string
  735. wantErr bool
  736. }
  737. tests := []testCase{
  738. {
  739. // this case expects the whole chain to be stored
  740. // in a single bag.
  741. // bag(1): leaf/root/intermediate cert
  742. // bag(2): private key
  743. name: "read file without password",
  744. args: args{
  745. pass: "",
  746. filename: "_testdata/foo-nopass.pfx",
  747. },
  748. want: []string{
  749. // this order is important
  750. leafCertPath,
  751. intermediateCertPath,
  752. rootCertPath,
  753. },
  754. },
  755. {
  756. // same as above but with password
  757. name: "read file with password",
  758. args: args{
  759. pass: "1234",
  760. filename: "_testdata/foo-withpass-1234.pfx",
  761. },
  762. want: []string{
  763. // this order is important
  764. leafCertPath,
  765. intermediateCertPath,
  766. rootCertPath,
  767. },
  768. },
  769. {
  770. // cert chain may be stored in different bags
  771. // this test case uses a pfx that has the following structure:
  772. // bag(1): leaf certificate
  773. // bag(2): root + intermediate cert
  774. // bag(3): private key
  775. name: "read multibag cert chain",
  776. args: args{
  777. pass: "",
  778. filename: "_testdata/foo-multibag-nopass.pfx",
  779. },
  780. want: []string{
  781. // this order is important
  782. leafCertPath,
  783. intermediateCertPath,
  784. rootCertPath,
  785. },
  786. },
  787. {
  788. // cert chain may contain a disjunct cert
  789. // bag(1): leaf/root/intermediate/disjunct
  790. // bag(2): private key
  791. name: "read disjunct cert chain",
  792. args: args{
  793. pass: "",
  794. filename: "_testdata/foo-disjunct-nopass.pfx",
  795. },
  796. want: []string{
  797. // this order is important
  798. leafCertPath,
  799. rootCertPath,
  800. intermediateCertPath,
  801. disjunctCertPath,
  802. },
  803. },
  804. {
  805. name: "read file wrong password",
  806. args: args{
  807. pass: "wrongpass",
  808. filename: "_testdata/foo-withpass-1234.pfx",
  809. },
  810. wantErr: true,
  811. },
  812. }
  813. testFunc := func(t *testing.T, tc testCase) {
  814. archive, err := os.ReadFile(tc.args.filename)
  815. if err != nil {
  816. t.Error(err)
  817. }
  818. var expOut []byte
  819. for _, w := range tc.want {
  820. c, err := os.ReadFile(w)
  821. if err != nil {
  822. t.Error(err)
  823. }
  824. expOut = append(expOut, c...)
  825. }
  826. got, err := pkcs12certPass(tc.args.pass, string(archive))
  827. if (err != nil) != tc.wantErr {
  828. t.Errorf("pkcs12certPass() error = %v, wantErr %v", err, tc.wantErr)
  829. return
  830. }
  831. if diff := cmp.Diff(string(expOut), got); diff != "" {
  832. t.Errorf("pkcs12certPass() = diff:\n%s", diff)
  833. }
  834. }
  835. for _, tt := range tests {
  836. t.Run(tt.name, func(t *testing.T) {
  837. testFunc(t, tt)
  838. })
  839. }
  840. }