ó
²ôù^c        	   @   s#  d  Z  d Z d d d d d d d d	 d
 g	 Z d d l m Z m Z m Z d Z d Z d Z	 d Z
 i d d 6d e 6d e 6d e	 6d e
 6Z i d d 6e d 6e d 6e	 d 6e
 d 6Z e d ƒ Z e d ƒ Z d „  Z d „  Z d e f d „  ƒ  YZ d	 e f d „  ƒ  YZ d
 e f d „  ƒ  YZ d S(   si   
ldapurl - handling of LDAP URLs as described in RFC 4516

See https://www.python-ldap.org/ for details.
s   3.3.1t   SEARCH_SCOPEt   SEARCH_SCOPE_STRt   LDAP_SCOPE_BASEt   LDAP_SCOPE_ONELEVELt   LDAP_SCOPE_SUBTREEt	   isLDAPUrlt   LDAPUrlExtensiont   LDAPUrlExtensionst   LDAPUrliÿÿÿÿ(   t   quotet   unquotet   MutableMappingi    i   i   i   t    t   baset   onet   subt   subordinatesc         C   s7   |  j  ƒ  } | j d ƒ p6 | j d ƒ p6 | j d ƒ S(   s*   
  Returns 1 if s is a LDAP URL, 0 else
  s   ldap://s   ldaps://s   ldapi://(   t   lowert
   startswith(   t   st   s_lower(    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR   1   s    c         C   s"   t  |  ƒ j d d ƒ j d d ƒ S(   s    Returns URL encoding of string st   ,s   %2Ct   /s   %2F(   R	   t   replace(   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   ldapUrlEscape<   s    c           B   sY   e  Z d  Z d	 d d	 d	 d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 RS(
   s
  
  Class for parsing and unparsing LDAP URL extensions
  as described in RFC 4516.

  Usable class attributes:
    critical
          Boolean integer marking the extension as critical
    extype
          Type of extension
    exvalue
          Value of extension
  i    c         C   s5   | |  _  | |  _ | |  _ | r1 |  j | ƒ n  d  S(   N(   t   criticalt   extypet   exvaluet   _parse(   t   selft   extensionStrR   R   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __init__N   s
    			c         C   sÕ   | j  ƒ  } | s( d \ |  _ |  _ d  S| d d k |  _ | d d k r^ | d j  ƒ  } n  y" | j d d ƒ \ |  _ |  _ Wn$ t k
 r¦ | d  |  _ |  _ n Xt |  j j  ƒ  ƒ |  _ |  j j  ƒ  |  _ d  S(   Ni    t   !i   t   =(   NN(   t   stript   NoneR   R   R   t   splitt
   ValueErrorR
   (   R   t	   extension(    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR   U   s    "c         C   sa   |  j  d  k r- d d |  j d k |  j f Sd d |  j d k |  j t |  j  pU d ƒ f Sd  S(   Ns   %s%sR    i    s   %s%s=%sR   (   R   R#   R   R   R	   (   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   unparseg   s
    c         C   s
   |  j  ƒ  S(   N(   R'   (   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __str__p   s    c         C   s/   d |  j  j |  j  j t t |  ƒ ƒ |  j f S(   Ns   <%s.%s instance at %s: %s>(   t	   __class__t
   __module__t   __name__t   hext   idt   __dict__(   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __repr__s   s
    		c         C   s4   |  j  | j  k o3 |  j | j k o3 |  j | j k S(   N(   R   R   R   (   R   t   other(    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __eq__{   s    c         C   s   |  j  | ƒ S(   N(   R1   (   R   R0   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __ne__   s    N(   R+   R*   t   __doc__R#   R   R   R'   R(   R/   R1   R2   (    (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR   @   s   						c           B   sz   e  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 RS(   sJ   
    Models a collection of LDAP URL extensions as
    a mapping type
    t   _datac         C   s)   i  |  _  | d  k	 r% |  j | ƒ n  d  S(   N(   R4   R#   t   update(   R   t   default(    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR   Œ   s    	c         C   si   t  | t ƒ s+ t d t | ƒ j ƒ ‚ n  | | j k rX t d j | | j ƒ ƒ ‚ n  | |  j | <d S(   s   Store an extension

        name
            string
        value
            LDAPUrlExtension instance, whose extype nust match `name`
        s$   value must be LDAPUrlExtension, not s+   key {!r} does not match extension type {!r}N(	   t
   isinstanceR   t	   TypeErrort   typeR+   R   R%   t   formatR4   (   R   t   namet   value(    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __setitem__‘   s    c         C   s   |  j  | S(   N(   R4   (   R   R;   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __getitem__¢   s    c         C   s   |  j  | =d  S(   N(   R4   (   R   R;   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __delitem__¥   s    c         C   s   t  |  j ƒ S(   N(   t   iterR4   (   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __iter__¨   s    c         C   s   t  |  j ƒ S(   N(   t   lenR4   (   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __len__«   s    c         C   s   d j  d „  |  j ƒ  Dƒ ƒ S(   NR   c         s   s   |  ] } t  | ƒ Vq d  S(   N(   t   str(   t   .0t   v(    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pys	   <genexpr>¯   s    (   t   joint   values(   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR(   ®   s    c         C   s/   d |  j  j |  j  j t t |  ƒ ƒ |  j f S(   Ns   <%s.%s instance at %s: %s>(   R)   R*   R+   R,   R-   R4   (   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR/   ±   s
    		c         C   s&   t  | |  j ƒ s t S|  j | j k S(   N(   R7   R)   t   NotImplementedR4   (   R   R0   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR1   ¹   s    c         C   sF   x? | j  ƒ  j d ƒ D]( } | r t | ƒ } | |  | j <q q Wd  S(   NR   (   R"   R$   R   R   (   R   t
   extListStrt   extension_strt   e(    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   parse¾   s    c         C   s   d j  d „  |  j ƒ  Dƒ ƒ S(   NR   c         s   s   |  ] } | j  ƒ  Vq d  S(   N(   R'   (   RE   RF   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pys	   <genexpr>Å   s    (   RG   RH   (   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR'   Ä   s    (   R4   N(   R+   R*   R3   t	   __slots__R#   R   R=   R>   R?   RA   RC   R(   R/   R1   RM   R'   (    (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR   …   s   									c           B   s¾   e  Z d  Z i d d 6d d 6Z d d d d d d d d d d d „
 Z d „  Z d	 „  Z d
 „  Z d „  Z	 d „  Z
 d „  Z d d d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   sš  
  Class for parsing and unparsing LDAP URLs
  as described in RFC 4516.

  Usable class attributes:
    urlscheme
        URL scheme (either ldap, ldaps or ldapi)
    hostport
        LDAP host (default '')
    dn
        String holding distinguished name (default '')
    attrs
        list of attribute types (default None)
    scope
        integer search scope for ldap-module
    filterstr
        String representation of LDAP Search Filters
        (see RFC 4515)
    extensions
        Dictionary used as extensions store
    who
        Maps automagically to bindname LDAP URL extension
    cred
        Maps automagically to X-BINDPW LDAP URL extension
  t   bindnamet   whos   X-BINDPWt   credt   ldapR   c         C   s›   | |  _  | |  _ | |  _ | |  _ | |  _ | |  _ | pE t i  ƒ |  _ | d  k rg |  j	 | ƒ n  |	 d  k r |	 |  _
 n  |
 d  k r— |
 |  _ n  d  S(   N(   t	   urlschemet   hostportt   dnt   attrst   scopet	   filterstrR   t
   extensionsR#   R   RP   RQ   (   R   t   ldapUrlRS   RT   RU   RV   RW   RX   RY   RP   RQ   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR   å   s    						c         C   s|   |  j  | j  k o{ |  j | j k o{ |  j | j k o{ |  j | j k o{ |  j | j k o{ |  j | j k o{ |  j | j k S(   N(   RS   RT   RU   RV   RW   RX   RY   (   R   R0   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR1   û   s    c         C   s   |  j  | ƒ S(   N(   R1   (   R   R0   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR2     s    c   
      C   s¿  t  | ƒ s% t d t | ƒ ƒ ‚ n  | j d d ƒ \ } } | j ƒ  |  _ |  j d k rq t d |  j ƒ ‚ n  | j d ƒ } | j d	 ƒ } | d
 k rÃ | d
 k rÃ t | ƒ |  _ d |  _	 d S| d
 k r| d
 k sç | | k  rt | |  ƒ |  _ | | d } nP | d k rO| d
 k s/| | k rOt | |  ƒ |  _ | | } n t d ƒ ‚ | j d	 d ƒ } t
 | ƒ } | d k r¡t | d ƒ j ƒ  |  _	 n  | d k rÜ| d rÜt | d j ƒ  ƒ j d ƒ |  _ n  | d k r6| d j ƒ  } y t | |  _ Wq6t k
 r2t d t | ƒ ƒ ‚ q6Xn  | d k rv| d j ƒ  }	 |	 sdd |  _ qvt |	 ƒ |  _ n  | d k r»| d r¯t ƒ  |  _ |  j j | d ƒ q»d |  _ n  d S(   sn   
    parse a LDAP URL and set the class attributes
    urlscheme,host,dn,attrs,scope,filterstr,extensions
    s5   Value %s for ldap_url does not seem to be a LDAP URL.s   ://i   RR   t   ldapst   ldapis,   LDAP URL contains unsupported URL scheme %s.R   t   ?iÿÿÿÿR   Ns$   Something completely weird happened!i   i    i   R   i   s   Invalid search scope %si   (   RR   R[   R\   (   R   R%   t   reprR$   R"   RS   t   findR
   RT   RU   RB   RV   R    RW   t   KeyErrorR#   RX   R   RY   RM   (
   R   t   ldap_urlt   schemet   restt	   slash_post
   qemark_post	   paramlistt   paramlist_lenRW   RX   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR     sT    	$$%
c         C   sI   xB | j  ƒ  D]4 \ } } t |  | ƒ d k r t |  | | ƒ q q Wd S(   s¦   
    Apply defaults to all class attributes which are None.

    defaults
        Dictionary containing a mapping from class attributes
        to default values
    N(   t   itemst   getattrR#   t   setattr(   R   t   defaultst   kR<   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   applyDefaultsA  s    c         C   s;   |  j  d k r! t |  j ƒ } n	 |  j } d |  j  | f S(   sE   
    Returns LDAP URL suitable to be passed to ldap.initialize()
    R\   s   %s://%s(   RS   R   RT   (   R   RT   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   initializeUrlM  s    	c         C   sÝ   |  j  d k r d } n d j |  j  ƒ } t |  j } |  j d k rO d } n t |  j ƒ } t |  j ƒ } |  j d k rŽ t |  j	 ƒ } n	 |  j	 } d |  j | | | | | f } |  j
 rÙ | d |  j
 j ƒ  } n  | S(   s=   
    Returns LDAP URL depending on class attributes set.
    R   R   R\   s   %s://%s/%s?%s?%s?%sR]   N(   RV   R#   RG   R   RW   RX   R   RU   RS   RT   RY   R'   (   R   t	   attrs_strt	   scope_strRX   RU   RT   Ra   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR'   X  s"    				c         C   sÕ   t  | t ƒ s+ t d t | ƒ j ƒ ‚ n  | d k rF |  j ƒ  } n  t  | t ƒ sq t d t | ƒ j ƒ ‚ n  | d k r† d } n5 t  | t ƒ s± t d t | ƒ j ƒ ‚ n  d | } d | | |  j ƒ  | f S(   s  
    Returns a string with HTML link for this LDAP URL.

    urlPrefix
        Prefix before LDAP URL (e.g. for addressing another web-based client)
    hrefText
        link text/description
    hrefTarget
        string added as link target attribute
    s   urlPrefix must be str, not s   hrefText must be str, not R   s   hrefTarget must be str, not s    target="%s"s   <a%s href="%s%s">%s</a>N(   R7   RD   R8   R9   R+   R#   R'   (   R   t	   urlPrefixt   hrefTextt
   hrefTargett   target(    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   htmlHREFs  s     	
c         C   s
   |  j  ƒ  S(   N(   R'   (   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR(   ‘  s    c         C   s/   d |  j  j |  j  j t t |  ƒ ƒ |  j f S(   Ns   <%s.%s instance at %s: %s>(   R)   R*   R+   R,   R-   R.   (   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR/   ”  s
    		c         C   sŠ   | |  j  k rj |  j  | } |  j rc | |  j k rc |  j | j d  k	 rc t |  j | j ƒ } q† d  Sn t d |  j j | f ƒ ‚ | S(   Ns   %s has no attribute %s(   t   attr2extypeRY   R   R#   R
   t   AttributeErrorR)   R+   (   R   R;   R   t   result(    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __getattr__œ  s    	c         C   s}   | |  j  k rl |  j  | } | d  k r8 t |  | ƒ qy | d  k ry t d | d t | ƒ ƒ |  j | <qy n | |  j | <d  S(   NR   R   (   Rv   R#   t   delattrR   R
   RY   R.   (   R   R;   R<   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __setattr__«  s    "c         C   s[   | |  j  k rM |  j  | } |  j rW y |  j | =WqJ t k
 rF qJ XqW n
 |  j | =d  S(   N(   Rv   RY   R`   R.   (   R   R;   R   (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   __delattr__¹  s    	
N(   R+   R*   R3   Rv   R#   R   R1   R2   R   Rm   Rn   R'   Ru   R(   R/   Ry   R{   R|   (    (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyR   È   s&   	
		9							N(    (   R3   t   __version__t   __all__t   ldap.compatR	   R
   R   R   R   R   t   LDAP_SCOPE_SUBORDINATESR#   R   R    R9   t
   StringTypet	   TupleTypeR   R   t   objectR   R   R   (    (    (    s-   /opt/osstech/lib/mailman/pythonlib/ldapurl.pyt   <module>   s:   	

		EC