
    Xj,                        U d dl Z d dlmZ d dlZd dlZd dlmZ d dlmZ d dl	m
Z
 d dlmZ  ee          Z edd          Zee         ed	<   daej        dz  ed
<   daej        dz  ed<   dej        fdZdej        fdZ	 d-dededededededz  fdZdededededef
dZd.dededefdZdededededef
dZdedededefdZdedededefdZ dedede!e         fd Z"dedede!e         fd!Z#dedede!e         fd"Z$dededededef
d#Z%dededededef
d$Z&dedede!e!e                  fd%Z'defd&Z(defd'Z)dededdfd(Z*dededdfd)Z+defd*Z,defd+Z-de!e         fd,Z.dS )/    N)
ContextVar)Adapter)settings)SessionLocal)
get_loggerrequest_context)default_request_context	_enforcer_redis_clientreturnc                      t           nt          j        r!t          j        t          j        d          a nAt          j        t          j        t          j        t          j        t          j	        d          a t           S )NT)decode_responses)hostportdbpasswordr   )
r   r   	REDIS_URLredisfrom_urlRedis
REDIS_HOST
REDIS_PORTREDIS_DBREDIS_PASSWORD     </lsinfo/ai/hellotax_ai/base_platform/app/core/permissions.pyget_redis_clientr      sf     		!N8+=PTUUUMM!K(($!0!%  M r   c            	         t           t          j                            t          j                            t          j                            t          j                            t
                                                  } t          j                            | dd          }t          t          j	                  }t          j        ||          a dt          dt          dt          fd}dt          dt          dt          fd	}d
t          dt          dt          fd}t                               d|           t                               d|           t                               d|           t                              d           t                              d|            t                              dt          j	                            d          d                     t           S )Ncasbinz
model.confdomain1domain2r   c                     | |k    p|dk    S N*r   )r"   r#   s     r   domain_matchz"get_enforcer.<locals>.domain_match*       g%7C7r   	resource1	resource2c                     | |k    p|dk    S r%   r   )r)   r*   s     r   resource_matchz$get_enforcer.<locals>.resource_match-   s    	)=Y#-==r   action1action2c                     | |k    p|dk    S r%   r   )r-   r.   s     r   action_matchz"get_enforcer.<locals>.action_match0   r(   r   domainMatchresourceMatchactionMatchu5   ✅ Casbin enforcer initialized with database adapterz
   Model: z   Database: @)r   ospathdirnameabspath__file__joinr   r   DATABASE_URLr!   Enforcerstrbooladd_functionloggerinfosplit)base_dir
model_pathadapterr'   r,   r0   s         r   get_enforcerrG   "   s   7??27??27??27??S[C\C\3]3]#^#^__W\\(HlCC
(/00OJ88		8# 	8 	8 	8 	8 	8 	8	>c 	>c 	>d 	> 	> 	> 	>	8# 	8 	8 	8 	8 	8 	8 	}l;;;???}l;;;KLLL---...JH$9$?$?$D$DR$HJJKKKr   user_id	tenant_idresourceactionresultrole_idc                 ^   	 ddl m} t                                          }|                    | ||||||                    d          |                    d          |                    d          	  	         d S # t
          $ r(}t                              d|            Y d }~d S d }~ww xY w)Nr   )log_permission_check
ip_address
user_agentr7   )	rH   rI   rJ   rK   rL   rM   rP   rQ   request_pathz&Failed to queue permission check log: )app.tasks.audit_tasksrO   r
   getdelay	ExceptionrA   error)	rH   rI   rJ   rK   rL   rM   rO   ctxes	            r   _log_permission_checkrZ   <   s    C>>>>>>""$$""ww|,,ww|,, 	# 
	
 
	
 
	
 
	
 
	
  C C CAaAABBBBBBBBBCs   A6A: :
B,B''B,action_typerolec                    	 ddl m} t                                          }|                    | |||||                    dd          |                    d          |                    d          |                    d          	  	         d S # t
          $ r(}t                              d|            Y d }~d S d }~ww xY w)	Nr   )log_permission_changerH   rP   rQ   r7   )	r[   rI   rJ   rK   r\   rH   rP   rQ   rR   z'Failed to queue permission change log: )rS   r^   r
   rT   rU   rV   rA   rW   )r[   rI   rJ   rK   r\   r^   rX   rY   s           r   _log_permission_changer_   W   s    D??????""$$###GGIq))ww|,,ww|,, 	$ 
	
 
	
 
	
 
	
 
	
  D D DBqBBCCCCCCCCCDs   B
B 
C B;;C rP   rQ   r7   c                 B    t                               | ||d           d S )NrP   rQ   r7   )r
   setra   s      r   set_request_contextrc   k   s'    
