@rockcarver/frodo-lib 0.17.5 → 0.17.6
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.
- package/CHANGELOG.md +5 -1
- package/cjs/api/AuthenticateApi.js +11 -1
- package/cjs/api/AuthenticateApi.js.map +1 -1
- package/cjs/api/IdmConfigApi.js +4 -2
- package/cjs/api/IdmConfigApi.js.map +1 -1
- package/cjs/ops/IdmOps.js +7 -5
- package/cjs/ops/IdmOps.js.map +1 -1
- package/cjs/ops/ServiceAccountOps.js +22 -7
- package/cjs/ops/ServiceAccountOps.js.map +1 -1
- package/cjs/ops/ServiceAccountOps.test.js.map +1 -1
- package/esm/api/AuthenticateApi.mjs +11 -2
- package/esm/api/IdmConfigApi.mjs +1 -1
- package/esm/ops/IdmOps.mjs +4 -4
- package/esm/ops/ServiceAccountOps.mjs +22 -7
- package/esm/ops/ServiceAccountOps.test.mjs +73 -44
- package/package.json +1 -1
- package/types/api/AuthenticateApi.d.ts +9 -1
- package/types/api/AuthenticateApi.d.ts.map +1 -1
- package/types/api/IdmConfigApi.d.ts +1 -1
- package/types/api/IdmConfigApi.d.ts.map +1 -1
- package/types/ops/IdmOps.d.ts +4 -4
- package/types/ops/IdmOps.d.ts.map +1 -1
- package/types/ops/ServiceAccountOps.d.ts +4 -0
- package/types/ops/ServiceAccountOps.d.ts.map +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.17.6] - 2023-01-09
|
|
11
|
+
|
|
10
12
|
## [0.17.5] - 2023-01-07
|
|
11
13
|
|
|
12
14
|
## [0.17.5-0] - 2023-01-07
|
|
@@ -907,7 +909,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
907
909
|
- Fixed problem with adding connection profiles
|
|
908
910
|
- Miscellaneous bug fixes
|
|
909
911
|
|
|
910
|
-
[Unreleased]: https://github.com/rockcarver/frodo-lib/compare/v0.17.
|
|
912
|
+
[Unreleased]: https://github.com/rockcarver/frodo-lib/compare/v0.17.6...HEAD
|
|
913
|
+
|
|
914
|
+
[0.17.6]: https://github.com/rockcarver/frodo-lib/compare/v0.17.5...v0.17.6
|
|
911
915
|
|
|
912
916
|
[0.17.5]: https://github.com/rockcarver/frodo-lib/compare/v0.17.5-0...v0.17.5
|
|
913
917
|
|
|
@@ -35,6 +35,15 @@ function fillCallbacks(response, map) {
|
|
|
35
35
|
}
|
|
36
36
|
return body;
|
|
37
37
|
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
*
|
|
41
|
+
* @param {any} body POST request body
|
|
42
|
+
* @param {any} config request config
|
|
43
|
+
* @param {string} realm realm
|
|
44
|
+
* @param {string} service name of authentication service/journey
|
|
45
|
+
* @returns Promise resolving to the authentication service response
|
|
46
|
+
*/
|
|
38
47
|
function step() {
|
|
39
48
|
return _step.apply(this, arguments);
|
|
40
49
|
}
|
|
@@ -43,7 +52,8 @@ function _step() {
|
|
|
43
52
|
var body = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
44
53
|
var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
45
54
|
var realm = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '/';
|
|
46
|
-
var
|
|
55
|
+
var service = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : undefined;
|
|
56
|
+
var urlString = service || state.getAuthenticationService() ? _util.default.format(authenticateWithServiceUrlTemplate, state.getHost(), (0, _ApiUtils.getRealmPath)(realm), service || state.getAuthenticationService()) : _util.default.format(authenticateUrlTemplate, state.getHost(), (0, _ApiUtils.getRealmPath)(realm));
|
|
47
57
|
var {
|
|
48
58
|
data
|
|
49
59
|
} = yield (0, _BaseApi.generateAmApi)(getApiConfig()).post(urlString, body, config);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthenticateApi.js","names":["authenticateUrlTemplate","authenticateWithServiceUrlTemplate","apiVersion","getApiConfig","fillCallbacks","response","map","body","JSON","parse","stringify","callback","callbacks","input","value","name","step","config","realm","urlString","state","getAuthenticationService","util","format","getHost","getRealmPath","data","generateAmApi","post"],"sources":["api/AuthenticateApi.ts"],"sourcesContent":["import util from 'util';\nimport { generateAmApi } from './BaseApi';\nimport * as state from '../shared/State';\nimport { getRealmPath } from './utils/ApiUtils';\n\nconst authenticateUrlTemplate = '%s/json%s/authenticate';\nconst authenticateWithServiceUrlTemplate = `${authenticateUrlTemplate}?authIndexType=service&authIndexValue=%s`;\n\nconst apiVersion = 'resource=2.0, protocol=1.0';\nconst getApiConfig = () => ({\n apiVersion,\n});\n\n/**\n * Fill callbacks from a map\n * Just a start\n * @param {object} response json response from a call to /authenticate\n * @param {{ [k: string]: string | number | boolean | string[] }} map name/value map\n * @returns filled response body so it can be used as input to another call to /authenticate\n */\nexport function fillCallbacks(\n response: object,\n map: { [k: string]: string | number | boolean | string[] }\n): object {\n const body = JSON.parse(JSON.stringify(response));\n for (const callback of body.callbacks) {\n callback.input[0].value = map[callback.input[0].name];\n }\n return body;\n}\n\nexport async function step(body = {}
|
|
1
|
+
{"version":3,"file":"AuthenticateApi.js","names":["authenticateUrlTemplate","authenticateWithServiceUrlTemplate","apiVersion","getApiConfig","fillCallbacks","response","map","body","JSON","parse","stringify","callback","callbacks","input","value","name","step","config","realm","service","undefined","urlString","state","getAuthenticationService","util","format","getHost","getRealmPath","data","generateAmApi","post"],"sources":["api/AuthenticateApi.ts"],"sourcesContent":["import util from 'util';\nimport { generateAmApi } from './BaseApi';\nimport * as state from '../shared/State';\nimport { getRealmPath } from './utils/ApiUtils';\n\nconst authenticateUrlTemplate = '%s/json%s/authenticate';\nconst authenticateWithServiceUrlTemplate = `${authenticateUrlTemplate}?authIndexType=service&authIndexValue=%s`;\n\nconst apiVersion = 'resource=2.0, protocol=1.0';\nconst getApiConfig = () => ({\n apiVersion,\n});\n\n/**\n * Fill callbacks from a map\n * Just a start\n * @param {object} response json response from a call to /authenticate\n * @param {{ [k: string]: string | number | boolean | string[] }} map name/value map\n * @returns filled response body so it can be used as input to another call to /authenticate\n */\nexport function fillCallbacks(\n response: object,\n map: { [k: string]: string | number | boolean | string[] }\n): object {\n const body = JSON.parse(JSON.stringify(response));\n for (const callback of body.callbacks) {\n callback.input[0].value = map[callback.input[0].name];\n }\n return body;\n}\n\n/**\n *\n * @param {any} body POST request body\n * @param {any} config request config\n * @param {string} realm realm\n * @param {string} service name of authentication service/journey\n * @returns Promise resolving to the authentication service response\n */\nexport async function step(\n body = {},\n config = {},\n realm = '/',\n service: string = undefined\n) {\n const urlString =\n service || state.getAuthenticationService()\n ? util.format(\n authenticateWithServiceUrlTemplate,\n state.getHost(),\n getRealmPath(realm),\n service || state.getAuthenticationService()\n )\n : util.format(\n authenticateUrlTemplate,\n state.getHost(),\n getRealmPath(realm)\n );\n const { data } = await generateAmApi(getApiConfig()).post(\n urlString,\n body,\n config\n );\n return data;\n}\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AAAgD;AAAA;AAAA;AAAA;AAAA;AAEhD,IAAMA,uBAAuB,GAAG,wBAAwB;AACxD,IAAMC,kCAAkC,aAAMD,uBAAuB,6CAA0C;AAE/G,IAAME,UAAU,GAAG,4BAA4B;AAC/C,IAAMC,YAAY,GAAG,OAAO;EAC1BD;AACF,CAAC,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASE,aAAa,CAC3BC,QAAgB,EAChBC,GAA0D,EAClD;EACR,IAAMC,IAAI,GAAGC,IAAI,CAACC,KAAK,CAACD,IAAI,CAACE,SAAS,CAACL,QAAQ,CAAC,CAAC;EACjD,KAAK,IAAMM,QAAQ,IAAIJ,IAAI,CAACK,SAAS,EAAE;IACrCD,QAAQ,CAACE,KAAK,CAAC,CAAC,CAAC,CAACC,KAAK,GAAGR,GAAG,CAACK,QAAQ,CAACE,KAAK,CAAC,CAAC,CAAC,CAACE,IAAI,CAAC;EACvD;EACA,OAAOR,IAAI;AACb;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAPA,SAQsBS,IAAI;EAAA;AAAA;AAAA;EAAA,0BAAnB,aAKL;IAAA,IAJAT,IAAI,uEAAG,CAAC,CAAC;IAAA,IACTU,MAAM,uEAAG,CAAC,CAAC;IAAA,IACXC,KAAK,uEAAG,GAAG;IAAA,IACXC,OAAe,uEAAGC,SAAS;IAE3B,IAAMC,SAAS,GACbF,OAAO,IAAIG,KAAK,CAACC,wBAAwB,EAAE,GACvCC,aAAI,CAACC,MAAM,CACTxB,kCAAkC,EAClCqB,KAAK,CAACI,OAAO,EAAE,EACf,IAAAC,sBAAY,EAACT,KAAK,CAAC,EACnBC,OAAO,IAAIG,KAAK,CAACC,wBAAwB,EAAE,CAC5C,GACDC,aAAI,CAACC,MAAM,CACTzB,uBAAuB,EACvBsB,KAAK,CAACI,OAAO,EAAE,EACf,IAAAC,sBAAY,EAACT,KAAK,CAAC,CACpB;IACP,IAAM;MAAEU;IAAK,CAAC,SAAS,IAAAC,sBAAa,EAAC1B,YAAY,EAAE,CAAC,CAAC2B,IAAI,CACvDT,SAAS,EACTd,IAAI,EACJU,MAAM,CACP;IACD,OAAOW,IAAI;EACb,CAAC;EAAA;AAAA"}
|
package/cjs/api/IdmConfigApi.js
CHANGED
|
@@ -126,11 +126,13 @@ function _deleteConfigEntity() {
|
|
|
126
126
|
});
|
|
127
127
|
return _deleteConfigEntity.apply(this, arguments);
|
|
128
128
|
}
|
|
129
|
-
function queryAllManagedObjectsByType(_x6
|
|
129
|
+
function queryAllManagedObjectsByType(_x6) {
|
|
130
130
|
return _queryAllManagedObjectsByType.apply(this, arguments);
|
|
131
131
|
}
|
|
132
132
|
function _queryAllManagedObjectsByType() {
|
|
133
|
-
_queryAllManagedObjectsByType = _asyncToGenerator(function* (type
|
|
133
|
+
_queryAllManagedObjectsByType = _asyncToGenerator(function* (type) {
|
|
134
|
+
var fields = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
135
|
+
var pageCookie = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
|
|
134
136
|
var fieldsParam = fields.length > 0 ? "&_fields=".concat(fields.join(',')) : '&_fields=_id';
|
|
135
137
|
var urlTemplate = pageCookie ? "".concat(idmManagedObjectURLTemplate).concat(fieldsParam, "&_pagedResultsCookie=").concat(encodeURIComponent(pageCookie)) : "".concat(idmManagedObjectURLTemplate).concat(fieldsParam);
|
|
136
138
|
var urlString = _util.default.format(urlTemplate, (0, _ApiUtils.getTenantURL)(state.getHost()), type);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdmConfigApi.js","names":["idmAllConfigURLTemplate","idmConfigURLTemplate","idmConfigEntityQueryTemplate","idmManagedObjectURLTemplate","getAllConfigEntities","urlString","util","format","getTenantURL","state","getHost","data","generateIdmApi","get","getConfigEntitiesByType","type","encodeURIComponent","getConfigEntity","entityId","putConfigEntity","entityData","put","error","Error","deleteConfigEntity","delete","withCredentials","queryAllManagedObjectsByType","fields","pageCookie","fieldsParam","length","join","urlTemplate"],"sources":["api/IdmConfigApi.ts"],"sourcesContent":["import util from 'util';\nimport { generateIdmApi } from './BaseApi';\nimport { getTenantURL } from './utils/ApiUtils';\nimport * as state from '../shared/State';\n\nconst idmAllConfigURLTemplate = '%s/openidm/config';\nconst idmConfigURLTemplate = '%s/openidm/config/%s';\nconst idmConfigEntityQueryTemplate = '%s/openidm/config?_queryFilter=%s';\nconst idmManagedObjectURLTemplate =\n '%s/openidm/managed/%s?_queryFilter=true&_pageSize=10000';\n\n/**\n * Get all IDM config entities\n * @returns {Promise} a promise that resolves to all IDM config entities\n */\nexport async function getAllConfigEntities() {\n const urlString = util.format(\n idmAllConfigURLTemplate,\n getTenantURL(state.getHost())\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n\n/**\n * Get IDM config entities by type\n * @param {string} type the desired type of config entity\n * @returns {Promise} a promise that resolves to an object containing all IDM config entities of the desired type\n */\nexport async function getConfigEntitiesByType(type) {\n const urlString = util.format(\n idmConfigEntityQueryTemplate,\n getTenantURL(state.getHost()),\n encodeURIComponent(`_id sw '${type}'`)\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n\n/**\n * Get an IDM config entity\n * @param {string} entityId the desired config entity\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function getConfigEntity(entityId) {\n const urlString = util.format(\n idmConfigURLTemplate,\n getTenantURL(state.getHost()),\n entityId\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n\n/**\n * Put IDM config entity\n * @param {string} entityId config entity id\n * @param {string} entityData config entity object\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function putConfigEntity(\n entityId: string,\n entityData: string | object\n) {\n const urlString = util.format(\n idmConfigURLTemplate,\n getTenantURL(state.getHost()),\n entityId\n );\n try {\n const { data } = await generateIdmApi().put(urlString, entityData);\n return data;\n } catch (error) {\n throw Error(`Could not put config entity ${entityId}: ${error}`);\n }\n}\n\n/**\n * Delete IDM config entity\n * @param {string} entityId config entity id\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function deleteConfigEntity(entityId: string) {\n const urlString = util.format(\n idmConfigURLTemplate,\n getTenantURL(state.getHost()),\n entityId\n );\n const { data } = await generateIdmApi().delete(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Query managed objects\n * @param {string} type managed object type\n * @param {string[]} fields fields to retrieve\n * @param {string} pageCookie paged results cookie\n * @returns {Promise<{result: any[]; resultCount: number; pagedResultsCookie: any; totalPagedResultsPolicy: string; totalPagedResults: number; remainingPagedResults: number;}>} a promise that resolves to managed objects of the desired type\n */\nexport async function queryAllManagedObjectsByType(\n type: string,\n fields: string[],\n pageCookie: string\n): Promise<{\n result: unknown[];\n resultCount: number;\n pagedResultsCookie: string;\n totalPagedResultsPolicy: string;\n totalPagedResults: number;\n remainingPagedResults: number;\n}> {\n const fieldsParam =\n fields.length > 0 ? `&_fields=${fields.join(',')}` : '&_fields=_id';\n const urlTemplate = pageCookie\n ? `${idmManagedObjectURLTemplate}${fieldsParam}&_pagedResultsCookie=${encodeURIComponent(\n pageCookie\n )}`\n : `${idmManagedObjectURLTemplate}${fieldsParam}`;\n const urlString = util.format(\n urlTemplate,\n getTenantURL(state.getHost()),\n type\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n"],"mappings":"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
|
|
1
|
+
{"version":3,"file":"IdmConfigApi.js","names":["idmAllConfigURLTemplate","idmConfigURLTemplate","idmConfigEntityQueryTemplate","idmManagedObjectURLTemplate","getAllConfigEntities","urlString","util","format","getTenantURL","state","getHost","data","generateIdmApi","get","getConfigEntitiesByType","type","encodeURIComponent","getConfigEntity","entityId","putConfigEntity","entityData","put","error","Error","deleteConfigEntity","delete","withCredentials","queryAllManagedObjectsByType","fields","pageCookie","undefined","fieldsParam","length","join","urlTemplate"],"sources":["api/IdmConfigApi.ts"],"sourcesContent":["import util from 'util';\nimport { generateIdmApi } from './BaseApi';\nimport { getTenantURL } from './utils/ApiUtils';\nimport * as state from '../shared/State';\n\nconst idmAllConfigURLTemplate = '%s/openidm/config';\nconst idmConfigURLTemplate = '%s/openidm/config/%s';\nconst idmConfigEntityQueryTemplate = '%s/openidm/config?_queryFilter=%s';\nconst idmManagedObjectURLTemplate =\n '%s/openidm/managed/%s?_queryFilter=true&_pageSize=10000';\n\n/**\n * Get all IDM config entities\n * @returns {Promise} a promise that resolves to all IDM config entities\n */\nexport async function getAllConfigEntities() {\n const urlString = util.format(\n idmAllConfigURLTemplate,\n getTenantURL(state.getHost())\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n\n/**\n * Get IDM config entities by type\n * @param {string} type the desired type of config entity\n * @returns {Promise} a promise that resolves to an object containing all IDM config entities of the desired type\n */\nexport async function getConfigEntitiesByType(type) {\n const urlString = util.format(\n idmConfigEntityQueryTemplate,\n getTenantURL(state.getHost()),\n encodeURIComponent(`_id sw '${type}'`)\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n\n/**\n * Get an IDM config entity\n * @param {string} entityId the desired config entity\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function getConfigEntity(entityId) {\n const urlString = util.format(\n idmConfigURLTemplate,\n getTenantURL(state.getHost()),\n entityId\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n\n/**\n * Put IDM config entity\n * @param {string} entityId config entity id\n * @param {string} entityData config entity object\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function putConfigEntity(\n entityId: string,\n entityData: string | object\n) {\n const urlString = util.format(\n idmConfigURLTemplate,\n getTenantURL(state.getHost()),\n entityId\n );\n try {\n const { data } = await generateIdmApi().put(urlString, entityData);\n return data;\n } catch (error) {\n throw Error(`Could not put config entity ${entityId}: ${error}`);\n }\n}\n\n/**\n * Delete IDM config entity\n * @param {string} entityId config entity id\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function deleteConfigEntity(entityId: string) {\n const urlString = util.format(\n idmConfigURLTemplate,\n getTenantURL(state.getHost()),\n entityId\n );\n const { data } = await generateIdmApi().delete(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Query managed objects\n * @param {string} type managed object type\n * @param {string[]} fields fields to retrieve\n * @param {string} pageCookie paged results cookie\n * @returns {Promise<{result: any[]; resultCount: number; pagedResultsCookie: any; totalPagedResultsPolicy: string; totalPagedResults: number; remainingPagedResults: number;}>} a promise that resolves to managed objects of the desired type\n */\nexport async function queryAllManagedObjectsByType(\n type: string,\n fields: string[] = [],\n pageCookie: string = undefined\n): Promise<{\n result: unknown[];\n resultCount: number;\n pagedResultsCookie: string;\n totalPagedResultsPolicy: string;\n totalPagedResults: number;\n remainingPagedResults: number;\n}> {\n const fieldsParam =\n fields.length > 0 ? `&_fields=${fields.join(',')}` : '&_fields=_id';\n const urlTemplate = pageCookie\n ? `${idmManagedObjectURLTemplate}${fieldsParam}&_pagedResultsCookie=${encodeURIComponent(\n pageCookie\n )}`\n : `${idmManagedObjectURLTemplate}${fieldsParam}`;\n const urlString = util.format(\n urlTemplate,\n getTenantURL(state.getHost()),\n type\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n"],"mappings":"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"}
|
package/cjs/ops/IdmOps.js
CHANGED
|
@@ -65,9 +65,9 @@ function putConfigEntity(_x3, _x4) {
|
|
|
65
65
|
}
|
|
66
66
|
/**
|
|
67
67
|
* Query managed objects
|
|
68
|
-
* @param {
|
|
69
|
-
* @param {[
|
|
70
|
-
* @param {
|
|
68
|
+
* @param {string} type managed object type
|
|
69
|
+
* @param {string[]} fields fields to retrieve
|
|
70
|
+
* @param {string} pageCookie paged results cookie
|
|
71
71
|
* @returns {Promise<{result: any[]; resultCount: number; pagedResultsCookie: any; totalPagedResultsPolicy: string; totalPagedResults: number; remainingPagedResults: number;}>} a promise that resolves to managed objects of the desired type
|
|
72
72
|
*/
|
|
73
73
|
function _putConfigEntity2() {
|
|
@@ -76,7 +76,7 @@ function _putConfigEntity2() {
|
|
|
76
76
|
});
|
|
77
77
|
return _putConfigEntity2.apply(this, arguments);
|
|
78
78
|
}
|
|
79
|
-
function queryAllManagedObjectsByType(_x5
|
|
79
|
+
function queryAllManagedObjectsByType(_x5) {
|
|
80
80
|
return _queryAllManagedObjectsByType2.apply(this, arguments);
|
|
81
81
|
}
|
|
82
82
|
/**
|
|
@@ -84,7 +84,9 @@ function queryAllManagedObjectsByType(_x5, _x6, _x7) {
|
|
|
84
84
|
* @returns {Promise<ConnectorServerStatusInterface[]>} a promise that resolves to an array of ConnectorServerStatusInterface objects
|
|
85
85
|
*/
|
|
86
86
|
function _queryAllManagedObjectsByType2() {
|
|
87
|
-
_queryAllManagedObjectsByType2 = _asyncToGenerator(function* (type
|
|
87
|
+
_queryAllManagedObjectsByType2 = _asyncToGenerator(function* (type) {
|
|
88
|
+
var fields = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
|
|
89
|
+
var pageCookie = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
|
|
88
90
|
return (0, _IdmConfigApi.queryAllManagedObjectsByType)(type, fields, pageCookie);
|
|
89
91
|
});
|
|
90
92
|
return _queryAllManagedObjectsByType2.apply(this, arguments);
|
package/cjs/ops/IdmOps.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdmOps.js","names":["getAllConfigEntities","_getAllConfigEntities","getConfigEntitiesByType","type","_getConfigEntitiesByType","getConfigEntity","entityId","_getConfigEntity","putConfigEntity","entityData","_putConfigEntity","queryAllManagedObjectsByType","fields","pageCookie","_queryAllManagedObjectsByType","testConnectorServers","response","_testConnectorServers","openicf"],"sources":["ops/IdmOps.ts"],"sourcesContent":["import {\n getAllConfigEntities as _getAllConfigEntities,\n getConfigEntity as _getConfigEntity,\n putConfigEntity as _putConfigEntity,\n getConfigEntitiesByType as _getConfigEntitiesByType,\n queryAllManagedObjectsByType as _queryAllManagedObjectsByType,\n} from '../api/IdmConfigApi';\nimport {\n testConnectorServers as _testConnectorServers,\n ConnectorServerStatusInterface,\n} from '../api/IdmSystemApi';\n\n/**\n * Get all IDM config entities\n * @returns {Promise} a promise that resolves to all IDM config entities\n */\nexport async function getAllConfigEntities() {\n return _getAllConfigEntities();\n}\n\n/**\n * Get IDM config entities by type\n * @param {String} type the desired type of config entity\n * @returns {Promise} a promise that resolves to an object containing all IDM config entities of the desired type\n */\nexport async function getConfigEntitiesByType(type) {\n return _getConfigEntitiesByType(type);\n}\n\n/**\n * Get an IDM config entity\n * @param {string} entityId the desired config entity\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function getConfigEntity(entityId) {\n return _getConfigEntity(entityId);\n}\n\n/**\n * Put IDM config entity\n * @param {string} entityId config entity id\n * @param {string} entityData config entity object\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function putConfigEntity(\n entityId: string,\n entityData: string | object\n) {\n return _putConfigEntity(entityId, entityData);\n}\n\n/**\n * Query managed objects\n * @param {
|
|
1
|
+
{"version":3,"file":"IdmOps.js","names":["getAllConfigEntities","_getAllConfigEntities","getConfigEntitiesByType","type","_getConfigEntitiesByType","getConfigEntity","entityId","_getConfigEntity","putConfigEntity","entityData","_putConfigEntity","queryAllManagedObjectsByType","fields","pageCookie","undefined","_queryAllManagedObjectsByType","testConnectorServers","response","_testConnectorServers","openicf"],"sources":["ops/IdmOps.ts"],"sourcesContent":["import {\n getAllConfigEntities as _getAllConfigEntities,\n getConfigEntity as _getConfigEntity,\n putConfigEntity as _putConfigEntity,\n getConfigEntitiesByType as _getConfigEntitiesByType,\n queryAllManagedObjectsByType as _queryAllManagedObjectsByType,\n} from '../api/IdmConfigApi';\nimport {\n testConnectorServers as _testConnectorServers,\n ConnectorServerStatusInterface,\n} from '../api/IdmSystemApi';\n\n/**\n * Get all IDM config entities\n * @returns {Promise} a promise that resolves to all IDM config entities\n */\nexport async function getAllConfigEntities() {\n return _getAllConfigEntities();\n}\n\n/**\n * Get IDM config entities by type\n * @param {String} type the desired type of config entity\n * @returns {Promise} a promise that resolves to an object containing all IDM config entities of the desired type\n */\nexport async function getConfigEntitiesByType(type) {\n return _getConfigEntitiesByType(type);\n}\n\n/**\n * Get an IDM config entity\n * @param {string} entityId the desired config entity\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function getConfigEntity(entityId) {\n return _getConfigEntity(entityId);\n}\n\n/**\n * Put IDM config entity\n * @param {string} entityId config entity id\n * @param {string} entityData config entity object\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function putConfigEntity(\n entityId: string,\n entityData: string | object\n) {\n return _putConfigEntity(entityId, entityData);\n}\n\n/**\n * Query managed objects\n * @param {string} type managed object type\n * @param {string[]} fields fields to retrieve\n * @param {string} pageCookie paged results cookie\n * @returns {Promise<{result: any[]; resultCount: number; pagedResultsCookie: any; totalPagedResultsPolicy: string; totalPagedResults: number; remainingPagedResults: number;}>} a promise that resolves to managed objects of the desired type\n */\nexport async function queryAllManagedObjectsByType(\n type: string,\n fields: string[] = [],\n pageCookie: string = undefined\n): Promise<{\n result: unknown[];\n resultCount: number;\n pagedResultsCookie: string;\n totalPagedResultsPolicy: string;\n totalPagedResults: number;\n remainingPagedResults: number;\n}> {\n return _queryAllManagedObjectsByType(type, fields, pageCookie);\n}\n\n/**\n * Test connector servers\n * @returns {Promise<ConnectorServerStatusInterface[]>} a promise that resolves to an array of ConnectorServerStatusInterface objects\n */\nexport async function testConnectorServers(): Promise<\n ConnectorServerStatusInterface[]\n> {\n const response = await _testConnectorServers();\n return response.openicf;\n}\n"],"mappings":";;;;;;;;;;;AAAA;AAOA;AAG6B;AAAA;AAE7B;AACA;AACA;AACA;AAHA,SAIsBA,oBAAoB;EAAA;AAAA;AAI1C;AACA;AACA;AACA;AACA;AAJA;EAAA,2CAJO,aAAsC;IAC3C,OAAO,IAAAC,kCAAqB,GAAE;EAChC,CAAC;EAAA;AAAA;AAAA,SAOqBC,uBAAuB;EAAA;AAAA;AAI7C;AACA;AACA;AACA;AACA;AAJA;EAAA,8CAJO,WAAuCC,IAAI,EAAE;IAClD,OAAO,IAAAC,qCAAwB,EAACD,IAAI,CAAC;EACvC,CAAC;EAAA;AAAA;AAAA,SAOqBE,eAAe;EAAA;AAAA;AAIrC;AACA;AACA;AACA;AACA;AACA;AALA;EAAA,sCAJO,WAA+BC,QAAQ,EAAE;IAC9C,OAAO,IAAAC,6BAAgB,EAACD,QAAQ,CAAC;EACnC,CAAC;EAAA;AAAA;AAAA,SAQqBE,eAAe;EAAA;AAAA;AAOrC;AACA;AACA;AACA;AACA;AACA;AACA;AANA;EAAA,sCAPO,WACLF,QAAgB,EAChBG,UAA2B,EAC3B;IACA,OAAO,IAAAC,6BAAgB,EAACJ,QAAQ,EAAEG,UAAU,CAAC;EAC/C,CAAC;EAAA;AAAA;AAAA,SASqBE,4BAA4B;EAAA;AAAA;AAelD;AACA;AACA;AACA;AAHA;EAAA,mDAfO,WACLR,IAAY,EAUX;IAAA,IATDS,MAAgB,uEAAG,EAAE;IAAA,IACrBC,UAAkB,uEAAGC,SAAS;IAS9B,OAAO,IAAAC,0CAA6B,EAACZ,IAAI,EAAES,MAAM,EAAEC,UAAU,CAAC;EAChE,CAAC;EAAA;AAAA;AAAA,SAMqBG,oBAAoB;EAAA;AAAA;AAAA;EAAA,2CAAnC,aAEL;IACA,IAAMC,QAAQ,SAAS,IAAAC,kCAAqB,GAAE;IAC9C,OAAOD,QAAQ,CAACE,OAAO;EACzB,CAAC;EAAA;AAAA"}
|
|
@@ -7,11 +7,19 @@ exports.createServiceAccount = createServiceAccount;
|
|
|
7
7
|
exports.isServiceAccountsFeatureAvailable = isServiceAccountsFeatureAvailable;
|
|
8
8
|
var _ManagedObjectApi = require("../api/ManagedObjectApi");
|
|
9
9
|
var _Console = require("./utils/Console");
|
|
10
|
-
var
|
|
10
|
+
var _AuthenticateApi = require("../api/AuthenticateApi");
|
|
11
11
|
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
|
|
12
12
|
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
|
|
13
13
|
var moType = 'svcacct';
|
|
14
|
+
/**
|
|
15
|
+
* Global flag indicating if service accounts are available
|
|
16
|
+
*/
|
|
14
17
|
var serviceAccountsFeatureAvailable = undefined;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Check if service accounts are available
|
|
21
|
+
* @returns {Promise<boolean>} true if service accounts are available, false otherwise
|
|
22
|
+
*/
|
|
15
23
|
function isServiceAccountsFeatureAvailable() {
|
|
16
24
|
return _isServiceAccountsFeatureAvailable.apply(this, arguments);
|
|
17
25
|
}
|
|
@@ -27,12 +35,17 @@ function isServiceAccountsFeatureAvailable() {
|
|
|
27
35
|
function _isServiceAccountsFeatureAvailable() {
|
|
28
36
|
_isServiceAccountsFeatureAvailable = _asyncToGenerator(function* () {
|
|
29
37
|
(0, _Console.debugMessage)("ServiceAccountOps.isServiceAccountsFeatureAvailable: start");
|
|
30
|
-
// only
|
|
38
|
+
// only perform check once
|
|
31
39
|
if (typeof serviceAccountsFeatureAvailable !== 'undefined') return serviceAccountsFeatureAvailable;
|
|
32
|
-
serviceAccountsFeatureAvailable =
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
40
|
+
serviceAccountsFeatureAvailable = true;
|
|
41
|
+
try {
|
|
42
|
+
yield (0, _AuthenticateApi.step)({}, {}, '/', 'FRServiceAccountInternal');
|
|
43
|
+
} catch (error) {
|
|
44
|
+
var _error$response, _error$response2, _error$response3, _error$response3$data;
|
|
45
|
+
(0, _Console.debugMessage)((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data);
|
|
46
|
+
if (((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.status) === 400 && ((_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) === 'No Configuration found') {
|
|
47
|
+
serviceAccountsFeatureAvailable = false;
|
|
48
|
+
}
|
|
36
49
|
}
|
|
37
50
|
(0, _Console.debugMessage)("ServiceAccountOps.isServiceAccountsFeatureAvailable: end, available=".concat(serviceAccountsFeatureAvailable));
|
|
38
51
|
return serviceAccountsFeatureAvailable;
|
|
@@ -44,6 +57,7 @@ function createServiceAccount(_x, _x2, _x3, _x4, _x5) {
|
|
|
44
57
|
}
|
|
45
58
|
function _createServiceAccount() {
|
|
46
59
|
_createServiceAccount = _asyncToGenerator(function* (name, description, accountStatus, scopes, jwks) {
|
|
60
|
+
(0, _Console.debugMessage)("ServiceAccountOps.createServiceAccount: start");
|
|
47
61
|
var payload = {
|
|
48
62
|
name,
|
|
49
63
|
description,
|
|
@@ -51,9 +65,10 @@ function _createServiceAccount() {
|
|
|
51
65
|
scopes,
|
|
52
66
|
jwks: JSON.stringify(jwks)
|
|
53
67
|
};
|
|
54
|
-
(0, _Console.debugMessage)("
|
|
68
|
+
(0, _Console.debugMessage)("ServiceAccountOps: createServiceAccount: payload:");
|
|
55
69
|
(0, _Console.debugMessage)(payload);
|
|
56
70
|
var result = yield (0, _ManagedObjectApi.createManagedObject)(moType, payload);
|
|
71
|
+
(0, _Console.debugMessage)("ServiceAccountOps.createServiceAccount: end");
|
|
57
72
|
return result;
|
|
58
73
|
});
|
|
59
74
|
return _createServiceAccount.apply(this, arguments);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceAccountOps.js","names":["moType","serviceAccountsFeatureAvailable","undefined","isServiceAccountsFeatureAvailable","debugMessage","
|
|
1
|
+
{"version":3,"file":"ServiceAccountOps.js","names":["moType","serviceAccountsFeatureAvailable","undefined","isServiceAccountsFeatureAvailable","debugMessage","step","error","response","data","status","message","createServiceAccount","name","description","accountStatus","scopes","jwks","payload","JSON","stringify","result","createManagedObject"],"sources":["ops/ServiceAccountOps.ts"],"sourcesContent":["import { createManagedObject } from '../api/ManagedObjectApi';\nimport { JwksInterface } from './JoseOps';\nimport { ObjectSkeletonInterface } from '../api/ApiTypes';\nimport { debugMessage } from './utils/Console';\nimport { step } from '../api/AuthenticateApi';\n\nconst moType = 'svcacct';\n\nexport interface SvcacctInterface {\n name: string;\n description: string;\n accountStatus: 'Active' | 'Inactive';\n scopes: string[];\n jwks: string;\n}\n\n/**\n * Global flag indicating if service accounts are available\n */\nlet serviceAccountsFeatureAvailable: boolean = undefined;\n\n/**\n * Check if service accounts are available\n * @returns {Promise<boolean>} true if service accounts are available, false otherwise\n */\nexport async function isServiceAccountsFeatureAvailable(): Promise<boolean> {\n debugMessage(`ServiceAccountOps.isServiceAccountsFeatureAvailable: start`);\n // only perform check once\n if (typeof serviceAccountsFeatureAvailable !== 'undefined')\n return serviceAccountsFeatureAvailable;\n\n serviceAccountsFeatureAvailable = true;\n try {\n await step({}, {}, '/', 'FRServiceAccountInternal');\n } catch (error) {\n debugMessage(error.response?.data);\n if (\n error.response?.status === 400 &&\n error.response?.data?.message === 'No Configuration found'\n ) {\n serviceAccountsFeatureAvailable = false;\n }\n }\n debugMessage(\n `ServiceAccountOps.isServiceAccountsFeatureAvailable: end, available=${serviceAccountsFeatureAvailable}`\n );\n return serviceAccountsFeatureAvailable;\n}\n\n/**\n * Create service account\n * @param {string} name Human-readable name of service account\n * @param {string} description Description of service account\n * @param {'Active' | 'Inactive'} accountStatus Service account status\n * @param {string[]} scopes Scopes.\n * @param {JwksInterface} jwks Java Web Key Set\n * @returns {Promise<ObjectSkeletonInterface>} A promise resolving to a service account object\n */\nexport async function createServiceAccount(\n name: string,\n description: string,\n accountStatus: 'Active' | 'Inactive',\n scopes: string[],\n jwks: JwksInterface\n): Promise<ObjectSkeletonInterface> {\n debugMessage(`ServiceAccountOps.createServiceAccount: start`);\n const payload: SvcacctInterface = {\n name,\n description,\n accountStatus,\n scopes,\n jwks: JSON.stringify(jwks),\n };\n debugMessage(`ServiceAccountOps: createServiceAccount: payload:`);\n debugMessage(payload);\n const result = await createManagedObject(moType, payload);\n debugMessage(`ServiceAccountOps.createServiceAccount: end`);\n return result;\n}\n"],"mappings":";;;;;;;AAAA;AAGA;AACA;AAA8C;AAAA;AAE9C,IAAMA,MAAM,GAAG,SAAS;AAUxB;AACA;AACA;AACA,IAAIC,+BAAwC,GAAGC,SAAS;;AAExD;AACA;AACA;AACA;AAHA,SAIsBC,iCAAiC;EAAA;AAAA;AAwBvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AARA;EAAA,uDAxBO,aAAqE;IAC1E,IAAAC,qBAAY,+DAA8D;IAC1E;IACA,IAAI,OAAOH,+BAA+B,KAAK,WAAW,EACxD,OAAOA,+BAA+B;IAExCA,+BAA+B,GAAG,IAAI;IACtC,IAAI;MACF,MAAM,IAAAI,qBAAI,EAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,0BAA0B,CAAC;IACrD,CAAC,CAAC,OAAOC,KAAK,EAAE;MAAA;MACd,IAAAF,qBAAY,qBAACE,KAAK,CAACC,QAAQ,oDAAd,gBAAgBC,IAAI,CAAC;MAClC,IACE,qBAAAF,KAAK,CAACC,QAAQ,qDAAd,iBAAgBE,MAAM,MAAK,GAAG,IAC9B,qBAAAH,KAAK,CAACC,QAAQ,8EAAd,iBAAgBC,IAAI,0DAApB,sBAAsBE,OAAO,MAAK,wBAAwB,EAC1D;QACAT,+BAA+B,GAAG,KAAK;MACzC;IACF;IACA,IAAAG,qBAAY,gFAC6DH,+BAA+B,EACvG;IACD,OAAOA,+BAA+B;EACxC,CAAC;EAAA;AAAA;AAAA,SAWqBU,oBAAoB;EAAA;AAAA;AAAA;EAAA,0CAAnC,WACLC,IAAY,EACZC,WAAmB,EACnBC,aAAoC,EACpCC,MAAgB,EAChBC,IAAmB,EACe;IAClC,IAAAZ,qBAAY,kDAAiD;IAC7D,IAAMa,OAAyB,GAAG;MAChCL,IAAI;MACJC,WAAW;MACXC,aAAa;MACbC,MAAM;MACNC,IAAI,EAAEE,IAAI,CAACC,SAAS,CAACH,IAAI;IAC3B,CAAC;IACD,IAAAZ,qBAAY,sDAAqD;IACjE,IAAAA,qBAAY,EAACa,OAAO,CAAC;IACrB,IAAMG,MAAM,SAAS,IAAAC,qCAAmB,EAACrB,MAAM,EAAEiB,OAAO,CAAC;IACzD,IAAAb,qBAAY,gDAA+C;IAC3D,OAAOgB,MAAM;EACf,CAAC;EAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServiceAccountOps.test.js","names":["
|
|
1
|
+
{"version":3,"file":"ServiceAccountOps.test.js","names":["jest","setTimeout","matchConfig","defaultMatchRequestsBy","body","autoSetupPolly","describe","only","test","expect","ServiceAccount","isServiceAccountsFeatureAvailable","toBeDefined","response","toBeTruthy","createServiceAccount","name","description","accountStatus","scopes","jwk","createJwkRsa","publicJwk","getJwkRsaPublic","jwks","createJwks","toMatchSnapshot"],"sources":["ops/ServiceAccountOps.test.ts"],"sourcesContent":["/**\n * To record and update snapshots, you must perform 3 steps in order:\n *\n * 1. Record API responses\n *\n * To record API responses, you must call the test:record script and\n * override all the connection state variables required to connect to the\n * env to record from:\n *\n * FRODO_DEBUG=1 FRODO_HOST=frodo-dev npm run test:record ServiceAccountOps\n *\n * The above command assumes that you have a connection profile for\n * 'frodo-dev' on your development machine.\n *\n * 2. Update snapshots\n *\n * After recording API responses, you must manually update/create snapshots\n * by running:\n *\n * FRODO_DEBUG=1 npm run test:update ServiceAccountOps\n *\n * 3. Test your changes\n *\n * If 1 and 2 didn't produce any errors, you are ready to run the tests in\n * replay mode and make sure they all succeed as well:\n *\n * npm run test:only ServiceAccountOps\n *\n * Note: FRODO_DEBUG=1 is optional and enables debug logging for some output\n * in case things don't function as expected\n */\nimport { jest } from '@jest/globals';\nimport { createJwkRsa, createJwks, getJwkRsaPublic } from './JoseOps';\nimport * as ServiceAccount from './ServiceAccountOps';\nimport {\n autoSetupPolly,\n defaultMatchRequestsBy,\n} from '../utils/AutoSetupPolly';\n\n// Increase timeout for this test as pipeline keeps failing with error:\n// Timeout - Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.\njest.setTimeout(30000);\n\n// need to modify the default matching rules to allow the mocking to work for service account tests.\nconst matchConfig = defaultMatchRequestsBy();\nmatchConfig.body = false; // service account create requests are tricky because of the public key, which is different for each request\n\nautoSetupPolly(matchConfig);\n\ndescribe.only('ServiceAccountOps', () => {\n describe('isServiceAccountsFeatureAvailable()', () => {\n test('0: Method is implemented', async () => {\n expect(ServiceAccount.isServiceAccountsFeatureAvailable).toBeDefined();\n });\n\n test('1: Check tenant supporting service accounts', async () => {\n const response = await ServiceAccount.isServiceAccountsFeatureAvailable();\n expect(response).toBeTruthy();\n });\n\n // test('2: Check tenant not supporting service accounts', async () => {\n // (context.polly as Polly).server.any().on('request', (req) => {\n // req.overrideRecordingName(\n // 'ServiceAccountOps/isServiceAccountsFeatureAvailable()/2: Check tenant not supporting service accounts'\n // );\n // console.log(`+++++polly: recordingName: ${req.recordingName}`);\n // });\n // const response = await ServiceAccount.isServiceAccountsFeatureAvailable();\n // expect(response).toBeFalsy();\n // });\n });\n\n describe('createServiceAccount()', () => {\n test('0: Method is implemented', async () => {\n expect(ServiceAccount.createServiceAccount).toBeDefined();\n });\n\n test('1: Create service account', async () => {\n const name = 'sa';\n const description = 'service account';\n const accountStatus = 'Active';\n const scopes = ['fr:am:*', 'fr:idm:*', 'fr:idc:esv:*'];\n const jwk = await createJwkRsa();\n const publicJwk = await getJwkRsaPublic(jwk);\n const jwks = createJwks(publicJwk);\n const response = await ServiceAccount.createServiceAccount(\n name,\n description,\n accountStatus,\n scopes,\n jwks\n );\n expect(response).toMatchSnapshot();\n });\n });\n});\n"],"mappings":";;AA+BA;AACA;AACA;AACA;AAGiC;AAAA;AAAA;AAAA;AAEjC;AACA;AACAA,aAAI,CAACC,UAAU,CAAC,KAAK,CAAC;;AAEtB;AACA,IAAMC,WAAW,GAAG,IAAAC,sCAAsB,GAAE;AAC5CD,WAAW,CAACE,IAAI,GAAG,KAAK,CAAC,CAAC;;AAE1B,IAAAC,8BAAc,EAACH,WAAW,CAAC;AAE3BI,QAAQ,CAACC,IAAI,CAAC,mBAAmB,EAAE,MAAM;EACvCD,QAAQ,CAAC,qCAAqC,EAAE,MAAM;IACpDE,IAAI,CAAC,0BAA0B,iCAAE,aAAY;MAC3CC,MAAM,CAACC,cAAc,CAACC,iCAAiC,CAAC,CAACC,WAAW,EAAE;IACxE,CAAC,EAAC;IAEFJ,IAAI,CAAC,6CAA6C,iCAAE,aAAY;MAC9D,IAAMK,QAAQ,SAASH,cAAc,CAACC,iCAAiC,EAAE;MACzEF,MAAM,CAACI,QAAQ,CAAC,CAACC,UAAU,EAAE;IAC/B,CAAC,EAAC;;IAEF;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;EACF,CAAC,CAAC;;EAEFR,QAAQ,CAAC,wBAAwB,EAAE,MAAM;IACvCE,IAAI,CAAC,0BAA0B,iCAAE,aAAY;MAC3CC,MAAM,CAACC,cAAc,CAACK,oBAAoB,CAAC,CAACH,WAAW,EAAE;IAC3D,CAAC,EAAC;IAEFJ,IAAI,CAAC,2BAA2B,iCAAE,aAAY;MAC5C,IAAMQ,IAAI,GAAG,IAAI;MACjB,IAAMC,WAAW,GAAG,iBAAiB;MACrC,IAAMC,aAAa,GAAG,QAAQ;MAC9B,IAAMC,MAAM,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,cAAc,CAAC;MACtD,IAAMC,GAAG,SAAS,IAAAC,qBAAY,GAAE;MAChC,IAAMC,SAAS,SAAS,IAAAC,wBAAe,EAACH,GAAG,CAAC;MAC5C,IAAMI,IAAI,GAAG,IAAAC,mBAAU,EAACH,SAAS,CAAC;MAClC,IAAMT,QAAQ,SAASH,cAAc,CAACK,oBAAoB,CACxDC,IAAI,EACJC,WAAW,EACXC,aAAa,EACbC,MAAM,EACNK,IAAI,CACL;MACDf,MAAM,CAACI,QAAQ,CAAC,CAACa,eAAe,EAAE;IACpC,CAAC,EAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -23,8 +23,17 @@ export function fillCallbacks(response, map) {
|
|
|
23
23
|
}
|
|
24
24
|
return body;
|
|
25
25
|
}
|
|
26
|
-
|
|
27
|
-
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
*
|
|
29
|
+
* @param {any} body POST request body
|
|
30
|
+
* @param {any} config request config
|
|
31
|
+
* @param {string} realm realm
|
|
32
|
+
* @param {string} service name of authentication service/journey
|
|
33
|
+
* @returns Promise resolving to the authentication service response
|
|
34
|
+
*/
|
|
35
|
+
export async function step(body = {}, config = {}, realm = '/', service = undefined) {
|
|
36
|
+
const urlString = service || state.getAuthenticationService() ? util.format(authenticateWithServiceUrlTemplate, state.getHost(), getRealmPath(realm), service || state.getAuthenticationService()) : util.format(authenticateUrlTemplate, state.getHost(), getRealmPath(realm));
|
|
28
37
|
const {
|
|
29
38
|
data
|
|
30
39
|
} = await generateAmApi(getApiConfig()).post(urlString, body, config);
|
package/esm/api/IdmConfigApi.mjs
CHANGED
|
@@ -85,7 +85,7 @@ export async function deleteConfigEntity(entityId) {
|
|
|
85
85
|
* @param {string} pageCookie paged results cookie
|
|
86
86
|
* @returns {Promise<{result: any[]; resultCount: number; pagedResultsCookie: any; totalPagedResultsPolicy: string; totalPagedResults: number; remainingPagedResults: number;}>} a promise that resolves to managed objects of the desired type
|
|
87
87
|
*/
|
|
88
|
-
export async function queryAllManagedObjectsByType(type, fields, pageCookie) {
|
|
88
|
+
export async function queryAllManagedObjectsByType(type, fields = [], pageCookie = undefined) {
|
|
89
89
|
const fieldsParam = fields.length > 0 ? `&_fields=${fields.join(',')}` : '&_fields=_id';
|
|
90
90
|
const urlTemplate = pageCookie ? `${idmManagedObjectURLTemplate}${fieldsParam}&_pagedResultsCookie=${encodeURIComponent(pageCookie)}` : `${idmManagedObjectURLTemplate}${fieldsParam}`;
|
|
91
91
|
const urlString = util.format(urlTemplate, getTenantURL(state.getHost()), type);
|
package/esm/ops/IdmOps.mjs
CHANGED
|
@@ -39,12 +39,12 @@ export async function putConfigEntity(entityId, entityData) {
|
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
41
|
* Query managed objects
|
|
42
|
-
* @param {
|
|
43
|
-
* @param {[
|
|
44
|
-
* @param {
|
|
42
|
+
* @param {string} type managed object type
|
|
43
|
+
* @param {string[]} fields fields to retrieve
|
|
44
|
+
* @param {string} pageCookie paged results cookie
|
|
45
45
|
* @returns {Promise<{result: any[]; resultCount: number; pagedResultsCookie: any; totalPagedResultsPolicy: string; totalPagedResults: number; remainingPagedResults: number;}>} a promise that resolves to managed objects of the desired type
|
|
46
46
|
*/
|
|
47
|
-
export async function queryAllManagedObjectsByType(type, fields, pageCookie) {
|
|
47
|
+
export async function queryAllManagedObjectsByType(type, fields = [], pageCookie = undefined) {
|
|
48
48
|
return _queryAllManagedObjectsByType(type, fields, pageCookie);
|
|
49
49
|
}
|
|
50
50
|
|
|
@@ -1,16 +1,29 @@
|
|
|
1
1
|
import { createManagedObject } from '../api/ManagedObjectApi';
|
|
2
2
|
import { debugMessage } from './utils/Console';
|
|
3
|
-
import {
|
|
3
|
+
import { step } from '../api/AuthenticateApi';
|
|
4
4
|
const moType = 'svcacct';
|
|
5
|
+
/**
|
|
6
|
+
* Global flag indicating if service accounts are available
|
|
7
|
+
*/
|
|
5
8
|
let serviceAccountsFeatureAvailable = undefined;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Check if service accounts are available
|
|
12
|
+
* @returns {Promise<boolean>} true if service accounts are available, false otherwise
|
|
13
|
+
*/
|
|
6
14
|
export async function isServiceAccountsFeatureAvailable() {
|
|
7
15
|
debugMessage(`ServiceAccountOps.isServiceAccountsFeatureAvailable: start`);
|
|
8
|
-
// only
|
|
16
|
+
// only perform check once
|
|
9
17
|
if (typeof serviceAccountsFeatureAvailable !== 'undefined') return serviceAccountsFeatureAvailable;
|
|
10
|
-
serviceAccountsFeatureAvailable =
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
18
|
+
serviceAccountsFeatureAvailable = true;
|
|
19
|
+
try {
|
|
20
|
+
await step({}, {}, '/', 'FRServiceAccountInternal');
|
|
21
|
+
} catch (error) {
|
|
22
|
+
var _error$response, _error$response2, _error$response3, _error$response3$data;
|
|
23
|
+
debugMessage((_error$response = error.response) === null || _error$response === void 0 ? void 0 : _error$response.data);
|
|
24
|
+
if (((_error$response2 = error.response) === null || _error$response2 === void 0 ? void 0 : _error$response2.status) === 400 && ((_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) === 'No Configuration found') {
|
|
25
|
+
serviceAccountsFeatureAvailable = false;
|
|
26
|
+
}
|
|
14
27
|
}
|
|
15
28
|
debugMessage(`ServiceAccountOps.isServiceAccountsFeatureAvailable: end, available=${serviceAccountsFeatureAvailable}`);
|
|
16
29
|
return serviceAccountsFeatureAvailable;
|
|
@@ -26,6 +39,7 @@ export async function isServiceAccountsFeatureAvailable() {
|
|
|
26
39
|
* @returns {Promise<ObjectSkeletonInterface>} A promise resolving to a service account object
|
|
27
40
|
*/
|
|
28
41
|
export async function createServiceAccount(name, description, accountStatus, scopes, jwks) {
|
|
42
|
+
debugMessage(`ServiceAccountOps.createServiceAccount: start`);
|
|
29
43
|
const payload = {
|
|
30
44
|
name,
|
|
31
45
|
description,
|
|
@@ -33,9 +47,10 @@ export async function createServiceAccount(name, description, accountStatus, sco
|
|
|
33
47
|
scopes,
|
|
34
48
|
jwks: JSON.stringify(jwks)
|
|
35
49
|
};
|
|
36
|
-
debugMessage(`
|
|
50
|
+
debugMessage(`ServiceAccountOps: createServiceAccount: payload:`);
|
|
37
51
|
debugMessage(payload);
|
|
38
52
|
const result = await createManagedObject(moType, payload);
|
|
53
|
+
debugMessage(`ServiceAccountOps.createServiceAccount: end`);
|
|
39
54
|
return result;
|
|
40
55
|
}
|
|
41
56
|
//# sourceMappingURL=ServiceAccountOps.js.map
|
|
@@ -1,56 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* To record and update snapshots, you must perform 3 steps in order:
|
|
3
|
+
*
|
|
4
|
+
* 1. Record API responses
|
|
5
|
+
*
|
|
6
|
+
* To record API responses, you must call the test:record script and
|
|
7
|
+
* override all the connection state variables required to connect to the
|
|
8
|
+
* env to record from:
|
|
9
|
+
*
|
|
10
|
+
* FRODO_DEBUG=1 FRODO_HOST=frodo-dev npm run test:record ServiceAccountOps
|
|
11
|
+
*
|
|
12
|
+
* The above command assumes that you have a connection profile for
|
|
13
|
+
* 'frodo-dev' on your development machine.
|
|
14
|
+
*
|
|
15
|
+
* 2. Update snapshots
|
|
16
|
+
*
|
|
17
|
+
* After recording API responses, you must manually update/create snapshots
|
|
18
|
+
* by running:
|
|
19
|
+
*
|
|
20
|
+
* FRODO_DEBUG=1 npm run test:update ServiceAccountOps
|
|
21
|
+
*
|
|
22
|
+
* 3. Test your changes
|
|
23
|
+
*
|
|
24
|
+
* If 1 and 2 didn't produce any errors, you are ready to run the tests in
|
|
25
|
+
* replay mode and make sure they all succeed as well:
|
|
26
|
+
*
|
|
27
|
+
* npm run test:only ServiceAccountOps
|
|
28
|
+
*
|
|
29
|
+
* Note: FRODO_DEBUG=1 is optional and enables debug logging for some output
|
|
30
|
+
* in case things don't function as expected
|
|
31
|
+
*/
|
|
1
32
|
import { jest } from '@jest/globals';
|
|
2
|
-
import axios from 'axios';
|
|
3
|
-
import MockAdapter from 'axios-mock-adapter';
|
|
4
|
-
import { state } from '../index';
|
|
5
|
-
import * as globalConfig from '../storage/StaticStorage';
|
|
6
33
|
import { createJwkRsa, createJwks, getJwkRsaPublic } from './JoseOps';
|
|
7
34
|
import * as ServiceAccount from './ServiceAccountOps';
|
|
8
|
-
import {
|
|
9
|
-
import { isEqualJson } from './utils/OpsUtils';
|
|
10
|
-
const mock = new MockAdapter(axios);
|
|
35
|
+
import { autoSetupPolly, defaultMatchRequestsBy } from '../utils/AutoSetupPolly';
|
|
11
36
|
|
|
12
37
|
// Increase timeout for this test as pipeline keeps failing with error:
|
|
13
38
|
// Timeout - Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.
|
|
14
39
|
jest.setTimeout(30000);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
40
|
+
|
|
41
|
+
// need to modify the default matching rules to allow the mocking to work for service account tests.
|
|
42
|
+
const matchConfig = defaultMatchRequestsBy();
|
|
43
|
+
matchConfig.body = false; // service account create requests are tricky because of the public key, which is different for each request
|
|
44
|
+
|
|
45
|
+
autoSetupPolly(matchConfig);
|
|
46
|
+
describe.only('ServiceAccountOps', () => {
|
|
47
|
+
describe('isServiceAccountsFeatureAvailable()', () => {
|
|
48
|
+
test('0: Method is implemented', async () => {
|
|
49
|
+
expect(ServiceAccount.isServiceAccountsFeatureAvailable).toBeDefined();
|
|
50
|
+
});
|
|
51
|
+
test('1: Check tenant supporting service accounts', async () => {
|
|
52
|
+
const response = await ServiceAccount.isServiceAccountsFeatureAvailable();
|
|
53
|
+
expect(response).toBeTruthy();
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// test('2: Check tenant not supporting service accounts', async () => {
|
|
57
|
+
// (context.polly as Polly).server.any().on('request', (req) => {
|
|
58
|
+
// req.overrideRecordingName(
|
|
59
|
+
// 'ServiceAccountOps/isServiceAccountsFeatureAvailable()/2: Check tenant not supporting service accounts'
|
|
60
|
+
// );
|
|
61
|
+
// console.log(`+++++polly: recordingName: ${req.recordingName}`);
|
|
62
|
+
// });
|
|
63
|
+
// const response = await ServiceAccount.isServiceAccountsFeatureAvailable();
|
|
64
|
+
// expect(response).toBeFalsy();
|
|
65
|
+
// });
|
|
31
66
|
});
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
67
|
+
|
|
68
|
+
describe('createServiceAccount()', () => {
|
|
69
|
+
test('0: Method is implemented', async () => {
|
|
70
|
+
expect(ServiceAccount.createServiceAccount).toBeDefined();
|
|
71
|
+
});
|
|
72
|
+
test('1: Create service account', async () => {
|
|
73
|
+
const name = 'sa';
|
|
74
|
+
const description = 'service account';
|
|
75
|
+
const accountStatus = 'Active';
|
|
76
|
+
const scopes = ['fr:am:*', 'fr:idm:*', 'fr:idc:esv:*'];
|
|
77
|
+
const jwk = await createJwkRsa();
|
|
78
|
+
const publicJwk = await getJwkRsaPublic(jwk);
|
|
79
|
+
const jwks = createJwks(publicJwk);
|
|
80
|
+
const response = await ServiceAccount.createServiceAccount(name, description, accountStatus, scopes, jwks);
|
|
81
|
+
expect(response).toMatchSnapshot();
|
|
46
82
|
});
|
|
47
|
-
const payload = await ServiceAccount.createServiceAccount(name, description, accountStatus, scopes, jwks);
|
|
48
|
-
expect(isEqualJson(payload, moData)).toBeTruthy();
|
|
49
|
-
expect(payload).toBeTruthy();
|
|
50
|
-
expect(payload._id).toBe(moId);
|
|
51
|
-
expect(payload.name).toBe(name);
|
|
52
|
-
expect(payload.description).toBe(description);
|
|
53
|
-
expect(payload.scopes).toStrictEqual(scopes);
|
|
54
83
|
});
|
|
55
84
|
});
|
|
56
85
|
//# sourceMappingURL=ServiceAccountOps.test.js.map
|
package/package.json
CHANGED
|
@@ -8,4 +8,12 @@
|
|
|
8
8
|
export declare function fillCallbacks(response: object, map: {
|
|
9
9
|
[k: string]: string | number | boolean | string[];
|
|
10
10
|
}): object;
|
|
11
|
-
|
|
11
|
+
/**
|
|
12
|
+
*
|
|
13
|
+
* @param {any} body POST request body
|
|
14
|
+
* @param {any} config request config
|
|
15
|
+
* @param {string} realm realm
|
|
16
|
+
* @param {string} service name of authentication service/journey
|
|
17
|
+
* @returns Promise resolving to the authentication service response
|
|
18
|
+
*/
|
|
19
|
+
export declare function step(body?: {}, config?: {}, realm?: string, service?: string): Promise<any>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/AuthenticateApi.ts"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAA;CAAE,GACzD,MAAM,CAMR;AAED,wBAAsB,IAAI,
|
|
1
|
+
{"version":3,"sources":["../src/api/AuthenticateApi.ts"],"names":[],"mappings":"AAaA;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,EAAE,CAAA;CAAE,GACzD,MAAM,CAMR;AAED;;;;;;;GAOG;AACH,wBAAsB,IAAI,CACxB,IAAI,KAAK,EACT,MAAM,KAAK,EACX,KAAK,SAAM,EACX,OAAO,GAAE,MAAkB,gBAqB5B","file":"AuthenticateApi.d.ts","sourcesContent":["import util from 'util';\nimport { generateAmApi } from './BaseApi';\nimport * as state from '../shared/State';\nimport { getRealmPath } from './utils/ApiUtils';\n\nconst authenticateUrlTemplate = '%s/json%s/authenticate';\nconst authenticateWithServiceUrlTemplate = `${authenticateUrlTemplate}?authIndexType=service&authIndexValue=%s`;\n\nconst apiVersion = 'resource=2.0, protocol=1.0';\nconst getApiConfig = () => ({\n apiVersion,\n});\n\n/**\n * Fill callbacks from a map\n * Just a start\n * @param {object} response json response from a call to /authenticate\n * @param {{ [k: string]: string | number | boolean | string[] }} map name/value map\n * @returns filled response body so it can be used as input to another call to /authenticate\n */\nexport function fillCallbacks(\n response: object,\n map: { [k: string]: string | number | boolean | string[] }\n): object {\n const body = JSON.parse(JSON.stringify(response));\n for (const callback of body.callbacks) {\n callback.input[0].value = map[callback.input[0].name];\n }\n return body;\n}\n\n/**\n *\n * @param {any} body POST request body\n * @param {any} config request config\n * @param {string} realm realm\n * @param {string} service name of authentication service/journey\n * @returns Promise resolving to the authentication service response\n */\nexport async function step(\n body = {},\n config = {},\n realm = '/',\n service: string = undefined\n) {\n const urlString =\n service || state.getAuthenticationService()\n ? util.format(\n authenticateWithServiceUrlTemplate,\n state.getHost(),\n getRealmPath(realm),\n service || state.getAuthenticationService()\n )\n : util.format(\n authenticateUrlTemplate,\n state.getHost(),\n getRealmPath(realm)\n );\n const { data } = await generateAmApi(getApiConfig()).post(\n urlString,\n body,\n config\n );\n return data;\n}\n"]}
|
|
@@ -35,7 +35,7 @@ export declare function deleteConfigEntity(entityId: string): Promise<any>;
|
|
|
35
35
|
* @param {string} pageCookie paged results cookie
|
|
36
36
|
* @returns {Promise<{result: any[]; resultCount: number; pagedResultsCookie: any; totalPagedResultsPolicy: string; totalPagedResults: number; remainingPagedResults: number;}>} a promise that resolves to managed objects of the desired type
|
|
37
37
|
*/
|
|
38
|
-
export declare function queryAllManagedObjectsByType(type: string, fields
|
|
38
|
+
export declare function queryAllManagedObjectsByType(type: string, fields?: string[], pageCookie?: string): Promise<{
|
|
39
39
|
result: unknown[];
|
|
40
40
|
resultCount: number;
|
|
41
41
|
pagedResultsCookie: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/api/IdmConfigApi.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,wBAAsB,oBAAoB,iBAOzC;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,KAAA,gBAQjD;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,QAAQ,KAAA,gBAQ7C;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,MAAM,gBAa5B;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,gBAUxD;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,EACZ,MAAM,
|
|
1
|
+
{"version":3,"sources":["../src/api/IdmConfigApi.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,wBAAsB,oBAAoB,iBAOzC;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,KAAA,gBAQjD;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,QAAQ,KAAA,gBAQ7C;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,MAAM,gBAa5B;AAED;;;;GAIG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,gBAUxD;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAM,EAAO,EACrB,UAAU,GAAE,MAAkB,GAC7B,OAAO,CAAC;IACT,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC,CAeD","file":"IdmConfigApi.d.ts","sourcesContent":["import util from 'util';\nimport { generateIdmApi } from './BaseApi';\nimport { getTenantURL } from './utils/ApiUtils';\nimport * as state from '../shared/State';\n\nconst idmAllConfigURLTemplate = '%s/openidm/config';\nconst idmConfigURLTemplate = '%s/openidm/config/%s';\nconst idmConfigEntityQueryTemplate = '%s/openidm/config?_queryFilter=%s';\nconst idmManagedObjectURLTemplate =\n '%s/openidm/managed/%s?_queryFilter=true&_pageSize=10000';\n\n/**\n * Get all IDM config entities\n * @returns {Promise} a promise that resolves to all IDM config entities\n */\nexport async function getAllConfigEntities() {\n const urlString = util.format(\n idmAllConfigURLTemplate,\n getTenantURL(state.getHost())\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n\n/**\n * Get IDM config entities by type\n * @param {string} type the desired type of config entity\n * @returns {Promise} a promise that resolves to an object containing all IDM config entities of the desired type\n */\nexport async function getConfigEntitiesByType(type) {\n const urlString = util.format(\n idmConfigEntityQueryTemplate,\n getTenantURL(state.getHost()),\n encodeURIComponent(`_id sw '${type}'`)\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n\n/**\n * Get an IDM config entity\n * @param {string} entityId the desired config entity\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function getConfigEntity(entityId) {\n const urlString = util.format(\n idmConfigURLTemplate,\n getTenantURL(state.getHost()),\n entityId\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n\n/**\n * Put IDM config entity\n * @param {string} entityId config entity id\n * @param {string} entityData config entity object\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function putConfigEntity(\n entityId: string,\n entityData: string | object\n) {\n const urlString = util.format(\n idmConfigURLTemplate,\n getTenantURL(state.getHost()),\n entityId\n );\n try {\n const { data } = await generateIdmApi().put(urlString, entityData);\n return data;\n } catch (error) {\n throw Error(`Could not put config entity ${entityId}: ${error}`);\n }\n}\n\n/**\n * Delete IDM config entity\n * @param {string} entityId config entity id\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function deleteConfigEntity(entityId: string) {\n const urlString = util.format(\n idmConfigURLTemplate,\n getTenantURL(state.getHost()),\n entityId\n );\n const { data } = await generateIdmApi().delete(urlString, {\n withCredentials: true,\n });\n return data;\n}\n\n/**\n * Query managed objects\n * @param {string} type managed object type\n * @param {string[]} fields fields to retrieve\n * @param {string} pageCookie paged results cookie\n * @returns {Promise<{result: any[]; resultCount: number; pagedResultsCookie: any; totalPagedResultsPolicy: string; totalPagedResults: number; remainingPagedResults: number;}>} a promise that resolves to managed objects of the desired type\n */\nexport async function queryAllManagedObjectsByType(\n type: string,\n fields: string[] = [],\n pageCookie: string = undefined\n): Promise<{\n result: unknown[];\n resultCount: number;\n pagedResultsCookie: string;\n totalPagedResultsPolicy: string;\n totalPagedResults: number;\n remainingPagedResults: number;\n}> {\n const fieldsParam =\n fields.length > 0 ? `&_fields=${fields.join(',')}` : '&_fields=_id';\n const urlTemplate = pageCookie\n ? `${idmManagedObjectURLTemplate}${fieldsParam}&_pagedResultsCookie=${encodeURIComponent(\n pageCookie\n )}`\n : `${idmManagedObjectURLTemplate}${fieldsParam}`;\n const urlString = util.format(\n urlTemplate,\n getTenantURL(state.getHost()),\n type\n );\n const { data } = await generateIdmApi().get(urlString);\n return data;\n}\n"]}
|
package/types/ops/IdmOps.d.ts
CHANGED
|
@@ -25,12 +25,12 @@ export declare function getConfigEntity(entityId: any): Promise<any>;
|
|
|
25
25
|
export declare function putConfigEntity(entityId: string, entityData: string | object): Promise<any>;
|
|
26
26
|
/**
|
|
27
27
|
* Query managed objects
|
|
28
|
-
* @param {
|
|
29
|
-
* @param {[
|
|
30
|
-
* @param {
|
|
28
|
+
* @param {string} type managed object type
|
|
29
|
+
* @param {string[]} fields fields to retrieve
|
|
30
|
+
* @param {string} pageCookie paged results cookie
|
|
31
31
|
* @returns {Promise<{result: any[]; resultCount: number; pagedResultsCookie: any; totalPagedResultsPolicy: string; totalPagedResults: number; remainingPagedResults: number;}>} a promise that resolves to managed objects of the desired type
|
|
32
32
|
*/
|
|
33
|
-
export declare function queryAllManagedObjectsByType(type:
|
|
33
|
+
export declare function queryAllManagedObjectsByType(type: string, fields?: string[], pageCookie?: string): Promise<{
|
|
34
34
|
result: unknown[];
|
|
35
35
|
resultCount: number;
|
|
36
36
|
pagedResultsCookie: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ops/IdmOps.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,8BAA8B,EAC/B,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,wBAAsB,oBAAoB,iBAEzC;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,KAAA,gBAEjD;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,QAAQ,KAAA,gBAE7C;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,MAAM,gBAG5B;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,
|
|
1
|
+
{"version":3,"sources":["../src/ops/IdmOps.ts"],"names":[],"mappings":"AAOA,OAAO,EAEL,8BAA8B,EAC/B,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,wBAAsB,oBAAoB,iBAEzC;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,KAAA,gBAEjD;AAED;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,QAAQ,KAAA,gBAE7C;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,GAAG,MAAM,gBAG5B;AAED;;;;;;GAMG;AACH,wBAAsB,4BAA4B,CAChD,IAAI,EAAE,MAAM,EACZ,MAAM,GAAE,MAAM,EAAO,EACrB,UAAU,GAAE,MAAkB,GAC7B,OAAO,CAAC;IACT,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,uBAAuB,EAAE,MAAM,CAAC;IAChC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC,CAED;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,IAAI,OAAO,CACnD,8BAA8B,EAAE,CACjC,CAGA","file":"IdmOps.d.ts","sourcesContent":["import {\n getAllConfigEntities as _getAllConfigEntities,\n getConfigEntity as _getConfigEntity,\n putConfigEntity as _putConfigEntity,\n getConfigEntitiesByType as _getConfigEntitiesByType,\n queryAllManagedObjectsByType as _queryAllManagedObjectsByType,\n} from '../api/IdmConfigApi';\nimport {\n testConnectorServers as _testConnectorServers,\n ConnectorServerStatusInterface,\n} from '../api/IdmSystemApi';\n\n/**\n * Get all IDM config entities\n * @returns {Promise} a promise that resolves to all IDM config entities\n */\nexport async function getAllConfigEntities() {\n return _getAllConfigEntities();\n}\n\n/**\n * Get IDM config entities by type\n * @param {String} type the desired type of config entity\n * @returns {Promise} a promise that resolves to an object containing all IDM config entities of the desired type\n */\nexport async function getConfigEntitiesByType(type) {\n return _getConfigEntitiesByType(type);\n}\n\n/**\n * Get an IDM config entity\n * @param {string} entityId the desired config entity\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function getConfigEntity(entityId) {\n return _getConfigEntity(entityId);\n}\n\n/**\n * Put IDM config entity\n * @param {string} entityId config entity id\n * @param {string} entityData config entity object\n * @returns {Promise<unknown>} a promise that resolves to an IDM config entity\n */\nexport async function putConfigEntity(\n entityId: string,\n entityData: string | object\n) {\n return _putConfigEntity(entityId, entityData);\n}\n\n/**\n * Query managed objects\n * @param {string} type managed object type\n * @param {string[]} fields fields to retrieve\n * @param {string} pageCookie paged results cookie\n * @returns {Promise<{result: any[]; resultCount: number; pagedResultsCookie: any; totalPagedResultsPolicy: string; totalPagedResults: number; remainingPagedResults: number;}>} a promise that resolves to managed objects of the desired type\n */\nexport async function queryAllManagedObjectsByType(\n type: string,\n fields: string[] = [],\n pageCookie: string = undefined\n): Promise<{\n result: unknown[];\n resultCount: number;\n pagedResultsCookie: string;\n totalPagedResultsPolicy: string;\n totalPagedResults: number;\n remainingPagedResults: number;\n}> {\n return _queryAllManagedObjectsByType(type, fields, pageCookie);\n}\n\n/**\n * Test connector servers\n * @returns {Promise<ConnectorServerStatusInterface[]>} a promise that resolves to an array of ConnectorServerStatusInterface objects\n */\nexport async function testConnectorServers(): Promise<\n ConnectorServerStatusInterface[]\n> {\n const response = await _testConnectorServers();\n return response.openicf;\n}\n"]}
|
|
@@ -7,6 +7,10 @@ export interface SvcacctInterface {
|
|
|
7
7
|
scopes: string[];
|
|
8
8
|
jwks: string;
|
|
9
9
|
}
|
|
10
|
+
/**
|
|
11
|
+
* Check if service accounts are available
|
|
12
|
+
* @returns {Promise<boolean>} true if service accounts are available, false otherwise
|
|
13
|
+
*/
|
|
10
14
|
export declare function isServiceAccountsFeatureAvailable(): Promise<boolean>;
|
|
11
15
|
/**
|
|
12
16
|
* Create service account
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ops/ServiceAccountOps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAM1D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,QAAQ,GAAG,UAAU,CAAC;IACrC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;
|
|
1
|
+
{"version":3,"sources":["../src/ops/ServiceAccountOps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAM1D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,QAAQ,GAAG,UAAU,CAAC;IACrC,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;CACd;AAOD;;;GAGG;AACH,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,OAAO,CAAC,CAsB1E;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,QAAQ,GAAG,UAAU,EACpC,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,uBAAuB,CAAC,CAclC","file":"ServiceAccountOps.d.ts","sourcesContent":["import { createManagedObject } from '../api/ManagedObjectApi';\nimport { JwksInterface } from './JoseOps';\nimport { ObjectSkeletonInterface } from '../api/ApiTypes';\nimport { debugMessage } from './utils/Console';\nimport { step } from '../api/AuthenticateApi';\n\nconst moType = 'svcacct';\n\nexport interface SvcacctInterface {\n name: string;\n description: string;\n accountStatus: 'Active' | 'Inactive';\n scopes: string[];\n jwks: string;\n}\n\n/**\n * Global flag indicating if service accounts are available\n */\nlet serviceAccountsFeatureAvailable: boolean = undefined;\n\n/**\n * Check if service accounts are available\n * @returns {Promise<boolean>} true if service accounts are available, false otherwise\n */\nexport async function isServiceAccountsFeatureAvailable(): Promise<boolean> {\n debugMessage(`ServiceAccountOps.isServiceAccountsFeatureAvailable: start`);\n // only perform check once\n if (typeof serviceAccountsFeatureAvailable !== 'undefined')\n return serviceAccountsFeatureAvailable;\n\n serviceAccountsFeatureAvailable = true;\n try {\n await step({}, {}, '/', 'FRServiceAccountInternal');\n } catch (error) {\n debugMessage(error.response?.data);\n if (\n error.response?.status === 400 &&\n error.response?.data?.message === 'No Configuration found'\n ) {\n serviceAccountsFeatureAvailable = false;\n }\n }\n debugMessage(\n `ServiceAccountOps.isServiceAccountsFeatureAvailable: end, available=${serviceAccountsFeatureAvailable}`\n );\n return serviceAccountsFeatureAvailable;\n}\n\n/**\n * Create service account\n * @param {string} name Human-readable name of service account\n * @param {string} description Description of service account\n * @param {'Active' | 'Inactive'} accountStatus Service account status\n * @param {string[]} scopes Scopes.\n * @param {JwksInterface} jwks Java Web Key Set\n * @returns {Promise<ObjectSkeletonInterface>} A promise resolving to a service account object\n */\nexport async function createServiceAccount(\n name: string,\n description: string,\n accountStatus: 'Active' | 'Inactive',\n scopes: string[],\n jwks: JwksInterface\n): Promise<ObjectSkeletonInterface> {\n debugMessage(`ServiceAccountOps.createServiceAccount: start`);\n const payload: SvcacctInterface = {\n name,\n description,\n accountStatus,\n scopes,\n jwks: JSON.stringify(jwks),\n };\n debugMessage(`ServiceAccountOps: createServiceAccount: payload:`);\n debugMessage(payload);\n const result = await createManagedObject(moType, payload);\n debugMessage(`ServiceAccountOps.createServiceAccount: end`);\n return result;\n}\n"]}
|