
    XWe?0              
           d Z dZg dZddlmZ ddlmZmZ dZdZ	dZ
dZd	d
ede	de
dediZd	ee	e
edZ ed
          Z ed          Zd Zd Z G d d          Z G d de          Z G d d          Zd	S )zi
ldapurl - handling of LDAP URLs as described in RFC 4516

See https://www.python-ldap.org/ for details.
z3.4.4)	SEARCH_SCOPESEARCH_SCOPE_STRLDAP_SCOPE_BASELDAP_SCOPE_ONELEVELLDAP_SCOPE_SUBTREE	isLDAPUrlLDAPUrlExtensionLDAPUrlExtensionsLDAPUrl    )MutableMapping)quoteunquote         N baseonesubsubordinates)r   r   r   r   r    c                 P    |                                                      d          S )z.Returns True if s is a LDAP URL, else False
  )zldap://zldaps://zldapi://)lower
startswithss    /./ldapurl.pyr   r   2   s!     
		A	B	BB    c                 p    t          |                               dd                              dd          S )z Returns URL encoding of string s,z%2C/z%2F)r   replacer   s    r   ldapUrlEscaper#   8   s.    	q		#e	$	$	,	,S	7	77r   c                   >    e Zd ZdZddZd Zd Zd Zd Zd	 Z	d
 Z
dS )r   a
  
  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
  Nr   c                 b    || _         || _        || _        |r|                     |           d S d S N)criticalextypeexvalue_parse)selfextensionStrr'   r(   r)   s        r   __init__zLDAPUrlExtension.__init__J   sA    DMDKDL  
kk,   r   c                    |                                 }|sd\  | _        | _        d S |d         dk    | _        |d         dk    r|dd                                           }	 |                    dd          \  | _        | _        t          | j                                                   | _        n# t          $ r |d c| _        | _        Y nw xY w| j                                         | _        d S )N)NNr   !r   =)stripr(   r)   r'   splitr   
ValueError)r+   	extensions     r   r*   zLDAPUrlExtension._parseQ   s    !!I !*dk$,faL#%DM|SABB-%%''i3!*Q!7!7dk$,
 T\//1122dll	  0 0 0!*4dk$,,,0
 +##%%DKKKs   "#B1 1CCc                     | j         'd                    d| j        dk    z  | j                  S d                    d| j        dk    z  | j        t	          | j         pd                    S )Nz{}{}r/   r   z{}{}={}r   )r)   formatr'   r(   r   r+   s    r   unparsezLDAPUrlExtension.unparsec   sg    |]]3a0===T]1_E$,,"--  r   c                 *    |                                  S r&   r8   r7   s    r   __str__zLDAPUrlExtension.__str__l       <<>>r   c           	          d                     | j        j        | j        j        t	          t          |                     | j                  S Nz<{}.{} instance at {}: {}>r6   	__class__
__module____name__hexid__dict__r7   s    r   __repr__zLDAPUrlExtension.__repr__o   >    '..
n
n	"T((mm
m	  r   c                 b    | j         |j         k    o| j        |j        k    o| j        |j        k    S r&   )r'   r(   r)   r+   others     r   __eq__zLDAPUrlExtension.__eq__w   s5    }en$ ${EL $|U]"$r   c                 .    |                      |           S r&   rK   rI   s     r   __ne__zLDAPUrlExtension.__ne__}       {{5!!!!r   )Nr   NN)rB   rA   __qualname____doc__r-   r*   r8   r;   rF   rK   rN   r   r   r   r   r   <   s                & & &$      $ $ $" " " " "r   r   c                   Z    e 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dS )r	   zJ
    Models a collection of LDAP URL extensions as
    a mapping type
    _dataNc                 F    i | _         ||                     |           d S d S r&   )rT   update)r+   defaults     r   r-   zLDAPUrlExtensions.__init__   s/    
KK      r   c                     t          |t                    s$t          dt          |          j        z             ||j        k    r(t          d                    ||j                            || j        |<   dS )zStore an extension

        name
            string
        value
            LDAPUrlExtension instance, whose extype nust match `name`
        z$value must be LDAPUrlExtension, not z+key {!r} does not match extension type {!r}N)	
