o
    jA&                     @   s&   d dl Z d dlmZ G dd dZdS )    N)string_typesc                   @   s   e Zd ZdZdZdZed Zee e ZdZdZ	dd Z
d	d
 Zdd Zd7d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$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zed2d3 Z d4d5 Z!d6S )8IP6_Address            :%c                 C   s@   t  dd| j | _d| _t|tr| | d S | | d S )NB     )arrayADDRESS_BYTE_SIZE_IP6_Address__bytes_IP6_Address__scope_id
isinstancer   _IP6_Address__from_string_IP6_Address__from_bytesselfaddress r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/impacket/IP6_Address.py__init__   s
   
zIP6_Address.__init__c                 C   s  |  |r|| j}|d }|d dkrtd|d | _| |r(| |}| |}t|| j	kr=tdt
| j	 || j}t|| jkrStdt
| j d}|D ]-}t|| jkritdt
| j t|d}|d	@ d
? | j|< |d@ | j|d < |d7 }qWd S )Nr   r   r   zEmpty scope IDz,IP6_Address - from_string - address size != z#IP6_Address - parsed hex groups != z)IP6_Address - parsed hex group length != r   i   r         )!_IP6_Address__is_a_scoped_addresssplitSCOPE_SEPARATOR	Exceptionr   +_IP6_Address__is_address_in_compressed_form'_IP6_Address__expand_compressed_address#_IP6_Address__insert_leading_zeroeslenADDRESS_TEXT_SIZEstr	SEPARATORTOTAL_HEX_GROUPSHEX_GROUP_SIZEintr   )r   r   split_parts
hex_groupsoffsetgroupgroup_as_intr   r   r   __from_string(   s.   






zIP6_Address.__from_stringc                 C   s*   t || jkrtdt| j || _d S )Nz)IP6_Address - from_bytes - array size != )r#   r   r   r%   r   )r   theBytesr   r   r   __from_bytesL   s   
zIP6_Address.__from_bytesTc                 C   s   d}t | jD ]\}}|t|dd  dd7 }|d dkr$|| j7 }q|d d  }|r9| |}| |}|rI|  dkrI|| j	| j
 7 }|S )Nr   r   0r   )	enumerater   hexrjustr&   upper!_IP6_Address__trim_leading_zeroes%_IP6_Address__trim_longest_zero_chainget_scope_idr   r   )r   compress_addressscoped_addresssivr   r   r   	as_stringS   s   


zIP6_Address.as_stringc                 C      | j S Nr   r   r   r   r   as_bytesc      zIP6_Address.as_bytesc                 C   s   |   S rB   r@   rD   r   r   r   __str__f   s   zIP6_Address.__str__c                 C   rA   rB   )r   rD   r   r   r   r:   i   rF   zIP6_Address.get_scope_idc                 C   s   |  ddS NTFrG   rD   r   r   r   get_unscoped_addressl   s   z IP6_Address.get_unscoped_addressc                 C      | j d dkS )Nr   r   rC   rD   r   r   r   is_multicastq      zIP6_Address.is_multicastc                 C   rK   )Nr      rC   rD   r   r   r   
is_unicastt   rM   zIP6_Address.is_unicastc                 C   s   |   o| jd d@ dkS )Nr         rO   r   rD   r   r   r   is_link_local_unicastw      z!IP6_Address.is_link_local_unicastc                 C   s   |   o| jd d@ dkS )Nr   rP   rR   rD   r   r   r   is_site_local_unicastz   rT   z!IP6_Address.is_site_local_unicastc                 C   rK   )Nr      rC   rD   r   r   r   is_unique_local_unicast}   rM   z#IP6_Address.is_unique_local_unicastc                 C   s@   |   rdS |  r|  rdS |  rdS dS |  rdS dS )N	multicastzlink-local unicastzsite-local unicastunicastzunique-local unicastzunknown type)rL   rO   rS   rU   rW   rD   r   r   r   get_human_readable_address_type   s   z+IP6_Address.get_human_readable_address_typec                 C   sF   | | jd dkrtd| |}|dkrdS |dkrdS td)N   r   z IP6_Address - found triple colonFr   Tz;IP6_Address - more than one compression marker ("::") found)countr&   r   &_IP6_Address__count_compression_marker)r   r   compression_marker_countr   r   r   __is_address_in_compressed_form   s   
z+IP6_Address.__is_address_in_compressed_formc                 C   s$   | | jd | j}|| jd S )Nr   r   )replacer&   r\   )r   r   trimmed_addressr   r   r   __count_compressed_groups   s   z%IP6_Address.__count_compressed_groupsc                 C   s   | | jd S )Nr   )r\   r&   r   r   r   r   __count_compression_marker      z&IP6_Address.__count_compression_markerc                 C   sL   | | j}d}|D ]}t|dk r|dd}||| j 7 }q
|d d S )Nr   r   r2   r3   )r   r&   r#   r6   )r   r   r+   new_address	hex_groupr   r   r   __insert_leading_zeroes   s   z#IP6_Address.__insert_leading_zeroesc                 C   sz   |  |}| j| }|| jd d }|r1|d | d | j ||d   }|d7 }|d8 }|s|| jd | j}|S )Nr   r   0000   )%_IP6_Address__count_compressed_groupsr'   findr&   r`   )r   r   group_countgroups_to_insertposr   r   r   __expand_compressed_address   s   

"z'IP6_Address.__expand_compressed_addressc           	      C   s   d}|dkrj| | j}t|D ]Q\}}|dkra|}|}|dk r8||d  dkr8|d7 }|dk r8||d  dks(|| d }||kra| j|d| | jd  | j||d d   }|  S q|d8 }|dks|S )Nr   r   r2      r   r   )r   r&   r4   join)	r   r   
chain_sizegroupsindexr-   start_index	end_index
found_sizer   r   r   __trim_longest_zero_chain   s$   6z%IP6_Address.__trim_longest_zero_chainc                 C   sR   | | j}d}|D ]}|d| j }|| jkrd| j }||7 }q
|d d S )Nr   r2   r3   )r   r&   lstrip)r   theStrrs   r-   r   r   r   __trim_leading_zeroes   s   


z!IP6_Address.__trim_leading_zeroesc                 C   s$   zt | W dS  ty   Y dS w rI   )r   r   )clstext_representationr   r   r   is_a_valid_text_representation   s   z*IP6_Address.is_a_valid_text_representationc                 C   s   | | jdkS )Nr   )r\   r   )r   r}   r   r   r   __is_a_scoped_address   rd   z!IP6_Address.__is_a_scoped_addressN)TT)"__name__
__module____qualname__r   r'   r(   TOTAL_SEPARATORSr$   r&   r   r   r   r   r@   rE   rH   r:   rJ   rL   rO   rS   rU   rW   rZ   r    rj   r]   r"   r!   r9   r8   classmethodr~   r   r   r   r   r   r      s@    $

r   )r   sixr   r   r   r   r   r   <module>   s   