Ë
    tPêj¶"  ã                  ó´  — U d Z ddlmZ ddlZddlmZ ddlmZ ddlm	Z	 ddl
mZ ddlmZmZmZmZ dd	lmZ d
Zded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<    G d„ dee	«      Z G d „ d!ee	«      Z G d"„ d#ee	«      Z  G d$„ d%ee	«      Z! ed&d&¬'«       G d(„ d)«      «       Z"e G d*„ d+e«      «       Z# ed&d&¬'«       G d,„ d-«      «       Z$ ed&d&¬'«       G d.„ d/«      «       Z% ed&d&¬'«       G d0„ d1«      «       Z&e%e&z  Z'd2ed3<    ed&d&¬'«       G d4„ d5«      «       Z( ed&d&¬'«       G d6„ d7«      «       Z)e(e)z  Z*d2ed8<    eejV                  d9ejX                  d:i«      Z-d;ed<<    eejV                  d=ejX                  d>i«      Z.d;ed?<   dMd@„Z/dNdA„Z0dNdB„Z1dNdC„Z2dNdD„Z3dOdE„Z4dPdF„Z5dQdG„Z6dRdH„Z7edIœ	 	 	 	 	 	 	 dSdJ„Z8dTdK„Z9dUdL„Z:y)Vaý  Security controls for vector-store file uploads.

Content is classified by inspecting its actual bytes (magic signatures and a
strict UTF-8 decode), never by trusting the client-supplied filename or
content-type. Uploads are restricted to an allowlist of non-executable formats,
capped in size, screened for archives, and passed through a dependency-injected
malware scanner before they are accepted. Accepted uploads are given a
server-generated filename so the client-controlled name never reaches storage.
é    )ÚannotationsN)ÚMapping)Ú	dataclass)ÚEnum)ÚMappingProxyType)ÚFinalÚProtocolÚ	TypeAliasÚruntime_checkable)Úassert_neveri    r   ÚMAX_UPLOAD_SIZE_BYTESsD   X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*ÚEICAR_TEST_SIGNATURE)
s   PKs   PKs   PKs   ‹s   ý7zXZ s   7z¼¯'s   Rar! s   Rar! s   "Ms   (µ/ýzFinal[tuple[bytes, ...]]Ú_ARCHIVE_MAGIC_PREFIXES)s   BZhÚ'_ARCHIVE_MAGIC_PREFIXES_ASCII_AMBIGUOUS)s   ELFs   Êþº¾s   þíúÎs   þíúÏs   Îúíþs   Ïúíþs    asmÚ_EXECUTABLE_MAGIC_PREFIXES)s   MZs   dex
Ú*_EXECUTABLE_MAGIC_PREFIXES_ASCII_AMBIGUOUSs   ustarÚ_TAR_USTAR_MAGICi  Ú_TAR_USTAR_OFFSETs   ï»¿Ú	_UTF8_BOMc                  ó   — e Zd ZdZdZy)ÚDetectedFormatÚpdfÚtextN)Ú__name__Ú
__module__Ú__qualname__ÚPDFÚTEXT© ó    úp/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/rag_endpoints/upload_security.pyr   r   ;   s   „ Ø
€CØ�Dr    r   c                  ó   — e Zd ZdZdZdZy)ÚDisallowedKindÚarchiveÚ
executableÚunknown_binaryN)r   r   r   ÚARCHIVEÚ
EXECUTABLEÚUNKNOWN_BINARYr   r    r!   r#   r#   @   s   „ Ø€GØ€JØ%�Nr    r#   c                  ó(   — e Zd ZdZdZdZdZdZdZdZ	y)	ÚRejectionReasonÚ
empty_fileÚfile_too_largeÚarchive_not_allowedÚexecutable_not_allowedÚunsupported_formatÚmalware_detectedÚmalware_scan_errorN)
r   r   r   Ú
EMPTY_FILEÚFILE_TOO_LARGEÚARCHIVE_NOT_ALLOWEDÚEXECUTABLE_NOT_ALLOWEDÚUNSUPPORTED_FORMATÚMALWARE_DETECTEDÚMALWARE_SCAN_ERRORr   r    r!   r+   r+   F   s*   „ Ø€JØ%€NØ/ÐØ5ÐØ-ÐØ)ÐØ-Ñr    r+   c                  ó   — e Zd ZdZdZdZy)ÚScanVerdictÚcleanÚinfectedÚerrorN)r   r   r   ÚCLEANÚINFECTEDÚERRORr   r    r!   r;   r;   P   s   „ Ø€EØ€HØ�Er    r;   T)ÚfrozenÚslotsc                  ó&   — e Zd ZU ded<   dZded<   y)Ú
ScanResultr;   ÚverdictNz
str | NoneÚ	signature)r   r   r   Ú__annotations__rG   r   r    r!   rE   rE   V   s   … àÓØ €IˆzÔ r    rE   c                  ó   — e Zd Zdd„Zy)ÚMalwareScannerc                 ó   — y ©Nr   ©ÚselfÚcontents     r!   ÚscanzMalwareScanner.scan^   s   � r    N©rO   ÚbytesÚreturnrE   )r   r   r   rP   r   r    r!   rJ   rJ   \   s   „ ä5r    rJ   c                  ó   — e Zd ZdZdd„Zy)ÚEicarTestMalwareScanneraU  Placeholder scanner that only flags the EICAR anti-malware test file.

    It exists to prove the scan hook is wired end to end and to satisfy the
    EICAR retest; it provides no real protection. Inject a scanner backed by a
    real engine through the ``scanner`` parameter of :func:`validate_upload` to
    screen production uploads.
    c                ó|   — t         |v rt        t        j                  d¬«      S t        t        j                  ¬«      S )Nz"EICAR-STANDARD-ANTIVIRUS-TEST-FILE)rF   rG   )rF   )r   rE   r;   r@   r?   rM   s     r!   rP   zEicarTestMalwareScanner.scank   s/   € Ü 7Ñ*Ü¤k×&:Ñ&:ÐFjÔkÐkÜ¤+×"3Ñ"3Ô4Ð4r    NrQ   )r   r   r   Ú__doc__rP   r   r    r!   rU   rU   a   s   „ ñô5r    rU   c                  ó   — e Zd ZU ded<   y)ÚAllowedContentr   ÚformatN©r   r   r   rH   r   r    r!   rY   rY   q   s   … àÔr    rY   c                  ó   — e Zd ZU ded<   y)ÚDisallowedContentr#   ÚkindNr[   r   r    r!   r]   r]   v   s   … à
