й¼]]eã @sddlZddlZyddlZWnek rBdZYnXddlmZddlmZddlmZddlmZddl m Z dd „Z d d „Z d Z d ZdZdZGdd„deƒZGdd„dejejƒZGdd„dejƒZdS)éNé)Ú base_events)Úcompat)Ú protocols)Ú transports)ÚloggercCs�|rtdƒ‚ttdƒr?tjƒ}|s‹d|_nLtjtjƒ}|jtjO_|jtj O_|j ƒtj |_ |S)Nz(Server side SSL needs a valid SSLContextÚcreate_default_contextF) Ú ValueErrorÚhasattrÚsslrÚcheck_hostnameZ SSLContextZPROTOCOL_SSLv23ÚoptionsZ OP_NO_SSLv2Z OP_NO_SSLv3Zset_default_verify_pathsZ CERT_REQUIREDÚ verify_mode)Ú server_sideÚserver_hostnameÚ sslcontext©rú-/opt/alt/python35/lib64/python3.5/sslproto.pyÚ_create_transport_contexts     rcCs ttdƒS)NÚ MemoryBIO)r r rrrrÚ_is_sslproto_available%srZ UNWRAPPEDZ DO_HANDSHAKEZWRAPPEDZSHUTDOWNc@sµeZdZdZddd„Zedd„ƒZedd „ƒZed d „ƒZed d „ƒZ ddd„Z ddd„Z dd„Z ddd„Z ddd„ZdS)Ú_SSLPipeéiNcCsj||_||_||_t|_tjƒ|_tjƒ|_d|_ d|_ d|_ d|_ dS)NF) Ú_contextÚ _server_sideÚ_server_hostnameÚ _UNWRAPPEDÚ_stater rÚ _incomingÚ _outgoingÚ_sslobjÚ _need_ssldataÚ _handshake_cbÚ _shutdown_cb)ÚselfÚcontextrrrrrÚ__init__Ds       z_SSLPipe.__init__cCs|jS)N)r)r$rrrr%Zsz_SSLPipe.contextcCs|jS)N)r )r$rrrÚ ssl_object_sz_SSLPipe.ssl_objectcCs|jS)N)r!)r$rrrÚ need_ssldatagsz_SSLPipe.need_ssldatacCs |jtkS)N)rÚ_WRAPPED)r$rrrÚwrappedmsz_SSLPipe.wrappedcCs||jtkrtdƒ‚|jj|j|jd|jd|jƒ|_ t |_||_ |j dddƒ\}}|S)Nz"handshake in progress or completedrróÚonly_handshakeT) rrÚ RuntimeErrorrZwrap_biorrrrr Ú _DO_HANDSHAKEr"Ú feed_ssldata)r$ÚcallbackÚssldataÚappdatarrrÚ do_handshakevs      z_SSLPipe.do_handshakecCsa|jtkrtdƒ‚|jtkr6tdƒ‚t|_||_|jdƒ\}}|S)Nzno security layer presentzshutdown in progressr+)rrr-Ú _SHUTDOWNr#r/)r$r0r1r2rrrÚshutdown‹s     z_SSLPipe.shutdowncCs&|jjƒ|jdƒ\}}dS)Nr+)rZ write_eofr/)r$r1r2rrrÚfeed_eofŸs z_SSLPipe.feed_eofFcCs|jtkr1|r!|g}ng}g|fSd|_|rP|jj|ƒg}g}yú|jtkrª|jjƒt|_|j rš|j dƒ|rª||fS|jtkrìx™|jj |j ƒ}|j |ƒ|s¼Pq¼Wni|jt kr0|jjƒd|_t|_|jrU|jƒn%|jtkrU|j |jj ƒƒWn˜tjtjfk rð}zlt|ddƒtjtjtjfkrÉ|jtkrÆ|j rÆ|j |ƒ‚|jtjk|_WYdd}~XnX|jjr|j |jj ƒƒ||fS)NFÚerrno)rrr!rÚwriter.r r3r)r"ÚreadÚmax_sizeÚappendr4Zunwrapr#r ÚSSLErrorÚCertificateErrorÚgetattrÚSSL_ERROR_WANT_READÚSSL_ERROR_WANT_WRITEÚSSL_ERROR_SYSCALLr7rÚpending)r$Údatar,r2r1ÚchunkÚexcrrrr/©sV                ( z_SSLPipe.feed_ssldatarcCsl|jtkrM|t|ƒkr7||d…g}ng}|t|ƒfSg}t|ƒ}xd|_y6|t|ƒkr ||jj||d…ƒ7}Wn|tjk r}zY|j dkrÔtj |_ |j tj tj tj fkrø‚|j tj k|_WYdd}~XnX|jjrB|j|jjƒƒ|t|ƒks]|jrbPqbW||fS)NFZPROTOCOL_IS_SHUTDOWN)rrÚlenÚ memoryviewr!r r8r r<Úreasonr?r7r@rArrBr;r9)r$rCÚoffsetr1ÚviewrErrrÚ feed_appdataós2  $  ( z_SSLPipe.feed_appdatai)Ú__name__Ú __module__Ú __qualname__r:r&Úpropertyr%r'r(r*r3r5r6r/rKrrrrr0s   Jrc@sÊeZdZdd„Zddd„Zdd„Zdd „Zd d „Zd d „Ze j rldd„Z dd„Z dd„Z dddd„Zdd„Zdd„Zdd„Zdd„ZdS)Ú_SSLProtocolTransportcCs(||_||_||_d|_dS)NF)Ú_loopÚ _ssl_protocolÚ _app_protocolÚ_closed)r$ÚloopZ ssl_protocolÚ app_protocolrrrr&)s   z_SSLProtocolTransport.__init__NcCs|jj||ƒS)N)rRÚ_get_extra_info)r$ÚnameÚdefaultrrrÚget_extra_info0sz$_SSLProtocolTransport.get_extra_infocCs ||_dS)N)rS)r$ÚprotocolrrrÚ set_protocol4sz"_SSLProtocolTransport.set_protocolcCs|jS)N)rS)r$rrrÚ get_protocol7sz"_SSLProtocolTransport.get_protocolcCs|jS)N)rT)r$rrrÚ is_closing:sz _SSLProtocolTransport.is_closingcCsd|_|jjƒdS)NT)rTrRÚ_start_shutdown)r$rrrÚclose=s z_SSLProtocolTransport.closecCs+|js'tjd|tƒ|jƒdS)Nzunclosed transport %r)rTÚwarningsÚwarnÚResourceWarningr`)r$rrrÚ__del__Ls z_SSLProtocolTransport.__del__cCs|jjjƒdS)N)rRÚ _transportÚ pause_reading)r$rrrrfQsz#_SSLProtocolTransport.pause_readingcCs|jjjƒdS)N)rRreÚresume_reading)r$rrrrgYsz$_SSLProtocolTransport.resume_readingcCs|jjj||ƒdS)N)rRreÚset_write_buffer_limits)r$ÚhighÚlowrrrrhasz-_SSLProtocolTransport.set_write_buffer_limitscCs|jjjƒS)N)rRreÚget_write_buffer_size)r$rrrrkvsz+_SSLProtocolTransport.get_write_buffer_sizecCsTt|tttfƒs6tdjt|ƒjƒƒ‚|s@dS|jj |ƒdS)Nz/data: expecting a bytes-like instance, got {!r}) Ú isinstanceÚbytesÚ bytearrayrGÚ TypeErrorÚformatÚtyperLrRÚ_write_appdata)r$rCrrrr8zs  z_SSLProtocolTransport.writecCsdS)NFr)r$rrrÚ can_write_eof‡sz#_SSLProtocolTransport.can_write_eofcCs|jjƒdS)N)rRÚ_abort)r$rrrÚabort‹sz_SSLProtocolTransport.abort)rLrMrNr&rZr\r]r^r`rZPY34rdrfrgrhrkr8rsrurrrrrP&s            rPc@sîeZdZddddd„Zddd„Zdd „Zd d „Zd d „Zdd„Zdd„Z dd„Z ddd„Z dd„Z dd„Z dd„Zdd„Zdd„Zd d!d"„Zd#d$„Zd%d&„ZdS)'Ú SSLProtocolFNTcCsûtdkrtdƒ‚|s-t||ƒ}||_|rO| rO||_n d|_||_td|ƒ|_tj ƒ|_ d|_ ||_ ||_ ||_t|j ||jƒ|_d|_d|_d|_d|_d|_||_dS)Nzstdlib ssl module not availablerrF)r r-rrrÚ _sslcontextÚdictÚ_extraÚ collectionsÚdequeÚ_write_backlogÚ_write_buffer_sizeÚ_waiterrQrSrPÚ_app_transportÚ_sslpipeÚ_session_establishedÚ _in_handshakeÚ _in_shutdownreÚ_call_connection_made)r$rUrVrÚwaiterrrZcall_connection_maderrrr&œs.                 zSSLProtocol.__init__cCs^|jdkrdS|jjƒsQ|dk rA|jj|ƒn|jjdƒd|_dS)N)r~Ú cancelledÚ set_exceptionÚ set_result)r$rErrrÚ_wakeup_waiterÁs zSSLProtocol._wakeup_waitercCs5||_t|j|j|jƒ|_|jƒdS)N)rerrwrrr€Ú_start_handshake)r$Ú transportrrrÚconnection_madeËs   zSSLProtocol.connection_madecCsN|jr+d|_|jj|jj|ƒd|_d|_|j|ƒdS)NF)r�rQÚ call_soonrSÚconnection_lostrerr‰)r$rErrrrŽÖs     zSSLProtocol.connection_lostcCs|jjƒdS)N)rSÚ pause_writing)r$rrrr�äszSSLProtocol.pause_writingcCs|jjƒdS)N)rSÚresume_writing)r$rrrr�êszSSLProtocol.resume_writingcCsÚy|jj|ƒ\}}Wnatjk r}z>|jjƒr_tjd||j|j ƒ|j ƒdSWYdd}~XnXx|D]}|j j |ƒq‡Wx2|D]*}|rÇ|j j|ƒq¨|jƒPq¨WdS)Nz%r: SSL error %s (reason %s))r€r/r r<rQÚ get_debugrÚwarningr7rHrtrer8rSÚ data_receivedr_)r$rCr1r2ÚerDrrrr“ðs     zSSLProtocol.data_receivedc Cspz[|jjƒr"tjd|ƒ|jtƒ|jsZ|jjƒ}|rZtj dƒWd|j j ƒXdS)Nz%r received EOFz?returning true from eof_received() has no effect when using ssl) rQr‘rÚdebugr‰ÚConnectionResetErrorr‚rSÚ eof_receivedr’rer`)r$Z keep_openrrrr—s  zSSLProtocol.eof_receivedcCsD||jkr|j|S|jdk r<|jj||ƒS|SdS)N)ryrerZ)r$rXrYrrrrWs  zSSLProtocol._get_extra_infocCs=|jr dS|jr#|jƒnd|_|jdƒdS)NTr+)rƒr‚rtrr)r$rrrr_&s     zSSLProtocol._start_shutdowncCs9|jj|dfƒ|jt|ƒ7_|jƒdS)Nr)r|r;r}rFÚ_process_write_backlog)r$rCrrrrr/szSSLProtocol._write_appdatacCsm|jjƒr4tjd|ƒ|jjƒ|_n d|_d|_|jjdƒ|jj |j ƒdS)Nz%r starts SSL handshakeTr+r)r+r) rQr‘rr•ÚtimeÚ_handshake_start_timer‚r|r;r�r˜)r$rrrrŠ4s  zSSLProtocol._start_handshakecCsÕd|_|jj}ye|dk r*|‚|jƒ}t|jdƒsy|jry|jjtj krytj ||jƒWn¥t k r!}z…|j j ƒrßt|tjƒrÉtjd|ddƒntjd|ddƒ|jjƒt|tƒr |j|ƒdS‚WYdd}~XnX|j j ƒr^|j jƒ|j}tjd||dƒ|jjd |d |jƒd |jƒd |ƒ|jr«|jj|j ƒ|jƒd|_!|j j"|j#ƒdS) NFr z5%r: SSL handshake failed on verifying the certificateÚexc_infoTz%r: SSL handshake failedz%r: SSL handshake took %.1f msg@�@ÚpeercertÚcipherÚ compressionr')$r‚r€r'Z getpeercertr rwrrr Z CERT_NONEZmatch_hostnameÚ BaseExceptionrQr‘rlr=rr’rer`Ú Exceptionr‰r™ršr•ryÚupdater�ržr„rSrŒrr�r�r˜)r$Z handshake_excZsslobjrœrEZdtrrrÚ_on_handshake_complete@sD               z"SSLProtocol._on_handshake_completecCs“|jdkrdSyxtt|jƒƒD]û}|jd\}}|ri|jj||ƒ\}}n?|r�|jj|jƒ}d}n|jj|j ƒ}d}x|D]}|jj |ƒq¯W|t|ƒkr||f|jd<|jj r|jj ƒP|jd=|j t|ƒ8_ q,WWn`tk rŽ}z@|jrZ|j|ƒn|j|dƒt|tƒs|‚WYdd}~XnXdS)NrrzFatal error on SSL transport)reÚrangerFr|r€rKr3r¢r5Ú _finalizer8Z_pausedrgr}rŸr‚Ú _fatal_errorrlr )r$ÚirCrIr1rDrErrrr˜ts8        z"SSLProtocol._process_write_backlogzFatal error on transportc Cs…t|tjƒr=|jjƒrhtjd||ddƒn+|jjd|d|d|jd|iƒ|jr�|jj |ƒdS)Nz%r: %sr›TÚmessageÚ exceptionr‹r[) rlrZ_FATAL_ERROR_IGNORErQr‘rr•Zcall_exception_handlerreZ _force_close)r$rEr§rrrr¥ s    zSSLProtocol._fatal_errorcCs)d|_|jdk r%|jjƒdS)N)r€rer`)r$rrrr¤¯s zSSLProtocol._finalizec Cs2z |jdk r|jjƒWd|jƒXdS)N)rerur¤)r$rrrrtµszSSLProtocol._abort)rLrMrNr&r‰rŒrŽr�r�r“r—rWr_rrrŠr¢r˜r¥r¤rtrrrrrv•s$ #       4 , rv)rzrar Ú ImportErrorÚrrrrÚlogrrrrr.r)r4ÚobjectrZ_FlowControlMixinZ TransportrPZProtocolrvrrrrÚs(      ö n