
    mgVZ                     H   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mZ ddlm	Z	m
Z
 ddlmZ ddlmZmZmZmZmZmZ ddlmZmZmZmZ dd	lmZ dd
lmZ ddlmZmZmZ ddlm Z m!Z! edeee   f   Z"de#de$fdZ% G d de&      Z' G d d      Z( G d de(      Z) G d de(      Z*y)zParser for OpenSSH config files    N)sha1)PathPurePath)DEVNULL)CallableDictListNoReturnOptionalSequence)SetTupleUnioncast   )DEFAULT_PORT)logger)DefTupleFilePath
ip_address)HostPatternListWildcardPatternListcmdreturnc                 j    t        j                  | ddt        t        t              j                  dk(  S )z0Execute a command and return if exit status is 0FT)checkshellstdinstdoutstderrr   )
subprocessrunr   
returncode)r   s    /lib/python3.12/site-packages/asyncssh/config.py_execr%   ,   s0     >>#U$g!(::D*J J    c                       e Zd ZdZy)ConfigParseErrorzConfiguration parsing exceptionN)__name__
__module____qualname____doc__ r&   r$   r(   r(   3   s    )r&   r(   c                   2   e Zd ZU dZdhZ e       Zee   e	d<   dhZ
i Zeeeeef   f   e	d<   ded    defdZd	ed
edefdZdedefdZd%dZdedefdZded
ee   ddfdZded
ee   ddfdZded
ee   ddfdZded
ee   ddfdZded
ee   ddfdZded
ee   ddfdZded
ee   ddfdZded
ee   ddfdZ ded
ee   ddfdZ!ded
ee   ddfdZ"de#ddfdZ$dedeeef   fdZ%e&ded    d e'ded
edd f
d!       Z(d&ded"edefd#Z)de*e   fd$Z+y)'	SSHConfigz$Settings from an OpenSSH config filematch	_no_splitAuthorizedKeysFile	_handlerslast_configreloadc                    |r|j                  |      | _        ni | _        t        dd      j                         | _        t               | _        d| _        d| _        | j                  j                         | _	        i | _
        d| _        y )N~z.sshr   TF)get_options_last_optionsr   
expanduser_default_path_path_line_no	_matchingcopy_options_tokensloaded)selfr4   r5   s      r$   __init__zSSHConfig.__init__?   ss    !,!8!8!@D!#D!#v.99;V
**//1')r&   reasonargsr   c                 V    t        | j                  d| j                  d||z        )z#Raise a configuration parsing errorz line z: )r(   r<   r=   )rC   rE   rF   s      r$   _errorzSSHConfig._errorN   s,     4::t}}39D= B C 	Cr&   c                     t         )6Return the value to match against in a match conditionNotImplementedErrorrC   r0   s     r$   
_match_valzSSHConfig._match_valT   
     "!r&   Nc                     t         ).Set the tokens available for percent expansionrK   rC   s    r$   _set_tokenszSSHConfig._set_tokensY   rO   r&   valuec                    d}g }t        j                  d|      D ]I  }|j                         }||k  r	 ||dz      }|j                  ||| | j                  |   g       |dz   }K |j                  ||d        dj                  |      S # t
        $ r t        d      dt        $ r8 dk(  rt        d      d|d	k(  rt        d
      dt        d||dz      z        dw xY w)z+Perform percent token expansion on a stringr   %r      zInvalid token substitutionNdzHome directory is not availableizUser id not availablezInvalid token substitution: %s )
