@microsoft/windows-admin-center-sdk 4.87.0 → 4.167.0
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/angular/assets/strings/cs-CZ/strings.json +1 -1
- package/angular/assets/strings/de-DE/strings.json +1 -1
- package/angular/assets/strings/es-ES/strings.json +1 -1
- package/angular/assets/strings/fr-FR/strings.json +1 -1
- package/angular/assets/strings/hu-HU/strings.json +1 -1
- package/angular/assets/strings/id-ID/strings.json +1 -1
- package/angular/assets/strings/it-IT/strings.json +1 -1
- package/angular/assets/strings/ja-JP/strings.json +1 -1
- package/angular/assets/strings/ko-KR/strings.json +1 -1
- package/angular/assets/strings/nl-NL/strings.json +1 -1
- package/angular/assets/strings/pl-PL/strings.json +1 -1
- package/angular/assets/strings/pt-BR/strings.json +1 -1
- package/angular/assets/strings/pt-PT/strings.json +1 -1
- package/angular/assets/strings/ru-RU/strings.json +1 -1
- package/angular/assets/strings/strings.json +1 -1
- package/angular/assets/strings/sv-SE/strings.json +1 -1
- package/angular/assets/strings/tr-TR/strings.json +1 -1
- package/angular/assets/strings/zh-CN/strings.json +1 -1
- package/angular/assets/strings/zh-TW/strings.json +1 -1
- package/angular/esm2020/src/controls/actions/containers/action-bar/action-bar.component.mjs +2 -2
- package/angular/esm2020/src/controls/actions/containers/action-container.component.mjs +2 -3
- package/angular/esm2020/src/controls/alert-bar/alert-bar.component.mjs +2 -2
- package/angular/esm2020/src/controls/breadcrumb-header/breadcrumb-header.component.mjs +1 -1
- package/angular/esm2020/src/controls/common/base.component.mjs +1 -1
- package/angular/esm2020/src/controls/common/spacer-base.component.mjs +25 -1
- package/angular/esm2020/src/controls/context-menu/context-menu.component.mjs +2 -3
- package/angular/esm2020/src/controls/data-table/data-table.component.mjs +7 -7
- package/angular/esm2020/src/controls/dialog/base-dialog.component.mjs +2 -4
- package/angular/esm2020/src/controls/dialog/confirmation-list-dialog/confirmation-list-dialog.component.mjs +2 -2
- package/angular/esm2020/src/controls/dropdown/dropdown.component.mjs +1 -4
- package/angular/esm2020/src/controls/form/form-field/clock/clock-form-field.component.mjs +10 -7
- package/angular/esm2020/src/controls/form/form-field/form-field.component.mjs +1 -1
- package/angular/esm2020/src/controls/form/form-field/number/number-form-field.component.mjs +22 -4
- package/angular/esm2020/src/controls/form/form-field/radio-group/classic/radio-group-form-field.component.mjs +5 -5
- package/angular/esm2020/src/controls/icon/icon-text/icon-text.component.mjs +6 -6
- package/angular/esm2020/src/controls/icon/layered-icon/status/status-icon.component.mjs +1 -1
- package/angular/esm2020/src/controls/layout/editable-layout.component.mjs +2 -3
- package/angular/esm2020/src/controls/node-credentials-form/node-credentials-form.component.mjs +2 -2
- package/angular/esm2020/src/controls/property-grid/property-grid.component.mjs +33 -13
- package/angular/esm2020/src/controls/schema/tabbed-form-loader.component.mjs +2 -2
- package/angular/esm2020/src/controls/settings/common-settings/common-settings.component.mjs +5 -5
- package/angular/esm2020/src/controls/settings/settings-form.directive.mjs +3 -7
- package/angular/esm2020/src/controls/settings/settings-form.service.mjs +2 -4
- package/angular/esm2020/src/controls/snap-in-extension/snap-in-extension.component.mjs +1 -1
- package/angular/esm2020/src/controls/split-view/split-view.component.mjs +2 -2
- package/angular/esm2020/src/directives/router/router-link.directive.mjs +2 -2
- package/angular/esm2020/src/directives/svg/svg.directive.mjs +2 -3
- package/angular/esm2020/src/generated/strings.mjs +1 -1
- package/angular/esm2020/src/service/navigation.service.mjs +3 -8
- package/angular/esm2020/src/service/user-alive.service.mjs +2 -4
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.mjs +128 -73
- package/angular/fesm2015/microsoft-windows-admin-center-sdk-angular.mjs.map +1 -1
- package/angular/fesm2020/microsoft-windows-admin-center-sdk-angular.mjs +116 -71
- package/angular/fesm2020/microsoft-windows-admin-center-sdk-angular.mjs.map +1 -1
- package/angular/package.json +1 -1
- package/angular/src/controls/common/spacer-base.component.d.ts +11 -2
- package/angular/src/controls/form/form-field/number/number-form-field.component.d.ts +8 -0
- package/angular/src/controls/icon/icon-text/icon-text.component.d.ts +1 -1
- package/angular/src/controls/property-grid/property-grid.component.d.ts +2 -0
- package/angular/src/directives/svg/svg.directive.d.ts +1 -2
- package/angular/src/generated/strings.d.ts +12 -0
- package/core/assets/strings/cs-CZ/strings.json +1 -1
- package/core/assets/strings/es-ES/strings.json +1 -1
- package/core/assets/strings/fr-FR/strings.json +1 -1
- package/core/assets/strings/hu-HU/strings.json +1 -1
- package/core/assets/strings/id-ID/strings.json +1 -1
- package/core/assets/strings/it-IT/strings.json +1 -1
- package/core/assets/strings/ja-JP/strings.json +1 -1
- package/core/assets/strings/ko-KR/strings.json +1 -1
- package/core/assets/strings/pl-PL/strings.json +1 -1
- package/core/assets/strings/pt-BR/strings.json +1 -1
- package/core/assets/strings/pt-PT/strings.json +1 -1
- package/core/assets/strings/ru-RU/strings.json +1 -1
- package/core/assets/strings/sv-SE/strings.json +1 -1
- package/core/assets/strings/tr-TR/strings.json +1 -1
- package/core/assets/strings/zh-CN/strings.json +1 -1
- package/core/assets/strings/zh-TW/strings.json +1 -1
- package/core/azure/azure-constants.d.ts +3 -2
- package/core/azure/azure-constants.d.ts.map +1 -1
- package/core/azure/azure-constants.js +11 -3
- package/core/azure/azure-constants.js.map +1 -1
- package/core/base/utilities.d.ts +3 -3
- package/core/base/utilities.d.ts.map +1 -1
- package/core/base/utilities.js +2 -2
- package/core/base/utilities.js.map +1 -1
- package/core/data/active-directory/active-directory.d.ts.map +1 -1
- package/core/data/active-directory/active-directory.js +1 -1
- package/core/data/active-directory/active-directory.js.map +1 -1
- package/core/data/cookie.d.ts.map +1 -1
- package/core/data/cookie.js +7 -0
- package/core/data/cookie.js.map +1 -1
- package/core/data/gateway-url-translator.d.ts +1 -0
- package/core/data/gateway-url-translator.d.ts.map +1 -1
- package/core/data/gateway-url-translator.js +21 -6
- package/core/data/gateway-url-translator.js.map +1 -1
- package/core/data/gateway-urls.d.ts +6 -0
- package/core/data/gateway-urls.d.ts.map +1 -1
- package/core/data/gateway-urls.js +8 -0
- package/core/data/gateway-urls.js.map +1 -1
- package/core/data/node-connection.d.ts.map +1 -1
- package/core/data/node-connection.js +0 -2
- package/core/data/node-connection.js.map +1 -1
- package/core/generated/powershell-scripts.d.ts.map +1 -1
- package/core/generated/powershell-scripts.js +1 -1
- package/core/generated/powershell-scripts.js.map +1 -1
- package/core/resources/scripts/public/inventory/Get-ServerInventory.ps1 +38 -16
- package/core/security/tool-condition-validator.d.ts.map +1 -1
- package/core/security/tool-condition-validator.js +5 -5
- package/core/security/tool-condition-validator.js.map +1 -1
- package/core/shared/server-inventory/server-inventory-cache.d.ts.map +1 -1
- package/core/shared/server-inventory/server-inventory-cache.js +1 -1
- package/core/shared/server-inventory/server-inventory-cache.js.map +1 -1
- package/core/shared/server-inventory/server-inventory.d.ts +4 -4
- package/core/shared/server-inventory/server-inventory.d.ts.map +1 -1
- package/core/shared/server-inventory/server-inventory.js +2 -2
- package/core/shared/server-inventory/server-inventory.js.map +1 -1
- package/microsoft-windows-admin-center-sdk-4.167.0.tgz +0 -0
- package/package.json +10 -8
- package/styles/css/main-v2.css +1 -1
- package/tools/code-formatter/.eslintrc.base.json +1 -0
- package/tools/code-formatter/lint.d.ts.map +1 -1
- package/tools/code-formatter/lint.js +7 -1
- package/tools/code-formatter/lint.js.map +1 -1
- package/tools/code-formatter/utilities.d.ts +7 -0
- package/tools/code-formatter/utilities.d.ts.map +1 -0
- package/tools/code-formatter/utilities.js +79 -0
- package/tools/code-formatter/utilities.js.map +1 -0
- package/tools/gulp-update-notes-resource/index.d.ts.map +1 -1
- package/tools/gulp-update-notes-resource/index.js +4 -4
- package/tools/gulp-update-notes-resource/index.js.map +1 -1
- package/tools/module-template/.eslintrc.json +3 -0
- package/tools/module-template/build/pipelines/ci-build.yml +2 -2
- package/tools/module-template/gulpfile.ts/common/utilities.ts +1 -0
- package/tools/wac-cli/src/angular15/configs/angular-json-config.d.ts +2 -7
- package/tools/wac-cli/src/angular15/configs/angular-json-config.d.ts.map +1 -1
- package/tools/wac-cli/src/angular15/configs/angular-json-config.js +8 -1
- package/tools/wac-cli/src/angular15/configs/angular-json-config.js.map +1 -1
- package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.d.ts +9 -0
- package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.d.ts.map +1 -0
- package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.js +16 -0
- package/tools/wac-cli/src/angular15/configs/eslint-auto-fix-config.js.map +1 -0
- package/tools/wac-cli/src/angular15/configs/package-json-config.d.ts +4 -0
- package/tools/wac-cli/src/angular15/configs/package-json-config.d.ts.map +1 -1
- package/tools/wac-cli/src/angular15/configs/package-json-config.js +13 -9
- package/tools/wac-cli/src/angular15/configs/package-json-config.js.map +1 -1
- package/tools/wac-cli/src/angular15/main.d.ts +20 -4
- package/tools/wac-cli/src/angular15/main.d.ts.map +1 -1
- package/tools/wac-cli/src/angular15/main.js +44 -8
- package/tools/wac-cli/src/angular15/main.js.map +1 -1
- package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.d.ts +18 -0
- package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.d.ts.map +1 -0
- package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.js +49 -0
- package/tools/wac-cli/src/angular15/upgrader/eslint-auto-fix-upgrader.js.map +1 -0
- package/tools/wac-cli/templates/wac-template/package.json +3 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/security/tool-condition-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAM,MAAM,MAAM,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAMjD,OAAO,EAIH,2BAA2B,EAC3B,kDAAkD,EAGrD,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAWxE;;GAEG;AACH,0BAAkB,mBAAmB;IACjC;;OAEG;IACH,aAAa,IAAA;IAEb;;OAEG;IACH,QAAQ,IAAA;IAER;;OAEG;IACH,OAAO,IAAA;IAEP;;OAEG;IACH,MAAM,IAAA;IAEN;;OAEG;IACH,MAAM,IAAA;CACT;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C;;OAEG;IACH,MAAM,EAAE,mBAAmB,CAAC;IAE5B;;OAEG;IACH,MAAM,EAAE,UAAU,CAAC,kDAAkD,CAAC,GAAG,kDAAkD,CAAC;CAC/H;AAED;;;GAGG;AACH,qBAAa,sBAAsB;IA6MnB,OAAO,CAAC,UAAU;IA5M9B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB,CAgGtC;IAEF;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS,CAsEtB;IAEF,OAAO,CAAC,MAAM,CAAC,eAAe,CAAyB;IAEvD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,YAAY,CAAyD;IAE7E;;;;;OAKG;WACW,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,oBAAoB,GAAG,sBAAsB;IAQnG;;;;;OAKG;gBACiB,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,oBAAoB;IAMxE;;;;;;;;OAQG;IACI,iBAAiB,CACpB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,2BAA2B,EACrC,IAAI,EAAE,2BAA2B,GAAG,6BAA6B;IAuKrE,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,wBAAwB;IA0BhC,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,6BAA6B;IAWrC,OAAO,CAAC,cAAc;IAuKtB,OAAO,CAAC,cAAc;IAmDtB,OAAO,CAAC,eAAe;CAI1B","file":"tool-condition-validator.d.ts","sourcesContent":["import { EMPTY, Observable, of } from 'rxjs';\r\nimport { catchError, expand, filter, map, take } from 'rxjs/operators';\r\nimport { AppContext } from '../data/app-context';\r\nimport { Net } from '../data/net';\r\nimport { PowerShell, PowerShellCommand } from '../data/powershell';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { Strings } from '../generated/strings';\r\nimport {\r\n EnvironmentModule,\r\n EnvironmentModuleConditionMap,\r\n EnvironmentModuleConditionStatement,\r\n EnvironmentModuleEntryPoint,\r\n EnvironmentModuleEntryPointWithToolConditionResult,\r\n EnvironmentModuleToolConditionResult,\r\n EnvironmentModuleToolState\r\n} from '../manifest/environment-modules';\r\nimport { Connection } from '../security/connection';\r\nimport { GatewayMode } from '../shared/gateway-inventory/gateway-inventory';\r\nimport { InventoryQueryCaches } from '../shared/inventory-query-caches';\r\nimport { ServerInventory } from '../shared/server-inventory/server-inventory';\r\nimport { ToolInventoryCache } from '../shared/tool-inventory/tool-inventory-cache';\r\n\r\n/**\r\n * The interface object to be used by expand calculation.\r\n */\r\ninterface ToolConditionExpandResult extends EnvironmentModuleToolConditionResult {\r\n ends: boolean;\r\n}\r\n\r\n/**\r\n * The calculation weight ratio base on performance.\r\n */\r\nexport const enum ToolConditionWeight {\r\n /**\r\n * Not using any observable calculation.\r\n */\r\n NonObservable,\r\n\r\n /**\r\n * Using the connection property.\r\n */\r\n Property,\r\n\r\n /**\r\n * Using the gateway inventory data.\r\n */\r\n Gateway,\r\n\r\n /**\r\n * Using the server inventory data.\r\n */\r\n Server,\r\n\r\n /**\r\n * Using a custom PowerShell script.\r\n */\r\n Script\r\n}\r\n\r\n/**\r\n * The condition result with weight information.\r\n */\r\nexport interface ToolConditionResultWithWeight {\r\n /**\r\n * The calculation weight.\r\n */\r\n weight: ToolConditionWeight;\r\n\r\n /**\r\n * The result data.\r\n */\r\n result: Observable<EnvironmentModuleEntryPointWithToolConditionResult> | EnvironmentModuleEntryPointWithToolConditionResult;\r\n}\r\n\r\n/**\r\n * The class handles conditions of tools to be presented on tools' menu.\r\n * @dynamic\r\n */\r\nexport class ToolConditionValidator {\r\n /**\r\n * Support the following condition name.\r\n * It can be a string, number, boolean and version string.\r\n */\r\n private static serverInventoryProperties: { conditionName: string, dataName: string }[] = [\r\n // string\r\n {\r\n conditionName: 'computerManufacturer',\r\n dataName: 'computerManufacturer'\r\n },\r\n\r\n // string\r\n {\r\n conditionName: 'computerModel',\r\n dataName: 'computerModel'\r\n },\r\n\r\n // number\r\n {\r\n conditionName: 'operatingSystemSKU',\r\n dataName: 'operatingSystemSKU'\r\n },\r\n\r\n // version string\r\n {\r\n conditionName: 'operatingSystemVersion',\r\n dataName: 'operatingSystemVersion'\r\n },\r\n\r\n // number\r\n {\r\n conditionName: 'windowsProductType',\r\n dataName: 'productType'\r\n },\r\n\r\n // string\r\n {\r\n conditionName: 'clusterFqdn',\r\n dataName: 'clusterFqdn'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHyperVRoleInstalled',\r\n dataName: 'isHyperVRoleInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHyperVPowershellInstalled',\r\n dataName: 'isHyperVPowershellInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isManagementToolsAvailable',\r\n dataName: 'isManagementToolsAvailable'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isWmfInstalled',\r\n dataName: 'isWmfInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isRemoteAppEnabled',\r\n dataName: 'isRemoteAppEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isDomainController',\r\n dataName: 'isDomainController'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isS2dEnabled',\r\n dataName: 'isS2dEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isBritannicaEnabled',\r\n dataName: 'isBritannicaEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isSystemLockdownPolicyEnforced',\r\n dataName: 'isSystemLockdownPolicyEnforced'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHciServer',\r\n dataName: 'isHciServer'\r\n }\r\n ];\r\n\r\n /**\r\n * The following operators are supported.\r\n * String comparison uses caseinsesitive pattern.\r\n */\r\n private static operators = {\r\n /**\r\n * Greater than: number, string (caseinsesitive), version\r\n */\r\n gt: 'gt',\r\n\r\n /**\r\n * Greater or equal: number, string (caseinsesitive), version\r\n */\r\n ge: 'ge',\r\n\r\n /**\r\n * Less than: number, string (caseinsesitive), version\r\n */\r\n lt: 'lt',\r\n\r\n /**\r\n * Less or equal: number, string (caseinsesitive), version\r\n */\r\n le: 'le',\r\n\r\n /**\r\n * Equal: number, string (caseinsesitive), version (Accept '*' like \"1.2.*\")\r\n */\r\n eq: 'eq',\r\n\r\n /**\r\n * Not equal: number, string (caseinsesitive), version (Accept '*' like \"1.2.*\")\r\n */\r\n ne: 'ne',\r\n\r\n /**\r\n * Test true: number, string, boolean\r\n */\r\n is: 'is',\r\n\r\n /**\r\n * Test false: number, string, boolean\r\n */\r\n not: 'not',\r\n\r\n /**\r\n * Contains a string: string (caseinsesitive)\r\n */\r\n contains: 'contains',\r\n\r\n /**\r\n * Not contains a string: string (caseinsesitive)\r\n */\r\n notContains: 'notContains',\r\n\r\n /**\r\n * Any one of value (number or string) equal: numberArray, stringArray\r\n */\r\n anyEq: 'anyEq',\r\n\r\n /**\r\n * Any one of value (number or string) not equal: numberArray, stringArray\r\n */\r\n anyNe: 'anyNe',\r\n\r\n /**\r\n * Any one of string contains: stringArray\r\n */\r\n anyContains: 'anyContains',\r\n\r\n /**\r\n * Any one of string not contains: stringArray\r\n */\r\n anyNotContains: 'anyNotContains'\r\n };\r\n\r\n private static internalCurrent: ToolConditionValidator;\r\n\r\n private caches: InventoryQueryCaches;\r\n private toolInventoryCache: ToolInventoryCache;\r\n private errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n\r\n /**\r\n * Gets the current object of the ToolConditionValidator class, and maintains as singleton.\r\n *\r\n * @param appContext the application context.\r\n * @param caches the instance of the inventory query caches to share the resource.\r\n */\r\n public static current(appContext: AppContext, caches: InventoryQueryCaches): ToolConditionValidator {\r\n if (!ToolConditionValidator.internalCurrent) {\r\n ToolConditionValidator.internalCurrent = new ToolConditionValidator(appContext, caches);\r\n }\r\n\r\n return ToolConditionValidator.internalCurrent;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the ToolConditionValidator class.\r\n *\r\n * @param appContext the application context.\r\n * @param caches the instance of the inventory query caches to share the resource.\r\n */\r\n constructor(private appContext: AppContext, caches: InventoryQueryCaches) {\r\n const statusExpiration = 4 * 60 * 1000; // 4 min\r\n this.caches = caches;\r\n this.toolInventoryCache = new ToolInventoryCache(appContext, { expiration: statusExpiration });\r\n }\r\n\r\n /**\r\n * Scan the tool condition to be present or not.\r\n *\r\n * @param connection the connection object.\r\n * @param solution The entry point object of solution.\r\n * @param tool The entry point object of tool.\r\n * @param scanMode The mode of scanning.\r\n * @return the result observable.\r\n */\r\n public scanToolCondition(\r\n connection: Connection,\r\n solution: EnvironmentModuleEntryPoint,\r\n tool: EnvironmentModuleEntryPoint): ToolConditionResultWithWeight {\r\n\r\n if (!tool.requirements) {\r\n // tool is missing requirements, never show.\r\n return {\r\n weight: ToolConditionWeight.NonObservable,\r\n result: {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported\r\n }\r\n }\r\n };\r\n }\r\n\r\n const solutionId = EnvironmentModule.createFormattedEntrypoint(solution);\r\n const toolId = EnvironmentModule.createFormattedEntrypoint(tool);\r\n const checkersCollection = [];\r\n let weight = ToolConditionWeight.NonObservable;\r\n for (const requirement of tool.requirements) {\r\n const checkers: Observable<EnvironmentModuleToolConditionResult>[] = [];\r\n\r\n // tool must specify the solutions it can show in\r\n if (!requirement.solutionIds || requirement.solutionIds.every(id => id !== solutionId)) {\r\n continue;\r\n }\r\n\r\n // if ths solution is a connections type, then the tool must specify the connection type\r\n if (solution.rootNavigationBehavior === 'connections'\r\n && (!requirement.connectionTypes || requirement.connectionTypes.every(type => type !== connection.type))) {\r\n continue;\r\n }\r\n\r\n // if there are no conditions to check, then this tool has been satisfied.\r\n if (!requirement.conditions || requirement.conditions.length === 0) {\r\n checkers.push(this.installationTypeValidate(connection));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n } else {\r\n for (const condition of requirement.conditions) {\r\n\r\n checkers.push(this.installationTypeValidate(connection, condition.installationTypes));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n\r\n if (condition.localhost !== undefined && !condition.localhost) {\r\n // if connection is localhost and not supported.\r\n checkers.push(this.localhostValidate(connection));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n }\r\n\r\n if (condition.inventory) {\r\n checkers.push(this.inventoryValidate(connection, condition.inventory));\r\n weight = Math.max(weight, ToolConditionWeight.Server);\r\n }\r\n\r\n if (condition.properties) {\r\n checkers.push(this.propertyValidate(connection, condition.properties));\r\n weight = Math.max(weight, ToolConditionWeight.Property);\r\n }\r\n\r\n if (condition.powerShell) {\r\n // powerShell { command, script }\r\n checkers.push(this.toolInventoryValidate(connection, toolId, condition.powerShell));\r\n weight = Math.max(weight, ToolConditionWeight.Script);\r\n } else if (condition.script) {\r\n // deprecated\r\n checkers.push(this.toolInventoryValidate(connection, toolId, condition.script));\r\n weight = Math.max(weight, ToolConditionWeight.Script);\r\n }\r\n }\r\n }\r\n\r\n checkersCollection.push(checkers);\r\n }\r\n\r\n if (checkersCollection.length === 0) {\r\n return {\r\n weight: ToolConditionWeight.NonObservable,\r\n result: {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported,\r\n connectionId: connection ? connection.id : null\r\n }\r\n }\r\n };\r\n }\r\n\r\n let collectionIndex = 0;\r\n let checkerIndex = 0;\r\n let lastDetail: EnvironmentModuleToolState = null;\r\n let lastMessage: string = null;\r\n return {\r\n weight: weight,\r\n result: this.runChecker(checkersCollection[collectionIndex][checkerIndex])\r\n .pipe(catchError(() => {\r\n Logging.log({\r\n level: LogLevel.Error,\r\n message: this.errorStrings.ToolValidationResult.message.format(\r\n tool.parentModule.name,\r\n tool.displayName),\r\n source: 'ToolConditionValidator'\r\n });\r\n return of(<ToolConditionExpandResult>{\r\n show: false,\r\n ends: true\r\n });\r\n }),\r\n expand((value) => {\r\n checkerIndex++;\r\n if (value.ends) {\r\n return EMPTY;\r\n }\r\n\r\n if (value.detail !== undefined && lastDetail == null) {\r\n lastDetail = value.detail;\r\n }\r\n\r\n if (value.message !== undefined && lastMessage == null) {\r\n lastMessage = value.message;\r\n }\r\n\r\n if (!value.show) {\r\n // failed result. increment collection index and reset checkerIndex.\r\n if (checkersCollection.length > ++collectionIndex) {\r\n // still has another condition, try next checker set.\r\n return this.runChecker(checkersCollection[collectionIndex][checkerIndex = 0]);\r\n } else {\r\n // no more condition, end to return 'false'.\r\n return of(<ToolConditionExpandResult>{\r\n show: false,\r\n detail: lastDetail,\r\n message: lastMessage,\r\n ends: true\r\n });\r\n }\r\n }\r\n\r\n if (checkersCollection[collectionIndex].length > checkerIndex) {\r\n // check next checker.\r\n return this.runChecker(checkersCollection[collectionIndex][checkerIndex]);\r\n } else {\r\n // all state/succeeded within the checker set.\r\n return of({\r\n show: true,\r\n detail: lastDetail,\r\n message: lastMessage,\r\n ends: true\r\n });\r\n }\r\n }),\r\n filter(combined => combined.ends),\r\n map(combined => {\r\n return {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: combined.show,\r\n detail: combined.detail,\r\n message: combined.message,\r\n connectionId: connection ? connection.id : null\r\n }\r\n };\r\n }))\r\n };\r\n }\r\n\r\n private runChecker(checker: Observable<EnvironmentModuleToolConditionResult>): Observable<ToolConditionExpandResult> {\r\n return checker.pipe(\r\n take(1),\r\n map(result => <ToolConditionExpandResult>{ ...result, ends: false }));\r\n }\r\n\r\n private localhostValidate(\r\n connection: Connection): Observable<EnvironmentModuleToolConditionResult> {\r\n return this.caches.gatewayCache.createObservable({})\r\n .pipe(\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: !(instance.mode !== GatewayMode.Service\r\n && connection.properties\r\n && connection.properties.displayName === 'localhost')\r\n }));\r\n }\r\n\r\n private installationTypeValidate(\r\n connection: Connection, installationType?: String[]): Observable<EnvironmentModuleToolConditionResult> {\r\n if (MsftSme.getValue<boolean>(MsftSme.self().Environment.configuration, 'gateway.disabled')) {\r\n return of({ show: true });\r\n }\r\n\r\n if (!installationType || !Array.isArray(installationType) || installationType.length === 0) {\r\n // Default to standard if property doesnt exist in the manifest.\r\n installationType = ['Standard'];\r\n }\r\n\r\n return this.caches.gatewayCache.createObservable({ params: {} })\r\n .pipe(\r\n catchError((error) => {\r\n const errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n const notification = this.appContext.notification.create(connection.name);\r\n notification.showError(\r\n errorStrings.ToolValidationGatewayInventoryError.title,\r\n errorStrings.ToolValidationGatewayInventoryError.message.format(Net.getErrorMessage(error)));\r\n return of(null);\r\n }),\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: installationType.some(t => instance.installationType === t)\r\n }));\r\n }\r\n\r\n private inventoryValidate(\r\n connection: Connection, condition: EnvironmentModuleConditionMap): Observable<EnvironmentModuleToolConditionResult> {\r\n const nodeName = connection.activeAlias ? connection.activeAlias : connection.name;\r\n return this.caches.serverCache.createObservable({ params: { name: nodeName } })\r\n .pipe(\r\n catchError((error) => {\r\n const errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n const notification = this.appContext.notification.create(connection.name);\r\n notification.showError(\r\n errorStrings.ToolValidationInventoryError.title,\r\n errorStrings.ToolValidationInventoryError.message.format(Net.getErrorMessage(error)));\r\n return of(null);\r\n }),\r\n filter((instance: ServerInventory) => instance.serverName === nodeName),\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: this.checkServerInventoryCondition(condition, instance)\r\n }));\r\n }\r\n\r\n private propertyValidate(\r\n connection: Connection, condition: EnvironmentModuleConditionMap): Observable<EnvironmentModuleToolConditionResult> {\r\n const propertyNames = Object.keys(condition);\r\n let result = true;\r\n for (const propertyName of propertyNames) {\r\n const propertyValue = connection.properties && connection.properties[propertyName];\r\n const conditionItem = condition[propertyName];\r\n if (conditionItem && !this.checkCondition(propertyValue, conditionItem)) {\r\n result = false;\r\n break;\r\n }\r\n }\r\n\r\n return of(<EnvironmentModuleToolConditionResult>{ show: result });\r\n }\r\n\r\n private toolInventoryValidate(\r\n connection: Connection,\r\n id: string,\r\n scriptOrCommand: string | PowerShellCommand): Observable<EnvironmentModuleToolConditionResult> {\r\n const command = PowerShell.getPowerShellCommand(scriptOrCommand);\r\n return this.toolInventoryCache.query(\r\n { ...{ name: connection.activeAlias ? connection.activeAlias : connection.name, id: id }, ...command })\r\n .pipe(\r\n map(inventory => <EnvironmentModuleToolConditionResult>{\r\n show: inventory.instance.state === EnvironmentModuleToolState.Available\r\n || inventory.instance.state === EnvironmentModuleToolState.NotConfigured,\r\n detail: inventory.instance.state,\r\n message: inventory.instance.message\r\n }),\r\n catchError((error) => {\r\n const message = Net.getErrorMessage(error);\r\n Logging.logError('ToolConditionValidator', `${id}: ${message}`);\r\n return of(<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported,\r\n message\r\n });\r\n })\r\n );\r\n }\r\n\r\n private checkServerInventoryCondition(condition: EnvironmentModuleConditionMap, instance: ServerInventory): boolean {\r\n for (const property of ToolConditionValidator.serverInventoryProperties) {\r\n const conditionItem = condition[property.conditionName];\r\n if (conditionItem && !this.checkCondition(instance[property.dataName], conditionItem)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private checkCondition(data: any, condition: EnvironmentModuleConditionStatement): boolean {\r\n switch (condition.type) {\r\n case 'number':\r\n const numberValue: number = this.getNumberOrZero(data);\r\n const numberTest: number = this.getNumberOrZero(condition.value);\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return numberValue > numberTest;\r\n case ToolConditionValidator.operators.ge:\r\n return numberValue >= numberTest;\r\n case ToolConditionValidator.operators.lt:\r\n return numberValue < numberTest;\r\n case ToolConditionValidator.operators.le:\r\n return numberValue <= numberTest;\r\n case ToolConditionValidator.operators.eq:\r\n return numberValue === numberTest;\r\n case ToolConditionValidator.operators.ne:\r\n return numberValue !== numberTest;\r\n case ToolConditionValidator.operators.is:\r\n return !!numberValue;\r\n case ToolConditionValidator.operators.not:\r\n return !numberValue;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'string':\r\n const stringValue: string = '' + data;\r\n const stringTest: string = '' + condition.value;\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return stringValue.toLowerCase() > stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.ge:\r\n return stringValue.toLowerCase() >= stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.lt:\r\n return stringValue.toLowerCase() < stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.le:\r\n return stringValue.toLowerCase() <= stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.eq:\r\n return stringValue.toLowerCase() === stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.ne:\r\n return stringValue.toLowerCase() !== stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.is:\r\n return !!data;\r\n case ToolConditionValidator.operators.not:\r\n return !data;\r\n case ToolConditionValidator.operators.contains:\r\n return stringValue.toLowerCase().indexOf(stringTest.toLowerCase()) >= 0;\r\n case ToolConditionValidator.operators.notContains:\r\n return stringValue.toLowerCase().indexOf(stringTest.toLowerCase()) < 0;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'boolean':\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.is:\r\n return !!data;\r\n case ToolConditionValidator.operators.not:\r\n return !data;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'version':\r\n const versionValue: string = data;\r\n const versionTest: string = <string>condition.value;\r\n return this.compareVersion(versionValue, versionTest, condition.operator);\r\n\r\n case 'numberArray':\r\n const checkNumber: any = condition.value;\r\n if (!checkNumber\r\n || typeof checkNumber === 'string'\r\n || !checkNumber.length\r\n || typeof checkNumber[0] !== 'number') {\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n const numberArrayValue: number = this.getNumberOrZero(data);\r\n const numberArray: number[] = <number[]>condition.value;\r\n for (const numberItem of numberArray) {\r\n const numberArrayTest = this.getNumberOrZero(numberItem);\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.anyEq:\r\n if (numberArrayValue === numberArrayTest) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNe:\r\n if (numberArrayValue !== numberArrayTest) {\r\n return true;\r\n }\r\n\r\n break;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n return false;\r\n\r\n case 'stringArray':\r\n const checkString: any = condition.value;\r\n if (!checkString\r\n || typeof checkString === 'string'\r\n || !checkString.length\r\n || typeof checkString[0] !== 'string') {\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n const stringArrayValue: string = '' + data;\r\n const stringArray: string[] = <string[]>condition.value;\r\n for (const stringArrayTest of stringArray) {\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.anyEq:\r\n if (stringArrayValue.toLowerCase() === stringArrayTest.toLowerCase()) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNe:\r\n if (stringArrayValue.toLowerCase() !== stringArrayTest.toLowerCase()) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyContains:\r\n if (stringArrayValue.toLowerCase().indexOf(stringArrayTest.toLowerCase()) >= 0) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNotContains:\r\n if (stringArrayValue.toLowerCase().indexOf(stringArrayTest.toLowerCase()) < 0) {\r\n return true;\r\n }\r\n\r\n break;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n return false;\r\n\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n private compareVersion(left: string, right: string, operator: string): boolean {\r\n const leftSegments = left.split('.');\r\n const rightSegments = right.split('.');\r\n if (!leftSegments || leftSegments.length <= 0 || !rightSegments || rightSegments.length <= 0) {\r\n throw new Error(this.errorStrings.ToolValidationVersionFormat.message);\r\n }\r\n\r\n const count = Math.max(leftSegments.length, rightSegments.length);\r\n let status;\r\n for (let index = 0; index < count; index++) {\r\n if (rightSegments[index] === '*') {\r\n // quit comparison with wildcard.\r\n status = 0;\r\n break;\r\n }\r\n\r\n const leftSegment = this.getNumberOrZero(leftSegments[index]);\r\n const rightSegment = this.getNumberOrZero(rightSegments[index]);\r\n if (leftSegment === rightSegment) {\r\n // equal.\r\n status = 0;\r\n } else if (leftSegment > rightSegment) {\r\n // greater.\r\n status = 1;\r\n break;\r\n } else {\r\n // lesser.\r\n status = -1;\r\n break;\r\n }\r\n }\r\n\r\n switch (operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return status > 0;\r\n case ToolConditionValidator.operators.ge:\r\n return status >= 0;\r\n case ToolConditionValidator.operators.lt:\r\n return status < 0;\r\n case ToolConditionValidator.operators.le:\r\n return status <= 0;\r\n case ToolConditionValidator.operators.eq:\r\n return status === 0;\r\n case ToolConditionValidator.operators.ne:\r\n return status !== 0;\r\n default:\r\n throw new Error(\r\n this.errorStrings.ToolValidationUnsupportedOperator.message.format(operator, left));\r\n }\r\n }\r\n\r\n private getNumberOrZero(data: any): number {\r\n const result = Number(data);\r\n return isNaN(result) ? 0 : result;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/security/tool-condition-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,UAAU,EAAM,MAAM,MAAM,CAAC;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAMjD,OAAO,EAIH,2BAA2B,EAC3B,kDAAkD,EAGrD,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kCAAkC,CAAC;AAWxE;;GAEG;AACH,0BAAkB,mBAAmB;IACjC;;OAEG;IACH,aAAa,IAAA;IAEb;;OAEG;IACH,QAAQ,IAAA;IAER;;OAEG;IACH,OAAO,IAAA;IAEP;;OAEG;IACH,MAAM,IAAA;IAEN;;OAEG;IACH,MAAM,IAAA;CACT;AAED;;GAEG;AACH,MAAM,WAAW,6BAA6B;IAC1C;;OAEG;IACH,MAAM,EAAE,mBAAmB,CAAC;IAE5B;;OAEG;IACH,MAAM,EAAE,UAAU,CAAC,kDAAkD,CAAC,GAAG,kDAAkD,CAAC;CAC/H;AAED;;;GAGG;AACH,qBAAa,sBAAsB;IA6MnB,OAAO,CAAC,UAAU;IA5M9B;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,yBAAyB,CAgGtC;IAEF;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS,CAsEtB;IAEF,OAAO,CAAC,MAAM,CAAC,eAAe,CAAyB;IAEvD,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,YAAY,CAAyD;IAE7E;;;;;OAKG;WACW,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,oBAAoB,GAAG,sBAAsB;IAQnG;;;;;OAKG;gBACiB,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,oBAAoB;IAMxE;;;;;;;;OAQG;IACI,iBAAiB,CACpB,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,2BAA2B,EACrC,IAAI,EAAE,2BAA2B,GAAG,6BAA6B;IAuKrE,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,wBAAwB;IA0BhC,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,gBAAgB;IAgBxB,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,6BAA6B;IAWrC,OAAO,CAAC,cAAc;IAuKtB,OAAO,CAAC,cAAc;IAmDtB,OAAO,CAAC,eAAe;CAI1B","file":"tool-condition-validator.d.ts","sourcesContent":["import { EMPTY, Observable, of } from 'rxjs';\r\nimport { catchError, expand, filter, map, take } from 'rxjs/operators';\r\nimport { AppContext } from '../data/app-context';\r\nimport { Net } from '../data/net';\r\nimport { PowerShell, PowerShellCommand } from '../data/powershell';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { Strings } from '../generated/strings';\r\nimport {\r\n EnvironmentModule,\r\n EnvironmentModuleConditionMap,\r\n EnvironmentModuleConditionStatement,\r\n EnvironmentModuleEntryPoint,\r\n EnvironmentModuleEntryPointWithToolConditionResult,\r\n EnvironmentModuleToolConditionResult,\r\n EnvironmentModuleToolState\r\n} from '../manifest/environment-modules';\r\nimport { Connection } from '../security/connection';\r\nimport { GatewayMode } from '../shared/gateway-inventory/gateway-inventory';\r\nimport { InventoryQueryCaches } from '../shared/inventory-query-caches';\r\nimport { ServerInventory } from '../shared/server-inventory/server-inventory';\r\nimport { ToolInventoryCache } from '../shared/tool-inventory/tool-inventory-cache';\r\n\r\n/**\r\n * The interface object to be used by expand calculation.\r\n */\r\ninterface ToolConditionExpandResult extends EnvironmentModuleToolConditionResult {\r\n ends: boolean;\r\n}\r\n\r\n/**\r\n * The calculation weight ratio base on performance.\r\n */\r\nexport const enum ToolConditionWeight {\r\n /**\r\n * Not using any observable calculation.\r\n */\r\n NonObservable,\r\n\r\n /**\r\n * Using the connection property.\r\n */\r\n Property,\r\n\r\n /**\r\n * Using the gateway inventory data.\r\n */\r\n Gateway,\r\n\r\n /**\r\n * Using the server inventory data.\r\n */\r\n Server,\r\n\r\n /**\r\n * Using a custom PowerShell script.\r\n */\r\n Script\r\n}\r\n\r\n/**\r\n * The condition result with weight information.\r\n */\r\nexport interface ToolConditionResultWithWeight {\r\n /**\r\n * The calculation weight.\r\n */\r\n weight: ToolConditionWeight;\r\n\r\n /**\r\n * The result data.\r\n */\r\n result: Observable<EnvironmentModuleEntryPointWithToolConditionResult> | EnvironmentModuleEntryPointWithToolConditionResult;\r\n}\r\n\r\n/**\r\n * The class handles conditions of tools to be presented on tools' menu.\r\n * @dynamic\r\n */\r\nexport class ToolConditionValidator {\r\n /**\r\n * Support the following condition name.\r\n * It can be a string, number, boolean and version string.\r\n */\r\n private static serverInventoryProperties: { conditionName: string, dataName: string }[] = [\r\n // string\r\n {\r\n conditionName: 'computerManufacturer',\r\n dataName: 'computerManufacturer'\r\n },\r\n\r\n // string\r\n {\r\n conditionName: 'computerModel',\r\n dataName: 'computerModel'\r\n },\r\n\r\n // number\r\n {\r\n conditionName: 'operatingSystemSKU',\r\n dataName: 'operatingSystemSKU'\r\n },\r\n\r\n // version string\r\n {\r\n conditionName: 'operatingSystemVersion',\r\n dataName: 'operatingSystemVersion'\r\n },\r\n\r\n // number\r\n {\r\n conditionName: 'windowsProductType',\r\n dataName: 'productType'\r\n },\r\n\r\n // string\r\n {\r\n conditionName: 'clusterFqdn',\r\n dataName: 'clusterFqdn'\r\n },\r\n\r\n // string\r\n {\r\n conditionName: 'systemLockdownPolicy',\r\n dataName: 'systemLockdownPolicy'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHyperVRoleInstalled',\r\n dataName: 'isHyperVRoleInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHyperVPowershellInstalled',\r\n dataName: 'isHyperVPowershellInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isManagementToolsAvailable',\r\n dataName: 'isManagementToolsAvailable'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isWmfInstalled',\r\n dataName: 'isWmfInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isRemoteAppEnabled',\r\n dataName: 'isRemoteAppEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isDomainController',\r\n dataName: 'isDomainController'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isS2dEnabled',\r\n dataName: 'isS2dEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isBritannicaEnabled',\r\n dataName: 'isBritannicaEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHciServer',\r\n dataName: 'isHciServer'\r\n }\r\n ];\r\n\r\n /**\r\n * The following operators are supported.\r\n * String comparison uses caseinsesitive pattern.\r\n */\r\n private static operators = {\r\n /**\r\n * Greater than: number, string (caseinsesitive), version\r\n */\r\n gt: 'gt',\r\n\r\n /**\r\n * Greater or equal: number, string (caseinsesitive), version\r\n */\r\n ge: 'ge',\r\n\r\n /**\r\n * Less than: number, string (caseinsesitive), version\r\n */\r\n lt: 'lt',\r\n\r\n /**\r\n * Less or equal: number, string (caseinsesitive), version\r\n */\r\n le: 'le',\r\n\r\n /**\r\n * Equal: number, string (caseinsesitive), version (Accept '*' like \"1.2.*\")\r\n */\r\n eq: 'eq',\r\n\r\n /**\r\n * Not equal: number, string (caseinsesitive), version (Accept '*' like \"1.2.*\")\r\n */\r\n ne: 'ne',\r\n\r\n /**\r\n * Test true: number, string, boolean\r\n */\r\n is: 'is',\r\n\r\n /**\r\n * Test false: number, string, boolean\r\n */\r\n not: 'not',\r\n\r\n /**\r\n * Contains a string: string (caseinsesitive)\r\n */\r\n contains: 'contains',\r\n\r\n /**\r\n * Not contains a string: string (caseinsesitive)\r\n */\r\n notContains: 'notContains',\r\n\r\n /**\r\n * Any one of value (number or string) equal: numberArray, stringArray\r\n */\r\n anyEq: 'anyEq',\r\n\r\n /**\r\n * Any one of value (number or string) not equal: numberArray, stringArray\r\n */\r\n anyNe: 'anyNe',\r\n\r\n /**\r\n * Any one of string contains: stringArray\r\n */\r\n anyContains: 'anyContains',\r\n\r\n /**\r\n * Any one of string not contains: stringArray\r\n */\r\n anyNotContains: 'anyNotContains'\r\n };\r\n\r\n private static internalCurrent: ToolConditionValidator;\r\n\r\n private caches: InventoryQueryCaches;\r\n private toolInventoryCache: ToolInventoryCache;\r\n private errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n\r\n /**\r\n * Gets the current object of the ToolConditionValidator class, and maintains as singleton.\r\n *\r\n * @param appContext the application context.\r\n * @param caches the instance of the inventory query caches to share the resource.\r\n */\r\n public static current(appContext: AppContext, caches: InventoryQueryCaches): ToolConditionValidator {\r\n if (!ToolConditionValidator.internalCurrent) {\r\n ToolConditionValidator.internalCurrent = new ToolConditionValidator(appContext, caches);\r\n }\r\n\r\n return ToolConditionValidator.internalCurrent;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the ToolConditionValidator class.\r\n *\r\n * @param appContext the application context.\r\n * @param caches the instance of the inventory query caches to share the resource.\r\n */\r\n constructor(private appContext: AppContext, caches: InventoryQueryCaches) {\r\n const statusExpiration = 4 * 60 * 1000; // 4 min\r\n this.caches = caches;\r\n this.toolInventoryCache = new ToolInventoryCache(appContext, { expiration: statusExpiration });\r\n }\r\n\r\n /**\r\n * Scan the tool condition to be present or not.\r\n *\r\n * @param connection the connection object.\r\n * @param solution The entry point object of solution.\r\n * @param tool The entry point object of tool.\r\n * @param scanMode The mode of scanning.\r\n * @return the result observable.\r\n */\r\n public scanToolCondition(\r\n connection: Connection,\r\n solution: EnvironmentModuleEntryPoint,\r\n tool: EnvironmentModuleEntryPoint): ToolConditionResultWithWeight {\r\n\r\n if (!tool.requirements) {\r\n // tool is missing requirements, never show.\r\n return {\r\n weight: ToolConditionWeight.NonObservable,\r\n result: {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported\r\n }\r\n }\r\n };\r\n }\r\n\r\n const solutionId = EnvironmentModule.createFormattedEntrypoint(solution);\r\n const toolId = EnvironmentModule.createFormattedEntrypoint(tool);\r\n const checkersCollection = [];\r\n let weight = ToolConditionWeight.NonObservable;\r\n for (const requirement of tool.requirements) {\r\n const checkers: Observable<EnvironmentModuleToolConditionResult>[] = [];\r\n\r\n // tool must specify the solutions it can show in\r\n if (!requirement.solutionIds || requirement.solutionIds.every(id => id !== solutionId)) {\r\n continue;\r\n }\r\n\r\n // if ths solution is a connections type, then the tool must specify the connection type\r\n if (solution.rootNavigationBehavior === 'connections'\r\n && (!requirement.connectionTypes || requirement.connectionTypes.every(type => type !== connection.type))) {\r\n continue;\r\n }\r\n\r\n // if there are no conditions to check, then this tool has been satisfied.\r\n if (!requirement.conditions || requirement.conditions.length === 0) {\r\n checkers.push(this.installationTypeValidate(connection));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n } else {\r\n for (const condition of requirement.conditions) {\r\n\r\n checkers.push(this.installationTypeValidate(connection, condition.installationTypes));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n\r\n if (condition.localhost !== undefined && !condition.localhost) {\r\n // if connection is localhost and not supported.\r\n checkers.push(this.localhostValidate(connection));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n }\r\n\r\n if (condition.inventory) {\r\n checkers.push(this.inventoryValidate(connection, condition.inventory));\r\n weight = Math.max(weight, ToolConditionWeight.Server);\r\n }\r\n\r\n if (condition.properties) {\r\n checkers.push(this.propertyValidate(connection, condition.properties));\r\n weight = Math.max(weight, ToolConditionWeight.Property);\r\n }\r\n\r\n if (condition.powerShell) {\r\n // powerShell { command, script }\r\n checkers.push(this.toolInventoryValidate(connection, toolId, condition.powerShell));\r\n weight = Math.max(weight, ToolConditionWeight.Script);\r\n } else if (condition.script) {\r\n // deprecated\r\n checkers.push(this.toolInventoryValidate(connection, toolId, condition.script));\r\n weight = Math.max(weight, ToolConditionWeight.Script);\r\n }\r\n }\r\n }\r\n\r\n checkersCollection.push(checkers);\r\n }\r\n\r\n if (checkersCollection.length === 0) {\r\n return {\r\n weight: ToolConditionWeight.NonObservable,\r\n result: {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported,\r\n connectionId: connection ? connection.id : null\r\n }\r\n }\r\n };\r\n }\r\n\r\n let collectionIndex = 0;\r\n let checkerIndex = 0;\r\n let lastDetail: EnvironmentModuleToolState = null;\r\n let lastMessage: string = null;\r\n return {\r\n weight: weight,\r\n result: this.runChecker(checkersCollection[collectionIndex][checkerIndex])\r\n .pipe(catchError(() => {\r\n Logging.log({\r\n level: LogLevel.Error,\r\n message: this.errorStrings.ToolValidationResult.message.format(\r\n tool.parentModule.name,\r\n tool.displayName),\r\n source: 'ToolConditionValidator'\r\n });\r\n return of(<ToolConditionExpandResult>{\r\n show: false,\r\n ends: true\r\n });\r\n }),\r\n expand((value) => {\r\n checkerIndex++;\r\n if (value.ends) {\r\n return EMPTY;\r\n }\r\n\r\n if (value.detail !== undefined && lastDetail == null) {\r\n lastDetail = value.detail;\r\n }\r\n\r\n if (value.message !== undefined && lastMessage == null) {\r\n lastMessage = value.message;\r\n }\r\n\r\n if (!value.show) {\r\n // failed result. increment collection index and reset checkerIndex.\r\n if (checkersCollection.length > ++collectionIndex) {\r\n // still has another condition, try next checker set.\r\n return this.runChecker(checkersCollection[collectionIndex][checkerIndex = 0]);\r\n } else {\r\n // no more condition, end to return 'false'.\r\n return of(<ToolConditionExpandResult>{\r\n show: false,\r\n detail: lastDetail,\r\n message: lastMessage,\r\n ends: true\r\n });\r\n }\r\n }\r\n\r\n if (checkersCollection[collectionIndex].length > checkerIndex) {\r\n // check next checker.\r\n return this.runChecker(checkersCollection[collectionIndex][checkerIndex]);\r\n } else {\r\n // all state/succeeded within the checker set.\r\n return of({\r\n show: true,\r\n detail: lastDetail,\r\n message: lastMessage,\r\n ends: true\r\n });\r\n }\r\n }),\r\n filter(combined => combined.ends),\r\n map(combined => {\r\n return {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: combined.show,\r\n detail: combined.detail,\r\n message: combined.message,\r\n connectionId: connection ? connection.id : null\r\n }\r\n };\r\n }))\r\n };\r\n }\r\n\r\n private runChecker(checker: Observable<EnvironmentModuleToolConditionResult>): Observable<ToolConditionExpandResult> {\r\n return checker.pipe(\r\n take(1),\r\n map(result => <ToolConditionExpandResult>{ ...result, ends: false }));\r\n }\r\n\r\n private localhostValidate(\r\n connection: Connection): Observable<EnvironmentModuleToolConditionResult> {\r\n return this.caches.gatewayCache.createObservable({})\r\n .pipe(\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: !(instance.mode !== GatewayMode.Service\r\n && connection.properties\r\n && connection.properties.displayName === 'localhost')\r\n }));\r\n }\r\n\r\n private installationTypeValidate(\r\n connection: Connection, installationType?: String[]): Observable<EnvironmentModuleToolConditionResult> {\r\n if (MsftSme.getValue<boolean>(MsftSme.self().Environment.configuration, 'gateway.disabled')) {\r\n return of({ show: true });\r\n }\r\n\r\n if (!installationType || !Array.isArray(installationType) || installationType.length === 0) {\r\n // Default to standard if property doesnt exist in the manifest.\r\n installationType = ['Standard'];\r\n }\r\n\r\n return this.caches.gatewayCache.createObservable({ params: {} })\r\n .pipe(\r\n catchError((error) => {\r\n const errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n const notification = this.appContext.notification.create(connection.name);\r\n notification.showError(\r\n errorStrings.ToolValidationGatewayInventoryError.title,\r\n errorStrings.ToolValidationGatewayInventoryError.message.format(Net.getErrorMessage(error)));\r\n return of(null);\r\n }),\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: installationType.some(t => instance.installationType === t)\r\n }));\r\n }\r\n\r\n private inventoryValidate(\r\n connection: Connection, condition: EnvironmentModuleConditionMap): Observable<EnvironmentModuleToolConditionResult> {\r\n const nodeName = connection.activeAlias ? connection.activeAlias : connection.name;\r\n return this.caches.serverCache.createObservable({ params: { name: nodeName } })\r\n .pipe(\r\n catchError((error) => {\r\n const errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n const notification = this.appContext.notification.create(connection.name);\r\n notification.showError(\r\n errorStrings.ToolValidationInventoryError.title,\r\n errorStrings.ToolValidationInventoryError.message.format(Net.getErrorMessage(error)));\r\n return of(null);\r\n }),\r\n filter((instance: ServerInventory) => instance.serverName === nodeName),\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: this.checkServerInventoryCondition(condition, instance)\r\n }));\r\n }\r\n\r\n private propertyValidate(\r\n connection: Connection, condition: EnvironmentModuleConditionMap): Observable<EnvironmentModuleToolConditionResult> {\r\n const propertyNames = Object.keys(condition);\r\n let result = true;\r\n for (const propertyName of propertyNames) {\r\n const propertyValue = connection.properties && connection.properties[propertyName];\r\n const conditionItem = condition[propertyName];\r\n if (conditionItem && !this.checkCondition(propertyValue, conditionItem)) {\r\n result = false;\r\n break;\r\n }\r\n }\r\n\r\n return of(<EnvironmentModuleToolConditionResult>{ show: result });\r\n }\r\n\r\n private toolInventoryValidate(\r\n connection: Connection,\r\n id: string,\r\n scriptOrCommand: string | PowerShellCommand): Observable<EnvironmentModuleToolConditionResult> {\r\n const command = PowerShell.getPowerShellCommand(scriptOrCommand);\r\n return this.toolInventoryCache.query(\r\n { ...{ name: connection.activeAlias ? connection.activeAlias : connection.name, id: id }, ...command })\r\n .pipe(\r\n map(inventory => <EnvironmentModuleToolConditionResult>{\r\n show: inventory.instance.state === EnvironmentModuleToolState.Available\r\n || inventory.instance.state === EnvironmentModuleToolState.NotConfigured,\r\n detail: inventory.instance.state,\r\n message: inventory.instance.message\r\n }),\r\n catchError((error) => {\r\n const message = Net.getErrorMessage(error);\r\n Logging.logError('ToolConditionValidator', `${id}: ${message}`);\r\n return of(<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported,\r\n message\r\n });\r\n })\r\n );\r\n }\r\n\r\n private checkServerInventoryCondition(condition: EnvironmentModuleConditionMap, instance: ServerInventory): boolean {\r\n for (const property of ToolConditionValidator.serverInventoryProperties) {\r\n const conditionItem = condition[property.conditionName];\r\n if (conditionItem && !this.checkCondition(instance[property.dataName], conditionItem)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private checkCondition(data: any, condition: EnvironmentModuleConditionStatement): boolean {\r\n switch (condition.type) {\r\n case 'number':\r\n const numberValue: number = this.getNumberOrZero(data);\r\n const numberTest: number = this.getNumberOrZero(condition.value);\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return numberValue > numberTest;\r\n case ToolConditionValidator.operators.ge:\r\n return numberValue >= numberTest;\r\n case ToolConditionValidator.operators.lt:\r\n return numberValue < numberTest;\r\n case ToolConditionValidator.operators.le:\r\n return numberValue <= numberTest;\r\n case ToolConditionValidator.operators.eq:\r\n return numberValue === numberTest;\r\n case ToolConditionValidator.operators.ne:\r\n return numberValue !== numberTest;\r\n case ToolConditionValidator.operators.is:\r\n return !!numberValue;\r\n case ToolConditionValidator.operators.not:\r\n return !numberValue;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'string':\r\n const stringValue: string = '' + data;\r\n const stringTest: string = '' + condition.value;\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return stringValue.toLowerCase() > stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.ge:\r\n return stringValue.toLowerCase() >= stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.lt:\r\n return stringValue.toLowerCase() < stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.le:\r\n return stringValue.toLowerCase() <= stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.eq:\r\n return stringValue.toLowerCase() === stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.ne:\r\n return stringValue.toLowerCase() !== stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.is:\r\n return !!data;\r\n case ToolConditionValidator.operators.not:\r\n return !data;\r\n case ToolConditionValidator.operators.contains:\r\n return stringValue.toLowerCase().indexOf(stringTest.toLowerCase()) >= 0;\r\n case ToolConditionValidator.operators.notContains:\r\n return stringValue.toLowerCase().indexOf(stringTest.toLowerCase()) < 0;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'boolean':\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.is:\r\n return !!data;\r\n case ToolConditionValidator.operators.not:\r\n return !data;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'version':\r\n const versionValue: string = data;\r\n const versionTest: string = <string>condition.value;\r\n return this.compareVersion(versionValue, versionTest, condition.operator);\r\n\r\n case 'numberArray':\r\n const checkNumber: any = condition.value;\r\n if (!checkNumber\r\n || typeof checkNumber === 'string'\r\n || !checkNumber.length\r\n || typeof checkNumber[0] !== 'number') {\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n const numberArrayValue: number = this.getNumberOrZero(data);\r\n const numberArray: number[] = <number[]>condition.value;\r\n for (const numberItem of numberArray) {\r\n const numberArrayTest = this.getNumberOrZero(numberItem);\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.anyEq:\r\n if (numberArrayValue === numberArrayTest) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNe:\r\n if (numberArrayValue !== numberArrayTest) {\r\n return true;\r\n }\r\n\r\n break;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n return false;\r\n\r\n case 'stringArray':\r\n const checkString: any = condition.value;\r\n if (!checkString\r\n || typeof checkString === 'string'\r\n || !checkString.length\r\n || typeof checkString[0] !== 'string') {\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n const stringArrayValue: string = '' + data;\r\n const stringArray: string[] = <string[]>condition.value;\r\n for (const stringArrayTest of stringArray) {\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.anyEq:\r\n if (stringArrayValue.toLowerCase() === stringArrayTest.toLowerCase()) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNe:\r\n if (stringArrayValue.toLowerCase() !== stringArrayTest.toLowerCase()) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyContains:\r\n if (stringArrayValue.toLowerCase().indexOf(stringArrayTest.toLowerCase()) >= 0) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNotContains:\r\n if (stringArrayValue.toLowerCase().indexOf(stringArrayTest.toLowerCase()) < 0) {\r\n return true;\r\n }\r\n\r\n break;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n return false;\r\n\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n private compareVersion(left: string, right: string, operator: string): boolean {\r\n const leftSegments = left.split('.');\r\n const rightSegments = right.split('.');\r\n if (!leftSegments || leftSegments.length <= 0 || !rightSegments || rightSegments.length <= 0) {\r\n throw new Error(this.errorStrings.ToolValidationVersionFormat.message);\r\n }\r\n\r\n const count = Math.max(leftSegments.length, rightSegments.length);\r\n let status;\r\n for (let index = 0; index < count; index++) {\r\n if (rightSegments[index] === '*') {\r\n // quit comparison with wildcard.\r\n status = 0;\r\n break;\r\n }\r\n\r\n const leftSegment = this.getNumberOrZero(leftSegments[index]);\r\n const rightSegment = this.getNumberOrZero(rightSegments[index]);\r\n if (leftSegment === rightSegment) {\r\n // equal.\r\n status = 0;\r\n } else if (leftSegment > rightSegment) {\r\n // greater.\r\n status = 1;\r\n break;\r\n } else {\r\n // lesser.\r\n status = -1;\r\n break;\r\n }\r\n }\r\n\r\n switch (operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return status > 0;\r\n case ToolConditionValidator.operators.ge:\r\n return status >= 0;\r\n case ToolConditionValidator.operators.lt:\r\n return status < 0;\r\n case ToolConditionValidator.operators.le:\r\n return status <= 0;\r\n case ToolConditionValidator.operators.eq:\r\n return status === 0;\r\n case ToolConditionValidator.operators.ne:\r\n return status !== 0;\r\n default:\r\n throw new Error(\r\n this.errorStrings.ToolValidationUnsupportedOperator.message.format(operator, left));\r\n }\r\n }\r\n\r\n private getNumberOrZero(data: any): number {\r\n const result = Number(data);\r\n return isNaN(result) ? 0 : result;\r\n }\r\n}\r\n"]}
|
|
@@ -48,6 +48,11 @@ export class ToolConditionValidator {
|
|
|
48
48
|
conditionName: 'clusterFqdn',
|
|
49
49
|
dataName: 'clusterFqdn'
|
|
50
50
|
},
|
|
51
|
+
// string
|
|
52
|
+
{
|
|
53
|
+
conditionName: 'systemLockdownPolicy',
|
|
54
|
+
dataName: 'systemLockdownPolicy'
|
|
55
|
+
},
|
|
51
56
|
// boolean
|
|
52
57
|
{
|
|
53
58
|
conditionName: 'isHyperVRoleInstalled',
|
|
@@ -89,11 +94,6 @@ export class ToolConditionValidator {
|
|
|
89
94
|
dataName: 'isBritannicaEnabled'
|
|
90
95
|
},
|
|
91
96
|
// boolean
|
|
92
|
-
{
|
|
93
|
-
conditionName: 'isSystemLockdownPolicyEnforced',
|
|
94
|
-
dataName: 'isSystemLockdownPolicyEnforced'
|
|
95
|
-
},
|
|
96
|
-
// boolean
|
|
97
97
|
{
|
|
98
98
|
conditionName: 'isHciServer',
|
|
99
99
|
dataName: 'isHciServer'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/security/tool-condition-validator.ts"],"names":[],"mappings":"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","file":"tool-condition-validator.js","sourcesContent":["import { EMPTY, Observable, of } from 'rxjs';\r\nimport { catchError, expand, filter, map, take } from 'rxjs/operators';\r\nimport { AppContext } from '../data/app-context';\r\nimport { Net } from '../data/net';\r\nimport { PowerShell, PowerShellCommand } from '../data/powershell';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { Strings } from '../generated/strings';\r\nimport {\r\n EnvironmentModule,\r\n EnvironmentModuleConditionMap,\r\n EnvironmentModuleConditionStatement,\r\n EnvironmentModuleEntryPoint,\r\n EnvironmentModuleEntryPointWithToolConditionResult,\r\n EnvironmentModuleToolConditionResult,\r\n EnvironmentModuleToolState\r\n} from '../manifest/environment-modules';\r\nimport { Connection } from '../security/connection';\r\nimport { GatewayMode } from '../shared/gateway-inventory/gateway-inventory';\r\nimport { InventoryQueryCaches } from '../shared/inventory-query-caches';\r\nimport { ServerInventory } from '../shared/server-inventory/server-inventory';\r\nimport { ToolInventoryCache } from '../shared/tool-inventory/tool-inventory-cache';\r\n\r\n/**\r\n * The interface object to be used by expand calculation.\r\n */\r\ninterface ToolConditionExpandResult extends EnvironmentModuleToolConditionResult {\r\n ends: boolean;\r\n}\r\n\r\n/**\r\n * The calculation weight ratio base on performance.\r\n */\r\nexport const enum ToolConditionWeight {\r\n /**\r\n * Not using any observable calculation.\r\n */\r\n NonObservable,\r\n\r\n /**\r\n * Using the connection property.\r\n */\r\n Property,\r\n\r\n /**\r\n * Using the gateway inventory data.\r\n */\r\n Gateway,\r\n\r\n /**\r\n * Using the server inventory data.\r\n */\r\n Server,\r\n\r\n /**\r\n * Using a custom PowerShell script.\r\n */\r\n Script\r\n}\r\n\r\n/**\r\n * The condition result with weight information.\r\n */\r\nexport interface ToolConditionResultWithWeight {\r\n /**\r\n * The calculation weight.\r\n */\r\n weight: ToolConditionWeight;\r\n\r\n /**\r\n * The result data.\r\n */\r\n result: Observable<EnvironmentModuleEntryPointWithToolConditionResult> | EnvironmentModuleEntryPointWithToolConditionResult;\r\n}\r\n\r\n/**\r\n * The class handles conditions of tools to be presented on tools' menu.\r\n * @dynamic\r\n */\r\nexport class ToolConditionValidator {\r\n /**\r\n * Support the following condition name.\r\n * It can be a string, number, boolean and version string.\r\n */\r\n private static serverInventoryProperties: { conditionName: string, dataName: string }[] = [\r\n // string\r\n {\r\n conditionName: 'computerManufacturer',\r\n dataName: 'computerManufacturer'\r\n },\r\n\r\n // string\r\n {\r\n conditionName: 'computerModel',\r\n dataName: 'computerModel'\r\n },\r\n\r\n // number\r\n {\r\n conditionName: 'operatingSystemSKU',\r\n dataName: 'operatingSystemSKU'\r\n },\r\n\r\n // version string\r\n {\r\n conditionName: 'operatingSystemVersion',\r\n dataName: 'operatingSystemVersion'\r\n },\r\n\r\n // number\r\n {\r\n conditionName: 'windowsProductType',\r\n dataName: 'productType'\r\n },\r\n\r\n // string\r\n {\r\n conditionName: 'clusterFqdn',\r\n dataName: 'clusterFqdn'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHyperVRoleInstalled',\r\n dataName: 'isHyperVRoleInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHyperVPowershellInstalled',\r\n dataName: 'isHyperVPowershellInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isManagementToolsAvailable',\r\n dataName: 'isManagementToolsAvailable'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isWmfInstalled',\r\n dataName: 'isWmfInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isRemoteAppEnabled',\r\n dataName: 'isRemoteAppEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isDomainController',\r\n dataName: 'isDomainController'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isS2dEnabled',\r\n dataName: 'isS2dEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isBritannicaEnabled',\r\n dataName: 'isBritannicaEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isSystemLockdownPolicyEnforced',\r\n dataName: 'isSystemLockdownPolicyEnforced'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHciServer',\r\n dataName: 'isHciServer'\r\n }\r\n ];\r\n\r\n /**\r\n * The following operators are supported.\r\n * String comparison uses caseinsesitive pattern.\r\n */\r\n private static operators = {\r\n /**\r\n * Greater than: number, string (caseinsesitive), version\r\n */\r\n gt: 'gt',\r\n\r\n /**\r\n * Greater or equal: number, string (caseinsesitive), version\r\n */\r\n ge: 'ge',\r\n\r\n /**\r\n * Less than: number, string (caseinsesitive), version\r\n */\r\n lt: 'lt',\r\n\r\n /**\r\n * Less or equal: number, string (caseinsesitive), version\r\n */\r\n le: 'le',\r\n\r\n /**\r\n * Equal: number, string (caseinsesitive), version (Accept '*' like \"1.2.*\")\r\n */\r\n eq: 'eq',\r\n\r\n /**\r\n * Not equal: number, string (caseinsesitive), version (Accept '*' like \"1.2.*\")\r\n */\r\n ne: 'ne',\r\n\r\n /**\r\n * Test true: number, string, boolean\r\n */\r\n is: 'is',\r\n\r\n /**\r\n * Test false: number, string, boolean\r\n */\r\n not: 'not',\r\n\r\n /**\r\n * Contains a string: string (caseinsesitive)\r\n */\r\n contains: 'contains',\r\n\r\n /**\r\n * Not contains a string: string (caseinsesitive)\r\n */\r\n notContains: 'notContains',\r\n\r\n /**\r\n * Any one of value (number or string) equal: numberArray, stringArray\r\n */\r\n anyEq: 'anyEq',\r\n\r\n /**\r\n * Any one of value (number or string) not equal: numberArray, stringArray\r\n */\r\n anyNe: 'anyNe',\r\n\r\n /**\r\n * Any one of string contains: stringArray\r\n */\r\n anyContains: 'anyContains',\r\n\r\n /**\r\n * Any one of string not contains: stringArray\r\n */\r\n anyNotContains: 'anyNotContains'\r\n };\r\n\r\n private static internalCurrent: ToolConditionValidator;\r\n\r\n private caches: InventoryQueryCaches;\r\n private toolInventoryCache: ToolInventoryCache;\r\n private errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n\r\n /**\r\n * Gets the current object of the ToolConditionValidator class, and maintains as singleton.\r\n *\r\n * @param appContext the application context.\r\n * @param caches the instance of the inventory query caches to share the resource.\r\n */\r\n public static current(appContext: AppContext, caches: InventoryQueryCaches): ToolConditionValidator {\r\n if (!ToolConditionValidator.internalCurrent) {\r\n ToolConditionValidator.internalCurrent = new ToolConditionValidator(appContext, caches);\r\n }\r\n\r\n return ToolConditionValidator.internalCurrent;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the ToolConditionValidator class.\r\n *\r\n * @param appContext the application context.\r\n * @param caches the instance of the inventory query caches to share the resource.\r\n */\r\n constructor(private appContext: AppContext, caches: InventoryQueryCaches) {\r\n const statusExpiration = 4 * 60 * 1000; // 4 min\r\n this.caches = caches;\r\n this.toolInventoryCache = new ToolInventoryCache(appContext, { expiration: statusExpiration });\r\n }\r\n\r\n /**\r\n * Scan the tool condition to be present or not.\r\n *\r\n * @param connection the connection object.\r\n * @param solution The entry point object of solution.\r\n * @param tool The entry point object of tool.\r\n * @param scanMode The mode of scanning.\r\n * @return the result observable.\r\n */\r\n public scanToolCondition(\r\n connection: Connection,\r\n solution: EnvironmentModuleEntryPoint,\r\n tool: EnvironmentModuleEntryPoint): ToolConditionResultWithWeight {\r\n\r\n if (!tool.requirements) {\r\n // tool is missing requirements, never show.\r\n return {\r\n weight: ToolConditionWeight.NonObservable,\r\n result: {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported\r\n }\r\n }\r\n };\r\n }\r\n\r\n const solutionId = EnvironmentModule.createFormattedEntrypoint(solution);\r\n const toolId = EnvironmentModule.createFormattedEntrypoint(tool);\r\n const checkersCollection = [];\r\n let weight = ToolConditionWeight.NonObservable;\r\n for (const requirement of tool.requirements) {\r\n const checkers: Observable<EnvironmentModuleToolConditionResult>[] = [];\r\n\r\n // tool must specify the solutions it can show in\r\n if (!requirement.solutionIds || requirement.solutionIds.every(id => id !== solutionId)) {\r\n continue;\r\n }\r\n\r\n // if ths solution is a connections type, then the tool must specify the connection type\r\n if (solution.rootNavigationBehavior === 'connections'\r\n && (!requirement.connectionTypes || requirement.connectionTypes.every(type => type !== connection.type))) {\r\n continue;\r\n }\r\n\r\n // if there are no conditions to check, then this tool has been satisfied.\r\n if (!requirement.conditions || requirement.conditions.length === 0) {\r\n checkers.push(this.installationTypeValidate(connection));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n } else {\r\n for (const condition of requirement.conditions) {\r\n\r\n checkers.push(this.installationTypeValidate(connection, condition.installationTypes));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n\r\n if (condition.localhost !== undefined && !condition.localhost) {\r\n // if connection is localhost and not supported.\r\n checkers.push(this.localhostValidate(connection));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n }\r\n\r\n if (condition.inventory) {\r\n checkers.push(this.inventoryValidate(connection, condition.inventory));\r\n weight = Math.max(weight, ToolConditionWeight.Server);\r\n }\r\n\r\n if (condition.properties) {\r\n checkers.push(this.propertyValidate(connection, condition.properties));\r\n weight = Math.max(weight, ToolConditionWeight.Property);\r\n }\r\n\r\n if (condition.powerShell) {\r\n // powerShell { command, script }\r\n checkers.push(this.toolInventoryValidate(connection, toolId, condition.powerShell));\r\n weight = Math.max(weight, ToolConditionWeight.Script);\r\n } else if (condition.script) {\r\n // deprecated\r\n checkers.push(this.toolInventoryValidate(connection, toolId, condition.script));\r\n weight = Math.max(weight, ToolConditionWeight.Script);\r\n }\r\n }\r\n }\r\n\r\n checkersCollection.push(checkers);\r\n }\r\n\r\n if (checkersCollection.length === 0) {\r\n return {\r\n weight: ToolConditionWeight.NonObservable,\r\n result: {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported,\r\n connectionId: connection ? connection.id : null\r\n }\r\n }\r\n };\r\n }\r\n\r\n let collectionIndex = 0;\r\n let checkerIndex = 0;\r\n let lastDetail: EnvironmentModuleToolState = null;\r\n let lastMessage: string = null;\r\n return {\r\n weight: weight,\r\n result: this.runChecker(checkersCollection[collectionIndex][checkerIndex])\r\n .pipe(catchError(() => {\r\n Logging.log({\r\n level: LogLevel.Error,\r\n message: this.errorStrings.ToolValidationResult.message.format(\r\n tool.parentModule.name,\r\n tool.displayName),\r\n source: 'ToolConditionValidator'\r\n });\r\n return of(<ToolConditionExpandResult>{\r\n show: false,\r\n ends: true\r\n });\r\n }),\r\n expand((value) => {\r\n checkerIndex++;\r\n if (value.ends) {\r\n return EMPTY;\r\n }\r\n\r\n if (value.detail !== undefined && lastDetail == null) {\r\n lastDetail = value.detail;\r\n }\r\n\r\n if (value.message !== undefined && lastMessage == null) {\r\n lastMessage = value.message;\r\n }\r\n\r\n if (!value.show) {\r\n // failed result. increment collection index and reset checkerIndex.\r\n if (checkersCollection.length > ++collectionIndex) {\r\n // still has another condition, try next checker set.\r\n return this.runChecker(checkersCollection[collectionIndex][checkerIndex = 0]);\r\n } else {\r\n // no more condition, end to return 'false'.\r\n return of(<ToolConditionExpandResult>{\r\n show: false,\r\n detail: lastDetail,\r\n message: lastMessage,\r\n ends: true\r\n });\r\n }\r\n }\r\n\r\n if (checkersCollection[collectionIndex].length > checkerIndex) {\r\n // check next checker.\r\n return this.runChecker(checkersCollection[collectionIndex][checkerIndex]);\r\n } else {\r\n // all state/succeeded within the checker set.\r\n return of({\r\n show: true,\r\n detail: lastDetail,\r\n message: lastMessage,\r\n ends: true\r\n });\r\n }\r\n }),\r\n filter(combined => combined.ends),\r\n map(combined => {\r\n return {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: combined.show,\r\n detail: combined.detail,\r\n message: combined.message,\r\n connectionId: connection ? connection.id : null\r\n }\r\n };\r\n }))\r\n };\r\n }\r\n\r\n private runChecker(checker: Observable<EnvironmentModuleToolConditionResult>): Observable<ToolConditionExpandResult> {\r\n return checker.pipe(\r\n take(1),\r\n map(result => <ToolConditionExpandResult>{ ...result, ends: false }));\r\n }\r\n\r\n private localhostValidate(\r\n connection: Connection): Observable<EnvironmentModuleToolConditionResult> {\r\n return this.caches.gatewayCache.createObservable({})\r\n .pipe(\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: !(instance.mode !== GatewayMode.Service\r\n && connection.properties\r\n && connection.properties.displayName === 'localhost')\r\n }));\r\n }\r\n\r\n private installationTypeValidate(\r\n connection: Connection, installationType?: String[]): Observable<EnvironmentModuleToolConditionResult> {\r\n if (MsftSme.getValue<boolean>(MsftSme.self().Environment.configuration, 'gateway.disabled')) {\r\n return of({ show: true });\r\n }\r\n\r\n if (!installationType || !Array.isArray(installationType) || installationType.length === 0) {\r\n // Default to standard if property doesnt exist in the manifest.\r\n installationType = ['Standard'];\r\n }\r\n\r\n return this.caches.gatewayCache.createObservable({ params: {} })\r\n .pipe(\r\n catchError((error) => {\r\n const errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n const notification = this.appContext.notification.create(connection.name);\r\n notification.showError(\r\n errorStrings.ToolValidationGatewayInventoryError.title,\r\n errorStrings.ToolValidationGatewayInventoryError.message.format(Net.getErrorMessage(error)));\r\n return of(null);\r\n }),\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: installationType.some(t => instance.installationType === t)\r\n }));\r\n }\r\n\r\n private inventoryValidate(\r\n connection: Connection, condition: EnvironmentModuleConditionMap): Observable<EnvironmentModuleToolConditionResult> {\r\n const nodeName = connection.activeAlias ? connection.activeAlias : connection.name;\r\n return this.caches.serverCache.createObservable({ params: { name: nodeName } })\r\n .pipe(\r\n catchError((error) => {\r\n const errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n const notification = this.appContext.notification.create(connection.name);\r\n notification.showError(\r\n errorStrings.ToolValidationInventoryError.title,\r\n errorStrings.ToolValidationInventoryError.message.format(Net.getErrorMessage(error)));\r\n return of(null);\r\n }),\r\n filter((instance: ServerInventory) => instance.serverName === nodeName),\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: this.checkServerInventoryCondition(condition, instance)\r\n }));\r\n }\r\n\r\n private propertyValidate(\r\n connection: Connection, condition: EnvironmentModuleConditionMap): Observable<EnvironmentModuleToolConditionResult> {\r\n const propertyNames = Object.keys(condition);\r\n let result = true;\r\n for (const propertyName of propertyNames) {\r\n const propertyValue = connection.properties && connection.properties[propertyName];\r\n const conditionItem = condition[propertyName];\r\n if (conditionItem && !this.checkCondition(propertyValue, conditionItem)) {\r\n result = false;\r\n break;\r\n }\r\n }\r\n\r\n return of(<EnvironmentModuleToolConditionResult>{ show: result });\r\n }\r\n\r\n private toolInventoryValidate(\r\n connection: Connection,\r\n id: string,\r\n scriptOrCommand: string | PowerShellCommand): Observable<EnvironmentModuleToolConditionResult> {\r\n const command = PowerShell.getPowerShellCommand(scriptOrCommand);\r\n return this.toolInventoryCache.query(\r\n { ...{ name: connection.activeAlias ? connection.activeAlias : connection.name, id: id }, ...command })\r\n .pipe(\r\n map(inventory => <EnvironmentModuleToolConditionResult>{\r\n show: inventory.instance.state === EnvironmentModuleToolState.Available\r\n || inventory.instance.state === EnvironmentModuleToolState.NotConfigured,\r\n detail: inventory.instance.state,\r\n message: inventory.instance.message\r\n }),\r\n catchError((error) => {\r\n const message = Net.getErrorMessage(error);\r\n Logging.logError('ToolConditionValidator', `${id}: ${message}`);\r\n return of(<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported,\r\n message\r\n });\r\n })\r\n );\r\n }\r\n\r\n private checkServerInventoryCondition(condition: EnvironmentModuleConditionMap, instance: ServerInventory): boolean {\r\n for (const property of ToolConditionValidator.serverInventoryProperties) {\r\n const conditionItem = condition[property.conditionName];\r\n if (conditionItem && !this.checkCondition(instance[property.dataName], conditionItem)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private checkCondition(data: any, condition: EnvironmentModuleConditionStatement): boolean {\r\n switch (condition.type) {\r\n case 'number':\r\n const numberValue: number = this.getNumberOrZero(data);\r\n const numberTest: number = this.getNumberOrZero(condition.value);\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return numberValue > numberTest;\r\n case ToolConditionValidator.operators.ge:\r\n return numberValue >= numberTest;\r\n case ToolConditionValidator.operators.lt:\r\n return numberValue < numberTest;\r\n case ToolConditionValidator.operators.le:\r\n return numberValue <= numberTest;\r\n case ToolConditionValidator.operators.eq:\r\n return numberValue === numberTest;\r\n case ToolConditionValidator.operators.ne:\r\n return numberValue !== numberTest;\r\n case ToolConditionValidator.operators.is:\r\n return !!numberValue;\r\n case ToolConditionValidator.operators.not:\r\n return !numberValue;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'string':\r\n const stringValue: string = '' + data;\r\n const stringTest: string = '' + condition.value;\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return stringValue.toLowerCase() > stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.ge:\r\n return stringValue.toLowerCase() >= stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.lt:\r\n return stringValue.toLowerCase() < stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.le:\r\n return stringValue.toLowerCase() <= stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.eq:\r\n return stringValue.toLowerCase() === stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.ne:\r\n return stringValue.toLowerCase() !== stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.is:\r\n return !!data;\r\n case ToolConditionValidator.operators.not:\r\n return !data;\r\n case ToolConditionValidator.operators.contains:\r\n return stringValue.toLowerCase().indexOf(stringTest.toLowerCase()) >= 0;\r\n case ToolConditionValidator.operators.notContains:\r\n return stringValue.toLowerCase().indexOf(stringTest.toLowerCase()) < 0;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'boolean':\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.is:\r\n return !!data;\r\n case ToolConditionValidator.operators.not:\r\n return !data;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'version':\r\n const versionValue: string = data;\r\n const versionTest: string = <string>condition.value;\r\n return this.compareVersion(versionValue, versionTest, condition.operator);\r\n\r\n case 'numberArray':\r\n const checkNumber: any = condition.value;\r\n if (!checkNumber\r\n || typeof checkNumber === 'string'\r\n || !checkNumber.length\r\n || typeof checkNumber[0] !== 'number') {\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n const numberArrayValue: number = this.getNumberOrZero(data);\r\n const numberArray: number[] = <number[]>condition.value;\r\n for (const numberItem of numberArray) {\r\n const numberArrayTest = this.getNumberOrZero(numberItem);\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.anyEq:\r\n if (numberArrayValue === numberArrayTest) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNe:\r\n if (numberArrayValue !== numberArrayTest) {\r\n return true;\r\n }\r\n\r\n break;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n return false;\r\n\r\n case 'stringArray':\r\n const checkString: any = condition.value;\r\n if (!checkString\r\n || typeof checkString === 'string'\r\n || !checkString.length\r\n || typeof checkString[0] !== 'string') {\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n const stringArrayValue: string = '' + data;\r\n const stringArray: string[] = <string[]>condition.value;\r\n for (const stringArrayTest of stringArray) {\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.anyEq:\r\n if (stringArrayValue.toLowerCase() === stringArrayTest.toLowerCase()) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNe:\r\n if (stringArrayValue.toLowerCase() !== stringArrayTest.toLowerCase()) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyContains:\r\n if (stringArrayValue.toLowerCase().indexOf(stringArrayTest.toLowerCase()) >= 0) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNotContains:\r\n if (stringArrayValue.toLowerCase().indexOf(stringArrayTest.toLowerCase()) < 0) {\r\n return true;\r\n }\r\n\r\n break;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n return false;\r\n\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n private compareVersion(left: string, right: string, operator: string): boolean {\r\n const leftSegments = left.split('.');\r\n const rightSegments = right.split('.');\r\n if (!leftSegments || leftSegments.length <= 0 || !rightSegments || rightSegments.length <= 0) {\r\n throw new Error(this.errorStrings.ToolValidationVersionFormat.message);\r\n }\r\n\r\n const count = Math.max(leftSegments.length, rightSegments.length);\r\n let status;\r\n for (let index = 0; index < count; index++) {\r\n if (rightSegments[index] === '*') {\r\n // quit comparison with wildcard.\r\n status = 0;\r\n break;\r\n }\r\n\r\n const leftSegment = this.getNumberOrZero(leftSegments[index]);\r\n const rightSegment = this.getNumberOrZero(rightSegments[index]);\r\n if (leftSegment === rightSegment) {\r\n // equal.\r\n status = 0;\r\n } else if (leftSegment > rightSegment) {\r\n // greater.\r\n status = 1;\r\n break;\r\n } else {\r\n // lesser.\r\n status = -1;\r\n break;\r\n }\r\n }\r\n\r\n switch (operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return status > 0;\r\n case ToolConditionValidator.operators.ge:\r\n return status >= 0;\r\n case ToolConditionValidator.operators.lt:\r\n return status < 0;\r\n case ToolConditionValidator.operators.le:\r\n return status <= 0;\r\n case ToolConditionValidator.operators.eq:\r\n return status === 0;\r\n case ToolConditionValidator.operators.ne:\r\n return status !== 0;\r\n default:\r\n throw new Error(\r\n this.errorStrings.ToolValidationUnsupportedOperator.message.format(operator, left));\r\n }\r\n }\r\n\r\n private getNumberOrZero(data: any): number {\r\n const result = Number(data);\r\n return isNaN(result) ? 0 : result;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/security/tool-condition-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,EAAE,EAAE,MAAM,MAAM,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAEvE,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,UAAU,EAAqB,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,OAAO,EACH,iBAAiB,EAMjB,0BAA0B,EAC7B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAG5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,+CAA+C,CAAC;AAsDnF;;;GAGG;AACH,MAAM,OAAO,sBAAsB;IA6MX;IA5MpB;;;OAGG;IACK,MAAM,CAAC,yBAAyB,GAAkD;QACtF,SAAS;QACT;YACI,aAAa,EAAE,sBAAsB;YACrC,QAAQ,EAAE,sBAAsB;SACnC;QAED,SAAS;QACT;YACI,aAAa,EAAE,eAAe;YAC9B,QAAQ,EAAE,eAAe;SAC5B;QAED,SAAS;QACT;YACI,aAAa,EAAE,oBAAoB;YACnC,QAAQ,EAAE,oBAAoB;SACjC;QAED,iBAAiB;QACjB;YACI,aAAa,EAAE,wBAAwB;YACvC,QAAQ,EAAE,wBAAwB;SACrC;QAED,SAAS;QACT;YACI,aAAa,EAAE,oBAAoB;YACnC,QAAQ,EAAE,aAAa;SAC1B;QAED,SAAS;QACT;YACI,aAAa,EAAE,aAAa;YAC5B,QAAQ,EAAE,aAAa;SAC1B;QAED,SAAS;QACT;YACI,aAAa,EAAE,sBAAsB;YACrC,QAAQ,EAAE,sBAAsB;SACnC;QAED,UAAU;QACV;YACI,aAAa,EAAE,uBAAuB;YACtC,QAAQ,EAAE,uBAAuB;SACpC;QAED,UAAU;QACV;YACI,aAAa,EAAE,6BAA6B;YAC5C,QAAQ,EAAE,6BAA6B;SAC1C;QAED,UAAU;QACV;YACI,aAAa,EAAE,4BAA4B;YAC3C,QAAQ,EAAE,4BAA4B;SACzC;QAED,UAAU;QACV;YACI,aAAa,EAAE,gBAAgB;YAC/B,QAAQ,EAAE,gBAAgB;SAC7B;QAED,UAAU;QACV;YACI,aAAa,EAAE,oBAAoB;YACnC,QAAQ,EAAE,oBAAoB;SACjC;QAED,UAAU;QACV;YACI,aAAa,EAAE,oBAAoB;YACnC,QAAQ,EAAE,oBAAoB;SACjC;QAED,UAAU;QACV;YACI,aAAa,EAAE,cAAc;YAC7B,QAAQ,EAAE,cAAc;SAC3B;QAED,UAAU;QACV;YACI,aAAa,EAAE,qBAAqB;YACpC,QAAQ,EAAE,qBAAqB;SAClC;QAED,UAAU;QACV;YACI,aAAa,EAAE,aAAa;YAC5B,QAAQ,EAAE,aAAa;SAC1B;KACJ,CAAC;IAEF;;;OAGG;IACK,MAAM,CAAC,SAAS,GAAG;QACvB;;WAEG;QACH,EAAE,EAAE,IAAI;QAER;;WAEG;QACH,EAAE,EAAE,IAAI;QAER;;WAEG;QACH,EAAE,EAAE,IAAI;QAER;;WAEG;QACH,EAAE,EAAE,IAAI;QAER;;WAEG;QACH,EAAE,EAAE,IAAI;QAER;;WAEG;QACH,EAAE,EAAE,IAAI;QAER;;WAEG;QACH,EAAE,EAAE,IAAI;QAER;;WAEG;QACH,GAAG,EAAE,KAAK;QAEV;;WAEG;QACH,QAAQ,EAAE,UAAU;QAEpB;;WAEG;QACH,WAAW,EAAE,aAAa;QAE1B;;WAEG;QACH,KAAK,EAAE,OAAO;QAEd;;WAEG;QACH,KAAK,EAAE,OAAO;QAEd;;WAEG;QACH,WAAW,EAAE,aAAa;QAE1B;;WAEG;QACH,cAAc,EAAE,gBAAgB;KACnC,CAAC;IAEM,MAAM,CAAC,eAAe,CAAyB;IAE/C,MAAM,CAAuB;IAC7B,kBAAkB,CAAqB;IACvC,YAAY,GAAG,OAAO,CAAC,UAAU,EAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;IAE7E;;;;;OAKG;IACI,MAAM,CAAC,OAAO,CAAC,UAAsB,EAAE,MAA4B;QACtE,IAAI,CAAC,sBAAsB,CAAC,eAAe,EAAE;YACzC,sBAAsB,CAAC,eAAe,GAAG,IAAI,sBAAsB,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;SAC3F;QAED,OAAO,sBAAsB,CAAC,eAAe,CAAC;IAClD,CAAC;IAED;;;;;OAKG;IACH,YAAoB,UAAsB,EAAE,MAA4B;QAApD,eAAU,GAAV,UAAU,CAAY;QACtC,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,QAAQ;QAChD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,kBAAkB,GAAG,IAAI,kBAAkB,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACnG,CAAC;IAED;;;;;;;;OAQG;IACI,iBAAiB,CACpB,UAAsB,EACtB,QAAqC,EACrC,IAAiC;QAEjC,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACpB,4CAA4C;YAC5C,OAAO;gBACH,MAAM,2CAAmC;gBACzC,MAAM,EAAE;oBACJ,GAAG,IAAI;oBACP,GAAyC;wBACrC,IAAI,EAAE,KAAK;wBACX,MAAM,EAAE,0BAA0B,CAAC,YAAY;qBAClD;iBACJ;aACJ,CAAC;SACL;QAED,MAAM,UAAU,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAAC;QACzE,MAAM,MAAM,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,kBAAkB,GAAG,EAAE,CAAC;QAC9B,IAAI,MAAM,4CAAoC,CAAC;QAC/C,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,YAAY,EAAE;YACzC,MAAM,QAAQ,GAAuD,EAAE,CAAC;YAExE,iDAAiD;YACjD,IAAI,CAAC,WAAW,CAAC,WAAW,IAAI,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,KAAK,UAAU,CAAC,EAAE;gBACpF,SAAS;aACZ;YAED,wFAAwF;YACxF,IAAI,QAAQ,CAAC,sBAAsB,KAAK,aAAa;mBAC9C,CAAC,CAAC,WAAW,CAAC,eAAe,IAAI,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE;gBAC1G,SAAS;aACZ;YAED,0EAA0E;YAC1E,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE;gBAChE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,UAAU,CAAC,CAAC,CAAC;gBACzD,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,sCAA8B,CAAC;aAC1D;iBAAM;gBACH,KAAK,MAAM,SAAS,IAAI,WAAW,CAAC,UAAU,EAAE;oBAE5C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAwB,CAAC,UAAU,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAAC;oBACtF,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,sCAA8B,CAAC;oBAEvD,IAAI,SAAS,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;wBAC3D,gDAAgD;wBAChD,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;wBAClD,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,sCAA8B,CAAC;qBAC1D;oBAED,IAAI,SAAS,CAAC,SAAS,EAAE;wBACrB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC;wBACvE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,qCAA6B,CAAC;qBACzD;oBAED,IAAI,SAAS,CAAC,UAAU,EAAE;wBACtB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;wBACvE,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,uCAA+B,CAAC;qBAC3D;oBAED,IAAI,SAAS,CAAC,UAAU,EAAE;wBACtB,iCAAiC;wBACjC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;wBACpF,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,qCAA6B,CAAC;qBACzD;yBAAM,IAAI,SAAS,CAAC,MAAM,EAAE;wBACzB,aAAa;wBACb,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;wBAChF,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,qCAA6B,CAAC;qBACzD;iBACJ;aACJ;YAED,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACrC;QAED,IAAI,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE;YACjC,OAAO;gBACH,MAAM,2CAAmC;gBACzC,MAAM,EAAE;oBACJ,GAAG,IAAI;oBACP,GAAyC;wBACrC,IAAI,EAAE,KAAK;wBACX,MAAM,EAAE,0BAA0B,CAAC,YAAY;wBAC/C,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;qBAClD;iBACJ;aACJ,CAAC;SACL;QAED,IAAI,eAAe,GAAG,CAAC,CAAC;QACxB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,UAAU,GAA+B,IAAI,CAAC;QAClD,IAAI,WAAW,GAAW,IAAI,CAAC;QAC/B,OAAO;YACH,MAAM,EAAE,MAAM;YACd,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC;iBACrE,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE;gBAClB,OAAO,CAAC,GAAG,CAAC;oBACR,KAAK,EAAE,QAAQ,CAAC,KAAK;oBACrB,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAC1D,IAAI,CAAC,YAAY,CAAC,IAAI,EACtB,IAAI,CAAC,WAAW,CAAC;oBACrB,MAAM,EAAE,wBAAwB;iBACnC,CAAC,CAAC;gBACH,OAAO,EAAE,CAA4B;oBACjC,IAAI,EAAE,KAAK;oBACX,IAAI,EAAE,IAAI;iBACb,CAAC,CAAC;YACP,CAAC,CAAC,EACE,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACb,YAAY,EAAE,CAAC;gBACf,IAAI,KAAK,CAAC,IAAI,EAAE;oBACZ,OAAO,KAAK,CAAC;iBAChB;gBAED,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,IAAI,IAAI,EAAE;oBAClD,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC;iBAC7B;gBAED,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,WAAW,IAAI,IAAI,EAAE;oBACpD,WAAW,GAAG,KAAK,CAAC,OAAO,CAAC;iBAC/B;gBAED,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;oBACb,oEAAoE;oBACpE,IAAI,kBAAkB,CAAC,MAAM,GAAG,EAAE,eAAe,EAAE;wBAC/C,qDAAqD;wBACrD,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC;qBACjF;yBAAM;wBACH,4CAA4C;wBAC5C,OAAO,EAAE,CAA4B;4BACjC,IAAI,EAAE,KAAK;4BACX,MAAM,EAAE,UAAU;4BAClB,OAAO,EAAE,WAAW;4BACpB,IAAI,EAAE,IAAI;yBACb,CAAC,CAAC;qBACN;iBACJ;gBAED,IAAI,kBAAkB,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,YAAY,EAAE;oBAC3D,sBAAsB;oBACtB,OAAO,IAAI,CAAC,UAAU,CAAC,kBAAkB,CAAC,eAAe,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;iBAC7E;qBAAM;oBACH,8CAA8C;oBAC9C,OAAO,EAAE,CAAC;wBACN,IAAI,EAAE,IAAI;wBACV,MAAM,EAAE,UAAU;wBAClB,OAAO,EAAE,WAAW;wBACpB,IAAI,EAAE,IAAI;qBACb,CAAC,CAAC;iBACN;YACL,CAAC,CAAC,EACF,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EACjC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBACX,OAAO;oBACH,GAAG,IAAI;oBACP,GAAyC;wBACrC,IAAI,EAAE,QAAQ,CAAC,IAAI;wBACnB,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI;qBAClD;iBACJ,CAAC;YACN,CAAC,CAAC,CAAC;SACd,CAAC;IACN,CAAC;IAEO,UAAU,CAAC,OAAyD;QACxE,OAAO,OAAO,CAAC,IAAI,CACf,IAAI,CAAC,CAAC,CAAC,EACP,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAA2B,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,CAAA,CAAC,CAAC,CAAC;IAC9E,CAAC;IAEO,iBAAiB,CACrB,UAAsB;QACtB,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,CAAC;aAC/C,IAAI,CACD,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAsC;YAClD,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,IAAI,KAAK,WAAW,CAAC,OAAO;mBACtC,UAAU,CAAC,UAAU;mBACrB,UAAU,CAAC,UAAU,CAAC,WAAW,KAAK,WAAW,CAAC;SAC5D,CAAA,CAAC,CAAC,CAAC;IAChB,CAAC;IAEO,wBAAwB,CAC5B,UAAsB,EAAE,gBAA2B;QACnD,IAAI,OAAO,CAAC,QAAQ,CAAU,OAAO,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,kBAAkB,CAAC,EAAE;YACzF,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SAC7B;QAED,IAAI,CAAC,gBAAgB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE;YACxF,gEAAgE;YAChE,gBAAgB,GAAG,CAAC,UAAU,CAAC,CAAC;SACnC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aAC3D,IAAI,CACD,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,EAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC1E,YAAY,CAAC,SAAS,CAClB,YAAY,CAAC,mCAAmC,CAAC,KAAK,EACtD,YAAY,CAAC,mCAAmC,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjG,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC,EACF,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAsC;YAClD,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,gBAAgB,KAAK,CAAC,CAAC;SACpE,CAAA,CAAC,CAAC,CAAC;IAChB,CAAC;IAEO,iBAAiB,CACrB,UAAsB,EAAE,SAAwC;QAChE,MAAM,QAAQ,GAAG,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QACnF,OAAO,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,gBAAgB,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,CAAC;aAC1E,IAAI,CACD,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,EAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;YAC3E,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAC1E,YAAY,CAAC,SAAS,CAClB,YAAY,CAAC,4BAA4B,CAAC,KAAK,EAC/C,YAAY,CAAC,4BAA4B,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1F,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC;QACpB,CAAC,CAAC,EACF,MAAM,CAAC,CAAC,QAAyB,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,KAAK,QAAQ,CAAC,EACvE,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAsC;YAClD,IAAI,EAAE,IAAI,CAAC,6BAA6B,CAAC,SAAS,EAAE,QAAQ,CAAC;SAChE,CAAA,CAAC,CAAC,CAAC;IAChB,CAAC;IAEO,gBAAgB,CACpB,UAAsB,EAAE,SAAwC;QAChE,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,MAAM,GAAG,IAAI,CAAC;QAClB,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE;YACtC,MAAM,aAAa,GAAG,UAAU,CAAC,UAAU,IAAI,UAAU,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;YACnF,MAAM,aAAa,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC;YAC9C,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE;gBACrE,MAAM,GAAG,KAAK,CAAC;gBACf,MAAM;aACT;SACJ;QAED,OAAO,EAAE,CAAuC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IACtE,CAAC;IAEO,qBAAqB,CACzB,UAAsB,EACtB,EAAU,EACV,eAA2C;QAC3C,MAAM,OAAO,GAAG,UAAU,CAAC,oBAAoB,CAAC,eAAe,CAAC,CAAC;QACjE,OAAO,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAChC,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC;aACtG,IAAI,CACD,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAsC;YACnD,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,KAAK,0BAA0B,CAAC,SAAS;mBAChE,SAAS,CAAC,QAAQ,CAAC,KAAK,KAAK,0BAA0B,CAAC,aAAa;YAC5E,MAAM,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK;YAChC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,OAAO;SACtC,CAAA,CAAC,EACF,UAAU,CAAC,CAAC,KAAK,EAAE,EAAE;YACjB,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,CAAC,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE,KAAK,OAAO,EAAE,CAAC,CAAC;YAChE,OAAO,EAAE,CAAuC;gBAC5C,IAAI,EAAE,KAAK;gBACX,MAAM,EAAE,0BAA0B,CAAC,YAAY;gBAC/C,OAAO;aACV,CAAC,CAAC;QACP,CAAC,CAAC,CACL,CAAC;IACV,CAAC;IAEO,6BAA6B,CAAC,SAAwC,EAAE,QAAyB;QACrG,KAAK,MAAM,QAAQ,IAAI,sBAAsB,CAAC,yBAAyB,EAAE;YACrE,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;YACxD,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,aAAa,CAAC,EAAE;gBACnF,OAAO,KAAK,CAAC;aAChB;SACJ;QAED,OAAO,IAAI,CAAC;IAChB,CAAC;IAEO,cAAc,CAAC,IAAS,EAAE,SAA8C;QAC5E,QAAQ,SAAS,CAAC,IAAI,EAAE;YACpB,KAAK,QAAQ;gBACT,MAAM,WAAW,GAAW,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBACvD,MAAM,UAAU,GAAW,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACjE,QAAQ,SAAS,CAAC,QAAQ,EAAE;oBACxB,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,GAAG,UAAU,CAAC;oBACpC,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,IAAI,UAAU,CAAC;oBACrC,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,GAAG,UAAU,CAAC;oBACpC,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,IAAI,UAAU,CAAC;oBACrC,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,KAAK,UAAU,CAAC;oBACtC,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,KAAK,UAAU,CAAC;oBACtC,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,CAAC,CAAC,WAAW,CAAC;oBACzB,KAAK,sBAAsB,CAAC,SAAS,CAAC,GAAG;wBACrC,OAAO,CAAC,WAAW,CAAC;oBACxB;wBACI,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,iCAAiC,CAAC,OAAO,CAAC,MAAM,CAC9E,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBAClC;YAEL,KAAK,QAAQ;gBACT,MAAM,WAAW,GAAW,EAAE,GAAG,IAAI,CAAC;gBACtC,MAAM,UAAU,GAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC;gBAChD,QAAQ,SAAS,CAAC,QAAQ,EAAE;oBACxB,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;oBAChE,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,CAAC,WAAW,EAAE,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;oBACjE,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,CAAC,WAAW,EAAE,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;oBAChE,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,CAAC,WAAW,EAAE,IAAI,UAAU,CAAC,WAAW,EAAE,CAAC;oBACjE,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC;oBAClE,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,WAAW,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,WAAW,EAAE,CAAC;oBAClE,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,CAAC,CAAC,IAAI,CAAC;oBAClB,KAAK,sBAAsB,CAAC,SAAS,CAAC,GAAG;wBACrC,OAAO,CAAC,IAAI,CAAC;oBACjB,KAAK,sBAAsB,CAAC,SAAS,CAAC,QAAQ;wBAC1C,OAAO,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC;oBAC5E,KAAK,sBAAsB,CAAC,SAAS,CAAC,WAAW;wBAC7C,OAAO,WAAW,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;oBAC3E;wBACI,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,iCAAiC,CAAC,OAAO,CAAC,MAAM,CAC9E,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBAClC;YAEL,KAAK,SAAS;gBACV,QAAQ,SAAS,CAAC,QAAQ,EAAE;oBACxB,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;wBACpC,OAAO,CAAC,CAAC,IAAI,CAAC;oBAClB,KAAK,sBAAsB,CAAC,SAAS,CAAC,GAAG;wBACrC,OAAO,CAAC,IAAI,CAAC;oBACjB;wBACI,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,iCAAiC,CAAC,OAAO,CAAC,MAAM,CAC9E,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBAClC;YAEL,KAAK,SAAS;gBACV,MAAM,YAAY,GAAW,IAAI,CAAC;gBAClC,MAAM,WAAW,GAAmB,SAAS,CAAC,KAAK,CAAC;gBACpD,OAAO,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,WAAW,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC;YAE9E,KAAK,aAAa;gBACd,MAAM,WAAW,GAAQ,SAAS,CAAC,KAAK,CAAC;gBACzC,IAAI,CAAC,WAAW;uBACT,OAAO,WAAW,KAAK,QAAQ;uBAC/B,CAAC,WAAW,CAAC,MAAM;uBACnB,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;oBACvC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,iCAAiC,CAAC,OAAO,CAAC,MAAM,CAC9E,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBAC9B;gBAED,MAAM,gBAAgB,GAAW,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;gBAC5D,MAAM,WAAW,GAAuB,SAAS,CAAC,KAAK,CAAC;gBACxD,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;oBAClC,MAAM,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;oBACzD,QAAQ,SAAS,CAAC,QAAQ,EAAE;wBACxB,KAAK,sBAAsB,CAAC,SAAS,CAAC,KAAK;4BACvC,IAAI,gBAAgB,KAAK,eAAe,EAAE;gCACtC,OAAO,IAAI,CAAC;6BACf;4BAED,MAAM;wBACV,KAAK,sBAAsB,CAAC,SAAS,CAAC,KAAK;4BACvC,IAAI,gBAAgB,KAAK,eAAe,EAAE;gCACtC,OAAO,IAAI,CAAC;6BACf;4BAED,MAAM;wBACV;4BACI,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,iCAAiC,CAAC,OAAO,CAAC,MAAM,CAC9E,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBAClC;iBACJ;gBAED,OAAO,KAAK,CAAC;YAEjB,KAAK,aAAa;gBACd,MAAM,WAAW,GAAQ,SAAS,CAAC,KAAK,CAAC;gBACzC,IAAI,CAAC,WAAW;uBACT,OAAO,WAAW,KAAK,QAAQ;uBAC/B,CAAC,WAAW,CAAC,MAAM;uBACnB,OAAO,WAAW,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE;oBACvC,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,iCAAiC,CAAC,OAAO,CAAC,MAAM,CAC9E,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;iBAC9B;gBAED,MAAM,gBAAgB,GAAW,EAAE,GAAG,IAAI,CAAC;gBAC3C,MAAM,WAAW,GAAuB,SAAS,CAAC,KAAK,CAAC;gBACxD,KAAK,MAAM,eAAe,IAAI,WAAW,EAAE;oBACvC,QAAQ,SAAS,CAAC,QAAQ,EAAE;wBACxB,KAAK,sBAAsB,CAAC,SAAS,CAAC,KAAK;4BACvC,IAAI,gBAAgB,CAAC,WAAW,EAAE,KAAK,eAAe,CAAC,WAAW,EAAE,EAAE;gCAClE,OAAO,IAAI,CAAC;6BACf;4BAED,MAAM;wBACV,KAAK,sBAAsB,CAAC,SAAS,CAAC,KAAK;4BACvC,IAAI,gBAAgB,CAAC,WAAW,EAAE,KAAK,eAAe,CAAC,WAAW,EAAE,EAAE;gCAClE,OAAO,IAAI,CAAC;6BACf;4BAED,MAAM;wBACV,KAAK,sBAAsB,CAAC,SAAS,CAAC,WAAW;4BAC7C,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE;gCAC5E,OAAO,IAAI,CAAC;6BACf;4BAED,MAAM;wBACV,KAAK,sBAAsB,CAAC,SAAS,CAAC,cAAc;4BAChD,IAAI,gBAAgB,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE;gCAC3E,OAAO,IAAI,CAAC;6BACf;4BAED,MAAM;wBACV;4BACI,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,iCAAiC,CAAC,OAAO,CAAC,MAAM,CAC9E,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;qBAClC;iBACJ;gBAED,OAAO,KAAK,CAAC;YAEjB;gBACI,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,iCAAiC,CAAC,OAAO,CAAC,MAAM,CAC9E,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,EACzB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAClC;IACL,CAAC;IAEO,cAAc,CAAC,IAAY,EAAE,KAAa,EAAE,QAAgB;QAChE,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,aAAa,CAAC,MAAM,IAAI,CAAC,EAAE;YAC1F,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,2BAA2B,CAAC,OAAO,CAAC,CAAC;SAC1E;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QAClE,IAAI,MAAM,CAAC;QACX,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE;YACxC,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,GAAG,EAAE;gBAC9B,iCAAiC;gBACjC,MAAM,GAAG,CAAC,CAAC;gBACX,MAAM;aACT;YAED,MAAM,WAAW,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9D,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;YAChE,IAAI,WAAW,KAAK,YAAY,EAAE;gBAC9B,SAAS;gBACT,MAAM,GAAG,CAAC,CAAC;aACd;iBAAM,IAAI,WAAW,GAAG,YAAY,EAAE;gBACnC,WAAW;gBACX,MAAM,GAAG,CAAC,CAAC;gBACX,MAAM;aACT;iBAAM;gBACH,UAAU;gBACV,MAAM,GAAG,CAAC,CAAC,CAAC;gBACZ,MAAM;aACT;SACJ;QAED,QAAQ,QAAQ,EAAE;YACd,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;gBACpC,OAAO,MAAM,GAAG,CAAC,CAAC;YACtB,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;gBACpC,OAAO,MAAM,IAAI,CAAC,CAAC;YACvB,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;gBACpC,OAAO,MAAM,GAAG,CAAC,CAAC;YACtB,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;gBACpC,OAAO,MAAM,IAAI,CAAC,CAAC;YACvB,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;gBACpC,OAAO,MAAM,KAAK,CAAC,CAAC;YACxB,KAAK,sBAAsB,CAAC,SAAS,CAAC,EAAE;gBACpC,OAAO,MAAM,KAAK,CAAC,CAAC;YACxB;gBACI,MAAM,IAAI,KAAK,CACX,IAAI,CAAC,YAAY,CAAC,iCAAiC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;SAC/F;IACL,CAAC;IAEO,eAAe,CAAC,IAAS;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACtC,CAAC","file":"tool-condition-validator.js","sourcesContent":["import { EMPTY, Observable, of } from 'rxjs';\r\nimport { catchError, expand, filter, map, take } from 'rxjs/operators';\r\nimport { AppContext } from '../data/app-context';\r\nimport { Net } from '../data/net';\r\nimport { PowerShell, PowerShellCommand } from '../data/powershell';\r\nimport { LogLevel } from '../diagnostics/log-level';\r\nimport { Logging } from '../diagnostics/logging';\r\nimport { Strings } from '../generated/strings';\r\nimport {\r\n EnvironmentModule,\r\n EnvironmentModuleConditionMap,\r\n EnvironmentModuleConditionStatement,\r\n EnvironmentModuleEntryPoint,\r\n EnvironmentModuleEntryPointWithToolConditionResult,\r\n EnvironmentModuleToolConditionResult,\r\n EnvironmentModuleToolState\r\n} from '../manifest/environment-modules';\r\nimport { Connection } from '../security/connection';\r\nimport { GatewayMode } from '../shared/gateway-inventory/gateway-inventory';\r\nimport { InventoryQueryCaches } from '../shared/inventory-query-caches';\r\nimport { ServerInventory } from '../shared/server-inventory/server-inventory';\r\nimport { ToolInventoryCache } from '../shared/tool-inventory/tool-inventory-cache';\r\n\r\n/**\r\n * The interface object to be used by expand calculation.\r\n */\r\ninterface ToolConditionExpandResult extends EnvironmentModuleToolConditionResult {\r\n ends: boolean;\r\n}\r\n\r\n/**\r\n * The calculation weight ratio base on performance.\r\n */\r\nexport const enum ToolConditionWeight {\r\n /**\r\n * Not using any observable calculation.\r\n */\r\n NonObservable,\r\n\r\n /**\r\n * Using the connection property.\r\n */\r\n Property,\r\n\r\n /**\r\n * Using the gateway inventory data.\r\n */\r\n Gateway,\r\n\r\n /**\r\n * Using the server inventory data.\r\n */\r\n Server,\r\n\r\n /**\r\n * Using a custom PowerShell script.\r\n */\r\n Script\r\n}\r\n\r\n/**\r\n * The condition result with weight information.\r\n */\r\nexport interface ToolConditionResultWithWeight {\r\n /**\r\n * The calculation weight.\r\n */\r\n weight: ToolConditionWeight;\r\n\r\n /**\r\n * The result data.\r\n */\r\n result: Observable<EnvironmentModuleEntryPointWithToolConditionResult> | EnvironmentModuleEntryPointWithToolConditionResult;\r\n}\r\n\r\n/**\r\n * The class handles conditions of tools to be presented on tools' menu.\r\n * @dynamic\r\n */\r\nexport class ToolConditionValidator {\r\n /**\r\n * Support the following condition name.\r\n * It can be a string, number, boolean and version string.\r\n */\r\n private static serverInventoryProperties: { conditionName: string, dataName: string }[] = [\r\n // string\r\n {\r\n conditionName: 'computerManufacturer',\r\n dataName: 'computerManufacturer'\r\n },\r\n\r\n // string\r\n {\r\n conditionName: 'computerModel',\r\n dataName: 'computerModel'\r\n },\r\n\r\n // number\r\n {\r\n conditionName: 'operatingSystemSKU',\r\n dataName: 'operatingSystemSKU'\r\n },\r\n\r\n // version string\r\n {\r\n conditionName: 'operatingSystemVersion',\r\n dataName: 'operatingSystemVersion'\r\n },\r\n\r\n // number\r\n {\r\n conditionName: 'windowsProductType',\r\n dataName: 'productType'\r\n },\r\n\r\n // string\r\n {\r\n conditionName: 'clusterFqdn',\r\n dataName: 'clusterFqdn'\r\n },\r\n\r\n // string\r\n {\r\n conditionName: 'systemLockdownPolicy',\r\n dataName: 'systemLockdownPolicy'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHyperVRoleInstalled',\r\n dataName: 'isHyperVRoleInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHyperVPowershellInstalled',\r\n dataName: 'isHyperVPowershellInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isManagementToolsAvailable',\r\n dataName: 'isManagementToolsAvailable'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isWmfInstalled',\r\n dataName: 'isWmfInstalled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isRemoteAppEnabled',\r\n dataName: 'isRemoteAppEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isDomainController',\r\n dataName: 'isDomainController'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isS2dEnabled',\r\n dataName: 'isS2dEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isBritannicaEnabled',\r\n dataName: 'isBritannicaEnabled'\r\n },\r\n\r\n // boolean\r\n {\r\n conditionName: 'isHciServer',\r\n dataName: 'isHciServer'\r\n }\r\n ];\r\n\r\n /**\r\n * The following operators are supported.\r\n * String comparison uses caseinsesitive pattern.\r\n */\r\n private static operators = {\r\n /**\r\n * Greater than: number, string (caseinsesitive), version\r\n */\r\n gt: 'gt',\r\n\r\n /**\r\n * Greater or equal: number, string (caseinsesitive), version\r\n */\r\n ge: 'ge',\r\n\r\n /**\r\n * Less than: number, string (caseinsesitive), version\r\n */\r\n lt: 'lt',\r\n\r\n /**\r\n * Less or equal: number, string (caseinsesitive), version\r\n */\r\n le: 'le',\r\n\r\n /**\r\n * Equal: number, string (caseinsesitive), version (Accept '*' like \"1.2.*\")\r\n */\r\n eq: 'eq',\r\n\r\n /**\r\n * Not equal: number, string (caseinsesitive), version (Accept '*' like \"1.2.*\")\r\n */\r\n ne: 'ne',\r\n\r\n /**\r\n * Test true: number, string, boolean\r\n */\r\n is: 'is',\r\n\r\n /**\r\n * Test false: number, string, boolean\r\n */\r\n not: 'not',\r\n\r\n /**\r\n * Contains a string: string (caseinsesitive)\r\n */\r\n contains: 'contains',\r\n\r\n /**\r\n * Not contains a string: string (caseinsesitive)\r\n */\r\n notContains: 'notContains',\r\n\r\n /**\r\n * Any one of value (number or string) equal: numberArray, stringArray\r\n */\r\n anyEq: 'anyEq',\r\n\r\n /**\r\n * Any one of value (number or string) not equal: numberArray, stringArray\r\n */\r\n anyNe: 'anyNe',\r\n\r\n /**\r\n * Any one of string contains: stringArray\r\n */\r\n anyContains: 'anyContains',\r\n\r\n /**\r\n * Any one of string not contains: stringArray\r\n */\r\n anyNotContains: 'anyNotContains'\r\n };\r\n\r\n private static internalCurrent: ToolConditionValidator;\r\n\r\n private caches: InventoryQueryCaches;\r\n private toolInventoryCache: ToolInventoryCache;\r\n private errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n\r\n /**\r\n * Gets the current object of the ToolConditionValidator class, and maintains as singleton.\r\n *\r\n * @param appContext the application context.\r\n * @param caches the instance of the inventory query caches to share the resource.\r\n */\r\n public static current(appContext: AppContext, caches: InventoryQueryCaches): ToolConditionValidator {\r\n if (!ToolConditionValidator.internalCurrent) {\r\n ToolConditionValidator.internalCurrent = new ToolConditionValidator(appContext, caches);\r\n }\r\n\r\n return ToolConditionValidator.internalCurrent;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the ToolConditionValidator class.\r\n *\r\n * @param appContext the application context.\r\n * @param caches the instance of the inventory query caches to share the resource.\r\n */\r\n constructor(private appContext: AppContext, caches: InventoryQueryCaches) {\r\n const statusExpiration = 4 * 60 * 1000; // 4 min\r\n this.caches = caches;\r\n this.toolInventoryCache = new ToolInventoryCache(appContext, { expiration: statusExpiration });\r\n }\r\n\r\n /**\r\n * Scan the tool condition to be present or not.\r\n *\r\n * @param connection the connection object.\r\n * @param solution The entry point object of solution.\r\n * @param tool The entry point object of tool.\r\n * @param scanMode The mode of scanning.\r\n * @return the result observable.\r\n */\r\n public scanToolCondition(\r\n connection: Connection,\r\n solution: EnvironmentModuleEntryPoint,\r\n tool: EnvironmentModuleEntryPoint): ToolConditionResultWithWeight {\r\n\r\n if (!tool.requirements) {\r\n // tool is missing requirements, never show.\r\n return {\r\n weight: ToolConditionWeight.NonObservable,\r\n result: {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported\r\n }\r\n }\r\n };\r\n }\r\n\r\n const solutionId = EnvironmentModule.createFormattedEntrypoint(solution);\r\n const toolId = EnvironmentModule.createFormattedEntrypoint(tool);\r\n const checkersCollection = [];\r\n let weight = ToolConditionWeight.NonObservable;\r\n for (const requirement of tool.requirements) {\r\n const checkers: Observable<EnvironmentModuleToolConditionResult>[] = [];\r\n\r\n // tool must specify the solutions it can show in\r\n if (!requirement.solutionIds || requirement.solutionIds.every(id => id !== solutionId)) {\r\n continue;\r\n }\r\n\r\n // if ths solution is a connections type, then the tool must specify the connection type\r\n if (solution.rootNavigationBehavior === 'connections'\r\n && (!requirement.connectionTypes || requirement.connectionTypes.every(type => type !== connection.type))) {\r\n continue;\r\n }\r\n\r\n // if there are no conditions to check, then this tool has been satisfied.\r\n if (!requirement.conditions || requirement.conditions.length === 0) {\r\n checkers.push(this.installationTypeValidate(connection));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n } else {\r\n for (const condition of requirement.conditions) {\r\n\r\n checkers.push(this.installationTypeValidate(connection, condition.installationTypes));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n\r\n if (condition.localhost !== undefined && !condition.localhost) {\r\n // if connection is localhost and not supported.\r\n checkers.push(this.localhostValidate(connection));\r\n weight = Math.max(weight, ToolConditionWeight.Gateway);\r\n }\r\n\r\n if (condition.inventory) {\r\n checkers.push(this.inventoryValidate(connection, condition.inventory));\r\n weight = Math.max(weight, ToolConditionWeight.Server);\r\n }\r\n\r\n if (condition.properties) {\r\n checkers.push(this.propertyValidate(connection, condition.properties));\r\n weight = Math.max(weight, ToolConditionWeight.Property);\r\n }\r\n\r\n if (condition.powerShell) {\r\n // powerShell { command, script }\r\n checkers.push(this.toolInventoryValidate(connection, toolId, condition.powerShell));\r\n weight = Math.max(weight, ToolConditionWeight.Script);\r\n } else if (condition.script) {\r\n // deprecated\r\n checkers.push(this.toolInventoryValidate(connection, toolId, condition.script));\r\n weight = Math.max(weight, ToolConditionWeight.Script);\r\n }\r\n }\r\n }\r\n\r\n checkersCollection.push(checkers);\r\n }\r\n\r\n if (checkersCollection.length === 0) {\r\n return {\r\n weight: ToolConditionWeight.NonObservable,\r\n result: {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported,\r\n connectionId: connection ? connection.id : null\r\n }\r\n }\r\n };\r\n }\r\n\r\n let collectionIndex = 0;\r\n let checkerIndex = 0;\r\n let lastDetail: EnvironmentModuleToolState = null;\r\n let lastMessage: string = null;\r\n return {\r\n weight: weight,\r\n result: this.runChecker(checkersCollection[collectionIndex][checkerIndex])\r\n .pipe(catchError(() => {\r\n Logging.log({\r\n level: LogLevel.Error,\r\n message: this.errorStrings.ToolValidationResult.message.format(\r\n tool.parentModule.name,\r\n tool.displayName),\r\n source: 'ToolConditionValidator'\r\n });\r\n return of(<ToolConditionExpandResult>{\r\n show: false,\r\n ends: true\r\n });\r\n }),\r\n expand((value) => {\r\n checkerIndex++;\r\n if (value.ends) {\r\n return EMPTY;\r\n }\r\n\r\n if (value.detail !== undefined && lastDetail == null) {\r\n lastDetail = value.detail;\r\n }\r\n\r\n if (value.message !== undefined && lastMessage == null) {\r\n lastMessage = value.message;\r\n }\r\n\r\n if (!value.show) {\r\n // failed result. increment collection index and reset checkerIndex.\r\n if (checkersCollection.length > ++collectionIndex) {\r\n // still has another condition, try next checker set.\r\n return this.runChecker(checkersCollection[collectionIndex][checkerIndex = 0]);\r\n } else {\r\n // no more condition, end to return 'false'.\r\n return of(<ToolConditionExpandResult>{\r\n show: false,\r\n detail: lastDetail,\r\n message: lastMessage,\r\n ends: true\r\n });\r\n }\r\n }\r\n\r\n if (checkersCollection[collectionIndex].length > checkerIndex) {\r\n // check next checker.\r\n return this.runChecker(checkersCollection[collectionIndex][checkerIndex]);\r\n } else {\r\n // all state/succeeded within the checker set.\r\n return of({\r\n show: true,\r\n detail: lastDetail,\r\n message: lastMessage,\r\n ends: true\r\n });\r\n }\r\n }),\r\n filter(combined => combined.ends),\r\n map(combined => {\r\n return {\r\n ...tool,\r\n ...<EnvironmentModuleToolConditionResult>{\r\n show: combined.show,\r\n detail: combined.detail,\r\n message: combined.message,\r\n connectionId: connection ? connection.id : null\r\n }\r\n };\r\n }))\r\n };\r\n }\r\n\r\n private runChecker(checker: Observable<EnvironmentModuleToolConditionResult>): Observable<ToolConditionExpandResult> {\r\n return checker.pipe(\r\n take(1),\r\n map(result => <ToolConditionExpandResult>{ ...result, ends: false }));\r\n }\r\n\r\n private localhostValidate(\r\n connection: Connection): Observable<EnvironmentModuleToolConditionResult> {\r\n return this.caches.gatewayCache.createObservable({})\r\n .pipe(\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: !(instance.mode !== GatewayMode.Service\r\n && connection.properties\r\n && connection.properties.displayName === 'localhost')\r\n }));\r\n }\r\n\r\n private installationTypeValidate(\r\n connection: Connection, installationType?: String[]): Observable<EnvironmentModuleToolConditionResult> {\r\n if (MsftSme.getValue<boolean>(MsftSme.self().Environment.configuration, 'gateway.disabled')) {\r\n return of({ show: true });\r\n }\r\n\r\n if (!installationType || !Array.isArray(installationType) || installationType.length === 0) {\r\n // Default to standard if property doesnt exist in the manifest.\r\n installationType = ['Standard'];\r\n }\r\n\r\n return this.caches.gatewayCache.createObservable({ params: {} })\r\n .pipe(\r\n catchError((error) => {\r\n const errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n const notification = this.appContext.notification.create(connection.name);\r\n notification.showError(\r\n errorStrings.ToolValidationGatewayInventoryError.title,\r\n errorStrings.ToolValidationGatewayInventoryError.message.format(Net.getErrorMessage(error)));\r\n return of(null);\r\n }),\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: installationType.some(t => instance.installationType === t)\r\n }));\r\n }\r\n\r\n private inventoryValidate(\r\n connection: Connection, condition: EnvironmentModuleConditionMap): Observable<EnvironmentModuleToolConditionResult> {\r\n const nodeName = connection.activeAlias ? connection.activeAlias : connection.name;\r\n return this.caches.serverCache.createObservable({ params: { name: nodeName } })\r\n .pipe(\r\n catchError((error) => {\r\n const errorStrings = MsftSme.getStrings<Strings>().MsftSmeShell.Core.Error;\r\n const notification = this.appContext.notification.create(connection.name);\r\n notification.showError(\r\n errorStrings.ToolValidationInventoryError.title,\r\n errorStrings.ToolValidationInventoryError.message.format(Net.getErrorMessage(error)));\r\n return of(null);\r\n }),\r\n filter((instance: ServerInventory) => instance.serverName === nodeName),\r\n map(instance => <EnvironmentModuleToolConditionResult>{\r\n show: this.checkServerInventoryCondition(condition, instance)\r\n }));\r\n }\r\n\r\n private propertyValidate(\r\n connection: Connection, condition: EnvironmentModuleConditionMap): Observable<EnvironmentModuleToolConditionResult> {\r\n const propertyNames = Object.keys(condition);\r\n let result = true;\r\n for (const propertyName of propertyNames) {\r\n const propertyValue = connection.properties && connection.properties[propertyName];\r\n const conditionItem = condition[propertyName];\r\n if (conditionItem && !this.checkCondition(propertyValue, conditionItem)) {\r\n result = false;\r\n break;\r\n }\r\n }\r\n\r\n return of(<EnvironmentModuleToolConditionResult>{ show: result });\r\n }\r\n\r\n private toolInventoryValidate(\r\n connection: Connection,\r\n id: string,\r\n scriptOrCommand: string | PowerShellCommand): Observable<EnvironmentModuleToolConditionResult> {\r\n const command = PowerShell.getPowerShellCommand(scriptOrCommand);\r\n return this.toolInventoryCache.query(\r\n { ...{ name: connection.activeAlias ? connection.activeAlias : connection.name, id: id }, ...command })\r\n .pipe(\r\n map(inventory => <EnvironmentModuleToolConditionResult>{\r\n show: inventory.instance.state === EnvironmentModuleToolState.Available\r\n || inventory.instance.state === EnvironmentModuleToolState.NotConfigured,\r\n detail: inventory.instance.state,\r\n message: inventory.instance.message\r\n }),\r\n catchError((error) => {\r\n const message = Net.getErrorMessage(error);\r\n Logging.logError('ToolConditionValidator', `${id}: ${message}`);\r\n return of(<EnvironmentModuleToolConditionResult>{\r\n show: false,\r\n detail: EnvironmentModuleToolState.NotSupported,\r\n message\r\n });\r\n })\r\n );\r\n }\r\n\r\n private checkServerInventoryCondition(condition: EnvironmentModuleConditionMap, instance: ServerInventory): boolean {\r\n for (const property of ToolConditionValidator.serverInventoryProperties) {\r\n const conditionItem = condition[property.conditionName];\r\n if (conditionItem && !this.checkCondition(instance[property.dataName], conditionItem)) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n private checkCondition(data: any, condition: EnvironmentModuleConditionStatement): boolean {\r\n switch (condition.type) {\r\n case 'number':\r\n const numberValue: number = this.getNumberOrZero(data);\r\n const numberTest: number = this.getNumberOrZero(condition.value);\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return numberValue > numberTest;\r\n case ToolConditionValidator.operators.ge:\r\n return numberValue >= numberTest;\r\n case ToolConditionValidator.operators.lt:\r\n return numberValue < numberTest;\r\n case ToolConditionValidator.operators.le:\r\n return numberValue <= numberTest;\r\n case ToolConditionValidator.operators.eq:\r\n return numberValue === numberTest;\r\n case ToolConditionValidator.operators.ne:\r\n return numberValue !== numberTest;\r\n case ToolConditionValidator.operators.is:\r\n return !!numberValue;\r\n case ToolConditionValidator.operators.not:\r\n return !numberValue;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'string':\r\n const stringValue: string = '' + data;\r\n const stringTest: string = '' + condition.value;\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return stringValue.toLowerCase() > stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.ge:\r\n return stringValue.toLowerCase() >= stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.lt:\r\n return stringValue.toLowerCase() < stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.le:\r\n return stringValue.toLowerCase() <= stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.eq:\r\n return stringValue.toLowerCase() === stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.ne:\r\n return stringValue.toLowerCase() !== stringTest.toLowerCase();\r\n case ToolConditionValidator.operators.is:\r\n return !!data;\r\n case ToolConditionValidator.operators.not:\r\n return !data;\r\n case ToolConditionValidator.operators.contains:\r\n return stringValue.toLowerCase().indexOf(stringTest.toLowerCase()) >= 0;\r\n case ToolConditionValidator.operators.notContains:\r\n return stringValue.toLowerCase().indexOf(stringTest.toLowerCase()) < 0;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'boolean':\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.is:\r\n return !!data;\r\n case ToolConditionValidator.operators.not:\r\n return !data;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n case 'version':\r\n const versionValue: string = data;\r\n const versionTest: string = <string>condition.value;\r\n return this.compareVersion(versionValue, versionTest, condition.operator);\r\n\r\n case 'numberArray':\r\n const checkNumber: any = condition.value;\r\n if (!checkNumber\r\n || typeof checkNumber === 'string'\r\n || !checkNumber.length\r\n || typeof checkNumber[0] !== 'number') {\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n const numberArrayValue: number = this.getNumberOrZero(data);\r\n const numberArray: number[] = <number[]>condition.value;\r\n for (const numberItem of numberArray) {\r\n const numberArrayTest = this.getNumberOrZero(numberItem);\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.anyEq:\r\n if (numberArrayValue === numberArrayTest) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNe:\r\n if (numberArrayValue !== numberArrayTest) {\r\n return true;\r\n }\r\n\r\n break;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n return false;\r\n\r\n case 'stringArray':\r\n const checkString: any = condition.value;\r\n if (!checkString\r\n || typeof checkString === 'string'\r\n || !checkString.length\r\n || typeof checkString[0] !== 'string') {\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n\r\n const stringArrayValue: string = '' + data;\r\n const stringArray: string[] = <string[]>condition.value;\r\n for (const stringArrayTest of stringArray) {\r\n switch (condition.operator) {\r\n case ToolConditionValidator.operators.anyEq:\r\n if (stringArrayValue.toLowerCase() === stringArrayTest.toLowerCase()) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNe:\r\n if (stringArrayValue.toLowerCase() !== stringArrayTest.toLowerCase()) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyContains:\r\n if (stringArrayValue.toLowerCase().indexOf(stringArrayTest.toLowerCase()) >= 0) {\r\n return true;\r\n }\r\n\r\n break;\r\n case ToolConditionValidator.operators.anyNotContains:\r\n if (stringArrayValue.toLowerCase().indexOf(stringArrayTest.toLowerCase()) < 0) {\r\n return true;\r\n }\r\n\r\n break;\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedOperator.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n return false;\r\n\r\n default:\r\n throw new Error(this.errorStrings.ToolValidationUnsupportedDataType.message.format(\r\n JSON.stringify(condition),\r\n JSON.stringify(data)));\r\n }\r\n }\r\n\r\n private compareVersion(left: string, right: string, operator: string): boolean {\r\n const leftSegments = left.split('.');\r\n const rightSegments = right.split('.');\r\n if (!leftSegments || leftSegments.length <= 0 || !rightSegments || rightSegments.length <= 0) {\r\n throw new Error(this.errorStrings.ToolValidationVersionFormat.message);\r\n }\r\n\r\n const count = Math.max(leftSegments.length, rightSegments.length);\r\n let status;\r\n for (let index = 0; index < count; index++) {\r\n if (rightSegments[index] === '*') {\r\n // quit comparison with wildcard.\r\n status = 0;\r\n break;\r\n }\r\n\r\n const leftSegment = this.getNumberOrZero(leftSegments[index]);\r\n const rightSegment = this.getNumberOrZero(rightSegments[index]);\r\n if (leftSegment === rightSegment) {\r\n // equal.\r\n status = 0;\r\n } else if (leftSegment > rightSegment) {\r\n // greater.\r\n status = 1;\r\n break;\r\n } else {\r\n // lesser.\r\n status = -1;\r\n break;\r\n }\r\n }\r\n\r\n switch (operator) {\r\n case ToolConditionValidator.operators.gt:\r\n return status > 0;\r\n case ToolConditionValidator.operators.ge:\r\n return status >= 0;\r\n case ToolConditionValidator.operators.lt:\r\n return status < 0;\r\n case ToolConditionValidator.operators.le:\r\n return status <= 0;\r\n case ToolConditionValidator.operators.eq:\r\n return status === 0;\r\n case ToolConditionValidator.operators.ne:\r\n return status !== 0;\r\n default:\r\n throw new Error(\r\n this.errorStrings.ToolValidationUnsupportedOperator.message.format(operator, left));\r\n }\r\n }\r\n\r\n private getNumberOrZero(data: any): number {\r\n const result = Number(data);\r\n return isNaN(result) ? 0 : result;\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/shared/server-inventory/server-inventory-cache.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEjG;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,WAAW,CAAC,eAAe,EAAE,mBAAmB,EAAE,qBAAqB,CAAC;IA2ElG,OAAO,CAAC,UAAU;IA1E9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqC;IAC5D,OAAO,CAAC,MAAM,CAAC,aAAa,CAAM;IAElC;;;;;OAKG;WACW,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,eAAe;IA2DjF;;;;;OAKG;gBACiB,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,kBAAkB;IAWxE;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAMjB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAItB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAKvB;;;;OAIG;IACH,OAAO,CAAC,aAAa;CAIxB","file":"server-inventory-cache.d.ts","sourcesContent":["import { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { AppContext } from '../../data/app-context';\r\nimport { PowerShell } from '../../data/powershell';\r\nimport { PowerShellScripts } from '../../generated/powershell-scripts';\r\nimport { SharedCache, SharedCacheOptions } from '../shared-cache';\r\nimport { ServerInventory, ServerInventoryData, ServerInventoryParams } from './server-inventory';\r\n\r\n/**\r\n * Server Inventory cache class.\r\n */\r\nexport class ServerInventoryCache extends SharedCache<ServerInventory, ServerInventoryData, ServerInventoryParams> {\r\n private static uniqueId = '@msft-sme/shell:serverInventory';\r\n private static uniqueVersion = 17;\r\n\r\n /**\r\n * Create Server Inventory data from the script result data.\r\n *\r\n * @param name the name of server node.\r\n * @param data the PowerShell script result data.\r\n */\r\n public static createServerInventoryData(name: string, data: any): ServerInventory {\r\n const inventory = new ServerInventory(name);\r\n\r\n if (data && data.results && data.results.length > 0) {\r\n const result = data.results[0];\r\n const operatingSystem = result.operatingSystem;\r\n const computerSystem = result.computerSystem;\r\n\r\n inventory.isAdministrator = result.isAdministrator;\r\n inventory.isWmfInstalled = result.isWmfInstalled;\r\n inventory.name = operatingSystem.csName ? operatingSystem.csName.toString().toLowerCase() : null;\r\n inventory.operatingSystemName = operatingSystem.caption;\r\n inventory.operatingSystemSKU = operatingSystem.operatingSystemSKU;\r\n inventory.operatingSystemVersion = operatingSystem.version;\r\n inventory.productType = operatingSystem.productType;\r\n inventory.osType = operatingSystem.osType;\r\n inventory.lastBootUpTime = operatingSystem.lastBootUpTime;\r\n inventory.osSerialNumber = operatingSystem.serialNumber;\r\n inventory.buildNumber = operatingSystem.currentBuild;\r\n inventory.updateBuildRevision = operatingSystem.updateBuildRevision;\r\n inventory.operatingSystemDisplayVersion = operatingSystem.displayVersion;\r\n\r\n inventory.totalPhysicalMemory = computerSystem.totalPhysicalMemory;\r\n inventory.domainRole = computerSystem.domainRole;\r\n inventory.computerManufacturer = computerSystem.manufacturer;\r\n inventory.computerModel = computerSystem.model;\r\n inventory.totalLogicalProcessors = computerSystem.numberOfLogicalProcessors;\r\n inventory.isRemoteAppEnabled = result.isRemoteAppEnabled;\r\n\r\n if (computerSystem.partOfDomain) {\r\n inventory.domainName = computerSystem.domain;\r\n } else {\r\n inventory.workgroupName = computerSystem.workgroup;\r\n }\r\n\r\n inventory.fullyQualifiedDomainName = result.fqdn.toLowerCase();\r\n inventory.fullyQualifiedDomainNameRaw = result.fqdn;\r\n inventory.addressList = result.addressList;\r\n inventory.hostname = result.hostname.toLowerCase();\r\n inventory.hostnameRaw = result.hostname;\r\n inventory.netBios = result.netBios;\r\n inventory.clusterFqdn = result.clusterFqdn ? result.clusterFqdn.toLowerCase() : null;\r\n inventory.isCluster = result.isCluster;\r\n inventory.isManagementToolsAvailable = result.isManagementToolsAvailable;\r\n inventory.isServerManagerAvailable = result.isServerManagerAvailable;\r\n inventory.isS2dEnabled = result.isS2dEnabled;\r\n inventory.isBritannicaEnabled = result.isBritannicaEnabled;\r\n inventory.isHyperVRoleInstalled = result.isHyperVRoleInstalled;\r\n inventory.isHyperVPowershellInstalled = result.isHyperVPowershellInstalled;\r\n inventory.isCredSSPEnabled = result.isCredSSPEnabled;\r\n inventory.smbiosData = result.smbiosData;\r\n inventory.azureArcStatus = result.azureArcStatus;\r\n inventory.
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/shared/server-inventory/server-inventory-cache.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEjG;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,WAAW,CAAC,eAAe,EAAE,mBAAmB,EAAE,qBAAqB,CAAC;IA2ElG,OAAO,CAAC,UAAU;IA1E9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAqC;IAC5D,OAAO,CAAC,MAAM,CAAC,aAAa,CAAM;IAElC;;;;;OAKG;WACW,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,eAAe;IA2DjF;;;;;OAKG;gBACiB,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,kBAAkB;IAWxE;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAMjB;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IAItB;;;;OAIG;IACH,OAAO,CAAC,eAAe;IAKvB;;;;OAIG;IACH,OAAO,CAAC,aAAa;CAIxB","file":"server-inventory-cache.d.ts","sourcesContent":["import { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { AppContext } from '../../data/app-context';\r\nimport { PowerShell } from '../../data/powershell';\r\nimport { PowerShellScripts } from '../../generated/powershell-scripts';\r\nimport { SharedCache, SharedCacheOptions } from '../shared-cache';\r\nimport { ServerInventory, ServerInventoryData, ServerInventoryParams } from './server-inventory';\r\n\r\n/**\r\n * Server Inventory cache class.\r\n */\r\nexport class ServerInventoryCache extends SharedCache<ServerInventory, ServerInventoryData, ServerInventoryParams> {\r\n private static uniqueId = '@msft-sme/shell:serverInventory';\r\n private static uniqueVersion = 17;\r\n\r\n /**\r\n * Create Server Inventory data from the script result data.\r\n *\r\n * @param name the name of server node.\r\n * @param data the PowerShell script result data.\r\n */\r\n public static createServerInventoryData(name: string, data: any): ServerInventory {\r\n const inventory = new ServerInventory(name);\r\n\r\n if (data && data.results && data.results.length > 0) {\r\n const result = data.results[0];\r\n const operatingSystem = result.operatingSystem;\r\n const computerSystem = result.computerSystem;\r\n\r\n inventory.isAdministrator = result.isAdministrator;\r\n inventory.isWmfInstalled = result.isWmfInstalled;\r\n inventory.name = operatingSystem.csName ? operatingSystem.csName.toString().toLowerCase() : null;\r\n inventory.operatingSystemName = operatingSystem.caption;\r\n inventory.operatingSystemSKU = operatingSystem.operatingSystemSKU;\r\n inventory.operatingSystemVersion = operatingSystem.version;\r\n inventory.productType = operatingSystem.productType;\r\n inventory.osType = operatingSystem.osType;\r\n inventory.lastBootUpTime = operatingSystem.lastBootUpTime;\r\n inventory.osSerialNumber = operatingSystem.serialNumber;\r\n inventory.buildNumber = operatingSystem.currentBuild;\r\n inventory.updateBuildRevision = operatingSystem.updateBuildRevision;\r\n inventory.operatingSystemDisplayVersion = operatingSystem.displayVersion;\r\n\r\n inventory.totalPhysicalMemory = computerSystem.totalPhysicalMemory;\r\n inventory.domainRole = computerSystem.domainRole;\r\n inventory.computerManufacturer = computerSystem.manufacturer;\r\n inventory.computerModel = computerSystem.model;\r\n inventory.totalLogicalProcessors = computerSystem.numberOfLogicalProcessors;\r\n inventory.isRemoteAppEnabled = result.isRemoteAppEnabled;\r\n\r\n if (computerSystem.partOfDomain) {\r\n inventory.domainName = computerSystem.domain;\r\n } else {\r\n inventory.workgroupName = computerSystem.workgroup;\r\n }\r\n\r\n inventory.fullyQualifiedDomainName = result.fqdn.toLowerCase();\r\n inventory.fullyQualifiedDomainNameRaw = result.fqdn;\r\n inventory.addressList = result.addressList;\r\n inventory.hostname = result.hostname.toLowerCase();\r\n inventory.hostnameRaw = result.hostname;\r\n inventory.netBios = result.netBios;\r\n inventory.clusterFqdn = result.clusterFqdn ? result.clusterFqdn.toLowerCase() : null;\r\n inventory.isCluster = result.isCluster;\r\n inventory.isManagementToolsAvailable = result.isManagementToolsAvailable;\r\n inventory.isServerManagerAvailable = result.isServerManagerAvailable;\r\n inventory.isS2dEnabled = result.isS2dEnabled;\r\n inventory.isBritannicaEnabled = result.isBritannicaEnabled;\r\n inventory.isHyperVRoleInstalled = result.isHyperVRoleInstalled;\r\n inventory.isHyperVPowershellInstalled = result.isHyperVPowershellInstalled;\r\n inventory.isCredSSPEnabled = result.isCredSSPEnabled;\r\n inventory.smbiosData = result.smbiosData;\r\n inventory.azureArcStatus = result.azureArcStatus;\r\n inventory.systemLockdownPolicy = result.systemLockdownPolicy;\r\n inventory.isHciServer = result.isHciServer;\r\n }\r\n\r\n return inventory;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the ServerInventoryCache class.\r\n *\r\n * @param appContext the app context.\r\n * @param options the option of shared cache.\r\n */\r\n constructor(private appContext: AppContext, options?: SharedCacheOptions) {\r\n super(\r\n ServerInventoryCache.uniqueId,\r\n ServerInventoryCache.uniqueVersion,\r\n (params) => this.dataInstanceId(params),\r\n (instance) => this.dataSerialize(instance),\r\n (serialized) => this.dataDeserialize(serialized),\r\n (params) => this.dataQuery(params),\r\n options);\r\n }\r\n\r\n /**\r\n * Defines how to collect the server inventory data.\r\n *\r\n * @param params the server inventory query params.\r\n * @return the Observable of ServerInventory data.\r\n */\r\n private dataQuery(params: ServerInventoryParams): Observable<ServerInventory> {\r\n const psSession = this.appContext.powerShell.createSession(params.name, null, { ...{ automatic: true }, ...params.requestOptions });\r\n return this.appContext.powerShell.run(psSession, PowerShell.createCommand(PowerShellScripts.Get_ServerInventory))\r\n .pipe(map((data: any) => ServerInventoryCache.createServerInventoryData(params.name, data)));\r\n }\r\n\r\n /**\r\n * Defines how to identify the cache entry by params.\r\n *\r\n * @param params the server inventory query params.\r\n * @return the id string.\r\n */\r\n private dataInstanceId(params: ServerInventoryParams): string {\r\n return params.name;\r\n }\r\n\r\n /**\r\n * Defines how to deserialize the class object from serialized data.\r\n *\r\n * @param serialized the serialized string;\r\n */\r\n private dataDeserialize(serialized: string): ServerInventory {\r\n const inventory: ServerInventoryData = JSON.parse(serialized);\r\n return new ServerInventory(inventory.serverName, inventory);\r\n }\r\n\r\n /**\r\n * Defines how to serialize the class object to serialized data.\r\n *\r\n * @param instance the class instance.\r\n */\r\n private dataSerialize(instance: ServerInventory): string {\r\n // automatically stripped out class related data.\r\n return JSON.stringify(instance);\r\n }\r\n}\r\n"]}
|
|
@@ -64,7 +64,7 @@ export class ServerInventoryCache extends SharedCache {
|
|
|
64
64
|
inventory.isCredSSPEnabled = result.isCredSSPEnabled;
|
|
65
65
|
inventory.smbiosData = result.smbiosData;
|
|
66
66
|
inventory.azureArcStatus = result.azureArcStatus;
|
|
67
|
-
inventory.
|
|
67
|
+
inventory.systemLockdownPolicy = result.systemLockdownPolicy;
|
|
68
68
|
inventory.isHciServer = result.isHciServer;
|
|
69
69
|
}
|
|
70
70
|
return inventory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../packages/core/shared/server-inventory/server-inventory-cache.ts"],"names":[],"mappings":"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","file":"server-inventory-cache.js","sourcesContent":["import { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { AppContext } from '../../data/app-context';\r\nimport { PowerShell } from '../../data/powershell';\r\nimport { PowerShellScripts } from '../../generated/powershell-scripts';\r\nimport { SharedCache, SharedCacheOptions } from '../shared-cache';\r\nimport { ServerInventory, ServerInventoryData, ServerInventoryParams } from './server-inventory';\r\n\r\n/**\r\n * Server Inventory cache class.\r\n */\r\nexport class ServerInventoryCache extends SharedCache<ServerInventory, ServerInventoryData, ServerInventoryParams> {\r\n private static uniqueId = '@msft-sme/shell:serverInventory';\r\n private static uniqueVersion = 17;\r\n\r\n /**\r\n * Create Server Inventory data from the script result data.\r\n *\r\n * @param name the name of server node.\r\n * @param data the PowerShell script result data.\r\n */\r\n public static createServerInventoryData(name: string, data: any): ServerInventory {\r\n const inventory = new ServerInventory(name);\r\n\r\n if (data && data.results && data.results.length > 0) {\r\n const result = data.results[0];\r\n const operatingSystem = result.operatingSystem;\r\n const computerSystem = result.computerSystem;\r\n\r\n inventory.isAdministrator = result.isAdministrator;\r\n inventory.isWmfInstalled = result.isWmfInstalled;\r\n inventory.name = operatingSystem.csName ? operatingSystem.csName.toString().toLowerCase() : null;\r\n inventory.operatingSystemName = operatingSystem.caption;\r\n inventory.operatingSystemSKU = operatingSystem.operatingSystemSKU;\r\n inventory.operatingSystemVersion = operatingSystem.version;\r\n inventory.productType = operatingSystem.productType;\r\n inventory.osType = operatingSystem.osType;\r\n inventory.lastBootUpTime = operatingSystem.lastBootUpTime;\r\n inventory.osSerialNumber = operatingSystem.serialNumber;\r\n inventory.buildNumber = operatingSystem.currentBuild;\r\n inventory.updateBuildRevision = operatingSystem.updateBuildRevision;\r\n inventory.operatingSystemDisplayVersion = operatingSystem.displayVersion;\r\n\r\n inventory.totalPhysicalMemory = computerSystem.totalPhysicalMemory;\r\n inventory.domainRole = computerSystem.domainRole;\r\n inventory.computerManufacturer = computerSystem.manufacturer;\r\n inventory.computerModel = computerSystem.model;\r\n inventory.totalLogicalProcessors = computerSystem.numberOfLogicalProcessors;\r\n inventory.isRemoteAppEnabled = result.isRemoteAppEnabled;\r\n\r\n if (computerSystem.partOfDomain) {\r\n inventory.domainName = computerSystem.domain;\r\n } else {\r\n inventory.workgroupName = computerSystem.workgroup;\r\n }\r\n\r\n inventory.fullyQualifiedDomainName = result.fqdn.toLowerCase();\r\n inventory.fullyQualifiedDomainNameRaw = result.fqdn;\r\n inventory.addressList = result.addressList;\r\n inventory.hostname = result.hostname.toLowerCase();\r\n inventory.hostnameRaw = result.hostname;\r\n inventory.netBios = result.netBios;\r\n inventory.clusterFqdn = result.clusterFqdn ? result.clusterFqdn.toLowerCase() : null;\r\n inventory.isCluster = result.isCluster;\r\n inventory.isManagementToolsAvailable = result.isManagementToolsAvailable;\r\n inventory.isServerManagerAvailable = result.isServerManagerAvailable;\r\n inventory.isS2dEnabled = result.isS2dEnabled;\r\n inventory.isBritannicaEnabled = result.isBritannicaEnabled;\r\n inventory.isHyperVRoleInstalled = result.isHyperVRoleInstalled;\r\n inventory.isHyperVPowershellInstalled = result.isHyperVPowershellInstalled;\r\n inventory.isCredSSPEnabled = result.isCredSSPEnabled;\r\n inventory.smbiosData = result.smbiosData;\r\n inventory.azureArcStatus = result.azureArcStatus;\r\n inventory.isSystemLockdownPolicyEnforced = result.isSystemLockdownPolicyEnforced;\r\n inventory.isHciServer = result.isHciServer;\r\n }\r\n\r\n return inventory;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the ServerInventoryCache class.\r\n *\r\n * @param appContext the app context.\r\n * @param options the option of shared cache.\r\n */\r\n constructor(private appContext: AppContext, options?: SharedCacheOptions) {\r\n super(\r\n ServerInventoryCache.uniqueId,\r\n ServerInventoryCache.uniqueVersion,\r\n (params) => this.dataInstanceId(params),\r\n (instance) => this.dataSerialize(instance),\r\n (serialized) => this.dataDeserialize(serialized),\r\n (params) => this.dataQuery(params),\r\n options);\r\n }\r\n\r\n /**\r\n * Defines how to collect the server inventory data.\r\n *\r\n * @param params the server inventory query params.\r\n * @return the Observable of ServerInventory data.\r\n */\r\n private dataQuery(params: ServerInventoryParams): Observable<ServerInventory> {\r\n const psSession = this.appContext.powerShell.createSession(params.name, null, { ...{ automatic: true }, ...params.requestOptions });\r\n return this.appContext.powerShell.run(psSession, PowerShell.createCommand(PowerShellScripts.Get_ServerInventory))\r\n .pipe(map((data: any) => ServerInventoryCache.createServerInventoryData(params.name, data)));\r\n }\r\n\r\n /**\r\n * Defines how to identify the cache entry by params.\r\n *\r\n * @param params the server inventory query params.\r\n * @return the id string.\r\n */\r\n private dataInstanceId(params: ServerInventoryParams): string {\r\n return params.name;\r\n }\r\n\r\n /**\r\n * Defines how to deserialize the class object from serialized data.\r\n *\r\n * @param serialized the serialized string;\r\n */\r\n private dataDeserialize(serialized: string): ServerInventory {\r\n const inventory: ServerInventoryData = JSON.parse(serialized);\r\n return new ServerInventory(inventory.serverName, inventory);\r\n }\r\n\r\n /**\r\n * Defines how to serialize the class object to serialized data.\r\n *\r\n * @param instance the class instance.\r\n */\r\n private dataSerialize(instance: ServerInventory): string {\r\n // automatically stripped out class related data.\r\n return JSON.stringify(instance);\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../packages/core/shared/server-inventory/server-inventory-cache.ts"],"names":[],"mappings":"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","file":"server-inventory-cache.js","sourcesContent":["import { Observable } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\nimport { AppContext } from '../../data/app-context';\r\nimport { PowerShell } from '../../data/powershell';\r\nimport { PowerShellScripts } from '../../generated/powershell-scripts';\r\nimport { SharedCache, SharedCacheOptions } from '../shared-cache';\r\nimport { ServerInventory, ServerInventoryData, ServerInventoryParams } from './server-inventory';\r\n\r\n/**\r\n * Server Inventory cache class.\r\n */\r\nexport class ServerInventoryCache extends SharedCache<ServerInventory, ServerInventoryData, ServerInventoryParams> {\r\n private static uniqueId = '@msft-sme/shell:serverInventory';\r\n private static uniqueVersion = 17;\r\n\r\n /**\r\n * Create Server Inventory data from the script result data.\r\n *\r\n * @param name the name of server node.\r\n * @param data the PowerShell script result data.\r\n */\r\n public static createServerInventoryData(name: string, data: any): ServerInventory {\r\n const inventory = new ServerInventory(name);\r\n\r\n if (data && data.results && data.results.length > 0) {\r\n const result = data.results[0];\r\n const operatingSystem = result.operatingSystem;\r\n const computerSystem = result.computerSystem;\r\n\r\n inventory.isAdministrator = result.isAdministrator;\r\n inventory.isWmfInstalled = result.isWmfInstalled;\r\n inventory.name = operatingSystem.csName ? operatingSystem.csName.toString().toLowerCase() : null;\r\n inventory.operatingSystemName = operatingSystem.caption;\r\n inventory.operatingSystemSKU = operatingSystem.operatingSystemSKU;\r\n inventory.operatingSystemVersion = operatingSystem.version;\r\n inventory.productType = operatingSystem.productType;\r\n inventory.osType = operatingSystem.osType;\r\n inventory.lastBootUpTime = operatingSystem.lastBootUpTime;\r\n inventory.osSerialNumber = operatingSystem.serialNumber;\r\n inventory.buildNumber = operatingSystem.currentBuild;\r\n inventory.updateBuildRevision = operatingSystem.updateBuildRevision;\r\n inventory.operatingSystemDisplayVersion = operatingSystem.displayVersion;\r\n\r\n inventory.totalPhysicalMemory = computerSystem.totalPhysicalMemory;\r\n inventory.domainRole = computerSystem.domainRole;\r\n inventory.computerManufacturer = computerSystem.manufacturer;\r\n inventory.computerModel = computerSystem.model;\r\n inventory.totalLogicalProcessors = computerSystem.numberOfLogicalProcessors;\r\n inventory.isRemoteAppEnabled = result.isRemoteAppEnabled;\r\n\r\n if (computerSystem.partOfDomain) {\r\n inventory.domainName = computerSystem.domain;\r\n } else {\r\n inventory.workgroupName = computerSystem.workgroup;\r\n }\r\n\r\n inventory.fullyQualifiedDomainName = result.fqdn.toLowerCase();\r\n inventory.fullyQualifiedDomainNameRaw = result.fqdn;\r\n inventory.addressList = result.addressList;\r\n inventory.hostname = result.hostname.toLowerCase();\r\n inventory.hostnameRaw = result.hostname;\r\n inventory.netBios = result.netBios;\r\n inventory.clusterFqdn = result.clusterFqdn ? result.clusterFqdn.toLowerCase() : null;\r\n inventory.isCluster = result.isCluster;\r\n inventory.isManagementToolsAvailable = result.isManagementToolsAvailable;\r\n inventory.isServerManagerAvailable = result.isServerManagerAvailable;\r\n inventory.isS2dEnabled = result.isS2dEnabled;\r\n inventory.isBritannicaEnabled = result.isBritannicaEnabled;\r\n inventory.isHyperVRoleInstalled = result.isHyperVRoleInstalled;\r\n inventory.isHyperVPowershellInstalled = result.isHyperVPowershellInstalled;\r\n inventory.isCredSSPEnabled = result.isCredSSPEnabled;\r\n inventory.smbiosData = result.smbiosData;\r\n inventory.azureArcStatus = result.azureArcStatus;\r\n inventory.systemLockdownPolicy = result.systemLockdownPolicy;\r\n inventory.isHciServer = result.isHciServer;\r\n }\r\n\r\n return inventory;\r\n }\r\n\r\n /**\r\n * Initializes a new instance of the ServerInventoryCache class.\r\n *\r\n * @param appContext the app context.\r\n * @param options the option of shared cache.\r\n */\r\n constructor(private appContext: AppContext, options?: SharedCacheOptions) {\r\n super(\r\n ServerInventoryCache.uniqueId,\r\n ServerInventoryCache.uniqueVersion,\r\n (params) => this.dataInstanceId(params),\r\n (instance) => this.dataSerialize(instance),\r\n (serialized) => this.dataDeserialize(serialized),\r\n (params) => this.dataQuery(params),\r\n options);\r\n }\r\n\r\n /**\r\n * Defines how to collect the server inventory data.\r\n *\r\n * @param params the server inventory query params.\r\n * @return the Observable of ServerInventory data.\r\n */\r\n private dataQuery(params: ServerInventoryParams): Observable<ServerInventory> {\r\n const psSession = this.appContext.powerShell.createSession(params.name, null, { ...{ automatic: true }, ...params.requestOptions });\r\n return this.appContext.powerShell.run(psSession, PowerShell.createCommand(PowerShellScripts.Get_ServerInventory))\r\n .pipe(map((data: any) => ServerInventoryCache.createServerInventoryData(params.name, data)));\r\n }\r\n\r\n /**\r\n * Defines how to identify the cache entry by params.\r\n *\r\n * @param params the server inventory query params.\r\n * @return the id string.\r\n */\r\n private dataInstanceId(params: ServerInventoryParams): string {\r\n return params.name;\r\n }\r\n\r\n /**\r\n * Defines how to deserialize the class object from serialized data.\r\n *\r\n * @param serialized the serialized string;\r\n */\r\n private dataDeserialize(serialized: string): ServerInventory {\r\n const inventory: ServerInventoryData = JSON.parse(serialized);\r\n return new ServerInventory(inventory.serverName, inventory);\r\n }\r\n\r\n /**\r\n * Defines how to serialize the class object to serialized data.\r\n *\r\n * @param instance the class instance.\r\n */\r\n private dataSerialize(instance: ServerInventory): string {\r\n // automatically stripped out class related data.\r\n return JSON.stringify(instance);\r\n }\r\n}\r\n"]}
|
|
@@ -224,9 +224,9 @@ export interface ServerInventoryData {
|
|
|
224
224
|
*/
|
|
225
225
|
smbiosData: SmbiosData;
|
|
226
226
|
/**
|
|
227
|
-
*
|
|
227
|
+
* The system lockdown policy enforcement mode.
|
|
228
228
|
*/
|
|
229
|
-
|
|
229
|
+
systemLockdownPolicy: string;
|
|
230
230
|
/**
|
|
231
231
|
* Type of operating system value
|
|
232
232
|
*/
|
|
@@ -394,9 +394,9 @@ export declare class ServerInventory implements ServerInventoryData {
|
|
|
394
394
|
*/
|
|
395
395
|
smbiosData: SmbiosData;
|
|
396
396
|
/**
|
|
397
|
-
*
|
|
397
|
+
* The system lockdown policy enforcement mode.
|
|
398
398
|
*/
|
|
399
|
-
|
|
399
|
+
systemLockdownPolicy: string;
|
|
400
400
|
/**
|
|
401
401
|
* Type of operating system value
|
|
402
402
|
*/
|