@@ -69,7 +69,10 @@ function getPackageListAsString(packages: string[]): string {
6969 return result ;
7070}
7171
72- async function configureFirstTimePermissions ( extensionId : string , pm : PackageManagerPermissions ) {
72+ async function configureFirstTimePermissions (
73+ extensionId : string ,
74+ pm : PackageManagerPermissions ,
75+ ) : Promise < PermissionType > {
7376 const response = await showInformationMessage (
7477 l10n . t ( 'The {0} extension wants to make changes to packages in your Python environments' , extensionId ) ,
7578 { modal : true } ,
@@ -83,66 +86,55 @@ async function configureFirstTimePermissions(extensionId: string, pm: PackageMan
8386 if ( response ?. title === PermissionsCommon . confirmEachTime ) {
8487 await pm . setPermissions ( extensionId , 'Ask' ) ;
8588 traceLog ( 'Package management permissions set to "ask" for extension: ' , extensionId ) ;
86- return true ;
89+ return 'Ask' ;
8790 } else if ( response ?. title === PermissionsCommon . allow ) {
8891 await pm . setPermissions ( extensionId , 'Allow' ) ;
8992 traceLog ( 'Package management permissions set to "allow" for extension: ' , extensionId ) ;
90- return true ;
93+ return 'Allow' ;
9194 } else if ( response ?. title === PermissionsCommon . deny ) {
9295 await pm . setPermissions ( extensionId , 'Deny' ) ;
9396 traceLog ( 'Package management permissions set to "deny" for extension: ' , extensionId ) ;
94- return false ;
97+ return 'Deny' ;
9598 } else {
96- traceLog ( 'Package management permissions not changed for extension: ' , extensionId ) ;
97- return false ;
99+ traceLog ( 'Package management permissions not set (default: ask) for extension: ' , extensionId ) ;
100+ return 'Ask' ;
98101 }
99102}
100103
101- export async function checkPackageManagementPermissions (
102- pm : PackageManagerPermissions ,
103- mode : 'install' | 'uninstall' | 'changes' ,
104- packages ?: string [ ] ,
105- ) : Promise < boolean > {
106- const extensionId = getCallingExtension ( ) ;
107-
108- const currentPermission = await pm . getPermissions ( extensionId ) ;
109- if ( currentPermission === 'Allow' ) {
110- return true ;
111- } else if ( currentPermission === 'Deny' ) {
112- traceLog ( `Package management permissions denied for extension: ${ extensionId } ` ) ;
113- setImmediate ( async ( ) => {
114- let message = l10n . t (
115- 'The extension `{0}` is not permitted to install packages into your Python environment.' ,
116- extensionId ,
117- ) ;
118- if ( mode === 'uninstall' ) {
119- message = l10n . t (
120- 'The extension `{0}` is not permitted to uninstall packages from your Python environment.' ,
121- extensionId ,
122- ) ;
123- } else if ( mode === 'changes' ) {
124- message = l10n . t (
125- 'The extension `{0}` is not permitted to make changes to your Python environment.' ,
126- extensionId ,
127- ) ;
128- }
129- const response = await showWarningMessage ( message , PermissionsCommon . updatePermissions ) ;
130- if ( response === PermissionsCommon . updatePermissions ) {
131- handlePermissionsCommand ( pm , extensionId ) ;
132- }
133- } ) ;
134- return false ;
135- } else if ( currentPermission === undefined ) {
136- return await configureFirstTimePermissions ( extensionId , pm ) ;
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 ) ;
137123 }
124+ }
138125
139- // Below handles Permission level is 'Ask'
126+ async function handleAskForPermissions ( extensionId : string , mode : string , packages ?: string [ ] ) {
140127 let message = l10n . t ( 'The extension `{0}` wants to install packages into your Python environment.' , extensionId ) ;
141128 if ( mode === 'uninstall' ) {
142129 message = l10n . t ( 'The extension `{0}` wants to uninstall packages from your Python environment.' , extensionId ) ;
143130 } else if ( mode === 'changes' ) {
144131 message = l10n . t ( 'The extension `{0}` wants to make changes to your Python environment.' , extensionId ) ;
145132 }
133+ traceLog (
134+ `Asking for package management permissions for extension ${ extensionId } to ${ mode } : ${
135+ packages ?? 'no packages listed'
136+ } `,
137+ ) ;
146138
147139 const response = await showInformationMessage (
148140 message ,
@@ -154,13 +146,39 @@ export async function checkPackageManagementPermissions(
154146 { title : PermissionsCommon . deny , isCloseAffordance : true } ,
155147 ) ;
156148 if ( response ?. title === PermissionsCommon . allow ) {
157- traceLog ( `Package management permissions granted for extension: ${ extensionId } ` ) ;
149+ traceLog ( `Package management permissions granted for extension this time : ${ extensionId } ` ) ;
158150 return true ;
159151 }
160- traceLog ( `Package management permissions denied for extension: ${ extensionId } ` ) ;
152+ traceLog ( `Package management permissions denied for extension this time : ${ extensionId } ` ) ;
161153 return false ;
162154}
163155
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+
164182export async function handlePermissionsCommand ( pm : PermissionsManager < PermissionType > , extensionId ?: string ) {
165183 extensionId = extensionId ?? ( await pickExtension ( ) ) ;
166184 if ( ! extensionId ) {
0 commit comments