refinditerstartextendrA   
IndexErrorr(   KeyErrorappendjoin)rC   rT   last_idxresultr0   idxtokens          r$   _expand_valzSSHConfig._expand_val^   s    [[u-E++-CX~Cc!euXc2DLL4GHI7 ., 	eHI&'wwv  O&'CD$N CC<* ,; <AEFc\*+BCM*+K+0Q<,8 9>BCCs   0BAC!optionc                    | j                   }|D ]  }t        |      j                         }|j                  r4t	        t        |j
                  dd        }t        |j                        }n| j                  }t        |j                  |            }|st        j                  d|       |D ]  }| j                  |         || _         |j                          y)z-Read config from a list of other config filesr   Nz$Config pattern "%s" matched no files)r<   r   r:   anchorstrpartsr;   listglobr   debug1parseclear)rC   rh   rF   old_pathpatternpathpathss          r$   _includezSSHConfig._include}   s    
 ::G=++-D{{dDJJqrN34DKK())7+,EDgN

4   " 


r&   c                    |r!|j                  d      j                         }|dk(  rd| _        /| j                  |      }|dk7  r|| j	                  d       	 |dk(  r t        |j                  d            | _        n|dv rPt        |j                  d            }|rt        t        t        |            nd}|j                  d||      | _        n0t        |j                  d            }|j                  |      | _        | j                  s|j                          y|r yy# t        $ r | j	                  d|       Y @w xY w)	zBegin a conditional blockr   allTexecNzInvalid match condition)addresslocaladdresszMissing %s match pattern)poplowerr>   rN   rH   r%   r   r   r   rk   matchesr   r_   rq   )rC   rh   rF   r0   	match_valhost_patipwild_pats           r$   _matchzSSHConfig._match   s    
 HHQK%%'E~!%.I9#456?F?%*488A;%7DN99.txx{;H$ $Di$89*. %-%5%5dIr%JDN2488A;?H%-%5%5i%@DN >>

9 .  ?6>?s   B)D& &EEc                     |j                  d      j                         }|dv rd}n|dv rd}n| j                  d||       || j                  vr| j                  |<   yy)zSet a boolean config optionr   yestrueTnofalseFzInvalid %s boolean value: %sNr|   r}   rH   r@   rC   rh   rF   	value_strrT   s        r$   	_set_boolzSSHConfig._set_bool   sd     HHQK%%'	'E/)EKK6	J&$)DMM&! 'r&   c                     |j                  d      }	 t        |      }|| j                  vr| j                  |<   yy# t        $ r | j                  d||       Y =w xY w)zSet an integer config optionr   zInvalid %s integer value: %sN)r|   int
ValueErrorrH   r@   r   s        r$   _set_intzSSHConfig._set_int   se     HHQK		K	NE &$)DMM&! '  	KKK6	J	Ks   = AAc                     |j                  d      }|j                         dk(  rd}n|}|| j                  vr|| j                  |<   yy)zSet a string config optionr   noneNr|   r}   r@   r   s        r$   _set_stringzSSHConfig._set_string   sI     HHQK	??&EE&$)DMM&! 'r&   c                 .   |j                  d      }|j                         dk7  rS|| j                  v r4t        t        t
           | j                  |         j                  |       y|g| j                  |<   y|| j                  vrg | j                  |<   yy)z'Append a string config option to a listr   r   N)r|   r}   r@   r   r	   rk   ra   )rC   rh   rF   r   s       r$   _append_stringzSSHConfig._append_string   s}     HHQK	??&&T#Yf 56==iH)2f%T]]*(*f% +r&   c                     || j                   vrFt        |      dk(  r&|d   j                         dk(  rg | j                   |<   n|dd | j                   |<   |j                          y)z8Set whitespace-separated string config options as a listr   r   r   N)r@   lenr}   rq   rC   rh   rF   s      r$   _set_string_listzSSHConfig._set_string_list   sU     &4yA~$q'--/V";(*f%(,Qf%

r&   c                     || j                   v r4t        t        t           | j                   |         j	                  |       n|dd | j                   |<   |j                          y)z;Append whitespace-separated string config options to a listN)r@   r   r	   rk   r^   rq   r   s      r$   _append_string_listzSSHConfig._append_string_list   sM     T]]"cDMM&1299$?$(GDMM&!

