a qqeT @sUddlmZddlmZddlmZmZddlmZddl m Z ddl m Z dd l mZmZdd lmZeeZee ed <Gd d d eZe ee dddZGdddeZdS)) defaultdict)suppress) NamedTupleSet)NoCommon)ObjClass)DiffResultDescriptor) Difference SymbolWrapper) SymbolCache _class_cachec@s6eZdZUdZeeed<eeed<eeed<dS)ModifiedObjClassz/Difference details for a modified object class. added_perms removed_perms matched_permsN)__name__ __module__ __qualname____doc__rstr__annotations__rr;/usr/lib64/python3.9/site-packages/setools/diff/objclass.pyrs   r)class_returncCsBzt|j|WSty<t|}|t|j|<|YS0dS)z| Wrap class from the specified policy. This caches results to prevent duplicate wrapper objects in memory. N)rZpolicyKeyErrorr )rcrrrclass_wrapper_factorys  rc@sDeZdZdZedZedZedZddddZddddZ dS) ObjClassDifferencezN Determine the difference in object classes between two policies. diff_classesN)rc Cs|jd||dd|jDdd|jD\|_|_}t |_ |D]\}}|j }t t ||jj O}Wdn1s0Y|j }t t ||jj O}Wdn1s0Y|j||dd\}}}|s|rTt||||j |<qTdS)z?Generate the difference in object classes between the policies.zEGenerating class differences from {0.left_policy} to {0.right_policy}css|]}t|VqdSNr .0rrrr ?z2ObjClassDifference.diff_classes..css|]}t|VqdSr"r#r$rrrr&@r'NF)unwrap)loginfoformatZ _set_diffZ left_policyclassesZ right_policy added_classesremoved_classesdictmodified_classesZpermsrrcommonr) selfZmatched_classesZ left_classZ right_classZ left_permsZ right_permsrrrrrrr!8s0  * * zObjClassDifference.diff_classescCs"|jdd|_d|_d|_dS)z%Reset diff results on policy changes.z"Resetting object class differencesN)r)debugr-r.r0)r2rrr _reset_diff\s zObjClassDifference._reset_diff) rrrrr r-r.r0r!r4rrrrr -s $r N) collectionsr contextlibrtypingrr exceptionrZ policyreprZ descriptorsr differencer r r r/rrrrr rrrrs