template_test.go 33 KB

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