r&   c                 (   |j                  d      j                         }|dk(  rt        j                  }n?|dk(  rt        j                  }n)|dk(  rt        j
                  }n| j                  d||       || j                  vr| j                  |<   yy)z#Set an address family config optionr   anyinetinet6Invalid %s value: %sN)r|   r}   socket	AF_UNSPECAF_INETAF_INET6rH   r@   r   s        r$   _set_address_familyzSSHConfig._set_address_family  s     HHQK%%'	$$E& NNE'!OOEKK.	B&$)DMM&! 'r&   c                     |j                  d      j                         }|dk(  rd}|r'|j                  d      j                         }|dk(  rd}nd}|| j                  vr||f| j                  |<   yy)zSet rekey limits config optionr   defaultr-   r   Nr   )rC   rh   rF   
byte_limit
time_limits        r$   _set_rekey_limitszSSHConfig._set_rekey_limits  sv     -1HHQK,=,=,?
"J:>((1+:K:K:MJV#!
J&$.
$:DMM&! 'r&   rt   c                    || _         d| _        d| _        ddi| _        t	        j
                  d|       t        |      5 }|D ]  }| xj                  dz  c_        |j                         }|r|d   dk(  r4	 t        j                  |      }g }d}d}t        d      D ]  \  }	}
|
j                  d	      r#t        |
      dkD  r|j!                  |
dd        n|s|j#                  ||	dz
  d         n|
j%                  d	      r|j!                  |
dd
        nMd	|
