Ϫf/`dZddlZddlZddlmZddlmZddlmZddl m Z ddl m Z ddl mZGd d eZd Zd Zd ZdZdZdZdZdZdZdZd ZdZdaeddZGddej>ej@Z!e!Z"e"jGe"jIddZ%dZ&y)z Banana -- s-exp based protocol. Future Plans: This module is almost entirely stable. The same caveat applies to it as applies to L{twisted.spread.jelly}, however. Read its future plans for more details. @author: Glyph Lefkowitz N)BytesIO)protocol)styles)log) iterbytes)fullyQualifiedNamec eZdZy) BananaErrorN)__name__ __module__ __qualname__7/usr/lib/python3/dist-packages/twisted/spread/banana.pyr r srr cx|dk(r |dy|dkDsJd|r|t|dzf|dz }|ryy)Nrz!can only encode positive integers)bytes)integerstreams rint2b128rsJ!|u  Q;;;;; ugn&'(Q, rc^d}d}t|D]}t|}|||zz }|dz}|S)z Convert an integer represented as a base 128 string into an L{int}. @param st: The integer encoded in a byte string. @type st: L{bytes} @return: The integer value extracted from the byte string. @rtype: L{int} rr)rord)steicharns rb1282intr!)sG A A"  I QU  a Hrc|ay)ak Set the limit on the prefix length for all Banana connections established after this call. The prefix length limit determines how many bytes of prefix a banana decoder will allow before rejecting a potential object as too large. @type limit: L{int} @param limit: The number of bytes of prefix for banana to allow when decoding. N) _PREFIX_LIMIT)limits rsetPrefixLimitr-Ks Mr@i c2eZdZdZddgZdZeZdZdZ dZ dZ d Z d Z d Zd Zd Ziddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;dZiZej'D] \ZZeee< dBd?Zd@ZdAZy)CBananaz L{Banana} implements the I{Banana} s-expression protocol, client and server. @ivar knownDialects: These are the profiles supported by this Banana implementation. @type knownDialects: L{list} of L{bytes} pbnoneNcp||_d|dzz dz|_d|_d|_d|dzzdz |_y)zt Set the prefix limit for decoding done by this protocol instance. @see: L{setPrefixLimit} rriiN) prefixLimit_smallestLongInt _smallestInt _largestInt_largestLongInt)selfr,s rr-zBanana.setPrefixLimitrsK !"# "2 3a 7$$ UQY/!3rcy)zPSurrogate for connectionMade Called after protocol negotiation. Nrr:s rconnectionReadyzBanana.connectionReady~src2||_|jyN)currentDialectr=)r:dialects r_selectDialectzBanana._selectDialects% rc|jr|j|y|jri|D]4}||jvs|j ||j |yt jd|jjy||jvr|j |yt jd|jjy)NzSThe client doesn't speak any of the protocols offered by the server: disconnecting.zYThe client selected a protocol the server didn't suggest and doesn't know: disconnecting.) r@expressionReceivedisClient knownDialects sendEncodedrBrmsg transportloseConnection)r:obj serverVers rcallExpressionReceivedzBanana.callExpressionReceiveds     # #C (}}!$ 4I D$6$66((3++I6 4GG@NN113$,,,'',GGCNN113rc|jtd|_|js|j |j yyr?)r-r+r@rErGrFr<s rconnectionMadezBanana.connectionMades8 M*"}}   T// 0rcr|j}|r|ddj|y|j|y)Nr) listStackappendrM)r:itemls rgotItemzBanana.gotItems0 NN bE!HOOD !  ' ' -rrc|j|z}|j}|j}|r|j|k7s3Jdjt |jt |||_d}t |D]}|t k\rn0|dz}||jkDrtd|jfzy|d|}|||dz}||dzd} t||jkDrtd|jfz|tk(r6t|}|tkDr td|j|gf| }n`|tk(r@t|}|tkDr tdt| |k\r| |d}|| d|ny|tk(r| }t|}||n|t k(r| }t|}||n|t"k(r| }t|}|| n|t$k(r| }t| }||n|t&k(rB| }t|}|j(|} |j*dk(r || n\t-d | |t.k(r7t| d k\r(| d d}|t1j2d | dd dnyt-d ||rRt|d d|d dk(r8|j5d} || |rt|d d|d dk(r8|rd|_y)NzThis ain't right: {} {}rrz1Security precaution: more than %d bytes of prefixz9Security precaution: longer than %d bytes worth of prefixz#Security precaution: List too long.z%Security precaution: String too long.r1zInvalid item for pb protocol !dzInvalid Type Byte rQr)bufferrRrVformatreprr HIGH_BIT_SETr5r lenLISTr! SIZE_LIMITrSSTRINGINTLONGINTLONGNEGNEGVOCABincomingVocabularyr@NotImplementedErrorFLOATstructunpackpop) r:chunkrZrRrVposchnumtypebyterestrTs r dataReceivedzBanana.dataReceiveds5u$NN ,,;;&( *C*J*JT[[!V + (!DKC' %Ag  )))%K++-.#,CcC!G,H#')$D3x$***!O'')*4sm#%&KLL  #r+V#sm#%&MNNt9#!#$ZFD#J'Ssm W$sm W$sm S}n U"sm..s3&&%/DM-0MdX.VWWU"t9>!!"XFFMM$Ra9!<=),>xl*KLLYr]1%5!6)B-:J!J }}q) Yr]1%5!6)B-:J!JUZ rct)z=Called when an expression (list, string, or int) is received.)rh)r:lsts rrDzBanana.expressionReceiveds !##rsNonersclassr4s dereferences references dictionarysfunctionsinstancerslistrXsmodule s persistent stuple s unpersistable scopy scachescachedsremoteslocal)slcachesversionsloginspasswords challenges logged_ins not_logged_ins cachemessagesmessagesanswerserrorsdecrefsdecachesuncachecvg|_tj|j|_d|_||_y)Nr)rRcopyoutgoingVocabularyoutgoingSymbolsoutgoingSymbolCountrE)r:rEs r__init__zBanana.__init__4s/#yy)@)@A#$   rct}|j||j|j}|jj|y)a  Send the encoded representation of the given object: @param obj: An object to encode and send. @raise BananaError: If the given object is not an instance of one of the types supported by Banana. @return: L{None} N)r_encodewritegetvaluerI)r:rK encodeStreamvalues rrGzBanana.sendEncoded:s?y  S,,,-%%' U#rc t|ttfret|tkDrt dt|fzt t|||t|D]}|j||yt|tr||jks||jkDrt d|fz||jkrt | ||ty|dkrt | ||ty||jkrt |||t yt |||t"yt|t$r)|t&|t)j*d|yt|t,r|j.dk(r6||j0vr(|j0|}t |||t2yt|tkDrt dt|fzt t|||t4||yt dj7t9t;||)Nz#list/tuple is too long to send (%d)zint is too large to send (%d)rrYr1z$byte string is too long to send (%d)z#Banana cannot send {} objects: {!r}) isinstancelisttupler^r`r rr_rintr6r9r7rdrer8rbrcfloatrirjpackrr@rrfrar[rtype)r:rKrelemsymbolIDs rrzBanana._encodeJs cD%= )3x*$!"G3s8+"UVV SXu % $K * T5) * S !T***cD4H4H.H!"ASF"JKKT&&&#u%gq#u%c (((e$c e$g U # %L &++dC( ) U #""e+t7K7K0K//45)e s8j(%>#c(LS5)f c 5<<&tCy13 r)r)r r r __doc__rFr5r` sizeLimitr-r=rBrMrOrVrZrsrDrrgitemskvrrGrrrrr0r0asG$MKI 4 4<1 .FQf$## !#  # a # q # Q# Q# # 1# r# "# "# # "!#" 2##$ 2%#& "'#(E#J"((*"1 !1"! $ -rr0r2cvt}|t_tj||j S)zEncode a list s-expression.)r_irIrGr)rurs rencoders+9LBLNN3  ""rcg}|jt_ tj|dt_t`|dS#dt_t`wxYw)z) Decode a banana-encoded string. rr)rSrrDrsrZ)rrUs rdecodersM AHHB"   ! Q4K  !s AA)'rrrjiortwisted.internetrtwisted.persistedrtwisted.pythonrtwisted.python.compatrtwisted.python.reflectr Exceptionr rr!r_rbrarerircrdrfr]r-r+r`Protocol Ephemeralr0rrOrBrrrrrrs  %$+5 )  (         r  VX   0 0Vt X'# r