
    Wwg,                        d Z 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 ddlmZmZmZmZmZmZ ddlmZmZ dd	lmZ dd
lmZ ddlmZ ddlmZ  ej@                  e!      Z"g dZ#dedefdZ$defdZ% G d d      Z& ed       G d de&             Z' ed       G d de&             Z( G d dejR                        Z* edd      Z+ ed       G d  d             Z, G d! d"      Z- G d# d$      Z. G d% d&e-      Z/y)'z
Module defining common API types for use by rules and policies.

In principle, these aren't relevant to the high-level validation API.
    N)	dataclass)field)CallableIterableOptionalTupleTypeTypeVarUnion)ArrayObjectDereferenceableDictionaryObjectIndirectObject	ReferenceTrailerReference)HistoricalResolver
RawPdfPath   )misc)
PdfHandler)TrailerDictionary   )ModificationLevel)QualifiedWhitelistRuleWhitelistRuleReferenceUpdateContextRelativeContextAbsoluteContextabc                    t        | t              rt        |t              ryt        | t        t        f      rJt        |t        t        f      r4| j                  |j                  k(  xr | j
                  |j
                  k(  S y)NTF)
isinstancer   r   r   idnum
generation)r    r!   s     [/var/www/horilla/myenv/lib/python3.12/site-packages/pyhanko/sign/diff_analysis/rules_api.py	_eq_derefr'   (   sd    !%&:a9I+J	A	>2	3
	I~&9 ww!''!Ballall&BB    c                     t        | t              rt        d      S t        | t        t        f      r"t        d| j
                  | j                  f      S y )N)r   r   r   r   )r#   r   hashr   r   r$   r%   )r    s    r&   _hash_derefr+   3   sE    !%&I	A	>2	3Q.// 
4r(   c                   |    e Zd Zedededdfd       Zedeee	e
f   deeeef   ddfd	       Zdeeeef   dd fd
Zy)r   pdf_handlerabsolute_pathreturnr   c                     t        ||      S )N)r-   path)r   )clsr-   r.   s      r&   from_absolutezContext.from_absolute;   s     ;]KKr(   startr1   r   c                    |j                   }|J |}t        |t        t        f      rt	        |      }|j                  |d      }t	               }t        |      D ]Y  \  }\  }}	t        |	t              r%|t        |      k  r|	j                  }t	               }>t        |t        t        f      sU||z  }[ t        ||      S )NF)transparent_dereference)container_refr#   intstrr   
walk_nodes	enumerater   len	referencer   )
r2   r4   r1   r7   cur_refwalkrel_pathixnodeobjs
             r&   relative_tozContext.relative_toA   s     493F3F(((#0dS#J'd#DueD<( 	!OBs #~.2D	>--%<D3*-D 	! w11r(   c                     t         NNotImplementedErrorselfr1   s     r&   descendzContext.descendX   s    !!r(   N)__name__
__module____qualname__classmethodr   r   r3   r   r   r   r   r8   r9   rD   rK    r(   r&   r   r   :   s    L$L5?L	L L
 2%{4EEF2 JS()2 
	2 2,"E*c3"67 "I "r(   r   T)frozenc                   N    e Zd ZU eed<   	 eed<   	 deeeef   dd fdZ	d Z
d Zy)	r   anchorrelative_pathr1   r/   c                    | j                   j                         }t        t        t        f}t        ||      s#t        j                  d| j                    d      | j                  j                  || j                  |z         S )NzAnchor z is not a container object)rS   
get_objectr   r   r   r#   r   PdfReadError	__class__rD   rT   )rJ   r1   root
containerss       r&   rK   zRelativeContext.descendi   ss    {{%%'&5FG
$
+##$++&@A  ~~))$0B0BT0IJJr(   c                 X    t        dt        | j                        | j                  f      S )Nrel)r*   r+   rS   rT   rJ   s    r&   __hash__zRelativeContext.__hash__r   s#    UK4d6H6HIJJr(   c                     t        |t              xr; |j                  | j                  k(  xr  t        |j                  | j                        S rF   )r#   r   rT   r'   rS   )rJ   others     r&   __eq__zRelativeContext.__eq__u   sA    uo. 5##t'9'995%,,4	
r(   N)rL   rM   rN   r   __annotations__r   r   r8   r9   rK   r^   ra   rP   r(   r&   r   r   \   sH    
 KE*c3"67 K<M KK
r(   r   c                   n    e Zd ZU eed<   	  eddd      Zeed<   	 ede	fd       Z
deeeef   dd fdZy)	r   r1   F)reprr*   comparer-   r/   c                 j    t         j                  | j                  j                  | j                        S rF   )r   rD   r-   trailer_viewr1   r]   s    r&   relative_viewzAbsoluteContext.relative_view   s*    **))499
 	
