
    \d/                     v   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"#                                 e"$                    d           d Z%d Z&dS )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dS )BananaErrorN)__name__
__module____qualname__     5lib/python3.11/site-packages/twisted/spread/banana.pyr
   r
      s        Dr   r
   c                     | dk    r |d           d S | dk    s
J d            | r% |t          | dz  f                     | dz	  } | #d S d S )Nr       z!can only encode positive integers      )bytes)integerstreams     r   int2b128r      s    !||uQ;;;;;;;
 ugn&''(((Q,      r   c                 j    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!   )   sK     	
A	A"  II	QU
	aHr                           c                 
    | a dS )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     MMMr   @   i  
 c                   8   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                                D ]
\  ZZeee<   dBd?Zd@ ZdA ZdS )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                 r    || _         d|dz  z   dz   | _        d| _        d| _        d|dz  z  dz
  | _        dS )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   sQ     !"#	"2 3a 7&& UQY/!3r   c                     dS )zPSurrogate for connectionMade
        Called after protocol negotiation.
        Nr   r:   s    r   connectionReadyzBanana.connectionReady~   s      r   c                 <    || _         |                                  d S N)currentDialectr=   )r:   dialects     r   _selectDialectzBanana._selectDialect   s"    %r   c                    | j         r|                     |           d S | j        rj|D ]8}|| j        v r-|                     |           |                     |            d S 9t          j        d           | j        	                                 d S || j        v r|                     |           d S t          j        d           | j        	                                 d S )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    	4##C((((( } 4!$ 4 4I D$666((333++I666 7 G@   N1133333$,,,'',,,,, GC   N1133333r   c                     |                      t                     d | _        | j        s|                     | j                   d S d S r?   )r-   r+   r@   rE   rG   rF   r<   s    r   connectionMadezBanana.connectionMade   sO    M***"} 	1T/00000	1 	1r   c                     | j         }|r#|d         d                             |           d S |                     |           d S )Nr   )	listStackappendrM   )r:   itemls      r   gotItemzBanana.gotItem   sK    N 	.bE!HOOD!!!!!''-----r   r   c                 V   | j         |z   }| j        }| j        }|r| j         |k    s=J d                    t	          | j                   t	          |                                || _         d}t          |          D ]}|t          k    r n+|dz   }|| j        k    rt          d| j        fz            d S |d |         }|||dz            }||dz   d          }	t          |          | j        k    rt          d| j        fz            |t          k    rDt          |          }|t          k    rt          d          |                    |g f           |	}n|t          k    r]t          |          }|t          k    rt          d          t          |	          |k    r|	|d          } ||	d |                    nad S |t          k    r|	}t          |          } ||           n6|t           k    r|	}t          |          } ||           n|t"          k    r|	}t          |          } ||            n|t$          k    r|	}t          |           } ||           n|t&          k    rG|	}t          |          }| j        |         }
| j        dk    r ||
           n{t-          d	|
          |t.          k    rLt          |	          d
k    r7|	d
d          } |t1          j        d|	d d
                   d                    nd S t-          d|          |r}t          |d         d                   |d         d         k    rR|                                d         }
 ||
           |r+t          |d         d                   |d         d         k    R|d| _         d S )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   s   u$N	, L	;&(((*C*J*JT[!!V+ +((( !DKC'' 
 
%%EAg)))%K+-.   #,CcC!Gm,H#'))$D3xx$***!O')*   4smm##%&KLLL  #r+++V##smm##%&MNNNt99##!#$$ZFGD#J''''FSsmmW$$smmW$$smmS}}nU""smm.s3&%//GDMMMM-.Vd.V.VWWWU""t99>>!!""XFGFM$RaR99!<====F)*Kx*K*KLLL Yr]1%5!6!6)B-:J!J!J }}q)  Yr]1%5!6!6)B-:J!J!JU  L	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                 l    g | _         t          j        | j                  | _        d| _        || _        d S )Nr   )rR   copyoutgoingVocabularyoutgoingSymbolsoutgoingSymbolCountrE   )r:   rE   s     r   __init__zBanana.__init__4  s1    #y)@AA#$  r   c                     t                      }|                     ||j                   |                                }| j                            |           dS )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:  sQ     yyS,,---%%''U#####r   c           	         t          |t          t          f          rt          |          t          k    r t          dt          |          fz            t          t          |          |            |t                     |D ]}|                     ||           d S t          |t                    r|| j
        k     s|| j        k    rt          d|fz            || j        k     r#t          | |            |t                     d S |dk     r#t          | |            |t                     d S || j        k    r"t          ||            |t                      d S t          ||            |t"                     d S t          |t$                    r0 |t&                      |t)          j        d|                     d S t          |t,                    r| j        dk    r8|| j        v r/| j        |         }t          ||            |t2                     d S t          |          t          k    r t          dt          |          fz            t          t          |          |            |t4                      ||           d S t          d                    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   cD%=)) ,	3xx*$$!"G3s88+"UVVVSXXu%%%E$KKK * *T5))))* *S!! %	T***cD4H.H.H!"ASF"JKKKT&&&#u%%%gq#u%%%c




(((e$$$c




e$$$gU## 	E%LLLE&+dC(()))))U## 	"e++t7K0K0K/45)))es88j((%>#c((L   S5)))fc




5<<&tCyy113   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 
4  
  4 4 4<1 1 1. . . FQ Q Qf$ $ $## 	!# 		#
 	a# 	q# 	Q# 	Q# 	# 	1# 	r# 	"# 	"# 	#  	"!#" 	2##$ 	2%#& 	"'#( E# # #J "((** " "1 !1! ! ! !$ $ $ - - - - -r   r0   r2   c                     t                      }|t          _        t                              |            |                                S )zEncode a list s-expression.)r   _irI   rG   r   )ru   r   s     r   encoder     s6    99LBLNN3  """r   c                     g }|j         t          _        	 t                              |            dt          _        t          `n# dt          _        t          `w xY w|d         S )z)
    Decode a banana-encoded string.
    r   r   )rS   r   rD   rs   rZ   )r   rU   s     r   decoder     s_     	AHB"
	!! 	!!!!!Q4Ks   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 5 5 5 5 5	 	 	 	 	) 	 	 	    ( 	

     r   
V V V V VX 0 V V Vt VXX         '   # # #    r   