@rockcarver/frodo-lib 0.16.2-9 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (355) hide show
  1. package/CHANGELOG.md +222 -1
  2. package/cjs/api/AgentApi.js +14 -61
  3. package/cjs/api/AgentApi.js.map +1 -1
  4. package/cjs/api/AgentApi.test.js.map +1 -1
  5. package/cjs/api/ApiTypes.js +0 -5
  6. package/cjs/api/ApiTypes.js.map +1 -1
  7. package/cjs/api/AuthenticateApi.js +9 -20
  8. package/cjs/api/AuthenticateApi.js.map +1 -1
  9. package/cjs/api/AuthenticateApi.test.js.map +1 -0
  10. package/cjs/api/BaseApi.js +82 -124
  11. package/cjs/api/BaseApi.js.map +1 -1
  12. package/cjs/api/CirclesOfTrustApi.js +8 -32
  13. package/cjs/api/CirclesOfTrustApi.js.map +1 -1
  14. package/cjs/api/IdmConfigApi.js +9 -34
  15. package/cjs/api/IdmConfigApi.js.map +1 -1
  16. package/cjs/api/LogApi.js +8 -31
  17. package/cjs/api/LogApi.js.map +1 -1
  18. package/cjs/api/ManagedObjectApi.js +34 -31
  19. package/cjs/api/ManagedObjectApi.js.map +1 -1
  20. package/cjs/api/NodeApi.js +10 -41
  21. package/cjs/api/NodeApi.js.map +1 -1
  22. package/cjs/api/NodeApi.test.js.map +1 -1
  23. package/cjs/api/OAuth2ClientApi.js +7 -26
  24. package/cjs/api/OAuth2ClientApi.js.map +1 -1
  25. package/cjs/api/OAuth2OIDCApi.js +28 -34
  26. package/cjs/api/OAuth2OIDCApi.js.map +1 -1
  27. package/cjs/api/OAuth2OIDCApi.test.js.map +1 -0
  28. package/cjs/api/OAuth2ProviderApi.js +5 -15
  29. package/cjs/api/OAuth2ProviderApi.js.map +1 -1
  30. package/cjs/api/RealmApi.js +8 -34
  31. package/cjs/api/RealmApi.js.map +1 -1
  32. package/cjs/api/Saml2Api.js +16 -67
  33. package/cjs/api/Saml2Api.js.map +1 -1
  34. package/cjs/api/ScriptApi.js +8 -30
  35. package/cjs/api/ScriptApi.js.map +1 -1
  36. package/cjs/api/SecretsApi.js +14 -64
  37. package/cjs/api/SecretsApi.js.map +1 -1
  38. package/cjs/api/SecretsApi.test.js.map +1 -1
  39. package/cjs/api/ServerInfoApi.js +6 -21
  40. package/cjs/api/ServerInfoApi.js.map +1 -1
  41. package/cjs/api/ServiceApi.js +49 -47
  42. package/cjs/api/ServiceApi.js.map +1 -1
  43. package/cjs/api/SocialIdentityProvidersApi.js +9 -36
  44. package/cjs/api/SocialIdentityProvidersApi.js.map +1 -1
  45. package/cjs/api/StartupApi.js +5 -24
  46. package/cjs/api/StartupApi.js.map +1 -1
  47. package/cjs/api/StartupApi.test.js.map +1 -1
  48. package/cjs/api/TreeApi.js +8 -30
  49. package/cjs/api/TreeApi.js.map +1 -1
  50. package/cjs/api/TreeApi.test.js.map +1 -1
  51. package/cjs/api/VariablesApi.js +9 -37
  52. package/cjs/api/VariablesApi.js.map +1 -1
  53. package/cjs/api/VariablesApi.test.js.map +1 -1
  54. package/cjs/api/utils/ApiUtils.js +47 -57
  55. package/cjs/api/utils/ApiUtils.js.map +1 -1
  56. package/cjs/api/utils/ApiUtils.test.js.map +1 -1
  57. package/cjs/api/utils/Base64.js +5 -15
  58. package/cjs/api/utils/Base64.js.map +1 -1
  59. package/cjs/ext/axios-curlirize/curlirize.js +2 -9
  60. package/cjs/ext/axios-curlirize/curlirize.js.map +1 -1
  61. package/cjs/ext/axios-curlirize/lib/CurlHelper.js +7 -22
  62. package/cjs/ext/axios-curlirize/lib/CurlHelper.js.map +1 -1
  63. package/cjs/index.js +30 -89
  64. package/cjs/index.js.map +1 -1
  65. package/cjs/ops/AdminOps.js +27 -165
  66. package/cjs/ops/AdminOps.js.map +1 -1
  67. package/cjs/ops/AgentOps.js +2 -159
  68. package/cjs/ops/AgentOps.js.map +1 -1
  69. package/cjs/ops/AgentOps.test.js.map +1 -1
  70. package/cjs/ops/AuthenticateOps.js +266 -226
  71. package/cjs/ops/AuthenticateOps.js.map +1 -1
  72. package/cjs/ops/AuthenticateOps.test.js.map +1 -1
  73. package/cjs/ops/CirclesOfTrustOps.js +13 -91
  74. package/cjs/ops/CirclesOfTrustOps.js.map +1 -1
  75. package/cjs/ops/ConnectionProfileOps.js +220 -136
  76. package/cjs/ops/ConnectionProfileOps.js.map +1 -1
  77. package/cjs/ops/ConnectionProfileOps.test.js.map +1 -1
  78. package/cjs/ops/EmailTemplateOps.js +35 -379
  79. package/cjs/ops/EmailTemplateOps.js.map +1 -1
  80. package/cjs/ops/EmailTemplateOps.test.js.map +1 -1
  81. package/cjs/ops/IdmOps.js +52 -426
  82. package/cjs/ops/IdmOps.js.map +1 -1
  83. package/cjs/ops/IdmOps.test.js.map +1 -1
  84. package/cjs/ops/IdpOps.js +11 -94
  85. package/cjs/ops/IdpOps.js.map +1 -1
  86. package/cjs/ops/IdpOps.test.js.map +1 -1
  87. package/cjs/ops/JoseOps.js +81 -0
  88. package/cjs/ops/JoseOps.js.map +1 -0
  89. package/cjs/ops/JoseOps.test.js.map +1 -0
  90. package/cjs/ops/JourneyOps.js +139 -370
  91. package/cjs/ops/JourneyOps.js.map +1 -1
  92. package/cjs/ops/JourneyOps.test.js.map +1 -1
  93. package/cjs/ops/LogOps.js +14 -47
  94. package/cjs/ops/LogOps.js.map +1 -1
  95. package/cjs/ops/ManagedObjectOps.js +4 -12
  96. package/cjs/ops/ManagedObjectOps.js.map +1 -1
  97. package/cjs/ops/NodeOps.js +9 -67
  98. package/cjs/ops/NodeOps.js.map +1 -1
  99. package/cjs/ops/OAuth2ClientOps.js +10 -40
  100. package/cjs/ops/OAuth2ClientOps.js.map +1 -1
  101. package/cjs/ops/OpsTypes.js +0 -5
  102. package/cjs/ops/OpsTypes.js.map +1 -1
  103. package/cjs/ops/OrganizationOps.js +6 -25
  104. package/cjs/ops/OrganizationOps.js.map +1 -1
  105. package/cjs/ops/RealmOps.js +0 -19
  106. package/cjs/ops/RealmOps.js.map +1 -1
  107. package/cjs/ops/Saml2Ops.js +11 -107
  108. package/cjs/ops/Saml2Ops.js.map +1 -1
  109. package/cjs/ops/Saml2Ops.test.js.map +1 -1
  110. package/cjs/ops/ScriptOps.js +26 -73
  111. package/cjs/ops/ScriptOps.js.map +1 -1
  112. package/cjs/ops/SecretsOps.js +2 -58
  113. package/cjs/ops/SecretsOps.js.map +1 -1
  114. package/cjs/ops/ServiceAccountOps.js +61 -0
  115. package/cjs/ops/ServiceAccountOps.js.map +1 -0
  116. package/cjs/ops/ServiceAccountOps.test.js.map +1 -0
  117. package/cjs/ops/ServiceOps.js +55 -101
  118. package/cjs/ops/ServiceOps.js.map +1 -1
  119. package/cjs/ops/StartupOps.js +2 -23
  120. package/cjs/ops/StartupOps.js.map +1 -1
  121. package/cjs/ops/ThemeOps.js +230 -436
  122. package/cjs/ops/ThemeOps.js.map +1 -1
  123. package/cjs/ops/ThemeOps.test.js.map +1 -0
  124. package/cjs/ops/VariablesOps.js +0 -38
  125. package/cjs/ops/VariablesOps.js.map +1 -1
  126. package/cjs/ops/utils/Console.js +29 -62
  127. package/cjs/ops/utils/Console.js.map +1 -1
  128. package/cjs/ops/utils/DataProtection.js +13 -47
  129. package/cjs/ops/utils/DataProtection.js.map +1 -1
  130. package/cjs/ops/utils/DataProtection.test.js.map +1 -1
  131. package/cjs/ops/utils/ExportImportUtils.js +36 -74
  132. package/cjs/ops/utils/ExportImportUtils.js.map +1 -1
  133. package/cjs/ops/utils/ExportImportUtils.test.js.map +1 -1
  134. package/cjs/ops/utils/OpsUtils.js +27 -43
  135. package/cjs/ops/utils/OpsUtils.js.map +1 -1
  136. package/cjs/ops/utils/OpsUtils.test.js.map +1 -1
  137. package/cjs/ops/utils/ValidationUtils.js +0 -13
  138. package/cjs/ops/utils/ValidationUtils.js.map +1 -1
  139. package/cjs/ops/utils/ValidationUtils.test.js.map +1 -1
  140. package/cjs/ops/utils/Version.js +2 -12
  141. package/cjs/ops/utils/Version.js.map +1 -1
  142. package/cjs/ops/utils/Version.test.js.map +1 -1
  143. package/cjs/ops/utils/Wordwrap.js +1 -2
  144. package/cjs/ops/utils/Wordwrap.js.map +1 -1
  145. package/cjs/ops/utils/Wordwrap.test.js.map +1 -0
  146. package/cjs/shared/State.js +239 -0
  147. package/cjs/shared/State.js.map +1 -0
  148. package/cjs/shared/State.test.js.map +1 -0
  149. package/cjs/storage/StaticStorage.js.map +1 -1
  150. package/cjs/test/mocks/AuthenticateApi/step/default_steps.json +88 -0
  151. package/cjs/test/mocks/ForgeRockApiMockEngine.js +161 -83
  152. package/cjs/test/mocks/ForgeRockApiMockEngine.js.map +1 -1
  153. package/cjs/test/mocks/IdmConfigApi/getConfigEntity/managed.json +4420 -0
  154. package/cjs/test/mocks/OAuth2OIDCApi/accessToken/body.json +6 -0
  155. package/cjs/test/mocks/OAuth2OIDCApi/accessToken/headers.json +19 -0
  156. package/cjs/test/mocks/OAuth2OIDCApi/authorize/headers.json +38 -0
  157. package/cjs/test/mocks/ServerInfoApi/getServerInfo/info.json +25 -0
  158. package/cjs/test/mocks/ServerInfoApi/getServerVersionInfo/version.json +8 -0
  159. package/cjs/utils/AutoSetupPolly.js +79 -0
  160. package/cjs/utils/AutoSetupPolly.js.map +1 -0
  161. package/cjs/utils/SetupJest.js +6 -0
  162. package/cjs/utils/SetupJest.js.map +1 -0
  163. package/cjs/{test/mocks → utils}/snapshotResolve.js +10 -12
  164. package/cjs/utils/snapshotResolve.js.map +1 -0
  165. package/esm/api/AgentApi.mjs +19 -21
  166. package/esm/api/AgentApi.test.mjs +6 -15
  167. package/esm/api/ApiTypes.mjs +0 -5
  168. package/esm/api/AuthenticateApi.mjs +7 -10
  169. package/esm/api/AuthenticateApi.test.mjs +39 -0
  170. package/esm/api/BaseApi.mjs +96 -81
  171. package/esm/api/CirclesOfTrustApi.mjs +9 -12
  172. package/esm/api/IdmConfigApi.mjs +11 -12
  173. package/esm/api/LogApi.mjs +6 -10
  174. package/esm/api/ManagedObjectApi.mjs +23 -8
  175. package/esm/api/NodeApi.mjs +13 -15
  176. package/esm/api/NodeApi.test.mjs +13 -17
  177. package/esm/api/OAuth2ClientApi.mjs +7 -9
  178. package/esm/api/OAuth2OIDCApi.mjs +15 -9
  179. package/esm/api/OAuth2OIDCApi.test.mjs +53 -0
  180. package/esm/api/OAuth2ProviderApi.mjs +3 -5
  181. package/esm/api/RealmApi.mjs +10 -13
  182. package/esm/api/Saml2Api.mjs +25 -29
  183. package/esm/api/ScriptApi.mjs +9 -11
  184. package/esm/api/SecretsApi.mjs +21 -24
  185. package/esm/api/SecretsApi.test.mjs +9 -31
  186. package/esm/api/ServerInfoApi.mjs +5 -9
  187. package/esm/api/ServiceApi.mjs +53 -26
  188. package/esm/api/SocialIdentityProvidersApi.mjs +11 -13
  189. package/esm/api/StartupApi.mjs +5 -10
  190. package/esm/api/StartupApi.test.mjs +4 -7
  191. package/esm/api/TreeApi.mjs +9 -11
  192. package/esm/api/TreeApi.test.mjs +24 -61
  193. package/esm/api/VariablesApi.mjs +11 -13
  194. package/esm/api/VariablesApi.test.mjs +80 -222
  195. package/esm/api/utils/ApiUtils.mjs +45 -48
  196. package/esm/api/utils/ApiUtils.test.mjs +33 -32
  197. package/esm/api/utils/Base64.mjs +5 -9
  198. package/esm/ext/axios-curlirize/curlirize.mjs +2 -7
  199. package/esm/ext/axios-curlirize/lib/CurlHelper.mjs +7 -20
  200. package/esm/index.mjs +23 -13
  201. package/esm/ops/AdminOps.mjs +33 -119
  202. package/esm/ops/AgentOps.mjs +37 -80
  203. package/esm/ops/AgentOps.test.mjs +5 -45
  204. package/esm/ops/AuthenticateOps.mjs +242 -175
  205. package/esm/ops/AuthenticateOps.test.mjs +7 -9
  206. package/esm/ops/CirclesOfTrustOps.mjs +24 -61
  207. package/esm/ops/ConnectionProfileOps.mjs +192 -82
  208. package/esm/ops/ConnectionProfileOps.test.mjs +19 -19
  209. package/esm/ops/EmailTemplateOps.mjs +18 -276
  210. package/esm/ops/EmailTemplateOps.test.mjs +19 -44
  211. package/esm/ops/IdmOps.mjs +30 -327
  212. package/esm/ops/IdmOps.test.mjs +47 -54
  213. package/esm/ops/IdpOps.mjs +21 -59
  214. package/esm/ops/IdpOps.test.mjs +5 -5
  215. package/esm/ops/JoseOps.mjs +41 -0
  216. package/esm/ops/JoseOps.test.mjs +137 -0
  217. package/esm/ops/JourneyOps.mjs +146 -289
  218. package/esm/ops/JourneyOps.test.mjs +29 -27
  219. package/esm/ops/LogOps.mjs +15 -25
  220. package/esm/ops/ManagedObjectOps.mjs +6 -6
  221. package/esm/ops/NodeOps.mjs +9 -47
  222. package/esm/ops/OAuth2ClientOps.mjs +13 -19
  223. package/esm/ops/OpsTypes.mjs +1 -3
  224. package/esm/ops/OrganizationOps.mjs +7 -14
  225. package/esm/ops/RealmOps.mjs +4 -7
  226. package/esm/ops/Saml2Ops.mjs +28 -62
  227. package/esm/ops/Saml2Ops.test.mjs +20 -23
  228. package/esm/ops/ScriptOps.mjs +29 -47
  229. package/esm/ops/SecretsOps.mjs +15 -31
  230. package/esm/ops/ServiceAccountOps.mjs +41 -0
  231. package/esm/ops/ServiceAccountOps.test.mjs +51 -0
  232. package/esm/ops/ServiceOps.mjs +66 -83
  233. package/esm/ops/StartupOps.mjs +4 -13
  234. package/esm/ops/ThemeOps.mjs +189 -298
  235. package/esm/{api/ThemeApi.test.mjs → ops/ThemeOps.test.mjs} +91 -96
  236. package/esm/ops/VariablesOps.mjs +9 -18
  237. package/esm/ops/utils/Console.mjs +28 -46
  238. package/esm/ops/utils/DataProtection.mjs +15 -28
  239. package/esm/ops/utils/DataProtection.test.mjs +8 -8
  240. package/esm/ops/utils/ExportImportUtils.mjs +34 -43
  241. package/esm/ops/utils/ExportImportUtils.test.mjs +20 -18
  242. package/esm/ops/utils/OpsUtils.mjs +27 -21
  243. package/esm/ops/utils/OpsUtils.test.mjs +155 -27
  244. package/esm/ops/utils/ValidationUtils.mjs +0 -9
  245. package/esm/ops/utils/Version.mjs +2 -3
  246. package/esm/ops/utils/Version.test.mjs +0 -2
  247. package/esm/ops/utils/Wordwrap.mjs +1 -1
  248. package/esm/ops/utils/Wordwrap.test.mjs +19 -0
  249. package/esm/shared/State.mjs +164 -0
  250. package/esm/shared/State.test.mjs +249 -0
  251. package/esm/test/mocks/AuthenticateApi/step/default_steps.json +88 -0
  252. package/esm/test/mocks/ForgeRockApiMockEngine.mjs +147 -31
  253. package/esm/test/mocks/IdmConfigApi/getConfigEntity/managed.json +4420 -0
  254. package/esm/test/mocks/OAuth2OIDCApi/accessToken/body.json +6 -0
  255. package/esm/test/mocks/OAuth2OIDCApi/accessToken/headers.json +19 -0
  256. package/esm/test/mocks/OAuth2OIDCApi/authorize/headers.json +38 -0
  257. package/esm/test/mocks/ServerInfoApi/getServerInfo/info.json +25 -0
  258. package/esm/test/mocks/ServerInfoApi/getServerVersionInfo/version.json +8 -0
  259. package/esm/utils/AutoSetupPolly.mjs +72 -0
  260. package/esm/utils/SetupJest.mjs +3 -0
  261. package/esm/{test/mocks → utils}/snapshotResolve.mjs +10 -12
  262. package/package.json +36 -26
  263. package/types/api/AgentApi.d.ts.map +1 -1
  264. package/types/api/ApiTypes.d.ts +15 -16
  265. package/types/api/ApiTypes.d.ts.map +1 -1
  266. package/types/api/AuthenticateApi.d.ts +1 -1
  267. package/types/api/AuthenticateApi.d.ts.map +1 -1
  268. package/types/api/BaseApi.d.ts +2 -0
  269. package/types/api/BaseApi.d.ts.map +1 -1
  270. package/types/api/CirclesOfTrustApi.d.ts.map +1 -1
  271. package/types/api/IdmConfigApi.d.ts.map +1 -1
  272. package/types/api/LogApi.d.ts.map +1 -1
  273. package/types/api/ManagedObjectApi.d.ts +9 -1
  274. package/types/api/ManagedObjectApi.d.ts.map +1 -1
  275. package/types/api/NodeApi.d.ts.map +1 -1
  276. package/types/api/OAuth2ClientApi.d.ts.map +1 -1
  277. package/types/api/OAuth2OIDCApi.d.ts +4 -2
  278. package/types/api/OAuth2OIDCApi.d.ts.map +1 -1
  279. package/types/api/OAuth2ProviderApi.d.ts.map +1 -1
  280. package/types/api/RealmApi.d.ts.map +1 -1
  281. package/types/api/Saml2Api.d.ts.map +1 -1
  282. package/types/api/ScriptApi.d.ts.map +1 -1
  283. package/types/api/SecretsApi.d.ts.map +1 -1
  284. package/types/api/ServerInfoApi.d.ts.map +1 -1
  285. package/types/api/ServiceApi.d.ts +14 -7
  286. package/types/api/ServiceApi.d.ts.map +1 -1
  287. package/types/api/SocialIdentityProvidersApi.d.ts.map +1 -1
  288. package/types/api/StartupApi.d.ts.map +1 -1
  289. package/types/api/TreeApi.d.ts.map +1 -1
  290. package/types/api/VariablesApi.d.ts.map +1 -1
  291. package/types/api/utils/ApiUtils.d.ts +1 -0
  292. package/types/api/utils/ApiUtils.d.ts.map +1 -1
  293. package/types/index.d.ts +11 -5
  294. package/types/index.d.ts.map +1 -1
  295. package/types/ops/AuthenticateOps.d.ts +10 -2
  296. package/types/ops/AuthenticateOps.d.ts.map +1 -1
  297. package/types/ops/ConnectionProfileOps.d.ts +49 -21
  298. package/types/ops/ConnectionProfileOps.d.ts.map +1 -1
  299. package/types/ops/EmailTemplateOps.d.ts +14 -33
  300. package/types/ops/EmailTemplateOps.d.ts.map +1 -1
  301. package/types/ops/IdmOps.d.ts +29 -37
  302. package/types/ops/IdmOps.d.ts.map +1 -1
  303. package/types/ops/JoseOps.d.ts +33 -0
  304. package/types/ops/JoseOps.d.ts.map +1 -0
  305. package/types/ops/JourneyOps.d.ts.map +1 -1
  306. package/types/ops/LogOps.d.ts.map +1 -1
  307. package/types/ops/NodeOps.d.ts.map +1 -1
  308. package/types/ops/OAuth2ClientOps.d.ts.map +1 -1
  309. package/types/ops/OpsTypes.d.ts +1 -1
  310. package/types/ops/OpsTypes.d.ts.map +1 -1
  311. package/types/ops/OrganizationOps.d.ts.map +1 -1
  312. package/types/ops/ScriptOps.d.ts.map +1 -1
  313. package/types/ops/ServiceAccountOps.d.ts +20 -0
  314. package/types/ops/ServiceAccountOps.d.ts.map +1 -0
  315. package/types/ops/ServiceOps.d.ts +18 -10
  316. package/types/ops/ServiceOps.d.ts.map +1 -1
  317. package/types/ops/ThemeOps.d.ts +35 -50
  318. package/types/ops/ThemeOps.d.ts.map +1 -1
  319. package/types/ops/utils/Console.d.ts +1 -1
  320. package/types/ops/utils/Console.d.ts.map +1 -1
  321. package/types/ops/utils/DataProtection.d.ts.map +1 -1
  322. package/types/ops/utils/ExportImportUtils.d.ts +5 -2
  323. package/types/ops/utils/ExportImportUtils.d.ts.map +1 -1
  324. package/types/ops/utils/OpsUtils.d.ts +6 -0
  325. package/types/ops/utils/OpsUtils.d.ts.map +1 -1
  326. package/types/ops/utils/Wordwrap.d.ts.map +1 -1
  327. package/types/shared/State.d.ts +223 -0
  328. package/types/shared/State.d.ts.map +1 -0
  329. package/types/test/mocks/ForgeRockApiMockEngine.d.ts +19 -1
  330. package/types/test/mocks/ForgeRockApiMockEngine.d.ts.map +1 -1
  331. package/types/utils/AutoSetupPolly.d.ts +1 -0
  332. package/types/utils/AutoSetupPolly.d.ts.map +1 -0
  333. package/types/utils/SetupJest.d.ts +1 -0
  334. package/types/utils/SetupJest.d.ts.map +1 -0
  335. package/types/utils/snapshotResolve.d.ts +1 -0
  336. package/types/utils/snapshotResolve.d.ts.map +1 -0
  337. package/cjs/api/EmailTemplateApi.js +0 -73
  338. package/cjs/api/EmailTemplateApi.js.map +0 -1
  339. package/cjs/api/ThemeApi.js +0 -367
  340. package/cjs/api/ThemeApi.js.map +0 -1
  341. package/cjs/api/ThemeApi.test.js.map +0 -1
  342. package/cjs/storage/SessionStorage.js +0 -91
  343. package/cjs/storage/SessionStorage.js.map +0 -1
  344. package/cjs/test/mocks/snapshotResolve.js.map +0 -1
  345. package/esm/api/EmailTemplateApi.mjs +0 -34
  346. package/esm/api/ThemeApi.mjs +0 -271
  347. package/esm/storage/SessionStorage.mjs +0 -79
  348. package/types/api/EmailTemplateApi.d.ts +0 -22
  349. package/types/api/EmailTemplateApi.d.ts.map +0 -1
  350. package/types/api/ThemeApi.d.ts +0 -56
  351. package/types/api/ThemeApi.d.ts.map +0 -1
  352. package/types/storage/SessionStorage.d.ts +0 -71
  353. package/types/storage/SessionStorage.d.ts.map +0 -1
  354. package/types/test/mocks/snapshotResolve.d.ts +0 -1
  355. package/types/test/mocks/snapshotResolve.d.ts.map +0 -1