r(   c                 H    t        | j                  |z   | j                        S rF   )r   r1   r-   rI   s     r&   rK   zAbsoluteContext.descend   s    tyy4/1A1ABBr(   N)rL   rM   rN   r   rb   dataclass_fieldr-   r   propertyr   rh   r   r8   r9   rK   rP   r(   r&   r   r   }   sj    
 .K  
 
 

CE*c3"67 C<M Cr(   r   c                       e Zd ZdZdZdZy)ApprovalTyper   r      N)rL   rM   rN   BLANKET_APPROVEAPPROVE_RELATIVE_CONTEXTAPPROVE_PATHrP   r(   r&   rm   rm      s    O Lr(   rm   RefUpdateTyper   )boundc                   p    e Zd ZU eed<   	 dZee   ed<   ede	e
   deege
f   fd       Zedefd       Zy)r   updated_refNcontext_checkedr2   r/   c                       fdS )Nc                      dd| iS )Nru   rP   rP   )refr2   kwargss    r&   <lambda>z+ReferenceUpdate.curry_ref.<locals>.<lambda>   s    3939&9 r(   rP   )r2   rz   s   ``r&   	curry_refzReferenceUpdate.curry_ref   s     :9r(   c                     | j                   }t        |t              rt        j                  S t        |t
              rt        j                  S t        j                  S rF   )rv   r#   r   rm   rp   r   rq   ro   )rJ   contexts     r&   approval_typezReferenceUpdate.approval_type   sE    &&g/8881,,,///r(   )rL   rM   rN   r   rb   rv   r   r   rO   r	   rr   r   r|   rk   rm   r   rP   r(   r&   r   r      sl     *.OXg&-:- :	9+},	-: :
 0| 0 0r(   c            	       4    e Zd ZdZdededeeeef      fdZ	y)r   a  
    Abstract base class for a whitelisting rule that outputs references together
    with the modification level at which they're cleared.

    This is intended for use by complicated whitelisting rules that need to
    differentiate between multiple levels.
    oldnewr/   c                     t         z
        Apply the rule to the changes between two revisions.

        :param old:
            The older, base revision.
        :param new:
            The newer revision to be vetted.
        rG   rJ   r   r   s      r&   apply_qualifiedz&QualifiedWhitelistRule.apply_qualified   
     "!r(   N)
rL   rM   rN   __doc__r   r   r   r   r   r   rP   r(   r&   r   r      s4    "%",>"	%)?:;	<"r(   r   c                   :    e Zd ZdZdededee   fdZdede	fdZ
y)	r   aM  
    Abstract base class for a whitelisting rule that simply outputs
    cleared references without specifying a modification level.

    These rules are more flexible than rules of type
    :class:`.QualifiedWhitelistRule`, since the modification level can be
    specified separately (see :meth:`.WhitelistRule.as_qualified`).
    r   r   r/   c                     t         r   rG   r   s      r&   applyzWhitelistRule.apply   r   r(   levelc                     t        | |      S )ae  
        Construct a new :class:`QualifiedWhitelistRule` that whitelists the
        object references from this rule at the level specified.

        :param level:
            The modification level at which the output of this rule should be
            cleared.
        :return:
            A :class:`.QualifiedWhitelistRule` backed by this rule.
        )_WrappingQualifiedWhitelistRule)rJ   r   s     r&   as_qualifiedzWhitelistRule.as_qualified   s     /tU;;r(   N)rL   rM   rN   r   r   r   r   r   r   r   r   rP   r(   r&   r   r      s>    "%",>"	/	""<"3 <8N <r(   r   c            	       @    e Zd ZdedefdZdededeeee	f      fdZ
y)	r   ruler   c                      || _         || _        y rF   )r   r   )rJ   r   r   s      r&   __init__z(_WrappingQualifiedWhitelistRule.__init__   s    	
r(   r   r   r/   c              #   n   K   | j                   j                  ||      D ]  }| j                  |f  y wrF   )r   r   r   )rJ   r   r   ry   s       r&   r   z/_WrappingQualifiedWhitelistRule.apply_qualified   s4      99??3, 	"C**c/!	"s   35N)rL   rM   rN   r   r   r   r   r   r   r   r   rP   r(   r&   r   r      sC    ] 3D "%",>"	%)?:;	<"r(   r   )0r   loggingdataclassesr   r   rj   typingr   r   r   r   r	   r
   r   pyhanko.pdf_utils.genericr   r   r   r   r   r   pyhanko.pdf_utils.readerr   r   	pdf_utilsr   pdf_utils.rw_commonr   pdf_utils.xrefr   
policy_apir   	getLoggerrL   logger__all__r'   r+   r   r   r   OrderedEnumrm   rr   r   r   r   r   rP   r(   r&   <module>r      s"    ! 0 L L L  D  - / )			8	$ _ 0? 0" "D $
g 
 
@ $Cg C C.4##  /@A $0 0 02" "."< "<J	"&< 	"r(   