Ë
    oj’/  ã                   ó`  — d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ  G d	„ d
e«      Zd„ Zd„ ZdZdZdZdZdZdZdZdZdZd„ Zda ed«       dZ G d„ dej>                  ej@                  «      Z! e!«       Z"e"jG                  «        e"jI                  d«       d„ Z%d„ Z&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                   ó   — e Zd Zy)ÚBananaErrorN)Ú__name__Ú
__module__Ú__qualname__© ó    ú7/usr/lib/python3/dist-packages/twisted/spread/banana.pyr
   r
      s   „ Ør   r
   c                 óx   — | dk(  r	 |d«       y | dkD  sJ d«       ‚| r |t        | dz  f«      «       | dz	  } | rŒy y )Nr   ó    z!can only encode positive integersé   é   )Úbytes)ÚintegerÚstreams     r   Úint2b128r      sJ   € Ø�!‚|ÙˆuŒØØ�QŠ;Ð;Ð;Ó;ˆ;Ù
ÙŒu�g ‘nÐ&Ó'Ô(Ø˜Q‘,ˆô r   c                 ó^   — d}d}t        | «      D ]  }t        |«      }|||z  z  }|dz  }Œ |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}
    é   r   r   )r   Úord)ÚstÚeÚiÚcharÚns        r   Úb1282intr!   )   sG   € ð 	
€AØ	€AÜ˜"“ò ˆÜ�‹IˆØ	ˆQ�‰U‰
ˆØ	ˆa‰‰ðð €Hr   ó   €ó   �ó   ‚ó   ƒó   „ó   …ó   †ó   ‡c                 ó   — | a y)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    r   ÚsetPrefixLimitr-   K   s	   € ð �Mr   é@   i  
 c                   ó2  — e Zd ZdZddgZdZeZd„ Zd„ Z	d„ Z
d„ Zd	„ Zd
„ ZdZd„ Zd„ Zi dd“dd“dd“dd“dd“dd“dd“dd“dd“d d!“d"d#“d$d%“d&d'“d(d)“d*d+“d,d-“d.d/“d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>œ¥Zi Zej'                  «       D ]
  \  ZZeee<   Œ dBd?„Zd@„ ZdA„ Zy)CÚBananazé
    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}
    ó   pbó   noneNc                 óp   — || _         d|dz  z   dz   | _        d| _        d| _        d|dz  z  dz
  | _        y)zt
        Set the prefix limit for decoding done by this protocol instance.

        @see: L{setPrefixLimit}
        é   r   r   i   €iÿÿÿN)ÚprefixLimitÚ_smallestLongIntÚ_smallestIntÚ_largestIntÚ_largestLongInt)Úselfr,   s     r   r-   zBanana.setPrefixLimitr   sK   € ð !ˆÔØ"#¨°©	Ñ"2Ð 3°aÑ 7ˆÔØ$ˆÔØ$ˆÔØ  U¨Q¡YÑ/°!Ñ3ˆÕr   c                  ó   — y)zPSurrogate for connectionMade
        Called after protocol negotiation.
        Nr   ©r:   s    r   ÚconnectionReadyzBanana.connectionReady~   s   � r   c                 ó2   — || _         | j                  «        y ©N)ÚcurrentDialectr=   )r:   Údialects     r   Ú_selectDialectzBanana._selectDialectƒ   s   € Ø%ˆÔØ×ÑÕr   c                 óÈ  — | j                   r| j                  |«       y | j                  ri|D ]4  }|| j                  v sŒ| j	                  |«       | j                  |«        y  t        j                  d«       | j                  j                  «        y || j                  v r| j                  |«       y t        j                  d«       | j                  j                  «        y )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@   ÚexpressionReceivedÚisClientÚknownDialectsÚsendEncodedrB   r   ÚmsgÚ	transportÚloseConnection)r:   ÚobjÚ	serverVers      r   ÚcallExpressionReceivedzBanana.callExpressionReceived‡   sÆ   € Ø×ÒØ×#Ñ# CÕ(ð �}Š}à!$ò 4�IØ  D×$6Ñ$6Ò6Ø×(Ñ(¨Ô3Ø×+Ñ+¨IÔ6Ùð	4ô —G‘Gð@ôð —N‘N×1Ñ1Õ3à˜$×,Ñ,Ñ,Ø×'Ñ'¨Õ,ô —G‘GðCôð —N‘N×1Ñ1Õ3r   c                 óŒ   — | j                  t        «       d | _        | j                  s| j	                  | j
                  «       y y r?   )r-   r+   r@   rE   rG   rF   r<   s    r   ÚconnectionMadezBanana.connectionMade¥   s8   € Ø×ÑœMÔ*Ø"ˆÔØ�}Š}Ø×Ñ˜T×/Ñ/Õ0ð r   c                 ór   — | j                   }|r|d   d   j                  |«       y | j                  |«       y )Néÿÿÿÿr   )Ú	listStackÚappendrM   )r:   ÚitemÚls      r   ÚgotItemzBanana.gotItem«   s0   € Ø�N‰NˆÙØˆb‰E�!‰H�O‰O˜DÕ!à×'Ñ'¨Õ-r   r   c                 ó  — | j                   |z   }| j                  }| j                  }|�rÑ| j                   |k7  s3J dj                  t	        | j                   «      t	        |«      «      «       ‚|| _         d}t        |«      D ]  }|t        k\  r n0|dz   }Œ || j                  kD  rt        d| j                  fz  «      ‚y |d | }|||dz    }||dz   d  }	t        |«      | j                  kD  rt        d| j                  fz  «      ‚|t        k(  r6t        |«      }|t        kD  rt        d«      ‚|j                  |g f«       |	}�n`|t        k(  r@t        |«      }|t        kD  rt        d«      ‚t        |	«      |k\  r|	|d  } ||	d | «       �ny |t        k(  r|	}t        |«      } ||«       nø|t         k(  r|	}t        |«      } ||«       nÙ|t"        k(  r|	}t        |«      } || «       n¹|t$        k(  r|	}t        |«       } ||«       n™|t&        k(  rB|	}t        |«      }| j(                  |   }
