U e5dJjã@sÆddlZddlZz ddlZWnek r4dZYnXddlmZddlmZddlmZddlmZddl m Z dd „Z d Z d Z d Zd ZGdd„deƒZGdd„dejejƒZGdd„dejƒZdS)éNé)Ú base_events)Ú constants)Ú protocols)Ú transports)ÚloggercCs"|r tdƒ‚t ¡}|sd|_|S)Nz(Server side SSL needs a valid SSLContextF)Ú ValueErrorÚsslZcreate_default_contextZcheck_hostname)Ú server_sideÚserver_hostnameÚ sslcontext©r ú(/usr/lib64/python3.8/asyncio/sslproto.pyÚ_create_transport_contexts rZ UNWRAPPEDZ DO_HANDSHAKEZWRAPPEDZSHUTDOWNc@szeZdZdZddd„Zedd„ƒZedd„ƒZed d „ƒZed d „ƒZ dd d„Z ddd„Z dd„Z ddd„Z ddd„ZdS)Ú_SSLPipeiNcCsH||_||_||_t|_t ¡|_t ¡|_d|_ d|_ d|_ d|_ dS©NF) Ú_contextÚ _server_sideÚ_server_hostnameÚ _UNWRAPPEDÚ_stater Z MemoryBIOÚ _incomingÚ _outgoingÚ_sslobjÚ _need_ssldataÚ _handshake_cbÚ _shutdown_cb)ÚselfÚcontextr r r r rÚ__init__8s   z_SSLPipe.__init__cCs|jS©N)r©rr r rrNsz_SSLPipe.contextcCs|jSr )rr!r r rÚ ssl_objectSsz_SSLPipe.ssl_objectcCs|jSr )rr!r r rÚ need_ssldata[sz_SSLPipe.need_ssldatacCs |jtkSr )rÚ_WRAPPEDr!r r rÚwrappedasz_SSLPipe.wrappedcCsR|jtkrtdƒ‚|jj|j|j|j|jd�|_ t |_||_ |j ddd�\}}|S)Nz"handshake in progress or completed)r r óT)Úonly_handshake) rrÚ RuntimeErrorrZwrap_biorrrrrÚ _DO_HANDSHAKErÚ feed_ssldata©rÚcallbackÚssldataÚappdatar r rÚ do_handshakejs ýz_SSLPipe.do_handshakecCsB|jtkrtdƒ‚|jtkr$tdƒ‚t|_||_| d¡\}}|S)Nzno security layer presentzshutdown in progressr&)rrr(Ú _SHUTDOWNrr*r+r r rÚshutdowns  z_SSLPipe.shutdowncCs|j ¡| d¡\}}dS)Nr&)rZ write_eofr*)rr-r.r r rÚfeed_eof“s z_SSLPipe.feed_eofFc Cs�|jtkr"|r|g}ng}g|fSd|_|r8|j |¡g}g}z²|jtkrz|j ¡t|_|j rl|  d¡|rz||fWS|jtkr¦|j  |j ¡}|  |¡|s„qðq„nJ|jt krÖ|j ¡d|_t|_|jrð| ¡n|jtkrð|  |j  ¡¡Wnztjtjfk �rl}zRt|ddƒ}|tjtjtjfk�rP|jtk�rN|j �rN|  |¡‚|tjk|_W5d}~XYnX|jj�rˆ|  |j  ¡¡||fS)NFÚerrno)rrrrÚwriter)rr/r$rÚreadÚmax_sizeÚappendr0Zunwraprr ÚSSLErrorÚCertificateErrorÚgetattrÚSSL_ERROR_WANT_READÚSSL_ERROR_WANT_WRITEÚSSL_ERROR_SYSCALLrÚpending)rÚdatar'r.r-ÚchunkÚexcÚ exc_errnor r rr*�sZ             þ  z_SSLPipe.feed_ssldatarc Cs|jtkr6|t|ƒkr&||d…g}ng}|t|ƒfSg}t|ƒ}d|_z(|t|ƒkrn||j ||d…¡7}Wnhtjk rØ}zHt |ddƒ}|j dkr¦tj }|_ |tj tj tjfkr¼‚|tj k|_W5d}~XYnX|jjrò| |j ¡¡|t|ƒk�s |jrB�q qB||fS)NFr3ZPROTOCOL_IS_SHUTDOWN)rrÚlenÚ memoryviewrrr4r r8r:Úreasonr;r3r<r=rr>r7r5)rr?Úoffsetr-ZviewrArBr r rÚ feed_appdataès4       þz_SSLPipe.feed_appdata)N)N)N)F)r)Ú__name__Ú __module__Ú __qualname__r6rÚpropertyrr"r#r%r/r1r2r*rGr r r rr$s        Krc@s¢eZdZejjZdd„Zd"dd„Zdd„Z dd „Z d d „Z d d „Z e jfdd„Zdd„Zdd„Zdd„Zd#dd„Zdd„Zedd„ƒZdd„Zdd„Zd d!„ZdS)$Ú_SSLProtocolTransportcCs||_||_d|_dSr)Ú_loopÚ _ssl_protocolÚ_closed)rÚloopZ ssl_protocolr r rr!sz_SSLProtocolTransport.__init__NcCs|j ||¡Sr )rNÚ_get_extra_info©rÚnameÚdefaultr r rÚget_extra_info'sz$_SSLProtocolTransport.get_extra_infocCs|j |¡dSr )rNÚ_set_app_protocol)rÚprotocolr r rÚ set_protocol+sz"_SSLProtocolTransport.set_protocolcCs|jjSr )rNÚ _app_protocolr!r r rÚ get_protocol.sz"_SSLProtocolTransport.get_protocolcCs|jSr )rOr!r r rÚ is_closing1sz _SSLProtocolTransport.is_closingcCsd|_|j ¡dS©NT)rOrNÚ_start_shutdownr!r r rÚclose4sz_SSLProtocolTransport.closecCs&|js"|d|›�t|d�| ¡dS)Nzunclosed transport )Úsource)rOÚResourceWarningr^)rZ_warnr r rÚ__del__?sz_SSLProtocolTransport.__del__cCs |jj}|dkrtdƒ‚| ¡S)Nz*SSL transport has not been initialized yet)rNÚ _transportr(Ú is_reading)rZtrr r rrcDsz _SSLProtocolTransport.is_readingcCs|jj ¡dSr )rNrbÚ pause_readingr!r r rrdJsz#_SSLProtocolTransport.pause_readingcCs|jj ¡dSr )rNrbÚresume_readingr!r r rreRsz$_SSLProtocolTransport.resume_readingcCs|jj ||¡dSr )rNrbÚset_write_buffer_limits)rZhighZlowr r rrfZsz-_SSLProtocolTransport.set_write_buffer_limitscCs |jj ¡Sr )rNrbÚget_write_buffer_sizer!r r rrgosz+_SSLProtocolTransport.get_write_buffer_sizecCs |jjjSr )rNrbÚ_protocol_pausedr!r r rrhssz&_SSLProtocolTransport._protocol_pausedcCs<t|tttfƒs$tdt|ƒj›�ƒ‚|s,dS|j |¡dS)Nz+data: expecting a bytes-like instance, got ) Ú isinstanceÚbytesÚ bytearrayrDÚ TypeErrorÚtyperHrNÚ_write_appdata©rr?r r rr4xs z_SSLProtocolTransport.writecCsdSrr r!r r rÚ can_write_eof…sz#_SSLProtocolTransport.can_write_eofcCs|j ¡d|_dSr\)rNÚ_abortrOr!r r rÚabort‰s z_SSLProtocolTransport.abort)N)NN)rHrIrJrZ _SendfileModeZFALLBACKZ_sendfile_compatiblerrUrXrZr[r^ÚwarningsÚwarnrarcrdrerfrgrKrhr4rprrr r r rrLs$     rLc@s¬eZdZd+dd„Zdd„Zd,dd „Zd d „Zd d „Zdd„Zdd„Z dd„Z dd„Z d-dd„Z dd„Z dd„Zdd„Zdd„Zd d!„Zd"d#„Zd.d%d&„Zd'd(„Zd)d*„ZdS)/Ú SSLProtocolFNTc CsÔtdkrtdƒ‚|dkr tj}n|dkr6td|›�ƒ‚|sDt||ƒ}||_|rZ|sZ||_nd|_||_t |d�|_ t   ¡|_ d|_||_||_| |¡t|j|ƒ|_d|_d|_d|_d|_d|_||_||_dS)Nzstdlib ssl module not availablerz7ssl_handshake_timeout should be a positive number, got )r F)r r(rZSSL_HANDSHAKE_TIMEOUTrrrrÚ _sslcontextÚdictÚ_extraÚ collectionsÚdequeÚ_write_backlogÚ_write_buffer_sizeÚ_waiterrMrVrLÚ_app_transportÚ_sslpipeÚ_session_establishedÚ _in_handshakeÚ _in_shutdownrbÚ_call_connection_madeÚ_ssl_handshake_timeout) rrPÚ app_protocolr Zwaiterr r Zcall_connection_madeZssl_handshake_timeoutr r rr›s@ÿÿ   zSSLProtocol.__init__cCs||_t|tjƒ|_dSr )rYrirZBufferedProtocolÚ_app_protocol_is_buffer)rr…r r rrVÉs ÿzSSLProtocol._set_app_protocolcCsD|jdkrdS|j ¡s:|dk r.|j |¡n |j d¡d|_dSr )r}Z cancelledZ set_exceptionZ set_result©rrAr r rÚ_wakeup_waiterÎs   zSSLProtocol._wakeup_waitercCs&||_t|j|j|jƒ|_| ¡dSr )rbrrvrrrÚ_start_handshake)rÚ transportr r rÚconnection_madeØs þzSSLProtocol.connection_madecCsn|jr d|_|j |jj|¡n|jdk r2d|j_d|_d|_t|ddƒrT|j   ¡|  |¡d|_d|_ dS)NFTÚ_handshake_timeout_handle) r€rMÚ call_soonrYÚconnection_lostr~rOrbr:rŒÚcancelrˆrr‡r r rrŽãs    zSSLProtocol.connection_lostcCs|j ¡dSr )rYÚ pause_writingr!r r rr�ûszSSLProtocol.pause_writingcCs|j ¡dSr )rYÚresume_writingr!r r rr‘szSSLProtocol.resume_writingc Cs"|jdkrdSz|j |¡\}}WnLttfk r<‚Yn4tk rn}z| |d¡WY¢dSd}~XYnX|D]}|j |¡qt|D]’}|�rz&|jr¬t   |j |¡n |j   |¡WnPttfk rÔ‚Yn8tk �r }z| |d¡WY¢dSd}~XYnXqŠ|  ¡�qqŠdS)NzSSL error in data receivedz/application protocol failed to receive SSL data)rr*Ú SystemExitÚKeyboardInterruptÚ BaseExceptionÚ _fatal_errorrbr4r†rZ_feed_data_to_buffered_protorYÚ data_receivedr])rr?r-r.Úer@Zexr r rr–s<  ÿÿzSSLProtocol.data_receivedcCsTzB|j ¡rt d|¡| t¡|js@|j   ¡}|r@t  d¡W5|j ¡XdS)Nz%r received EOFz?returning true from eof_received() has no effect when using ssl) rbr^rMÚ get_debugrÚdebugrˆÚConnectionResetErrorr�rYÚ eof_receivedZwarning)rZ keep_openr r rr›-s    zSSLProtocol.eof_receivedcCs4||jkr|j|S|jdk r,|j ||¡S|SdSr )rxrbrUrRr r rrQCs    zSSLProtocol._get_extra_infocCs.|jr dS|jr| ¡nd|_| d¡dS)NTr&)r‚r�rqrnr!r r rr]Ks  zSSLProtocol._start_shutdowncCs.|j |df¡|jt|ƒ7_| ¡dS)Nr)r{r7r|rCÚ_process_write_backlogror r rrnTszSSLProtocol._write_appdatacCs\|j ¡r$t d|¡|j ¡|_nd|_d|_|j d¡|j  |j |j ¡|_ |  ¡dS)Nz%r starts SSL handshakeT)r&r)rMr˜rr™ÚtimeÚ_handshake_start_timer�r{r7Z call_laterr„Ú_check_handshake_timeoutrŒrœr!r r rr‰Ys    ÿÿzSSLProtocol._start_handshakecCs*|jdkr&d|j›d�}| t|ƒ¡dS)NTz$SSL handshake is taking longer than z! seconds: aborting the connection)r�r„r•ÚConnectionAbortedError)rÚmsgr r rrŸhs  ÿz$SSLProtocol._check_handshake_timeoutc Csd|_|j ¡|jj}z|dk r&|‚| ¡}Wnbttfk rJ‚YnJtk r’}z,t |t j ƒrld}nd}|  ||¡WY¢dSd}~XYnX|j  ¡rÀ|j  ¡|j}t d||d¡|jj|| ¡| ¡|d�|jrð|j |j¡| ¡d|_|j  |j¡dS)NFz1SSL handshake failed on verifying the certificatezSSL handshake failedz%r: SSL handshake took %.1f msg@�@)ÚpeercertÚcipherÚ compressionr"T)r�rŒr�rr"Z getpeercertr’r“r”rir r9r•rMr˜r�ržrr™rxÚupdater£r¤rƒrYr‹r~rˆr€r�rœ)rZ handshake_excZsslobjr¢rAr¡Zdtr r rÚ_on_handshake_completeqs8     ýz"SSLProtocol._on_handshake_completec CsB|jdks|jdkrdSzÈtt|jƒƒD]´}|jd\}}|rR|j ||¡\}}n*|rj|j |j¡}d}n|j |j ¡}d}|D]}|j  |¡q€|t|ƒkrÂ||f|jd<|jj r¾|j  ¡qÞ|jd=|j t|ƒ8_ q(Wn\ttfk rú‚YnDtk �r<}z$|j�r | |¡n | |d¡W5d}~XYnXdS)NrrzFatal error on SSL transport)rbrÚrangerCr{rGr/r¦r1Ú _finalizer4Z_pausedrer|r’r“r”r�r•)rÚir?rFr-r@rAr r rrœšs:ÿ   z"SSLProtocol._process_write_backlogúFatal error on transportcCsVt|tƒr(|j ¡r@tjd||dd�n|j |||j|dœ¡|jrR|j |¡dS)Nz%r: %sT)Úexc_info)ÚmessageZ exceptionrŠrW) riÚOSErrorrMr˜rr™Zcall_exception_handlerrbZ _force_close)rrAr¬r r rr•Ås  üzSSLProtocol._fatal_errorcCsd|_|jdk r|j ¡dSr )rrbr^r!r r rr¨Ós zSSLProtocol._finalizecCs(z|jdk r|j ¡W5| ¡XdSr )r¨rbrrr!r r rrqÙs zSSLProtocol._abort)FNTN)N)N)rª)rHrIrJrrVrˆr‹rŽr�r‘r–r›rQr]rnr‰rŸr¦rœr•r¨rqr r r rru”s.ý .  &   )+ ru)ryrsr Ú ImportErrorÚrrrrÚlogrrrr)r$r0ÚobjectrZ_FlowControlMixinZ TransportrLZProtocolrur r r rÚs*       yÿx