
[c           @   sW  d  Z  d d l Z d d l Z d d l Z d d l Z d d l Z d d l m Z m Z m	 Z	 m
 Z
 m Z m Z d d l m Z d d l Z d Z d   Z d   Z d   Z d	 e f d
     YZ d f  d     YZ d e f d     YZ d e f d     YZ d e f d     YZ d   Z d f  d     YZ d e f d     YZ d   Z d S(   s   2.5.65-8.el7iN(   t   ListTypet	   TupleTypet
   StringTypet   UnicodeTypet   DictTypet   DictionaryType(   t   UserDictCasei   c         C   s*   y t  j t  j |   t SWn t SXd S(   s5    Returns true if n is IPv6 address, false otherwise. N(   t   sockett	   inet_ptont   AF_INET6t   Truet   False(   t   n(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt
   check_ipv6$   s
    c   	      C   s8  |  j  d d  } d	 } d	 } d	 } d	 } t |  d k r | d } | d j  d d  } | d } t |  d k r | d } q n
 | d } | d d k r t j  d t d  \ } } | j d  j d  } nP t |  r | } n; | j  d d  } | d } t |  d k r(| d } n  | | | | f S(
   s|    Function used to split host information in an URL per RFC 2396
        handle full hostname like user:passwd@host:port
    t   @i   i   i    t   :t   [s   (?<=\]):t   ]N(   t   splitt   Nonet   lent   ret   ip_portt   lstript   rstripR   (	   t
   hoststringt   lt   hostt   portt   usert   passwdt   hostportt   userinfot   arr(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt
   split_host,   s,    


	
c         C   sS   |  d  k r t d  n  |  j d d  } t |  d k rI | d }  n  t |   S(   Ns   Host string cannot be nulls   ://i   i   (   R   t
   ValueErrorR   R   R"   (   t   proxyR!   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   get_proxy_infoQ   s    t   MalformedURIErrorc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR&   ]   s   t   Serverc        
   B   s^  e  Z d  Z e j Z e j Z e j Z	 e j
 Z d d d d d d d d d d 	 Z d d d d d  Z d   Z d   Z d   Z d   Z d d	  Z d
   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z d   Z e Z d   Z d d d  Z  d   Z! d   Z" d   Z# d   Z$ d   Z% d d  Z& d   Z' d   Z( RS(   s7  uri [,options] -> a logical connection to an XML-RPC server

    uri is the connection point on the server, given as
    scheme://host/target.

    The standard implementation always supports the "http" scheme.  If
    SSL socket support is available (Python 2.0), it also supports
    "https".

    If the target part and the slash preceding it are both omitted,
    "/RPC2" is assumed.

    The following options can be given as keyword arguments:

        transport: a transport factory
        encoding: the request encoding (default is UTF-8)
        verbose: verbosity level
        proxy: use an HTTP proxy
        username: username for authenticated HTTP proxy
        password: password for authenticated HTTP proxy

    All 8-bit strings passed to the server proxy are assumed to use
    the given encoding.
    i    c         C   s  | d  k r t |  \ } } } } | d  k	 rC d | | f } n | } | d  k	 r | d  k r | } | d  k	 r | d  k r | } q q n  | |  _ d  |  _ d  |  _ d  |  _ | |  _ | |  _ | |  _ |
 |  _	 t
 t j    d k rt j   d |  _ n	 t |  _ |  j   | d  k rMd |  _ |  j |  j | | | |
  } n	 d |  _ d  |  _ d |  _ | |  _ g  |  _ d  |  _ | |  _ | |  _ |  j |  |  j |	  d  |  _ t   |  _ d  S(   Ns   %s:%si   i    (   R   R%   t   _urit   _refreshCallbackt   _progressCallbackt   _bufferSizet   _proxyt	   _usernamet	   _passwordt   _timeoutR   t   __version__R   t   rpc_versiont   _reset_host_handler_and_typet   _allow_redirectt   default_transportt   _typet   _redirectedt   use_handler_patht
   _transportt   _trusted_cert_filest   _langt	   _encodingt   _verboset   set_refresh_callbackt   set_progress_callbackt   send_handlerR   t   _headers(   t   selft   urit	   transportt   encodingt   verboseR$   t   usernamet   passwordt   refreshCallbackt   progressCallbackt   timeoutt   pht   ppt   put   pw(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   __init__   sJ    									
										c         C   s   | rZ | d k r6 |  j  | d | d | d | } q |  j | d | d | d | } n3 | d k r{ |  j d |  } n |  j d |  } | S(   Nt   httpst   proxyUsernamet   proxyPasswordRL   (   t   _transport_class_https_proxyt   _transport_class_proxyt   _transport_class_httpst   _transport_class(   RC   t   typeR$   RH   RI   RL   RE   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR6      s    c         C   s   | |  _  d  S(   N(   R5   (   RC   t   allow(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   allow_redirect   s    c         C   s   |  j  s d  S|  j S(   N(   R5   R   R8   (   RC   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt
   redirected   s    	c         C   s   | |  _  |  j j |  d  S(   N(   R+   R:   R?   (   RC   RJ   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR?      s    	c         C   s   | |  _  |  j j |  d  S(   N(   R-   R:   t   set_buffer_size(   RC   t
   bufferSize(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR]      s    	i @  c         C   s    | |  _  |  j j | |  d  S(   N(   R,   R:   R@   (   RC   RK   R^   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR@      s    	c         C   s   t  j | | d |  j S(   NRF   (   t	   xmlrpclibt   dumpsR=   (   RC   t   paramst
   methodname(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt	   _req_body   s    c         C   s   |  j  r |  j  j Sd  S(   N(   R:   t
   headers_inR   (   RC   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   get_response_headers   s    	
c         C   s   |  j  r |  j  j Sd  S(   N(   R:   t   response_statusR   (   RC   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   get_response_status   s    	
c         C   s   |  j  r |  j  j Sd  S(   N(   R:   t   response_reasonR   (   RC   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   get_response_reason   s    	
c   	      C   s   |  j    } | s d	 S| j d  } | s/ d	 St d	 | j    } | d j d  } | \ } } | d k rx d	 } n t |  } | j d  \ } } i | d 6t |  d 6t |  d 6} | S(
   sS  Returns a dictionary with three values:
            length: the total length of the entity-body (can be None)
            first_byte_pos: the position of the first byte (zero based)
            last_byte_pos: the position of the last byte (zero based)
           The range is inclusive; that is, a response 8-9/102 means two bytes
        s   Content-Rangei   t   /t   *t   -t   lengtht   first_byte_post   last_byte_posN(   Re   R   t   gett   filterR   t   int(	   RC   t   headerst   content_rangeR!   t   branget	   total_lent   startt   endt   result(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   get_content_range   s$    	c         C   s1   |  j    } | s d  S| j d  r- | d Sd  S(   Ns   Accept-Ranges(   Re   R   t   has_key(   RC   Rs   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   accept_ranges  s    c         C   s   t  j |  j  \ } } | d
 k r0 t d  n  t |  d k  sU | d d !d k r^ t  n  | d
 k r| | j   |  _ n	 | |  _ |  j d k r t d  n  t  j	 |  \ |  _
 |  _ |  j s d	 |  _ n  d
 S(   s    Reset the attributes:
            self._host, self._handler, self._type
            according the value of self._uri.
        s   missing protocol in urii   i    i   s   //t   httpRR   s   unsupported XML-RPC protocols   /RPC2N(   R}   s   https(   t   urllibt	   splittypeR*   R   R&   R   t   lowerR7   t   IOErrort	   splithostt   _hostt   _handler(   RC   RY   RD   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR4   '  s    %			c      	   G   s(  d } g  } x | D] } t  |  } | t k s= | t k rU t j | d |  } n | t k r| t t |  j |   } ns | t	 k r t |  j |  } nR | t
 k s | t k r t g  | j   D] \ } } |  j | |  ^ q  } n  | j |  q Wt |  d k r| d St |  Sd S(   s>   Strip characters, which are not allowed according:
            http://www.w3.org/TR/2006/REC-xml-20060816/#charsets
            From spec:
            Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]  /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
        s#   [\x00-\x09]|[\x0b-\x0c]|[\x0e-\x1f]t    i   i    N(   RY   R   R   R   t   subR   t   tuplet   mapt   _strip_charactersR    R   R   t   dictt	   iteritemst   appendR   (   RC   t   argst   regexpRy   t   itemt	   item_typet   namet   val(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR   >  s     :c         C   s  d } d } |  j    xg| t k r4 t d   n  |  j j   x0 |  j j   D] \ } } |  j j | |  qQ W|  j j d d |  j	  |  j j d d  |  j
 r |  j j d d  n  | r |  j j d	 d
  |  j r |  j j d |  j  q n  |  j |  j |  |  } y7 |  j j |  j |  j | d |  j } |  j j }	 Wn. t j k
 r}
 |  j rt  q|
 j }	 n Xd |  _ | d 7} |	 d k rPn |	 d k rd |  _ q n  |  j j   |  _ d |  _ d } |  j
 st d   n  |  j rd |  j |  j f GHn  t j |  j  \ } } | d k rL| j   } n  | d k rkt d |   n  |  j d k r| d k rt d   n  t j |  \ |  _ |  _ |  j sd |  _ n  |  ` |  j  | |  j! |  j" |  j# |  j$  |  _ |  j% |  j&  |  j' |  j(  |  j) |  j*  |  j+ |  j,  |  j- g  k r t. |  j d  r x$ |  j- D] } |  j j/ |  q`Wq q t0 | t1 j2  r| St0 | t3  rt4 |  d k r| d } n  | S(   sM    Call a method on the remote server 
            we can handle redirections. i    s!   Unable to fetch requested Packages   X-Infos+   RPC Processor (C) Red Hat, Inc (version %s)s   X-Client-Versioni   s   X-RHN-Transport-Capabilitys   follow-redirects=3s   X-RHN-Redirectt   0s
   X-RHN-PathRG   i   i-  i.  s   Redirects not alloweds   %s redirected to %sR}   RR   s%   Redirected to unsupported protocol %ss)   HTTPS redirected to HTTP is not supporteds   /RPC2t   add_trusted_certN(   i-  i.  (   s   https   https(5   R4   t   MAX_REDIRECTIONSt   InvalidRedirectionErrorR:   t   clear_headersRB   t   itemst
   set_headert
   add_headerR3   R5   RA   Rc   R   t   requestR   R   R>   Rf   R_   t   ProtocolErrorR9   t   errcodeR   R8   R\   R*   R~   R   R   R7   R   R6   R.   R/   R0   R1   R@   R,   R?   R+   R]   R-   t   setlangR<   R;   t   hasattrR   t
   isinstancet
   transportst   FileR   R   (   RC   Rb   Ra   t   redirect_responset   retryt   kt   vR   t   responset   save_responset   pet   typRD   t   certfile(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   _requestX  s    
	
			
					!c         C   s   d |  j  j |  j |  j f S(   Ns   <%s for %s%s>(   t	   __class__R'   R   R   (   RC   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   __repr__  s    c         C   s   t  |  j |  S(   N(   t   _MethodR   (   RC   R   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   __getattr__  s    c         K   sB   |  j  s d  S| j i | d 6| d 6 t |  j  j d |  d  S(   Nt   transferRF   (    (   R:   t   updatet   applyt   set_transport_flags(   RC   R   RF   t   kwargs(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s    		c         C   s   |  j  s i  S|  j  j   S(   N(   R:   t   get_transport_flags(   RC   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s    	c         C   s   d  S(   N(    (   RC   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   reset_transport_flags  s    c         C   sT   t  |  t  g   t  d  g k r= t t |  |  j | <n t |  |  j | <d  S(   N(    (   RY   R   t   strRB   (   RC   R   t   arg(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s    $c         C   se   |  j  j |  r= |  j  | } t | t  sN | g } qN n g  } |  j  | <| j t |   d  S(   N(   RB   R{   R   R    R   R   (   RC   R   R   t   vlist(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s    c         C   s;   | |  _  |  j r7 t |  j d  r7 |  j j |  n  d  S(   NR   (   R<   R:   R   R   (   RC   t   lang(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR      s    	c         C   s   t  d  d  S(   Ns   This method is deprecated(   t   NotImplementedError(   RC   t   ca_chain(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   use_CA_chain  s    c         C   sB   |  j  j |  |  j r> t |  j d  r> |  j j |  n  d  S(   NR   (   R;   R   R:   R   R   (   RC   R   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR   	  s    c         C   s&   |  j  r" |  j  j   d  |  _  n  d  S(   N(   R:   t   closeR   (   RC   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s    	N()   R'   R(   t   __doc__R   t	   TransportRX   t   SafeTransportRW   t   ProxyTransportRV   t   SafeProxyTransportRU   R   RQ   R6   R[   R\   R?   R]   R@   Rc   Re   Rg   Ri   Rz   R|   R4   R   R   R   t   __str__R   R   R   R   R   R   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR)   b   sH   					C										#				s		
				
		t	   GETServerc        
   B   st   e  Z d d d d d  i  d d d d 	 Z d   Z d   Z d d d  Z d   Z d   Z d d d d d  Z	 RS(	   i   c         C   sr   t  j |  | d | d | d | d | d | d |	 d |
 | |  _ | |  _ |  j |  _ |  j d d  d	 d   d  S(
   NR$   RH   RI   RE   RJ   RK   RL   t   offsett   amount(   R)   RQ   t   _client_versionRB   R   t   _orig_handlert	   set_rangeR   (   RC   RD   RE   R$   RH   RI   t   client_versionRs   RJ   RK   RL   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyRQ     s    		c         C   s  | s t  |  d k  r( t d   n  t d   |  j j d   } | d | d | g t | d  } d d j |  |  _ |  j |  _ |  j	 r |  j
 r |  j   |  _ n  x0 |  j j   D] \ } } |  j j | |  q W|  j d  k	 r|  j d k rIt |  j  d } |  j d  k	 r]| t |  j |  j d  } q]n d t |  j  } |  j j d d	 |  |  j j d
 d  n  d S(   Ni   s$   Required parameter channel not foundc         S   s
   |  d k S(   NR   (    (   t   x(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   <lambda>+  s    Rj   s   $RHNi    Rl   t   Ranges   bytes=t   allow_partial_contentR   (   R   t	   ExceptionRq   R   R   t   listt   joinR   RA   R8   R9   t   _new_req_bodyRB   R   R:   R   t   _offsetR   R   t   _amountR   (   RC   Ra   Rb   t   h_compst   hndlt   hR   Ru   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyRc   '  s&    %$c         C   s1   t  j |  j  \ } } t  j |  \ } } | S(   N(   R~   R   R8   R   (   RC   RY   t   tmpurit   sitet   handler(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR   K  s    c         C   s   | d  k	 rS y t |  } WqS t k
 rO t d |  d  t j   d  qS Xn  | d  k	 r y t |  } Wn1 t k
 r t d |  d  t j   d  n X| d k r t d |   q n  | |  _ | |  _ d  S(   Ns   Invalid value `%s' for offseti   s   Invalid value `%s' for amounti    (   R   Rr   R#   t
   RangeErrort   syst   exc_infoR   R   (   RC   R   R   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR   P  s    '$	c         C   s   |  j  j d d  d  S(   NR   i    (   R:   R   (   RC   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR   e  s    c         C   s   t  |  j |  S(   N(   t   SlicingMethodR   (   RC   R   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR   h  s    c         C   s;   t  j |  | d | d | d | d | } | j d  | S(   NR$   RH   RI   RL   t   GET(   R)   R6   t
   set_method(   RC   RY   R$   RH   RI   RL   t   ret(    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR6   l  s    *N(
   R'   R(   R   RQ   Rc   R   R   R   R   R6   (    (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s   		$				R   c           B   s   e  Z RS(    (   R'   R(   (    (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR   r  s   R   c           B   s   e  Z RS(    (   R'   R(   (    (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR   u  s   c         C   sU   d d  l  } t |  | j  s< |  j |  r8 |  | g Sg  St d   |  j |   S(   Nic         S   s   |  j  d d  d j   S(   NR   i   (   R   t   strip(   R   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s    (   t	   mimetoolsR   t   MessageR{   R   t   getallmatchingheaders(   Rs   R   R   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   getHeaderValuesx  s    	R   c           B   s8   e  Z d  Z d   Z d   Z d   Z d   Z e Z RS(   s{    some magic to bind an XML-RPC method to an RPC server.
        supports "nested" methods (e.g. examples.getStateName)
    c         C   s   | |  _  | |  _ d  S(   N(   t   _sendt   _name(   RC   t   sendR   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyRQ     s    	c         C   s   t  |  j d |  j | f  S(   Ns   %s.%s(   R   R   R   (   RC   R   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s    c         G   s   |  j  |  j |  S(   N(   R   R   (   RC   R   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   __call__  s    c         C   s   d |  j  j |  j |  j f S(   Ns   <%s %s (%s)>(   R   R'   R   R   (   RC   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s    (   R'   R(   R   RQ   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s   				R   c           B   s)   e  Z d  Z d   Z d   Z d   Z RS(   s;   
    A "slicing method" allows for byte range requests
    c         C   s    t  j |  | |  d  |  _ d  S(   N(   R   RQ   R   R   (   RC   R   R   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyRQ     s    c         C   s   t  |  j d |  j | f  S(   Ns   %s.%s(   R   R   R   (   RC   R   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s    c         O   s   | j  d  |  _ | j  d  |  _ y& |  j j j d |  j d |  j  Wn t k
 r] n X|  j |  j |  } y |  j j j   Wn t k
 r n X| S(   NR   R   (	   Rp   R   R   R   t   im_selfR   t   AttributeErrorR   R   (   RC   R   R   Ry   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s    (   R'   R(   R   RQ   R   R   (    (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyR     s   		c         C   s   d } d } d } |  j  |  r4 t |  |  } n  d } |  j  |  r t |  |  } | r d j |  } d d l } d | j |  } q n  | | f S(   s%    Reports the error from the headers. i    R   s   X-RHN-Fault-Codes   X-RHN-Fault-StringiNs   %s(   R{   Rr   R   R   t   base64t   decodestring(   Rs   R   t   errmsgt   st   _sListt   _sR   (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   reportError  s    (   R2   R   R~   R   R   R   t   typesR    R   R   R   R   R   R   R_   R   R   R"   R%   R   R&   R)   R   R   R   R   R   R   R   R   (    (    (    s.   /usr/lib/python2.7/site-packages/rhn/rpclib.pyt   <module>   s,   .		%	 ^	
