Bugzilla – Attachment 186561 Details for
Bug 20638
Add audit logging for API key actions
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 20638: Add APIKEYS support to log viewer
Bug-20638-Add-APIKEYS-support-to-log-viewer.patch (text/plain), 10.64 KB, created by
Paul Derscheid
on 2025-09-18 13:27:02 UTC
(
hide
)
Description:
Bug 20638: Add APIKEYS support to log viewer
Filename:
MIME Type:
Creator:
Paul Derscheid
Created:
2025-09-18 13:27:02 UTC
Size:
10.64 KB
patch
obsolete
>From cf512abc1bd78cf9dc2b10e90197ead2756dbca0 Mon Sep 17 00:00:00 2001 >From: =?UTF-8?q?Tom=C3=A1s=20Cohen=20Arazi?= <tomascohen@theke.io> >Date: Wed, 17 Sep 2025 14:18:37 -0300 >Subject: [PATCH] Bug 20638: Add APIKEYS support to log viewer > >Add comprehensive support for viewing API key logs in the log viewer: > >tools/viewlog.pl: >- Add APIKEYS to patron lookup logic alongside MEMBERS, CIRCULATION, FINES >- Enable patron name display for API key log entries > >koha-tmpl/.../viewlog.tt: >- Add APIKEYS to the modules list for filtering >- Add ACTIVATE and REVOKE to the actions list for filtering >- Include APIKEYS in patron display logic for object column > >koha-tmpl/.../action-logs.inc: >- Add APIKEYS module translation: 'API keys' >- Include ApiKeyLog system preference check with warning icon >- Add ACTIVATE and REVOKE action translations >- Maintain alphabetical order in translation blocks > >This enables librarians to view and filter API key creation, activation, >revocation, and deletion activities in the standard log viewer interface, >with proper patron name resolution and preference-based logging status >indicators. > >Signed-off-by: Paul Derscheid <paul.derscheid@lmscloud.de> >--- > .../prog/en/includes/action-logs.inc | 6 ++++ > .../prog/en/modules/tools/viewlog.tt | 36 ++++++++++++------- > tools/viewlog.pl | 8 +++-- > 3 files changed, 35 insertions(+), 15 deletions(-) > >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/action-logs.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/action-logs.inc >index 6b0deca6366..0e7847b6ae5 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/action-logs.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/action-logs.inc >@@ -1,5 +1,7 @@ > [% BLOCK translate_log_module %] > [% SWITCH module %] >+ [% CASE 'APIKEYS' %] >+ <span>API keys</span>[% UNLESS Koha.Preference('ApiKeyLog') %]<i class="log-disabled fa-solid fa-triangle-exclamation" title="Log not enabled" data-log="ApiKeyLog"></i>[% END %] > [% CASE 'AUTH' %] > <span>Authentication</span>[% UNLESS Koha.Preference('AuthFailureLog') && Koha.Preference('AuthSuccessLog') %] > <i class="log-disabled fa-solid fa-triangle-exclamation" title="Log not enabled" data-log="AuthFailureLog|AuthSuccessLog"></i> >@@ -49,12 +51,16 @@ > > [% BLOCK translate_log_action %] > [% SWITCH action %] >+ [% CASE 'ACTIVATE' %] >+ <span>Activate</span> > [% CASE 'ADD' %] > <span>Add</span> > [% CASE 'DELETE' %] > <span>Delete</span> > [% CASE 'MODIFY' %] > <span>Modify</span> >+ [% CASE 'REVOKE' %] >+ <span>Revoke</span> > [% CASE 'ISSUE' %] > <span>Checkout</span> > [% CASE 'RETURN' %] >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/viewlog.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/viewlog.tt >index 44e6e4b20e2..598e3b5c0be 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/viewlog.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/viewlog.tt >@@ -123,7 +123,7 @@ > [% ELSE %] > <label for="moduleALL" class="viewlog"><input type="checkbox" id="moduleALL" name="modules" value="" /> All</label> > [% END %] >- [% FOREACH modx IN [ 'AUTH' 'CATALOGUING' 'AUTHORITIES' 'MEMBERS' 'ACQUISITIONS' 'SERIAL' 'HOLDS' 'ILL' 'CIRCULATION' 'CLAIMS' 'FINES' 'SYSTEMPREFERENCE' 'CRONJOBS', 'REPORTS', 'SEARCHENGINE', 'NOTICES', 'NEWS', 'RECALLS', 'SUGGESTION', 'TRANSFERS' ] %] >+ [% FOREACH modx IN [ 'APIKEYS' 'AUTH' 'CATALOGUING' 'AUTHORITIES' 'MEMBERS' 'ACQUISITIONS' 'SERIAL' 'HOLDS' 'ILL' 'CIRCULATION' 'CLAIMS' 'FINES' 'SYSTEMPREFERENCE' 'CRONJOBS', 'REPORTS', 'SEARCHENGINE', 'NOTICES', 'NEWS', 'RECALLS', 'SUGGESTION', 'TRANSFERS' ] %] > [% IF modules.grep(modx).size %] > <label for="module[% modx | html %]" class="viewlog" > ><input type="checkbox" id="module[% modx | html %]" name="modules" value="[% modx | html %]" checked="checked" /> [% PROCESS translate_log_module module=modx %]</label >@@ -147,7 +147,7 @@ > <label for="actionALL" class="viewlog"><input type="checkbox" id="actionALL" name="actions" value="" /> All</label> > [% END %] > >- [% FOREACH actx IN [ 'ADD' 'DELETE' 'MODIFY' 'ISSUE' 'RETURN' 'RENEW' 'CREATE' 'CANCEL' 'FILL' 'SUSPEND' 'RESUME' 'ADDCIRCMESSAGE' 'MODCIRCMESSAGE' 'DELCIRCMESSAGE' 'STATUS_CHANGE' 'PATRON_NOTICE' 'CHANGE PASS' 'RESET PASS' 'Run' 'End' 'PATRON_MERGE' 'EDIT_MAPPINGS' 'RESET_MAPPINGS' 'ADD_BASKET' 'MODIFY_BASKET' 'MODIFY_BASKET_HEADER' 'MODIFY_BASKET_USERS' 'CLOSE_BASKET' 'APPROVE_BASKET' 'REOPEN_BASKET' 'CANCEL_ORDER' 'CREATE_ORDER' 'MODIFY_ORDER' 'CREATE_INVOICE_ADJUSTMENT' 'UPDATE_INVOICE_ADJUSTMENT' 'DELETE_INVOICE_ADJUSTMENT' 'RECEIVE_ORDER' 'MODIFY_BUDGET' 'MODIFY_FUND' 'CREATE_FUND' 'DELETE_FUND' 'ACQUISITION CLAIM' 'ACQUISITION ORDER' 'OVERDUE' 'EXPIRE' 'CREATE_RESTRICTION' 'MODIFY_RESTRICTION' 'DELETE_RESTRICTION' 'MODIFY_CARDNUMBER' ] %] >+ [% FOREACH actx IN [ 'ACTIVATE' 'ADD' 'DELETE' 'MODIFY' 'REVOKE' 'ISSUE' 'RETURN' 'RENEW' 'CREATE' 'CANCEL' 'FILL' 'SUSPEND' 'RESUME' 'ADDCIRCMESSAGE' 'MODCIRCMESSAGE' 'DELCIRCMESSAGE' 'STATUS_CHANGE' 'PATRON_NOTICE' 'CHANGE PASS' 'RESET PASS' 'Run' 'End' 'PATRON_MERGE' 'EDIT_MAPPINGS' 'RESET_MAPPINGS' 'ADD_BASKET' 'MODIFY_BASKET' 'MODIFY_BASKET_HEADER' 'MODIFY_BASKET_USERS' 'CLOSE_BASKET' 'APPROVE_BASKET' 'REOPEN_BASKET' 'CANCEL_ORDER' 'CREATE_ORDER' 'MODIFY_ORDER' 'CREATE_INVOICE_ADJUSTMENT' 'UPDATE_INVOICE_ADJUSTMENT' 'DELETE_INVOICE_ADJUSTMENT' 'RECEIVE_ORDER' 'MODIFY_BUDGET' 'MODIFY_FUND' 'CREATE_FUND' 'DELETE_FUND' 'ACQUISITION CLAIM' 'ACQUISITION ORDER' 'OVERDUE' 'EXPIRE' 'CREATE_RESTRICTION' 'MODIFY_RESTRICTION' 'DELETE_RESTRICTION' 'MODIFY_CARDNUMBER' ] %] > [% IF actions.grep(actx).size %] > <label for="action[% actx| replace('\s+', '_') | html %]" class="viewlog" > ><input type="checkbox" id="action[% actx | replace('\s+', '_') | html %]" name="actions" value="[% actx | html %]" checked="checked" /> [% PROCESS translate_log_action action=actx %]</label >@@ -263,19 +263,29 @@ > <td>[% PROCESS translate_log_module module=loopro.module %]</td> > <td>[% PROCESS translate_log_action action=loopro.action %]</td> > <td> >- [% IF ( loopro.module == 'MEMBERS' ) || ( loopro.module == 'CIRCULATION' ) || ( loopro.module == 'FINES' ) %] >+ [% IF ( loopro.module == 'MEMBERS' ) || ( loopro.module == 'CIRCULATION' ) || ( loopro.module == 'FINES' ) || ( loopro.module == 'APIKEYS' ) %] > [% IF loopro.patron %] >- <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% loopro.object | uri %]" title="Display member details."> >- [% IF ( loopro.object ) %][% IF ( loopro.patron.firstname ) || ( loopro.patron.surname ) %] >- [% loopro.patron.firstname | html %] >- [% loopro.patron.surname | html %] >- ([% loopro.object | html %]) >- [% ELSE %] >- <span>Member</span> [% loopro.object | html %] >- [% END %][% END %] >- </a> >+ [% IF ( loopro.module == 'APIKEYS' ) %] >+ <a href="/cgi-bin/koha/members/apikeys.pl?patron_id=[% loopro.object | uri %]" title="View API keys for this patron"> >+ API keys for [% loopro.patron.firstname | html %] [% loopro.patron.surname | html %] ([% loopro.object | html %]) >+ </a> >+ [% ELSE %] >+ <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% loopro.object | uri %]" title="Display member details."> >+ [% IF ( loopro.object ) %][% IF ( loopro.patron.firstname ) || ( loopro.patron.surname ) %] >+ [% loopro.patron.firstname | html %] >+ [% loopro.patron.surname | html %] >+ ([% loopro.object | html %]) >+ [% ELSE %] >+ <span>Member</span> [% loopro.object | html %] >+ [% END %][% END %] >+ </a> >+ [% END %] > [% ELSE %] >- [% loopro.object | html %] >+ [% IF ( loopro.module == 'APIKEYS' ) %] >+ API keys for patron [% loopro.object | html %] >+ [% ELSE %] >+ [% loopro.object | html %] >+ [% END %] > [% END %] > [% ELSIF ( loopro.module == 'CATALOGUING' ) %] > [% IF ( loopro.info.substr(0, 4) == 'item' ) %] >diff --git a/tools/viewlog.pl b/tools/viewlog.pl >index 2655b2e8fbb..656cc3657fd 100755 >--- a/tools/viewlog.pl >+++ b/tools/viewlog.pl >@@ -203,8 +203,12 @@ if ($do_it) { > } > } > >- #add firstname and surname for borrower, when using the CIRCULATION, MEMBERS, FINES >- if ( $log->module eq "CIRCULATION" || $log->module eq "MEMBERS" || $log->module eq "FINES" ) { >+ #add firstname and surname for borrower, when using the CIRCULATION, MEMBERS, FINES, APIKEYS >+ if ( $log->module eq "CIRCULATION" >+ || $log->module eq "MEMBERS" >+ || $log->module eq "FINES" >+ || $log->module eq "APIKEYS" ) >+ { > if ( $log->object ) { > my $patron = Koha::Patrons->find( $log->object ); > if ( $patron && $output eq 'screen' ) { >-- >2.39.5
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 20638
:
186540
|
186541
|
186542
|
186543
|
186544
|
186558
|
186559
|
186560
| 186561 |
186562