mς MγΈEc@s[dZdkZdkZy dkZWnej odkZnXdkZdkZdkZdk Z dk Z dk l Z dk lZdklZlZdklZheid<eid<eidI') and the string itself. The receiver passes the original string to message_input(). This layer also supports an optional message authentication code (MAC). If a session key is present, it uses HMAC-SHA-1 to generate a 20-byte MAC. If a MAC is present, the high-order bit of the length is set to 1 and the MAC immediately follows the length. N(s StringType(sTRACE(slogs short_repr(sDisconnectedErrorii`κltSizedMessageAsyncConnectioncBs•tZeiiZeiiZeZ dZ ddd„Zd„Z d„Z d„Zd„Zd„Zd„Zd„Zd „Zd „Zd „ZRS( NcCsΓ||_|dj o ||_nt|dƒp t|_ntiƒ|_ d|_ d|_ d|_ d|_ d|_tiƒ|_g|_t|_d|_d|_|i||ƒdS(Nt_debugii(taddrtselftdebugtNoneRthasattrt __debug__t threadingtLockt(_SizedMessageAsyncConnection__input_lockt!_SizedMessageAsyncConnection__inpt'_SizedMessageAsyncConnection__input_lent#_SizedMessageAsyncConnection__statet%_SizedMessageAsyncConnection__has_mact&_SizedMessageAsyncConnection__msg_sizet)_SizedMessageAsyncConnection__output_lockt$_SizedMessageAsyncConnection__outputtFalset$_SizedMessageAsyncConnection__closedt'_SizedMessageAsyncConnection__hmac_sendt'_SizedMessageAsyncConnection__hmac_recvt(_SizedMessageAsyncConnection__super_inittsocktmap(RRRRR((t,/data/zmath/zope/lib/python/ZEO/zrpc/smac.pyt__init__Os"            cCsBtd|ƒti|dtƒ|_ti|dtƒ|_dS(Nsset session key %rt digestmod(tlogtsesskeythmactHMACtshaRRR(RR((Rt setSessionKey€scCs|iS(N(RR(R((Rtget_addr…scCsdS(Ni((R((Rt __nonzero__‹sc Cs|iiƒzβy|idƒ} Wn4tij o%} | dtjodSn‚nX| pdSn|i t | ƒ}|i }|i}|i}|i}||jog|djo | |_n=t|iƒtjo|i| g|_n|ii| ƒ||_ dSnt|tƒo|| }n4|djo | }n|i| ƒdi|ƒ}d}xK|||jo9||||!}||}|pctid|ƒd}|t@}|o|tN}|d7}n|iot dƒ‚nd}qnd}d}|ov|d }|d}|i"oJ|i"i#|ƒ|i"i$ƒ} || jot d | |fƒ‚q‰q§t&d ƒn|iot dƒ‚n|i'|ƒqnW||_||_||_ |||_|||_ Wd|ii(ƒXdS( Ni its>IisReceived message without MACiisMAC failed: %r != %rs#Received MAC but no session key set()RR tacquiretrecvtdtsocketterrorterrtexpected_socket_read_errorsR tlent input_lenRtmsg_sizeR tstateRthas_macR tinpRttypet StringTypetappendt isinstancetjointoffsettmsgtstructtunpacktMAC_BITRt ValueErrortmacRtupdatetdigestt_macRt message_inputtrelease( RR1R0R/R8R-R=R7R.R'R*R@((Rt handle_readŽs€                           cCstS(N(tTrue(R((RtreadableεscCs&t|iƒdjotSntSdS(Ni(R,RRRRD(R((RtwritableθscCs|iiƒzό|i}xμ|oδd}x@tt|ƒƒD],}|t||ƒ7}|t joPq<q<W|d7}di || ƒ}||4y|i |ƒ}Wn1tij o"}|dtjoPn‚nX|t|ƒjo|id||ƒPqqWWd|iiƒXdS(NiiR$(RRR%RtoutputtltrangeR,tit SEND_SIZER6tvtsendtnR(R)R*texpected_socket_write_errorstinsertRB(RR*RJRHRNRLRG((Rt handle_writeξs2      cCs|iƒdS(N(Rtclose(R((Rt handle_closescCswtoL|io>tdt|ƒt|ƒ|iodpdfdtƒqSn|i ot dƒ‚n|i i ƒzθ|ioS|i itidt|ƒtBƒƒ|ii|ƒ|i i|iiƒƒn#|i itidt|ƒƒƒt|ƒtjo|i i|ƒn?x;tdt|ƒtƒD]!}|i i|||t!ƒq<WWd|i iƒXdS(Ns#message_output %d bytes: %s hmac=%diitlevels*This action is temporarily unavailable.

s>I(RRRRR,tmessaget short_reprRtTRACERtDisconnectedErrorRR%RR4R9tpackR;R>R?RKRIRJRB(RRURJ((Rtmessage_outputs( 0   &"#cCs%|ipt|_|iƒndS(N(RRRDt)_SizedMessageAsyncConnection__super_close(R((RRR1s  (t__name__t __module__tasyncoret dispatcherRRRRR[RDRRR(R!R"R#RCRERFRQRSRZ(((RRGs  1    W   $  (!t__doc__R^terrnoRt ImportErrort_hmacR R(R9RtloggingttypesR3tZODB.loglevelsRWt ZEO.zrpc.logRRVtZEO.zrpc.errorRXt EWOULDBLOCKtEAGAINtEINTRttmp_dictttupletkeysR+tENOBUFSRORKR;R_R(R3RVR^R(RWRRaRlR;RXR R+RRRdRKRROR9((Rt?s.           *6