o
    vh,                     @   s  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 e!Z"g dZ#dedefddZ$defddZ%G dd dZ&eddG dd de&Z'eddG dd de&Z(G dd dej)Z*edd d!Z+eddG d"d  d Z,G d#d$ d$Z-G d%d& d&Z.G d'd( d(e-Z/dS ))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                 C   sP   t | trt |trdS t | ttfr&t |ttfr&| j|jko%| j|jkS dS )NTF)
isinstancer   r   r   idnum
generation)r   r     r$   b/var/www/html/hyperkenya/venv/lib/python3.10/site-packages/pyhanko/sign/diff_analysis/rules_api.py	_eq_deref(   s   r&   c                 C   s6   t | tr	tdS t | ttfrtd| j| jfS d S )N)r   r   r   r   )r!   r   hashr   r   r"   r#   )r   r$   r$   r%   _hash_deref3   s
   
r(   c                   @   sp   e Zd ZedededdfddZedeee	e
f deeeef dd	fd
dZdeeeef dd fddZdS )r   pdf_handlerabsolute_pathreturnr   c                 C   s   t ||dS )N)r)   path)r   )clsr)   r*   r$   r$   r%   from_absolute;   s   zContext.from_absolutestartr,   r   c           
      C   s   |j }|d us	J |}t|ttfrt|}|j|dd}t }t|D ]#\}\}}	t|	tr<|t|k r<|	j	}t }q$t|ttfrG||7 }q$t
||S )NF)transparent_dereference)container_refr!   intstrr   
walk_nodes	enumerater   len	referencer   )
r-   r/   r,   r1   cur_refwalkrel_pathixnodeobjr$   r$   r%   relative_toA   s   
zContext.relative_toc                 C      t NNotImplementedErrorselfr,   r$   r$   r%   descendX   s   zContext.descendN)__name__
__module____qualname__classmethodr   r   r.   r
   r   r   r   r2   r3   r>   rE   r$   r$   r$   r%   r   :   s$     r   T)frozenc                   @   sN   e Zd ZU eed< 	 eed< 	 deeeef dd fddZ	dd Z
d	d
 ZdS )r   anchorrelative_pathr,   r+   c                 C   sF   | j  }tttf}t||std| j  d| j	|| j
| S )NzAnchor z is not a container object)rK   
get_objectr   r   r   r!   r   PdfReadError	__class__r>   rL   )rD   r,   root
containersr$   r$   r%   rE   i   s   


zRelativeContext.descendc                 C   s   t dt| j| jfS )Nrel)r'   r(   rK   rL   rD   r$   r$   r%   __hash__r   s   zRelativeContext.__hash__c                 C   s$   t |to|j| jkot|j| jS r@   )r!   r   rL   r&   rK   )rD   otherr$   r$   r%   __eq__u   s
   

zRelativeContext.__eq__N)rF   rG   rH   r   __annotations__r   r
   r2   r3   rE   rT   rV   r$   r$   r$   r%   r   \   s   
 	r   c                   @   s^   e Zd ZU eed< 	 eddddZeed< 	 ede	fddZ
deeeef dd fdd	Zd
S )r   r,   F)reprr'   comparer)   r+   c                 C   s   t | jj| jS r@   )r   r>   r)   trailer_viewr,   rS   r$   r$   r%   relative_view   s   
zAbsoluteContext.relative_viewc                 C   s   t | j| | jS r@   )r   r,   r)   rC   r$   r$   r%   rE      s   zAbsoluteContext.descendN)rF   rG   rH   r   rW   dataclass_fieldr)   r   propertyr   r[   r
   r2   r3   rE   r$   r$   r$   r%   r   }   s   
  r   c                   @   s   e Zd ZdZdZdZdS )ApprovalTyper   r      N)rF   rG   rH   BLANKET_APPROVEAPPROVE_RELATIVE_CONTEXTAPPROVE_PATHr$   r$   r$   r%   r^      s    r^   RefUpdateTyper   )boundc                   @   s^   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dZedefdd	ZdS )
r   updated_refNcontext_checkedr-   r+   c                    s    fddS )Nc                    s    dd| iS )Nre   r$   r$   )refr-   kwargsr$   r%   <lambda>   s    z+ReferenceUpdate.curry_ref.<locals>.<lambda>r$   rh   r$   rh   r%   	curry_ref   s   zReferenceUpdate.curry_refc                 C   s,   | j }t|trtjS t|trtjS tjS r@   )rf   r!   r   r^   ra   r   rb   r`   )rD   contextr$   r$   r%   approval_type   s   

zReferenceUpdate.approval_type)rF   rG   rH   r   rW   rf   r   r   rI   r   rc   r   rk   r]   r^   rm   r$   r$   r$   r%   r      s   
 c                	   @   s2   e Zd ZdZdededeeeef  fddZ	dS )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                 C   r?   z
        Apply the rule to the changes between two revisions.

        :param old:
            The older, base revision.
        :param new:
            The newer revision to be vetted.
        rA   rD   rn   ro   r$   r$   r%   apply_qualified      z&QualifiedWhitelistRule.apply_qualifiedN)
rF   rG   rH   __doc__r   r   r   r   r   rr   r$   r$   r$   r%   r      s    r   c                   @   s<   e Zd ZdZdededee fddZdede	fdd	Z
d
S )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`).
    rn   ro   r+   c                 C   r?   rp   rA   rq   r$   r$   r%   apply   rs   zWhitelistRule.applylevelc                 C   s
   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)rD   rv   r$   r$   r%   as_qualified   s   
zWhitelistRule.as_qualifiedN)rF   rG   rH   rt   r   r   r   ru   r   r   rx   r$   r$   r$   r%   r      s    	
r   c                	   @   s@   e Zd ZdedefddZdededeeee	f  fdd	Z
d
S )rw   rulerv   c                 C   s   || _ || _d S r@   )ry   rv   )rD   ry   rv   r$   r$   r%   __init__   s   
z(_WrappingQualifiedWhitelistRule.__init__rn   ro   r+   c                 c   s&    | j ||D ]}| j|fV  qd S r@   )ry   ru   rv   )rD   rn   ro   rg   r$   r$   r%   rr      s   z/_WrappingQualifiedWhitelistRule.apply_qualifiedN)rF   rG   rH   r   r   rz   r   r   r   r   rr   r$   r$   r$   r%   rw      s    rw   )0rt   loggingdataclassesr   r   r\   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   	getLoggerrF   logger__all__r&   r(   r   r   r   OrderedEnumr^   rc   r   r   r   rw   r$   r$   r$   r%   <module>   s6    $ 

" %