
    mg/              
          d 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	m
Z
mZmZ ej                  dk7  rddlZdZdZdZdZdZd	Zd
ZdZdZdZdZdZdZdZdZ G d dej<                        Z G d de      Z  G d de      Z! G d de      Z"de	g ejF                  f   de$de
e$   deeejF                  f   fdZ%y)zSSH TUN/TAP forwarding support    N)CallableOptionalTuplecastwin32      i   l   N  I96sl   i@  l   i@  iT@i   16sHc                   (    e Zd ZdZdej
                  def fdZdej                  fdZ	dej                  ddfd	Z
dd
ZdefdZddZddZdefdZdefdZdeeef   fdZ	 	 ddee   dee   ddfdZddZdeddfdZdefdZddZ xZS )SSHTunTapTransportzLayer 2/3 tunnel transportloop	interfacec                 F    t         |   d|i       || _        d | _        y )Nr   )extra)super__init___loop	_protocol)selfr   r   	__class__s      /lib/python3.12/site-packages/asyncssh/tuntap.pyr   zSSHTunTapTransport.__init__?   s&    Y78
59    returnc                 6    | j                   J | j                   S )z-Get protocol object associated with transport)r   r   s    r   get_protocolzSSHTunTapTransport.get_protocolE   s     ~~)))~~r   protocolNc                 B    t        t        j                  |      | _        y)z&Set protocol associated with transportN)r   asyncioProtocolr   )r   r   s     r   set_protocolzSSHTunTapTransport.set_protocolL   s     g..9r   c                 $    | j                          y)zAbort this transportN)closer   s    r   abortzSSHTunTapTransport.abortQ   s     	

r   c                     t         'Return if the transport is reading dataNotImplementedErrorr   s    r   
is_readingzSSHTunTapTransport.is_readingV   
     "!r   c                     t         )Pause readingr*   r   s    r   pause_readingz SSHTunTapTransport.pause_reading[   r-   r   c                     t         )Resume readingr*   r   s    r   resume_readingz!SSHTunTapTransport.resume_reading`   r-   r   c                      y)z*This transport doesn't support writing EOFF r   s    r   can_write_eofz SSHTunTapTransport.can_write_eofe        r   c                      y)z#This transport has no output bufferr   r5   r   s    r   get_write_buffer_sizez(SSHTunTapTransport.get_write_buffer_sizej   s     r   c                      y)2This transport doesn't support write buffer limits)r   r   r5   r   s    r   get_write_buffer_limitsz*SSHTunTapTransport.get_write_buffer_limitso   s     r   highlowc                      y)r;   Nr5   )r   r=   r>   s      r   set_write_buffer_limitsz*SSHTunTapTransport.set_write_buffer_limitst       r   c                      y)z$Ignore writing EOF on this transportNr5   r   s    r   	write_eofzSSHTunTapTransport.write_eofx   rA   r   datac                     t         )Write a packetr*   r   rD   s     r   writezSSHTunTapTransport.write{   r-   r   c                      y)z"Return if the transport is closingFr5   r   s    r   
is_closingzSSHTunTapTransport.is_closing   r7   r   c                     t         )Close this transportr*   r   s    r   r%   zSSHTunTapTransport.close   r-   r   r   N)NN)__name__
__module____qualname____doc__r!   AbstractEventLoopstrr   BaseProtocolr   r#   r&   boolr,   r0   r3   r6   intr9   r   r<   r   r@   rC   bytesrH   rJ   r%   __classcell__r   s   @r   r   r   <   s    $:W66 :3 :g22 :W%9%9 :d :

"D "
"
"
t 
s 
sCx 
 =A59AHSM A%-c]A>BA3"% "D "
D 
"r   r   c                        e Zd ZdZdej
                  dedee   f fdZde	fdZ
dd	Zdd
ZddZdeddfdZddZ xZS )SSHTunTapOSXTransportzTunTapOSX transportr   modeunitc                 x   |t         k(  rdnd}|Et        d      D ]  }	 t        d| | dd      }|} n2 t        t        j
                  d| d	      t        d| | dd      }| | }|j                         }t        j                  t        j                  t        j                        }		 t        j                  t        |d      }
t        j                  |	t        |
      }
t        j                   t        |
      \  }}|t"        z  }t        j                  t        ||      }
t        j                  |	t$        |
       |	j'                          t(        | U  ||       || _        d | _        t1        j2                  |j5                         d
       y # t        $ r Y w xY w# |	j'                          w xY w)Ntuntap   z/dev/rb+r   	bufferingzNo z devices availableT)SSH_TUN_MODE_POINTTOPOINTrangeopenOSErrorerrnoEBUSYencodesocketAF_INET