| j*                  dk(  r	 ||
«       n\t-        d	|
›�«      ‚|t.        k(  r7t        |	«      d
k\  r(|	d
d  } |t1        j2                  d|	d d
 «      d   «       ny t-        d|›�«      ‚|rRt        |d   d   «      |d   d   k(  r8|j5                  «       d   }
 ||
«       |rt        |d   d   «      |d   d   k(  rŒ8|r�ŒÑd| _         y )NzThis ain't right: {} {}r   r   z1Security 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.r1   zInvalid item for pb protocol é   ú!dzInvalid Type Byte rQ   r   )ÚbufferrR   rV   ÚformatÚreprr   ÚHIGH_BIT_SETr5   r
   ÚlenÚLISTr!   Ú
SIZE_LIMITrS   ÚSTRINGÚINTÚLONGINTÚLONGNEGÚNEGÚVOCABÚincomingVocabularyr@   ÚNotImplementedErrorÚFLOATÚstructÚunpackÚpop)r:   ÚchunkrZ   rR   rV   ÚposÚchÚnumÚtypebyteÚrestrT   s              r   ÚdataReceivedzBanana.dataReceived´   s5  € Ø—‘˜uÑ$ˆØ—N‘Nˆ	Ø—,‘,ˆÚØ—;‘; &Ò(ð Ð*C×*JÑ*JÜ�T—[‘[Ó!Ü�V“ó+ó Ð(ð !ˆDŒKØˆCÜ Ó'ò 
�ØœÒ%ÙØ˜A‘g‘ð
ð
 ˜×)Ñ)Ò)Ü%ØKØ×+Ñ+Ð-ñ.óð ð Ø˜˜#�,ˆCØ˜c C¨!¡GÐ,ˆHØ˜# ™'˜)Ð$ˆDÜ�3‹x˜$×*Ñ*Ò*Ü!ØOØ×'Ñ'Ð)ñ*óð ð œ4ÒÜ˜s“m�ØœÒ#Ü%Ð&KÓLÐLØ× Ñ  # r Ô+Ø’ØœVÒ#Ü˜s“m�ØœÒ#Ü%Ð&MÓNÐNÜ�t“9 Ò#Ø! # $˜Z�FÙ˜D  #˜JÖ'àØœS’Ø�Ü˜s“m�Ù˜•ØœWÒ$Ø�Ü˜s“m�Ù˜•ØœWÒ$Ø�Ü˜s“m�Ù˜˜•ØœS’Ø�Ü “}�n�Ù˜•ØœUÒ"Ø�Ü˜s“m�Ø×.Ñ.¨sÑ3�Ø×&Ñ&¨%Ò/á˜D•Mä-Ð0MÈdÈXÐ.VÓWÐWØœUÒ"Ü�t“9 ’>Ø! ! "˜X�FÙœFŸM™M¨$°°R°a°Ó9¸!Ñ<Õ=àä)Ð,>¸x¸lÐ*KÓLÐLÙ¤ Y¨r¡]°1Ñ%5Ó!6¸)ÀB¹-ÈÑ:JÒ!JØ —}‘}“ qÑ)�Ù˜”ñ ¤ Y¨r¡]°1Ñ%5Ó!6¸)ÀB¹-ÈÑ:JÓ!JóU ðZ ˆ�r   c                 ó   — t        «       ‚)z=Called when an expression (list, string, or int) is received.)rh   )r:   Úlsts     r   rD   zBanana.expressionReceived  s   € ä!Ó#Ð#r   s   Noner   s   classr4   s   dereferenceé   s	   referenceé   s
   dictionaryé   s   functioné   s   instancer   s   listrX   s   moduleé	   s
   persistenté
   s   tupleé   s   unpersistableé   s   copyé   s   cacheé   s   cachedé   s   remoteé   s   localé   é   é   é   é   é   é   é   é   é   é   é   é   é   é   )s   lcaches   versions   logins   passwords	   challenges	   logged_ins   not_logged_ins   cachemessages   messages   answers   errors   decrefs   decaches   uncachec                 óv   — g | _         t        j                  | j                  «      | _        d| _        || _        y )Nr   )rR   ÚcopyÚoutgoingVocabularyÚoutgoingSymbolsÚoutgoingSymbolCountrE   )r:   rE   s     r   Ú__init__zBanana.__init__4  s/   € ØˆŒÜ#Ÿy™y¨×)@Ñ)@ÓAˆÔØ#$ˆÔ Ø ˆ�r   c                 ó¦   — t        «       }| j                  ||j                  «       |j                  «       }| j                  j                  |«       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   Ú_encodeÚwriteÚgetvaluerI   )r:   rK   ÚencodeStreamÚvalues       r   rG   zBanana.sendEncoded:  s?   € ô “yˆØ�‰�S˜,×,Ñ,Ô-Ø×%Ñ%Ó'ˆØ�‰×Ñ˜UÕ#r   c           	      ó¢  — t        |t        t        f«      ret        |«      t        kD  rt        dt        |«      fz  «      ‚t        t        |«      |«        |t        «       |D ]  }| j                  ||«       Œ y t        |t        «      r¶|| j                  k  s|| j                  kD  rt        d|fz  «      ‚|| j                  k  rt        | |«        |t        «       y |dk  rt        | |«        |t        «       y || j                  k  rt        ||«        |t         «       y t        ||«        |t"        «       y t        |t$        «      r) |t&        «        |t)        j*                  d|«      «       y t        |t,        «      r™| j.                  dk(  r6|| j0                  v r(| j0                  |   }t        ||«        |t2        «       y t        |«      t        kD  rt        dt        |«      fz  «      ‚t        t        |«      |«        |t4        «        ||«       y t        dj7                  t9        t;        |«      «      |«      «      ‚)Nz#list/tuple is too long to send (%d)zint is too large to send (%d)r   rY   r1   z$byte string is too long to send (%d)z#Banana cannot send {} objects: {!r})Ú
