Skip to content

Commit 62a894e

Browse files
karthiknadigeleanorjboyd
authored andcommitted
feat: package manager permissions when using API
1 parent d65b796 commit 62a894e

File tree

3 files changed

+55
-78
lines changed

3 files changed

+55
-78
lines changed

src/common/localize.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,6 @@ export namespace EnvViewStrings {
148148
export namespace PermissionsCommon {
149149
export const allow = l10n.t('Allow');
150150
export const deny = l10n.t('Deny');
151-
export const confirmEachTime = l10n.t('Confirm each time');
152-
export const updatePermissions = l10n.t('Update permissions');
151+
export const ask = l10n.t('Ask');
152+
export const setPermissions = l10n.t('Set Permissions');
153153
}

src/features/permissions/packageManagerPermissions.ts

Lines changed: 50 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { l10n, SecretStorage } from 'vscode';
2-
import { pickExtensionForPermissions } from './pickers';
2+
import { pickExtension } from './pickers';
33
import { showInformationMessage, showWarningMessage } from '../../common/window.apis';
44
import { PermissionsCommon } from '../../common/localize';
55
import { traceLog } from '../../common/logging';
6-
import { allExternalExtensions } from '../../common/extension.apis';
6+
import { allExtensions } from '../../common/extension.apis';
77
import { getCallingExtension } from '../../common/utils/frameUtils';
88

99
type PermissionType = 'Ask' | 'Allow' | 'Deny';
@@ -42,7 +42,7 @@ export class PackageManagerPermissionsImpl implements PackageManagerPermissions
4242
}
4343

4444
async resetPermissions(): Promise<void> {
45-
const ids = allExternalExtensions().map((e) => `python-envs.permissions.packageManagement.${e.id}`);
45+
const ids = allExtensions().map((e) => `python-envs.permissions.packageManagement.${e.id}`);
4646
await Promise.all(ids.map((id) => this.secretStore.delete(id)));
4747
traceLog('All package management permissions have been reset.');
4848
}
@@ -69,72 +69,75 @@ function getPackageListAsString(packages: string[]): string {
6969
return result;
7070
}
7171

