provider_test.go 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343
  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 implieclient.
  9. See the License for the specific language governing permissions and
  10. limitations under the License.
  11. */
  12. package beyondtrust
  13. import (
  14. "context"
  15. "net/http"
  16. "net/http/httptest"
  17. "testing"
  18. "github.com/stretchr/testify/assert"
  19. "k8s.io/client-go/tools/clientcmd"
  20. clientcmdapi "k8s.io/client-go/tools/clientcmd/api"
  21. kubeclient "sigs.k8s.io/controller-runtime/pkg/client"
  22. esv1beta1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1beta1"
  23. )
  24. const (
  25. errTestCase = "Test case Failed"
  26. fakeAPIURL = "https://example.com:443/BeyondTrust/api/public/v3/"
  27. apiKey = "fakeapikey00fakeapikeydd0000000000065b010f20fakeapikey0000000008700000a93fb5d74fddc0000000000000000000000000000000000000;runas=test_user"
  28. clientID = "12345678-25fg-4b05-9ced-35e7dd5093ae"
  29. clientSecret = "12345678-25fg-4b05-9ced-35e7dd5093ae"
  30. )
  31. func createMockPasswordSafeClient(t *testing.T) kubeclient.Client {
  32. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  33. switch r.URL.Path {
  34. case "/Auth/SignAppin":
  35. _, err := w.Write([]byte(`{"UserId":1, "EmailAddress":"fake@beyondtrust.com"}`))
  36. if err != nil {
  37. t.Error(errTestCase)
  38. }
  39. case "/Auth/Signout":
  40. _, err := w.Write([]byte(``))
  41. if err != nil {
  42. t.Error(errTestCase)
  43. }
  44. case "/secrets-safe/secrets":
  45. _, err := w.Write([]byte(`[{"SecretType": "FILE", "Password": "credential_in_sub_3_password","Id": "12345678-07d6-4955-175a-08db047219ce","Title": "credential_in_sub_3"}]`))
  46. if err != nil {
  47. t.Error(errTestCase)
  48. }
  49. case "/secrets-safe/secrets/12345678-07d6-4955-175a-08db047219ce/file/download":
  50. _, err := w.Write([]byte(`fake_password`))
  51. if err != nil {
  52. t.Error(errTestCase)
  53. }
  54. default:
  55. http.NotFound(w, r)
  56. }
  57. }))
  58. t.Cleanup(server.Close)
  59. clientConfig := clientcmd.NewDefaultClientConfig(clientcmdapi.Config{
  60. Clusters: map[string]*clientcmdapi.Cluster{
  61. "test": {
  62. Server: server.URL,
  63. },
  64. },
  65. AuthInfos: map[string]*clientcmdapi.AuthInfo{
  66. "test": {
  67. Token: "token",
  68. },
  69. },
  70. Contexts: map[string]*clientcmdapi.Context{
  71. "test": {
  72. Cluster: "test",
  73. AuthInfo: "test",
  74. },
  75. },
  76. CurrentContext: "test",
  77. }, &clientcmd.ConfigOverrides{})
  78. restConfig, err := clientConfig.ClientConfig()
  79. assert.Nil(t, err)
  80. c, err := kubeclient.New(restConfig, kubeclient.Options{})
  81. assert.Nil(t, err)
  82. return c
  83. }
  84. func TestNewClient(t *testing.T) {
  85. type args struct {
  86. store esv1beta1.SecretStore
  87. kube kubeclient.Client
  88. provider esv1beta1.Provider
  89. }
  90. tests := []struct {
  91. name string
  92. nameSpace string
  93. args args
  94. validateErrorNil bool
  95. validateErrorText bool
  96. expectedErrorText string
  97. }{
  98. {
  99. name: "Client ok",
  100. nameSpace: "test",
  101. args: args{
  102. store: esv1beta1.SecretStore{
  103. Spec: esv1beta1.SecretStoreSpec{
  104. Provider: &esv1beta1.SecretStoreProvider{
  105. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  106. Server: &esv1beta1.BeyondtrustServer{
  107. APIURL: fakeAPIURL,
  108. RetrievalType: "SECRET",
  109. },
  110. Auth: &esv1beta1.BeyondtrustAuth{
  111. ClientID: &esv1beta1.BeyondTrustProviderSecretRef{
  112. Value: clientID,
  113. },
  114. ClientSecret: &esv1beta1.BeyondTrustProviderSecretRef{
  115. Value: clientSecret,
  116. },
  117. },
  118. },
  119. },
  120. },
  121. },
  122. kube: createMockPasswordSafeClient(t),
  123. provider: &Provider{},
  124. },
  125. validateErrorNil: true,
  126. validateErrorText: false,
  127. },
  128. {
  129. name: "Bad Client Id",
  130. nameSpace: "test",
  131. args: args{
  132. store: esv1beta1.SecretStore{
  133. Spec: esv1beta1.SecretStoreSpec{
  134. Provider: &esv1beta1.SecretStoreProvider{
  135. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  136. Server: &esv1beta1.BeyondtrustServer{
  137. APIURL: fakeAPIURL,
  138. RetrievalType: "SECRET",
  139. },
  140. Auth: &esv1beta1.BeyondtrustAuth{
  141. ClientID: &esv1beta1.BeyondTrustProviderSecretRef{
  142. Value: "6138d050",
  143. },
  144. ClientSecret: &esv1beta1.BeyondTrustProviderSecretRef{
  145. Value: clientSecret,
  146. },
  147. },
  148. },
  149. },
  150. },
  151. },
  152. kube: createMockPasswordSafeClient(t),
  153. provider: &Provider{},
  154. },
  155. validateErrorNil: false,
  156. validateErrorText: true,
  157. expectedErrorText: "error in Inputs: Error in field ClientId : min / 36.",
  158. },
  159. {
  160. name: "Bad Client Secret",
  161. nameSpace: "test",
  162. args: args{
  163. store: esv1beta1.SecretStore{
  164. Spec: esv1beta1.SecretStoreSpec{
  165. Provider: &esv1beta1.SecretStoreProvider{
  166. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  167. Server: &esv1beta1.BeyondtrustServer{
  168. APIURL: fakeAPIURL,
  169. RetrievalType: "SECRET",
  170. },
  171. Auth: &esv1beta1.BeyondtrustAuth{
  172. ClientSecret: &esv1beta1.BeyondTrustProviderSecretRef{
  173. Value: "8i7U0Yulabon8mTc",
  174. },
  175. ClientID: &esv1beta1.BeyondTrustProviderSecretRef{
  176. Value: clientID,
  177. },
  178. },
  179. },
  180. },
  181. },
  182. },
  183. kube: createMockPasswordSafeClient(t),
  184. provider: &Provider{},
  185. },
  186. validateErrorNil: false,
  187. validateErrorText: true,
  188. expectedErrorText: "error in Inputs: Error in field ClientSecret : min / 36.",
  189. },
  190. {
  191. name: "Bad Separator",
  192. nameSpace: "test",
  193. args: args{
  194. store: esv1beta1.SecretStore{
  195. Spec: esv1beta1.SecretStoreSpec{
  196. Provider: &esv1beta1.SecretStoreProvider{
  197. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  198. Server: &esv1beta1.BeyondtrustServer{
  199. APIURL: fakeAPIURL,
  200. Separator: "//",
  201. RetrievalType: "SECRET",
  202. },
  203. Auth: &esv1beta1.BeyondtrustAuth{
  204. ClientID: &esv1beta1.BeyondTrustProviderSecretRef{
  205. Value: clientID,
  206. },
  207. ClientSecret: &esv1beta1.BeyondTrustProviderSecretRef{
  208. Value: clientSecret,
  209. },
  210. },
  211. },
  212. },
  213. },
  214. },
  215. kube: createMockPasswordSafeClient(t),
  216. provider: &Provider{},
  217. },
  218. validateErrorNil: false,
  219. validateErrorText: true,
  220. expectedErrorText: "error in Inputs: Error in field ClientId : min / 36.",
  221. },
  222. {
  223. name: "Time Out",
  224. nameSpace: "test",
  225. args: args{
  226. store: esv1beta1.SecretStore{
  227. Spec: esv1beta1.SecretStoreSpec{
  228. Provider: &esv1beta1.SecretStoreProvider{
  229. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  230. Server: &esv1beta1.BeyondtrustServer{
  231. APIURL: fakeAPIURL,
  232. Separator: "/",
  233. ClientTimeOutSeconds: 400,
  234. RetrievalType: "SECRET",
  235. },
  236. Auth: &esv1beta1.BeyondtrustAuth{
  237. ClientID: &esv1beta1.BeyondTrustProviderSecretRef{
  238. Value: clientID,
  239. },
  240. ClientSecret: &esv1beta1.BeyondTrustProviderSecretRef{
  241. Value: clientSecret,
  242. },
  243. },
  244. },
  245. },
  246. },
  247. },
  248. kube: createMockPasswordSafeClient(t),
  249. provider: &Provider{},
  250. },
  251. validateErrorNil: false,
  252. validateErrorText: true,
  253. expectedErrorText: "error in Inputs: Error in field ClientTimeOutinSeconds : lte / 300.",
  254. },
  255. {
  256. name: "ApiKey ok",
  257. nameSpace: "test",
  258. args: args{
  259. store: esv1beta1.SecretStore{
  260. Spec: esv1beta1.SecretStoreSpec{
  261. Provider: &esv1beta1.SecretStoreProvider{
  262. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  263. Server: &esv1beta1.BeyondtrustServer{
  264. APIURL: fakeAPIURL,
  265. RetrievalType: "SECRET",
  266. },
  267. Auth: &esv1beta1.BeyondtrustAuth{
  268. APIKey: &esv1beta1.BeyondTrustProviderSecretRef{
  269. Value: apiKey,
  270. },
  271. },
  272. },
  273. },
  274. },
  275. },
  276. kube: createMockPasswordSafeClient(t),
  277. provider: &Provider{},
  278. },
  279. validateErrorNil: true,
  280. validateErrorText: false,
  281. },
  282. {
  283. name: "Bad ApiKey",
  284. nameSpace: "test",
  285. args: args{
  286. store: esv1beta1.SecretStore{
  287. Spec: esv1beta1.SecretStoreSpec{
  288. Provider: &esv1beta1.SecretStoreProvider{
  289. Beyondtrust: &esv1beta1.BeyondtrustProvider{
  290. Server: &esv1beta1.BeyondtrustServer{
  291. APIURL: fakeAPIURL,
  292. RetrievalType: "SECRET",
  293. },
  294. Auth: &esv1beta1.BeyondtrustAuth{
  295. APIKey: &esv1beta1.BeyondTrustProviderSecretRef{
  296. Value: "bad_api_key",
  297. },
  298. },
  299. },
  300. },
  301. },
  302. },
  303. kube: createMockPasswordSafeClient(t),
  304. provider: &Provider{},
  305. },
  306. validateErrorNil: false,
  307. validateErrorText: true,
  308. expectedErrorText: "error in Inputs: Error in field ApiKey : min / 128.",
  309. },
  310. }
  311. for _, tt := range tests {
  312. t.Run(tt.name, func(t *testing.T) {
  313. _, err := tt.args.provider.NewClient(context.Background(), &tt.args.store, tt.args.kube, tt.nameSpace)
  314. if err != nil && tt.validateErrorNil {
  315. t.Errorf("ProviderBeyondtrust.NewClient() error = %v", err)
  316. }
  317. if err != nil && tt.validateErrorText {
  318. assert.Equal(t, err.Error(), tt.expectedErrorText)
  319. }
  320. })
  321. }
  322. }