v r8|
j                  d	d      \  }
}|j!                  |
       |j!                  |       n|j!                  |
       |	dk(  s|j'                  d      j)                         }|| j*                  v } || j,                  v r+|j/                         t        |      d j                         g}| j                  s|| j*                  vr	 | j0                  |   \  }}|s| j                  d|        || ||       |s| j                  ddj5                  |              	 ddd       | j7                          | j8                  D ]q  }	 | j:                  |   }t=        |t>              r|D cg c]  }| jA                  |       }}n!t=        |t              r| jA                  |      }|| j:                  |<   s y# t        $ r%}| j                  t        |             Y d}~d}~ww xY w# t2        $ r Y w xY w# 1 sw Y   xY wc c}w # t2        $ r Y w xY w)z=Parse an OpenSSH config file and return matching declarationsr   TrV   zReading config from "%s"r   #NrZ   =zMissing %s valuezExtra data at end: %s )!r<   r=   r>   rA   r   ro   openstripshlexsplitr   rH   rk   	enumerate
startswithr   ra   r^   endswithr|   r}   _conditionalsr1   lstripr3   r`   rb   rS   _percent_expandr@   
isinstancerm   rg   )rC   rt   fileline
split_argsexcrF   loptionallow_equalrY   argvalrh   handlerrT   items                   r$   rp   zSSHConfig.parse+  s    
Sz0$7$Z4"zz|tAw#~*!&T!2J "'
A6FAs~~c*s8a< KKAB0(Jqst$45c*CH-#&99S!#4SC(C(C(Av"&((1+"3"3"5&-1C1C&C% 7( dnn, KKM#g,-8>>@AD~~'9K9K*K&*nnW&=OFG KK 2F;fd+KK 7$Hk  p 	**F
.f- eT*@EFT--d3EFs+ ,,U3E(-f% +a " *KKC))*F   [ ZB G	  s    7L%8K$CL%-BL%2L L%&$L%3L6L1$	L-LL%LL%	L"L%!L""L%%L.6	MMc                 n    |r| j                   j                         S | j                  j                         S )z-Return options to base a new config object on)r9   r?   r@   )rC   r5   s     r$   r8   zSSHConfig.get_options|  s-     -3t!!&&(L8J8J8LLr&   config_pathsc                      | ||g| }|rDt        |t        t        f      r|g}n|}|D ]  }|j                  t	        |              d|_        |S )z8Load a list of OpenSSH config files into a config objectT)r   rk   r   rp   r   rB   )clsr4   r   r5   rF   configru   rt   s           r$   loadzSSHConfig.load  sZ     [&040,h8-9N$T$Z(  !FMr&   r   c                 :    | j                   j                  ||      S )z Get the value of a config option)r@   get)rC   rh   r   s      r$   r   zSSHConfig.get  s     }}  11r&   c                 2    | j                  d      }|y|ryy)z(Return the compression algorithms to useCompressionr-   zzlib@openssh.com,zlib,noneznone,zlib@openssh.com,zlib)r   )rC   compressions     r$   get_compression_algszSSHConfig.get_compression_algs  s$     hh}-//r&   r   NN),r)   r*   r+   r,   r   setr1   r   rk   __annotations__r   r3   r   r   r   r   boolrD   objectr
   rH   rN   rS   rg   r	   rv   r   r   r   r   r   r   r   r   r   r   rp   r8   classmethodConfigPathsr   r   r   r   r-   r&   r$   r/   r/   7   so   .IM%Is3x+,O13ItCsH}--.3H[$9 4 CS C CH C" " "
"
  >s $s)  6!S !S	 !d !F* *49 * **s *$s) * **# *T#Y *4 *+S +S	 +d +	s 	$s) 	 	# T#Y 4 *# *T#Y *4 *"; ;49 ; ;&O.$ O.4 O.bM$ M4V+< M
 x4 &04* (2# 2 2& 2

0hsm 
0r&   r/   c                      e Zd ZdZddhZddhZh dZddd	ed
ededede	ddffdZ
dedefdZdedee   ddfdZdedee   ddfdZdedee   ddfdZdEdZg defdej&                  fdej(                  fdej*                  fdej,                  fdej,                  fdej.                  fdej0                  fdej,                  fd ej0                  fd!ej2                  fd"ej0                  fd#ej0                  fd$ej0                  fd%ej4                  fd&ej0                  fd'ej0                  fd(ej0                  fd)ej0                  fd*ej,                  fd+efd,ej,                  fd-ej0                  fd.ej,                  fd/ej.                  fd0ej0                  fd1ej,                  fd2ej,                  fd3ej0                  fd4ej,                  fd5ej,                  fd6ej2                  fd7ej,                  fd8ej,                  fd9ej0                  fd:ej6                  fd;ej,                  fd<efd=ej8                  fd>ej2                  fd?ej2                  fd@ej4                  fdAej,                  fdBej0                  fdCej,                  fdDej4                  fD  ci c]  \  }}|j;                         ||f c}}} ZxZS c c}}} w )FSSHClientConfigz+Settings from an OpenSSH client config filehostr0   proxycommandremotecommand>   IdentityFileProxyCommandIdentityAgentRemoteCommandCertificateFiler4   r/   r5   
local_useruserportr   Nc                     t         |   ||       || _        || _        |dk7  r|| j                  d<   |dk7  r|| j                  d<   y y )Nr-   UserPort)superrD   _local_user
_orig_hostr@   )rC   r4   r5   r   r   r   r   	__class__s          r$   rD   zSSHClientConfig.__init__  sP    f-%2:$(DMM&!2:$(DMM&! r&   c                 6   |dk(  r&| j                   j                  d| j                        S |dk(  r| j                  S |dk(  r| j                  S |dk(  r&| j                   j                  d| j                        S |dk(  r| j                   j                  dd	      S y
)rJ   r   Hostnameoriginalhost	localuserr   r   taggedTagrZ   N)r@   r   r   r   rM   s     r$   rN   zSSHClientConfig._match_val  s     F?==$$ZAAn$??"k!###f_==$$VT-=-=>>h==$$UB//r&   rh   rF   c                     dj                  |      }t        |      j                  | j                        | _        |j                          y)z*Begin a conditional block matching on host,N)rb   r   r~   r   r>   rq   )rC   rh   rF   rs   s       r$   _match_hostzSSHClientConfig._match_host  s5    
 ((4.,W5==dooN

r&   c                    |j                  d      }|| j                  vr`t        t        | j                  j	                  || j
                              | j                  d<   | j                  |      | j                  |<   yy)zSet hostname config optionr   hN)r|   r@   r   rk   r   r   rA   rg   )rC   rh   rF   rT   s       r$   _set_hostnamezSSHClientConfig._set_hostname  sh     &S$--++FDOODE LL$($4$4U$;DMM&! 'r&   c                     |j                  d      j                         }|dv rd}n!|dv rd}n|dvr| j                  d||       n|}|| j                  vr| j                  |<   yy)	z+Set a pseudo-terminal request config optionr   r   Tr   F)forceautor   Nr   r   s        r$   _set_request_ttyz SSHClientConfig._set_request_tty  sr     HHQK%%'	'&*E/)E//KK.	BE&$)DMM&! 'r&   c                 T   t        j                         }|j                  d      }|dk  r|n|d| }t        t        | j
                  j                  d| j                              }t	        | j
                  j                  dt                    }t        t        | j
                  j                  d      xs | j                        }t        j                  j                  d      }dj                  ||||f      }t        |j                  d	            j!                         }	| j"                  j%                  |	|||| j                  ||| j                  d
       |dk7  r|| j"                  d<   t'        t        d      r+t	        t        j(                               | j"                  d<   yy)rQ   .r   Nr   r   r   r7   rZ   zutf-8)Cr   LlnprurX   getuidrY   )r   gethostnamefindr   rk   r@   r   r   r   r   osrt   r:   rb   r   encode	hexdigestrA   updatehasattrr	  )
