This repository has been archived by the owner on Jan 19, 2021. It is now read-only.
Fix Add-PnPFile throwing "Access Denied" error with existing folders with Read permission at Web level #2478
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Type
Related Issues?
Partially fixes #2476
What is in this Pull Request ?
This PR fixes an issue where users with Read access at Web level but Full Control at Library level receive an "Access Denied" error when calling Add-PnPFile.
The current Add-PnPFile implementation relies on Web.EnsureFolder() to retrieve the folder where to add the file. Web.EnsureFolder() first tries to get the Web.RootWeb.ServerRelativeUrl property (which throws an "Access Denied" server-side error when the user has only Read access on the Web) and then tries to get the List.RootFolder folder of every list in the Web (which throws yet another "Access Denied" server-side erro).
This PR changes the PnP-PowerShell code so that the folder existance is checked with CSOM first and EnsureFolder() is called only if the folder doesn't exist.
This allows to upload files to existing folders with an account with Read permission at Web level and Write/Full Control at Library level. If the folder doesn't exist, an "Access Denied" exception is still thrown (with this permission configuration) as EnsureFolder() is still used in this case. A possible solution could be to use CreateFolder() recursiverly, or change EnsureFolder() implementation in PnP-Site-Core to avoid any "Access Denied" error.