isinstanceÚlistÚtupler^   r`   r
   r   r_   r˜   Úintr6   r9   r7   rd   re   r8   rb   rc   Úfloatri   rj   Úpackr   r@   r”   rf   ra   r[   r   Útype)r:   rK   r™   ÚelemÚsymbolIDs        r   r˜   zBanana._encodeJ  sà  € Ü�cœD¤%˜=Ô)Ü�3‹xœ*Ò$Ü!Ð"GÌ3ÈsË8È+Ñ"UÓVÐVÜ”S˜“X˜uÔ%Ù”$ŒKØò *�Ø—‘˜T 5Õ)ñ*ä˜œSÔ!Ø�T×*Ñ*Ò*¨c°D×4HÑ4HÒ.HÜ!Ð"AÀSÀFÑ"JÓKÐKØ�T×&Ñ&Ò&Ü˜#˜˜uÔ%Ù”g•Ø�q’Ü˜#˜˜uÔ%Ù”c•
Ø˜×(Ñ(Ò(Ü˜˜eÔ$Ù”c•
ä˜˜eÔ$Ù”g•Ü˜œUÔ#Ù”%ŒLÙ”&—+‘+˜d CÓ(Õ)Ü˜œUÔ#à×"Ñ" eÒ+°°t×7KÑ7KÑ0KØ×/Ñ/°Ñ4�Ü˜ 5Ô)Ù”e•ä�s“8œjÒ(Ü%Ø>Ä#ÀcÃ(ÀÑLóð ô œ˜S› 5Ô)Ù”f”Ù�c•
äØ5×<Ñ<Ü&¤t¨C£yÓ1°3óóð r   )r   )r   r   r   Ú__doc__rF   r5   r`   Ú	sizeLimitr-   r=   rB   rM   rO   rV   rZ   rs   rD   r“   rg   ÚitemsÚkÚvr–   rG   r˜   r   r   r   r0   r0   a   s‘  „ ñð ˜GÐ$€Mà€KØ€Iò
4òò
ò4ò<1ò.ð €FòQòf$ð#à�ð#ð 	�!ð#ð 	˜ð	#ð
 	�að#ð 	�qð#ð 	�Qð#ð 	�Qð#ð 	�ð#ð 	�1ð#ð 	�rð#ð 	�"ð#ð 	˜"ð#ð 	�ð#ð  	�"ð!#ð" 	�2ð##ð$ 	�2ð%#ð& 	�"ð'#ð( àØØØØØØØØØØØØòE#ÐðJ ÐØ"×(Ñ(Ó*ò "‰ˆˆ1Ø !Ð˜1Òð"ó!ò$ó -r   r0   r2   c                 óv   — t        «       }|t        _        t        j                  | «       |j	                  «       S )zEncode a list s-expression.)r   Ú_irI   rG   rš   )ru   r›   s     r   Úencoder®   €  s+   € ä“9€LØ„B„LÜ‡N�N�3ÔØ× Ñ Ó"Ð"r   c                 ó´   — g }|j                   t        _        	 t        j                  | «       dt        _        t        `|d   S # dt        _        t        `w xY w)z)
    Decode a banana-encoded string.
    r   r   )rS   r­   rD   rs   rZ   )r   rU   s     r   Údecoder°   ˆ  sM   € ð 	€AØŸH™H„BÔð"Ü
�‰˜ÔàŒŒ	ÜÐ!ØˆQ‰4€Køð ŒŒ	ÜÑ!ús   ™A ÁA)'r§   r’   rj   Úior   Útwisted.internetr   Útwisted.persistedr   Útwisted.pythonr   Útwisted.python.compatr   Útwisted.python.reflectr   Ú	Exceptionr
   r   r!   r_   rb   ra   re   ri   rc   rd   rf   r]   r-   r+   r`   ÚProtocolÚ	Ephemeralr0   r­   rO   rB   r®   r°   r   r   r   ú<module>rº      sÌ   ðñ
ó Û Ý å %Ý $Ý Ý +Ý 5ô	�)ô 	òòð( €Ø€Ø	€Ø€Ø€à
€Ø
€à€à€òð  €Ù ˆrÔ à€
ôVˆX×Ñ × 0Ñ 0ô Vñt ƒX€Ø × Ñ Ô Ø × Ñ �'Ô ò#ór   