@@ -2,37 +2,46 @@ import url from 'url';
2
2
  import { createHash, randomBytes } from 'crypto';
3
3
  import readlineSync from 'readline-sync';
4
4
  import { encodeBase64Url } from '../api/utils/Base64';
5
- import storage from '../storage/SessionStorage';
5
+ import * as state from '../shared/State';
6
6
  import * as globalConfig from '../storage/StaticStorage';
7
- import { printMessage } from './utils/Console';
7
+ import { debugMessage, printMessage, verboseMessage } from './utils/Console';
8
8
  import { getServerInfo, getServerVersionInfo } from '../api/ServerInfoApi';
9
9
  import { step } from '../api/AuthenticateApi';
10
10
  import { accessToken, authorize } from '../api/OAuth2OIDCApi';
11
- import { getConnectionProfile, saveConnectionProfile } from './ConnectionProfileOps';
11
+ import { getConnectionProfile } from './ConnectionProfileOps';
12
+ import { v4 } from 'uuid';
13
+ import { parseUrl } from '../api/utils/ApiUtils';
14
+ import { createSignedJwtToken } from './JoseOps';
15
+ import { getManagedObject } from '../api/ManagedObjectApi';
12
16
  const adminClientPassword = 'doesnotmatter';
13
17
  const redirectUrlTemplate = '/platform/appAuthHelperRedirect.html';