rC   
local_hostre   short_local_hostr   r   r   home	conn_info	conn_hashs
             r$   rS   zSSHClientConfig._set_tokens  sW    '')
ooc"),q:j#6FC**:tGH4==$$V\:;C**62Fd6F6FGww!!#&GGZtT:;	))'23==?	)"&"2","&//"&"&"&"2"24 	5 3; $DLL2x  #BIIK 0DLL !r&   HostMatchIncludeAddressFamilyBindAddressCASignatureAlgorithmsr   ChallengeResponseAuthenticationCiphersr   ConnectTimeoutEnableSSHKeySignForwardAgentForwardX11TrustedGlobalKnownHostsFileGSSAPIAuthenticationGSSAPIDelegateCredentialsGSSAPIKeyExchangeHostbasedAuthenticationHostKeyAlgorithmsr   HostKeyAliasIdentitiesOnlyr   r   KbdInteractiveAuthenticationKexAlgorithmsMACsPasswordAuthenticationPKCS11ProviderPreferredAuthenticationsr   r   	ProxyJumpPubkeyAuthentication
RekeyLimitr   
RequestTTYSendEnvServerAliveCountMaxServerAliveIntervalSetEnvr   TCPKeepAliver   UserKnownHostsFiler   ) r)   r*   r+   r,   r   r1   r   r   rk   r   rD   r   rN   r	   r   r   r   rS   r/   r   rv   r   r   r   r   r   r   r   r   r}   r3   __classcell__.0rh   r   r   s   000@r$   r   r     s
   5W%M1IHO)K ) ) )(+)36)>A)FJ)   # T#Y 4 <C <tCy <T <*s *$s) * *"1>0K	K80K	I,<,<=0K 
I,>,>?0K
 
I,I,IJ0K 
I,A,AB0K 
!I,A,AB0K 
I,D,DE0K 
+I,?,?@0K 
I,A,AB0K 
I,?,?@0K 
I,>,>?0K 
I,?,?@0K 
I,?,?@0K 
I,?,?@0K  
 I,F,FG!0K" 
 I,?,?@#0K$ 
