
    XjN(                    B   U d dl mZ d dlmZ d dlmZ d dlmZmZm	Z	 d dl
mZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lmZ  ee          ZdddddddddddddZded<    ee                                          ZddhZddhZdZdZ dZ!dZ" G d d          Z#d S )!    )annotations)Sequence)Session)get_enforcerinvalidate_user_permissionsload_policy)SessionLocal)Role)Tenant)User)UserRole)
get_loggeru   平台管理员u   平台级系统管理员)namedescriptionu   平台用户u   平台级普通用户u   企业管理员u   租户级管理员u   企业用户u   租户级普通用户)platform_adminplatform_usercustomer_admincustomer_userzdict[str, dict[str, str]]SYSTEM_ROLE_DEFINITIONSr   r   r   r   )usersrolesknowledge_basesknowledge_categoriesknowledge_tagsagents	workflows	documents
audit_logsmenus	providersmodels))r   read)r   create)r   update)r   delete)r   r"   r   r"   )r   r#   )r   r$   )r   r%   r   r"   )r   r#   )r   r$   )r   r%   r   r"   )r   r#   )r   r$   )r   r%   r   r"   )r   r#   )r   r$   )r   r%   r   r"   )r   r#   )r   r$   )r   r%   )r   r"   r    r"   r!   r"   r   r"   )r&   r'   r(   r*   r)   r+   r,   r-   c                      e Zd Zedd            Zed d            Ze	 	 d!d"d            Zed#d            Zed$d            Zed%d            Z	ed&d            Z
e	 	 d!d'd            ZdS )(RBACBootstrapServicedbr   returndict[str, Role]c                   i }t                                           D ]\  }}|                     t                                        t          j        |k                                              }|St          ||d         |d         dd           }|                     |           t          	                    d|            n/|d         |_
        |d         |_        d|_        d |_        d|_        |||<   |                                  |S )Nr   r   T)coder   r   	is_system	tenant_idzCreated system role: F)r   itemsqueryr
   filterr4   firstaddloggerinfor   r   r5   r6   
is_deletedflush)r0   roles_by_coder4   
definitionroles        R/lsinfo/ai/hellotax_ai/base_platform/app/services/access/rbac_bootstrap_service.pyensure_system_rolesz(RBACBootstrapService.ensure_system_roles^   s   )+ 7 = = ? ? 	' 	'D*88D>>((d):;;AACCD|#F+ *= 9""   t:D::;;;;&v.	#-m#< !%!%"'"&M$



    Nonec                2   t                      }d}t          D ]$}dD ]}|                    dd||           |dz  } %t          D ]"\  }}|                    dd||           |dz  }#t                              |           }|D ]e}t          |          }t          D ]"\  }}|                    d|||           |dz  }#t          D ]"\  }}|                    d|||           |dz  }#ft          
                    d	| d
