provider_test.go 9.0 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. esv1 "github.com/external-secrets/external-secrets/apis/externalsecrets/v1"
  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 esv1.SecretStore
  87. kube kubeclient.Client
  88. provider esv1.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: esv1.SecretStore{
  103. Spec: esv1.SecretStoreSpec{
  104. Provider: &esv1.SecretStoreProvider{
  105. Beyondtrust: &esv1.BeyondtrustProvider{
  106. Server: &esv1.BeyondtrustServer{
  107. APIURL: fakeAPIURL,
  108. RetrievalType: "SECRET",
  109. },
  110. Auth: &esv1.BeyondtrustAuth{
  111. ClientID: &esv1.BeyondTrustProviderSecretRef{
  112. Value: clientID,
  113. },
  114. ClientSecret: &esv1.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: esv1.SecretStore{
  133. Spec: esv1.SecretStoreSpec{
  134. Provider: &esv1.SecretStoreProvider{
  135. Beyondtrust: &esv1.BeyondtrustProvider{
  136. Server: &esv1.BeyondtrustServer{
  137. APIURL: fakeAPIURL,
  138. RetrievalType: "SECRET",
  139. },
  140. Auth: &esv1.BeyondtrustAuth{
  141. ClientID: &esv1.BeyondTrustProviderSecretRef{
  142. Value: "6138d050",
  143. },
  144. ClientSecret: &esv1.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: esv1.SecretStore{
  164. Spec: esv1.SecretStoreSpec{
  165. Provider: &esv1.SecretStoreProvider{
  166. Beyondtrust: &esv1.BeyondtrustProvider{
  167. Server: &esv1.BeyondtrustServer{
  168. APIURL: fakeAPIURL,
  169. RetrievalType: "SECRET",
  170. },
  171. Auth: &esv1.BeyondtrustAuth{
  172. ClientSecret: &esv1.BeyondTrustProviderSecretRef{
  173. Value: "8i7U0Yulabon8mTc",
  174. },
  175. ClientID: &esv1.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: esv1.SecretStore{
  195. Spec: esv1.SecretStoreSpec{
  196. Provider: &esv1.SecretStoreProvider{
  197. Beyondtrust: &esv1.BeyondtrustProvider{
  198. Server: &esv1.BeyondtrustServer{
  199. APIURL: fakeAPIURL,
  200. Separator: "//",
  201. RetrievalType: "SECRET",
  202. },
  203. Auth: &esv1.BeyondtrustAuth{
  204. ClientID: &esv1.BeyondTrustProviderSecretRef{
  205. Value: clientID,
  206. },
  207. ClientSecret: &esv1.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: esv1.SecretStore{
  227. Spec: esv1.SecretStoreSpec{
  228. Provider: &esv1.SecretStoreProvider{
  229. Beyondtrust: &esv1.BeyondtrustProvider{
  230. Server: &esv1.BeyondtrustServer{
  231. APIURL: fakeAPIURL,
  232. Separator: "/",
  233. ClientTimeOutSeconds: 400,
  234. RetrievalType: "SECRET",
  235. },
  236. Auth: &esv1.BeyondtrustAuth{
  237. ClientID: &esv1.BeyondTrustProviderSecretRef{
  238. Value: clientID,
  239. },
  240. ClientSecret: &esv1.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: esv1.SecretStore{
  260. Spec: esv1.SecretStoreSpec{
  261. Provider: &esv1.SecretStoreProvider{
  262. Beyondtrust: &esv1.BeyondtrustProvider{
  263. Server: &esv1.BeyondtrustServer{
  264. APIURL: fakeAPIURL,
  265. RetrievalType: "SECRET",
  266. },
  267. Auth: &esv1.BeyondtrustAuth{
  268. APIKey: &esv1.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: esv1.SecretStore{
  287. Spec: esv1.SecretStoreSpec{
  288. Provider: &esv1.SecretStoreProvider{
  289. Beyondtrust: &esv1.BeyondtrustProvider{
  290. Server: &esv1.BeyondtrustServer{
  291. APIURL: fakeAPIURL,
  292. RetrievalType: "SECRET",
  293. },
  294. Auth: &esv1.BeyondtrustAuth{
  295. APIKey: &esv1.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. }