Ôr    r]   r
   ÚContentInspectionc                  ó6   — e Zd ZU ded<   ded<   ded<   ded<   y)	ÚSecuredUploadÚstrÚsafe_filenameÚcontent_typer   Údetected_formatÚintÚ
size_bytesNr[   r   r    r!   ra   ra   ~   s   … àÓØÓØ#Ó#Ø„Or    ra   c                  ó"   — e Zd ZU ded<   ded<   y)ÚRejectedUploadr+   Úreasonrb   ÚmessageNr[   r   r    r!   ri   ri   †   s   … àÓØ„Lr    ri   ÚUploadValidationr   Útxtz#Final[Mapping[DetectedFormat, str]]Ú_SAFE_EXTENSIONzapplication/pdfz
text/plainÚ_SAFE_CONTENT_TYPEc                ó,   ‡ — t        ˆ fd„|D «       «      S )Nc              3  ó@   •K  — | ]  }‰j                  |«      –— Œ y ­wrL   )Ú
startswith)Ú.0ÚprefixrO   s     €r!   ú	<genexpr>z#_starts_with_any.<locals>.<genexpr>ž   s   øè ø€ ÒA¨fˆw×!Ñ! &×)ÑAùs   ƒ)Úany)rO   Úprefixess   ` r!   Ú_starts_with_anyrx   �   s   ø€ ÜÓA¸ÔAÓAÐAr    c                óÊ   — t        | t        «      ryt        t        t        «      z   }t        | «      |k\  r| t        | t        k(  ryt        | t
        «      xr t        | «       S ©NT)rx   r   r   Úlenr   r   Ú_is_utf8_text)rO   Útar_magic_ends     r!   Ú_is_archiver~   ¡   s\   € Ü˜Ô!8Ô9ØÜ,¬sÔ3CÓ/DÑD€MÜ
