
    j?"                     z    d dl Z d dlmZmZ ddlmZ ddlmZ dZdZ	 e j
        d          Z G d	 d
e          ZdS )    N)utilconfig   )	Assertion)Policy ::z	\((.*?)\)c                   r    e Zd Zddddd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S )Modelrequest_definitionpolicy_definitionrole_definitionpolicy_effectmatchers)rpgemc                 |    |                     | j        |         dz   |z             }|                     |||          S )Nr	   )getsection_name_mapadd_def)selfcfgseckeyvalues        \/lsinfo/ai/hellotax_ai/base_platform/venv/lib/python3.11/site-packages/casbin/model/model.py_load_assertionzModel._load_assertion"   s;    -c2T9C?@@||Ce,,,    c                     t                               |          }|g S |                    d          }d |                    d          D             S )z6get_params_token Get params_token from Assertion.valueNr   c                 6    g | ]}|                                 S  )strip).0params     r   
<listcomp>z*Model.get_params_token.<locals>.<listcomp>1   s     DDD%DDDr!   ,)PARAMS_REGEXsearchgroupsplit)r   r   params_strings      r   get_params_tokenzModel.get_params_token'   sY     %++E22 I &++A..DD=+>+>s+C+CDDDDr!   c                    |dk    rd S t                      }||_        ||_        d|k    sd|k    r\|j                            d          |_        t          |j                  D ]'\  }}|dz   |                                z   |j        |<   (nd|k    rz|                     |j                  |_        |j                            d          |_        |j        d t          |j                  t          |j                  z
           |_        n0t          j        t          j        |j                            |_        ||                                 vri | |<   || |         |<   dS )Nr   r   r   r)   _r   T)r   r   r   r-   tokens	enumerater%   r/   params_tokenslenr   remove_commentsescape_assertionkeys)r   r   r   r   astitokens          r   r   zModel.add_def3   s>   B;;Fkk	#::--CJ%cj11 : :5 #c	EKKMM 9
1:CZZ $ 5 5ci @ @C--CJ$Nc#*ooC<M8N8N&N$NOCJJ,T-B39-M-MNNCIdiikk!!DIS	#tr!   c                 0    |dk    rdS t          |          S )Nr   r   )str)r   r:   s     r   _get_key_suffixzModel._get_key_suffixM   s    6621vvr!   c                 r    d}	 |                      ||||                     |          z             sd S |dz   }5)Nr   )r    r>   )r   r   r   r:   s       r   _load_sectionzModel._load_sectionS   sL    	''S#8L8LQ8O8O2OPP E		r!   c                     t           j                            |          }|                     |d           |                     |d           |                     |d           |                     |d           |                     |d           d S Nr   r   r   r   r   )r   Config
new_configr@   )r   pathr   s      r   
load_modelzModel.load_model[   s    m&&t,,3$$$3$$$3$$$3$$$3$$$$$r!   c                     t           j                            |          }|                     |d           |                     |d           |                     |d           |                     |d           |                     |d           d S rB   )r   rC   new_config_from_textr@   )r   textr   s      r   load_model_from_textzModel.load_model_from_texte   s    m00663$$$3$$$3$$$3$$$3$$$$$r!   c                     | j                             d           |                                 D ]A\  }}|                                D ]'\  }}| j                             d|||j                   (Bd S )NzModel:z	%s.%s: %s)loggerinfoitemsr   )r   kvr:   js        r   print_modelzModel.print_modelo   s~    """JJLL 	= 	=DAq		 = =1  aAG<<<<=	= 	=r!   c                 b   | d                                          D ]\  }t          j                  D ]\  }}|| dk    r	|_         nj        dk    r=t	          j        fd          _        t          j                  D ]"\  }}|j        d                    |          <   #d S )Nr   	_priorityc                     | j                                                  rt          | j                            n| j                  S )N)priority_indexisdigitint)x	assertions    r   <lambda>z1Model.sort_policies_by_priority.<locals>.<lambda>   sD    Y-.66881c!I$<"=>>>y/0 r!   r   r)   )rN   r3   r2   rW   sortedpolicy
policy_mapjoin)r   ptypeindexr;   r:   r_   r[   s         @r   sort_policies_by_priorityzModel.sort_policies_by_priorityu   s     $S	 1 1 	; 	;E9 ))*: ; ;  uu//////4I,E 0 '2--% 1 1 1 1     I 'y'788 ; ;	69:	$SXXf%5%566; tr!   c                    	
  d         d         j         dk    rd S d	d d                                         D ]\  }}t          |j                  D ]"\  }}|d                    |          k    r| n#                      d         d         j                  
 	
fd}t          |j        |	          |_        t          |j                  D ]"\  }}||j        d
	                    |          <   #d S )Nr   zsubjectPriority(p_eft) || denyr   rU   r   z{}_domr   c                     t           }dk    r|          }                    ||                    }                    |d          S )NrU   r   )DEFAULT_DOMAINget_name_with_domainr   )r_   domainnamedomain_indexr   	sub_indexsubject_hierarchy_maps      r   compare_policyz@Model.sort_policies_by_subject_hierarchy.<locals>.compare_policy   sM    '2%%#L1F00	9JKK,00q999r!   r]   r)   )
