
    /i!                     r    d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m
Z
 ddlZddlmZ  G d de      Zy)z:SSL Certificate class for handling certificate operations.    N)DictAnyOptional)urlparse)Pathc            	       Z    e Zd ZdZdeeef   f fdZededefd       Z	eddede
ded    fd	       Zedeeef   fd
       Zedeeef   fd       Zedefd       Zedefd       Zedefd       Zddee   dee   fdZddee   dee   fdZddee   dee   fdZdefdZ xZS )SSLCertificatea   
    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    | j                  |      }t        | 	  |       y)z
        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      T/mnt/e/genesis-system/.venv/lib/python3.12/site-packages/crawl4ai/ssl_certificate.pyr   zSSLCertificate.__init__   s$     --i8 	&    datareturnc                    t        | t              r	 | j                  d      S t        | t              rX| j                         D ci c]<  \  }}t        |t              r|j                  d      n|t        j                  |      > c}}S t        | t              r#| D cg c]  }t        j                  |       c}S | S # t        $ r | j                  d      cY S w xY wc c}}w c c}w )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   z SSLCertificate._decode_cert_data)   s     dE".{{7++ d#
 !JJL	 Aq *4Au)=AHHW%1!33A67  d#GKLtN44T:LL & .{{9--. Ms   C  AC C& CCurltimeoutc                    d}	 t        |       j                  }d|v r|j                  d      d   }t        j                         }t        j                  |df|      5 }|j                  ||      5 }|j                  d      }|s t        d	|        	 ddd       ddd       yt        j                  j                  t        j                  j                  |      }t        |j                         j!                               t        |j#                         j!                               |j%                         t'        |j)                               |j+                         |j-                         |j/                  d
      j'                         |j1                         t3        j4                  |      d	}g }	t7        |j9                               D ]>  }
|j;                  |
      }|	j=                  |j?                         tA        |      d       @ |	|d<   ddd       ddd       |rtK        |      S y# 1 sw Y   xY w# 1 sw Y   #xY w# t        jB                  $ r}t        d|  d|        Y d}~yd}~wt
        jD                  $ r t        d        Y yt
        jF                  $ r t        d|         Y ytH        $ r}t        d|  d|        Y d}~yd}~ww xY w)z
        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x509r4   iextes                r   from_urlzSSLCertificate.from_url=   s    ;	}++Hh#>>#.q1002G ))8S/7K  =t((x(H =E"'"3"3"3"EK&!FxjQR $	= =  = #>>::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=M,/?= =f "=11k= = =  =D ++ 	0Rs;<  	0
;<~~ 	-cU34 	>se2aSIJ	ss   AI H?2$H3H?I 'E.H3H?I 3H<	8H??II KI44$K K<KKKc                 &    | j                  di       S )Nr*   getr   s    r   r*   zSSLCertificate.issuer   s    xx"%%r   c                 &    | j                  di       S )Nr)   rc   re   s    r   r)   zSSLCertificate.subject   s    xx	2&&r   c                 &    | j                  dd      S )Nr-    rc   re   s    r   
valid_fromzSSLCertificate.valid_from   s    xxb))r   c                 &    | j                  dd      S )Nr.   rh   rc   re   s    r   valid_untilzSSLCertificate.valid_until   s    xxR((r   c                 &    | j                  dd      S )Nr/   rh   rc   re   s    r   r/   zSSLCertificate.fingerprint   s    xxr**r   filepathc                 t    t        j                  | dd      }|rt        |      j                  |d       y|S )zExport certificate as JSON.   F)indentensure_asciir   encodingN)jsondumpsr   
write_text)r   rm   json_strs      r   to_jsonzSSLCertificate.to_json   s8     ::d15AN%%h%Ar   c                    	 t        j                  | j                  dd            }t        j                  j                  t        j                  j                  |      }t        j                  j                  t        j                  j                  |      j                  d      }|rt        |      j                  |d       y|S # t        $ r}t        d|        Y d}~yd}~ww xY w)zExport certificate as PEM.r1   rh   r   rr   NzError converting to PEM: )rL   	b64decoderd   r>   r?   r@   rA   dump_certificateFILETYPE_PEMr   r   rv   rV   r=   )r   rm   raw_cert_bytesr]   pem_datar`   s         r   to_pemz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                     	 t        j                  | j                  dd            }|rt        |      j	                  |       y|S # t
        $ r}t        d|        Y d}~yd}~ww xY w)zExport certificate as DER.r1   rh   NzError converting to DER: )rL   rz   rd   r   write_bytesrV   r=   )r   rm   der_datar`   s       r   to_derzSSLCertificate.to_der   sb    		''R(@AHX**84O 	.qc23	s   AA A 	A'A""A'c                     | j                   j                  dd      }| j                  j                  dd      }d| d| dS )NCNzN/Az<SSLCertificate Subject='z
' Issuer='z'>)r)   rd   r*   )r   
subject_cn	issuer_cns      r   __repr__zSSLCertificate.__repr__   sA    \\%%dE2
KKOOD%0	*:,j2NNr   )
   )N)__name__
__module____qualname____doc__r   rS   r   r   staticmethodr   intr   ra   propertyr*   r)   ri   rk   r/   rx   r   r   r   r   __classcell__)r   s   @r   r	   r	      si   '$sCx. '     & Gc GC G:J1K G GV &S#X & & 'c3h ' ' *C * * )S ) ) +S + + # x}  (x}  O# Or   r	   )r   r7   r9   rL   rt   typingr   r   r   urllib.parser   OpenSSL.cryptor>   pathlibr   r   r	    r   r   <module>r      s3    @ 
    & & !  OT Or   