SOCK_DGRAMstructpackIFF_FMTfcntlioctlDARWIN_SIOCGIFFLAGSunpackIFF_UPDARWIN_SIOCSIFFLAGSr%   r   r   _file_read_threadosset_blockingfileno)r   r   r\   r]   prefixifiler   namesockifr_flagsr   s                r   r   zSSHTunTapOSXTransport.__init__   s~   ";;<2Y%xs 3UaHD D  ekkS8J+KLL%xv.CDhtf%	!}}V^^V->->?
	++gtQ/C++d$7=C}}Wc2HAuVOE++gtU3CKK137JJLy)
8<
t,?  2 JJLs   F2BF' 	F$#F$'F9r   c                     | j                   duS )r)   N)ry   r   s    r   r,   z SSHTunTapOSXTransport.is_reading   s       ,,r   Nc                 `    | j                   r"| j                   j                          d| _         yy)r/   N)ry   joinr   s    r   r0   z#SSHTunTapOSXTransport.pause_reading   s,     ""$ $D r   c                     | j                   sQt        j                  | j                        | _         d| j                   _        | j                   j                          yy)r2   )targetTN)ry   	threadingThread
_read_loopdaemonstartr   s    r   r3   z$SSHTunTapOSXTransport.resume_reading   sI        ) 0 0 HD'+D$##% !r   c                    | j                   J 	 	 | j                  j                  d      }| j                  j	                  | j                   j
                  |       M# t        $ rW}|j                  t        j                  k7  r0| j                  j	                  | j                   j                  |       Y d}~yd}~ww xY w)z1Loop reading packets until read is paused or doneN   )
r   rx   readr   call_soon_threadsafedata_receivedrh   ri   EBADFconnection_lostr   rD   excs      r   r   z SSHTunTapOSXTransport._read_loop   s     ~~)))
8zzu- 

//NN00$8   99+JJ3366= s   A 	B=&AB88B=rD   c                 :    | j                   j                  |       yrF   Nrx   rH   rG   s     r   rH   zSSHTunTapOSXTransport.write        	

r   c                 X    | j                   j                          | j                          yrL   Nrx   r%   r0   r   s    r   r%   zSSHTunTapOSXTransport.close         	

r   rM   )rN   rO   rP   rQ   r!   rR   rV   r   r   rU   r,   r0   r3   r   rW   rH   r%   rX   rY   s   @r   r[   r[      s_    '-W66 '-c '-}'-R-D -
%&8$% D 
r   r[   c                        e Zd ZdZdej
                  dee   f fdZde	fdZ
ddZdd	Zdd
ZdeddfdZddZ xZS )SSHDarwinUTunTransportzDarwin UTun transportr   r]   c                 4   t        j                   t         j                  t         j                  t         j                        }	 t	        j
                  t        dd      }t        j                  |t        |      }t	        j                  t        |      \  }}|dn|dz
  }|j                  d       |j                  ||f       |j                         \  }}t         | E  |d|dz
          || _        d| _        y # t        $ r |j                           w xY w)Nr   s   com.apple.net.utun_control   Futunr   )rl   	PF_SYSTEMrn   SYSPROTO_CONTROLro   rp   DARWIN_CTLIOCGINFO_FMTrr   rs   DARWIN_CTLIOCGINFOru   setblockingconnectgetpeernamerh   r%   r   r   _sock_reading)	r   r   r]   r   argctl_infoctl_idr   r   s	           r   r   zSSHDarwinUTunTransport.__init__   s    }}V--v/@/@#446	++4a;=C {{4);SAH&<hGIFA1$)DU#LL&$(&&(GAt 	d1fX/
  	JJL	s   BC< <Dr   c                     | j                   S r(   r   r   s    r   r,   z!SSHDarwinUTunTransport.is_reading       }}r   Nc                 \    d| _         | j                  j                  | j                         yr/   FN)r   r   remove_readerr   r   s    r   r0   z$SSHDarwinUTunTransport.pause_reading  s!     

  ,r   c                 r    d| _         | j                  j                  | j                  | j                         yr2   TN)r   r   
add_readerr   _read_readyr   s    r   r3   z%SSHDarwinUTunTransport.resume_reading  )     

djj$*:*:;r   c                    | j                   J 	 	 | j                  j                  d      dd }| j                   j                  |       ;# t        t
        f$ r Y yt        $ r%}| j                   j                  |       Y d}~yd}~ww xY w))Read available packets from the transportNi     )r   r   recvr   BlockingIOErrorInterruptedErrorrh   r   r   s      r   r   z"SSHDarwinUTunTransport._read_ready  s     ~~)))3zzu-ab1 ,,T2  $%56  ..s3s   A B	B	$BB	rD   c                     |d   dz	  }|dk(  rt         j                  nt         j                  }|j                  dd      |z   }| j                  j                  |       y)rF   r   r   bigN)rl   rm   AF_INET6to_bytesr   send)r   rD   versionfamilys       r   rH   zSSHDarwinUTunTransport.write)  sK     q'Q,#*a<V__q%(4/

r   c                 X    | j                   j                          | j                          yr   )r   r%   r0   r   s    r   r%   zSSHDarwinUTunTransport.close2  r   r   rM   )rN   rO   rP   rQ   r!   rR   r   rV   r   rU   r,   r0   r3   r   rW   rH   r%   rX   rY   s   @r   r   r      sV    W66 hsm 8D 
-<3 % D r   r   c                        e Zd ZdZdej
                  dedee   f fdZde	fdZ
dd	Zdd
ZddZdeddfdZddZ xZS )SSHLinuxTunTapTransportzLinux TUN/TAP transportr   r\   r]   c                 H   t        ddd      }|t        k(  rt        t        z  }d}nt        t        z  }d}|dn| | j                         }t        j                  t        ||      }	 t        j                  |t        |      }t        j                  t        |      \  }}	|j                  d      j!                         }
t"        | I  ||
       || _        d	| _        t+        j,                  |j/                         d	       y # t        $ r |j                           w xY w)
Nz/dev/net/tunrb   r   rc   r_   r`   r       F)rg   re   LINUX_IFF_TUNLINUX_IFF_NO_PILINUX_IFF_TAPrk   ro   rp   rq   rr   rs   LINUX_TUNSETIFFrh   r%   ru   stripdecoder   r   rx   r   rz   r{   r|   )r   r   r\   r]   r   r   r}   r   r   r   r   r   s              r   r   z SSHLinuxTunTapTransport.__init__<  s    NEQ7,,!O3EF!O3EFls6(4&(9(@(@(Bkk'4/	++dOS9C
 ---aJJu%,,.	y)

u-  	JJL	s   ,D D!r   c                     | j                   S r(   r   r   s    r   r,   z"SSHLinuxTunTapTransport.is_readingZ  r   r   Nc                 |    d| _         	 | j                  j                  | j                         y# t        $ r Y yw xY wr   )r   r   r   rx   rh   r   s    r   r0   z%SSHLinuxTunTapTransport.pause_reading_  s8     	JJ$$TZZ0 		s   %/ 	;;c                 r    d| _         | j                  j                  | j                  | j                         yr   )r   r   r   rx   r   r   s    r   r3   z&SSHLinuxTunTapTransport.resume_readingi  r   r   c                     | j                   J 	 	 | j                  j                  d      }|y| j                   j                  |       ;# t        $ r%}| j                   j                  |       Y d}~yd}~ww xY w)r   Nr   )r   rx   r   r   rh   r   r   s      r   r   z#SSHLinuxTunTapTransport._read_readyo  sv     ~~)))	3zzu-
 <,,T2   ..s3s   A 	A9A44A9rD   c                 :    | j                   j                  |       yr   r   rG   s     r   rH   zSSHLinuxTunTapTransport.write  r   r   c                 X    | j                   j                          | j                          yr   r   r   s    r   r%   zSSHLinuxTunTapTransport.close  r   r   rM   )rN   rO   rP   rQ   r!   rR   rV   r   r   rU   r,   r0   r3   r   rW   rH   r%   rX   rY   s   @r   r   r   9  s^    !.W66 .c .}.<D 
<3"% D 
r   r   protocol_factoryr\   r]   r   c                 .   t        j                         }d}t        j                  dk(  r:|	 t	        |||      }nu|t        k(  r|dk\  rt        ||      }nZt	        |||      }nLt        j                  dk(  rt        |||      }n+t        t        j                  dt        j                         |J  |        }|j                  |       |j                  |       |j                          ||fS # t
        $ r |t        k(  rt        ||      }n Y cw xY w)z+Create a local TUN or TAP network interfaceNdarwinra   linuxzTunTap not supported on )r!   get_event_loopsysplatformr[   rh   re   r   r   ri   EPROTONOSUPPORTconnection_mader#   r3   )r   r\   r]   r   	transportr   s         r   create_tuntapr     s   
 !!#D.2I
||x<1$dC	 ..42:.tT:I-dD$?I		 +D$=	e++0?A 	A    !HY'8$h/  44 6tT BI s   C1 1 DD)&rQ   r!   ri   rz   rl   ro   r   r   typingr   r   r   r   r   rr   re   SSH_TUN_MODE_ETHERNETSSH_TUN_UNIT_ANYSSH_TUN_AF_INETSSH_TUN_AF_INET6r   r   rt   rw   r   r   r   r   rq   rv   	Transportr   r[   r   r   rT   rV   r   r5   r   r   <module>r      s  * %   	   
  2 2<<7           
	L"** L"^[. [|M/ M`P0 Pf#HR1E1E-E$F ###+C=# '"6"667#r   