@pnp/cli-microsoft365 10.5.0-beta.d99742c → 10.6.0-beta.195c8d5
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/.eslintrc.cjs +3 -1
- package/allCommands.json +1 -1
- package/allCommandsFull.json +1 -1
- package/dist/Auth.js +60 -3
- package/dist/Command.js +14 -26
- package/dist/auth/MsalNetworkClient.js +32 -0
- package/dist/config.js +2 -0
- package/dist/m365/adaptivecard/commands/adaptivecard-send.js +2 -1
- package/dist/m365/app/commands/app-get.js +3 -13
- package/dist/m365/app/commands/permission/permission-list.js +4 -14
- package/dist/m365/base/SpoCommand.js +2 -1
- package/dist/m365/booking/commands/business/business-get.js +0 -3
- package/dist/m365/commands/login.js +3 -0
- package/dist/m365/commands/request.js +3 -12
- package/dist/m365/commands/setup.js +2 -0
- package/dist/m365/entra/commands/administrativeunit/administrativeunit-add.js +10 -5
- package/dist/m365/entra/commands/app/app-add.js +5 -0
- package/dist/m365/entra/commands/app/app-get.js +27 -21
- package/dist/m365/entra/commands/app/app-permission-list.js +28 -22
- package/dist/m365/entra/commands/app/app-remove.js +22 -19
- package/dist/m365/entra/commands/app/app-role-add.js +22 -19
- package/dist/m365/entra/commands/app/app-role-list.js +22 -19
- package/dist/m365/entra/commands/app/app-role-remove.js +39 -36
- package/dist/m365/entra/commands/app/app-set.js +45 -19
- package/dist/m365/entra/commands/group/group-add.js +1 -0
- package/dist/m365/entra/commands/group/group-set.js +12 -6
- package/dist/m365/entra/commands/policy/policy-list.js +46 -3
- package/dist/m365/entra/commands/user/user-add.js +1 -0
- package/dist/m365/entra/commands/user/user-guest-add.js +0 -3
- package/dist/m365/entra/commands/user/user-list.js +2 -1
- package/dist/m365/external/commands/item/item-add.js +2 -1
- package/dist/m365/flow/commands/environment/environment-get.js +0 -3
- package/dist/m365/flow/commands/flow-get.js +0 -3
- package/dist/m365/flow/commands/flow-list.js +1 -1
- package/dist/m365/flow/commands/run/run-get.js +0 -3
- package/dist/m365/graph/commands/openextension/openextension-add.js +73 -0
- package/dist/m365/graph/commands/openextension/openextension-get.js +57 -0
- package/dist/m365/graph/commands/openextension/openextension-list.js +62 -0
- package/dist/m365/graph/commands/openextension/openextension-remove.js +68 -0
- package/dist/m365/graph/commands.js +4 -0
- package/dist/m365/pa/commands/app/app-get.js +0 -3
- package/dist/m365/pa/commands/environment/environment-get.js +0 -3
- package/dist/m365/planner/commands/bucket/bucket-add.js +0 -3
- package/dist/m365/planner/commands/plan/plan-add.js +0 -3
- package/dist/m365/planner/commands/plan/plan-get.js +0 -3
- package/dist/m365/planner/commands/plan/plan-set.js +0 -3
- package/dist/m365/planner/commands/task/task-checklistitem-add.js +0 -3
- package/dist/m365/pp/commands/aibuildermodel/aibuildermodel-get.js +0 -3
- package/dist/m365/pp/commands/card/card-clone.js +12 -16
- package/dist/m365/pp/commands/card/card-get.js +13 -22
- package/dist/m365/pp/commands/card/card-remove.js +13 -16
- package/dist/m365/pp/commands/copilot/copilot-get.js +0 -3
- package/dist/m365/pp/commands/dataverse/dataverse-table-get.js +0 -3
- package/dist/m365/pp/commands/environment/environment-get.js +0 -3
- package/dist/m365/pp/commands/solution/solution-get.js +5 -14
- package/dist/m365/pp/commands/solution/solution-publish.js +6 -16
- package/dist/m365/pp/commands/solution/solution-publisher-get.js +0 -3
- package/dist/m365/pp/commands/solution/solution-remove.js +4 -13
- package/dist/m365/pp/commands/website/website-get.js +0 -3
- package/dist/m365/spfx/commands/project/project-doctor/doctor-1.21.0.js +25 -0
- package/dist/m365/spfx/commands/project/project-doctor.js +2 -1
- package/dist/m365/spfx/commands/project/project-upgrade/rules/FN002029_DEVDEP_microsoft_rush_stack_compiler_5_3.js +13 -0
- package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.21.0.js +63 -0
- package/dist/m365/spfx/commands/project/project-upgrade.js +2 -1
- package/dist/m365/spfx/commands/spfx-doctor.js +15 -0
- package/dist/m365/spo/commands/folder/folder-roleassignment-add.js +12 -47
- package/dist/m365/spo/commands/folder/folder-roleassignment-remove.js +13 -31
- package/dist/m365/spo/commands/group/group-member-add.js +0 -3
- package/dist/m365/spo/commands/homesite/homesite-add.js +66 -0
- package/dist/m365/spo/commands/listitem/listitem-roleassignment-add.js +12 -43
- package/dist/m365/spo/commands/listitem/listitem-roleassignment-remove.js +8 -27
- package/dist/m365/spo/commands/page/page-copy.js +0 -3
- package/dist/m365/spo/commands/page/page-get.js +0 -3
- package/dist/m365/spo/commands/sitedesign/sitedesign-run-status-get.js +0 -3
- package/dist/m365/spo/commands/web/web-roleassignment-add.js +22 -47
- package/dist/m365/spo/commands/web/web-roleassignment-remove.js +17 -32
- package/dist/m365/spo/commands.js +1 -0
- package/dist/m365/tenant/commands/people/people-profilecardproperty-add.js +4 -3
- package/dist/m365/tenant/commands/people/people-profilecardproperty-set.js +4 -3
- package/dist/m365/tenant/commands/serviceannouncement/serviceannouncement-health-get.js +0 -3
- package/dist/m365/todo/commands/list/list-get.js +0 -3
- package/dist/m365/todo/commands/list/list-remove.js +1 -1
- package/dist/m365/todo/commands/task/task-get.js +0 -3
- package/dist/m365/util/commands/accesstoken/accesstoken-get.js +13 -3
- package/dist/m365/viva/commands/engage/engage-message-add.js +0 -3
- package/dist/m365/viva/commands/engage/engage-message-get.js +0 -3
- package/dist/m365/viva/commands/engage/engage-user-get.js +0 -3
- package/dist/utils/accessToken.js +8 -0
- package/dist/utils/entraApp.js +3 -1
- package/dist/utils/optionsUtils.js +28 -0
- package/dist/utils/powerPlatform.js +51 -1
- package/dist/utils/prompt.js +9 -2
- package/dist/utils/spo.js +32 -3
- package/docs/docs/cmd/booking/business/business-get.mdx +13 -0
- package/docs/docs/cmd/entra/policy/policy-list.mdx +1 -1
- package/docs/docs/cmd/entra/user/user-guest-add.mdx +11 -0
- package/docs/docs/cmd/flow/environment/environment-get.mdx +2 -0
- package/docs/docs/cmd/flow/flow-get.mdx +2 -0
- package/docs/docs/cmd/flow/run/run-get.mdx +17 -13
- package/docs/docs/cmd/graph/directoryextension/directoryextension-get.mdx +2 -3
- package/docs/docs/cmd/graph/openextension/openextension-add.mdx +120 -0
- package/docs/docs/cmd/graph/openextension/openextension-get.mdx +111 -0
- package/docs/docs/cmd/graph/openextension/openextension-list.mdx +129 -0
- package/docs/docs/cmd/graph/openextension/openextension-remove.mdx +59 -0
- package/docs/docs/cmd/login.mdx +9 -1
- package/docs/docs/cmd/pa/app/app-get.mdx +8 -2
- package/docs/docs/cmd/pa/environment/environment-get.mdx +5 -3
- package/docs/docs/cmd/planner/plan/plan-add.mdx +2 -0
- package/docs/docs/cmd/planner/plan/plan-get.mdx +8 -4
- package/docs/docs/cmd/planner/plan/plan-set.mdx +2 -0
- package/docs/docs/cmd/planner/task/task-checklistitem-add.mdx +6 -3
- package/docs/docs/cmd/pp/aibuildermodel/aibuildermodel-get.mdx +12 -3
- package/docs/docs/cmd/pp/card/card-get.mdx +36 -5
- package/docs/docs/cmd/pp/copilot/copilot-get.mdx +41 -5
- package/docs/docs/cmd/pp/dataverse/dataverse-table-get.mdx +19 -4
- package/docs/docs/cmd/pp/environment/environment-get.mdx +5 -2
- package/docs/docs/cmd/pp/solution/solution-get.mdx +12 -7
- package/docs/docs/cmd/pp/solution/solution-publisher-get.mdx +12 -7
- package/docs/docs/cmd/pp/website/website-get.mdx +22 -4
- package/docs/docs/cmd/spfx/project/project-upgrade.mdx +1 -4
- package/docs/docs/cmd/spo/group/group-member-add.mdx +12 -3
- package/docs/docs/cmd/spo/homesite/homesite-add.mdx +124 -0
- package/docs/docs/cmd/spo/page/page-copy.mdx +30 -4
- package/docs/docs/cmd/spo/page/page-get.mdx +44 -5
- package/docs/docs/cmd/spo/sitedesign/sitedesign-run-status-get.mdx +7 -0
- package/docs/docs/cmd/todo/list/list-get.mdx +7 -4
- package/docs/docs/cmd/todo/task/task-get.mdx +7 -2
- package/docs/docs/cmd/util/accesstoken/accesstoken-get.mdx +72 -0
- package/docs/docs/cmd/viva/engage/engage-message-add.mdx +37 -12
- package/docs/docs/cmd/viva/engage/engage-message-get.mdx +27 -13
- package/docs/docs/cmd/viva/engage/engage-user-get.mdx +50 -8
- package/npm-shrinkwrap.json +517 -481
- package/package.json +14 -14
package/dist/Auth.js
CHANGED
|
@@ -2,6 +2,7 @@ import { AzureCloudInstance } from '@azure/msal-common';
|
|
|
2
2
|
import assert from 'assert';
|
|
3
3
|
import { CommandError } from './Command.js';
|
|
4
4
|
import { FileTokenStorage } from './auth/FileTokenStorage.js';
|
|
5
|
+
import { MsalNetworkClient } from './auth/MsalNetworkClient.js';
|
|
5
6
|
import { msalCachePlugin } from './auth/msalCachePlugin.js';
|
|
6
7
|
import { cli } from './cli/cli.js';
|
|
7
8
|
import request from './request.js';
|
|
@@ -53,6 +54,7 @@ export var AuthType;
|
|
|
53
54
|
AuthType["Password"] = "password";
|
|
54
55
|
AuthType["Certificate"] = "certificate";
|
|
55
56
|
AuthType["Identity"] = "identity";
|
|
57
|
+
AuthType["FederatedIdentity"] = "federatedIdentity";
|
|
56
58
|
AuthType["Browser"] = "browser";
|
|
57
59
|
AuthType["Secret"] = "secret";
|
|
58
60
|
})(AuthType || (AuthType = {}));
|
|
@@ -153,7 +155,8 @@ export class Auth {
|
|
|
153
155
|
// wasn't specified
|
|
154
156
|
if (this.connection.authType !== AuthType.Certificate &&
|
|
155
157
|
this.connection.authType !== AuthType.Secret &&
|
|
156
|
-
this.connection.authType !== AuthType.Identity
|
|
158
|
+
this.connection.authType !== AuthType.Identity &&
|
|
159
|
+
this.connection.authType !== AuthType.FederatedIdentity) {
|
|
157
160
|
this.clientApplication = await this.getPublicClient(logger, debug);
|
|
158
161
|
if (this.clientApplication) {
|
|
159
162
|
const accounts = await this.clientApplication.getTokenCache().getAllAccounts();
|
|
@@ -177,6 +180,9 @@ export class Auth {
|
|
|
177
180
|
case AuthType.Identity:
|
|
178
181
|
getTokenPromise = this.ensureAccessTokenWithIdentity.bind(this);
|
|
179
182
|
break;
|
|
183
|
+
case AuthType.FederatedIdentity:
|
|
184
|
+
getTokenPromise = this.ensureAccessTokenWithFederatedIdentity.bind(this);
|
|
185
|
+
break;
|
|
180
186
|
case AuthType.Browser:
|
|
181
187
|
getTokenPromise = this.ensureAccessTokenWithBrowser.bind(this);
|
|
182
188
|
break;
|
|
@@ -269,7 +275,7 @@ export class Auth {
|
|
|
269
275
|
piiLoggingEnabled: false,
|
|
270
276
|
logLevel: debug ? LogLevel.Verbose : LogLevel.Error
|
|
271
277
|
},
|
|
272
|
-
|
|
278
|
+
networkClient: new MsalNetworkClient()
|
|
273
279
|
}
|
|
274
280
|
};
|
|
275
281
|
}
|
|
@@ -552,6 +558,56 @@ export class Auth {
|
|
|
552
558
|
}
|
|
553
559
|
}
|
|
554
560
|
}
|
|
561
|
+
async ensureAccessTokenWithFederatedIdentity(resource, logger, debug) {
|
|
562
|
+
if (debug) {
|
|
563
|
+
await logger.logToStderr('Trying to retrieve access token using federated identity...');
|
|
564
|
+
}
|
|
565
|
+
if (!process.env.ACTIONS_ID_TOKEN_REQUEST_URL || !process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN) {
|
|
566
|
+
throw new CommandError('Federated identity is currently only supported in GitHub Actions.');
|
|
567
|
+
}
|
|
568
|
+
if (debug) {
|
|
569
|
+
await logger.logToStderr('ACTIONS_ID_TOKEN_REQUEST_URL and ACTIONS_ID_TOKEN_REQUEST_TOKEN env variables found. The context is GitHub Actions...');
|
|
570
|
+
}
|
|
571
|
+
const federationToken = await this.getFederationTokenFromGithub(logger, debug);
|
|
572
|
+
const queryParams = [
|
|
573
|
+
'grant_type=client_credentials',
|
|
574
|
+
`scope=${encodeURIComponent(`${resource}/.default`)}`,
|
|
575
|
+
`client_id=${this.connection.appId}`,
|
|
576
|
+
`client_assertion_type=${encodeURIComponent('urn:ietf:params:oauth:client-assertion-type:jwt-bearer')}`,
|
|
577
|
+
`client_assertion=${federationToken}`
|
|
578
|
+
];
|
|
579
|
+
const requestOptions = {
|
|
580
|
+
url: `https://login.microsoftonline.com/${this.connection.tenant}/oauth2/v2.0/token`,
|
|
581
|
+
headers: {
|
|
582
|
+
accept: 'application/json',
|
|
583
|
+
'x-anonymous': true,
|
|
584
|
+
'Content-Type': 'application/x-www-form-urlencoded'
|
|
585
|
+
},
|
|
586
|
+
data: queryParams.join('&'),
|
|
587
|
+
responseType: 'json'
|
|
588
|
+
};
|
|
589
|
+
const accessTokenResponse = await request.post(requestOptions);
|
|
590
|
+
return {
|
|
591
|
+
accessToken: accessTokenResponse.access_token,
|
|
592
|
+
expiresOn: new Date(parseInt(accessTokenResponse.expires_on) * 1000)
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
async getFederationTokenFromGithub(logger, debug) {
|
|
596
|
+
if (debug) {
|
|
597
|
+
await logger.logToStderr('Retrieving GitHub federation token...');
|
|
598
|
+
}
|
|
599
|
+
const requestOptions = {
|
|
600
|
+
url: `${process.env.ACTIONS_ID_TOKEN_REQUEST_URL}&audience=${encodeURIComponent('api://AzureADTokenExchange')}`,
|
|
601
|
+
headers: {
|
|
602
|
+
Authorization: `Bearer ${process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN}`,
|
|
603
|
+
accept: 'application/json',
|
|
604
|
+
'x-anonymous': true
|
|
605
|
+
},
|
|
606
|
+
responseType: 'json'
|
|
607
|
+
};
|
|
608
|
+
const accessTokenResponse = await request.get(requestOptions);
|
|
609
|
+
return accessTokenResponse.value;
|
|
610
|
+
}
|
|
555
611
|
async ensureAccessTokenWithSecret(resource, logger, debug, fetchNew) {
|
|
556
612
|
this.clientApplication = await this.getConfidentialClient(logger, debug, undefined, undefined, this.connection.secret);
|
|
557
613
|
return this.clientApplication.acquireTokenByClientCredential({
|
|
@@ -626,7 +682,8 @@ export class Auth {
|
|
|
626
682
|
// When using an application identity, there is no account in the MSAL TokenCache
|
|
627
683
|
if (this.connection.authType !== AuthType.Certificate &&
|
|
628
684
|
this.connection.authType !== AuthType.Secret &&
|
|
629
|
-
this.connection.authType !== AuthType.Identity
|
|
685
|
+
this.connection.authType !== AuthType.Identity &&
|
|
686
|
+
this.connection.authType !== AuthType.FederatedIdentity) {
|
|
630
687
|
this.clientApplication = await this.getPublicClient(logger, debug);
|
|
631
688
|
if (this.clientApplication) {
|
|
632
689
|
const tokenCache = this.clientApplication.getTokenCache();
|
package/dist/Command.js
CHANGED
|
@@ -15,6 +15,7 @@ import { accessToken } from './utils/accessToken.js';
|
|
|
15
15
|
import { md } from './utils/md.js';
|
|
16
16
|
import { prompt } from './utils/prompt.js';
|
|
17
17
|
import { zod } from './utils/zod.js';
|
|
18
|
+
import { optionsUtils } from './utils/optionsUtils.js';
|
|
18
19
|
export class CommandError {
|
|
19
20
|
constructor(message, code) {
|
|
20
21
|
this.message = message;
|
|
@@ -239,6 +240,11 @@ class Command {
|
|
|
239
240
|
return commandName;
|
|
240
241
|
}
|
|
241
242
|
handleRejectedODataPromise(res) {
|
|
243
|
+
/* c8 ignore next 4 */
|
|
244
|
+
if (this.debug && typeof global.it === 'undefined') {
|
|
245
|
+
const error = new Error();
|
|
246
|
+
cli.error(error.stack).then(() => { }).catch(() => { });
|
|
247
|
+
}
|
|
242
248
|
if (res.error) {
|
|
243
249
|
try {
|
|
244
250
|
const err = JSON.parse(res.error);
|
|
@@ -275,6 +281,11 @@ class Command {
|
|
|
275
281
|
}
|
|
276
282
|
}
|
|
277
283
|
handleRejectedODataJsonPromise(response) {
|
|
284
|
+
/* c8 ignore next 4 */
|
|
285
|
+
if (this.debug && typeof global.it === 'undefined') {
|
|
286
|
+
const error = new Error();
|
|
287
|
+
cli.error(error.stack).then(() => { }).catch(() => { });
|
|
288
|
+
}
|
|
278
289
|
if (response.error &&
|
|
279
290
|
response.error['odata.error'] &&
|
|
280
291
|
response.error['odata.error'].message) {
|
|
@@ -337,39 +348,16 @@ class Command {
|
|
|
337
348
|
}
|
|
338
349
|
await telemetry.trackEvent(this.getUsedCommandName(), this.getTelemetryProperties(args));
|
|
339
350
|
}
|
|
340
|
-
getUnknownOptions(options) {
|
|
341
|
-
const unknownOptions = JSON.parse(JSON.stringify(options));
|
|
342
|
-
// remove minimist catch-all option
|
|
343
|
-
delete unknownOptions._;
|
|
344
|
-
const knownOptions = this.options;
|
|
345
|
-
const longOptionRegex = /--([^\s]+)/;
|
|
346
|
-
const shortOptionRegex = /-([a-z])\b/;
|
|
347
|
-
knownOptions.forEach(o => {
|
|
348
|
-
const longOptionName = longOptionRegex.exec(o.option)[1];
|
|
349
|
-
delete unknownOptions[longOptionName];
|
|
350
|
-
// short names are optional so we need to check if the current command has
|
|
351
|
-
// one before continuing
|
|
352
|
-
const shortOptionMatch = shortOptionRegex.exec(o.option);
|
|
353
|
-
if (shortOptionMatch) {
|
|
354
|
-
const shortOptionName = shortOptionMatch[1];
|
|
355
|
-
delete unknownOptions[shortOptionName];
|
|
356
|
-
}
|
|
357
|
-
});
|
|
358
|
-
return unknownOptions;
|
|
359
|
-
}
|
|
360
351
|
trackUnknownOptions(telemetryProps, options) {
|
|
361
|
-
const unknownOptions =
|
|
352
|
+
const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
|
|
362
353
|
const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
|
|
363
354
|
unknownOptionsNames.forEach(o => {
|
|
364
355
|
telemetryProps[o] = true;
|
|
365
356
|
});
|
|
366
357
|
}
|
|
367
358
|
addUnknownOptionsToPayload(payload, options) {
|
|
368
|
-
const unknownOptions =
|
|
369
|
-
|
|
370
|
-
unknownOptionsNames.forEach(o => {
|
|
371
|
-
payload[o] = unknownOptions[o];
|
|
372
|
-
});
|
|
359
|
+
const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
|
|
360
|
+
optionsUtils.addUnknownOptionsToPayload(payload, unknownOptions);
|
|
373
361
|
}
|
|
374
362
|
loadValuesFromAccessToken(args) {
|
|
375
363
|
if (!auth.connection.accessTokens[auth.defaultResource]) {
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import request from '../request.js';
|
|
2
|
+
export class MsalNetworkClient {
|
|
3
|
+
sendGetRequestAsync(url, options) {
|
|
4
|
+
return this.sendRequestAsync(url, 'GET', options);
|
|
5
|
+
}
|
|
6
|
+
sendPostRequestAsync(url, options) {
|
|
7
|
+
return this.sendRequestAsync(url, 'POST', options);
|
|
8
|
+
}
|
|
9
|
+
async sendRequestAsync(url, method, options = {}) {
|
|
10
|
+
const requestOptions = {
|
|
11
|
+
url: url,
|
|
12
|
+
method: method,
|
|
13
|
+
headers: {
|
|
14
|
+
'x-anonymous': true,
|
|
15
|
+
...options.headers
|
|
16
|
+
},
|
|
17
|
+
data: options.body,
|
|
18
|
+
fullResponse: true
|
|
19
|
+
};
|
|
20
|
+
const res = await request.execute(requestOptions);
|
|
21
|
+
const headersObj = {};
|
|
22
|
+
for (const [key, value] of Object.entries(res.headers)) {
|
|
23
|
+
headersObj[key] = typeof value === 'string' ? value : String(value);
|
|
24
|
+
}
|
|
25
|
+
return {
|
|
26
|
+
headers: headersObj,
|
|
27
|
+
body: JSON.parse(res.data),
|
|
28
|
+
status: res.status
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=MsalNetworkClient.js.map
|
package/dist/config.js
CHANGED
|
@@ -29,9 +29,11 @@ export default {
|
|
|
29
29
|
'https://graph.microsoft.com/OnlineMeetingArtifact.Read.All',
|
|
30
30
|
'https://graph.microsoft.com/OnlineMeetings.ReadWrite',
|
|
31
31
|
'https://graph.microsoft.com/OnlineMeetingTranscript.Read.All',
|
|
32
|
+
'https://graph.microsoft.com/Organization.ReadWrite.All',
|
|
32
33
|
'https://graph.microsoft.com/PeopleSettings.ReadWrite.All',
|
|
33
34
|
'https://graph.microsoft.com/Place.Read.All',
|
|
34
35
|
'https://graph.microsoft.com/Policy.Read.All',
|
|
36
|
+
'https://graph.microsoft.com/Policy.Read.PermissionGrant',
|
|
35
37
|
'https://graph.microsoft.com/RecordsManagement.ReadWrite.All',
|
|
36
38
|
'https://graph.microsoft.com/Reports.Read.All',
|
|
37
39
|
'https://graph.microsoft.com/ReportSettings.ReadWrite.All',
|
|
@@ -7,6 +7,7 @@ var _AdaptiveCardSendCommand_instances, _AdaptiveCardSendCommand_initTelemetry,
|
|
|
7
7
|
import request from '../../../request.js';
|
|
8
8
|
import AnonymousCommand from '../../base/AnonymousCommand.js';
|
|
9
9
|
import commands from '../commands.js';
|
|
10
|
+
import { optionsUtils } from '../../../utils/optionsUtils.js';
|
|
10
11
|
class AdaptiveCardSendCommand extends AnonymousCommand {
|
|
11
12
|
get name() {
|
|
12
13
|
return commands.SEND;
|
|
@@ -26,7 +27,7 @@ class AdaptiveCardSendCommand extends AnonymousCommand {
|
|
|
26
27
|
return true;
|
|
27
28
|
}
|
|
28
29
|
async commandAction(logger, args) {
|
|
29
|
-
const unknownOptions =
|
|
30
|
+
const unknownOptions = optionsUtils.getUnknownOptions(args.options, this.options);
|
|
30
31
|
const unknownOptionNames = Object.getOwnPropertyNames(unknownOptions);
|
|
31
32
|
const card = await this.getCard(args, unknownOptionNames, unknownOptions);
|
|
32
33
|
const requestOptions = {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { cli } from '../../../cli/cli.js';
|
|
2
|
-
import entraAppGetCommand from '../../entra/commands/app/app-get.js';
|
|
3
1
|
import AppCommand from '../../base/AppCommand.js';
|
|
4
2
|
import commands from '../commands.js';
|
|
3
|
+
import { entraApp } from '../../../utils/entraApp.js';
|
|
5
4
|
class AppGetCommand extends AppCommand {
|
|
6
5
|
get name() {
|
|
7
6
|
return commands.GET;
|
|
@@ -10,18 +9,9 @@ class AppGetCommand extends AppCommand {
|
|
|
10
9
|
return 'Retrieves information about the current Microsoft Entra app';
|
|
11
10
|
}
|
|
12
11
|
async commandAction(logger, args) {
|
|
13
|
-
const options = {
|
|
14
|
-
appId: this.appId,
|
|
15
|
-
output: 'json',
|
|
16
|
-
debug: args.options.debug,
|
|
17
|
-
verbose: args.options.verbose
|
|
18
|
-
};
|
|
19
12
|
try {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
await logger.logToStderr(appGetOutput.stderr);
|
|
23
|
-
}
|
|
24
|
-
await logger.log(JSON.parse(appGetOutput.stdout));
|
|
13
|
+
const app = await entraApp.getAppRegistrationByAppId(args.options.appId);
|
|
14
|
+
await logger.log(app);
|
|
25
15
|
}
|
|
26
16
|
catch (err) {
|
|
27
17
|
this.handleRejectedODataJsonPromise(err);
|
|
@@ -1,8 +1,7 @@
|
|
|
1
|
-
import { cli } from '../../../../cli/cli.js';
|
|
2
1
|
import request from '../../../../request.js';
|
|
3
|
-
import appGetCommand from '../../../entra/commands/app/app-get.js';
|
|
4
2
|
import AppCommand from '../../../base/AppCommand.js';
|
|
5
3
|
import commands from '../../commands.js';
|
|
4
|
+
import { entraApp } from '../../../../utils/entraApp.js';
|
|
6
5
|
var GetServicePrincipal;
|
|
7
6
|
(function (GetServicePrincipal) {
|
|
8
7
|
GetServicePrincipal[GetServicePrincipal["withPermissions"] = 0] = "withPermissions";
|
|
@@ -178,19 +177,10 @@ class AppPermissionListCommand extends AppCommand {
|
|
|
178
177
|
}
|
|
179
178
|
async getAppRegistration(appId, logger) {
|
|
180
179
|
if (this.verbose) {
|
|
181
|
-
await logger.logToStderr(`Retrieving
|
|
180
|
+
await logger.logToStderr(`Retrieving the Entra application registration with appId '${appId}'`);
|
|
182
181
|
}
|
|
183
|
-
const
|
|
184
|
-
|
|
185
|
-
output: 'json',
|
|
186
|
-
debug: this.debug,
|
|
187
|
-
verbose: this.verbose
|
|
188
|
-
};
|
|
189
|
-
const output = await cli.executeCommandWithOutput(appGetCommand, { options: { ...options, _: [] } });
|
|
190
|
-
if (this.debug) {
|
|
191
|
-
await logger.logToStderr(output.stderr);
|
|
192
|
-
}
|
|
193
|
-
return JSON.parse(output.stdout);
|
|
182
|
+
const app = await entraApp.getAppRegistrationByAppId(appId);
|
|
183
|
+
return app;
|
|
194
184
|
}
|
|
195
185
|
async getAppRegPermissions(appId, logger) {
|
|
196
186
|
const application = await this.getAppRegistration(appId, logger);
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'module';
|
|
2
2
|
import auth, { AuthType } from '../../Auth.js';
|
|
3
3
|
import Command, { CommandError } from '../../Command.js';
|
|
4
|
+
import { optionsUtils } from '../../utils/optionsUtils.js';
|
|
4
5
|
const require = createRequire(import.meta.url);
|
|
5
6
|
const csomDefs = require('../../../csom.json');
|
|
6
7
|
export default class SpoCommand extends Command {
|
|
@@ -70,7 +71,7 @@ export default class SpoCommand extends Command {
|
|
|
70
71
|
}
|
|
71
72
|
}
|
|
72
73
|
validateUnknownCsomOptions(options, csomObject, csomPropertyType) {
|
|
73
|
-
const unknownOptions =
|
|
74
|
+
const unknownOptions = optionsUtils.getUnknownOptions(options, this.options);
|
|
74
75
|
const optionNames = Object.getOwnPropertyNames(unknownOptions);
|
|
75
76
|
if (optionNames.length === 0) {
|
|
76
77
|
return true;
|
|
@@ -16,9 +16,6 @@ class BookingBusinessGetCommand extends GraphCommand {
|
|
|
16
16
|
get description() {
|
|
17
17
|
return 'Retrieve the specified Microsoft Bookings business.';
|
|
18
18
|
}
|
|
19
|
-
defaultProperties() {
|
|
20
|
-
return ['id', 'displayName', 'businessType', 'phone', 'email', 'defaultCurrencyIso'];
|
|
21
|
-
}
|
|
22
19
|
constructor() {
|
|
23
20
|
super();
|
|
24
21
|
_BookingBusinessGetCommand_instances.add(this);
|
|
@@ -184,6 +184,9 @@ class LoginCommand extends Command {
|
|
|
184
184
|
auth.connection.authType = AuthType.Identity;
|
|
185
185
|
auth.connection.userName = args.options.userName;
|
|
186
186
|
break;
|
|
187
|
+
case 'federatedIdentity':
|
|
188
|
+
auth.connection.authType = AuthType.FederatedIdentity;
|
|
189
|
+
break;
|
|
187
190
|
case 'browser':
|
|
188
191
|
auth.connection.authType = AuthType.Browser;
|
|
189
192
|
break;
|
|
@@ -36,11 +36,7 @@ class RequestCommand extends Command {
|
|
|
36
36
|
const url = this.resolveUrlTokens(args.options.url);
|
|
37
37
|
const method = (args.options.method || 'get').toUpperCase();
|
|
38
38
|
const headers = {};
|
|
39
|
-
|
|
40
|
-
const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
|
|
41
|
-
unknownOptionsNames.forEach(o => {
|
|
42
|
-
headers[o] = unknownOptions[o];
|
|
43
|
-
});
|
|
39
|
+
this.addUnknownOptionsToPayload(headers, args.options);
|
|
44
40
|
if (!headers.accept) {
|
|
45
41
|
headers.accept = 'application/json';
|
|
46
42
|
}
|
|
@@ -105,19 +101,14 @@ class RequestCommand extends Command {
|
|
|
105
101
|
}
|
|
106
102
|
_RequestCommand_instances = new WeakSet(), _RequestCommand_initTelemetry = function _RequestCommand_initTelemetry() {
|
|
107
103
|
this.telemetry.push((args) => {
|
|
108
|
-
|
|
104
|
+
Object.assign(this.telemetryProperties, {
|
|
109
105
|
method: args.options.method || 'get',
|
|
110
106
|
resource: typeof args.options.resource !== 'undefined',
|
|
111
107
|
accept: args.options.accept || 'application/json',
|
|
112
108
|
body: typeof args.options.body !== 'undefined',
|
|
113
109
|
filePath: typeof args.options.filePath !== 'undefined'
|
|
114
|
-
};
|
|
115
|
-
const unknownOptions = this.getUnknownOptions(args.options);
|
|
116
|
-
const unknownOptionsNames = Object.getOwnPropertyNames(unknownOptions);
|
|
117
|
-
unknownOptionsNames.forEach(o => {
|
|
118
|
-
properties[o] = typeof unknownOptions[o] !== 'undefined';
|
|
119
110
|
});
|
|
120
|
-
|
|
111
|
+
this.trackUnknownOptions(this.telemetryProperties, args.options);
|
|
121
112
|
});
|
|
122
113
|
}, _RequestCommand_initOptions = function _RequestCommand_initOptions() {
|
|
123
114
|
this.options.unshift({
|
|
@@ -18,6 +18,7 @@ import { validation } from '../../utils/validation.js';
|
|
|
18
18
|
import AnonymousCommand from '../base/AnonymousCommand.js';
|
|
19
19
|
import commands from './commands.js';
|
|
20
20
|
import { interactivePreset, powerShellPreset, scriptingPreset } from './setupPresets.js';
|
|
21
|
+
import { optionsUtils } from '../../utils/optionsUtils.js';
|
|
21
22
|
export var CliUsageMode;
|
|
22
23
|
(function (CliUsageMode) {
|
|
23
24
|
CliUsageMode["Interactively"] = "interactively";
|
|
@@ -227,6 +228,7 @@ class SetupCommand extends AnonymousCommand {
|
|
|
227
228
|
});
|
|
228
229
|
const appInfo = await entraApp.createAppRegistration({
|
|
229
230
|
options,
|
|
231
|
+
unknownOptions: optionsUtils.getUnknownOptions(options, this.options),
|
|
230
232
|
apis,
|
|
231
233
|
logger,
|
|
232
234
|
verbose: this.verbose,
|
|
@@ -14,6 +14,9 @@ class EntraAdministrativeUnitAddCommand extends GraphCommand {
|
|
|
14
14
|
get description() {
|
|
15
15
|
return 'Creates an administrative unit';
|
|
16
16
|
}
|
|
17
|
+
allowUnknownOptions() {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
17
20
|
constructor() {
|
|
18
21
|
super();
|
|
19
22
|
_EntraAdministrativeUnitAddCommand_instances.add(this);
|
|
@@ -21,17 +24,19 @@ class EntraAdministrativeUnitAddCommand extends GraphCommand {
|
|
|
21
24
|
__classPrivateFieldGet(this, _EntraAdministrativeUnitAddCommand_instances, "m", _EntraAdministrativeUnitAddCommand_initOptions).call(this);
|
|
22
25
|
}
|
|
23
26
|
async commandAction(logger, args) {
|
|
27
|
+
const requestBody = {
|
|
28
|
+
description: args.options.description,
|
|
29
|
+
displayName: args.options.displayName,
|
|
30
|
+
visibility: args.options.hiddenMembership ? 'HiddenMembership' : null
|
|
31
|
+
};
|
|
32
|
+
this.addUnknownOptionsToPayload(requestBody, args.options);
|
|
24
33
|
const requestOptions = {
|
|
25
34
|
url: `${this.resource}/v1.0/directory/administrativeUnits`,
|
|
26
35
|
headers: {
|
|
27
36
|
accept: 'application/json;odata.metadata=none'
|
|
28
37
|
},
|
|
29
38
|
responseType: 'json',
|
|
30
|
-
data:
|
|
31
|
-
description: args.options.description,
|
|
32
|
-
displayName: args.options.displayName,
|
|
33
|
-
visibility: args.options.hiddenMembership ? 'HiddenMembership' : null
|
|
34
|
-
}
|
|
39
|
+
data: requestBody
|
|
35
40
|
};
|
|
36
41
|
try {
|
|
37
42
|
const administrativeUnit = await request.post(requestOptions);
|
|
@@ -12,6 +12,7 @@ import { accessToken } from '../../../../utils/accessToken.js';
|
|
|
12
12
|
import { entraApp } from '../../../../utils/entraApp.js';
|
|
13
13
|
import GraphCommand from '../../../base/GraphCommand.js';
|
|
14
14
|
import commands from '../../commands.js';
|
|
15
|
+
import { optionsUtils } from '../../../../utils/optionsUtils.js';
|
|
15
16
|
class EntraAppAddCommand extends GraphCommand {
|
|
16
17
|
get name() {
|
|
17
18
|
return commands.APP_ADD;
|
|
@@ -19,6 +20,9 @@ class EntraAppAddCommand extends GraphCommand {
|
|
|
19
20
|
get description() {
|
|
20
21
|
return 'Creates new Entra app registration';
|
|
21
22
|
}
|
|
23
|
+
allowUnknownOptions() {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
22
26
|
constructor() {
|
|
23
27
|
super();
|
|
24
28
|
_EntraAppAddCommand_instances.add(this);
|
|
@@ -43,6 +47,7 @@ class EntraAppAddCommand extends GraphCommand {
|
|
|
43
47
|
});
|
|
44
48
|
let appInfo = await entraApp.createAppRegistration({
|
|
45
49
|
options: args.options,
|
|
50
|
+
unknownOptions: optionsUtils.getUnknownOptions(args.options, this.options),
|
|
46
51
|
apis,
|
|
47
52
|
logger,
|
|
48
53
|
verbose: this.verbose,
|
|
@@ -11,6 +11,7 @@ import { validation } from '../../../../utils/validation.js';
|
|
|
11
11
|
import GraphCommand from '../../../base/GraphCommand.js';
|
|
12
12
|
import commands from '../../commands.js';
|
|
13
13
|
import { cli } from '../../../../cli/cli.js';
|
|
14
|
+
import { entraApp } from '../../../../utils/entraApp.js';
|
|
14
15
|
class EntraAppGetCommand extends GraphCommand {
|
|
15
16
|
get name() {
|
|
16
17
|
return commands.APP_GET;
|
|
@@ -28,7 +29,7 @@ class EntraAppGetCommand extends GraphCommand {
|
|
|
28
29
|
}
|
|
29
30
|
async commandAction(logger, args) {
|
|
30
31
|
try {
|
|
31
|
-
const appObjectId = await this.getAppObjectId(args);
|
|
32
|
+
const appObjectId = await this.getAppObjectId(args, logger);
|
|
32
33
|
const appInfo = await this.getAppInfo(appObjectId, args.options.properties);
|
|
33
34
|
const res = await this.saveAppInfo(args, appInfo, logger);
|
|
34
35
|
await logger.log(res);
|
|
@@ -37,32 +38,37 @@ class EntraAppGetCommand extends GraphCommand {
|
|
|
37
38
|
this.handleRejectedODataJsonPromise(err);
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
|
-
async getAppObjectId(args) {
|
|
41
|
+
async getAppObjectId(args, logger) {
|
|
41
42
|
if (args.options.objectId) {
|
|
42
43
|
return args.options.objectId;
|
|
43
44
|
}
|
|
44
45
|
const { appId, name } = args.options;
|
|
45
|
-
|
|
46
|
-
`
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
accept: 'application/json;odata.metadata=none'
|
|
52
|
-
},
|
|
53
|
-
responseType: 'json'
|
|
54
|
-
};
|
|
55
|
-
const res = await request.get(requestOptions);
|
|
56
|
-
if (res.value.length === 1) {
|
|
57
|
-
return res.value[0].id;
|
|
46
|
+
if (this.verbose) {
|
|
47
|
+
await logger.logToStderr(`Retrieving information about Microsoft Entra app ${appId ? appId : name}...`);
|
|
48
|
+
}
|
|
49
|
+
if (appId) {
|
|
50
|
+
const app = await entraApp.getAppRegistrationByAppId(appId, ["id"]);
|
|
51
|
+
return app.id;
|
|
58
52
|
}
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
53
|
+
else {
|
|
54
|
+
const requestOptions = {
|
|
55
|
+
url: `${this.resource}/v1.0/myorganization/applications?$filter=displayName eq '${formatting.encodeQueryParameter(name)}'&$select=id`,
|
|
56
|
+
headers: {
|
|
57
|
+
accept: 'application/json;odata.metadata=none'
|
|
58
|
+
},
|
|
59
|
+
responseType: 'json'
|
|
60
|
+
};
|
|
61
|
+
const res = await request.get(requestOptions);
|
|
62
|
+
if (res.value.length === 1) {
|
|
63
|
+
return res.value[0].id;
|
|
64
|
+
}
|
|
65
|
+
if (res.value.length === 0) {
|
|
66
|
+
throw `No Microsoft Entra application registration with name ${name} found`;
|
|
67
|
+
}
|
|
68
|
+
const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
|
|
69
|
+
const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registrations with name '${name}' found.`, resultAsKeyValuePair);
|
|
70
|
+
return result.id;
|
|
62
71
|
}
|
|
63
|
-
const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
|
|
64
|
-
const result = await cli.handleMultipleResultsFound(`Multiple Microsoft Entra application registrations with name '${name}' found.`, resultAsKeyValuePair);
|
|
65
|
-
return result.id;
|
|
66
72
|
}
|
|
67
73
|
async getAppInfo(appObjectId, properties) {
|
|
68
74
|
const queryParameters = [];
|
|
@@ -10,6 +10,7 @@ import request from "../../../../request.js";
|
|
|
10
10
|
import { validation } from "../../../../utils/validation.js";
|
|
11
11
|
import { formatting } from "../../../../utils/formatting.js";
|
|
12
12
|
import { cli } from "../../../../cli/cli.js";
|
|
13
|
+
import { entraApp } from "../../../../utils/entraApp.js";
|
|
13
14
|
class EntraAppPermissionListCommand extends GraphCommand {
|
|
14
15
|
get name() {
|
|
15
16
|
return commands.APP_PERMISSION_LIST;
|
|
@@ -28,7 +29,7 @@ class EntraAppPermissionListCommand extends GraphCommand {
|
|
|
28
29
|
}
|
|
29
30
|
async commandAction(logger, args) {
|
|
30
31
|
try {
|
|
31
|
-
const appObjectId = await this.getAppObjectId(args.options);
|
|
32
|
+
const appObjectId = await this.getAppObjectId(args.options, logger);
|
|
32
33
|
const type = args.options.type ?? 'all';
|
|
33
34
|
const permissions = await this.getAppRegPermissions(appObjectId, type, logger);
|
|
34
35
|
await logger.log(permissions);
|
|
@@ -37,32 +38,37 @@ class EntraAppPermissionListCommand extends GraphCommand {
|
|
|
37
38
|
this.handleRejectedODataJsonPromise(err);
|
|
38
39
|
}
|
|
39
40
|
}
|
|
40
|
-
async getAppObjectId(options) {
|
|
41
|
+
async getAppObjectId(options, logger) {
|
|
41
42
|
if (options.appObjectId) {
|
|
42
43
|
return options.appObjectId;
|
|
43
44
|
}
|
|
44
45
|
const { appId, appName } = options;
|
|
45
|
-
|
|
46
|
-
`
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
46
|
+
if (this.verbose) {
|
|
47
|
+
await logger.logToStderr(`Retrieving information about Microsoft Entra app ${appId ? appId : appName}...`);
|
|
48
|
+
}
|
|
49
|
+
if (appId) {
|
|
50
|
+
const app = await entraApp.getAppRegistrationByAppId(appId, ["id"]);
|
|
51
|
+
return app.id;
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
const requestOptions = {
|
|
55
|
+
url: `${this.resource}/v1.0/myorganization/applications?$filter=displayName eq '${formatting.encodeQueryParameter(appName)}'&$select=id`,
|
|
56
|
+
headers: {
|
|
57
|
+
accept: 'application/json;odata.metadata=none'
|
|
58
|
+
},
|
|
59
|
+
responseType: 'json'
|
|
60
|
+
};
|
|
61
|
+
const res = await request.get(requestOptions);
|
|
62
|
+
if (res.value.length === 1) {
|
|
63
|
+
return res.value[0].id;
|
|
64
|
+
}
|
|
65
|
+
if (res.value.length === 0) {
|
|
66
|
+
throw `No Microsoft Entra application registration with name ${appName} found`;
|
|
67
|
+
}
|
|
68
|
+
const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
|
|
69
|
+
const result = await cli.handleMultipleResultsFound(`Multiple Entra application registrations with name '${appName}' found.`, resultAsKeyValuePair);
|
|
70
|
+
return result.id;
|
|
62
71
|
}
|
|
63
|
-
const resultAsKeyValuePair = formatting.convertArrayToHashTable('id', res.value);
|
|
64
|
-
const result = await cli.handleMultipleResultsFound(`Multiple Entra application registrations with name '${appName}' found.`, resultAsKeyValuePair);
|
|
65
|
-
return result.id;
|
|
66
72
|
}
|
|
67
73
|
async getAppRegPermissions(appObjectId, permissionType, logger) {
|
|
68
74
|
const requestOptions = {
|