
    WwgG              	       ~   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Z  e jB                  d      Z"dede
ej<                     fdZ#dejH                  de
ej<                     fdZ%dejH                  deeej<                  ef      fdZ&dejH                  dejN                  fdZ(dejH                  deejN                  ejR                  ejT                  ef   fdZ+dejH                  dejX                  fdZ-dejN                  dej                  fdZ.de	ejN                     d efd!Z/ G d" d#ej`                        Z1ejd                  jg                  ejh                   ejX                  d$      f      Z5	 dEd%ejl                  de
ejX                     fd&Z7d'eej<                  ejX                  f   d(ej<                  d%ejl                  fd)Z8d'eej<                  ejX                  f   d(ej<                  d%ejl                  fd*Z9d'eej<                  ejX                  f   d(ej<                  d+eeedf   de:fd,Z;	 dFd-ejx                  deejN                     fd.Z=d-ejx                  d'eej<                  ejX                  f   de	ejN                     fd/Z>d0ejX                  fd1Z?d2ejX                  dejl                  fd3Z@de	ejN                     fd4ZA e jB                  d5      ZBd6D  ci c]  } d7j                  |       |  c} ZD G d8 d9eE      ZFdejH                  de
e   fd:ZGdejH                  d;e
e   dejN                  fd<ZHdejH                  d;e
e   dejR                  fd=ZIdejH                  d;e
e   dejd                  fd>ZJdejH                  d;e
e   fd?ZK e jB                  d@      ZLdejH                  d;e
e   dejX                  fdAZMdBede	ejN                     fdCZNdD ZO eO        yc c} w )G    N)datetime)BytesIO)BinaryIODictIterableIteratorListOptionalTupleUnion)ElementTree)	XMLParser)parse)genericmisc   )SecurityHandler)get_and_applyisoparse   )modelnamereturnc                 :    d| j                   d| j                  S )N{}ns
local_name)r   s    Y/var/www/horilla/myenv/lib/python3.12/site-packages/pyhanko/pdf_utils/metadata/xmp_xml.py_tagr!      s    ww00    z\{(.*)}(.*)tagc                     t         j                  |       }|5t        j                  |j	                  d      |j	                  d            S y )Nr   r   r   )TAG_REmatchr   ExpandedNamegroup)r#   ms     r    _untagr*   "   s;    SA}!!QWWQZAGGAJGGr"   elemc                 ,    t        | j                        S N)r*   r#   r+   s    r    _namer/   )   s    $((r"   c              #   x   K   | j                   j                         D ]  \  }}t        |      }|s||f  y wr-   )attribitemsr*   )r+   	attr_namevaluer   s       r    
iter_attrsr5   -   s@      !KK--/ 	5i +s   .:	:descriptionr4   c           	         |D ]z  \  }}t        |j                  t              r2|j                  s&| j	                  t        |      |j                         Rt        t        j                  | t        |            |       | y r-   )	
isinstancer4   str
qualifierssetr!   add_xmp_valuer   
SubElement)r6   r4   kvs       r    _xmp_struct_to_xmlr@   6   s`      K1aggs#ALL OODGQWW-+00d1gFJKr"   	containerc           	         t        |t              r|| _        y t        |t        j                        r3| j                  t        t        j                        t        |             y t        |t        j                        r:t        j                  | t        t        j                              }t        ||       y t        |t        j                        rt        j                  | t        |j                  j                                     }|j                   D ]9  }t#        t        j                  |t        t        j$                              |       ; y t'        t        t)        |                  r-   )r8   r9   textr   XmpUrir;   r!   RDF_RESOURCEXmpStructurer   r=   RDF_DESCRIPTIONr@   XmpArray
array_typeas_rdfentriesr<   RDF_LINotImplementedErrortype)rA   r4   r6   arrr?   s        r    _add_inner_valuerP   B   s    %	%&d5--.E
;	E5--	.!,,&&'
 	;.	E5>>	*$$!!((*+
  	NA+00d5<<6HI1M	N
c$u+.
//r"   c           	      D   |j                   }|j                  rt        j                  | t	        t
        j                              }|j                  d      D ].  \  }}t        t        j                  |t	        |            |       0 t        t        j                  |t	        t
        j                              |j                         nt        | |j                         |j                  4| j                  t	        t
        j                        |j                         y y )NF)	with_lang)r:   has_non_lang_qualsr   r=   r!   r   rG   
iter_qualsr<   rP   	RDF_VALUEr4   langr;   XML_LANG)rA   r4   qualsr6   r>   r?   s         r    r<   r<   ^   s    E!,,&&'
 $$u$5 	KDAq+00d1gFJ	K"";U__0EFKK	

 	EKK0zzd5>>*EJJ7 r"   rootc                     t        j                  t        t        j                              }t        ||        |j                  t        t        j                        d       t        j                   |      S )N )r   Elementr!   r   rG   r@   r;   	RDF_ABOUT)rY   r6   s     r    _xmp_root_as_xml_treer^   s   sO    %%d5+@+@&ABK{D)OOD)2."";//r"   rootsoutc                    |j                  dj                  d             |j                  dt        j                  d    dt        j                   dj                  d             |j                  dt        j                  d    dj                  d             | D ]!  }t        |      }|j                  |d	d
       # |j                  d       |j                  d       |j                  d       y )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VENDORr^   )r_   r`   rY   xmp_datas       r    serialise_xmprl   {   s    IIDKK	
 II
uxx}o[dKRR	
 II$UXXe_$5T:AA'JK E(.sEGDE IIoII  II&'r"   c            
            e Zd Z	 	 	 	 ddee   dee   dee   dee   f fdZede	e
j                     dd fd       Zede	e
j                     fd	       Zd
e
j                  fdZdefdZ xZS )MetadataStream	dict_datastream_dataencoded_datahandlerc                     d | _         t        | 	  ||||       t        j                  d      | d<   t        j                  d      | d<   y )N)ro   rp   rq   rr   z	/Metadataz/Typez/XMLz/Subtype)_xmpsuper__init__r   pdf_name)selfro   rp   rq   rr   	__class__s        r    rv   zMetadataStream.__init__   sU     9=	#%	 	 	
  ((5W"++F3Zr"   xmpr   c                 B     |        }||_         |j                          |S r-   )rt   _reserialise)clsrz   stms      r    from_xmpzMetadataStream.from_xmp   s!    e
