a
    kÄ#dÿ>  ã                   @   s¨  d Z ddlmZ ddlmZ ddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlm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mZmZm Z m!Z! zddl"Z"W n e#yæ   Y n0 ed	ƒZ$G d
d„ dee$ ƒZ%dd„ Z&G dd„ de%e$ ƒZ'G dd„ de%e( ƒZ)G dd„ de%e( ƒZ*G dd„ de ƒZ+G dd„ de ƒZ,e,Z-G dd„ de%d ƒZ.G dd„ de%e$ ƒZ/G dd„ de0ƒZ1dS )z%
Generators and packet meta classes.
é    )Úabsolute_import)ÚreduceN)ÚScapy_Exception)ÚWINDOWS)Úrange)ÚAnyÚDictÚGenericÚIteratorÚListÚOptionalÚTupleÚTypeÚTypeVarÚUnionÚ_Generic_metaclassÚcastÚ_Tc                   @   s    e Zd Zg Zdd„ Zdd„ ZdS )ÚGenc                 C   s   t g ƒS ©N)Úiter©Úself© r   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/base_classes.pyÚ__iter__;   s    zGen.__iter__c                 C   s   t dd„ t| ƒD ƒƒS )Nc                 s   s   | ]
}d V  qdS )é   Nr   )Ú.0Ú_r   r   r   Ú	<genexpr>A   ó    z"Gen.__iterlen__.<locals>.<genexpr>)Úsumr   r   r   r   r   Ú__iterlen__?   s    zGen.__iterlen__N)Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r   r"   r   r   r   r   r   8   s   r   c                 C   sv   t | tƒrrdt| ƒ  kr"dkrrn nLtdd„ | D ƒƒrrtt| d ƒt| d ƒd ftdd„ | dd… D ƒƒ Ž S | S )	zUGenerate a range object from (start, stop[, step]) tuples, or
    return value.

    é   é   c                 s   s   | ]}t |d ƒV  qdS )Ú__int__N)Úhasattr)r   Úir   r   r   r   K   r    z_get_values.<locals>.<genexpr>r   r   c                 s   s   | ]}t |ƒV  qd S r   )Úint)r   Úvr   r   r   r   O   r    N)Ú
isinstanceÚtupleÚlenÚallr   r,   )Úvaluer   r   r   Ú_get_valuesD   s    &ÿÿr3   c                   @   s.   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
S )ÚSetGenr   c                 C   s6   || _ t|ttfƒr&dd„ |D ƒ| _nt|ƒg| _d S )Nc                 S   s   g | ]}t |ƒ‘qS r   )r3   )r   Úvalr   r   r   Ú
<listcomp>X   r    z#SetGen.__init__.<locals>.<listcomp>)Ú_iterpacketr.   ÚlistÚBasePacketListÚvaluesr3   )r   r:   r7   r   r   r   Ú__init__T   s    zSetGen.__init__c                 c   sR   | j D ]F}t|tƒr$| js4t|tƒr4t|ttjfƒrF|D ]
}|V  q8q|V  qd S r   )r:   r.   r   r7   Ú
BasePacketr   ÚtypesÚGeneratorType)r   r+   Újr   r   r   r   \   s    

ÿÿþ
zSetGen.__iter__c                 C   s   |   ¡ S r   )r"   r   r   r   r   Ú__len__g   s    zSetGen.__len__c                 C   s
   d| j  S )Nz<SetGen %r>)r:   r   r   r   r   Ú__repr__k   s    zSetGen.__repr__N)r   )r#   r$   r%   r;   r   r@   rA   r   r   r   r   r4   S   s   
r4   c                   @   sœ   e Zd ZdZd ZejZdZe	dd„ ƒZ
e	dd„ ƒZedd„ ƒZd d
d„Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )!ÚNetz6Network object from an IP address or hostname and maské    c                    s^   z$t ‡ fdd„t |d ˆ j¡D ƒƒW S  tjyX   t d|¡d urRtdˆ j ƒ‚‚ Y n0 d S )Nc                 3   s*   | ]"\}}}}}|ˆ j kr|d  V  qdS )r   N)Úfamily)r   rD   r   Z	addr_port©Úclsr   r   r   z   s   
ýz Net.name2addr.<locals>.<genexpr>z(^|\.)[0-9]+-[0-9]+($|\.)z%Ranges are no longer accepted in %s())	ÚnextÚsocketÚgetaddrinforD   ÚerrorÚreÚsearchr   r#   )rF   Únamer   rE   r   Ú	name2addrv   s    ý
ÿzNet.name2addrc              
   C   s"   t tt dt |  |¡¡¡d ƒS )Nú!Ir   )r   r,   ÚstructÚunpackrH   Ú	inet_atonrN   )rF   Úaddrr   r   r   Úip2int†   s
    ÿþz
