11import datetime
22import hashlib
33import json
4+ import re
45import uuid
56
67import apps .logging .request_logger as logging
2223)
2324
2425audit = logging .getLogger ("audit.%s" % __name__ )
25-
26+ MBI_WITH_HYPHEN_PATTERN = r'\b\d[A-Z]{2}\d-[A-Z]{2}\d-[A-Z]{2}\d{2}\b'
27+ MBI_WITHOUT_HYPHEN_PATTERN = r'\b[1-9](?![SLOIBZ])[A-Z](?![SLOIBZ)])[A-Z\d]\d(?![SLOIBZ])[A-Z](?![SLOIBZ])[A-Z\d]\d(?![SLOIBZ])[A-Z]{2}\d{2}\b'
28+ MBI_PATTERN = f'({ MBI_WITH_HYPHEN_PATTERN } |{ MBI_WITHOUT_HYPHEN_PATTERN } )'
2629
2730class RequestResponseLog (object ):
2831 """Audit log message to JSON string
@@ -137,13 +140,20 @@ def __init__(self, req, resp):
137140 self .log_msg ["location" ] = ""
138141 self .log_msg ["size" ] = 0
139142
143+
144+ def has_mbi_match (text ):
145+ return bool (re .search (MBI_PATTERN , text ))
146+
147+ def mask_if_has_mbi (text ):
148+ return re .sub (MBI_PATTERN , '***MBI***' , text )
149+
140150 def _log_msg_update_from_dict (self , from_dict , key , dict_key ):
141151 # Log message update from a passed in dictionary
142152 try :
143153 value = from_dict .get (dict_key , None )
144154 if value is not None :
145155 if len (str (value )) > 0 :
146- self .log_msg [key ] = value
156+ self .log_msg [key ] = self . mask_if_has_mbi ( value )
147157 except ObjectDoesNotExist :
148158 self .log_msg [key ] = (
149159 "ObjectDoesNotExist exception for key " + key + ":" + dict_key
@@ -159,7 +169,7 @@ def _log_msg_update_from_object(self, obj, key, obj_key):
159169 value = getattr (obj , obj_key , None )
160170 if value is not None :
161171 if len (str (value )) > 0 :
162- self .log_msg [key ] = value
172+ self .log_msg [key ] = self . mask_if_has_mbi ( value )
163173 except ObjectDoesNotExist :
164174 self .log_msg [key ] = (
165175 "ObjectDoesNotExist exception for key " + key + ":" + obj_key
@@ -174,6 +184,7 @@ def _log_msg_update_from_querydict(self, key, qp_key):
174184 try :
175185 value_list = self .request .GET .getlist (qp_key , None )
176186 if value_list is not None :
187+ value_list = [self .mask_if_has_mbi (value ) for value in value_list ]
177188 if len (value_list ) == 1 :
178189 self .log_msg [key ] = value_list [0 ]
179190 elif len (value_list ) > 1 :
@@ -521,7 +532,8 @@ def to_dict(self):
521532 except ObjectDoesNotExist :
522533 pass
523534 self ._sync_app_name ()
524- return self .log_msg
535+ masked_logged_dict = {key : self .mask_if_has_mbi (value ) for key , value in self .log_msg .items ()}
536+ return masked_logged_dict
525537
526538##############################################################################
527539#
0 commit comments