*VZ[[\\\\\r   c                    d|  d| d| d| }	 t                      }|                    |          }|3t                              d|  d| d| d|dk     | |           |dk    S n4# t          $ r'}t                              d	|            Y d }~nd }~ww xY wt                      }d
|  }	t          |          }
|                    |	|
||          }t                              d| d| d| | |           	 |	                    |d|rdnd           n4# t          $ r'}t                              d|            Y d }~nd }~ww xY w|S )Nperm::zPermission check cached: user=, resource=	, action=z	, result=1)rH   rI   zRedis cache error: user:zPermission check: resource=i,  0zRedis cache write error: )
r   rT   rA   rB   rV   warningrG   r>   enforcesetex)rH   rI   rJ   rK   	cache_keyredis_clientcachedrY   enforcersubjectdomainrL   s               r   check_permissionru   o   s   AAA)AAhAAAAI2'))!!),,KK  A  A  AX  A  A`f  A  Aqw{~q~  A  A  KR  ^gK  h  h  hS=    2 2 20Q00111111112~~HgG^^Fgvx@@F
KKZhZZZZRXZZdk  xAK  B  B  B89c&+A33cBBBB 8 8 86166777777778Ms0   AA) )
B3BB>D 
E$EEc                 &   ddl m} ddlm} ddlm} t                      }	 |                    |                              |j	        | k              
                                }|st          d|  d          |                    |                              |j	        |k              
                                }|st          d| d          |j         |j        |k    rt          d|  d|           d	|v r|                    d	          d
         n|}	|                    |                              |j        |	k              
                                }
|
st          d|	 d          |
j        r|j        |	dv rt          d|	 d          |
j         |
j        |k    rt          d|	 d|           t!                      }d|  }t#          |          }|                    |||          }|rH|                                 t(                              d| d|  d|            t-          | |           n#t(                              d| d|  d|            ||                                 S # |                                 w xY w)Nr   )Role)Tenant)UserzUser z does not existzTenant z does not belong to tenant rf   r5   zRole >   platform_userplatform_adminzCannot assign platform role z to tenant userrj   u   ✅ Added role z
 for user  in tenant u   ⚠️ Failed to add role )app.models.rolerw   app.models.tenantrx   app.models.userry   r   queryfilteridfirst
ValueErrorrI   rC   code	is_systemrG   r>   add_grouping_policyload_policyrA   rB   invalidate_user_permissionsrl   close)rH   r\   rI   rw   rx   ry   r   usertenant	role_coderole_objrr   rs   rt   successs                  r   add_role_for_userr      s   $$$$$$(((((($$$$$$	B!xx~~$$TW%788>>@@ 	?=W===>>>&!!((i)?@@FFHH 	CAyAAABBB>%$.I*E*ETWTTTTUUU+.$;;DJJsOOB''D	88D>>((i)?@@FFHH 	A?Y???@@@	X*AAAVIVVVWWW)h.@I.M.MVYVV9VVWWW>>#'##Y..wfEE 	i  """KKY$YY'YYiYYZZZ';;;;NNggggg\egghhh








s   II: :Jc                 
   t                      }d|  }t          |          }|                    |||          }|rG|                                 t                              d| d|  d|            t          | |           |S )Nrj   u   ✅ Removed role z from user r|   )rG   r>   remove_grouping_policyr   rA   rB   r   )rH   r\   rI   rr   rs   rt   r   s          r   remove_role_for_userr      s    ~~HgG^^F--gtVDDG 8XXXXXYXXYYY#GY777Nr   c                 v    t                      }d|  }t          |          }|                    ||          }|S )Nrj   )rG   r>   get_roles_for_user_in_domain)rH   rI   rr   rs   rt   roless         r   get_roles_for_userr      s=    ~~HgG^^F11'6BBELr   c                 :    t          | |          }d |D             S )Nc                 >    g | ]}d |                     dd          iS )r   zrole: )replace).0r\   s     r   
<listcomp>z"get_user_roles.<locals>.<listcomp>   s+    GGG[$,,w334GGGr   )r   )rH   rI   r   s      r   get_user_rolesr      s%    w	22EGGGGGGr   c                 l    t                      }t          |          }|                    | |          }|S N)rG   r>   get_users_for_role_in_domain)r\   rI   rr   rt   userss        r   get_users_for_roler      s0    ~~H^^F11$??ELr   c           
      .   t                      }t          |          }|                    | |||          }|r]|                                 t                              d|  d| d| d|            t          d||||            t          | |           |S )Nu   ✅ Added permission: role=	, tenant=rg   rh   grant)rG   r>   
