Xׯd!efddlZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl Z ddl m Z mZmZmZmZmZddlmZmZddlZdZdZdZdZee dre jZnGd de jZGd d e jZdaGd d ej Z!GddZ"dS)N) log_warning log_error log_debug log_debug2 log_debug3log_info)SSHFingerprintNewErrorformat_bad_host_exceptioni  WarningPolicyceZdZdZdS)rc ddl}td|d|d||ddS)NrzWARNING: Unknown z host key for :  )binasciirget_namehexlifyget_fingerprint)selfclienthostnamekeyrs ..\sshtunnel.pymissing_host_keyzWarningPolicy.missing_host_key6s OOO Ks||~~~~W_W_W_aiaqaqrusFsFsHsHbIbIbIbIJ K K K K KN__name__ __module__ __qualname__rrrrr5s( K K K K KrceZdZdZdS)StoreIfConfirmedPolicyc&td|||)NzKey mismatched)r )rrrrs rrz'StoreIfConfirmedPolicy.missing_host_key;s$%5vxMMMrNrr"rrr$r$:s(NNNNNrr$c`eZdZdZfdZdZdZdZdZddZ d Z d Z d Z d Z d ZxZS)TunnelaThis class is a threaded implementation of an SSH tunnel. You should not access the attributes that starts with an underscore outside this thread of execution (e.g. self._server) for this could run into race conditions. Even when accessing its public attributes (those that don't start with an underscore) you should be careful of acquiring the self.lock reentrant lock (and releasing it once done): with tunnel.lock: if tunnel.connecting: ... whatever... ctt|d|_||_||_||_||_||_tj |_ tj |_ d|_d|_||_d|_d|_t'j|_g|_dS)NTF)superr'__init__daemon_server _username_target _password_keyfile threadingRLocklockEvent port_is_set local_port _listen_sockq _shutdown connectingparamiko SSHClient_client _connections)rr8serverusernametargetpasswordkeyfile __class__s rr*zTunnel.__init__Ns fd$$&&&  ! ! O%% %?,, )++ rcR|j5|jcdddS#1swxYwYdSN)r3r:rs r is_connectingzTunnel.is_connectingjss Y # #? # # # # # # # # # # # # # # # # # #s   c |dS#t$r}td|zYd}~dSd}~wwxYw)Nz&Unhandled exception in SSH tunnel: %s )do_run Exceptionr)res rrunz Tunnel.runnsb E KKMMMMM E E E ?!C D D D D D D D D D Es ?:?c V tdz atjdtztjdtdtztj|_ tj dd} |j d|f|j d |j5||_dddn #1swxYwY |j5d|_dddn #1swxYwY|jn#tj$r}tjd ||fz|j\}}|d krEYd}~|j5d|_dddn #1swxYwY|j<|d d t j|d}~wwxYw#|j5d|_dddn #1swxYwY|jwxYw|jr<|dd|jdd|jdd|jdn3|dd|jdd|jdd|}|s |j d|_|j5d|_dddn #1swxYwY|r|dd|`t=j}|js |j g}|jD]/\}} | || | 0tCj!|ggtD\} } } nJ#tF$r=} |js+|d d| zt jYd} ~ n>d} ~ wwxYw| sgtI|dkrTt=j|z tDkr5|dd|jdd|jddnt=j}|j | vr*|dd|%g}|jD]\}} || vrD|&d}|s| || fn| '|| | vrD| &d}|s| || f|'|t%|D]t}|\}} |n#YnxYw | n#YnxYw|dd|z|j(|u|rZ|jsSt=j|z tDkr4|dd|jdd|jddn|j|jD]>\}} |n#YnxYw | 8#YappendselectTUNNEL_TIMEOUTrKlen accept_clientrecvsendremover=r)rr6excerrmsg connected last_activitysockssockchanrwxrLcloseddataitems rrJz Tunnel.do_runusg ((})DEEE +,,,2]BCCC"MOO +#^D%88 +%**K+DEEE%,,Q///55*4555555555555555//*.///////////////$((****|J$$%EjHY%Y[[["xHCbyy //*.///////////////$((**** //8acfcocqcqrrrI //*.///////////////$((**** = n KKW[WcdeWfWfWfhlhtuvhwhwhwy}zGzGzG!H J J J J KK$,WX///[_[ghi[j[j[j k m m m%%''  "   # # % % %!DN Y $ $#DO $ $ $ $ $ $ $ $ $ $ $ $ $ $ $  5 KK 3 4 4 4 N .4  *+"&"3''JD$LL&&&LL&&&& -r2~FF1aa   ~p//9Z]^9^`c`l`n`nooo   UqTY[[=-H>-Y-Y FFSWS_`aSbSbSbdhdpqrdsdsds$tvvv IKKM A%% F$;<<<""$$$F"/ ( ( d19999T??D( tTl3333 $19999T??D( tTl3333 $F / /! dJJLLLLDJJLLLLD F$@:$MNNN!((.... d/ DIKK-4OR`4`4` FFSWS_`aSbSbSbdhdpqrdsdsds$tvvvi.4 l+  JD$       !!! .@AAAAAs=D4C( D4(C,,D4/C,0D4;DDD4G+4G&7G.FFF<*G&&G++G..H/6H > H/ H H/H H/%K99K=K=:AN O!$2OO! UU"&U;;U?'X<<YYYcrtd|j||fz|j||fdS)Nztunnel_%i: %s %s )rr6r8put)rmsg_type msg_objects rrez Tunnel.notifys>'4?Hj*QQRRR  Hj)*****rNcx|||tdtjzdS)Nz%s )rer traceback format_exc)rrmsg_txtmsg_objs rrczTunnel.notify_exception_errors8 Hg&&&&9/11122222rc|j5|j|ko|j|ko |j|kcdddS#1swxYwYdSrF)r3r,r-r.)rr?r@rAs rmatchz Tunnel.matchs Y d d<6)cdn.HcT\]cMc d d d d d d d d d d d d d d d d d ds !6::cbg}tjjjjd!tjjjjdnd}|r||t jdkr|dtj z|dtj zn*|d|d|D]_}tj tj |r!tj |cS`t!ddS)Npathtosshconfigwindowsz %s\ssh\configz%s\ssh\ssh_configz ~/.ssh/configz~/.ssh/ssh_configzssh config file not found)grtrootwboptionsriplatformsystemlowerrUAppgetget_user_data_folderospathisfile expanduserr)rpaths user_pathrs r_get_ssh_config_pathzTunnel._get_ssh_config_pathskFIhkFYFabsFtGACHK'/0ABBGK  $ LL # # # ?   " " $ $ 1 1 LL6:>>+;+;+P+P+R+RR S S S LL,vz~~/?/?/T/T/V/VV W W W W LL ) ) ) LL, - - -  Dw~~bg006677 0w))$///// 0 2 3 3 34rc & tj}|}|r,>?S,T,TUUUU @ @ @ fzfzfz|}|}|}~ @'$..48O3P3V3V3X3X\`3`3` 88IIII 889O9Q9QRRR4=))G L a$,q/DN.2mdn/6GUk ! m m m< ) * * *49+     ' '0I#RZRaRcRcRiRiRkRkoxRxRxOcflfpftftfvfvgLgLgNgNPNPN~W1X1X Y Y Y55555-     ' '2]`c`q2qsvssAsA B B B55555/     ' '2FHKHTHVHV W W W55555     ' '1x{~@C|D|D2D E E E55555(     ' '1vy|~AzBzB2BDGDPDRDR S S S55555%     ' ' ?Ncgcopqcrcrcrtxt@ABtCtCXDKNKRK[K[K]K]dgdsRtRt?t}@6A6A B B B55555     ' ' 4gjmnqjrjr4rtwuAuCuC D D D55555     ' '2XZ]ZfZhZh i i i55555 sAI0A' I0'A++I0.A+/B;I0+7E#"I0# F -FI0F  CI00T?BLT0M  T(N  T&O  T8P T(AR T8S T(T  Tcr|dd|jd|_dS)NrRzClosing tunnelT)rer7rgr9rGs rrgz Tunnel.closeRs7 F,--- !!!rc n |j\}}nC#t$r6}|dd|zt jYd}~dSd}~wwxYw|dd|j} | d|j | }n#tj $r8}|dd|z|Yd}~dSd}~wt$rc}|dd|j d|j d |fzt j|Yd}~dSd}~wwxYw|Y|dd |j d|j d fzt j|dS|dd |d | d |j |j||fdS) NrQz%Error accepting new tunnel client: %rrRzClient connection establishedz direct-tcpipz.Could not open port forwarding SSH channel: %sz%Remote connection to %s:%d failed: %rrrOz:Remote connection to %s:%d was rejected by the SSH server.zTunnel now open z -> )r7acceptrKrcrXrdrer= get_transport open_channelr. getpeernamer;rrg getsocknamer>ri)r local_sockpeeraddrrL transportsshchanrqs rrmzTunnel.accept_clientWs #'#4#;#;#=#= J     ' '1X[\1\]`]i]k]k l l l FFFFF  F;<<<L..00  ,,^T\:KaKaKcKcddGG(     ' '1adg1g h h h       FFFFF     ' '1X\`\hij\kmqmyz{m|~\A2ACFCOCQCQ R R R       FFFFF  ?  ' '1mquq}~rACGCOPQCRqS2SUXUaUcUc d d d       F FF @V@V@X@X@X@XZaZmZmZoZoZoZoquq}q}~   *g!677777s9 A+AA.CE3-D E3AE..E3rF)rr r!__doc__r*rHrMrJrercrrrfrgrm __classcell__)rDs@rr'r'?s  8###EEErBrBrBh+++3333ddd &GGGR 8888888rr'cXeZdZdZdZdZdZdZdZdZ dZ d Z dd Z d Z d ZdS) TunnelManagercXi|_tj|_tj|_dSrF)tunnel_by_portrXstdininpiperYoutpiperGs rr*zTunnelManager.__init__vs  i z rct|tur?d|vr7|dd\}} t|}n #|}YnxYw||fS||fS|S)NrSrO)typersplitint)r raw_address default_portaddressports r_address_port_tuplez!TunnelManager._address_port_tuple|sx    # #k!! + 1 1#q 9 9 (t99DD('DDD&#\22 s AA ct||t}||t}t|jD]X\}}||||r<|r(|j5|j cdddcS#1swxYwYYdS)Nr) rSSH_PORT REMOTE_PORTlistritemsrisAliver3r6)rr?r@rArtunnels r lookup_tunnelzTunnelManager.lookup_tunnels))&x)HH))&{)KK !4!:!:!r#t  nnW--G4.557788  F||FHf55 &..:J:J    ) )58IIJJJ( ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )EKMM68VXwWWF LLNNN   # # % % % ) )( ) ) ) ) ) ) ) ) ) ) ) ) ) ) )(.D  %Ks$;C&&C*-C* E  E$'E$c|j|}|sd|zSd}d}|j|rI |j\}}|dkr)tj d|dddd tj kr|d j j |d j|d j|d j|d j j| t$jt$j|d j jdkrPt-d t%jt$j|d j jt$j|d j jdkrAt-d t3|d j jd |d j |d j jt-dn'#t8$r}t;|}Yd}~n d}~wwxYwd}nd}d}n|dkr|}nt=jd|}tA|tBur9dd "tGj$|z}t;|d}tK|d|d|dkr|}non#tLj'$rYwxYw|(r|s|j)rnt=jdHtKd|d|d|r||j|=|S)Nz#Could not find a tunnel for port %dFTrzSSH Server Fingerprint MissingrsContinueCancelrrz.Host_keys directory is missing, recreating it z)Host_keys file is missing, recreating it az#Successfully saved host_keys file. zServer key has been storedzUser cancelledrg333333?rrOrrQzreturning from wait_connection(z): )*rrr5rrr8 get_nowaitrUrV show_messageResultOkr _host_keysaddrrr_host_keys_filenamerrisdirdirnamermakedirsexistsrrgsave_host_keysrrrhsleeprtuplejoinrformat_exceptionrrEmptyrHempty) rrrra close_tunnelrrsrL_msgs rwait_connectionzTunnelManager.wait_connections$((.. @84? ? !!! >>  . - &$*H$7$7$9$9MHc ;..!+889Y[^_d[egqs{}AAEKETTTJ-8<-RTW(X(X(^(^(`(`(`$'J$5$D$DSZEVEj$k$k$k$/0V$W$W$W$W'.!+!+!+,/FFE$)EEEE!+%AEE$4E'+ !Z// # 3DCyyE))"RWWY-G-M%N%NN"47||HHHccc:;;;7** $+E{HL,,..fnn6F6FFHNNL\L\ 3[- \  eeeLMMM  * LLNNN#D) s+L/EI33 J=JJ/MMc||jvrtd|zdS|j|} |jS#tj$rYdSwxYw)NLooking up invalid port %s )rrr8rrr )rrrs r get_messagezTunnelManager.get_messagess t* * * 4t; < < <4$T* 8&&(( ({   44 sAAAc|dkrtddS|j|}|std|zdS|j}|td|zdS||dS)NrzSSH KeepAlive setting skipped. rzSSHTransport not ready yet %d )rrrrr=r set_keepalive)rr keepaliverrs rrzTunnelManager.set_keepalives >> 7 8 8 8 F$((..  4t; < < < FN0022   7$> ? ? ? F *****rcdSrFr")rrs rrgzTunnelManager.closes rrc|r$|j|dz|zdzn|j|dz|jdS)N r)rrZflush)rcodeargs rrozTunnelManager.sendse  , L  tczC/$6 7 7 7 7 L  td{ + + + rct|jD]*}||+dSrF)rrrrgr )rrs rshutdownzTunnelManager.shutdown#sN4.557788  F LLNNN KKMMMM  rcx|d |j}|sdS t|ii\}}n#|ddYNxYw|dkr |j|}|$|dt |n|ddn#t $r.}|dt |Yd}~nQd}~wwxYw|dkrj |j|}|dt |n#t $r-}|dt |Yd}~nd}~wwxYw|d kr|dn|d krF||}|s|dn|d |znq|d krC| |}|r||n>|d n(td|z|dd%)NREADYTrQzInvalid requestLOOKUPOKz not foundOPENSSHCLOSEWAITzERROR MESSAGENONEzInvalid request %s ) rorreadlineevalrrrKrrrr)rrequestcmdrbrrqrarss r wait_requestszTunnelManager.wait_requests)s{ '+ 6k**,,G   "b11 TT  '#4555h1-4-t4D' $D 2222 ';777 111IIgs3xx000000001 !!1(4=$/DIIdCII.... 111IIgs3xx000000001 $,,T22.IIdOOOOIIhun---- !!&&t,,&IIcNNNNIIf%%%%07:;;; '#4555W+ 6s<A A$.AB66 C.#C))C.8-D'' E1#EEN)r)rr r!r*rrrrrrrrgrorr,r"rrrrus"""   <;;;| + + +    .6.6.6.6.6rr)#rr1r\rrr[rjrXrhrrUr; workbench.logrrrrrr wb_commonr r rrrrkrhasattrrMissingHostKeyPolicyr$rTThreadr'rr"rrr2s.  ]]]]]]]]]]]]]]]]GGGGGGGG   78_%%K*MMKKKKK5KKK NNNNNX:NNN t8t8t8t8t8Y t8t8t8l b6b6b6b6b6b6b6b6H**r