
­­­­­­­­­­­­­­­­­­
<!DOCTYPE html>
<html>
3
^                 @   s   d dl mZmZ ddlmZ ddlmZ ddlmZm	Z	 ddl
mZ ddlmZ dd	lmZ ed
dddgZG dd deZG dd de	ZG dd de	ZdS )    )defaultdict
namedtuple   )RBACRuletype   )DiffResultDescriptor)
DifferenceWrapper)class_wrapper_factory)role_wrapper_factory)type_or_attr_wrapper_factoryZmodified_rbacruleruleZadded_defaultZremoved_defaultc               @   sh   e Zd ZdZedZedZedZedZedZ	e
eZe
eZdd Zdd Zdd	 Zd
d ZdS )RBACRulesDifferencez<Determine the difference in RBAC rules between two policies.diff_role_allowsdiff_role_transitionsc             C   sd   | j jdj|  | j s"| j r*| j  | j| j| jtj	 t
| j| jtj	 t
\| _| _}dS )zAGenerate the difference in role allow rules between the policies.zJGenerating role allow differences from {0.left_policy} to {0.right_policy}N)loginfoformat_left_rbac_rules_right_rbac_rules_create_rbac_rule_lists	_set_diff_expand_generatorr   ZallowRoleAllowWrapperadded_role_allowsremoved_role_allows)self_ r   !/usr/lib64/python3.6/rbacrules.pyr   3   s    z$RBACRulesDifference.diff_role_allowsc             C   s   | j jdj|  | j s"| j r*| j  | j| j| jtj	 t
| j| jtj	 t
\}}}g }x:|D ]2\}}t|jt|jkrf|jt||j|j qfW || _|| _|| _dS )zFGenerate the difference in role_transition rules between the policies.zOGenerating role_transition differences from {0.left_policy} to {0.right_policy}N)r   r   r   r   r   r   r   r   r   Zrole_transitionRoleTransitionWrapperr   defaultappendmodified_rbacrule_recordadded_role_transitionsremoved_role_transitionsmodified_role_transitions)r   ZaddedZremovedZmatchedZmodifiedZ	left_ruleZ
right_ruler   r   r   r   A   s&    z)RBACRulesDifference.diff_role_transitionsc             C   s   | j jdj|  x$| jj D ]}| j|j j| qW | j jdj|  x$| jj D ]}| j	|j j| qVW | j jd dS )z$Create rule lists for both policies.z-Building RBAC rule lists from {0.left_policy}z.Building RBAC rule lists from {0.right_policy}z#Completed building RBAC rule lists.N)
r   debugr   Zleft_policyZ	rbacrulesr   Zruletyper"   Zright_policyr   )r   r   r   r   r   r   a   s    z+RBACRulesDifference._create_rbac_rule_listsc             C   sH   | j jd d| _d| _d| _d| _d| _d| _| jj	  | j
j	  dS )z%Reset diff results on policy changes.zResetting RBAC rule differencesN)r   r'   r   r   Zmodified_role_allowsr$   r%   r&   r   clearr   )r   r   r   r   _reset_diffo   s    
zRBACRulesDifference._reset_diffN)__name__
__module____qualname____doc__r   r   r   r$   r%   r&   r   listr   r   r   r   r   r)   r   r   r   r   r   #   s    r   c               @   s4   e Zd ZdZdZdd Zdd Zdd	 Zd
d ZdS )r   z.Wrap role allow rules to allow set operations.sourcetargetc             C   s,   || _ t|j| _t|j| _t|| _d S )N)originr   r/   r0   hashkey)r   r   r   r   r   __init__   s    zRoleAllowWrapper.__init__c             C   s   | j S )N)r3   )r   r   r   r   __hash__   s    zRoleAllowWrapper.__hash__c             C   s   | j |j k S )N)r3   )r   otherr   r   r   __lt__   s    zRoleAllowWrapper.__lt__c             C   s   | j |j ko| j|jkS )N)r/   r0   )r   r6   r   r   r   __eq__   s    zRoleAllowWrapper.__eq__N)r/   r0   )	r*   r+   r,   r-   	__slots__r4   r5   r7   r8   r   r   r   r   r   ~   s   r   c               @   s4   e Zd ZdZdZdd Zdd Zd	d
 Zdd ZdS )r    z3Wrap role_transition rules to allow set operations.r/   r0   tclassc             C   s8   || _ t|j| _t|j| _t|j| _t|| _d S )N)	r1   r   r/   r   r0   r
   r:   r2   r3   )r   r   r   r   r   r4      s
    zRoleTransitionWrapper.__init__c             C   s   | j S )N)r3   )r   r   r   r   r5      s    zRoleTransitionWrapper.__hash__c             C   s   | j |j k S )N)r3   )r   r6   r   r   r   r7      s    zRoleTransitionWrapper.__lt__c             C   s$   | j |j ko"| j|jko"| j|jkS )N)r/   r0   r:   )r   r6   r   r   r   r8      s    zRoleTransitionWrapper.__eq__N)r/   r0   r:   )	r*   r+   r,   r-   r9   r4   r5   r7   r8   r   r   r   r   r       s   r    N)collectionsr   r   Z	policyrepr   Zdescriptorsr   
differencer   r	   Zobjclassr
   Zrolesr   typesr   r#   r   r   r    r   r   r   r   <module>   s   [