72-
async function configureFirstTimePermissions(
73-
extensionId: string,
74-
pm: PackageManagerPermissions,
75-
): Promise<PermissionType> {
72+
async function configureFirstTimePermissions(extensionId: string, pm: PackageManagerPermissions) {
7673
const response = await showInformationMessage(
77-
l10n.t('The {0} extension wants to make changes to packages in your Python environments', extensionId),
74+
l10n.t(
75+
'The extension {0} wants to install, upgrade, or uninstall packages from your Python environments',
76+
extensionId,
77+
),
7878
{ modal: true },
7979
{
80-
title: PermissionsCommon.confirmEachTime,
80+
title: PermissionsCommon.ask,
8181
isCloseAffordance: true,
8282
},
8383
{ title: PermissionsCommon.allow },
8484
{ title: PermissionsCommon.deny },
8585
);
86-
if (response?.title === PermissionsCommon.confirmEachTime) {
86+
if (response?.title === PermissionsCommon.ask) {
8787
await pm.setPermissions(extensionId, 'Ask');
8888
traceLog('Package management permissions set to "ask" for extension: ', extensionId);
89-
return 'Ask';
89+
return true;
9090
} else if (response?.title === PermissionsCommon.allow) {
9191
await pm.setPermissions(extensionId, 'Allow');
9292
traceLog('Package management permissions set to "allow" for extension: ', extensionId);
93-
return 'Allow';
93+
return true;
9494
} else if (response?.title === PermissionsCommon.deny) {
9595
await pm.setPermissions(extensionId, 'Deny');
9696
traceLog('Package management permissions set to "deny" for extension: ', extensionId);
97-
return 'Deny';
97+
return false;
9898
} else {
99-
traceLog('Package management permissions not set (default: ask) for extension: ', extensionId);
100-
return 'Ask';
99+
traceLog('Package management permissions not changed for extension: ', extensionId);
100+
return false;
101101
}
102102
}
103103

104-
async function notifyPermissionsDenied(pm: PackageManagerPermissions, extensionId: string, mode: string) {
105-
let message = l10n.t(
106-
'The extension `{0}` is not permitted to install packages into your Python environment.',
107-
extensionId,
108-
);
109-
if (mode === 'uninstall') {
110-
message = l10n.t(
111-
'The extension `{0}` is not permitted to uninstall packages from your Python environment.',
112-
extensionId,
113-
);
114-
} else if (mode === 'changes') {
115-
message = l10n.t(
116-
'The extension `{0}` is not permitted to make changes to your Python environment.',
117-
extensionId,
118-
);
119-
}
120-
const response = await showWarningMessage(message, PermissionsCommon.updatePermissions);
121-
if (response === PermissionsCommon.updatePermissions) {
122-
handlePermissionsCommand(pm, extensionId);
104+
export async function checkPackageManagementPermissions(
105+
pm: PackageManagerPermissions,
106+
mode: 'install' | 'uninstall' | 'changes',
107+
packages?: string[],
108+
): Promise<boolean> {
109+
const extensionId = getCallingExtension();
110+
111+
const currentPermission = await pm.getPermissions(extensionId);
112+
if (currentPermission === 'Allow') {
113+
return true;
114+
} else if (currentPermission === 'Deny') {
115+
traceLog(`Package management permissions denied for extension: ${extensionId}`);
116+
setImmediate(async () => {
117+
const response = await showWarningMessage(
118+
l10n.t(
119+
'The extension `{0}` is not allowed to {1} packages into your Python environment.',
120+
extensionId,
121+
mode,
122+
),
123+
PermissionsCommon.setPermissions,
124+
);
125+
if (response === PermissionsCommon.setPermissions) {
126+
handlePermissionsCommand(pm, extensionId);
127+
}
128+
});
129+
return false;
130+
} else if (currentPermission === undefined) {
131+
return await configureFirstTimePermissions(extensionId, pm);
123132
}
124-
}
125133

126-
async function handleAskForPermissions(extensionId: string, mode: string, packages?: string[]) {
134+
// Below handles Permission level is 'Ask'
127135
let message = l10n.t('The extension `{0}` wants to install packages into your Python environment.', extensionId);
128136
if (mode === 'uninstall') {
129137
message = l10n.t('The extension `{0}` wants to uninstall packages from your Python environment.', extensionId);
130138
} else if (mode === 'changes') {
131139
message = l10n.t('The extension `{0}` wants to make changes to your Python environment.', extensionId);
132140
}
133-
traceLog(
134-
`Asking for package management permissions for extension ${extensionId} to ${mode}: ${
135-
packages ?? 'no packages listed'
136-
}`,
137-
);
138141

139142
const response = await showInformationMessage(
140143
message,
@@ -146,41 +149,15 @@ async function handleAskForPermissions(extensionId: string, mode: string, packag
146149
{ title: PermissionsCommon.deny, isCloseAffordance: true },
147150
);
148151
if (response?.title === PermissionsCommon.allow) {
149-
traceLog(`Package management permissions granted for extension this time: ${extensionId}`);
152+
traceLog(`Package management permissions granted for extension: ${extensionId}`);
150153
return true;
151154
}
152-
traceLog(`Package management permissions denied for extension this time: ${extensionId}`);
155+
traceLog(`Package management permissions denied for extension: ${extensionId}`);
153156
return false;
154157
}
155158

156-
export async function checkPackageManagementPermissions(
157-
pm: PackageManagerPermissions,
158-
mode: 'install' | 'uninstall' | 'changes',
159-
packages?: string[],
160-
): Promise<boolean> {
161-
const extensionId = getCallingExtension();
162-
163-
let currentPermission = await pm.getPermissions(extensionId);
164-
if (currentPermission === undefined) {
165-
currentPermission = await configureFirstTimePermissions(extensionId, pm);
166-
}
167-
168-
if (currentPermission === 'Allow') {
169-
return true;
170-
} else if (currentPermission === 'Deny') {
171-
traceLog(`Package management permissions denied for extension: ${extensionId}`);
172-
setImmediate(async () => {
173-
await notifyPermissionsDenied(pm, extensionId, mode);
174-
});
175-
return false;
176-
}
177-
178-
const result = await handleAskForPermissions(extensionId, mode, packages);
179-
return result;
180-
}
181-
182159
export async function handlePermissionsCommand(pm: PermissionsManager<PermissionType>, extensionId?: string) {
183-
extensionId = extensionId ?? (await pickExtensionForPermissions());
160+
extensionId = extensionId ?? (await pickExtension());
184161
if (!extensionId) {
185162
return;
186163
}
@@ -189,19 +166,19 @@ export async function handlePermissionsCommand(pm: PermissionsManager<Permission
189166

190167
const response = await showInformationMessage(
191168
l10n.t(
192-
'Set permissions for the {0} extension to make changes to packages in your Python environments',
169+
'Set permissions for the extension {0} to install, upgrade, or uninstall packages from your Python environments',
193170
extensionId,
194171
),
195172
{
196173
modal: true,
197174
detail: currentPermission ? l10n.t('Current permission: {0}', currentPermission) : undefined,
198175
},
199-
PermissionsCommon.confirmEachTime,
176+
PermissionsCommon.ask,
200177
PermissionsCommon.allow,
201178
PermissionsCommon.deny,
202179
);
203180

204-
if (response === PermissionsCommon.confirmEachTime) {
181+
if (response === PermissionsCommon.ask) {
205182
await pm.setPermissions(extensionId, 'Ask');
206183
traceLog('Package management permissions set to "ask" for extension: ', extensionId);
207184
} else if (response === PermissionsCommon.allow) {

src/features/permissions/pickers.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { Extension, QuickPickItem } from 'vscode';
2-
import { allExternalExtensions } from '../../common/extension.apis';
2+
import { allExtensions } from '../../common/extension.apis';
33
import { showQuickPick } from '../../common/window.apis';
44

55
function getExtensionName(ext: Extension<unknown>): string {
@@ -11,7 +11,7 @@ function getExtensionName(ext: Extension<unknown>): string {
1111
}
1212

1313
function getExtensionItems(): QuickPickItem[] {
14-
const extensions = allExternalExtensions();
14+
const extensions = allExtensions();
1515
return extensions.map((ext) => {
1616
return {
1717
description: ext.id,
@@ -20,7 +20,7 @@ function getExtensionItems(): QuickPickItem[] {
2020
});
2121
}
2222

23-
export async function pickExtensionForPermissions(): Promise<string | undefined> {
23+
export async function pickExtension(): Promise<string | undefined> {
2424
const items = getExtensionItems();
2525

2626
const result = await showQuickPick(items, {

0 commit comments

Comments
 (0)