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