o
    >eG                  	   @   s  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	m
Z
mZm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mZ d	d
lmZ d	dlmZmZ ddlmZ dejdefddZ e !dZ"dede
ej fddZ#dej$de
ej fddZ%dej$deeejef  fddZ&dej$dej'fddZ(dej$deej'ej)ej*ef fd d!Z+dej$dej,fd"d#Z-d$ej'dejfd%d&Z.d'e	ej' d(efd)d*Z/G d+d, d,ej0Z1ej23ej4e,d-fZ5	.dbd/ej6de
ej, fd0d1Z7d2eejej,f d3ejd/ej6fd4d5Z8d2eejej,f d3ejd/ej6fd6d7Z9d2eejej,f d3ejd8eeedf de:fd9d:Z;	;dcd<ej<d'eej' fd=d>Z=d<ej<d2eejej,f de	ej' fd?d@Z>dAej,fdBdCZ?dDej,dej6fdEdFZ@d'e	ej' fdGdHZAe !dIZBdJdK dLD ZCG dMdN dNeDZEdej$de
e fdOdPZFdej$dQe
e dej'fdRdSZGdej$dQe
e dej)fdTdUZHdej$dQe
e dej2fdVdWZIdej$dQe
e fdXdYZJe !dZZKdej$dQe
e dej,fd[d\ZLd]ede	ej' fd^d_ZMd`da ZNeN  dS )d    N)datetime)BytesIO)BinaryIODictIterableIteratorListOptionalTupleUnion)ElementTree)	XMLParser)parse)genericmisc   )SecurityHandler)get_and_applyisoparse   )modelnamereturnc                 C   s   d| j | jf S )Nz{%s}%sns
local_name)r    r   c/var/www/html/humari/django-venv/lib/python3.10/site-packages/pyhanko/pdf_utils/metadata/xmp_xml.py_tag   s   r   z\{(.*)}(.*)tagc                 C   s0   t | }|d urtj|d|ddS d S )Nr   r   r   )TAG_REmatchr   ExpandedNamegroup)r   mr   r   r   _untag"   s   
r%   elemc                 C   s
   t | jS N)r%   r   r&   r   r   r   _name)   s   
r)   c                 c   s0    | j  D ]\}}t|}|r||fV  qd S r'   )attribitemsr%   )r&   	attr_namevaluer   r   r   r   
iter_attrs-   s   
r.   descriptionr-   c                 C   sN   |D ]"\}}t |jtr|js| t||j qtt| t|| qd S r'   )	
isinstancer-   str
qualifierssetr   add_xmp_valuer   
SubElement)r/   r-   kvr   r   r   _xmp_struct_to_xml6   s
   r8   	containerc                 C   s   t |tr
|| _d S t |tjr| ttjt| d S t |tjr3t	
| ttj}t|| d S t |tjrXt	
| t|j }|jD ]}tt	
|ttj| qGd S ttt|r'   )r0   r1   textr   XmpUrir3   r   RDF_RESOURCEXmpStructurer   r5   RDF_DESCRIPTIONr8   XmpArray
array_typeas_rdfentriesr4   RDF_LINotImplementedErrortype)r9   r-   r/   arrr7   r   r   r   _add_inner_valueB   s,   


rG   c                 C   s   |j }|jr3t| ttj}|jddD ]\}}tt|t|| qt	t|ttj
|j nt	| |j |jd urJ| ttj|j d S d S )NF)	with_lang)r2   has_non_lang_qualsr   r5   r   r   r>   
iter_qualsr4   rG   	RDF_VALUEr-   langr3   XML_LANG)r9   r-   qualsr/   r6   r7   r   r   r   r4   ^   s    
r4   rootc                 C   s6   t ttj}t||  |ttjd t  |S )N )r   Elementr   r   r>   r8   r3   	RDF_ABOUT)rO   r/   r   r   r   _xmp_root_as_xml_trees   s   

rS   rootsoutc                 C   s   | dd | dtjd  dtj dd | dtjd  dd | D ]}t|}|j |d	dd
 q,| d | d | d d S )Nu6   <?xpacket begin="﻿" id="W5M0MpCehiHzreSzNTczkc9d"?>
