This week, a colleague pointed me to the possibility to hook your own code into SAP GUI downloads via a user-exit. Since downloads are always a big security – and data protection topic, I took a closer look.
Generic download authorization: S_GUI
When downloading data to the frontend, the authorization object S_GUI is checked (with ACTVT 61). This is a very unspecific check, as it does not take the affected data into account – if you have appropriate authorizations, you can download roles, the SFLIGHT table, or your colleagues’ salary. It’s just a client-wide “switch”, which either allows or disallows downloads. Many authorization admins don’t pay much attention to S_GUI, but rather focus on data access authorization objects. Anyway, this is not sufficient, as downloaded data may be passed to third-parties easily or analyzed inappropriately.
SAP offers 2 user-exits to extend download authorization checks:
- SGRPDL00 — User-exit for “normal” SAP GUI downloads
- HRPC0001 — User-exit for HR-specific downloads; logical databases: PNP (HR master data) and PAP (recruitment data)
The first one is called by the GUI_DOWNLOAD function module – i.e. for each and every frontend download, while the second one is HCM-specific. To get started, I decided to inspect SGRPDL00, as this one has the best coverage.
User-exit SGRPDL00: Creation
First of all, we need to create an add-on project via tcode CMOD to implement the user-exit.
Enter the project name “SGRPDL00”, click on “Create”, enter the project attributes and then go for “Enhancement assignments”. When you’re prompted to save, say “Yes” (← hard decision) and choose a package (“Local object” is fine if you’re just playing around).
After that, enter “SGRPDL00” as the enhancement name, click on “Components” and double click on the function exit name:
Since you don’t want to modify the SAP standard function module, double click on the include ZXFILU01. SAP tries to baffle you with a warning message:
… nice try, but just press Enter and you’ll be prompted, whether you’d like to create the include. After ticking “Yes”, you can start to implement the code, which will be called during every frontend download.
User-exit SGRPDL00: Implementation
The function module EXIT_SAPLGRAP_001, in which our code runs, provides 2 input parameters:
- IS_LIST_DOWNLOAD — whether the user is downloading a list (Standard list or ALV)
- NO_AUTH_CHECK — whether the GUI_DOWNLOAD function module was asked to not check S_GUI
and allows throwing the exception “NO_AUTHORITY” – which means that the download is forbidden.
Paste this code to get you started, activate it and don’t forget to activate the user-exit itself.
The above code is a documented example… you’ll for sure want to add your own code there; anyway, it demonstrates a bunch of possibilities. One of the most interesting aspects is that it creates an Application Log entry for every download. Although the Security Audit Log provides similar functionality, it’s possible to add additional information – the table name for SE16 in the above example code.
Unfortunately, you don’t have access to all variables from the calling program… which makes it a bit difficult to add useful information (have a look at how the include gets the table name for SE16). If anybody has a better idea, please tell me.
The user-exit HRPC0001 is specific to HR/HCM and works a bit differently. The implementation in include ZXP04U02 does not perform any check itself, but is rather expected to return a report and form name. This form is responsible for the check and may be located within the calling report’s context – thus enabling your code to access any global variable therein. This way you can take the HCM-specific context into account to determine whether the download is okay or not.
When copying data to the clipboard, S_GUI is not triggered – SAP Note 997201 provides a solution at the cost of a modification.
- Uploads are not covered.
- Non-GUI downloads are not covered (BEx, Portal, …)
- If you mainly need reliable logging for each and every client, you might want to check the SAP UI Logging solution.