
    jJ4                     N    d dl mZ d dlmZ d dlmZmZmZ  G d de          ZdS )    )partial)AsyncManagementEnforcer)
join_slicearray_remove_duplicatesset_subtractc                       e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd dZd!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 )"AsyncEnforcerzS
    AsyncEnforcer = AsyncManagementEnforcer + RBAC_API + RBAC_WITH_DOMAIN_API
    c                 f   K   | j         j         d         d         j                            |          S )zgets the roles that a user has.gmodelrm	get_rolesselfnames     _/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/casbin/async_enforcer.pyget_roles_for_userz AsyncEnforcer.get_roles_for_user   ,      z$S),66t<<<    c                 f   K   | j         j         d         d         j                            |          S )zgets the users that has a role.r   r   r   	get_usersr   s     r   get_users_for_rolez AsyncEnforcer.get_users_for_role   r   r   c                 t   K   |                      |           d{V }t          fd|D                       S )z%determines whether a user has a role.Nc              3   $   K   | ]
}|k    V  d S N ).0rroles     r   	<genexpr>z2AsyncEnforcer.has_role_for_user.<locals>.<genexpr>%   s'      ,,19,,,,,,r   )r   any)r   r   r!   roless     ` r   has_role_for_userzAsyncEnforcer.has_role_for_user"   sO      --d33333333,,,,e,,,,,,r   c                 >   K   |                      ||           d{V S )zz
        async adds a role for a user.
        Returns false if the user already has the role (aka not affected).
        Nadd_grouping_policyr   userr!   s      r   add_role_for_userzAsyncEnforcer.add_role_for_user'   s0      
 --dD999999999r   c                 >   K   |                      ||           d{V S )z
        async deletes a role for a user.
        Returns false if the user does not have the role (aka not affected).
        N)remove_grouping_policyr)   s      r   delete_role_for_userz"AsyncEnforcer.delete_role_for_user.   s0      
 00t<<<<<<<<<r   c                 >   K   |                      d|           d{V S )z
        async deletes all roles for a user.
        Returns false if the user does not have any roles (aka not affected).
        r   Nremove_filtered_grouping_policyr   r*   s     r   delete_roles_for_userz#AsyncEnforcer.delete_roles_for_user5   s0      
 99!TBBBBBBBBBr   c                 ~   K   |                      d|           d{V }|                     d|           d{V }|p|S )zl
        async deletes a user.
        Returns false if the user does not exist (aka not affected).
        r   Nr1   remove_filtered_policy)r   r*   res1res2s       r   delete_userzAsyncEnforcer.delete_user<   `      
 99!TBBBBBBBB00D99999999|tr   c                 ~   K   |                      d|           d{V }|                     d|           d{V }|p|S )zl
        async deletes a role.
        Returns false if the role does not exist (aka not affected).
           Nr   r5   )r   r!   r7   r8   s       r   delete_rolezAsyncEnforcer.delete_roleF   r:   r   c                 .   K    | j         dg|R   d{V S )zx
        async deletes a permission.
        Returns false if the permission does not exist (aka not affected).
        r<   Nr6   )r   
permissions     r   delete_permissionzAsyncEnforcer.delete_permissionP   s5      
 1T0@Z@@@@@@@@@@r   c                 R   K   |                      t          |g|R             d{V S )z
        async adds a permission for a user or role.
        Returns false if the user or role already has the permission (aka not affected).
        N)
add_policyr   r   r*   r@   s      r   add_permission_for_userz%AsyncEnforcer.add_permission_for_userW   s<      
 __Z%Bz%B%B%BCCCCCCCCCr   c                 R   K   |                      t          |g|R             d{V S )z
        async deletes a permission for a user or role.
        Returns false if the user or role does not have the permission (aka not affected).
        N)remove_policyr   rD   s      r   delete_permission_for_userz(AsyncEnforcer.delete_permission_for_user^   s>      
 ''
4(E*(E(E(EFFFFFFFFFr   c                 >   K   |                      d|           d{V S )z
        async deletes permissions for a user or role.
        Returns false if the user or role does not have any permissions (aka not affected).
        r   Nr?   r2   s     r   delete_permissions_for_userz)AsyncEnforcer.delete_permissions_for_usere   s0      
 00D999999999r   c                 2   K   |                      d|          S )z6
        gets permissions for a user or role.
        r   )get_filtered_policyr2   s     r   get_permissions_for_userz&AsyncEnforcer.get_permissions_for_userl   s       ''4000r   c                 F   K   |                      t          |g|R            S )z=
        determines whether a user has a permission.
        )
has_policyr   rD   s      r   has_permission_for_userz%AsyncEnforcer.has_permission_for_userr   s*       z$<<<<===r    c                   K   g }|g}|r||                     d          }| j                                        D ]K}|                    ||          }|D ]0}||vr*|                    |           |                    |           1L|||S )a  
        gets implicit roles that a user has.
        Compared to get_roles_for_user(), this function retrieves indirect roles besides direct roles.
        For example:
        g, alice, role:admin
        g, role:admin, role:user

        get_roles_for_user("alice") can only get: ["role:admin"].
        But get_implicit_roles_for_user("alice") will get: ["role:admin", "role:user"].
        r   )poprm_mapvaluesr   append)r   r   domainresqueuer   r$   r    s           r   get_implicit_roles_for_userz)AsyncEnforcer.get_implicit_roles_for_userx   s        	(99Q<<Dk((** ( (T622 ( (A||

1Q(  	( 
r   Tc                 B   K   |                      d|||           d{V S )a7  
        gets implicit permissions for a user or role.
        Compared to get_permissions_for_user(), this function retrieves permissions for inherited roles.
        For example:
        p, admin, data1, read
        p, alice, data2, read
        g, alice, admin

        get_permissions_for_user("alice") can only get: [["alice", "data2", "read"]].
        But get_implicit_permissions_for_user("alice") will get: [["admin", "data1", "read"], ["alice", "data2", "read"]].

        For given domain policies are filtered by corresponding domain matching function of DomainManager
        Inherited roles can be matched by domain. For domain neutral policies set:
         filter_policy_dom = False

        filter_policy_dom: bool - For given *domain*, policies will be filtered by domain as well. Default = True
        pN)'get_named_implicit_permissions_for_user)r   r*   rW   filter_policy_doms       r   !get_implicit_permissions_for_userz/AsyncEnforcer.get_implicit_permissions_for_user   s5      $ AA#tVUfgggggggggr   c                 J  K   |                      ||           d{V }|                    d|           g }|                                 j        }|r|dk    rt	          ||          }|D ]8}|                     |||r|nd           d{V }	|                    |	           9|S )aG  
        gets implicit permissions for a user or role by named policy.
        Compared to get_permissions_for_user(), this function retrieves permissions for inherited roles.
        For example:
        p, admin, data1, read
        p, alice, data2, read
        g, alice, admin

        get_permissions_for_user("alice") can only get: [["alice", "data2", "read"]].
        But get_implicit_permissions_for_user("alice") will get: [["admin", "data1", "read"], ["alice", "data2", "read"]].

        For given domain policies are filtered by corresponding domain matching function of DomainManager
        Inherited roles can be matched by domain. For domain neutral policies set:
         filter_policy_dom = False

        filter_policy_dom: bool - For given *domain*, policies will be filtered by domain as well. Default = True
        Nr   rQ   )rZ   insertget_role_managerdomain_matching_funcr   (get_named_permissions_for_user_in_domainextend)
r   ptyper*   rW   r^   r$   rX   rc   r!   permissionss
             r   r]   z5AsyncEnforcer.get_named_implicit_permissions_for_user   s      $ 66tVDDDDDDDDQ  $4466K 	;*d2216::F 	$ 	$D $ M Mt'8@VVb! !      K JJ{####
r   c                 h  K   |                                  }| j                            ddd          }| j                            ddd          }t          ||z             }t	                      }t          ||          }|D ]0}t          |g|R  } | j        | }	|	r|                    |           1|S )aJ  
        gets implicit users for a permission.
        For example:
        p, admin, data1, read
        p, bob, data1, read
        g, alice, admin

        get_implicit_users_for_permission("data1", "read") will get: ["alice", "bob"].
        Note: only users will be returned, roles (2nd arg in "g") will be excluded.
        r   r<   r   )	get_all_subjectsr   get_values_for_field_in_policyr   listr   r   enforcerV   )
r   r@   
p_subjects	g_inherit
g_subjectssubjectsrX   r*   reqalloweds
             r   !get_implicit_users_for_permissionz/AsyncEnforcer.get_implicit_users_for_permission   s       **,,
J==c3JJ	Z>>sCKK
*:
+BCCff)44 	! 	!DT/J///C"dlC(G !

4   
r   c                 h   K   | j         j         d         d         j                            ||          S )z/gets the roles that a user has inside a domain.r   r   r   r   rW   s      r   get_roles_for_user_in_domainz*AsyncEnforcer.get_roles_for_user_in_domain   .      z$S),66tVDDDr   c                 h   K   | j         j         d         d         j                            ||          S )z/gets the users that has a role inside a domain.r   r   ru   s      r   get_users_for_role_in_domainz*AsyncEnforcer.get_users_for_role_in_domain   rw   r   c                 B   K   	 |                      |||           d{V S )z-async adds a role for a user inside a domain.Nr'   r   r*   r!   rW   s       r   add_role_for_user_in_domainz)AsyncEnforcer.add_role_for_user_in_domain   s3      P--dD&AAAAAAAAAr   c                 D   K   	 |                      d|||           d{V S )z0async deletes a role for a user inside a domain.r   Nr0   r{   s       r   delete_roles_for_user_in_domainz-AsyncEnforcer.delete_roles_for_user_in_domain   s5      S99!T4PPPPPPPPPr   c                 @   K   |                      d||           d{V S )z2gets permissions for a user or role inside domain.r\   N)rd   )r   r*   rW   s      r   "get_permissions_for_user_in_domainz0AsyncEnforcer.get_permissions_for_user_in_domain   s0      BB3fUUUUUUUUUr   c                 6   K   |                      |d||          S )zDgets permissions for a user or role with named policy inside domain.r   )get_filtered_named_policy)r   rf   r*   rW   s       r   rd   z6AsyncEnforcer.get_named_permissions_for_user_in_domain   s       --eQfEEEr   c                 "  K   | j         j         d         d         }|j        }t                      }|D ]O}|t          |          dz
           |k    r1|t          |          dz
           }||vr|                    |           Pt          |          S )zgets all roles associated with the domain.
        note: Not applicable to Domains with inheritance relationship  (implicit roles)r   r<      )r   policysetlenaddrk   )r   rW   r   policiesr$   r   r!   s          r   get_all_roles_by_domainz%AsyncEnforcer.get_all_roles_by_domain  s       JS!#&8 	$ 	$Fc&kkAo&&00c&kkAo.u$$IIdOOOE{{r   c                 D  K   t                      }|                     dd           d{V }|                     dd           d{V }|                                 }|                                 }|                                 D ]r}||         |k    rd||         }||vrd|t          |          <   -|                    |          }	|	D ]-}
|                                }|
||<   d|t          |          <   .sd d |                                D             D             }|S )a  gets implicit user based on resource.
        for example:
            p, alice, data1, read
            p, bob, data2, write
            p, data2_admin, data2, read
            p, data2_admin, data2, write
            g, alice, data2_admin
        get_implicit_users_for_resource("data2") will return [[bob data2 write] [alice data2 read] [alice data2 write]]
        get_implicit_users_for_resource("data1") will return [[alice data1 read]]
        Note: only users will be returned, roles (2nd arg in "g") will be excluded.r\   subNobjTc                 ,    g | ]}t          |          S r   rk   r   ts     r   
<listcomp>zAAsyncEnforcer.get_implicit_users_for_resource.<locals>.<listcomp>,      RRR1tAwwRRRr   c              3   4   K   | ]}t          |          V  d S r   r   r   keys     r   r"   z@AsyncEnforcer.get_implicit_users_for_resource.<locals>.<genexpr>,  (      (Q(Qsc(Q(Q(Q(Q(Q(Qr   )	dictget_field_indexrb   get_all_roles
get_policytupler   copykeys)r   resourcerg   subject_indexobject_indexr   r$   ruler   usersr*   implicit_rules               r   get_implicit_users_for_resourcez-AsyncEnforcer.get_implicit_users_for_resource  sW      ff"223>>>>>>>>!11#u========""$$""$$OO%% 
	A 
	ADL!X--=)e##/3Kd,,LL--E % A A(,		7;m4<@E-$8$899RR(Q(Qk>N>N>P>P(Q(Q(QRRRr   c                   K   t                      }|                     dd           d{V }|                     dd           d{V }|                     dd           d{V }|                                 }|                     |           d{V }|                                 D ]}	|	|         |k    rr|	|         }
|
|vrd|t          |	          <   -||	|         k    r:|                    |
|          }|D ]-}|	                                }|||<   d|t          |          <   .d d |                                D             D             }|S )	ztget implicit user based on resource and domain.
        Compared to GetImplicitUsersForResource, domain is supportedr\   r   Nr   domTc                 ,    g | ]}t          |          S r   r   r   s     r   r   zKAsyncEnforcer.get_implicit_users_for_resource_by_domain.<locals>.<listcomp>G  r   r   c              3   4   K   | ]}t          |          V  d S r   r   r   s     r   r"   zJAsyncEnforcer.get_implicit_users_for_resource_by_domain.<locals>.<genexpr>G  r   r   )	r   r   rb   r   r   r   r   r   r   )r   r   rW   rg   r   r   	dom_indexr   r$   r   r   r   r*   r   s                 r   )get_implicit_users_for_resource_by_domainz7AsyncEnforcer.get_implicit_users_for_resource_by_domain/  s      ff"223>>>>>>>>!11#u========..sE::::::::	""$$226::::::::OO%% 	A 	ADL!X--=)e##/3Kd,,i00 LLf55E % A A(,		7;m4<@E-$8$899RR(Q(Qk>N>N>P>P(Q(Q(QRRRr   N)rQ   )rQ   T)__name__
__module____qualname____doc__r   r   r%   r+   r.   r3   r9   r=   rA   rE   rH   rJ   rM   rP   rZ   r_   r]   rs   rv   ry   r|   r~   r   rd   r   r   r   r   r   r   r	   r	      s        = = == = =- - -
: : := = =C C C    A A AD D DG G G: : :1 1 1> > >   4h h h h(# # # #J  8E E EE E EB B B
Q Q Q
V V VF F F    @    r   r	   N)		functoolsr    casbin.async_management_enforcerr   casbin.utilr   r   r   r	   r   r   r   <module>r      s          D D D D D D I I I I I I I I I Is s s s s+ s s s s sr   