B
    ß%Q[©  ã               @   s@   d Z ddlmZ ddlmZmZmZmZ ddlm	Z	 dd„ Z
dS )Ú
é   )ÚLDAPInvalidDnError)ÚSEQUENCE_TYPESÚ
MODIFY_ADDÚBASEÚDEREF_NEVER)Úsafe_dnc                sê  t |tƒs|g}t |tƒs |g}d}d}| jrvg }g }x|D ]}	| t|	ƒ¡ q<W x|D ]}
| t|
ƒ¡ qXW |}|}|r†| jj ¡ }|�s�x||D �]r}|�r`| j|dt	t
ddgd�}| jjsÐ|  |¡\}}n| j| j }}|d dksöt|d	 ƒ‚d|d
 d k�r|d
 d d ng ‰d|d
 d k�r>|d
 d d ng ‰dd„ ˆD ƒ‰dd„ ˆD ƒ‰ng ‰g ‰tƒ }‡fdd„|D ƒ}‡fdd„|D ƒ}|�r¤t|f|d< |�r¶t|f|d< |r”| j|||�rÎ|gndd�}| jj�sð|  |¡\}}n| j}|d dkr”d}P q”W |�sœ�x†|D �]|}|�rê| j|dt	t
ddgd�}| jj�sX|  |¡\}}n| j| j }}|d dk�s€t|d	 ƒ‚d|d
 d k�r¢|d
 d d ng ‰d|d
 d k�rÈ|d
 d d ng ‰ dd„ ˆD ƒ‰dd„ ˆ D ƒ‰ ng ‰g ‰ tƒ }‡fdd„|D ƒ}‡ fdd„|D ƒ}|�r.t|f|d< |�r@t|f|d< |�r| j|||�rZ|gndd�}| jj�s||  |¡\}}n| j}|d dk�rd}P �qW |�rä|�r¾| jjjd|gd�}n| jjjd|gd�}|d dk�räd}| S )aù  
    :param connection: a bound Connection object
    :param members_dn: the list of members to add to groups
    :param groups_dn: the list of groups where members are to be added
    :param fix: checks for inconsistences in the users-groups relation and fixes them
    :param transaction: activates an LDAP transaction
    :return: a boolean where True means that the operation was successful and False means an error has happened
    Establishes users-groups relations following the eDirectory rules: groups are added to securityEquals and groupMembership
    attributes in the member object while members are added to member and equivalentToMe attributes in the group object.
    Raises LDAPInvalidDnError if members or groups are not found in the DIT.
    NFz(objectclass=*)ZsecurityEqualsZgroupMembership)Zdereference_aliasesÚ
attributesÚdescriptionÚsuccessz
 not foundé    r	   c             S   s   g | ]}|  ¡ ‘qS © )Úlower)Ú.0Úelementr   r   úiC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6i93dh7p\ldap3\ldap3\extend\novell\addMembersToGroups.pyú
<listcomp>T   s    z.edir_add_members_to_groups.<locals>.<listcomp>c             S   s   g | ]}|  ¡ ‘qS r   )r   )r   r   r   r   r   r   U   s    c                s   g | ]}|  ¡ ˆ kr|‘qS r   )r   )r   r   )Úexisting_security_equalsr   r   r   Z   s    c                s   g | ]}|  ¡ ˆ kr|‘qS r   )r   )r   r   )Úexisting_group_membershipr   r   r   [   s    )ÚcontrolsTÚmemberZequivalentToMec             S   s   g | ]}|  ¡ ‘qS r   )r   )r   r   r   r   r   r   y   s    c             S   s   g | ]}|  ¡ ‘qS r   )r   )r   r   r   r   r   r   z   s    c                s   g | ]}|  ¡ ˆ kr|‘qS r   )r   )r   r   )Úexisting_membersr   r   r   €   s    c                s   g | ]}|  ¡ ˆ kr|‘qS r   )r   )r   r   )Úexisting_equivalent_to_mer   r   r   �   s    )Úcommitr   )Ú
isinstancer   Zcheck_namesÚappendr   ÚextendZnovellZstart_transactionÚsearchr   r   ZstrategyZsyncZget_responseÚresponseÚresultr   Údictr   ÚmodifyZend_transaction)Ú
connectionZ
members_dnZ	groups_dnZfixZtransactionZtransaction_controlÚerrorZsafe_members_dnZsafe_groups_dnZ	member_dnZgroup_dnr   r   r   ZchangesZsecurity_equals_to_addZgroup_membership_to_addÚ_ÚgroupZmember_to_addZequivalent_to_me_to_addr   )r   r   r   r   r   Úedir_add_members_to_groups   s¨    



&&

&&
r&   N)Ú__doc__Zcore.exceptionsr   Ú r   r   r   r   Zutils.dnr   r&   r   r   r   r   Ú<module>   s   