Net.ip2intc                 C   s   t  t d| ¡¡S )NrO   )rH   Ú	inet_ntoarP   Úpack)r5   r   r   r   Úint2ip�   s    z
Net.int2ipNc                 C   sØ   d|v rt d| jj ƒ‚|d u ržz| dd¡\}}W n tyN   | j| _Y n0 t|ƒ| _|| _| j| j }|  	|¡|? |> | _
d|> | _| j
| j d | _n6|  	|¡| _
|  	|¡| _| j| j
 d | _d  | _| _d S )NÚ*z(Wildcards are no longer accepted in %s()ú/r   )r   Ú	__class__r#   ÚsplitÚ
ValueErrorÚmax_maskÚmaskr,   ÚnetrT   ÚstartÚcountÚstop)r   r_   rb   r^   Zinv_maskr   r   r   r;   ’   s&    ÿ

zNet.__init__c                 C   s   t t| ƒdƒS )NÚ )rG   r   r   r   r   r   Ú__str__©   s    zNet.__str__c                 c   s&   t | jƒD ]}|  | j| ¡V  q
d S r   )r   ra   rW   r`   )r   r+   r   r   r   r   ­   s    zNet.__iter__c                 C   s   | j S r   )ra   r   r   r   r   r@   ³   s    zNet.__len__c                 C   s   t | ƒS r   )r0   r   r   r   r   r"   ·   s    zNet.__iterlen__c                 C   s   |   t | j| j¡¡S r   )rW   ÚrandomÚrandintr`   rb   r   r   r   r   Úchoice¼   s    z
Net.choicec                 C   sB   | j d ur d| jj| j| j f S d| jj|  | j¡|  | j¡f S )Nz%s("%s/%d")z%s("%s", "%s"))r^   rZ   r#   r_   rW   r`   rb   r   r   r   r   rA   À   s    
ý

