Ë
    a%9j¼  ã                   ór   — d Z ddlZddlZddlZ ej                  d«      Z eh d£«      Zd„ Z G d„ d«      Z	y)zy
API request/response logging middleware.
Logs /api/ requests with sanitized payload (no passwords) and response status.
é    NÚapi>   ÚtokenÚsecretÚpasswordÚauthorizationc                 ó  ‡— t        | t        «      st        | «      dd S t        j                  | «      }t        |j                  «       «      D ]0  }|j                  «       Št        ˆfd„t        D «       «      sŒ,d||<   Œ2 |S )z.Remove sensitive fields from dict for logging.Niô  c              3   ó&   •K  — | ]  }|‰v –— Œ
 y ­w©N© )Ú.0ÚsÚ	key_lowers     €ú0/var/www/html/truck-me/api/logging_middleware.pyú	<genexpr>z_sanitize.<locals>.<genexpr>   s   øè ø€ Ò6 !ˆq�IŒ~Ñ6ùs   ƒz***)
Ú
isinstanceÚdictÚstrÚcopyÚdeepcopyÚlistÚkeysÚlowerÚanyÚSENSITIVE_KEYS)ÚdataÚoutÚkeyr   s      @r   Ú	_sanitizer      sn   ø€ ä�dœDÔ!Ü�4‹y˜˜#ˆÐÜ
�-‰-˜Ó
€CÜ�C—H‘H“JÓò ˆØ—I‘I“Kˆ	ÜÓ6¤~Ô6Õ6ØˆC�ŠHðð €Jó    c                   ó"   — e Zd ZdZd„ Zd„ Zd„ Zy)ÚAPILoggingMiddlewarezLog API requests and responses.c                 ó   — || _         y r
   )Úget_response)Úselfr#   s     r   Ú__init__zAPILoggingMiddleware.__init__   s
   € Ø(ˆÕr   c           	      óÔ  — |j                   j                  d«      s| j                  |«      S 	 |j                  rVd|j                  v rH|j                  r<t        j                  |j                  j                  dd¬«      «      }t        |«      }nd }| j                  |«      }|j                  j                  rt        |j                  «      nd}| j                  |«      }	 |�t        j                  |«      nd}t"        j%                  d
|j&                  |j                   |j(                  |||«       |S # t        $ r d}Y Œ±w xY w# t        t         f$ r t        |«      d d	 }Y Œkw xY w)Nz/api/Újsonzutf-8Úreplace)Úerrorsz(parse error)ÚanonÚ-éÈ   z)API %s %s -> %s | user=%s ip=%s | body=%s)ÚpathÚ
startswithr#   Úcontent_typeÚbodyr'   ÚloadsÚdecoder   Ú	ExceptionÚuserÚis_authenticatedr   Ú_get_client_ipÚdumpsÚ	TypeErrorÚ
ValueErrorÚloggerÚinfoÚmethodÚstatus_code)r$   Úrequestr0   Ú	body_safeÚresponser4   ÚipÚbody_strs           r   Ú__call__zAPILoggingMiddleware.__call__!   sC  € Ø�|‰|×&Ñ& wÔ/Ø×$Ñ$ WÓ-Ð-ð	(Ø×#Ò#¨°'×2FÑ2FÑ(FÈ7Ï<Ê<Ü—z‘z '§,¡,×"5Ñ"5°gÀiÐ"5Ó"PÓQ�Ü% d›O‘	à �	ð
 ×$Ñ$ WÓ-ˆð %,§L¡L×$AÒ$AŒs�7—<‘<Ô ÀvˆØ× Ñ  Ó)ˆð	,Ø09Ð0E”t—z‘z )Ô,È3ˆHô 	�‰Ø7Ø�N‰NØ�L‰LØ× Ñ ØØØô	
ð ˆøô- ò 	(Ø'ŠIð	(ûô œ:Ð&ò 	,Ü˜9“~ d sÐ+ŠHð	,ús$   ®A$D6 Ã"E Ä6EÅEÅE'Å&E'c                 ó¸   — |j                   j                  d«      }|r"|j                  d«      d   j                  «       S |j                   j                  dd«      S )NÚHTTP_X_FORWARDED_FORÚ,r   ÚREMOTE_ADDRÚ )ÚMETAÚgetÚsplitÚstrip)r$   r>   Úxffs      r   r6   z#APILoggingMiddleware._get_client_ipD   sM   € Ø�l‰l×ÑÐ5Ó6ˆÙØ—9‘9˜S“> !Ñ$×*Ñ*Ó,Ð,Ø�|‰|×Ñ ¨rÓ2Ð2r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   rC   r6   r   r   r   r!   r!      s   „ Ù)ò)ò!óF3r   r!   )
rQ   r'   Úloggingr   Ú	getLoggerr:   Ú	frozensetr   r   r!   r   r   r   ú<module>rU      sC   ðñó Û Û à	ˆ×	Ñ	˜5Ó	!€ñ ÒKÓL€ò	÷-3ò -3r   