r   rN   r3   r2   formatget_subject_hierarchy_mapr_   r^   r`   ra   )r   rb   r[   rc   r;   rn   r:   r_   rk   rl   rm   s   `       @@@r   "sort_policies_by_subject_hierarchyz(Model.sort_policies_by_subject_hierarchy   s>   9S>#CCCF	 $S	 1 1 	; 	;E9 ))*: ; ;  uHOOE2222#(LE 3 %)$B$B49S>CX$Y$Y!: : : : : : : :  &i&6NKKKI&y'788 ; ;	69:	$SXXf%5%566;!	; 	;r!   c                 4  
 g }t                      }|D ]}t          |          dk     rt          d          t          }t          |          dk    r|d         }|                     ||d                   }|                     ||d                   }|                    ||g           |                    |           |                    |           g }t          |          dk    rpd |D             }	||	z
  

s"t          d                    |                    |                    
           
fd|D             }|
z
  }t          |          dk    pt          |          dk    r|                    |           d t          |          D             S )	ad  
        Get the subject hierarchy from the policy.
        Select the lowest level subject in multiple rounds until all subjects are selected.
        Return the subject hierarchy dictionary, the subject is the key, and the level is the value.
        The level starts from 0 and increases in turn. The smaller the level, the higher the priority.
           zpolicy g expect 2 more paramsr   r   c                 6    h | ]}|d          dk    |d          S )r   r   r$   )r&   r   s     r   	<setcomp>z2Model.get_subject_hierarchy_map.<locals>.<setcomp>   s%    FFF11Q42::!A$:::r!   z2cycle dependency in subject hierarchy.subjects: {}c                 (    g | ]}|d          v|S )r   r$   )r&   r   
sorted_subs     r   r(   z3Model.get_subject_hierarchy_map.<locals>.<listcomp>   s'    TTTQQqT=S=Sq=S=S=Sr!   c                 $    i | ]\  }}|D ]}||S r$   r$   )r&   r:   subssubs       r   
<dictcomp>z3Model.get_subject_hierarchy_map.<locals>.<dictcomp>   s+    QQQ71dDQQSQQQQQr!   )	setr5   RuntimeErrorrg   rh   appendaddro   r3   )r   policiesunsorted_policyunsorted_subr_   ri   childparentsorted_sub_list
parent_subrw   s             @r   rp   zModel.get_subject_hierarchy_map   s    uu 
	% 
	%F6{{Q"#BCCC#F6{{a--ffQi@@E..vvayAAF""E6?333U###V$$$$/""Q&&FFFFFJ%
2J n"#W#^#^_k#l#lmmm"":...TTTT/TTTO'*4L /""Q&& |q  ""<000QQi&@&@QQQQr!   c                 :    d                     |t          |          S )Nz{}{}{})ro   DEFAULT_SEPARATOR)r   ri   rj   s      r   rh   zModel.get_name_with_domain   s    v'8$???r!   c                 Z    g  fd}                     d            |d                                d            |d           d                                 v rZ                     d            d         D ]<}                     d                    | d         |         j                             =                     d	            |d
                                d            |d           d                                         d<   d                              S )Nc           
          |          D ]f}|          |         j         }                    d                    | |                    dd                              dd                               gd S )N{} = {}
p_zp.r_zr.)r   r~   ro   replace)r   p_typer   sr   s      r   write_stringz#Model.to_text.<locals>.write_string   sz    s) a aS	&)/++CtT1J1J1R1RSWY]1^1^__````a ar!   z[request_definition]
r   z[policy_definition]
r   r   z[role_definition]
r   z[policy_effect]
r   z[matchers]
r   rU   r   )r~   r8   ro   r   r%   ra   )r   r   r   r   s   `  @r   to_textzModel.to_text   sM   	a 	a 	a 	a 	a 	a
 	
)***S	()))S$))++HH*+++s) N N++FDIf4E4KLLMMMM	$%%%S	   S ""wwqzzr!   c                     | d         |         }||j         v r|j         |         S | d| }d}t          |j                  D ]\  }}||k    r|} n|dk    r|S ||j         |<   |S )zsget_field_index gets the index of the field for a ptype in a policy,
        return -1 if the field does not exist.r   r1   rU   )field_index_mapr3   r2   )r   rb   fieldr[   patternrc   r:   r;   s           r   get_field_indexzModel.get_field_index   s     Ie$	I---,U33$$U$$!)"233 	 	HAu   B;;L+0	!%(r!   N)__name__
__module____qualname__r   r    r/   r   r>   r@   rF   rJ   rR   rd   rq   rp   rh   r   r   r$   r!   r   r   r      s       !  - - -

E 
E 
E  4    % % %% % %= = =  ,; ; ;2'R 'R 'RR@ @ @  4    r!   r   )recasbinr   r   r   r   r_   r   rg   r   compiler*   r   r$   r!   r   <module>r      s    
			                     rz,''c c c c cF c c c c cr!   