
    Mi!                     r    S r SSKrSSKrSSKrSSKrSSKJrJrJr  SSK	J
r
  SSKrSSKJr   " S S\5      rg)z:SSL Certificate class for handling certificate operations.    N)DictAnyOptional)urlparse)Pathc            	         ^  \ rS rSrSrS\\\4   4U 4S jjr\	S\S\4S j5       r
\	SS\S	\S\S    4S
 jj5       r\S\\\4   4S j5       r\S\\\4   4S j5       r\S\4S j5       r\S\4S j5       r\S\4S j5       rSS\\   S\\   4S jjrSS\\   S\\   4S jjrSS\\   S\\   4S jjrS\4S jrSrU =r$ )SSLCertificate   a  
A class representing an SSL certificate, behaving like a dictionary
for direct JSON serialization. It stores the certificate information internally
and provides methods for export and property access.

Inherits from dict, so instances are directly JSON serializable.
	cert_infoc                 F   > U R                  U5      n[        TU ]	  U5        g)zo
Initializes the SSLCertificate object.

Args:
    cert_info (Dict[str, Any]): The raw certificate dictionary.
N)_decode_cert_datasuper__init__)selfr   decoded_info	__class__s      r/var/www/eduai.edurigo.com/storigo/production/storigo_env/lib/python3.13/site-packages/crawl4ai/ssl_certificate.pyr   SSLCertificate.__init__   s$     --i8 	&    datareturnc                 
   [        U [        5      (       a   U R                  S5      $ [        U [        5      (       a_  U R                  5        VVs0 s HA  u  p[        U[        5      (       a  UR                  S5      OU[        R                  U5      _MC     snn$ [        U [        5      (       a&  U  Vs/ s H  n[        R                  U5      PM     sn$ U $ ! [         a    U R                  S5      s $ f = fs  snnf s  snf )z2Helper method to decode bytes in certificate data.utf-8zlatin-1)	
isinstancebytesdecodeUnicodeDecodeErrordictitemsr	   r   list)r   kvitems       r   r    SSLCertificate._decode_cert_data)   s     dE"".{{7++ d##
 !JJL	 )DA *4Au)=)=AHHW%1!33A67(	  d##GKLttN44T:tLL & .{{9--. Ms   C AC:5D C76C7urltimeoutc                    Sn [        U 5      R                  nSU;   a  UR                  S5      S   n[        R                  " 5       n[
        R                  " US4US9 nUR                  XSS9 nUR                  SS9nU(       d   [        S	U 35         SSS5        SSS5        g[        R                  R                  [        R                  R                  U5      n[        UR                  5       R!                  5       5      [        UR#                  5       R!                  5       5      UR%                  5       ['        UR)                  5       5      UR+                  5       UR-                  5       UR/                  S
5      R'                  5       UR1                  5       [2        R4                  " U5      S.	n/ n	[7        UR9                  5       5       H?  n
UR;                  U
5      nU	R=                  UR?                  5       [A        U5      S.5        MA     XS'   SSS5        SSS5        U(       a  [K        U5      $ g! , (       d  f       N)= f! , (       d  f       N2= f! [        RB                   a  n[        SU  SU 35         SnAgSnAf[
        RD                   a    [        SW 35         g[
        RF                   a    [        SU  35         g[H         a  n[        SU  SU 35         SnAgSnAff = f)zq
Create SSLCertificate instance from a URL. Fetches cert info and initializes.
(Fetching logic remains the same)
N:r   i  )r&   )server_hostnameT)binary_formz%Warning: No certificate returned for sha256)	subjectissuerversionserial_number
not_before	not_afterfingerprintsignature_algorithmraw_cert)namevalue
extensionszSSL Verification Error for z: zCould not resolve hostname: zConnection timed out for z*Error fetching/processing certificate for )&r   netlocsplitsslcreate_default_contextsocketcreate_connectionwrap_socketgetpeercertprintOpenSSLcryptoload_certificateFILETYPE_ASN1r   get_subjectget_components
get_issuerget_versionhexget_serial_numberget_notBeforeget_notAfterdigestget_signature_algorithmbase64	b64encoderangeget_extension_countget_extensionappendget_short_namestrSSLCertVerificationErrorgaierrorr&   	Exceptionr	   )r%   r&   cert_info_rawhostnamecontextsockssockcert_binaryx509r7   iextes                r   from_urlSSLCertificate.from_url=   s    ;	}++Hh#>>#.q1002G ))8S/7Kt(((HE"'"3"3"3"EK&!FxjQR $	 I LK #>>::44kD $((8(8(:(I(I(K#L"&t'8'G'G'I"J#'#3#3#5),T-C-C-E)F&*&8&8&:%)%6%6%8'+{{8'<'@'@'B/3/K/K/M$*$4$4[$A
%M "$J"4#;#;#=>"003"))%(%7%7%9CHM ? 3=,/? I Lf "=11k IH LKD ++ 	0Rs;<  	0
;<~~ 	-cU34 	>se2aSIJ	sy   AI I
/&H9I
I &E0H9I
I 9
I	I


II I K3/J%K3,!K3	K3K..K3c                 &    U R                  S0 5      $ )Nr-   getr   s    r   r-   SSLCertificate.issuer   s    xx"%%r   c                 &    U R                  S0 5      $ )Nr,   rg   ri   s    r   r,   SSLCertificate.subject   s    xx	2&&r   c                 &    U R                  SS5      $ )Nr0    rg   ri   s    r   
valid_fromSSLCertificate.valid_from   s    xxb))r   c                 &    U R                  SS5      $ )Nr1   rn   rg   ri   s    r   valid_untilSSLCertificate.valid_until   s    xxR((r   c                 &    U R                  SS5      $ )Nr2   rn   rg   ri   s    r   r2   SSLCertificate.fingerprint   s    xxr**r   filepathc                 t    [         R                  " U SSS9nU(       a  [        U5      R                  USS9  gU$ )zExport certificate as JSON.   F)indentensure_asciir   encodingN)jsondumpsr   
write_text)r   rv   json_strs      r   to_jsonSSLCertificate.to_json   s8     ::d15AN%%h%Ar   c                     [         R                  " U R                  SS5      5      n[        R                  R                  [        R                  R                  U5      n[        R                  R                  [        R                  R                  U5      R                  S5      nU(       a  [        U5      R                  USS9  gU$ ! [         a  n[        SU 35         SnAgSnAff = f)zExport certificate as PEM.r4   rn   r   r{   NzError converting to PEM: )rO   	b64decoderh   rA   rB   rC   rD   dump_certificateFILETYPE_PEMr   r   r   rY   r@   )r   rv   raw_cert_bytesr`   pem_datarc   s         r   to_pemSSLCertificate.to_pem   s    	#--dhhz2.FGN>>22,,nD ~~66++TfWo  X))(W)EO 	.qc23	s   CC
 C
 

C,C''C,c                      [         R                  " U R                  SS5      5      nU(       a  [        U5      R	                  U5        gU$ ! [
         a  n[        SU 35         SnAgSnAff = f)zExport certificate as DER.r4   rn   NzError converting to DER: )rO   r   rh   r   write_bytesrY   r@   )r   rv   der_datarc   s       r   to_derSSLCertificate.to_der   sb    		''R(@AHX**84O 	.qc23	s   AA 
A 
A.A))A.c                     U R                   R                  SS5      nU R                  R                  SS5      nSU SU S3$ )NCNzN/Az<SSLCertificate Subject='z
' Issuer='z'>)r,   rh   r-   )r   
subject_cn	issuer_cns      r   __repr__SSLCertificate.__repr__   sA    \\%%dE2
KKOOD%0	*:,j2NNr    )
   )N)__name__
__module____qualname____firstlineno____doc__r   rV   r   r   staticmethodr   intr   rd   propertyr-   r,   ro   rr   r2   r   r   r   r   r   __static_attributes____classcell__)r   s   @r   r	   r	      so   '$sCx. '     & Gc GC G:J1K G GV &S#X & & 'c3h ' ' *C * * )S ) ) +S + + # x}  (x}  O# O Or   r	   )r   r:   r<   rO   r}   typingr   r   r   urllib.parser   OpenSSL.cryptorA   pathlibr   r   r	   r   r   r   <module>r      s3    @ 
    & & !  OT Or   