r"   c                 x    | j                   #t        t        | j                              | _         | j                   S r-   )rt   	parse_xmpr   data)rx   s    r    rz   zMetadataStream.xmp   s+    99!'$))"45DIyyr"   metac                 j    t        || j                        | _        | j                          d | _        y )N)r_   )update_xmp_with_metarz   rt   r|   _encoded_data)rx   r   s     r    r   z#MetadataStream.update_xmp_with_meta   s(    (TXX>	!r"   c                     t               }| j                  J t        | j                  |       |j                         x| _        }|S r-   )r   rt   rl   getvalue_data)rx   r~   r   s      r    r|   zMetadataStream._reserialise   s>    iyy$$$dii%LLN*
Tr"   )NNNN)__name__
__module____qualname__r
   dictbytesr   rv   classmethodr	   r   rF   r   propertyrz   DocumentMetadatar   r|   __classcell__)ry   s   @r    rn   rn      s     %)'+(,-14D>4 e_4 uo	4
 /*4" 4 2 23 8H   T%,,-  
")?)? "
e r"   rn   	x-defaultmeta_strc                 V   t        | t        j                        r| j                  dk(  r'|rt        nt
        j                  j                         }nm| j                  rd| j                  z   nd}t
        j                  j                  t
        j                  t        j                  | j                   |       f      }t        j                  | j                  |      S t        | t              r<|rt        nt
        j                  j                         }t        j                  | |      S y )NDEFAULT-r[   )r8   r   StringWithLanguage	lang_codeLANG_X_DEFAULTr   
Qualifiersofcountry_coderW   XmpValuer4   r9   )r   lang_xdefaultrX   ccs       r    _meta_string_as_valuer      s     (D334*&3N9I9I9L9L9NE2:2G2G#---RB$$''83E3E2Frd0K!LME ~~hnne44	Hc	""/U5E5E5H5H5J~~h..r"   fieldskeyc                 .    t        |d      }||| |<   y y )NFr   )r   r   r   r   vals       r    _write_meta_stringr      s#    
  
>C
s r"   c                     t        |d      }|7t        j                  t        j                  j	                  |g            | |<   y y )NTr   )r   r   r   rH   alternativer   s       r    _write_lang_alternativer      s=    
  
=C
nnU^^%?%?%FGs r"   	meta_datec                     t        |t              r|}n/|dk(  r)t        j                  t        j                               }nyt        j                  |j                  d      j                               | |<   y)Nnow)tzFr   )microsecondT)	r8   r   r   tzlocalget_localzoner   r   replace	isoformat)r   r   r   r4   s       r    _write_meta_dater      s^    
 )X&	e	 5 5 78..1!=!G!G!IJF3Kr"   r   c                 d    |D ci c]  }|D ]  \  }}||
  }}}}t        | |      S c c}}}w r-   )_populate_xmp_with_meta)r   r_   rY   r>   r?   r   s         r    r   r      sQ    
 8 848#'1a18	8F 8 #4008s   +c                    t        |t        j                  | j                         t	        |t        j
                  t        j                         | j                  r"t        j                  |      g| j                  S t        |t        j                  | j                         t        |t        j                  | j                         t        | j                   d      }|Dt        j"                  t        j$                  j'                  |g            |t        j(                  <   t        |t        j*                  | j,                         t	        |t        j.                  | j0                         | j2                  r4t	        |t        j4                  dj7                  | j2                               t        j                  |      g| j                  S )NFr   ,)r   r   XMP_MODDATElast_modifiedr   PDF_PRODUCERrj   xmp_unmanagedrF   	xmp_extraXMP_CREATEDATEcreatedr   DC_TITLEtitler   authorr   rH   ordered
DC_CREATORDC_DESCRIPTIONsubjectXMP_CREATORTOOLcreatorkeywordsPDF_KEYWORDSjoin)r   r   r   s      r    r   r     s6    VU..0B0BCvu115<<@""6*<T^^<<VU114<<@FENNDJJ?"4;;eDF#(>>NN""F8,$
u  FE$8$8$,,Gvu44dllC}}65#5#5sxx7NOv&888r"   xmp_valc                     t        | j                  t              r| j                  }nt        d      	 t	        |      }|S # t
        $ r t        d|d      w xY w)NzWrong type for XMP datezFailed to parse z
 as a date)r8   r4   r9   XmpXmlProcessingErrorr   
ValueError)r   dt_strdts      r    	_parse_dtr      sd    '--%#$=>>Mf I  M#&6vj
$KLLMs   A Ar   c                    d }| }t        | j                  t        j                        r;t	        | j                  j
                        dkD  r| j                  j
                  d   }t        |j                  t              r|j                  }|j                  }|j                  }|s|}|S |dk(  rt        j                  |d      }|S |j                  dd      }t        j                  ||d   t	        |      dkD  r|d   nd       }|S )Nr   r   r   )r   r   r   )r   r   )r8   r4   r   rH   lenrK   r9   r:   rV   r   split)r   resultfocusval_strrX   rV   
componentss          r    _simplify_meta_strr   ,  s    #FE#))U^^,SYY5F5F1G!1K 		!!!$%++s#++  zzF M [ --gKF M C+J--$Q-/2:/BjmF
 Mr"   c                 h   | D ci c]  }|D ]  \  }}||
  }}}}i }|j                  t        j                  d       }|t        |      |d<   |j                  t        j                  d       }|t        |      |d<   t        |t        j                  t              }|||d<   t        |t        j                  t              }	|	|	|d<   t        |t        j                  t              }
|
|
|d<   |j                  t        j                  d       }|8t        |j                  t              r|j                  j                  d      |d<   |j                  t        j                  d       }|)t        |j                  t              r|j                  |d<   t        j                   d	i |S c c}}}w )
Nr   r   r   r   r   r   r   r    )getr   r   r   r   r   r   r   r   r   r   r8   r4   r9   r   r   r   )r_   rY   r>   r?   
all_fieldskwargsmod_datecreate_dater   r   r   r   r   s                r    meta_from_xmpr   G  s   < <4<#'1a1<	<J < F~~e//6H"+H"5..!5!5t<K%k2y*enn6HIEw:u'7'79KLF!xE((*<G #y~~e00$7H
8>>3 ?%^^11#6znnU22D9Gz'--=#MMy!!+F++C<s   F-sC   \s*<\?\s?xpacket begin="(...?)" id="W5M0MpCehiHzreSzNTczkc9d"\s?\?>)rb   zutf-16bezutf-16leutf32u   ﻿c                       e Zd Zy)r   N)r   r   r   r   r"   r    r   r   v  s    r"   r   c                 T    | j                  t        t        j                        d       S r-   )r   r!   r   rW   r.   s    r    _check_langr   z  s    88D($//r"   rV   c                 x   i }| D ]3  }t        |      }|||v rt        d| d      t        ||      ||<   5 t        |       D ]^  \  }}|t        j
                  k7  st        j                  |      rt	        j                  |      }n|}t	        j                  |      ||<   ` t	        j                  |      S )NzDuplicate field z in XMP structure valuerV   )r/   r   _proc_xmp_valuer5   r   rW   HTTP_URI_REr&   rD   r   rF   )r+   rV   r   childr   
attr_valuer4   s          r    _proc_xmp_structr   ~  s     8:F =U|v~+&tf,CD  +5t<F4L= 't, 
1j5>>!  ,
 Z0" >>%0F4L
1 f%%r"   c                 6    t               }|t        t        j                  j                  t        j                  j
                  t        j                  j                  d|j                     } fd}t        j                  |t         |                   S )N)SeqBagAltc               3   t   K   D ].  } t        |       t        j                  k(  s t        |        0 y w)Nr   )r/   r   rL   r   )lir+   rV   s    r    _entriesz_proc_xmp_arr.<locals>._entries  s3      	5BRyELL(%bt44	5s   "88)
r/   r   r   XmpArrayTypeORDERED	UNORDEREDALTERNATIVEr   rH   list)r+   rV   r   arr_typer   s   ``   r    _proc_xmp_arrr     s|     ;D| !!))!!++!!-- oo	H5
 >>(D$455r"   c                 T      fd}t        j                  j                   |        S )Nc               3      K   r't         j                  t        j                        f D ]1  } t        |       }|t         j                  k7  s"|t        |       f 3 y wr-   )r   rW   r   r/   rU   r   )q_xmlq_namer+   rV   s     r    _qualsz#_extract_qualifiers.<locals>._quals  sX     ..%.."666 	;E5\F(oeT:::	;s   AA$A$)r   r   r   )r+   rV   r  s   `` r    _extract_qualifiersr    s#    
; ))r"   c                     	 t        d | D              }|&t        ||      j                  }t	        | |      }||fS t        | |      }t        j                  j                  |      }||fS # t        $ r d }Y dw xY w)Nc              3   Z   K   | ]#  }t        |      t        j                  k(  s | % y wr-   )r/   r   rU   .0cs     r    	<genexpr>z#_unwrap_resource.<locals>.<genexpr>  s     HqE!H,GH   !++)	nextStopIterationr   r4   r  r   r   r   lang_as_qual)r+   rV   	rdf_valueinner_valuerX   s        r    _unwrap_resourcer    s    HDHH	 %i6<<#D$/
  'tT2  --d3  	s   A+ +A98A9z
^https?://c                    t        |       xs |}| j                  t        t        j                        d       }|dk(  r&t        | |      \  }}t        j                  ||      S |t        d|d      t        |       }|dk(  r| j                  t        t        j                        d       }|(t        j                  t        j                  |            S | j                  r=t        j                  | j                  t        j                  j                  |            S | j                  rt        j                  t        | |            S t        j                  dt        j                  j                  |            S |dk(  r| d   }t!        |      }|t        j"                  t        j$                  t        j&                  fv r,t)        ||      }t        j                  j                  |      }n2|t        j*                  k(  rt        ||      \  }}nt        d| d	      t        j                  ||      S t        d
t        |        d      )NResourcer   zParse type z is not supportedr   r[   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   rE   rD   rC   r   r  r1   r   r/   RDF_SEQRDF_ALTRDF_BAGr   rG   )	r+   rV   
parse_typer  rX   child_counturi_strr   r   s	            r    r   r     s    t$D$u334d;JZ-d>U~~k511		#*'89
 	

 d)Ka((4 2 23T:>>%,,w"788YY>>		5++88>  [[>>"24">??>>"e&6&6&C&CD&IJJ		QU|EMM5==%--@@'t4K$$11$7EU***!1%!>K'/v5JK  ~~k511#[.//HI
 	
r"   inpc                    | j                  d      }t        j                  |      }|sd}d}nA|j                  d      }t        j                  |d      }t        |j                  d            }| j                  |       t        | t        |            }|j                         }t        |      }|t        j                  k(  r|}	n2|t        j                  k(  r	 t        d |D              }	nt#        d      |	D 
cg c]+  }
t        |
      t        j$                  k(  rt'        |
d 	      - c}
S # t         $ r t#        d      w xY wc c}
w )
N   rb   r   r   )rf   c              3   Z   K   | ]#  }t        |      t        j                  k(  s | % y wr-   )r/   r   RDF_RDFr  s     r    r  zparse_xmp.<locals>.<genexpr>$  s     I!uQx5==/HAIr	  zNo rdf:RDF node in x:xmpmetaz%XMP root must be rdf:RDF or x:xmpmetar   )readXMP_HEADER_PATTERNr&   r(   BOM_REGISTRYr   r   seekdefused_parseDefusedXMLParsergetrootr/   r   r  	X_XMPMETAr
  r  r   rG   r   )r  headerheader_matchrf   start_offsetbomtreerY   	root_namerdf_rootnodes              r    r   r     s8   XXc]F%++F3L   ###C1<--a01HH\ %2x0%D !%DdIEMM!	eoo	%	HItIIH $$KLL ;%/// 	D)   	H'(FGG	H
s   D0 =0E0Ec                  |    t         j                  j                         D ]  \  } }t        j                  | |        y r-   )r   ri   r2   r   register_namespace)prefixuris     r    register_namespacesr2  1  s0    xx~~' 4&&vs34r"   )F)r   )P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   r[   r   r'   r9   r!   compiler%   r*   r\   r/   r5   rF   r@   rH   rD   rP   r   r<   r^   rl   StreamObjectrn   r   r   rW   r   
MetaStringr   r   r   boolr   r   r   r   r   r   r   r  rh   r   r   r   r   r   r   r  r  r   r   r   r2  )encs   0r    <module>r?     s   	  	 	 	 "  @ 9 + ' * 1u!! 1c 1 
N	# !3!34 ## 1C1C(D 


eE&&+,-	K$$	K-2-?-?	K0""0##U^^U\\3FG088[00 8 8*0 2 2 0{7N7N 0(e001 ( (6)W)) )X !!$$
^^^U^^K01 /4enn$##U^^34			 H##U^^34H			H H##U^^34			 XsD() 
	" IK1

 
 1)1%2D2D)E19

 
 9##U^^349 
%

92	u~~ 	ENN u/?/? 6",e001 ",J  RZZO  : OOC#	J 	0k)) 0hsm 0&


&%-c]&
&>6


6%-c]6
^^6**


*%-c]*
* ;.. hsm $ bjj&.



.
%-c].

^^.
b&8 &U%7%7 8 &R4
  Ms   3P: