Ë
    tPêjS  ã                   ó‚   — U d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZ dZeed<   dZeed	<   d
efd„Z G d„ d«      Zy)a  
Adds anti-framing / content-type security headers to every HTTP response.

X-Frame-Options and Content-Security-Policy: frame-ancestors 'none' stop the
admin UI and login pages from being embedded cross-origin (clickjacking).
X-Content-Type-Options: nosniff stops MIME sniffing.

Strict-Transport-Security is opt-in via LITELLM_ENABLE_HSTS because it only
makes sense over HTTPS and would lock browsers out of plain-http deployments.

Headers are set with setdefault so a route that intentionally sets its own
value is never overridden.
é    N)ÚFinal)ÚMutableHeaders)ÚASGIAppÚMessageÚReceiveÚScopeÚSend))zX-Frame-OptionsÚDENY)zContent-Security-Policyzframe-ancestors 'none')zX-Content-Type-OptionsÚnosniffÚSTATIC_SECURITY_HEADERS)zStrict-Transport-Securityz#max-age=31536000; includeSubDomainsÚHSTS_HEADERÚreturnc                  ól   — t        j                  dd«      j                  «       j                  «       dk(  S )NÚLITELLM_ENABLE_HSTSÚfalseÚtrue)ÚosÚgetenvÚstripÚlower© ó    úy/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/middleware/security_headers_middleware.pyÚ_hsts_enabledr      s+   € Ü�9‰9Ð*¨GÓ4×:Ñ:Ó<×BÑBÓDÈÑNÐNr   c                   ó4   — e Zd Zdeddfd„Zdedededdfd„Zy)	ÚSecurityHeadersMiddlewareÚappr   Nc                 ó   — || _         y )N)r   )Úselfr   s     r   Ú__init__z"SecurityHeadersMiddleware.__init__"   s	   € Øˆ�r   ÚscopeÚreceiveÚsendc              ƒ   ó°   ‡K  — |d   dk7  r| j                  ||‰«      ƒ d {  –—†  y dt        dd fˆfd„}| j                  |||«      ƒ d {  –—†  y 7 Œ/7 Œ­w)NÚtypeÚhttpÚmessager   c              “   óÐ   •K  — | d   dk(  rGt        | ¬«      }t        «       rg t        ¢t        ‘­nt        }|D ]  \  }}|j	                  ||«       Œ  ‰| «      ƒ d {  –—†  y 7 Œ­w)Nr%   zhttp.response.start)r!   )r   r   r   r   Ú
setdefault)r'   ÚheadersÚappliedÚnameÚvaluer#   s        €r   Úsend_with_security_headerszFSecurityHeadersMiddleware.__call__.<locals>.send_with_security_headers*   sf   øè ø€ Ø�v‰Ð"7Ò7Ü!/°gÔ!>�ÜLYÌOÐ!HÔ#:Ð!H¼KÒ!HÔax�Ø#*ò 4‘K�D˜%Ø×&Ñ& t¨UÕ3ð4á�w“-×Òús   ƒAA&ÁA$ÁA&)r   r   )r   r!   r"   r#   r.   s      ` r   Ú__call__z"SecurityHeadersMiddleware.__call__%   sd   øè ø€ Ø�‰=˜FÒ"Ø—(‘(˜5 '¨4Ó0×0Ð0Øð	 ´gð 	 À$õ 	 ð �h‰h�u˜gÐ'AÓB×BÑBð 1øð 	Cús!   ƒA¢A£)AÁAÁAÁA)	Ú__name__Ú
__module__Ú__qualname__r   r    r   r   r	   r/   r   r   r   r   r   !   s;   „ ð˜Gð ¨ó ðC Eð C°Gð CÀ4ð CÈDô Cr   r   )Ú__doc__r   Útypingr   Ústarlette.datastructuresr   Ústarlette.typesr   r   r   r   r	   r   Ú__annotations__r   Úboolr   r   r   r   r   ú<module>r9      sQ   ðòó 
Ý å 3ß BÕ Bð"Ð ˜ó ð
 Z€ˆUÓ YðO�tó O÷Cò Cr   