add_policyr   rA   rB   r_   _invalidate_role_permissionsr\   rI   rJ   rK   rr   rt   r   s          r   add_permission_for_roler      s    ~~H^^F!!$&AAG 6j$jjjjxjjbhjj	
 	
 	
 	w	8VTJJJ$T9555Nr   c           
      .   t                      }t          |          }|                    | |||          }|r]|                                 t                              d|  d| d| d|            t          d||||            t          | |           |S )Nu   ✅ Removed permission: role=r   rg   rh   revoke)rG   r>   remove_policyr   rA   rB   r_   r   r   s          r   remove_permission_for_roler      s    ~~H^^F$$T68VDDG 6lDll9llQYlldjll	
 	
 	
 	xHfdKKK$T9555Nr   c                 n    t                      }t          |          }|                    d| |          }|S )Nr   )rG   r>   get_filtered_policy)r\   rI   rr   rt   permissionss        r   get_permissions_for_roler      s3    ~~H^^F..q$??Kr   c                  F    t                      } |                                 S r   )rG   save_policyrr   s    r   r   r          ~~H!!!r   c                  F    t                      } |                                 S r   )rG   r   r   s    r   r   r      r   r   c                 @   	 t                      }d|  d| d}|                    |          }|r9 |j        |  t                              dt          |           d|             d S d S # t          $ r(}t                              d|            Y d }~d S d }~ww xY w)Nre   rf   z:*zInvalidated z cached permissions for user z(Failed to invalidate permissions cache: )r   keysdeleterA   rB   lenrV   rl   )rH   rI   rp   patternr   rY   s         r   r   r      s    G'))1'11I111  )) 	ZL&&KKXs4yyXXwXXYYYYY	Z 	Z  G G GE!EEFFFFFFFFFGs   A%A+ +
B5BBc                 6   	 t          | |          }|D ]O}|                    d          r8t          |                    d          d                   }t	          ||           Pd S # t
          $ r(}t                              d|            Y d }~d S d }~ww xY w)Nrj   rf      z'Failed to invalidate role permissions: )r   
startswithintrC   r   rV   rA   rl   )r\   rI   r   user_subjectrH   rY   s         r   r   r     s    F"433! 	@ 	@L&&w// @l0055a899+GY???	@ 	@  F F FDDDEEEEEEEEEFs   A"A& &
B0BBc                     | j         dv rdS | j         dk    r|j        | j        k    S | j         dk    r |j        | j        k    p|j        | j        k    S dS Nr{   rz   Tcustomer_admincustomer_userF)r\   rI   
created_byr   )r   kbs     r   can_access_knowledge_baser     sa    y777ty$$$|t~--yO##}'I2<4>+II5r   c                     | j         dv rdS | j         dk    r|j        | j        k    S | j         dk    r|j        | j        k    S dS r   )r\   rI   )r   docs     r   can_access_documentr     sS    y777ty$$$}..yO##}..5r   c                 T   ddl m} ddlm} |j        dv r6d |                     |j                                                  D             S |j        dk    rWd |                     |j                                      |j	        |j	        k                                              D             S |j        dk    rod	 |                     |j                                       ||j
        |j        k    |j	        |j	        k                                                        D             S g S )
Nr   )or_)KnowledgeBaser   c                     g | ]	}|j         
S r   r   r   r   s     r   r   z2get_accessible_knowledge_bases.<locals>.<listcomp>-  s    AAA"AAAr   r   c                     g | ]	}|j         
S r   r   r   s     r   r   z2get_accessible_knowledge_bases.<locals>.<listcomp>/  s*     
 
 
 E
 
 
r   r   c                     g | ]	}|j         
S r   r   r   s     r   r   z2get_accessible_knowledge_bases.<locals>.<listcomp>6  s*     
 
 
 E
 
 
r   )
sqlalchemyr   app.models.knowledge_baser   r\   r   r   allr   rI   r   )r   r   r   r   s       r   get_accessible_knowledge_basesr   '  sF   777777y777AA)9 : : > > @ @AAAAy$$$
 
hh}/00VM+t~=>>SUU	
 
 
 	
 yO##
 
hh}/00VM,79PTXTb9bcc  SUU
 
 
 	
 Ir   r   )NNN)/r6   contextvarsr   r!   r   casbin_sqlalchemy_adapterr   
app.configr   app.db.sessionr   common_loggingr   __name__rA   r
   dict__annotations__r   r=   r   r   r   rG   r   r>   r?   rZ   r_   rc   ru   r   r   listr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s   					 " " " " " "   - - - - - -       ' ' ' ' ' ' % % % % % %	H		%/Z0A4%P%P%P *T" P P P$(	6?T! ( ( ($(u{T! ( ( (%+     fo    @ C CCC C 	C
 C 4ZC C C C6D D Ds DTW D_b D D D D(] ]C ]C ]c ] ] ] ]c c S # RV    ,'s '# '# '$ ' ' ' 'T	# 	S 	S 	T 	 	 	 	  S	    HC HC HDJ H H H H
S S T#Y    # #  c VZ    S S C QT Y]    3 3 4S	?    "T " " " "
"T " " " "
	G 	G 	G 	G 	G 	G 	GFs Fs Ft F F F F4    d    S	      r   