14
- const idmAdminScope = 'fr:idm:* openid';
18
+ const idmAdminScopes = 'fr:idm:* openid';
19
+ const serviceAccountScopes = 'fr:am:* fr:idm:* fr:idc:esv:*';
15
20
  let adminClientId = 'idmAdminClient';
21
+
16
22
  /**
17
23
  * Helper function to get cookie name
18
24
  * @returns {String} cookie name
19
25
  */
20
-
21
- async function getCookieName() {
26
+ async function determineCookieName() {
22
27
  try {
23
- return (await getServerInfo()).data.cookieName;
28
+ const {
29
+ data
30
+ } = await getServerInfo();
31
+ debugMessage(`AuthenticateOps.getCookieName: cookieName=${data.cookieName}`);
32
+ return data.cookieName;
24
33
  } catch (error) {
25
34
  printMessage(`Error getting cookie name: ${error}`, 'error');
35
+ debugMessage(error.stack);
26
36
  return null;
27
37
  }
28
38
  }
39
+
29
40
  /**
30
41
  * Helper function to determine if this is a setup mfa prompt in the ID Cloud tenant admin login journey
31
42
  * @param {Object} payload response from the previous authentication journey step
32
43
  * @returns {Object} an object indicating if 2fa is required and the original payload
33
44
  */
34
-
35
-
36
45
  function checkAndHandle2FA(payload) {
37
46
  // let skippable = false;
38
47
  if ('callbacks' in payload) {
@@ -47,7 +56,6 @@ function checkAndHandle2FA(payload) {
47
56
  };
48
57
  }
49
58
  }
50
-
51
59
  if (element.type === 'NameCallback') {
52
60
  if (element.output[0].value.includes('code')) {
53
61
  // skippable = false;
@@ -60,89 +68,92 @@ function checkAndHandle2FA(payload) {
60
68
  };
61
69
  }
62
70
  }
63
- } // console.info("NO2FA");
64
-
65
-
71
+ }
72
+ // console.info("NO2FA");
66
73
  return {
67
74
  need2fa: false,
68
75
  payload
69
76
  };