utf-8z<x:xmpmeta xmlns:x="xz" x:xmptk="z">
z<rdf:RDF xmlns:rdf="rdfF)xml_declarationencodings   
</rdf:RDF>s   
</x:xmpmeta>s   
<?xpacket end="r"?>)writeencoder   NSVENDORrS   )rT   rU   rO   xmp_datar   r   r   serialise_xmp{   s"   	

r`   c                
       s   e Zd Z				ddee dee dee dee f fddZede	e
j d	d fd
dZed	e	e
j fddZde
jfddZd	efddZ  ZS )MetadataStreamN	dict_datastream_dataencoded_datahandlerc                    s:   d | _ t j||||d td| d< td| d< d S )N)rb   rc   rd   re   z	/Metadataz/Typez/XMLz/Subtype)_xmpsuper__init__r   pdf_name)selfrb   rc   rd   re   	__class__r   r   rh      s   zMetadataStream.__init__xmpr   c                 C   s   |  }||_ |  |S r'   )rf   _reserialise)clsrm   stmr   r   r   from_xmp   s   zMetadataStream.from_xmpc                 C   s    | j d u rtt| j| _ | j S r'   )rf   	parse_xmpr   data)rj   r   r   r   rm      s   
zMetadataStream.xmpmetac                 C   s"   t || jd| _|   d | _d S )N)rT   )update_xmp_with_metarm   rf   rn   _encoded_data)rj   rt   r   r   r   ru      s   
z#MetadataStream.update_xmp_with_metac                 C   s2   t  }| jd us
J t| j| |  | _}|S r'   )r   rf   r`   getvalue_data)rj   rp   rs   r   r   r   rn      s
   zMetadataStream._reserialise)NNNN)__name__
__module____qualname__r	   dictbytesr   rh   classmethodr   r   r=   rq   propertyrm   DocumentMetadataru   rn   __classcell__r   r   rk   r   ra      s(    ra   	x-defaultFmeta_strc                 C   s   t | tjr7| jdkr|rtntj }n| jrd| j nd}tjtj	t
| j | f}t
| j|S t | trK|r@tntj }t
| |S d S )NDEFAULT-rP   )r0   r   StringWithLanguage	lang_codeLANG_X_DEFAULTr   
Qualifiersofcountry_coderM   XmpValuer-   r1   )r   lang_xdefaultrN   ccr   r   r   _meta_string_as_value   s   

r   fieldskeyc                 C   s$   t |dd}|d ur|| |< d S d S )NFr   )r   r   r   r   valr   r   r   _write_meta_string   s   r   c                 C   s4   t |dd}|d urttj|g| |< d S d S )NTr   )r   r   r   r?   alternativer   r   r   r   _write_lang_alternative   s   r   	meta_datec                 C   sL   t |tr|}n|dkrtjt d}ndS t|jdd | |< dS )Nnow)tzFr   )microsecondT)	r0   r   r   tzlocalget_localzoner   r   replace	isoformat)r   r   r   r-   r   r   r   _write_meta_date   s   
r   r   rt   c                 C   s   dd |D }t | |S )Nc                 S       i | ]}|D ]\}}||qqS r   r   .0rO   r6   r7   r   r   r   
<dictcomp>  
    
z(update_xmp_with_meta.<locals>.<dictcomp>)_populate_xmp_with_meta)rt   rT   r   r   r   r   ru      s   
ru   c                 C   s   t |tj| j t|tjtj | jrt|g| j	S t |tj
| j t|tj| j t| jdd}|d urDttj|g|tj< t|tj| j t|tj| j | jrbt|tjd| j t|g| j	S )NFr   ,)r   r   XMP_MODDATElast_modifiedr   PDF_PRODUCERr^   xmp_unmanagedr=   	xmp_extraXMP_CREATEDATEcreatedr   DC_TITLEtitler   authorr   r?   ordered
DC_CREATORDC_DESCRIPTIONsubjectXMP_CREATORTOOLcreatorkeywordsPDF_KEYWORDSjoin)rt   r   r   r   r   r   r     s    
r   xmp_valc                 C   sJ   t | jtr
| j}ntdzt|}W |S  ty$   td|dw )NzWrong type for XMP datezFailed to parse z
 as a date)r0   r-   r1   XmpXmlProcessingErrorr   
ValueError)r   dt_strdtr   r   r   	_parse_dt   s   
r   r   c                 C   s   d }| }t | jtjrt| jjdkr| jjd }t |jtrU|j}|j}|j}|s.|}|S |dkr;tj	|dd}|S |
dd}tj	||d t|dkrQ|d nd d}|S )Nr   r   r   )r   r   r   )r   r   )r0   r-   r   r?   lenrB   r1   r2   rL   r   split)r   resultfocusval_strrN   rL   
componentsr   r   r   _simplify_meta_str,  s*   
r   c           
      C   s  dd | D }i }| tjd }|d urt||d< | tjd }|d ur+t||d< t|tjt}|d ur:||d< t|tjt}|d urI||d< t|tj	t}|d urX||d< | tj
