ó
G¥êRc           @   sÌ   d  d l  Z  d  d l Z d  d l m Z m Z m Z d  d l m Z d d l m	 Z	 d e
 f d „  ƒ  YZ i d d	 6d
 d 6d d 6d d 6d d 6Z d „  Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿN(   t   packt   unpackt   calcsize(   t   partiali   (   t	   constantst   ProtocolErrorc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyR   3   s   s   !Ht   booleans   !ht   integert   cardinals   !it   long_integers   !It   long_cardinalc   
      C   s?  d d l  } d d l } yò | j d |  | f ƒ \ } } | j | d ƒ | j | j | ƒ ƒ } | j t d ƒ t d ƒ ƒ } | d t d ƒ k sè | d t d	 ƒ k pÀ | d
 t d	 ƒ k sè | d k sè | d k  sè | d k r÷ t d ƒ ‚ n  | | d } | SWn. | j	 k
 r:}	 t d |	 d d ƒ ‚ n Xd S(   s9   Returns the AP_REQ Kerberos 5 ticket for a given service.iÿÿÿÿNs   %s@%st    i   i    i`   i   i   i   i   i@   s6   Invalid GSSAPI token provided by Python's Kerberos APIs!   Kerberos authentication error: %s(
   t   kerberost   base64t   authGSSClientInitt   authGSSClientStept	   b64decodet   authGSSClientResponset   findt   chrR   t   GSSError(
   t   servicet   serverR   R   t   status_codet   contextt   token_gssapit
   body_startt   bodyt   err(    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyt   _get_krb5_ap_reqC   s    -$t   USPBlockc           B   sS   e  Z d  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e	 d „  ƒ Z
 RS(   s'   Class which allows to build USP blocks.c            sb   ˆ  j  j ‡  f d †  t j ƒ  Dƒ ƒ ˆ  j  j ‡  f d †  t j ƒ  Dƒ ƒ d ˆ  _ | ˆ  _ d  S(   Nc            s/   i  |  ]% \ } } t  ˆ  j | ƒ d  | “ q S(   t   put_(   R   t   put_data(   t   .0t   namet   fmt(   t   self(    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pys
   <dictcomp>o   s   	c            s/   i  |  ]% \ } } t  ˆ  j | ƒ d  | “ q S(   t   read_(   R   t	   read_data(   R#   R$   R%   (   R&   (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pys
   <dictcomp>s   s   	R   (   t   __dict__t   updatet   _formatst   itemst   buffert
   block_type(   R&   R.   (    (   R&   s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyt   __init__l   s    			c         C   s   |  j  t | | ƒ 7_  d S(   s#   Put formatted data into the buffer.N(   R-   R    (   R&   R%   t   s(    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyR"   z   s    c         C   s‡   d | k r t  d ƒ ‚ n  | j d d ƒ j d d ƒ } |  j t | ƒ ƒ |  j | 7_ t | ƒ d d k rƒ |  j d 7_ n  d	 S(
   s   Put a string into the buffer.t    s'   Null characeters are not allowed in USPs   s    s   
s   
i   i   N(   t   USPErrort   replacet   put_cardinalt   lenR-   (   R&   R0   t   encoded(    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyt
   put_string   s    c   	      C   sà   d } | j  t d |  j ƒ ƒ |  j } t } x« t | ƒ d k sI | rÛ t } t | ƒ | k r‚ | d | !| | } } t } n | d } } t } t | ƒ d } | r¸ | d O} n  t d | ƒ } | j  | | ƒ q1 Wd S(   s   Sends the block over a socket.iü  s   !Hi    R   i   i €  N(   t   sendallR    R.   R-   t   TrueR5   t   False(	   R&   t   sockt   magic_numbert   unsentt
   first_passt   currentt   lastt   header_numbert   header(    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyt   send’   s     		c         C   sg   t  | ƒ } t |  j ƒ | k  r0 t d ƒ ‚ n  |  j d | !|  j | } |  _ t | | ƒ \ } | S(   s#   Read a data using a type specifier.s:   Invalid data received from the client (block is too short)i    (   R   R5   R-   R   R   (   R&   R%   t   sizet   datat   unpacked(    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyR(   ¯   s    !c         C   s   |  j  ƒ  } t |  j ƒ | k  r0 t d ƒ ‚ n  | d d k rJ | d n | } |  j d | !|  j | } |  _ | j d d ƒ j d d ƒ S(	   s   Read a string from the buffer.s:   Invalid data received from the client (block is too short)i   i   i    s   
s   
s    s   (   t   read_cardinalR5   R-   R   R3   (   R&   RD   t   omitR6   (    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyt   read_stringº   s     !c   
      C   s  |  j  d ƒ } t d | ƒ \ } t | ƒ } d } t } xÖ | st d |  j  d ƒ ƒ \ } | d @d k } | d @d } | | k r– t d ƒ ‚ n  d } x` t | ƒ | k  rþ t | ƒ }	 | |  j  | t | ƒ ƒ 7} t | ƒ |	 k rŸ t d	 ƒ ‚ qŸ qŸ W| j | 7_ q< W| S(
   s'   Receives a block sent over the network.i   s   !Hi   i €  i    iÿ  s   Subblock size is too largeR   s,   Connection broken while transmitting a block(   t   recvR   R    R:   R   R5   R-   (
   R;   RB   R.   t   blockR<   R@   t	   subheaderRD   R-   t   old_len(    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyt   receiveÆ   s&    	(   R   R   t   __doc__R/   R"   R7   RC   R(   RI   t   staticmethodRN   (    (    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyR    i   s   						t	   RPCClientc           B   sD   e  Z e d d  „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C   sK   t  j | ƒ j ƒ  |  _ | |  _ | |  _ | |  _ |  j ƒ  |  j ƒ  d  S(   N(	   t   sockett   getfqdnt   lowerR   t   portt   autht   timeoutt   connectt   make_wrapper(   R&   R   RU   RV   RW   (    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyR/   ç   s    			
c         C   sà   t  j |  j |  j f |  j ƒ |  _  |  j  j t  j t  j d ƒ t |  d ƒ s^ |  j  |  _	 n  t
 t j ƒ } |  j rÂ t d |  j ƒ } | j t | ƒ ƒ x1 | D] } | j t | ƒ ƒ q¢ Wn | j d ƒ |  j | ƒ d  S(   Ni   t   wrappert   discussi    (   RR   t   create_connectionR   RU   RW   t
   setsockoptt   IPPROTO_TCPt   TCP_NODELAYt   hasattrRZ   R    R   t
   KRB_TICKETRV   R   R4   R5   t   ordRC   (   R&   t
   auth_blockt   authenticatort   byte(    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyRX   ð   s    $	c            s,   d t  f ‡  f d †  ƒ  Y} | ƒ  ˆ  _ d  S(   Nt   SocketWrapperc              s&   e  Z ‡  f d  †  Z ‡  f d †  Z RS(   c            s\   y ˆ  j  j | | Ž  SWn> t  j k
 rW } | j t j k rN |  j | | Ž  S| ‚ n Xd  S(   N(   RR   RJ   t   errort   errnot   EINTR(   t   self2t   argst   kwargsR   (   R&   (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyRJ     s    c            s\   y ˆ  j  j | | Ž  SWn> t  j k
 rW } | j t j k rN |  j | | Ž  S| ‚ n Xd  S(   N(   RR   R8   Rg   Rh   Ri   (   Rj   Rk   Rl   R   (   R&   (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyR8   $  s    (   R   R   RJ   R8   (    (   R&   (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyRf     s   	(   t   objectRZ   (   R&   Rf   (    (   R&   s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyRY     s    c         C   s   | j  |  j ƒ d  S(   N(   RC   RZ   (   R&   RK   (    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyRC   /  s    c         C   s   t  j |  j ƒ S(   N(   R    RN   RZ   (   R&   (    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyRN   2  s    c         C   sP   | j  t j 7_  |  j | ƒ |  j ƒ  } | j  t j k rL t d ƒ ‚ n  | S(   Ns   Transport-level error(   R.   R   t	   PROC_BASERC   RN   t
   REPLY_TYPER   (   R&   RK   t   reply(    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyt   request5  s    N(
   R   R   R9   t   NoneR/   RX   RY   RC   RN   Rq   (    (    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyRQ   æ   s   		)			(   Rh   RR   t   structR    R   R   t	   functoolsR   R   R   t	   ExceptionR   R+   R   Rm   R    RQ   (    (    (    s/   /usr/lib/python2.7/dist-packages/discuss/rpc.pyt   <module>,   s   
	&}