Disable downloads for certain users based on the name of the file uploaded to Salesforce.
We can use the following example code inside of a Apex class.
This code essentially prevents files whose file name starts off with Kaipu- from being downloaded by anyone whose user role’s developer name is not Kaipu_Sales.
Modify this code to suit your own purpose.
Based on Role:
public
class
ContentDownloadHandlerFactoryImpl
implements
Sfc.ContentDownloadHandlerFactory {
public
Sfc.ContentDownloadHandler getContentDownloadHandler(List<ID> ids, Sfc.ContentDownloadContext context) {
// See if the user has the Kaipu Sales role (based on developer name field).
Boolean isSecretUser = [
SELECT Id
FROM UserRole
WHERE ID = :UserInfo.getUserRoleId()
AND DeveloperName =
'Kaipu Sales'
].size() >
0
;
// Get the list of content documents from the ids which are actually content
// version IDs.
List<ContentDocument> docs = [
SELECT Id, Title, FileType, FileExtension
FROM ContentDocument
WHERE ID IN (
SELECT ContentDocumentId
FROM ContentVersion
WHERE Id IN :ids
)
];
Sfc.ContentDownloadHandler contentDownloadHandler =
new
Sfc.ContentDownloadHandler();
// Loop through the documents and disable the download if any start off with
// "Kaipu-" even though the user doesn't have the
Kaipu Sales
// role.
for
(ContentDocument doc : docs) {
if
(!isSecretUser && doc.Title.startsWith(
'Kaipu-'
)) {
contentDownloadHandler.isDownloadAllowed =
false
;
contentDownloadHandler.downloadErrorMessage =
'You do not have permission to download this secret file.'
;
return
contentDownloadHandler;
}
}
contentDownloadHandler.isDownloadAllowed =
true
;
return
contentDownloadHandler;
}
}
Based on Profile:
The code prevents files whose name starts off with Kaipu- from being downloaded by anyone whose user profile name doesn’t contain the string Admin
public
class
ContentDownloadHandlerFactoryImpl
implements
Sfc.ContentDownloadHandlerFactory {
public
Sfc.ContentDownloadHandler getContentDownloadHandler(List<ID> ids, Sfc.ContentDownloadContext context) {
// The profile as a list of profiles as long as the name doesn't contain
// "Admin".
List<Profile> profiles = [
SELECT Id, Name
FROM Profile
WHERE Id = :UserInfo.getProfileId()
AND Name NOT LIKE
'%Admin%'
];
// Indicates if the user's profile is not an admin profile.
Boolean isNotAdmin = profiles.size() >
0
;
// Get the list of the content versions.
List<ContentVersion> cvs = [
SELECT Id, Title
FROM ContentVersion
WHERE Id IN :ids
];
Sfc.ContentDownloadHandler cdh =
new
Sfc.ContentDownloadHandler();
// Loop through the files and see if any start with "Kaipu-". If user
// is not an admin and the file name starts off with "Kaipu-" the user
// will not have access to download the file.
for
(ContentVersion cv : cvs) {
if
(isNotAdmin && cv.Title.startsWith(
'Kaipu-'
)) {
cdh.isDownloadAllowed =
false
;
cdh.downloadErrorMessage =
'You do not have permission to download this file.'
;
return
cdh;
}
}
// If at this point allow the download.
cdh.isDownloadAllowed =
true
;
return
cdh;
}
}
Comments