t          |           d           d S )Nr   )r"   r#   r$   r%   executezrole:platform_admin0   zrole:platform_userzrole:customer_adminzrole:customer_userzEnsured z default role policies for z tenants)r   PLATFORM_RESOURCES
add_policyPLATFORM_USER_POLICIESr/   _get_active_tenant_idsstrCUSTOMER_ADMIN_POLICIESCUSTOMER_USER_POLICIESr<   r=   len)r0   enforcerpolicy_countresourceaction
tenant_idsr6   domains           rC   ensure_default_role_policiesz1RBACBootstrapService.ensure_default_role_policiesw   ss   >>* 	" 	"HK " "##$93&QQQ!" !7 	 	Hf 4c8VLLLALL)@@DD
# 	" 	"I^^F$; " " &##$968VTTT!$: " " &##$8&(FSSS!" 	a|aaJaaabbbbbrE   Nuserr   previous_role
str | Noneprevious_tenant_id
int | Noneboolc                   |j         }|t          vr#t                              d||j                   dS |t
          v r*|j        s#t                              d||j                   dS t          	                    |           }t          
                    |            ||         }t                              ||j                  }t                              | |j        |j                   t                              |j        ||||           |                                  t                       t!          |j        |           |||k    rt!          |j        |           dS )Nz9Skipping RBAC bootstrap for non-system role %s on user %sFzFCannot bind tenant-scoped system role %s for user %s without tenant_id)user_iddesired_role_codedesired_domainr[   r]   T)rB   SYSTEM_ROLE_CODESr<   debugidTENANT_ROLE_CODESr6   warningr/   rD   rY   _get_role_domain_sync_user_role_records_sync_grouping_policiescommitr   r   )r0   rZ   r[   r]   	role_coder@   desired_rolerc   s           rC   sync_user_role_bindingz+RBACBootstrapService.sync_user_role_binding   s_    I	---LLKYX\X_   5)))4>)NNX  
 5,@@DD99"===$Y/->>y$.YY44R,/RRR44G')'1 	5 	
 	
 	
 			#DG^<<<).@N.R.R'1CDDDtrE   c                    t                      } 	 t                              |            t                              |            |                     t
                                        t
          j                                                   }|D ]}|j	        t          vr|j	        t          v r|j        s(|                     t          j                                      t          j        |j	        k                                              }|t                              | |j        |           t                              |j	        |j                  }t                              |j        |j	        |           t)          |j        |           |                                  t-                       t.                              d           n=# t2          $ r0 |                                  t.                              d            w xY w	 |                                  d S # |                                  w xY w)N)ra   rb   rc   z%RBAC bootstrap completed successfullyzFailed to bootstrap RBAC state)r	   r/   rD   rY   r8   r   r9   r>   allrB   rd   rg   r6   r
   rf   r4   scalarrj   ri   rk   r   rl   r   r<   r=   	Exceptionrollback	exceptionclose)r0   r   rZ   desired_role_idrc   s        rC   bootstrap_legacy_rbac_statez0RBACBootstrapService.bootstrap_legacy_rbac_state   s   ^^	 44R888 ==bAAAHHTNN))do*=>>BBDDE E E9$5559 1114>1"$((47"3"3":":49	;Q"R"R"Y"Y"["["*$<<R/ZZZ!5!F!FtyRVR`!a!a$<< GtyQ_ =    ,DG^DDDDIIKKKMMMKK?@@@@ 	 	 	KKMMM=>>>	 A HHJJJJJBHHJJJJs   GG H' :HH' 'H=Sequence[int]c                    d |                      t          j                                      t          j         t          j        dk                                              D             S )Nc                    g | ]\  }|S  r|   ).0r6   s     rC   
<listcomp>z?RBACBootstrapService._get_active_tenant_ids.<locals>.<listcomp>   s*     
 
 
	 
 
 
rE   r   )r8   r   rf   r9   r>   rq   )r0   s    rC   rN   z+RBACBootstrapService._get_active_tenant_ids   sU    
 
 hhvy11V))69q=99SUU	
 
 
 	
rE   rm   rO   r6   intc                :    | t           v rdS t          |pd          S )Nr   )PLATFORM_ROLE_CODESr   )rm   r6   s     rC   ri   z%RBACBootstrapService._get_role_domain   s%    +++19>"""rE   ra   rw   c                   |                      t                                        t          j        |k                                              }d}|D ]}|j        |k    r	d|_        d}|s$|                     t          ||                     |                      t                                        t          t          j
        t          j        k                                  t          j        |k    t          j                            t                    t          j
        |k    t          j                                                   }|D ]	}d|_        
|                                  d S )NFT)ra   role_id)r8   r   r9   ra   rq   r   r>   r;   joinr
   rf   r4   in_rd   r?   )r0   ra   rw   
role_linksdesired_foundlinksystem_linkss          rC   rj   z,RBACBootstrapService._sync_user_role_records   s-   XXh''..x/?7/JKKOOQQ
 	% 	%D|.."' $ 	GFF8G_EEEFFFHHXT$8#3344V G+	/00?*''	  SUU 	 ! 	# 	#D"DOO





rE   rb   rc   c           	        t                      }d|  }d| }d|h}||                    |           t          D ];}	|D ]6}
|	|k    r|
|k    r|                    |d|	 t	          |
                     7<|rH||k    rBt
                              ||          }|                    |d| t	          |                     |                    ||t	          |                     d S )Nzuser:zrole:r   )r   r;   rd   remove_grouping_policyrO   r/   ri   add_grouping_policy)ra   rb   rc   r[   r]   rS   subjectrn   cleanup_domainsrm   rX   
old_domains               rC   rk   z,RBACBootstrapService._sync_grouping_policies   s3     >>#'##2022n-) 2333* 	[ 	[I) [ [ 111f6N6N//9L9L9LcRXkkZZZZ[  	_].???->>}N`aaJ++G5L]5L5LcR\oo^^^$$WlC<O<OPPPPPrE   )r0   r   r1   r2   )r0   r   r1   rF   )NN)
r0   r   rZ   r   r[   r\   r]   r^   r1   r_   )r1   rF   )r0   r   r1   ry   )rm   rO   r6   r^   r1   r   )r0   r   ra   r   rw   r   r1   rF   )ra   r   rb   rO   rc   r   r[   r\   r]   r^   r1   rF   )__name__
__module____qualname__staticmethodrD   rY   ro   rx   rN   ri   rj   rk   r|   rE   rC   r/   r/   \   s8          \0 c c c \c*  %))-	$ $ $ $ \$L    \< 
 
 
 \
 # # # \#
    \0 
 %))-Q Q Q Q \Q Q QrE   r/   N)$
__future__r   collections.abcr   sqlalchemy.ormr   app.core.permissionsr   r   r   app.db.sessionr	   app.models.roler
   app.models.tenantr   app.models.userr   app.models.user_roler   common_loggingr   r   r<   r   __annotations__tuplekeysrd   r   rg   rK   rP   rQ   rM   r/   r|   rE   rC   <module>r      s   " " " " " " " $ $ $ $ $ $ " " " " " " W W W W W W W W W W ' ' ' ' ' '             $ $ $ $ $ $             ) ) ) ) ) ) % % % % % %	H		0A[\\,=TUU0AUVV,=TUU	6 6      E1668899 '9 %7   >	 	 uQ uQ uQ uQ uQ uQ uQ uQ uQ uQrE   