@pnp/cli-microsoft365 9.0.0-beta.f2c5f82 → 9.1.0-beta.2d61838
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/allCommands.json +1 -1
- package/allCommandsFull.json +1 -1
- package/dist/Auth.js +17 -16
- package/dist/AuthServer.js +7 -7
- package/dist/Command.js +5 -4
- package/dist/api.js +1 -1
- package/dist/cli/cli.js +57 -8
- package/dist/config.js +61 -5
- package/dist/m365/app/commands/permission/permission-add.js +9 -9
- package/dist/m365/base/PowerAutomateCommand.js +1 -1
- package/dist/m365/base/SpoCommand.js +1 -1
- package/dist/m365/cli/commands/cli-consent.js +9 -5
- package/dist/m365/cli/commands/cli-doctor.js +2 -2
- package/dist/m365/cli/commands/cli-reconsent.js +2 -3
- package/dist/m365/cli/commands/config/config-set.js +12 -3
- package/dist/m365/commands/login.js +38 -14
- package/dist/m365/commands/setup.js +256 -33
- package/dist/m365/commands/status.js +2 -2
- package/dist/m365/connection/commands/connection-list.js +4 -4
- package/dist/m365/entra/commands/app/app-add.js +52 -288
- package/dist/m365/entra/commands/enterpriseapp/enterpriseapp-add.js +13 -13
- package/dist/m365/entra/commands/enterpriseapp/enterpriseapp-get.js +18 -18
- package/dist/m365/entra/commands/enterpriseapp/enterpriseapp-list.js +1 -1
- package/dist/m365/entra/commands/group/group-user-list.js +4 -4
- package/dist/m365/entra/commands/m365group/m365group-conversation-post-list.js +4 -4
- package/dist/m365/entra/commands/m365group/m365group-recyclebinitem-list.js +3 -3
- package/dist/m365/entra/commands/m365group/m365group-user-list.js +9 -6
- package/dist/m365/external/commands/item/item-add.js +2 -5
- package/dist/m365/file/commands/file-move.js +135 -0
- package/dist/m365/file/commands.js +2 -1
- package/dist/m365/flow/commands/environment/environment-get.js +1 -1
- package/dist/m365/flow/commands/environment/environment-list.js +1 -1
- package/dist/m365/flow/commands/flow-disable.js +1 -1
- package/dist/m365/flow/commands/flow-enable.js +1 -1
- package/dist/m365/flow/commands/flow-export.js +17 -16
- package/dist/m365/flow/commands/flow-get.js +1 -1
- package/dist/m365/flow/commands/flow-list.js +1 -1
- package/dist/m365/flow/commands/flow-remove.js +1 -1
- package/dist/m365/flow/commands/owner/owner-ensure.js +1 -1
- package/dist/m365/flow/commands/owner/owner-list.js +1 -1
- package/dist/m365/flow/commands/owner/owner-remove.js +1 -1
- package/dist/m365/flow/commands/recyclebinitem/recyclebinitem-list.js +47 -0
- package/dist/m365/flow/commands/recyclebinitem/recyclebinitem-restore.js +48 -0
- package/dist/m365/flow/commands/run/run-cancel.js +1 -1
- package/dist/m365/flow/commands/run/run-get.js +1 -1
- package/dist/m365/flow/commands/run/run-list.js +1 -1
- package/dist/m365/flow/commands/run/run-resubmit.js +2 -2
- package/dist/m365/flow/commands.js +2 -0
- package/dist/m365/onenote/commands/notebook/notebook-add.js +132 -0
- package/dist/m365/onenote/commands.js +1 -0
- package/dist/m365/outlook/commands/message/message-get.js +11 -11
- package/dist/m365/spfx/commands/project/DeployWorkflow.js +1 -1
- package/dist/m365/spfx/commands/project/project-doctor/doctor-1.20.0-rc.1.js +25 -0
- package/dist/m365/spfx/commands/project/project-doctor.js +2 -1
- package/dist/m365/spfx/commands/project/project-github-workflow-add.js +10 -1
- package/dist/m365/spfx/commands/project/project-upgrade/upgrade-1.20.0-rc.1.js +57 -0
- package/dist/m365/spfx/commands/project/project-upgrade.js +16 -13
- package/dist/m365/spfx/commands/spfx-doctor.js +15 -0
- package/dist/m365/spo/commands/applicationcustomizer/applicationcustomizer-get.js +1 -0
- package/dist/m365/spo/commands/file/file-copy.js +34 -55
- package/dist/m365/spo/commands/file/file-roleassignment-add.js +17 -54
- package/dist/m365/spo/commands/file/file-roleassignment-remove.js +13 -40
- package/dist/m365/spo/commands/file/file-roleinheritance-break.js +5 -13
- package/dist/m365/spo/commands/file/file-roleinheritance-reset.js +5 -13
- package/dist/m365/spo/commands/folder/folder-set.js +4 -0
- package/dist/m365/spo/commands/folder/folder-sharinglink-add.js +143 -0
- package/dist/m365/spo/commands/folder/folder-sharinglink-clear.js +111 -0
- package/dist/m365/spo/commands/folder/folder-sharinglink-remove.js +95 -0
- package/dist/m365/spo/commands/list/list-get.js +17 -4
- package/dist/m365/spo/commands/list/list-list.js +4 -1
- package/dist/m365/spo/commands/page/page-remove.js +37 -16
- package/dist/m365/spo/commands/page/page-section-add.js +185 -34
- package/dist/m365/spo/commands/site/SiteAdmin.js +2 -0
- package/dist/m365/spo/commands/site/site-admin-add.js +252 -0
- package/dist/m365/spo/commands/site/site-admin-list.js +10 -36
- package/dist/m365/spo/commands/site/site-admin-remove.js +194 -0
- package/dist/m365/spo/commands/site/site-appcatalog-remove.js +24 -48
- package/dist/m365/spo/commands/site/site-get.js +12 -16
- package/dist/m365/spo/commands/site/site-remove.js +7 -1
- package/dist/m365/spo/commands/site/site-sharingpermission-set.js +68 -0
- package/dist/m365/spo/commands/tenant/tenant-recyclebinitem-restore.js +22 -2
- package/dist/m365/spo/commands/user/user-get.js +67 -9
- package/dist/m365/spo/commands.js +7 -0
- package/dist/m365/spp/commands/contentcenter/contentcenter-list.js +56 -0
- package/dist/m365/spp/commands.js +5 -0
- package/dist/m365/teams/MeetingTranscript.js +2 -0
- package/dist/m365/teams/commands/meeting/meeting-transcript-get.js +152 -0
- package/dist/m365/teams/commands.js +1 -0
- package/dist/m365/viva/commands/engage/Community.js +2 -0
- package/dist/m365/viva/commands/engage/engage-community-list.js +28 -0
- package/dist/m365/viva/commands/engage/engage-group-list.js +5 -0
- package/dist/m365/viva/commands/engage/engage-group-user-add.js +5 -0
- package/dist/m365/viva/commands/engage/engage-group-user-remove.js +5 -0
- package/dist/m365/viva/commands/engage/engage-message-add.js +5 -0
- package/dist/m365/viva/commands/engage/engage-message-get.js +5 -0
- package/dist/m365/viva/commands/engage/engage-message-like-set.js +5 -0
- package/dist/m365/viva/commands/engage/engage-message-list.js +5 -0
- package/dist/m365/viva/commands/engage/engage-message-remove.js +5 -0
- package/dist/m365/viva/commands/engage/engage-network-list.js +5 -0
- package/dist/m365/viva/commands/engage/engage-report-activitycounts.js +8 -0
- package/dist/m365/viva/commands/engage/engage-report-activityusercounts.js +8 -0
- package/dist/m365/viva/commands/engage/engage-report-activityuserdetail.js +8 -0
- package/dist/m365/viva/commands/engage/engage-report-deviceusagedistributionusercounts.js +8 -0
- package/dist/m365/viva/commands/engage/engage-report-deviceusageusercounts.js +8 -0
- package/dist/m365/viva/commands/engage/engage-report-deviceusageuserdetail.js +8 -0
- package/dist/m365/viva/commands/engage/engage-report-groupsactivitycounts.js +8 -0
- package/dist/m365/viva/commands/engage/engage-report-groupsactivitydetail.js +8 -0
- package/dist/m365/viva/commands/engage/engage-report-groupsactivitygroupcounts.js +8 -0
- package/dist/m365/viva/commands/engage/engage-search.js +5 -0
- package/dist/m365/viva/commands/engage/engage-user-get.js +5 -0
- package/dist/m365/viva/commands/engage/engage-user-list.js +5 -0
- package/dist/m365/viva/commands/engage/yammerCommands.js +25 -0
- package/dist/m365/viva/commands.js +1 -0
- package/dist/request.js +46 -61
- package/dist/settingsNames.js +7 -1
- package/dist/utils/driveUtil.js +51 -0
- package/dist/utils/entraApp.js +283 -0
- package/dist/utils/spo.js +58 -66
- package/dist/utils/timersUtil.js +12 -0
- package/dist/utils/urlUtil.js +8 -0
- package/dist/utils/zod.js +1 -1
- package/docs/docs/_clisettings.mdx +6 -0
- package/docs/docs/cmd/app/permission/permission-add.mdx +5 -5
- package/docs/docs/cmd/cli/cli-consent.mdx +1 -1
- package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-add.mdx +12 -12
- package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-get.mdx +14 -14
- package/docs/docs/cmd/entra/enterpriseapp/enterpriseapp-list.mdx +5 -5
- package/docs/docs/cmd/entra/group/group-user-list.mdx +7 -7
- package/docs/docs/cmd/entra/m365group/m365group-conversation-post-list.mdx +5 -5
- package/docs/docs/cmd/entra/m365group/m365group-recyclebinitem-list.mdx +3 -3
- package/docs/docs/cmd/entra/m365group/m365group-report-activitystorage.mdx +2 -2
- package/docs/docs/cmd/entra/m365group/m365group-user-list.mdx +1 -1
- package/docs/docs/cmd/external/item/item-add.mdx +3 -3
- package/docs/docs/cmd/file/file-move.mdx +79 -0
- package/docs/docs/cmd/flow/recyclebinitem/recyclebinitem-list.mdx +132 -0
- package/docs/docs/cmd/flow/recyclebinitem/recyclebinitem-restore.mdx +55 -0
- package/docs/docs/cmd/onenote/notebook/notebook-add.mdx +169 -0
- package/docs/docs/cmd/outlook/message/message-get.mdx +5 -5
- package/docs/docs/cmd/setup.mdx +16 -3
- package/docs/docs/cmd/spfx/project/project-github-workflow-add.mdx +12 -11
- package/docs/docs/cmd/spo/applicationcustomizer/applicationcustomizer-get.mdx +5 -6
- package/docs/docs/cmd/spo/cdn/cdn-get.mdx +1 -1
- package/docs/docs/cmd/spo/cdn/cdn-origin-add.mdx +1 -1
- package/docs/docs/cmd/spo/cdn/cdn-origin-list.mdx +1 -1
- package/docs/docs/cmd/spo/cdn/cdn-origin-remove.mdx +1 -1
- package/docs/docs/cmd/spo/cdn/cdn-policy-list.mdx +1 -1
- package/docs/docs/cmd/spo/cdn/cdn-policy-set.mdx +1 -1
- package/docs/docs/cmd/spo/externaluser/externaluser-list.mdx +1 -1
- package/docs/docs/cmd/spo/file/file-copy.mdx +12 -119
- package/docs/docs/cmd/spo/folder/folder-set.mdx +6 -0
- package/docs/docs/cmd/spo/folder/folder-sharinglink-add.mdx +125 -0
- package/docs/docs/cmd/spo/folder/folder-sharinglink-clear.mdx +50 -0
- package/docs/docs/cmd/spo/folder/folder-sharinglink-remove.mdx +50 -0
- package/docs/docs/cmd/spo/hidedefaultthemes/hidedefaultthemes-get.mdx +1 -1
- package/docs/docs/cmd/spo/hidedefaultthemes/hidedefaultthemes-set.mdx +1 -1
- package/docs/docs/cmd/spo/homesite/homesite-remove.mdx +1 -1
- package/docs/docs/cmd/spo/knowledgehub/knowledgehub-get.mdx +1 -1
- package/docs/docs/cmd/spo/knowledgehub/knowledgehub-remove.mdx +1 -1
- package/docs/docs/cmd/spo/knowledgehub/knowledgehub-set.mdx +1 -1
- package/docs/docs/cmd/spo/list/list-list.mdx +7 -5
- package/docs/docs/cmd/spo/orgassetslibrary/orgassetslibrary-add.mdx +1 -1
- package/docs/docs/cmd/spo/orgassetslibrary/orgassetslibrary-list.mdx +1 -1
- package/docs/docs/cmd/spo/orgassetslibrary/orgassetslibrary-remove.mdx +1 -1
- package/docs/docs/cmd/spo/orgnewssite/orgnewssite-list.mdx +1 -1
- package/docs/docs/cmd/spo/orgnewssite/orgnewssite-remove.mdx +1 -1
- package/docs/docs/cmd/spo/orgnewssite/orgnewssite-set.mdx +1 -1
- package/docs/docs/cmd/spo/page/page-remove.mdx +30 -12
- package/docs/docs/cmd/spo/page/page-section-add.mdx +57 -2
- package/docs/docs/cmd/spo/site/site-admin-add.mdx +67 -0
- package/docs/docs/cmd/spo/site/site-admin-list.mdx +64 -12
- package/docs/docs/cmd/spo/site/site-admin-remove.mdx +67 -0
- package/docs/docs/cmd/spo/site/site-appcatalog-add.mdx +1 -1
- package/docs/docs/cmd/spo/site/site-appcatalog-remove.mdx +3 -12
- package/docs/docs/cmd/spo/site/site-commsite-enable.mdx +1 -1
- package/docs/docs/cmd/spo/site/site-list.mdx +6 -4
- package/docs/docs/cmd/spo/site/site-remove.mdx +3 -0
- package/docs/docs/cmd/spo/site/site-set.mdx +1 -1
- package/docs/docs/cmd/spo/site/site-sharingpermission-set.mdx +58 -0
- package/docs/docs/cmd/spo/storageentity/storageentity-remove.mdx +1 -1
- package/docs/docs/cmd/spo/storageentity/storageentity-set.mdx +1 -1
- package/docs/docs/cmd/spo/tenant/tenant-appcatalog-add.mdx +1 -1
- package/docs/docs/cmd/spo/tenant/tenant-appcatalogurl-get.mdx +1 -1
- package/docs/docs/cmd/spo/tenant/tenant-recyclebinitem-list.mdx +1 -1
- package/docs/docs/cmd/spo/tenant/tenant-recyclebinitem-remove.mdx +1 -1
- package/docs/docs/cmd/spo/tenant/tenant-recyclebinitem-restore.mdx +49 -2
- package/docs/docs/cmd/spo/tenant/tenant-settings-list.mdx +1 -1
- package/docs/docs/cmd/spo/theme/theme-apply.mdx +1 -1
- package/docs/docs/cmd/spo/theme/theme-get.mdx +1 -1
- package/docs/docs/cmd/spo/theme/theme-list.mdx +1 -1
- package/docs/docs/cmd/spo/theme/theme-remove.mdx +1 -1
- package/docs/docs/cmd/spo/theme/theme-set.mdx +1 -1
- package/docs/docs/cmd/spo/user/user-get.mdx +35 -9
- package/docs/docs/cmd/spp/contentcenter/contentcenter-list.mdx +287 -0
- package/docs/docs/cmd/teams/meeting/meeting-transcript-get.mdx +132 -0
- package/docs/docs/cmd/viva/engage/engage-community-list.mdx +81 -0
- package/npm-shrinkwrap.json +205 -377
- package/package.json +16 -17
package/dist/request.js
CHANGED
|
@@ -4,6 +4,7 @@ import auth, { Auth } from './Auth.js';
|
|
|
4
4
|
import { app } from './utils/app.js';
|
|
5
5
|
import { formatting } from './utils/formatting.js';
|
|
6
6
|
import { timings } from './cli/timings.js';
|
|
7
|
+
import { timersUtil } from './utils/timersUtil.js';
|
|
7
8
|
class Request {
|
|
8
9
|
set debug(debug) {
|
|
9
10
|
// if the value to set is the same as current value return early to avoid
|
|
@@ -125,76 +126,60 @@ class Request {
|
|
|
125
126
|
options.method = 'HEAD';
|
|
126
127
|
return this.execute(options);
|
|
127
128
|
}
|
|
128
|
-
execute(options
|
|
129
|
+
async execute(options) {
|
|
129
130
|
const start = process.hrtime.bigint();
|
|
130
131
|
if (!this._logger) {
|
|
131
|
-
|
|
132
|
+
throw 'Logger not set on the request object';
|
|
132
133
|
}
|
|
133
134
|
this.updateRequestForCloudType(options, auth.connection.cloudType);
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
.
|
|
146
|
-
|
|
147
|
-
if (options.headers['x-anonymous']) {
|
|
148
|
-
delete options.headers['x-anonymous'];
|
|
149
|
-
}
|
|
150
|
-
if (options.headers['x-resource']) {
|
|
151
|
-
delete options.headers['x-resource'];
|
|
152
|
-
}
|
|
153
|
-
if (accessToken !== '') {
|
|
154
|
-
options.headers.authorization = `Bearer ${accessToken}`;
|
|
155
|
-
}
|
|
156
|
-
}
|
|
157
|
-
const proxyUrl = process.env.HTTP_PROXY || process.env.HTTPS_PROXY;
|
|
158
|
-
if (proxyUrl) {
|
|
159
|
-
options.proxy = this.createProxyConfigFromUrl(proxyUrl);
|
|
135
|
+
try {
|
|
136
|
+
let accessToken = '';
|
|
137
|
+
if (options.headers && options.headers['x-anonymous']) {
|
|
138
|
+
accessToken = '';
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
const url = options.headers && options.headers['x-resource'] ? options.headers['x-resource'] : options.url;
|
|
142
|
+
const resource = Auth.getResourceFromUrl(url);
|
|
143
|
+
accessToken = await auth.ensureAccessToken(resource, this._logger, this._debug);
|
|
144
|
+
}
|
|
145
|
+
if (options.headers) {
|
|
146
|
+
if (options.headers['x-anonymous']) {
|
|
147
|
+
delete options.headers['x-anonymous'];
|
|
160
148
|
}
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
.then((res) => {
|
|
164
|
-
if (resolve) {
|
|
165
|
-
resolve((options.responseType === 'stream' || options.fullResponse) ? res : res.data);
|
|
149
|
+
if (options.headers['x-resource']) {
|
|
150
|
+
delete options.headers['x-resource'];
|
|
166
151
|
}
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
timings.api.push(Number(end - start));
|
|
170
|
-
_resolve((options.responseType === 'stream' || options.fullResponse) ? res : res.data);
|
|
152
|
+
if (accessToken !== '') {
|
|
153
|
+
options.headers.authorization = `Bearer ${accessToken}`;
|
|
171
154
|
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
155
|
+
}
|
|
156
|
+
const proxyUrl = process.env.HTTP_PROXY || process.env.HTTPS_PROXY;
|
|
157
|
+
if (proxyUrl) {
|
|
158
|
+
options.proxy = this.createProxyConfigFromUrl(proxyUrl);
|
|
159
|
+
}
|
|
160
|
+
const res = await this.req(options);
|
|
161
|
+
const end = process.hrtime.bigint();
|
|
162
|
+
timings.api.push(Number(end - start));
|
|
163
|
+
return options.responseType === 'stream' || options.fullResponse ?
|
|
164
|
+
res :
|
|
165
|
+
res.data;
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
const end = process.hrtime.bigint();
|
|
169
|
+
timings.api.push(Number(end - start));
|
|
170
|
+
if (error && error.response && (error.response.status === 429 || error.response.status === 503)) {
|
|
171
|
+
let retryAfter = parseInt(error.response.headers['retry-after'] || '10');
|
|
172
|
+
if (isNaN(retryAfter)) {
|
|
173
|
+
retryAfter = 10;
|
|
185
174
|
}
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
reject(error);
|
|
189
|
-
}
|
|
190
|
-
else {
|
|
191
|
-
const end = process.hrtime.bigint();
|
|
192
|
-
timings.api.push(Number(end - start));
|
|
193
|
-
_reject(error);
|
|
194
|
-
}
|
|
175
|
+
if (this._debug) {
|
|
176
|
+
await this._logger.log(`Request throttled. Waiting ${retryAfter} sec before retrying...`);
|
|
195
177
|
}
|
|
196
|
-
|
|
197
|
-
|
|
178
|
+
await timersUtil.setTimeout(retryAfter * 1000);
|
|
179
|
+
return this.execute(options);
|
|
180
|
+
}
|
|
181
|
+
throw error;
|
|
182
|
+
}
|
|
198
183
|
}
|
|
199
184
|
updateRequestForCloudType(options, cloudType) {
|
|
200
185
|
const url = new URL(options.url);
|
package/dist/settingsNames.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
const settingsNames = {
|
|
2
2
|
authType: 'authType',
|
|
3
3
|
autoOpenLinksInBrowser: 'autoOpenLinksInBrowser',
|
|
4
|
+
clientId: 'clientId',
|
|
5
|
+
clientSecret: 'clientSecret',
|
|
6
|
+
clientCertificateFile: 'clientCertificateFile',
|
|
7
|
+
clientCertificateBase64Encoded: 'clientCertificateBase64Encoded',
|
|
8
|
+
clientCertificatePassword: 'clientCertificatePassword',
|
|
4
9
|
copyDeviceCodeToClipboard: 'copyDeviceCodeToClipboard',
|
|
5
10
|
csvEscape: 'csvEscape',
|
|
6
11
|
csvHeader: 'csvHeader',
|
|
@@ -16,7 +21,8 @@ const settingsNames = {
|
|
|
16
21
|
prompt: 'prompt',
|
|
17
22
|
promptListPageSize: 'promptListPageSize',
|
|
18
23
|
showHelpOnFailure: 'showHelpOnFailure',
|
|
19
|
-
showSpinner: 'showSpinner'
|
|
24
|
+
showSpinner: 'showSpinner',
|
|
25
|
+
tenantId: 'tenantId'
|
|
20
26
|
};
|
|
21
27
|
export { settingsNames };
|
|
22
28
|
//# sourceMappingURL=settingsNames.js.map
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import request from "../request.js";
|
|
2
|
+
export const driveUtil = {
|
|
3
|
+
/**
|
|
4
|
+
* Retrieves the Drive associated with the specified site and URL.
|
|
5
|
+
* @param siteId Site ID
|
|
6
|
+
* @param url Drive URL
|
|
7
|
+
* @returns The Drive associated with the drive URL.
|
|
8
|
+
*/
|
|
9
|
+
async getDriveByUrl(siteId, url) {
|
|
10
|
+
const requestOptions = {
|
|
11
|
+
url: `https://graph.microsoft.com/v1.0/sites/${siteId}/drives?$select=webUrl,id`,
|
|
12
|
+
headers: {
|
|
13
|
+
accept: 'application/json;odata.metadata=none'
|
|
14
|
+
},
|
|
15
|
+
responseType: 'json'
|
|
16
|
+
};
|
|
17
|
+
const drives = await request.get(requestOptions);
|
|
18
|
+
const lowerCaseFolderUrl = url.href.toLowerCase();
|
|
19
|
+
const drive = drives.value
|
|
20
|
+
.sort((a, b) => b.webUrl.localeCompare(a.webUrl))
|
|
21
|
+
.find((d) => {
|
|
22
|
+
const driveUrl = d.webUrl.toLowerCase();
|
|
23
|
+
return lowerCaseFolderUrl.startsWith(driveUrl) &&
|
|
24
|
+
(driveUrl.length === lowerCaseFolderUrl.length ||
|
|
25
|
+
lowerCaseFolderUrl[driveUrl.length] === '/');
|
|
26
|
+
});
|
|
27
|
+
if (!drive) {
|
|
28
|
+
throw `Drive '${url.href}' not found`;
|
|
29
|
+
}
|
|
30
|
+
return drive;
|
|
31
|
+
},
|
|
32
|
+
/**
|
|
33
|
+
* Retrieves the ID of a drive item (file, folder, etc.) associated with the given drive and item URL.
|
|
34
|
+
* @param drive The Drive object containing the item
|
|
35
|
+
* @param itemUrl Item URL
|
|
36
|
+
* @returns Drive item ID
|
|
37
|
+
*/
|
|
38
|
+
async getDriveItemId(drive, itemUrl) {
|
|
39
|
+
const relativeItemUrl = itemUrl.href.replace(new RegExp(`${drive.webUrl}`, 'i'), '').replace(/\/+$/, '');
|
|
40
|
+
const requestOptions = {
|
|
41
|
+
url: `https://graph.microsoft.com/v1.0/drives/${drive.id}/root${relativeItemUrl ? `:${relativeItemUrl}` : ''}?$select=id`,
|
|
42
|
+
headers: {
|
|
43
|
+
accept: 'application/json;odata.metadata=none'
|
|
44
|
+
},
|
|
45
|
+
responseType: 'json'
|
|
46
|
+
};
|
|
47
|
+
const driveItem = await request.get(requestOptions);
|
|
48
|
+
return driveItem?.id;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
//# sourceMappingURL=driveUtil.js.map
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import request from '../request.js';
|
|
3
|
+
import { odata } from './odata.js';
|
|
4
|
+
async function getCertificateBase64Encoded({ options, logger, debug }) {
|
|
5
|
+
if (options.certificateBase64Encoded) {
|
|
6
|
+
return options.certificateBase64Encoded;
|
|
7
|
+
}
|
|
8
|
+
if (debug) {
|
|
9
|
+
await logger.logToStderr(`Reading existing ${options.certificateFile}...`);
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
return fs.readFileSync(options.certificateFile, { encoding: 'base64' });
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
throw new Error(`Error reading certificate file: ${e}. Please add the certificate using base64 option '--certificateBase64Encoded'.`);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
async function createServicePrincipal(appId) {
|
|
19
|
+
const requestOptions = {
|
|
20
|
+
url: `https://graph.microsoft.com/v1.0/myorganization/servicePrincipals`,
|
|
21
|
+
headers: {
|
|
22
|
+
'content-type': 'application/json'
|
|
23
|
+
},
|
|
24
|
+
data: {
|
|
25
|
+
appId: appId
|
|
26
|
+
},
|
|
27
|
+
responseType: 'json'
|
|
28
|
+
};
|
|
29
|
+
return request.post(requestOptions);
|
|
30
|
+
}
|
|
31
|
+
async function grantOAuth2Permission({ appId, resourceId, scopeName }) {
|
|
32
|
+
const grantAdminConsentApplicationRequestOptions = {
|
|
33
|
+
url: `https://graph.microsoft.com/v1.0/myorganization/oauth2PermissionGrants`,
|
|
34
|
+
headers: {
|
|
35
|
+
accept: 'application/json;odata.metadata=none'
|
|
36
|
+
},
|
|
37
|
+
responseType: 'json',
|
|
38
|
+
data: {
|
|
39
|
+
clientId: appId,
|
|
40
|
+
consentType: "AllPrincipals",
|
|
41
|
+
principalId: null,
|
|
42
|
+
resourceId: resourceId,
|
|
43
|
+
scope: scopeName
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
return request.post(grantAdminConsentApplicationRequestOptions);
|
|
47
|
+
}
|
|
48
|
+
async function addRoleToServicePrincipal({ objectId, resourceId, appRoleId }) {
|
|
49
|
+
const requestOptions = {
|
|
50
|
+
url: `https://graph.microsoft.com/v1.0/myorganization/servicePrincipals/${objectId}/appRoleAssignments`,
|
|
51
|
+
headers: {
|
|
52
|
+
'Content-Type': 'application/json'
|
|
53
|
+
},
|
|
54
|
+
responseType: 'json',
|
|
55
|
+
data: {
|
|
56
|
+
appRoleId: appRoleId,
|
|
57
|
+
principalId: objectId,
|
|
58
|
+
resourceId: resourceId
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
return request.post(requestOptions);
|
|
62
|
+
}
|
|
63
|
+
async function getRequiredResourceAccessForApis({ servicePrincipals, apis, scopeType, logger, debug }) {
|
|
64
|
+
if (!apis) {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
const resolvedApis = [];
|
|
68
|
+
const requestedApis = apis.split(',').map(a => a.trim());
|
|
69
|
+
for (const api of requestedApis) {
|
|
70
|
+
const pos = api.lastIndexOf('/');
|
|
71
|
+
const permissionName = api.substring(pos + 1);
|
|
72
|
+
const servicePrincipalName = api.substring(0, pos);
|
|
73
|
+
if (debug) {
|
|
74
|
+
await logger.logToStderr(`Resolving ${api}...`);
|
|
75
|
+
await logger.logToStderr(`Permission name: ${permissionName}`);
|
|
76
|
+
await logger.logToStderr(`Service principal name: ${servicePrincipalName}`);
|
|
77
|
+
}
|
|
78
|
+
const servicePrincipal = servicePrincipals.find(sp => (sp.servicePrincipalNames.indexOf(servicePrincipalName) > -1 ||
|
|
79
|
+
sp.servicePrincipalNames.indexOf(`${servicePrincipalName}/`) > -1));
|
|
80
|
+
if (!servicePrincipal) {
|
|
81
|
+
throw `Service principal ${servicePrincipalName} not found`;
|
|
82
|
+
}
|
|
83
|
+
const scopesOfType = scopeType === 'Scope' ? servicePrincipal.oauth2PermissionScopes : servicePrincipal.appRoles;
|
|
84
|
+
const permission = scopesOfType.find(scope => scope.value === permissionName);
|
|
85
|
+
if (!permission) {
|
|
86
|
+
throw `Permission ${permissionName} for service principal ${servicePrincipalName} not found`;
|
|
87
|
+
}
|
|
88
|
+
let resolvedApi = resolvedApis.find(a => a.resourceAppId === servicePrincipal.appId);
|
|
89
|
+
if (!resolvedApi) {
|
|
90
|
+
resolvedApi = {
|
|
91
|
+
resourceAppId: servicePrincipal.appId,
|
|
92
|
+
resourceAccess: []
|
|
93
|
+
};
|
|
94
|
+
resolvedApis.push(resolvedApi);
|
|
95
|
+
}
|
|
96
|
+
const resourceAccessPermission = {
|
|
97
|
+
id: permission.id,
|
|
98
|
+
type: scopeType
|
|
99
|
+
};
|
|
100
|
+
resolvedApi.resourceAccess.push(resourceAccessPermission);
|
|
101
|
+
updateAppPermissions({
|
|
102
|
+
spId: servicePrincipal.id,
|
|
103
|
+
resourceAccessPermission,
|
|
104
|
+
oAuth2PermissionValue: permission.value
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
return resolvedApis;
|
|
108
|
+
}
|
|
109
|
+
function updateAppPermissions({ spId, resourceAccessPermission, oAuth2PermissionValue }) {
|
|
110
|
+
// During API resolution, we store globally both app role assignments and oauth2permissions
|
|
111
|
+
// So that we'll be able to parse them during the admin consent process
|
|
112
|
+
let existingPermission = entraApp.appPermissions.find(oauth => oauth.resourceId === spId);
|
|
113
|
+
if (!existingPermission) {
|
|
114
|
+
existingPermission = {
|
|
115
|
+
resourceId: spId,
|
|
116
|
+
resourceAccess: [],
|
|
117
|
+
scope: []
|
|
118
|
+
};
|
|
119
|
+
entraApp.appPermissions.push(existingPermission);
|
|
120
|
+
}
|
|
121
|
+
if (resourceAccessPermission.type === 'Scope' && oAuth2PermissionValue && !existingPermission.scope.find(scp => scp === oAuth2PermissionValue)) {
|
|
122
|
+
existingPermission.scope.push(oAuth2PermissionValue);
|
|
123
|
+
}
|
|
124
|
+
if (!existingPermission.resourceAccess.find(res => res.id === resourceAccessPermission.id)) {
|
|
125
|
+
existingPermission.resourceAccess.push(resourceAccessPermission);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
export const entraApp = {
|
|
129
|
+
appPermissions: [],
|
|
130
|
+
createAppRegistration: async ({ options, apis, logger, verbose, debug }) => {
|
|
131
|
+
const applicationInfo = {
|
|
132
|
+
displayName: options.name,
|
|
133
|
+
signInAudience: options.multitenant ? 'AzureADMultipleOrgs' : 'AzureADMyOrg'
|
|
134
|
+
};
|
|
135
|
+
if (apis.length > 0) {
|
|
136
|
+
applicationInfo.requiredResourceAccess = apis;
|
|
137
|
+
}
|
|
138
|
+
if (options.redirectUris) {
|
|
139
|
+
applicationInfo[options.platform] = {
|
|
140
|
+
redirectUris: options.redirectUris.split(',').map(u => u.trim())
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
if (options.implicitFlow) {
|
|
144
|
+
if (!applicationInfo.web) {
|
|
145
|
+
applicationInfo.web = {};
|
|
146
|
+
}
|
|
147
|
+
applicationInfo.web.implicitGrantSettings = {
|
|
148
|
+
enableAccessTokenIssuance: true,
|
|
149
|
+
enableIdTokenIssuance: true
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
if (options.certificateFile || options.certificateBase64Encoded) {
|
|
153
|
+
const certificateBase64Encoded = await getCertificateBase64Encoded({ options, logger, debug });
|
|
154
|
+
const newKeyCredential = {
|
|
155
|
+
type: 'AsymmetricX509Cert',
|
|
156
|
+
usage: 'Verify',
|
|
157
|
+
displayName: options.certificateDisplayName,
|
|
158
|
+
key: certificateBase64Encoded
|
|
159
|
+
};
|
|
160
|
+
applicationInfo.keyCredentials = [newKeyCredential];
|
|
161
|
+
}
|
|
162
|
+
if (options.allowPublicClientFlows) {
|
|
163
|
+
applicationInfo.isFallbackPublicClient = true;
|
|
164
|
+
}
|
|
165
|
+
if (verbose) {
|
|
166
|
+
await logger.logToStderr(`Creating Microsoft Entra app registration...`);
|
|
167
|
+
}
|
|
168
|
+
const createApplicationRequestOptions = {
|
|
169
|
+
url: `https://graph.microsoft.com/v1.0/myorganization/applications`,
|
|
170
|
+
headers: {
|
|
171
|
+
accept: 'application/json;odata.metadata=none'
|
|
172
|
+
},
|
|
173
|
+
responseType: 'json',
|
|
174
|
+
data: applicationInfo
|
|
175
|
+
};
|
|
176
|
+
return request.post(createApplicationRequestOptions);
|
|
177
|
+
},
|
|
178
|
+
grantAdminConsent: async ({ appInfo, appPermissions, adminConsent, logger, debug }) => {
|
|
179
|
+
if (!adminConsent || appPermissions.length === 0) {
|
|
180
|
+
return appInfo;
|
|
181
|
+
}
|
|
182
|
+
const sp = await createServicePrincipal(appInfo.appId);
|
|
183
|
+
if (debug) {
|
|
184
|
+
await logger.logToStderr("Service principal created, returned object id: " + sp.id);
|
|
185
|
+
}
|
|
186
|
+
const tasks = [];
|
|
187
|
+
appPermissions.forEach(async (permission) => {
|
|
188
|
+
if (permission.scope.length > 0) {
|
|
189
|
+
tasks.push(grantOAuth2Permission({
|
|
190
|
+
appId: sp.id,
|
|
191
|
+
resourceId: permission.resourceId,
|
|
192
|
+
scopeName: permission.scope.join(' ')
|
|
193
|
+
}));
|
|
194
|
+
if (debug) {
|
|
195
|
+
await logger.logToStderr(`Admin consent granted for following resource ${permission.resourceId}, with delegated permissions: ${permission.scope.join(',')}`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
permission.resourceAccess.filter(access => access.type === "Role").forEach(async (access) => {
|
|
199
|
+
tasks.push(addRoleToServicePrincipal({
|
|
200
|
+
objectId: sp.id,
|
|
201
|
+
resourceId: permission.resourceId,
|
|
202
|
+
appRoleId: access.id
|
|
203
|
+
}));
|
|
204
|
+
if (debug) {
|
|
205
|
+
await logger.logToStderr(`Admin consent granted for following resource ${permission.resourceId}, with application permission: ${access.id}`);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
await Promise.all(tasks);
|
|
210
|
+
return appInfo;
|
|
211
|
+
},
|
|
212
|
+
resolveApis: async ({ options, manifest, logger, verbose, debug }) => {
|
|
213
|
+
if (!options.apisDelegated && !options.apisApplication
|
|
214
|
+
&& (typeof manifest?.requiredResourceAccess === 'undefined' || manifest.requiredResourceAccess.length === 0)) {
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
if (verbose) {
|
|
218
|
+
await logger.logToStderr('Resolving requested APIs...');
|
|
219
|
+
}
|
|
220
|
+
const servicePrincipals = await odata.getAllItems(`https://graph.microsoft.com/v1.0/myorganization/servicePrincipals?$select=appId,appRoles,id,oauth2PermissionScopes,servicePrincipalNames`);
|
|
221
|
+
let resolvedApis = [];
|
|
222
|
+
if (options.apisDelegated || options.apisApplication) {
|
|
223
|
+
resolvedApis = await getRequiredResourceAccessForApis({
|
|
224
|
+
servicePrincipals,
|
|
225
|
+
apis: options.apisDelegated,
|
|
226
|
+
scopeType: 'Scope',
|
|
227
|
+
logger,
|
|
228
|
+
debug
|
|
229
|
+
});
|
|
230
|
+
if (verbose) {
|
|
231
|
+
await logger.logToStderr(`Resolved delegated permissions: ${JSON.stringify(resolvedApis, null, 2)}`);
|
|
232
|
+
}
|
|
233
|
+
const resolvedApplicationApis = await getRequiredResourceAccessForApis({
|
|
234
|
+
servicePrincipals,
|
|
235
|
+
apis: options.apisApplication,
|
|
236
|
+
scopeType: 'Role',
|
|
237
|
+
logger,
|
|
238
|
+
debug
|
|
239
|
+
});
|
|
240
|
+
if (verbose) {
|
|
241
|
+
await logger.logToStderr(`Resolved application permissions: ${JSON.stringify(resolvedApplicationApis, null, 2)}`);
|
|
242
|
+
}
|
|
243
|
+
// merge resolved application APIs onto resolved delegated APIs
|
|
244
|
+
resolvedApplicationApis.forEach(resolvedRequiredResource => {
|
|
245
|
+
const requiredResource = resolvedApis.find(api => api.resourceAppId === resolvedRequiredResource.resourceAppId);
|
|
246
|
+
if (requiredResource) {
|
|
247
|
+
requiredResource.resourceAccess.push(...resolvedRequiredResource.resourceAccess);
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
resolvedApis.push(resolvedRequiredResource);
|
|
251
|
+
}
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
const manifestApis = manifest.requiredResourceAccess;
|
|
256
|
+
manifestApis.forEach(manifestApi => {
|
|
257
|
+
resolvedApis.push(manifestApi);
|
|
258
|
+
const app = servicePrincipals.find(servicePrincipals => servicePrincipals.appId === manifestApi.resourceAppId);
|
|
259
|
+
if (app) {
|
|
260
|
+
manifestApi.resourceAccess.forEach((res => {
|
|
261
|
+
const resourceAccessPermission = {
|
|
262
|
+
id: res.id,
|
|
263
|
+
type: res.type
|
|
264
|
+
};
|
|
265
|
+
const oAuthValue = app.oauth2PermissionScopes.find(scp => scp.id === res.id)?.value;
|
|
266
|
+
updateAppPermissions({
|
|
267
|
+
spId: app.id,
|
|
268
|
+
resourceAccessPermission,
|
|
269
|
+
oAuth2PermissionValue: oAuthValue
|
|
270
|
+
});
|
|
271
|
+
}));
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
if (verbose) {
|
|
276
|
+
await logger.logToStderr(`Merged delegated and application permissions: ${JSON.stringify(resolvedApis, null, 2)}`);
|
|
277
|
+
await logger.logToStderr(`App role assignments: ${JSON.stringify(entraApp.appPermissions.flatMap(permission => permission.resourceAccess.filter(access => access.type === "Role")), null, 2)}`);
|
|
278
|
+
await logger.logToStderr(`OAuth2 permissions: ${JSON.stringify(entraApp.appPermissions.flatMap(permission => permission.scope), null, 2)}`);
|
|
279
|
+
}
|
|
280
|
+
return resolvedApis;
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
//# sourceMappingURL=entraApp.js.map
|
package/dist/utils/spo.js
CHANGED
|
@@ -12,16 +12,6 @@ import { RoleType } from '../m365/spo/commands/roledefinition/RoleType.js';
|
|
|
12
12
|
import { entraGroup } from './entraGroup.js';
|
|
13
13
|
import { SharingCapabilities } from '../m365/spo/commands/site/SharingCapabilities.js';
|
|
14
14
|
import { setTimeout } from 'timers/promises';
|
|
15
|
-
export var CreateCopyJobsNameConflictBehavior;
|
|
16
|
-
(function (CreateCopyJobsNameConflictBehavior) {
|
|
17
|
-
CreateCopyJobsNameConflictBehavior[CreateCopyJobsNameConflictBehavior["Fail"] = 0] = "Fail";
|
|
18
|
-
CreateCopyJobsNameConflictBehavior[CreateCopyJobsNameConflictBehavior["Replace"] = 1] = "Replace";
|
|
19
|
-
CreateCopyJobsNameConflictBehavior[CreateCopyJobsNameConflictBehavior["Rename"] = 2] = "Rename";
|
|
20
|
-
})(CreateCopyJobsNameConflictBehavior || (CreateCopyJobsNameConflictBehavior = {}));
|
|
21
|
-
// Wrapping this into a settings object so we can alter the values in tests
|
|
22
|
-
export const settings = {
|
|
23
|
-
pollingInterval: 3000
|
|
24
|
-
};
|
|
25
15
|
export const spo = {
|
|
26
16
|
async getRequestDigest(siteUrl) {
|
|
27
17
|
const requestOptions = {
|
|
@@ -500,10 +490,10 @@ export const spo = {
|
|
|
500
490
|
* @param webUrl Web url
|
|
501
491
|
* @param email The email of the user
|
|
502
492
|
* @param logger the Logger object
|
|
503
|
-
* @param verbose set
|
|
493
|
+
* @param verbose set for verbose logging
|
|
504
494
|
*/
|
|
505
495
|
async getUserByEmail(webUrl, email, logger, verbose) {
|
|
506
|
-
if (verbose) {
|
|
496
|
+
if (verbose && logger) {
|
|
507
497
|
await logger.logToStderr(`Retrieving the spo user by email ${email}`);
|
|
508
498
|
}
|
|
509
499
|
const requestUrl = `${webUrl}/_api/web/siteusers/GetByEmail('${formatting.encodeQueryParameter(email)}')`;
|
|
@@ -574,10 +564,10 @@ export const spo = {
|
|
|
574
564
|
* @param webUrl Web url
|
|
575
565
|
* @param name The name of the group
|
|
576
566
|
* @param logger the Logger object
|
|
577
|
-
* @param verbose set
|
|
567
|
+
* @param verbose set for verbose logging
|
|
578
568
|
*/
|
|
579
569
|
async getGroupByName(webUrl, name, logger, verbose) {
|
|
580
|
-
if (verbose) {
|
|
570
|
+
if (verbose && logger) {
|
|
581
571
|
await logger.logToStderr(`Retrieving the group by name ${name}`);
|
|
582
572
|
}
|
|
583
573
|
const requestUrl = `${webUrl}/_api/web/sitegroups/GetByName('${formatting.encodeQueryParameter(name)}')`;
|
|
@@ -596,10 +586,10 @@ export const spo = {
|
|
|
596
586
|
* @param webUrl Web url
|
|
597
587
|
* @param name the name of the role definition
|
|
598
588
|
* @param logger the Logger object
|
|
599
|
-
* @param
|
|
589
|
+
* @param verbose set for verbose logging
|
|
600
590
|
*/
|
|
601
|
-
async getRoleDefinitionByName(webUrl, name, logger,
|
|
602
|
-
if (
|
|
591
|
+
async getRoleDefinitionByName(webUrl, name, logger, verbose) {
|
|
592
|
+
if (verbose && logger) {
|
|
603
593
|
await logger.logToStderr(`Retrieving the role definitions for ${name}`);
|
|
604
594
|
}
|
|
605
595
|
const roledefinitions = await odata.getAllItems(`${webUrl}/_api/web/roledefinitions`);
|
|
@@ -1528,68 +1518,70 @@ export const spo = {
|
|
|
1528
1518
|
return (itemsResponse);
|
|
1529
1519
|
},
|
|
1530
1520
|
/**
|
|
1531
|
-
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1521
|
+
* Retrieves the file by id.
|
|
1522
|
+
* Returns a FileProperties object
|
|
1523
|
+
* @param webUrl Web url
|
|
1524
|
+
* @param id the id of the file
|
|
1525
|
+
* @param logger the Logger object
|
|
1526
|
+
* @param verbose set for verbose logging
|
|
1527
|
+
*/
|
|
1528
|
+
async getFileById(webUrl, id, logger, verbose) {
|
|
1529
|
+
if (verbose && logger) {
|
|
1530
|
+
await logger.logToStderr(`Retrieving the file with id ${id}`);
|
|
1531
|
+
}
|
|
1532
|
+
const requestUrl = `${webUrl}/_api/web/GetFileById('${formatting.encodeQueryParameter(id)}')`;
|
|
1533
|
+
const requestOptions = {
|
|
1534
|
+
url: requestUrl,
|
|
1535
|
+
headers: {
|
|
1536
|
+
'accept': 'application/json;odata=nometadata'
|
|
1537
|
+
},
|
|
1538
|
+
responseType: 'json'
|
|
1539
|
+
};
|
|
1540
|
+
const file = await request.get(requestOptions);
|
|
1541
|
+
return file;
|
|
1542
|
+
},
|
|
1543
|
+
/**
|
|
1544
|
+
* Gets the primary owner login from a site as admin.
|
|
1545
|
+
* @param adminUrl The SharePoint admin URL
|
|
1546
|
+
* @param siteId The site ID
|
|
1547
|
+
* @param logger The logger object
|
|
1548
|
+
* @param verbose If in verbose mode
|
|
1549
|
+
* @returns Owner login name
|
|
1537
1550
|
*/
|
|
1538
|
-
async
|
|
1551
|
+
async getPrimaryAdminLoginNameAsAdmin(adminUrl, siteId, logger, verbose) {
|
|
1552
|
+
if (verbose) {
|
|
1553
|
+
await logger.logToStderr('Getting the primary admin login name...');
|
|
1554
|
+
}
|
|
1539
1555
|
const requestOptions = {
|
|
1540
|
-
url: `${
|
|
1556
|
+
url: `${adminUrl}/_api/SPO.Tenant/sites('${siteId}')?$select=OwnerLoginName`,
|
|
1541
1557
|
headers: {
|
|
1542
1558
|
accept: 'application/json;odata=nometadata'
|
|
1543
1559
|
},
|
|
1544
|
-
responseType: 'json'
|
|
1545
|
-
data: {
|
|
1546
|
-
destinationUri: destinationUrl,
|
|
1547
|
-
exportObjectUris: [sourceUrl],
|
|
1548
|
-
options: {
|
|
1549
|
-
NameConflictBehavior: options?.nameConflictBehavior ?? CreateCopyJobsNameConflictBehavior.Fail,
|
|
1550
|
-
AllowSchemaMismatch: true,
|
|
1551
|
-
BypassSharedLock: !!options?.bypassSharedLock,
|
|
1552
|
-
IgnoreVersionHistory: !!options?.ignoreVersionHistory,
|
|
1553
|
-
CustomizedItemName: options?.newName ? [options.newName] : undefined,
|
|
1554
|
-
SameWebCopyMoveOptimization: true
|
|
1555
|
-
}
|
|
1556
|
-
}
|
|
1560
|
+
responseType: 'json'
|
|
1557
1561
|
};
|
|
1558
|
-
const response = await request.
|
|
1559
|
-
return response.
|
|
1562
|
+
const response = await request.get(requestOptions);
|
|
1563
|
+
return response.OwnerLoginName;
|
|
1560
1564
|
},
|
|
1561
1565
|
/**
|
|
1562
|
-
*
|
|
1563
|
-
* @param
|
|
1564
|
-
* @param
|
|
1565
|
-
* @
|
|
1566
|
-
* @returns
|
|
1566
|
+
* Gets the primary owner login from a site.
|
|
1567
|
+
* @param siteUrl The site URL
|
|
1568
|
+
* @param logger The logger object
|
|
1569
|
+
* @param verbose If in verbose mode
|
|
1570
|
+
* @returns Owner login name
|
|
1567
1571
|
*/
|
|
1568
|
-
async
|
|
1572
|
+
async getPrimaryOwnerLoginFromSite(siteUrl, logger, verbose) {
|
|
1573
|
+
if (verbose) {
|
|
1574
|
+
await logger.logToStderr('Getting the primary admin login name...');
|
|
1575
|
+
}
|
|
1569
1576
|
const requestOptions = {
|
|
1570
|
-
url: `${
|
|
1577
|
+
url: `${siteUrl}/_api/site/owner`,
|
|
1571
1578
|
headers: {
|
|
1572
|
-
accept: 'application/json;odata=nometadata'
|
|
1579
|
+
'accept': 'application/json;odata=nometadata'
|
|
1573
1580
|
},
|
|
1574
|
-
responseType: 'json'
|
|
1575
|
-
data: {
|
|
1576
|
-
copyJobInfo: copyJobInfo
|
|
1577
|
-
}
|
|
1581
|
+
responseType: 'json'
|
|
1578
1582
|
};
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
await setTimeout(settings.pollingInterval);
|
|
1582
|
-
progress = await request.post(requestOptions);
|
|
1583
|
-
}
|
|
1584
|
-
const logs = progress.Logs.map(l => JSON.parse(l));
|
|
1585
|
-
// Check if the job has failed
|
|
1586
|
-
const errorLog = logs.find(l => l.Event === 'JobError');
|
|
1587
|
-
if (errorLog) {
|
|
1588
|
-
throw new Error(errorLog.Message);
|
|
1589
|
-
}
|
|
1590
|
-
// Get the destination object information
|
|
1591
|
-
const objectInfo = logs.find(l => l.Event === 'JobFinishedObjectInfo');
|
|
1592
|
-
return objectInfo;
|
|
1583
|
+
const responseContent = await request.get(requestOptions);
|
|
1584
|
+
return responseContent?.LoginName;
|
|
1593
1585
|
}
|
|
1594
1586
|
};
|
|
1595
1587
|
//# sourceMappingURL=spo.js.map
|