ˆ7ƒ|�}Ò$¨Ô1BÀ=Ð)QÔUeÒ)eØÜ˜GÔ%LÓMÒlÔVcÐdkÓVlÐRlÐlr    c                óP   — d| v ry	 | j                  d«       y# t        $ r Y yw xY w)Nó    Fzutf-8T)ÚdecodeÚUnicodeDecodeError©rO   s    r!   r|   r|   ª   s7   € Ø�'ÑØðØ�‰�wÔð øô ò Ùðús   ‡ ™	%¤%c                ó`   — t        | t        «      ryt        | t        «      xr t        | «       S rz   )rx   r   r   r|   rƒ   s    r!   Ú_is_executable_binaryr…   ´   s-   € Ü˜Ô!;Ô<ØÜ˜GÔ%OÓPÒoÔYfÐgnÓYoÐUoÐor    c                ój   — | j                  t        «      j                  «       }|j                  d«      S )Ns   #!)Úremoveprefixr   Úlstriprr   )rO   Úbodys     r!   Ú_looks_like_shebangrŠ   º   s*   € Ø×&Ñ&¤yÓ1×8Ñ8Ó:€DØ�?‰?˜5Ó!Ð!r    c                ó¨  — t        | «      rt        t        j                  «      S | j	                  d«      rt        t        j                  «      S t        | «      rt        t        j                  «      S t        | «      rt        t        j                  «      S t        | «      rt        t        j                  «      S t        t        j                  «      S )Ns   %PDF-)rŠ   r]   r#   r(   rr   rY   r   r   r~   r'   r…   r|   r   r)   rƒ   s    r!   Úinspect_contentrŒ   ¿   s–   € Ü˜7Ô#Ü ¤×!:Ñ!:Ó;Ð;Ø×Ñ˜(Ô#Üœn×0Ñ0Ó1Ð1Ü�7ÔÜ ¤×!7Ñ!7Ó8Ð8Ü˜WÔ%Ü ¤×!:Ñ!:Ó;Ð;Ü�WÔÜœn×1Ñ1Ó2Ð2Üœ^×:Ñ:Ó;Ð;r    c                óV   — t        j                  «       j                  › dt        |    › �S )Nú.)ÚuuidÚuuid4Úhexrn   )re   s    r!   Úgenerate_safe_filenamer’   Í   s&   € Ü�j‰j‹l×ÑÐ˜q¤°Ñ!AÐ BÐCÐCr    c                ó,  — | xt         j                  k(  r t        t        j                  d«      S xt         j
                  k(  r t        t        j                  d«      S t         j                  k(  rt        t        j                  d«      S t        | «       y )Nz Archive uploads are not allowed.z#Executable uploads are not allowed.z/Only PDF and UTF-8 text documents are accepted.)
r#   r'   ri   r+   r5   r(   r6   r)   r7   r   )r^   s    r!   Ú_reject_disallowedr”   Ñ   s}   € Ø
Ø#Œ^×#Õ#Ü!Ü×3Ñ3Ø2óð ð 'Œ^×&Õ&Ü!Ü×6Ñ6Ø5óð ô ×*Ô*Ü!Ü×2Ñ2ØAóð ô �Õr    c                óh  — |j                  | «      }|j                  xt        j                  k(  r y xt        j                  k(  r- t        t        j                  d|j                  xs d› d�«      S t        j                  k(  rt        t        j                  d«      S t        |j                  «       y )Nz/Uploaded file was flagged by malware scanning (zunknown signaturez).z5Malware scanning could not complete; upload rejected.)rP   rF   r;   r?   r@   ri   r+   r8   rG   rA   r9   r   )rO   ÚscannerÚresults      r!   Ú_scan_rejectionr˜   å   s’   € Ø—L‘L Ó)€FØ
�.‰.ØŒ[×ÕØØ!Œ[×!Õ!Ü!Ü×0Ñ0ØAÀ&×BRÑBRÒBiÐViÐAjÐjlÐmóð ô ×ÔÜ!Ü×2Ñ2ØGóð ô �—‘Õ r    )Úmax_size_bytesc                óœ  — t        | «      }|dk(  rt        t        j                  d«      S ||kD  r!t        t        j                  d|› d|› d�«      S t        | «      }t        |t        «      rt        |j                  «      S t        | |«      }|�|S t        t        |j                  «      t        |j                     |j                  |¬«      S )Nr   zUploaded file is empty.zUploaded file is z bytes, exceeding the z-byte limit.)rc   rd   re   rg   )r{   ri   r+   r3   r4   rŒ   Ú
isinstancer]   r”   r^   r˜   ra   r’   rZ   ro   )rO   r–   r™   ÚsizeÚ
inspectionÚscan_rejections         r!   Úvalidate_uploadrŸ   ÷   sÍ   € ô �g“,€DØˆq‚yÜœo×8Ñ8Ð:SÓTÐTØˆnÒÜÜ×*Ñ*Ø ˜vÐ%;¸NÐ;KÈ<ÐXó
ð 	
ô
 (¨Ó0€JÜ�*Ô/Ô0Ü! *§/¡/Ó2Ð2ä+¨G°WÓ=€NØÐ!ØÐäÜ,¨Z×->Ñ->Ó?Ü'¨
×(9Ñ(9Ñ:Ø"×)Ñ)Øô	ð r    c                óZ   — dj                  d„ | D «       «      j                  «       }|xs dS )NÚ c              3  ó*   K  — | ]  }|d vsŒ|–— Œ y­w)z"\
Nr   )rs   Úchars     r!   ru   z,_sanitize_header_filename.<locals>.<genexpr>  s   è ø€ ÒQ t¸4ÀyÒ;PœdÑQùs   ‚	ŒÚdownload)ÚjoinÚstrip)ÚfilenameÚstrippeds     r!   Ú_sanitize_header_filenamer©     s*   € Ø—g‘gÑQ¨xÔQÓQ×WÑWÓY€HØÒ!�zÐ!r    c                ó8   — t        dt        | «      › d�ddœ«      S )Nzattachment; filename="ú"Únosniff)zContent-DispositionzX-Content-Type-Options)r   r©   )r§   s    r!   Úsafe_download_headersr­     s,   € Üà%;Ô<UÐV^Ó<_Ð;`Ð`aÐ#bØ&/ñ	
óð r    )rO   rR   rw   ztuple[bytes, ...]rS   Úbool)rO   rR   rS   r®   )rO   rR   rS   r_   )re   r   rS   rb   )r^   r#   rS   ri   )rO   rR   r–   rJ   rS   zRejectedUpload | None)rO   rR   r–   rJ   r™   rf   rS   rl   )r§   rb   rS   rb   )r§   rb   rS   zMapping[str, str]);rW   Ú
__future__r   r�   Úcollections.abcr   Údataclassesr   Úenumr   Útypesr   Útypingr   r	   r
   r   Útyping_extensionsr   r   rH   r   r   r   r   r   r   r   r   rb   r   r#   r+   r;   rE   rJ   rU   rY   r]   r_   ra   ri   rl   r   r   rn   ro   rx   r~   r|   r…   rŠ   rŒ   r’   r”   r˜   rŸ   r©   r­   r   r    r!   ú<module>r¶      sŸ  ðòõ #ã Ý #Ý !Ý Ý "ß @Ó @å *à0Ð �uÓ 0àfÐ �eÓ fð5Ð Ð1ó ð ENÐ 'Ð)AÓ Mð8Ð Ð4ó ð HYÐ *Ð,DÓ Xà"Ð �%Ó "ØÐ �5Ó à"€	ˆ5Ó "ô�S˜$ô ô
&�S˜$ô &ô.�c˜4ô .ô�#�tô ñ �$˜dÔ#÷!ð !ó $ð!ð
 ô6�Xó 6ó ð6ñ �$˜dÔ#÷5ð 5ó $ð5ñ �$˜dÔ#÷ð ó $ðñ �$˜dÔ#÷ð ó $ðð  .Ð0AÑAÐ �9Ó Añ �$˜dÔ#÷ð ó $ðñ �$˜dÔ#÷ð ó $ðð
 ,¨nÑ<Ð �)Ó <á7Gà×Ñ˜EØ×Ñ˜Uðó8€Ð4ó ñ ;Kà×ÑÐ-Ø×Ñ˜\ðó;Ð Ð7ó óBómóópó"ó
<óDóó(!ð, 0ñ	àðð ðð ð	ð
 óó>"ô
r    