%I,?,?@%0K& 
I,?,?@'0K( 
#I,?,?@)0K* 
I,A,AB+0K, 
M:-0K. 
I,A,AB/0K0 
I,?,?@10K2 
I,A,AB30K4 
I,D,DE50K6 
(I,?,?@70K8 
I,A,AB90K: 
I,A,AB;0K< 
"I,?,?@=0K> 
I,A,AB?0K@ 
$I,A,ABA0KB 
I,>,>?C0KD 
I,A,ABE0KF 
I,A,ABG0KH 
 I,?,?@I0KJ 
I,G,GHK0KL 
I,A,ABM0KN 
,<=O0KP 
I,I,IJQ0KR 
I,>,>?S0KT 
I,>,>?U0KV 
I,F,FGW0KX 
I,A,ABY0KZ 
I,?,?@[0K\ 
I,A,AB]0K^ 
I,F,FG_0K 0 0Kvw&'!22 0K 0I 0s   K.r   c                      e Zd ZdZdddededededed	ed
dffdZded
efdZ	d,dZ
dej                  fdej                  fdej                  fdej                  fdej                   fdej"                  fdej"                  fdej                   fdej"                  fdej$                  fdej$                  fdej                   fdej                   fdej                   fdej                   fdej&                  fd ej&                  fd!ej                   fd"ej"                  fd#ej$                  fd$ej"                  fd%ej                   fd&ej                   fd'ej$                  fd(ej                   fd)ej(                  fd*ej                   fd+ej                   ffD  ci c]  \  }}|j+                         ||f c}}} ZxZS c c}}} w )-SSHServerConfigz+Settings from an OpenSSH server config filer4   r/   r5   
local_addr
local_portr   r   addrr   Nc                 t    t         |   ||       || _        || _        || _        |xs || _        || _        y r   )r   rD   _local_addr_local_port_user_host_addr)	rC   r4   r5   r?  r@  r   r   rA  r   s	           r$   rD   zSSHServerConfig.__init__F  s=     	f-%%
\T

r&   r0   c                     |dk(  r| j                   S |dk(  rt        | j                        S |dk(  r| j                  S |dk(  r| j                  S |dk(  r| j
                  S y)rJ   r{   	localportr   r   rz   N)rC  rk   rD  rE  rF  rG  rM   s     r$   rN   zSSHServerConfig._match_valQ  sh     N"###k!t''((f_::f_::i::r&   c                 R    | j                   j                  d| j                  i       y)rQ   r  N)rA   r  rE  rR   s    r$   rS   zSSHServerConfig._set_tokensa  s     	S$**-.r&   r  r  r  r2   AllowAgentForwardingr  r  r  r  ClientAliveCountMaxClientAliveIntervalr   r#  r%  r&  HostCertificateHostKeyr*  r+  LoginGraceTimer,  r-  	PermitTTYr   r1  r2  r8  UseDNSr   )r)   r*   r+   r,   r   rk   r   rD   r   rN   rS   r/   r   rv   r   r   r   r   r   r   r   r}   r3   r:  r;  s   000@r$   r>  r>  C  s'   5	K 	 	 	.1	9<		"%	*.	   / 
I,<,<=	I,>,>?	I,I,IJ	I,F,FG	I,?,?@	I,A,AB	 I,A,AB	*I,?,?@	I,A,AB	I,>,>?	I,>,>?	I,?,?@	I,?,?@	I,?,?@	"I,?,?@	I,D,DE	I,D,DE	'I,?,?@	I,A,AB	I,>,>?	I,A,AB	!I,?,?@	I,?,?@	I,>,>?	I,?,?@	I,G,GH	I,?,?@	I,?,?@;K  Kvw&'!22 K I s   Gr>  )+r,   r  r[   r   r   r!   hashlibr   pathlibr   r   r   typingr   r   r	   r
   r   r   r   r   r   r   	constantsr   loggingr   miscr   r   r   rs   r   r   r   rk   r   r%   r   r(   r/   r   r>  r-   r&   r$   <module>rY     s   * & 	 	     "  E E * * #  0 0 9 D(HX$667Js Jt J*z *n0 n0bXi XvAi Ar&   