70
- } // console.info("NO2FA");
71
-
72
-
77
+ }
78
+ // console.info("NO2FA");
73
79
  return {
74
80
  need2fa: false,
75
81
  payload
76
82
  };
77
83
  }
84
+
78
85
  /**
79
86
  * Helper function to set the default realm by deployment type
80
- * @param {String} deploymentType deployment type
87
+ * @param {string} deploymentType deployment type
81
88
  */
82
-
83
-
84
89
  function determineDefaultRealm(deploymentType) {
85
- if (storage.session.getRealm() === globalConfig.DEFAULT_REALM_KEY) {
86
- storage.session.setRealm(globalConfig.DEPLOYMENT_TYPE_REALM_MAP[deploymentType]);
90
+ if (!state.getRealm() || state.getRealm() === globalConfig.DEFAULT_REALM_KEY) {
91
+ state.setRealm(globalConfig.DEPLOYMENT_TYPE_REALM_MAP[deploymentType]);
87
92
  }
88
93
  }
94
+
89
95
  /**
90
96
  * Helper function to determine the deployment type
91
- * @returns {String} deployment type
97
+ * @returns {Promise<string>} deployment type
92
98
  */
93
-
94
-
95
99
  async function determineDeploymentType() {
100
+ const cookieValue = state.getCookieValue();
101
+ // https://bugster.forgerock.org/jira/browse/FRAAS-13018
102
+ // There is a chance that this will be blocked due to security concerns and thus is probably best not to keep active
103
+ // if (!cookieValue && getUseBearerTokenForAmApis()) {
104
+ // const token = await getTokenInfo();
105
+ // cookieValue = token.sessionToken;
106
+ // setCookieValue(cookieValue);
107
+ // }
108
+
109
+ // if we are using a service account, we know it's cloud
110
+ if (state.getUseBearerTokenForAmApis()) return globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY;
96
111
  const fidcClientId = 'idmAdminClient';
97
112
  const forgeopsClientId = 'idm-admin-ui';
98
113
  const verifier = encodeBase64Url(randomBytes(32));
99
114
  const challenge = encodeBase64Url(createHash('sha256').update(verifier).digest());
100
115
  const challengeMethod = 'S256';
101
- const redirectURL = url.resolve(storage.session.getTenant(), redirectUrlTemplate);
116
+ const redirectURL = url.resolve(state.getHost(), redirectUrlTemplate);
102
117
  const config = {
103
- maxRedirects: 0
118
+ maxRedirects: 0,
119
+ headers: {
120
+ [state.getCookieName()]: state.getCookieValue()
121
+ }
104
122
  };
105
- let bodyFormData = `redirect_uri=${redirectURL}&scope=${idmAdminScope}&response_type=code&client_id=${fidcClientId}&csrf=${storage.session.getCookieValue()}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;
123
+ let bodyFormData = `redirect_uri=${redirectURL}&scope=${idmAdminScopes}&response_type=code&client_id=${fidcClientId}&csrf=${cookieValue}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;
106
124
  let deploymentType = globalConfig.CLASSIC_DEPLOYMENT_TYPE_KEY;
107
-
108
125
  try {
109
126
  await authorize(bodyFormData, config);
110
127
  } catch (e) {
111
128
  var _e$response, _e$response$headers, _e$response$headers$l;
112
-
129
+ // debugMessage(e.response);
113
130
  if (((_e$response = e.response) === null || _e$response === void 0 ? void 0 : _e$response.status) === 302 && ((_e$response$headers = e.response.headers) === null || _e$response$headers === void 0 ? void 0 : (_e$response$headers$l = _e$response$headers.location) === null || _e$response$headers$l === void 0 ? void 0 : _e$response$headers$l.indexOf('code=')) > -1) {
114
- printMessage('ForgeRock Identity Cloud ', 'info', false);
131
+ verboseMessage(`ForgeRock Identity Cloud`['brightCyan'] + ` detected.`);
115
132
  deploymentType = globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY;
116
133
  } else {
117
134
  try {
118
- bodyFormData = `redirect_uri=${redirectURL}&scope=${idmAdminScope}&response_type=code&client_id=${forgeopsClientId}&csrf=${storage.session.getCookieValue()}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;
135
+ bodyFormData = `redirect_uri=${redirectURL}&scope=${idmAdminScopes}&response_type=code&client_id=${forgeopsClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${challenge}&code_challenge_method=${challengeMethod}`;
119
136
  await authorize(bodyFormData, config);
120
137
  } catch (ex) {
121
138
  var _ex$response, _ex$response$headers, _ex$response$headers$;
122
-
123
139
  if (((_ex$response = ex.response) === null || _ex$response === void 0 ? void 0 : _ex$response.status) === 302 && ((_ex$response$headers = ex.response.headers) === null || _ex$response$headers === void 0 ? void 0 : (_ex$response$headers$ = _ex$response$headers.location) === null || _ex$response$headers$ === void 0 ? void 0 : _ex$response$headers$.indexOf('code=')) > -1) {
124
140
  adminClientId = forgeopsClientId;
125
- printMessage('ForgeOps deployment ', 'info', false);
141
+ verboseMessage(`ForgeOps deployment`['brightCyan'] + ` detected.`);
126
142
  deploymentType = globalConfig.FORGEOPS_DEPLOYMENT_TYPE_KEY;
127
143
  } else {
128
- printMessage('Classic deployment ', 'info', false);
144
+ verboseMessage(`Classic deployment`['brightCyan'] + ` detected.`);
129
145
  }
130
146
  }
131
147
  }
132
-
133
- printMessage('detected.');
134
148
  }
135
-
136
- determineDefaultRealm(deploymentType);
137
149
  return deploymentType;
138
150
  }
151
+
139
152
  /**
140
153
  * Helper function to extract the semantic version string from a version info object
141
154
  * @param {Object} versionInfo version info object
142
155
  * @returns {String} semantic version
143
156
  */
144
-
145
-
146
157
  async function getSemanticVersion(versionInfo) {
147
158
  if ('version' in versionInfo) {
148
159
  const versionString = versionInfo.version;
@@ -150,140 +161,95 @@ async function getSemanticVersion(versionInfo) {
150
161
  const version = versionString.match(rx);
151
162
  return version[0];
152
163
  }
153
-
154
164
  throw new Error('Cannot extract semantic version from version info object.');
155
165
  }
166
+
156
167
  /**
157
168
  * Helper function to authenticate and obtain and store session cookie
158
- * @returns {String} empty string or null
169
+ * @returns {string} Session token or null
159
170
  */
160
-
161
-
162
- async function authenticate() {
163
- storage.session.setCookieName(await getCookieName());
164
-
165
- try {
166
- const config = {
167
- headers: {
168
- 'X-OpenAM-Username': storage.session.getUsername(),
169
- 'X-OpenAM-Password': storage.session.getPassword()
170
- }
171
- };
172
- const response1 = (await step({}, config)).data;
173
- const skip2FA = checkAndHandle2FA(response1);
174
- let response2 = {};
175
-
176
- if (skip2FA.need2fa) {
177
- response2 = (await step(skip2FA.payload)).data;
178
- } else {
179
- response2 = skip2FA.payload;
180
- }
181
-
182
- if ('tokenId' in response2) {
183
- storage.session.setCookieValue(response2['tokenId']);
184
-
185
- if (!storage.session.getDeploymentType()) {
186
- storage.session.setDeploymentType(await determineDeploymentType());
187
- } else {
188
- determineDefaultRealm(storage.session.getDeploymentType());
189
- }
190
-
191
- const versionInfo = (await getServerVersionInfo()).data; // https://github.com/rockcarver/frodo-cli/issues/109
192
- // printMessage(`Connected to ${versionInfo.fullVersion}`);
193
- // https://github.com/rockcarver/frodo-cli/issues/102
194
-
195
- printMessage(`Connected to [${storage.session.getTenant()}], [${!storage.session.getRealm() ? 'alpha' : storage.session.getRealm()}] realm, as [${storage.session.getUsername()}]`);
196
- const version = await getSemanticVersion(versionInfo);
197
- storage.session.setAmVersion(version);
198
- return '';
199
- }
200
-
201
- printMessage(`error authenticating`, 'error');
202
- printMessage('+++ likely cause, bad credentials!!! +++', 'error');
203
- return null;
204
- } catch (e) {
205
- var _e$response2;
206
-
207
- if (((_e$response2 = e.response) === null || _e$response2 === void 0 ? void 0 : _e$response2.status) === 401) {
208
- printMessage(`error authenticating - ${e.message}`, 'error');
209
- printMessage('+++ likely cause, bad credentials +++', 'error');
210
- }
211
-
212
- if (e.message === 'self signed certificate') {
213
- printMessage(`error authenticating - ${e.message}`, 'error');
214
- printMessage('+++ use -k, --insecure option to allow +++', 'error');
215
- } else {
216
- var _e$response3;
217
-
218
- printMessage(`error authenticating - ${e.message}`, 'error');
219
- printMessage((_e$response3 = e.response) === null || _e$response3 === void 0 ? void 0 : _e$response3.data, 'error');
171
+ async function authenticate(username, password) {
172
+ const config = {
173
+ headers: {
174
+ 'X-OpenAM-Username': username,
175
+ 'X-OpenAM-Password': password
220
176
  }
221
-
222
- return null;
177
+ };
178
+ const response1 = await step({}, config);
179
+ const skip2FA = checkAndHandle2FA(response1);
180
+ let response2 = {};
181
+ if (skip2FA.need2fa) {
182
+ response2 = await step(skip2FA.payload);
183
+ } else {
184
+ response2 = skip2FA.payload;
185
+ }
186
+ if ('tokenId' in response2) {
187
+ return response2['tokenId'];
223
188
  }
189
+ return null;
224
190
  }
191
+
225
192
  /**
226
193
  * Helper function to obtain an oauth2 authorization code
227
- * @param {String} redirectURL oauth2 redirect uri
228
- * @param {String} codeChallenge PKCE code challenge
229
- * @param {String} codeChallengeMethod PKCE code challenge method
230
- * @returns {String} oauth2 authorization code or null
194
+ * @param {string} redirectURL oauth2 redirect uri
195
+ * @param {string} codeChallenge PKCE code challenge
196
+ * @param {string} codeChallengeMethod PKCE code challenge method
197
+ * @returns {string} oauth2 authorization code or null
231
198
  */
232
-
233
-
234
199
  async function getAuthCode(redirectURL, codeChallenge, codeChallengeMethod) {
235
200
  try {
236
- const bodyFormData = `redirect_uri=${redirectURL}&scope=${idmAdminScope}&response_type=code&client_id=${adminClientId}&csrf=${storage.session.getCookieValue()}&decision=allow&code_challenge=${codeChallenge}&code_challenge_method=${codeChallengeMethod}`;
201
+ var _response$headers;
202
+ const bodyFormData = `redirect_uri=${redirectURL}&scope=${idmAdminScopes}&response_type=code&client_id=${adminClientId}&csrf=${state.getCookieValue()}&decision=allow&code_challenge=${codeChallenge}&code_challenge_method=${codeChallengeMethod}`;
237
203
  const config = {
238
204
  headers: {
239
205
  'Content-Type': 'application/x-www-form-urlencoded'
240
- }
206
+ },
207
+ maxRedirects: 0
241
208
  };
242
- const response = await authorize(bodyFormData, config);
243
-
209
+ let response = undefined;
210
+ try {
211
+ response = await authorize(bodyFormData, config);
212
+ } catch (error) {
213
+ response = error.response;
214
+ }
244
215
  if (response.status < 200 || response.status > 399) {
245
216
  printMessage('error getting auth code', 'error');
246
217
  printMessage('likely cause: mismatched parameters with OAuth client config', 'error');
247
218
  return null;
248
219
  }
249
-
250
- const redirectLocationURL = response.request.res.responseUrl;
220
+ const redirectLocationURL = (_response$headers = response.headers) === null || _response$headers === void 0 ? void 0 : _response$headers.location;
251
221
  const queryObject = url.parse(redirectLocationURL, true).query;
252
-
253
222
  if ('code' in queryObject) {
254
223
  return queryObject.code;
255
224
  }
256
-
257
225
  printMessage('auth code not found', 'error');
258
226
  return null;
259
227
  } catch (error) {
228
+ var _error$response;
260
229
  printMessage(`error getting auth code - ${error.message}`, 'error');
261
- printMessage(error.response.data, 'error');
230
+ printMessage((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data, 'error');
231
+ debugMessage(error.stack);
262
232
  return null;
263
233
  }
264
234
  }
235
+
265
236
  /**
266
237
  * Helper function to obtain oauth2 access token
267
- * @returns {String} empty string or null
238
+ * @returns {Promise<string | null>} access token or null
268
239
  */
269
-
270
-
271
- async function getAccessToken() {
240
+ async function getAccessTokenForUser() {
272
241
  try {
273
242
  const verifier = encodeBase64Url(randomBytes(32));
274
243
  const challenge = encodeBase64Url(createHash('sha256').update(verifier).digest());
275
244
  const challengeMethod = 'S256';
276
- const redirectURL = url.resolve(storage.session.getTenant(), redirectUrlTemplate);
245
+ const redirectURL = url.resolve(state.getHost(), redirectUrlTemplate);
277
246
  const authCode = await getAuthCode(redirectURL, challenge, challengeMethod);
278
-
279
247
  if (authCode == null) {
280
248
  printMessage('error getting auth code', 'error');
281
249
  return null;
282
250
  }
283
-
284
251
  let response = null;
285
-
286
- if (storage.session.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY) {
252
+ if (state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY) {
287
253
  const config = {
288
254
  auth: {
289
255
  username: adminClientId,
@@ -296,65 +262,166 @@ async function getAccessToken() {
296
262
  const bodyFormData = `client_id=${adminClientId}&redirect_uri=${redirectURL}&grant_type=authorization_code&code=${authCode}&code_verifier=${verifier}`;
297
263
  response = await accessToken(bodyFormData);
298
264
  }
299
-
300
- if (response.status < 200 || response.status > 399) {
301
- printMessage(`access token call returned ${response.status}`, 'error');
302
- return null;
303
- }
304
-
305
265
  if ('access_token' in response.data) {
306
- storage.session.setBearerToken(response.data.access_token);
307
- return '';
266
+ return response.data.access_token;
308
267
  }
309
-
310
- printMessage("can't get access token", 'error');
311
- return null;
312
- } catch (e) {
313
- printMessage('error getting access token - ', 'error');
314
- return null;
268
+ printMessage('No access token in response.', 'error');
269
+ } catch (error) {
270
+ var _error$response2;
271
+ debugMessage(`Error getting access token for user: ${error}`);
272
+ debugMessage((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.data);
315
273
  }
274
+ return null;
316
275
  }
276
+ function createPayload(serviceAccountId) {
277
+ const u = parseUrl(state.getHost());
278
+ const aud = `${u.origin}:${u.port ? u.port : u.protocol === 'https' ? '443' : '80'}${u.pathname}/oauth2/access_token`;
279
+
280
+ // Cross platform way of setting JWT expiry time 3 minutes in the future, expressed as number of seconds since EPOCH
281
+ const exp = Math.floor(new Date().getTime() / 1000 + 180);
282
+
283
+ // A unique ID for the JWT which is required when requesting the openid scope
284
+ const jti = v4();
285
+ const iss = serviceAccountId;
286
+ const sub = serviceAccountId;
287
+
288
+ // Create the payload for our bearer token
289
+ const payload = {
290
+ iss,
291
+ sub,
292
+ aud,
293
+ exp,
294
+ jti
295
+ };
296
+ return payload;
297
+ }
298
+
317
299
  /**
318
- * Get tokens
319
- * @param {boolean} save true to save a connection profile upon successful authentication, false otherwise
320
- * @returns {boolean} true if tokens were successfully obtained, false otherwise
300
+ * Get access token for service account
301
+ * @param {string} serviceAccountId UUID of service account
302
+ * @param {JwkRsa} jwk Java Wek Key
303
+ * @returns {string | null} Access token or null
321
304
  */
322
-
323
-
324
- export async function getTokens(save = false) {
325
- let credsFromParameters = true; // if username/password on cli are empty, try to read from connections.json
326
-
327
- if (storage.session.getUsername() == null && storage.session.getPassword() == null) {
328
- credsFromParameters = false;
329
- const conn = await getConnectionProfile();
330
-
331
- if (conn) {
332
- storage.session.setTenant(conn.tenant);
333
- storage.session.setUsername(conn.username);
334
- storage.session.setPassword(conn.password);
335
- storage.session.setAuthenticationService(conn.authenticationService);
336
- storage.session.setAuthenticationHeaderOverrides(conn.authenticationHeaderOverrides);
337
- } else {
338
- return false;
339
- }
305
+ export async function getAccessTokenForServiceAccount(serviceAccountId, jwk) {
306
+ debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: start`);
307
+ const payload = createPayload(serviceAccountId);
308
+ debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: payload:`);
309
+ debugMessage(payload);
310
+ const jwt = await createSignedJwtToken(payload, jwk);
311
+ debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: jwt:`);
312
+ debugMessage(jwt);
313
+ const bodyFormData = `assertion=${jwt}&client_id=service-account&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=${serviceAccountScopes}`;
314
+ const response = await accessToken(bodyFormData);
315
+ if ('access_token' in response.data) {
316
+ debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: token:`);
317
+ debugMessage(response.data.access_token);
318
+ debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: end`);
319
+ return response.data.access_token;
340
320
  }
341
-
342
- await authenticate();
343
-
344
- if (storage.session.getCookieValue() && !storage.session.getBearerToken() && (storage.session.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY || storage.session.getDeploymentType() === globalConfig.FORGEOPS_DEPLOYMENT_TYPE_KEY)) {
345
- await getAccessToken();
321
+ debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: No access token in response.`);
322
+ debugMessage(`AuthenticateOps.getAccessTokenForServiceAccount: end`);
323
+ return null;
324
+ }
325
+ async function determineDeploymentTypeAndDefaultRealmAndVersion() {
326
+ debugMessage(`AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: start`);
327
+ if (!state.getDeploymentType()) {
328
+ state.setDeploymentType(await determineDeploymentType());
346
329
  }
347
-
348
- if (save && storage.session.getCookieValue() && credsFromParameters) {
349
- // valid cookie, which means valid username/password combo. Save it in connections.json
350
- saveConnectionProfile();
351
- return true;
330
+ determineDefaultRealm(state.getDeploymentType());
331
+ debugMessage(`AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: realm=${state.getRealm()}, type=${state.getDeploymentType()}`);
332
+ const versionInfo = (await getServerVersionInfo()).data;
333
+
334
+ // https://github.com/rockcarver/frodo-cli/issues/109
335
+ debugMessage(`Full version: ${versionInfo.fullVersion}`);
336
+ const version = await getSemanticVersion(versionInfo);
337
+ state.setAmVersion(version);
338
+ debugMessage(`AuthenticateOps.determineDeploymentTypeAndDefaultRealmAndVersion: end`);
339
+ }
340
+ async function getLoggedInSubject() {
341
+ let subjectString = `user ${state.getUsername()}`;
342
+ if (state.getUseBearerTokenForAmApis()) {
343
+ const name = (await getManagedObject('svcacct', state.getServiceAccountId(), ['name'])).data.name;
344
+ subjectString = `service account ${name} [${state.getServiceAccountId()}]`;
352
345
  }
346
+ return subjectString;
347
+ }
353
348
 
354
- if (!storage.session.getCookieValue()) {
349
+ /**
350
+ * Get tokens
351
+ * @param {boolean} save true to save a connection profile upon successful authentication, false otherwise
352
+ * @returns {Promise<boolean>} true if tokens were successfully obtained, false otherwise
353
+ */
354
+ export async function getTokens() {
355
+ if (!state.getHost()) {
356
+ printMessage(`No host specified and FRODO_HOST env variable not set!`, 'error');
355
357
  return false;
356
358
  }
359
+ try {
360
+ // if username/password on cli are empty, try to read from connections.json
361
+ if (state.getUsername() == null && state.getPassword() == null && !state.getServiceAccountId() && !state.getServiceAccountJwk()) {
362
+ const conn = await getConnectionProfile();
363
+ if (conn) {
364
+ state.setHost(conn.tenant);
365
+ state.setUsername(conn.username);
366
+ state.setPassword(conn.password);
367
+ state.setAuthenticationService(conn.authenticationService);
368
+ state.setAuthenticationHeaderOverrides(conn.authenticationHeaderOverrides);
369
+ state.setServiceAccountId(conn.svcacctId);
370
+ state.setServiceAccountJwk(conn.svcacctJwk);
371
+ } else {
372
+ return false;
373
+ }
374
+ }
375
+ // now that we have the full tenant URL we can lookup the cookie name
376
+ state.setCookieName(await determineCookieName());
357
377
 
358
- return true;
378
+ // use service account to login?
379
+ if (state.getServiceAccountId() && state.getServiceAccountJwk()) {
380
+ debugMessage(`AuthenticateOps.getTokens: Authenticating with service account ${state.getServiceAccountId()}`);
381
+ try {
382
+ const token = await getAccessTokenForServiceAccount(state.getServiceAccountId(), state.getServiceAccountJwk());
383
+ state.setBearerToken(token);
384
+ state.setUseBearerTokenForAmApis(true);
385
+ await determineDeploymentTypeAndDefaultRealmAndVersion();
386
+ } catch (saErr) {
387
+ var _saErr$response, _saErr$response$data, _saErr$response2, _saErr$response2$data;
388
+ throw new Error(`Service account login error: ${((_saErr$response = saErr.response) === null || _saErr$response === void 0 ? void 0 : (_saErr$response$data = _saErr$response.data) === null || _saErr$response$data === void 0 ? void 0 : _saErr$response$data.error_description) || ((_saErr$response2 = saErr.response) === null || _saErr$response2 === void 0 ? void 0 : (_saErr$response2$data = _saErr$response2.data) === null || _saErr$response2$data === void 0 ? void 0 : _saErr$response2$data.message)}`);
389
+ }
390
+ }
391
+ // use user account to login
392
+ else if (state.getUsername() && state.getPassword()) {
393
+ debugMessage(`AuthenticateOps.getTokens: Authenticating with user account ${state.getUsername()}`);
394
+ const token = await authenticate(state.getUsername(), state.getPassword());
395
+ if (token) state.setCookieValue(token);
396
+ await determineDeploymentTypeAndDefaultRealmAndVersion();
397
+ if (state.getCookieValue() && !state.getBearerToken() && (state.getDeploymentType() === globalConfig.CLOUD_DEPLOYMENT_TYPE_KEY || state.getDeploymentType() === globalConfig.FORGEOPS_DEPLOYMENT_TYPE_KEY)) {
398
+ const accessToken = await getAccessTokenForUser();
399
+ if (accessToken) state.setBearerToken(accessToken);
400
+ }
401
+ }
402
+ // incomplete or no credentials
403
+ else {
404
+ printMessage(`Incomplete or no credentials!`, 'error');
405
+ return false;
406
+ }
407
+ if (state.getCookieValue() || state.getUseBearerTokenForAmApis() && state.getBearerToken()) {
408
+ // https://github.com/rockcarver/frodo-cli/issues/102
409
+ printMessage(`Connected to ${state.getHost()} [${state.getRealm() ? state.getRealm() : 'root'}] as ${await getLoggedInSubject()}`, 'info');
410
+ return true;
411
+ }
412
+ } catch (error) {
413
+ var _error$response3, _error$response3$data, _error$response4, _error$response4$data, _error$response5;
414
+ // regular error
415
+ printMessage(error.message, 'error');
416
+ // axios error am api
417
+ printMessage((_error$response3 = error.response) === null || _error$response3 === void 0 ? void 0 : (_error$response3$data = _error$response3.data) === null || _error$response3$data === void 0 ? void 0 : _error$response3$data.message, 'error');
418
+ // axios error am oauth2 api
419
+ printMessage((_error$response4 = error.response) === null || _error$response4 === void 0 ? void 0 : (_error$response4$data = _error$response4.data) === null || _error$response4$data === void 0 ? void 0 : _error$response4$data.error_description, 'error');
420
+ // axios error data
421
+ debugMessage((_error$response5 = error.response) === null || _error$response5 === void 0 ? void 0 : _error$response5.data);
422
+ // stack trace
423
+ debugMessage(error.stack || new Error().stack);
424
+ }
425
+ return false;
359
426
  }
360
427
  //# sourceMappingURL=AuthenticateOps.js.map
@@ -1,18 +1,16 @@
1
1
  import { Authenticate, state } from '../index';
2
2
  describe('AuthenticationOps', () => {
3
3
  test('getTokens() 1: ', async () => {
4
- state.default.session.setTenant(process.env.FRODO_HOST || 'frodo-dev');
5
- state.default.session.setRealm('alpha');
6
-
4
+ state.setHost(process.env.FRODO_HOST || 'frodo-dev');
5
+ state.setRealm('alpha');
7
6
  if (process.env.FRODO_HOST && process.env.FRODO_USER && process.env.FRODO_PASSWORD) {
8
- state.default.session.setUsername(process.env.FRODO_USER);
9
- state.default.session.setPassword(process.env.FRODO_PASSWORD);
7
+ state.setUsername(process.env.FRODO_USER);
8
+ state.setPassword(process.env.FRODO_PASSWORD);
10
9
  }
11
-
12
10
  await Authenticate.getTokens();
13
- expect(state.default.session.getCookieName()).toBeTruthy();
14
- expect(state.default.session.getCookieValue()).toBeTruthy();
15
- expect(state.default.session.getBearerToken()).toBeTruthy();
11
+ expect(state.getCookieName()).toBeTruthy();
12
+ expect(state.getCookieValue()).toBeTruthy();
13
+ expect(state.getBearerToken()).toBeTruthy();
16
14
  });
17
15
  });
18
16
  //# sourceMappingURL=AuthenticateOps.test.js.map