d }|d urqt|jtrq|jd|d	< | tjd }	|	d urt|	jtr|	j|d
< tjdi |S )Nc                 S   r   r   r   r   r   r   r   r   H  r   z!meta_from_xmp.<locals>.<dictcomp>r   r   r   r   r   r   r   r   r   )getr   r   r   r   r   r   r   r   r   r   r0   r-   r1   r   r   r   )
rT   
all_fieldskwargsmod_datecreate_dater   r   r   r   r   r   r   r   meta_from_xmpG  s8   
r   sC   \s*<\?\s?xpacket begin="(...?)" id="W5M0MpCehiHzreSzNTczkc9d"\s?\?>c                 C   s   i | ]}d  ||qS )u   ﻿)r\   )r   encr   r   r   r   p  s    
r   )rV   zutf-16bezutf-16leutf32c                   @   s   e Zd ZdS )r   N)ry   rz   r{   r   r   r   r   r   v  s    r   c                 C   s   |  ttjd S r'   )r   r   r   rM   r(   r   r   r   _check_langz  s   r   rL   c                 C   s   i }| D ]}t |}|d ur"||v rtd| dt||d||< qt| D ]\}}|tjkrDt|r;t|}n|}t	|||< q't
|S )NzDuplicate field z in XMP structure valuerL   )r)   r   _proc_xmp_valuer.   r   rM   HTTP_URI_REr!   r;   r   r=   )r&   rL   r   childr   
attr_valuer-   r   r   r   _proc_xmp_struct~  s$   



r   c                    sR   t  }|d u r
ttjjtjjtjjd|j } fdd}t|t	| S )N)SeqBagAltc                  3   s,     D ]} t | tjkrt| dV  qd S Nr   )r)   r   rC   r   )lir&   rL   r   r   _entries  s   z_proc_xmp_arr.<locals>._entries)
r)   r   r   XmpArrayTypeORDERED	UNORDEREDALTERNATIVEr   r?   list)r&   rL   r   arr_typer   r   r   r   _proc_xmp_arr  s   r   c                    s    fdd}t jj|  S )Nc                  3   sH    rt jt fV   D ]} t| }|t jkr!|t| fV  qd S r'   )r   rM   r   r)   rK   r   )q_xmlq_namer   r   r   _quals  s   
z#_extract_qualifiers.<locals>._quals)r   r   r   )r&   rL   r   r   r   r   _extract_qualifiers  s   r   c                 C   sr   zt dd | D }W n ty   d }Y nw |d ur*t||j}t| |}||fS t| |}tj|}||fS )Nc                 s   "    | ]}t |tjkr|V  qd S r'   )r)   r   rK   r   cr   r   r   	<genexpr>       z#_unwrap_resource.<locals>.<genexpr>)	nextStopIterationr   r-   r   r   r   r   lang_as_qual)r&   rL   	rdf_valueinner_valuerN   r   r   r   _unwrap_resource  s   

r   z
^https?://c           	      C   sh  t | p|}| ttjd }|dkr!t| |d\}}t||S |d ur-td|dt| }|dkrm| ttj	d }|d urJtt
|S | jrXt| jtj|S | jrctt| |S tdtj|S |dkr| d }t|}|tjtjtjfv rt||}tj|}n|tjkrt||\}}ntd| d	t||S td
t |  d)NResourcer   zParse type z is not supportedr   rP   r   zCannot process tag with name z as an XMP value formzTag with name z has more than one child.)r   r   r   r   RDF_PARSE_TYPEr   r   r   r   r<   r;   r:   r   r   r*   r   r)   RDF_SEQRDF_ALTRDF_BAGr   r>   )	r&   rL   
parse_typer   rN   child_counturi_strr   r   r   r   r   r     sH   



r   inpc           
      C   s   |  d}t|}|sd}d}n|d}t|d}t|d}| | t| t	|d}|
 }t|}|tjkr@|}	n |tjkr\ztdd |D }	W n ty[   tdw td	d
d |	D S )N   rV   r   r   )rZ   c                 s   r   r'   )r)   r   RDF_RDFr   r   r   r   r   $  r   zparse_xmp.<locals>.<genexpr>zNo rdf:RDF node in x:xmpmetaz%XMP root must be rdf:RDF or x:xmpmetac                 S   s&   g | ]}t |tjkrt|d dqS r   )r)   r   r>   r   )r   noder   r   r   
<listcomp>*  s
    
zparse_xmp.<locals>.<listcomp>)readXMP_HEADER_PATTERNr!   r#   BOM_REGISTRYr   r   seekdefused_parseDefusedXMLParsergetrootr)   r   r   	X_XMPMETAr   r   r   )
r   headerheader_matchrZ   start_offsetbomtreerO   	root_namerdf_rootr   r   r   rr     s4   






rr   c                  C   s$   t j D ]
\} }t| | qd S r'   )r   r]   r+   r   register_namespace)prefixurir   r   r   register_namespaces1  s   r  )F)r   )Orer   ior   typingr   r   r   r   r   r	   r
   r   	xml.etreer   r   defusedxml.ElementTreer   r  r   r  pyhanko.pdf_utilsr   r   	crypt.apir   r   r   rP   r   r"   r1   r   compiler    r%   rQ   r)   r.   r=   r8   r?   r;   rG   r   r4   rS   r`   StreamObjectra   r   r   rM   r   
MetaStringr   r   r   boolr   r   ru   r   r   r   r   r  r  r   r   r   r   r   r   r   r   r   rr   r  r   r   r   r   <module>   s    (


	

,








%




1)