isinstancer   	TypeErrortyperB   r(   r3   r6   rT   )r+   namevalues      r   __setitem__zLDAPUrlExtensions.__setitem__   s     %!122 	4B"5kk23 4 4 45<=DD%,( () ) ) !
4r   c                     | j         |         S r&   rS   r+   r\   s     r   __getitem__zLDAPUrlExtensions.__getitem__   s    z$r   c                     | j         |= d S r&   rS   r`   s     r   __delitem__zLDAPUrlExtensions.__delitem__   s    Jtr   c                 *    t          | j                  S r&   )iterrT   r7   s    r   __iter__zLDAPUrlExtensions.__iter__   s    DJr   c                 *    t          | j                  S r&   )lenrT   r7   s    r   __len__zLDAPUrlExtensions.__len__   s    4:r   c                 d    d                     d |                                 D                       S )Nr    c              3   4   K   | ]}t          |          V  d S r&   )str.0vs     r   	<genexpr>z,LDAPUrlExtensions.__str__.<locals>.<genexpr>   s(      661A666666r   joinvaluesr7   s    r   r;   zLDAPUrlExtensions.__str__   s+    xx66666666r   c           	          d                     | j        j        | j        j        t	          t          |                     | j                  S r>   )r6   r@   rA   rB   rC   rD   rT   r7   s    r   rF   zLDAPUrlExtensions.__repr__   s>    +22N%N#4MMJ	
 
 	
r   c                 Z    t          || j                  st          S | j        |j        k    S r&   )rY   r@   NotImplementedrT   rI   s     r   rK   zLDAPUrlExtensions.__eq__   s+    %00 	"!!zU[((r   c                     |                                                     d          D ]}|rt          |          }|| |j        <   d S )Nr    )r1   r2   r   r(   )r+   
extListStrextension_stres       r   parsezLDAPUrlExtensions.parse   sV    '--//55c:: 	# 	#M #$]33!"QX	# 	#r   c                 d    d                     d |                                 D                       S )Nr    c              3   >   K   | ]}|                                 V  d S r&   r:   rm   s     r   rp   z,LDAPUrlExtensions.unparse.<locals>.<genexpr>   s*      ;;		;;;;;;r   rq   r7   s    r   r8   zLDAPUrlExtensions.unparse   s+    xx;;T[[]];;;;;;r   r&   )rB   rA   rP   rQ   	__slots__r-   r^   ra   rc   rf   ri   r;   rF   rK   r{   r8   r   r   r   r	   r	      s          I! ! ! !
! ! !"              7 7 7
 
 
) ) )
# # #< < < < <r   r	   c                   x    e Zd ZdZdddZ	 	 	 	 	 ddZd	 Zd
 Zd Zd Z	d Z
d ZddZd Zd Zd Zd Zd ZdS )r
   a  
  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
  bindnamezX-BINDPW)whocredNldapr   c                    |                                 | _        || _        || _        || _        || _        || _        |pt          i           | _        |d k    r| 	                    |           |	d k    r|	| _
        |
d k    r	|
| _        d S d S r&   )r   	urlschemehostportdnattrsscope	filterstrr	   
extensionsr*   r   r   )r+   ldapUrlr   r   r   r   r   r   r   r   r   s              r   r-   zLDAPUrl.__init__   s     ??$$DNDMDGDJDJDN8#4R#8#8DO}}
kk'
DyydhTzzdiii zr   c                     | j         |j         k    o_| j        |j        k    oO| j        |j        k    o?| j        |j        k    o/| j        |j        k    o| j        |j        k    o| j        |j        k    S r&   )r   r   r   r   r   r   r   rI   s     r   rK   zLDAPUrl.__eq__   s    
neo% (
mU^#(
gux( j%+( j%+	(
 neo%( ou''(r   c                 .    |                      |           S r&   rM   rI   s     r   rN   zLDAPUrl.__ne__  rO   r   c                    t          |          st          dt          |          z            |                    dd          \  }}|                                | _        |                    d          }|                    d          }|dk    r#|dk    rt          |          | _        d| _	        dS |dk    r6|dk    s||k     r*t          |d|                   | _        ||dz   d         }nH|dk    r3|dk    s||k    r't          |d|                   | _        ||d         }nt          d	          |                    dd
          }t          |          }|dk    r,t          |d                                                   | _	        |dk    rG|d         r?t          |d                                                                       d          | _        |dk    r[|d                                         }	 t          |         | _        n-# t          $ r  t          dt          |          z            w xY w|d
k    r8|d                                         }	|	sd| _        nt          |	          | _        |dk    rC|d
         r4t#                      | _        | j                            |d
                    nd| _        dS )zn
    parse a LDAP URL and set the class attributes
    urlscheme,host,dn,attrs,scope,filterstr,extensions
    z5Value %s for ldap_url does not seem to be a LDAP URL.://r   r!   ?r   Nz$Something completely weird happened!   r   r   r    r   zInvalid search scope %s   )r   r3   reprr2   r   r   findr   r   r   rh   r1   r   r   r   KeyErrorr   r	   r   r{   )
r+   ldap_urlschemerest	slash_pos
qemark_pos	paramlistparamlist_lenr   r   s
             r   r*   zLDAPUrl._parse  s   
 X cNRVW_R`R`abbb..q))KF4\\^^DN		#I3J2JNNdmmdmdgf	BJNNy/C/CZiZ 011IaKLL!q==imm	*0D0D[j[ 122JKK ?@@@jjQI	NNMa	!%%++--dgqy|9Q<--//0066s;;djal  ""eD!%(

 D D D2d5kkBCCCDaA,$$&&i , ++a	1 +--il++++
Fs   =H *H:c                 |    |                                 D ]&\  }}t          | |          t          | ||           'dS )z
    Apply defaults to all class attributes which are None.

    defaults
        Dictionary containing a mapping from class attributes
        to default values
    N)itemsgetattrsetattr)r+   defaultskr]   s       r   applyDefaultszLDAPUrl.applyDefaults;  sL     NN$$    5	a	 a   r   c                 h    | j         dk    rt          | j                  }n| j        }| j          d| S )zE
    Returns LDAP URL suitable to be passed to ldap.initialize()
    ldapir   )r   r#   r   )r+   r   s     r   initializeUrlzLDAPUrl.initializeUrlG  s?     ~wt}--hhhn+++++r   c                    | j         d}nd                    | j                   }t          | j                 }| j        d}nt          | j                  }t          | j                  }| j        dk    rt          | j                  }n| j        }d	                    | j        |||||          }| j
        r|dz   | j
                                        z   }|S )z=
    Returns LDAP URL depending on class attributes set.
    Nr   r    r   z{}://{}/{}?{}?{}?{}r   )r   rr   r   r   r   r#   r   r   r   r6   r   r8   )r+   	attrs_str	scope_strr   r   r   r   s          r   r8   zLDAPUrl.unparseR  s     zii((4:&&i ,I~ii//i	tw		B~wt}--hhh$++
nr)Ii H  8#do55777hOr   c                    t          |t                    s$t          dt          |          j        z             ||                                 }t          |t                    s$t          dt          |          j        z             |d}n>t          |t                    s$t          dt          |          j        z             d|z  }d                    |||                                 |          S )a  
    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
    zurlPrefix must be str, not NzhrefText must be str, not r   zhrefTarget must be str, not z target="%s"z<a{} href="{}{}">{}</a>)rY   rl   rZ   r[   rB   r8   r6   )r+   	urlPrefixhrefText
hrefTargettargets        r   htmlHREFzLDAPUrl.htmlHREFm  s    i%% 45y//23 4 4 	4<<>>h$$ 34x..12 3 3 	3*c** 	9:":..78 9 9 9*,$++	4<<>>8  r   c                 *    |                                  S r&   r:   r7   s    r   r;   zLDAPUrl.__str__  r<   r   c           	          d                     | j        j        | j        j        t	          t          |                     | j                  S r>   r?   r7   s    r   rF   zLDAPUrl.__repr__  rG   r   c                    || j         v rQ| j         |         }| j        r;|| j        v r2| j        |         j         t          | j        |         j                  }n/d S t	          d                    | j        j        |                    |S )Nz{} has no attribute {})attr2extyper   r)   r   AttributeErrorr6   r@   rB   )r+   r\   r(   results       r   __getattr__zLDAPUrl.__getattr__  s    t%f	 	4?	"	"_V$,40899t3::  	 	 	 Mr   c                     || j         v rQ| j         |         }|t          | |           d S |d k    r(t          |t          |                    | j        |<   d S d S || j        |<   d S )N)r(   r)   )r   delattrr   r   r   rE   )r+   r\   r]   r(   s       r   __setattr__zLDAPUrl.__setattr__  s    t%f	T$;;"2#
 #
 #
 ; "dmDr   c                     || j         v r2| j         |         }| j        r	 | j        |= d S # t          $ r Y d S w xY wd S | j        |= d S r&   )r   r   r   rE   )r+   r\   r(   s      r   __delattr__zLDAPUrl.__delattr__  sz    t%f	 	of%%% 	 	 	
$$	  -


s   ) 
77)
Nr   r   r   NNNNNN)r   NN)rB   rA   rP   rQ   r   r-   rK   rN   r*   r   r   r8   r   r;   rF   r   r   r   r   r   r   r
   r
      s        4 "44+ 6:   ,( ( (" " "5 5 5n
  
  
 	, 	, 	,  6   <      " " "	 	 	 	 	r   r
   )rQ   __version____all__collections.abcr   urllib.parser   r   r   r   r   LDAP_SCOPE_SUBORDINATESr   r   r[   
StringType	TupleTyper   r#   r   r	   r
   r   r   r   <module>r      s       + * * * * * ' ' ' ' ' ' ' '    r&eU.  
	(  T"XX

$r((	C C C8 8 8B" B" B" B" B" B" B" B"J@< @< @< @< @< @< @< @<Fx x x x x x x x x xr   