ýzNet.__repr__c                 C   sN   t |tƒr| |  |¡kS t |tƒs&dS | j|jkr6dS | j|jkoL| j|jkS ©NF)r.   ÚstrrZ   rB   rD   r`   rb   ©r   Úotherr   r   r   Ú__eq__Î   s    

z
Net.__eq__c                 C   s
   | |k S r   r   rj   r   r   r   Ú__ne__Ø   s    z
Net.__ne__c                 C   s   t d| j| j| jfƒS )Nz	scapy.Net)ÚhashrD   r`   rb   r   r   r   r   Ú__hash__Ý   s    zNet.__hash__c                 C   sz   t |tƒr&| j|  ko | jkS   S t |tƒr>|  |¡| v S t|ƒ| jurPdS | j|j  kot|j  kot| jkS   S rh   )r.   r,   r`   rb   ri   rZ   Útyperj   r   r   r   Ú__contains__á   s    

zNet.__contains__)N)r#   r$   r%   Ú__doc__rM   rH   ÚAF_INETrD   r]   ÚclassmethodrN   rT   ÚstaticmethodrW   r;   rd   r   r@   r"   rg   rA   rl   rm   ro   rq   r   r   r   r   rB   p   s*   




rB   c                   @   s0   e Zd Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
ÚOIDc              	   C   sj   || _ g | _g }| d¡D ]>}d|v rN| d¡ | j ttt| d¡ƒƒ¡ q| |¡ qd |¡| _d S )NÚ.ú-z%i)	ÚoidÚcmptr[   Úappendr/   Úmapr,   ÚjoinÚfmt)r   ry   r~   r+   r   r   r   r;   ï   s    
zOID.__init__c                 C   s
   d| j  S )NzOID(%r))ry   r   r   r   r   rA   ü   s    zOID.__repr__c                 c   s€   dd„ | j D ƒ}| jt|ƒ V  d}|t|ƒkr4d S || | j | d k r^||  d7  < qn| j | d ||< |d7 }q$qd S )Nc                 S   s   g | ]}|d  ‘qS )r   r   )r   Úkr   r   r   r6     r    z OID.__iter__.<locals>.<listcomp>r   r   )rz   r~   r/   r0   )r   Úiir+   r   r   r   r      s    zOID.__iter__c                 C   s   t tjdd„ | jD ƒdƒS )Nc                 s   s$   | ]\}}t || d ƒd V  qdS )r   r   N)Úmax)r   ÚxÚyr   r   r   r     r    z"OID.__iterlen__.<locals>.<genexpr>r   )r   ÚoperatorÚmulrz   r   r   r   r   r"     s    zOID.__iterlen__N)r#   r$   r%   rM   r;   rA   r   r"   r   r   r   r   rv   ì   s
   rv   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚPacket_metaclassc              
      s.  d|v rL|d }g }|D ]0}t |tƒr>|jD ]}| |¡ q,q| |¡ qn"g }|D ]}t|dƒrT|j} qnqT|rìg }	g }
|D ]d}|j|
v r¦d||jf }t |t¡ |
 |j¡ |j|v rØ| 	¡ }||j |_
||j= |	 |¡ q~|	|d< | dg ¡ dD ]0}z| |¡|d| < W qü t�y*   Y qü0 qüz>dd l‰ ˆ  ˆ  dˆ jj¡g‡ fdd	„|d D ƒ ¡|d
< W n tttf�y†   Y n0 tdt | |||¡ƒ}tdd„ |jD ƒƒ|_|gt|dg ƒ |_t|dƒ�rÜ| ¡  |jD ]}t|dƒ�râ| |¡ �qâ|jd dk�r*ddlm } |j!j" #|¡ |S )NÚfields_descz¾Packet '%s' has a duplicated '%s' field ! If you are using several ConditionalFields, have a look at MultipleTypeField instead ! This will become a SyntaxError in a future version of Scapy !r&   )rM   Zoverload_fieldsz_%sr   Z_pktc                    s$   g | ]}ˆ j |jˆ j j|jd �‘qS ))Údefault)Ú	ParameterrM   ÚKEYWORD_ONLYrˆ   )r   Úf©Úinspectr   r   r6   U  s
   ýþz,Packet_metaclass.__new__.<locals>.<listcomp>Ú__signature__zType[scapy.packet.Packet]c                 s   s(   | ] }t |d ƒr|jD ]
}|V  qqdS )r&   N)r*   r&   )r   rF   Úattrr   r   r   r   a  s   
þz+Packet_metaclass.__new__.<locals>.<genexpr>Ú
aliastypesÚregister_variantÚregister_ownerr   ©Úconfig)$r.   r†   r‡   r{   r*   rM   ÚwarningsÚwarnÚSyntaxWarningÚcopyrˆ   Ú
setdefaultÚpopÚKeyErrorr�   Ú	Signaturer‰   ÚPOSITIONAL_ONLYÚImportErrorÚAttributeErrorr   rp   Ú__new__ÚsetÚ__mro__Z__all_slots__Úgetattrr�   r‘   r’   r#   Úscapyr”   ÚconfZlayersÚregister)rF   rM   ÚbasesÚdctZcurrent_fldZresolved_fldZ
fld_or_pktZpkt_fldÚbZ	final_fldÚnamesr‹   Zwar_msgr�   ÚnewclsÚ_fr”   r   rŒ   r   r      s‚    



ÿüÿ	
ÿ
üþÿþ
ÿ
zPacket_metaclass.__new__c                 C   s*   | j D ]}|j|kr|  S qt|ƒ‚d S r   )r‡   rM   rŸ   )r   r�   r   r   r   r   Ú__getattr__u  s    


zPacket_metaclass.__getattr__c                 O   sz   d| j v rPz| j|i |¤Ž} W n0 tyN   ddlm} |jjrB‚ |jj} Y n0 |  | | j	| j
| j ¡}|j|i |¤Ž |S )NÚdispatch_hookr   r“   )Ú__dict__r®   Ú	Exceptionr¤   r”   r¥   Zdebug_dissectorZ	raw_layerr    r#   Ú	__bases__r;   )rF   ÚargsÚkargsr”   r+   r   r   r   Ú__call__|  s     
üzPacket_metaclass.__call__N)r#   r$   r%   r    r­   r´   r   r   r   r   r†     s   [r†   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚField_metaclassc                    s&   |  dg ¡ tt| ƒ | |||¡}|S )Nr&   )r™   Úsuperrµ   r    )rF   rM   r§   r¨   r«   ©rZ   r   r   r    –  s    zField_metaclass.__new__)r#   r$   r%   r    Ú__classcell__r   r   r·   r   rµ   •  s   rµ   c                   @   s   e Zd Zg ZdS )r<   N©r#   r$   r%   r&   r   r   r   r   r<   ¤  s   r<   zscapy.packet.Packetc                   @   s   e Zd Zg ZdS )r9   Nr¹   r   r   r   r   r9   ¬  s   r9   c                   @   s2   e Zd Zdd„ Zd
dd„Zddd„Zddd	„ZdS )Ú_CanvasDumpExtendedc                 K   s   d S r   r   )r   Úkwargsr   r   r   Úcanvas_dump±  s    z_CanvasDumpExtended.canvas_dumpNc                 K   s¼   ddl m} ddlm}m} | jf i |¤Ž}|du r¨|| dd¡d�}| |¡ trh|j	j
sht |¡ q²||j	j
ƒ�" t |j	j
|g¡ W d  ƒ q²1 sœ0    Y  n
| |¡ tƒ  dS )zó
        psdump(filename=None, layer_shift=0, rebuild=1)

        Creates an EPS file describing a packet. If filename is not provided a
        temporary file is created and gs is called.

        :param filename: the file's filename
        r   ©r¥   ©Úget_temp_fileÚContextManagerSubprocessNÚsuffixz.eps©Zautoext)Úscapy.configr¥   Úscapy.utilsr¿   rÀ   r¼   ÚgetZwriteEPSfiler   ÚprogZpsreaderÚosÚ	startfileÚ
subprocessÚPopenÚprint©r   Úfilenamer³   r¥   r¿   rÀ   ZcanvasÚfnamer   r   r   Úpsdumpµ  s    

2
z_CanvasDumpExtended.psdumpc                 K   s¼   ddl m} ddlm}m} | jf i |¤Ž}|du r¨|| dd¡d�}| |¡ trh|j	j
sht |¡ q²||j	j
ƒ�" t |j	j
|g¡ W d  ƒ q²1 sœ0    Y  n
| |¡ tƒ  dS )zõ
        pdfdump(filename=None, layer_shift=0, rebuild=1)

        Creates a PDF file describing a packet. If filename is not provided a
        temporary file is created and xpdf is called.

        :param filename: the file's filename
        r   r½   r¾   NrÁ   z.pdfrÂ   )rÃ   r¥   rÄ   r¿   rÀ   r¼   rÅ   ZwritePDFfiler   rÆ   Z	pdfreaderrÇ   rÈ   rÉ   rÊ   rË   rÌ   r   r   r   ÚpdfdumpÎ  s    

2
z_CanvasDumpExtended.pdfdumpc                 K   s¼   ddl m} ddlm}m} | jf i |¤Ž}|du r¨|| dd¡d�}| |¡ trh|j	j
sht |¡ q²||j	j
ƒ�" t |j	j
|g¡ W d  ƒ q²1 sœ0    Y  n
| |¡ tƒ  dS )zô
        svgdump(filename=None, layer_shift=0, rebuild=1)

        Creates an SVG file describing a packet. If filename is not provided a
        temporary file is created and gs is called.

        :param filename: the file's filename
        r   r½   r¾   NrÁ   z.svgrÂ   )rÃ   r¥   rÄ   r¿   rÀ   r¼   rÅ   ZwriteSVGfiler   rÆ   Z	svgreaderrÇ   rÈ   rÉ   rÊ   rË   rÌ   r   r   r   Úsvgdumpç  s    

2
z_CanvasDumpExtended.svgdump)N)N)N)r#   r$   r%   r¼   rÏ   rÐ   rÑ   r   r   r   r   rº   °  s   

rº   )2rr   Ú
__future__r   Ú	functoolsr   r„   rÇ   re   rK   rH   rP   rÉ   r=   r•   r¤   Zscapy.errorr   Zscapy.constsr   Zscapy.libs.six.movesr   Zscapy.compatr   r   r	   r
   r   r   r   r   r   r   r   r   Úpyxrž   r   r   r3   r4   ri   rB   rv   r†   rµ   ZPacketList_metaclassr<   r9   Úobjectrº   r   r   r   r   Ú<module>   s@   8|-|