Ë
   -Ñÿl`ÜØ:ã                   óä  — U d Z ddlZddlmc mZ ddlZddlm	Z	m
Z
mZmZ ddlmZmZmZ ddlmZmZmZ ddlmZmZmZmZ ddlmZmZmZmZ ej>                  defd	„«       Z ej>                  defd
„«       Z!ej>                  defd„«       Z" G d„ d«      Z# G d„ d«      Z$ G d„ d«      Z% G d„ d«      Z& G d„ d«      Z' G d„ d«      Z(ej>                  defd„«       Z) G d„ d«      Z*ejV                  jX                  ejV                  jX                  ejZ                  jX                  ejV                  jX                  dœZ.e/e0e0f   e1d<   ej>                  defd„«       Z2 G d„ d«      Z3 G d „ d!«      Z4y)"zTests for PermissionGateway.é    N)ÚACTION_SCOPE_REQUIREMENTSÚKNOWN_ACTIONSÚKNOWN_SAFE_ACTIONSÚSENSITIVE_ACTIONS)ÚAuditEventTypeÚAuditLogÚ
AuditQuery)ÚAgentIdentityÚPermissionScopeÚ
TrustLevel)ÚPermissionDecisionÚPermissionGatewayÚPermissionRequestÚPermissionResult)ÚPolicyDecisionÚPolicyEngineÚ
PolicyModeÚ
PolicyRuleÚreturnc                  óx   — t        ddt        j                  t        j                  t        j
                  h¬«      S )Núagent-1Úcoder©Úagent_idÚroleÚtrust_levelÚscopes)r
   r   ÚTRUSTEDr   Ú	READ_FILEÚSHELL© ó    ú@/home/oem/CyberBrain26-unified/tests/test_security_permission.pyÚtrusted_agentr$      s2   € äØØÜ×&Ñ&Ü×)Ñ)¬?×+@Ñ+@ÐAô	ð r"   c                  ó:   — t        ddt        j                  ¬«      S )Nzagent-2r   )r   r   r   )r
   r   Ú	UNTRUSTEDr!   r"   r#   Úuntrusted_agentr'   )   s   € äØØÜ×(Ñ(ôð r"   c                  óH   — t        t        t        j                  ¬«      «      S )N©Úmode)r   r   r   ÚSAFEr!   r"   r#   Úgatewayr,   2   s   € äœ\¬z¯©Ô?Ó@Ð@r"   c                   ó$   — e Zd Zdd„Zdd„Zdd„Zy)ÚTestPermissionGatewayInitNc                 ó¦  — t        «       }|j                  }d }||u}|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )N©úis not)z9%(py2)s
{%(py2)s = %(py0)s.policy_engine
} is not %(py5)sr,   ©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7)
r   Úpolicy_engineÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)Úselfr,   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8s          r#   Útest_default_policy_enginez4TestPermissionGatewayInit.test_default_policy_engine8   s|   € Ü#Ó%ˆØ×$Ñ$Ð0¨DÐ0Ð$¨DÐ0×0×0Õ0Ð$¨D×0×0×0×0×0Ñ0ˆw×0×0Ó0ˆw×0×0Ô0Ð$×0×0Ò0¨D×0×0×0×0×0×0Ô0r"   c                 ó.  — t        t        j                  ¬«      }t        |«      }|j                  }||u }|sÚt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}y )	Nr)   ©Úis)z5%(py2)s
{%(py2)s = %(py0)s.policy_engine
} is %(py4)sr,   Úengine©r3   r4   Úpy4úassert %(py6)sÚpy6)r   r   ÚFULLr   r8   r9   r:   r;   r<   r=   r>   r?   r@   )rA   rK   r,   rB   rD   Ú@py_format5Ú@py_format7s          r#   Útest_custom_policy_enginez3TestPermissionGatewayInit.test_custom_policy_engine<   s›   € Ü¤:§?¡?Ô3ˆÜ# FÓ+ˆØ×$Ñ$Ð.Ð$¨Ð.×.×.Õ.Ð$¨×.×.×.×.×.Ñ.ˆw×.×.Ó.ˆw×.×.Ô.Ð$×.×.×.×.×.Ð.¨×.×.Ó.¨×.×.×.×.×.×.Ô.r"   c                 óX  — t         j                  d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}t         j                  d   }d}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}t         j                  d	   }d
}||k(  }|slt        j                  d|fd||f«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )NÚ	read_file©ú==)z%(py1)s == %(py4)s)Úpy1rM   rN   rO   Úexecute_shellÚshellÚaccess_secretsÚsecrets)r   ÚACTION_SCOPE_MAPr9   r:   r>   r?   r@   )rA   Ú@py_assert0rD   Ú@py_assert2rQ   rR   s         r#   Útest_action_scope_mapz/TestPermissionGatewayInit.test_action_scope_mapA   s  € Ü ×1Ñ1°+Ñ>ÐMÀ+ÐMÐ>À+ÑM×M×MÕMÐ>À+×M×MÓMÐ>×M×MÒMÀ+×M×M×M×M×M×MÓMÜ ×1Ñ1°/ÑBÐMÀgÐMÐBÀgÑM×M×MÕMÐBÀg×M×MÓMÐB×M×MÒMÀg×M×M×M×M×M×MÓMÜ ×1Ñ1Ð2BÑCÐPÀyÐPÐCÀyÑP×P×PÕPÐCÀy×P×PÓPÐC×P×PÒPÀy×P×P×P×P×P×PÔPr"   ©r   N)Ú__name__Ú
__module__Ú__qualname__rG   rS   r`   r!   r"   r#   r.   r.   7   s   „ ó1ó/ô
Qr"   r.   c            	       óú   — e Zd Zdededdfd„Zdededdfd„Zdededdfd„Zej                  j                  dg d	¢«      dedededdfd
„«       Zdededdfd„Zdededdfd„Zdeddfd„Zdeddfd„Zdeddfd„Zy)ÚTestScopeCheckr,   r$   r   Nc                 óf  — |j                  |d«      }|j                  }t        j                  }||k(  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}y )	NrU   rV   ©zK%(py2)s
{%(py2)s = %(py0)s.decision
} == %(py6)s
{%(py6)s = %(py4)s.ALLOW
}Úresultr   ©r3   r4   rM   rO   úassert %(py8)sÚpy8©ÚevaluateÚdecisionr   ÚALLOWr9   r:   r;   r<   r=   r>   r?   r@   ©	rA   r,   r$   ri   rB   Ú@py_assert5rD   rR   Ú@py_format9s	            r#   Útest_allowed_action_with_scopez-TestScopeCheck.test_allowed_action_with_scopeH   s®   € ð ×!Ñ! -°Ó=ˆØ�‰Ð:Ô"4×":Ñ":Ð:ˆÐ":Ñ:×:×:Õ:ˆÐ":×:×:×:×:×:Ñ:ˆv×:×:Ó:ˆv×:×:Ô:ˆ×:×:×:×:×:Ð:Ô"4×:×:Ó:Ô"4×:×:Ô:Ð":×:×:×:×:×:×:Ô:r"   c                 óô  — |j                  |d«      }|j                  }t        j                  }||k(  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}d}	|j                  }
|	|
v }|s­t	        j
                  d	|fd
|	|
f«      t	        j                  |	«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |
«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}	x}}
y )NÚ
write_filerV   ©zJ%(py2)s
{%(py2)s = %(py0)s.decision
} == %(py6)s
{%(py6)s = %(py4)s.DENY
}ri   r   rj   rk   rl   ©Úin©z.%(py1)s in %(py5)s
{%(py5)s = %(py3)s.reason
}©rX   Úpy3r5   r6   r7   ©rn   ro   r   ÚDENYr9   r:   r;   r<   r=   r>   r?   r@   Úreason©rA   r,   r$   ri   rB   rr   rD   rR   rs   r^   rC   r_   rE   rF   s                 r#   Ú test_denied_action_without_scopez/TestScopeCheck.test_denied_action_without_scopeN   s  € ð ×!Ñ! -°Ó>ˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ó9ØÐ,˜vŸ}™}Ð,ˆ|˜}Ð,×,×,Õ,ˆ|˜}×,×,Ó,ˆ|×,×,×,×,×,Ð,˜v×,×,Ó,˜v×,×,Ô,˜}×,×,×,×,×,×,Ô,r"   c                 óô  — |j                  |d«      }|j                  }t        j                  }||k(  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}d	}	|j                  }
|	|
v }|s­t	        j
                  d
|fd|	|
f«      t	        j                  |	«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |
«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}	x}}
y )NÚunknown_actionrV   rw   ri   r   rj   rk   rl   únot a registered actionrx   rz   r{   r6   r7   r}   r€   s                 r#   Útest_unmapped_action_is_deniedz-TestScopeCheck.test_unmapped_action_is_deniedV   s  € ð ×!Ñ! -Ð1AÓBˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ó9Ø(Ð9¨F¯M©MÐ9Ð(¨MÐ9×9×9Õ9Ð(¨M×9×9Ó9Ð(×9×9×9×9×9Ð9¨F×9×9Ó9¨F×9×9Ô9¨M×9×9×9×9×9×9Ô9r"   Úvariant)z execute_shell ÚEXECUTE_SHELLz	execute_shell
z Execute_Shell c                 óÈ  — |j                  ||«      }|j                  }t        j                  }||k(  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}x}}|j                  }d }
||
u}|s­t	        j
                  d|fd	||
f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |
«      d
œz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}
|j                  }|j                  }d}||k(  }|sÁt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |«      t	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}x}}y )NrV   ©zV%(py2)s
{%(py2)s = %(py0)s.decision
} == %(py6)s
{%(py6)s = %(py4)s.REQUIRE_APPROVAL
}ri   r   rj   rk   rl   r0   )z3%(py2)s
{%(py2)s = %(py0)s.request
} is not %(py5)sr2   r6   r7   rY   )zK%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.request
}.action
} == %(py7)s)r3   r4   rM   r7   úassert %(py9)sÚpy9)rn   ro   r   ÚREQUIRE_APPROVALr9   r:   r;   r<   r=   r>   r?   r@   ÚrequestÚaction)rA   r,   r$   r†   ri   rB   rr   rD   rR   rs   rC   rE   rF   Ú@py_assert6Ú@py_format10s                  r#   Ú:test_whitespace_and_case_variants_normalize_to_one_verdictzITestScopeCheck.test_whitespace_and_case_variants_normalize_to_one_verdict`   s¡  € ð ×!Ñ! -°Ó9ˆØ�‰ÐEÔ"4×"EÑ"EÐEˆÐ"EÑE×E×EÕEˆÐ"E×E×E×E×E×EÑEˆv×E×EÓEˆv×E×EÔEˆ×E×E×E×E×EÐEÔ"4×E×EÓEÔ"4×E×EÔEÐ"E×E×E×E×E×E×EÓEØ�~‰~Ð) TÐ)ˆ~ TÐ)×)×)Õ)ˆ~ T×)×)×)×)×)Ñ)ˆv×)×)Ó)ˆv×)×)Ô)ˆ~×)×)Ò) T×)×)×)×)×)×)Ó)Ø�~‰~Ð7ˆ~×$Ñ$Ð7¨Ð7Ð$¨Ñ7×7×7Õ7Ð$¨×7×7×7×7×7Ñ7ˆv×7×7Ó7ˆv×7×7Ô7ˆ~×7×7Ò7Ð$×7×7Ò7¨×7×7×7×7×7×7Ö7r"   c                 óô  — |j                  |d«      }|j                  }t        j                  }||k(  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}d	}	|j                  }
|	|
v }|s­t	        j
                  d
|fd|	|
f«      t	        j                  |	«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |
«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}	x}}
y )Nz  UNKNOWN_ACTION rV   rw   ri   r   rj   rk   rl   r„   rx   rz   r{   r6   r7   r}   r€   s                 r#   Ú&test_unmapped_action_variant_is_deniedz5TestScopeCheck.test_unmapped_action_variant_is_deniedp   s  € ð ×!Ñ! -Ð1DÓEˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ó9Ø(Ð9¨F¯M©MÐ9Ð(¨MÐ9×9×9Õ9Ð(¨M×9×9Ó9Ð(×9×9×9×9×9Ð9¨F×9×9Ó9¨F×9×9Ô9¨M×9×9×9×9×9×9Ô9r"   c                 óf  — |j                  |d«      }|j                  }t        j                  }||k(  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}y )	NÚplanrV   rh   ri   r   rj   rk   rl   rm   rq   s	            r#   Ú#test_allowlisted_safe_action_passesz2TestScopeCheck.test_allowlisted_safe_action_passesw   s®   € ð
 ×!Ñ! -°Ó8ˆØ�‰Ð:Ô"4×":Ñ":Ð:ˆÐ":Ñ:×:×:Õ:ˆÐ":×:×:×:×:×:Ñ:ˆv×:×:Ó:ˆv×:×:Ô:ˆ×:×:×:×:×:Ð:Ô"4×:×:Ó:Ô"4×:×:Ô:Ð":×:×:×:×:×:×:Ô:r"   c                 óú  — |j                   }d} ||«      }d}||k(  }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}|j                  }d	} ||«      }d
}||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )Nz EXECUTE_SHELL rZ   rV   ©zS%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.require_scope
}(%(py4)s)
} == %(py9)sr,   ©r3   r4   rM   rO   r‹   úassert %(py11)sÚpy11z Read_File TrI   ©zW%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.has_scope_mapping
}(%(py4)s)
} is %(py9)s)
Úrequire_scoper9   r:   r;   r<   r=   r>   r?   r@   Úhas_scope_mapping©	rA   r,   rB   rD   rr   Ú@py_assert8Ú@py_assert7r�   Ú@py_format12s	            r#   Ú#test_scope_lookup_normalizes_actionz2TestScopeCheck.test_scope_lookup_normalizes_action   s<  € ð ×$Ñ$ÐBÐ%6ÐBÑ$Ð%6Ó7ÐB¸7ÐBÐ7¸7ÑB×B×BÕBÐ7¸7×B×B×B×B×BÑBˆw×B×BÓBˆw×B×BÔBÐ$×B×BÒBÐ%6×B×BÒBÐ7×B×BÒB¸7×B×B×B×B×B×B×BØ×(Ñ(Ð?¨Ð?Ñ(¨Ó7Ð?¸4Ð?Ð7¸4Ð?×?×?Õ?Ð7¸4×?×?×?×?×?Ñ?ˆw×?×?Ó?ˆw×?×?Ô?Ð(×?×?Ò?¨×?×?Ò?Ð7×?×?Ò?¸4×?×?×?×?×?×?×?Ð?r"   c                 óö  — |j                   }d} ||«      }d}||k(  }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}|j                   }d} ||«      }d	}||k(  }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}|j                   }d
} ||«      }d }||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )NrU   rV   r˜   r,   r™   rš   r›   Úexecute_dockerÚdockerÚnonexistentrI   )zS%(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.require_scope
}(%(py4)s)
} is %(py9)s)	r�   r9   r:   r;   r<   r=   r>   r?   r@   rŸ   s	            r#   Ú(test_require_scope_returns_correct_scopez7TestScopeCheck.test_require_scope_returns_correct_scope…   sÕ  € ð ×$Ñ$Ð@ [Ð@Ñ$ [Ó1Ð@°[Ð@Ð1°[Ñ@×@×@Õ@Ð1°[×@×@×@×@×@Ñ@ˆw×@×@Ó@ˆw×@×@Ô@Ð$×@×@Ò@ [×@×@Ò@Ð1×@×@Ò@°[×@×@×@×@×@×@×@Ø×$Ñ$ÐBÐ%5ÐBÑ$Ð%5Ó6ÐB¸(ÐBÐ6¸(ÑB×B×BÕBÐ6¸(×B×B×B×B×BÑBˆw×B×BÓBˆw×B×BÔBÐ$×B×BÒBÐ%5×B×BÒBÐ6×B×BÒB¸(×B×B×B×B×B×B×BØ×$Ñ$Ð; ]Ð;Ñ$ ]Ó3Ð;°tÐ;Ð3°tÐ;×;×;Õ;Ð3°t×;×;×;×;×;Ñ;ˆw×;×;Ó;ˆw×;×;Ô;Ð$×;×;Ò; ]×;×;Ò;Ð3×;×;Ò;°t×;×;×;×;×;×;×;Ð;r"   c                 óø  — |j                   }d} ||«      }d}||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}|j                   }d	} ||«      }d
}||u }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}x}}y )NrU   TrI   rœ   r,   r™   rš   r›   r§   F)	rž   r9   r:   r;   r<   r=   r>   r?   r@   rŸ   s	            r#   Útest_has_scope_mappingz%TestScopeCheck.test_has_scope_mappingŒ   s7  € Ø×(Ñ(Ð=¨Ð=Ñ(¨Ó5Ð=¸Ð=Ð5¸Ð=×=×=Õ=Ð5¸×=×=×=×=×=Ñ=ˆw×=×=Ó=ˆw×=×=Ô=Ð(×=×=Ò=¨×=×=Ò=Ð5×=×=Ò=¸×=×=×=×=×=×=×=Ø×(Ñ(Ð@¨Ð@Ñ(¨Ó7Ð@¸5Ð@Ð7¸5Ð@×@×@Õ@Ð7¸5×@×@×@×@×@Ñ@ˆw×@×@Ó@ˆw×@×@Ô@Ð(×@×@Ò@¨×@×@Ò@Ð7×@×@Ò@¸5×@×@×@×@×@×@×@Ð@r"   )rb   rc   rd   r   r
   rt   r�   r…   ÚpytestÚmarkÚparametrizeÚstrr‘   r“   r–   r£   r¨   rª   r!   r"   r#   rf   rf   G   s&  „ ð;Ø(ð;Ø9Fð;à	ó;ð-Ø(ð-Ø9Fð-à	ó-ð:Ø(ð:Ø9Fð:à	ó:ð ‡[�[×ÑØÒ_óð8à"ð8ð %ð8ð ð	8ð
 
ò8óð8ð:Ø(ð:Ø9Fð:à	ó:ð;Ø(ð;Ø9Fð;à	ó;ð@Ø(ð@à	ó@ð<Ø(ð<à	ó<ðAÐ.?ð AÀDô Ar"   rf   c                   ó4   — e Zd Zdededdfd„Zdededdfd„Zy)ÚTestUntrustedAgentsr,   r'   r   Nc                 óô  — |j                  |d«      }|j                  }t        j                  }||k(  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}d	}	|j                  }
|	|
v }|s­t	        j
                  d
|fd|	|
f«      t	        j                  |	«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |
«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}	x}}
y )NrU   rV   rw   ri   r   rj   rk   rl   r&   rx   rz   r{   r6   r7   r}   )rA   r,   r'   ri   rB   rr   rD   rR   rs   r^   rC   r_   rE   rF   s                 r#   Útest_untrusted_deniedz)TestUntrustedAgents.test_untrusted_denied’   s  € ð ×!Ñ! /°;Ó?ˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ó9ØÐ+˜fŸm™mÐ+ˆ{˜mÐ+×+×+Õ+ˆ{˜m×+×+Ó+ˆ{×+×+×+×+×+Ð+˜f×+×+Ó+˜f×+×+Ô+˜m×+×+×+×+×+×+Ô+r"   c                 óf  — |j                  |d«      }|j                  }t        j                  }||k(  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}y )	NrY   rV   rw   ri   r   rj   rk   rl   )rn   ro   r   r~   r9   r:   r;   r<   r=   r>   r?   r@   )	rA   r,   r'   ri   rB   rr   rD   rR   rs   s	            r#   Útest_untrusted_denied_sensitivez3TestUntrustedAgents.test_untrusted_denied_sensitive™   s®   € ð ×!Ñ! /°?ÓCˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ô9r"   )rb   rc   rd   r   r
   r²   r´   r!   r"   r#   r°   r°   ‘   s<   „ ð,Ø(ð,Ø;Hð,à	ó,ð:Ø(ð:Ø;Hð:à	ô:r"   r°   c                   óD   — e Zd Zdededdfd„Zdeddfd„Zdededdfd„Zy)ÚTestPolicyIntegrationr,   r$   r   Nc                 óô  — |j                  |d«      }|j                  }t        j                  }||k(  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}|j                  }d	}	||	u }|s­t	        j
                  d
|fd||	f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |	«      dœz  }
dd|
iz  }t        t	        j                  |«      «      ‚d x}x}}	y )NrY   rV   r‰   ri   r   rj   rk   rl   TrI   ©z9%(py2)s
{%(py2)s = %(py0)s.approval_required
} is %(py5)sr2   r6   r7   )rn   ro   r   rŒ   r9   r:   r;   r<   r=   r>   r?   r@   Úapproval_required)rA   r,   r$   ri   rB   rr   rD   rR   rs   rC   rE   rF   s               r#   Ú'test_sensitive_action_requires_approvalz=TestPolicyIntegration.test_sensitive_action_requires_approval¡   s   € ð ×!Ñ! -°ÓAˆØ�‰ÐEÔ"4×"EÑ"EÐEˆÐ"EÑE×E×EÕEˆÐ"E×E×E×E×E×EÑEˆv×E×EÓEˆv×E×EÔEˆ×E×E×E×E×EÐEÔ"4×E×EÓEÔ"4×E×EÔEÐ"E×E×E×E×E×E×EÓEØ×'Ñ'Ð/¨4Ð/Ð'¨4Ð/×/×/Õ/Ð'¨4×/×/×/×/×/Ñ/ˆv×/×/Ó/ˆv×/×/Ô/Ð'×/×/Ò/¨4×/×/×/×/×/×/Ô/r"   c                 ó&  — t        t        t        j                  ¬«      «      }|j	                  |d«      }|j
                  }t        j                  }||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd	|iz  }t        t        j                  |«      «      ‚d x}x}}g }d
}	|j                   }
|
j"                  } |«       }|	|v }|}|s'd}|j                   }|j"                  } |«       }||v }|}|�sÐt        j                  d|fd|	|f«      t        j                  |	«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |
«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }|j%                  |«       |sÈt        j                  dfdf«      t        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  «      t        j                  «      t        j                  |«      dœz  }dd|iz  }|j%                  |«       t        j&                  |d«      i z  }dd|iz  }t        t        j                  |«      «      ‚d x}x}x}	x}x}
x}x}x}x}x}x}}y )Nr)   rY   rV   rw   ri   r   rj   rk   rl   ÚdefaultÚdenyrx   )zb%(py3)s in %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py5)s.reason
}.lower
}()
})r|   r5   r7   r‹   r›   z%(py13)sÚpy13)zh%(py16)s in %(py24)s
{%(py24)s = %(py22)s
{%(py22)s = %(py20)s
{%(py20)s = %(py18)s.reason
}.lower
}()
})Úpy16Úpy18Úpy20Úpy22Úpy24z%(py26)sÚpy26é   zassert %(py29)sÚpy29)r   r   r   rP   rn   ro   r   r~   r9   r:   r;   r<   r=   r>   r?   r@   r   ÚlowerÚappendÚ_format_boolop)rA   r$   r,   ri   rB   rr   rD   rR   rs   r_   r�   r    Ú@py_assert10rC   r^   Ú@py_assert15Ú@py_assert19Ú@py_assert21Ú@py_assert23Ú@py_assert17r¢   Ú@py_format14Ú@py_format25Ú@py_format27Ú@py_format28Ú@py_format30s                             r#   Útest_full_mode_allows_sensitivez5TestPolicyIntegration.test_full_mode_allows_sensitive©   s  € ô $¤L´j·o±oÔ$FÓGˆØ×!Ñ! -°ÓAˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ó9ÙTˆyÐT˜FŸM™MÐT˜M×/Ñ/ÐTÑ/Ó1ÐTˆyÐ1Ð1ÔT°VÐT¸v¿}¹}ÐT¸}×?RÑ?RÐTÑ?RÓ?TÐT°VÐ?TÐ5T×T×T×TÐTˆyÐ1×T×TÓTˆy×T×T×T×T×TÐT˜F×T×TÓT˜F×T×TÔT˜M×T×TÒTÐ/×T×TÒTÐ1×T×T×T×T×T×TÕT°VÐ?T×T×TÓT°V×T×T×T×T×TÐT¸v×T×TÓT¸v×T×TÔT¸}×T×TÒTÐ?R×T×TÒTÐ?T×T×T×T×T×T×T×T×T×T×T×T×T×T×T×Tr"   c                 óÒ  — |j                   j                  t        ddt        j                  d¬«      «       |j                  |d«      }|j                  }t        j                  }||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      d	t        j                  «       v st        j                  t        «      rt        j                  t        «      nd	t        j                  |«      d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )NÚdeny_allÚ*zDeny all)ÚnameÚaction_patternro   r   rU   rV   rw   ri   r   rj   rk   rl   )r8   Úadd_ruler   r   r~   rn   ro   r   r9   r:   r;   r<   r=   r>   r?   r@   rq   s	            r#   Útest_policy_deniedz(TestPolicyIntegration.test_policy_denied±   sÞ   € ð 	×Ñ×&Ñ&ÜØØ"Ü'×,Ñ,Ø!ô	ô	
ð ×!Ñ! -°Ó=ˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ô9r"   )rb   rc   rd   r   r
   rº   rÕ   rÜ   r!   r"   r#   r¶   r¶       sT   „ ð0Ø(ð0Ø9Fð0à	ó0ðUØ*ðUà	óUð:Ø(ð:Ø9Fð:à	ô:r"   r¶   c                   ó,   — e Zd Zdeddfd„Zdeddfd„Zy)ÚTestPermissionRequestr$   r   Nc                 óB  — t        |dd¬«      }|j                  }||k(  }|sÚt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      nddœz  }d	d
|iz  }t        t        j                  |«      «      ‚d x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}|j                  }i }||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}y )NrU   z/etc/passwd)ÚagentrŽ   ÚresourcerV   )z-%(py2)s
{%(py2)s = %(py0)s.agent
} == %(py4)sr�   r$   rL   rN   rO   )z.%(py2)s
{%(py2)s = %(py0)s.action
} == %(py5)sr2   r6   r7   )z0%(py2)s
{%(py2)s = %(py0)s.resource
} == %(py5)s©z/%(py2)s
{%(py2)s = %(py0)s.context
} == %(py5)sg        ©z2%(py2)s
{%(py2)s = %(py0)s.risk_score
} == %(py5)s)r   rà   r9   r:   r;   r<   r=   r>   r?   r@   rŽ   rá   ÚcontextÚ
risk_score)
rA   r$   r�   rB   rD   rQ   rR   rC   rE   rF   s
             r#   Útest_create_requestz)TestPermissionRequest.test_create_requestÂ   sQ  € Ü#ØØØ"ô
ˆð
 �}‰}Ð-ˆ} Ñ-×-×-Õ-ˆ} ×-×-×-×-×-Ñ-ˆw×-×-Ó-ˆw×-×-Ô-ˆ}×-×-×-×-×-Ð- ×-×-Ó- ×-×-×-×-×-×-Ó-Ø�~‰~Ð, Ð,ˆ~ Ñ,×,×,Õ,ˆ~ ×,×,×,×,×,Ñ,ˆw×,×,Ó,ˆw×,×,Ô,ˆ~×,×,Ò, ×,×,×,×,×,×,Ó,Ø×ÑÐ0 =Ð0Ð =Ñ0×0×0Õ0Ð =×0×0×0×0×0Ñ0ˆw×0×0Ó0ˆw×0×0Ô0Ð×0×0Ò0 =×0×0×0×0×0×0Ó0Ø�‰Ð$ "Ð$ˆ "Ñ$×$×$Õ$ˆ "×$×$×$×$×$Ñ$ˆw×$×$Ó$ˆw×$×$Ô$ˆ×$×$Ò$ "×$×$×$×$×$×$Ó$Ø×!Ñ!Ð( SÐ(Ð! SÑ(×(×(Õ(Ð! S×(×(×(×(×(Ñ(ˆw×(×(Ó(ˆw×(×(Ô(Ð!×(×(Ò( S×(×(×(×(×(×(Ô(r"   c                 óL  — t        |ddddid¬«      }|j                  }ddi}||k(  }|s­t        j                  d|fd||f«      d	t	        j
                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      t        j                  |«      d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  }d}||k(  }|s­t        j                  d|fd||f«      d	t	        j
                  «       v st        j                  |«      rt        j                  |«      nd	t        j                  |«      t        j                  |«      d
œz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )NrY   z/bin/lsÚenvÚ
productiongš™™™™™é?)rà   rŽ   rá   rä   rå   rV   râ   r�   r2   r6   r7   rã   )r   rä   r9   r:   r;   r<   r=   r>   r?   r@   rå   )rA   r$   r�   rB   rC   rD   rE   rF   s           r#   Útest_request_with_contextz/TestPermissionRequest.test_request_with_contextÎ   s	  € Ü#ØØ"ØØ˜LÐ)Øô
ˆð �‰Ð7 5¨,Ð"7Ð7ˆÐ"7Ñ7×7×7Õ7ˆÐ"7×7×7×7×7×7Ñ7ˆw×7×7Ó7ˆw×7×7Ô7ˆ×7×7Ò7Ð"7×7×7×7×7×7×7Ó7Ø×!Ñ!Ð( SÐ(Ð! SÑ(×(×(Õ(Ð! S×(×(×(×(×(Ñ(ˆw×(×(Ó(ˆw×(×(Ô(Ð!×(×(Ò( S×(×(×(×(×(×(Ô(r"   )rb   rc   rd   r
   ræ   rê   r!   r"   r#   rÞ   rÞ   Á   s(   „ ð
)°ð 
)À4ó 
)ð	)°}ð 	)Èô 	)r"   rÞ   c                   óD   — e Zd Zdeddfd„Zdededdfd„Zdededdfd„Zy)ÚTestPermissionResultr$   r   Nc                 óÌ  — t        «       }|j                  |d«      }t        |t        «      }|�sddt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  |«      rt        j                  |«      nddt	        j
                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        t        j                  |«      «      ‚d }|j                  }t        j                  }||k(  }|söt        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      d	t	        j
                  «       v st        j                  t        «      rt        j                  t        «      nd	t        j                  |«      d
œz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}|j                  }|syddt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dœz  }
t        t        j                  |
«      «      ‚d }y )NrU   z5assert %(py4)s
{%(py4)s = %(py0)s(%(py1)s, %(py2)s)
}Ú
isinstanceri   r   )r3   rX   r4   rM   rV   rh   r   rj   rk   rl   ú*assert %(py2)s
{%(py2)s = %(py0)s.reason
}©r3   r4   )r   rn   rî   r   r;   r<   r9   r=   r>   r?   r@   ro   r   rp   r:   r   )rA   r$   r,   ri   rD   rQ   rB   rr   rR   rs   Ú@py_format3s              r#   Útest_allow_resultz&TestPermissionResult.test_allow_resultÛ   s„  € Ü#Ó%ˆØ×!Ñ! -°Ó=ˆÜ˜&Ô"2Ó3Ð3Ò3×3×3×3×3Õ3Œz×3×3Ó3Œz×3×3×3×3×3Ò3˜&×3×3Ó3˜&×3×3×3×3×3Ò3Ô"2×3×3Ó3Ô"2×3×3Ô3Ð3×3×3×3×3×3Ð3Ø�‰Ð:Ô"4×":Ñ":Ð:ˆÐ":Ñ:×:×:Õ:ˆÐ":×:×:×:×:×:Ñ:ˆv×:×:Ó:ˆv×:×:Ô:ˆ×:×:×:×:×:Ð:Ô"4×:×:Ó:Ô"4×:×:Ô:Ð":×:×:×:×:×:×:Ó:Ø�}‰}Ð‰}××××Õˆv××Óˆv××Ôˆ}×××××Ñr"   r,   c                 ó  — |j                  |d«      }|j                  }t        j                  }||k(  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}|j                  }|syd	dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      d
œz  }	t        t	        j                  |	«      «      ‚d }|j                  }d}
||
k(  }|s­t	        j
                  d|fd||
f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      t	        j                  |
«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚d x}x}}
y )Nrv   rV   rw   ri   r   rj   rk   rl   rï   rð   )z6%(py2)s
{%(py2)s = %(py0)s.scope_required
} == %(py5)sr2   r6   r7   )rn   ro   r   r~   r9   r:   r;   r<   r=   r>   r?   r@   r   Úscope_required)rA   r,   r$   ri   rB   rr   rD   rR   rs   rñ   rC   rE   rF   s                r#   Útest_deny_result_has_reasonz0TestPermissionResult.test_deny_result_has_reasonâ   se  € ð ×!Ñ! -°Ó>ˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ó9Ø�}‰}Ð‰}××××Õˆv××Óˆv××Ôˆ}×××××ÐØ×$Ñ$Ð4¨Ð4Ð$¨Ñ4×4×4Õ4Ð$¨×4×4×4×4×4Ñ4ˆv×4×4Ó4ˆv×4×4Ô4Ð$×4×4Ò4¨×4×4×4×4×4×4Ô4r"   c                 ó¶  — |j                  |d«      }|j                  }d}||u }|s­t        j                  d|fd||f«      dt	        j
                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )	NrY   TrI   r¸   ri   r2   r6   r7   )
rn   r¹   r9   r:   r;   r<   r=   r>   r?   r@   )	rA   r,   r$   ri   rB   rC   rD   rE   rF   s	            r#   Útest_approval_result_has_flagz2TestPermissionResult.test_approval_result_has_flagê   sˆ   € ð ×!Ñ! -°ÓAˆØ×'Ñ'Ð/¨4Ð/Ð'¨4Ð/×/×/Õ/Ð'¨4×/×/×/×/×/Ñ/ˆv×/×/Ó/ˆv×/×/Ô/Ð'×/×/Ò/¨4×/×/×/×/×/×/Ô/r"   )rb   rc   rd   r
   rò   r   rõ   r÷   r!   r"   r#   rì   rì   Ú   sO   „ ð¨}ð Àó ð5Ø(ð5Ø9Fð5à	ó5ð0Ø(ð0Ø9Fð0à	ô0r"   rì   c                  ó   — t        «       S )N)r   r!   r"   r#   Ú	audit_logrù   ñ   s
   € ä‹:Ðr"   c                   ót   — e Zd Zdededdfd„Zdedededdfd„Zdededdfd	„Zdededdfd
„Z	dededdfd„Z
y)Ú!TestPermissionGatewayAuditLoggingr'   rù   r   Nc                 óf  — t        t        t        j                  ¬«      |¬«      }|j	                  |d«      }|j
                  }t        j                  }||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }d	d
|iz  }	t        t        j                  |	«      «      ‚d x}x}}|j!                  t#        t$        j&                  ¬«      «      }
t)        |
«      }d}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t(        «      rt        j                  t(        «      nddt        j                  «       v st        j                  |
«      rt        j                  |
«      ndt        j                  |«      t        j                  |«      dœz  }d	d
|iz  }	t        t        j                  |	«      «      ‚d x}x}}|
d   }|j*                  }d}||k(  }|s€t        j                  d|fd||f«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }d	d
|iz  }	t        t        j                  |	«      «      ‚d x}x}x}}y )Nr)   ©rù   rU   rV   rw   ri   r   rj   rk   rl   ©Ú
event_typerÅ   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚidentity_events©r3   rX   r|   rO   r   Údenied©z.%(py3)s
{%(py3)s = %(py1)s.result
} == %(py6)s©rX   r|   rO   )r   r   r   r+   rn   ro   r   r~   r9   r:   r;   r<   r=   r>   r?   r@   Úqueryr	   r   ÚIDENTITY_CHECKr  ri   )rA   r'   rù   r,   ri   rB   rr   rD   rR   rs   r  r_   rC   r^   s                 r#   Ú)test_trust_check_logged_as_identity_checkzKTestPermissionGatewayAuditLogging.test_trust_check_logged_as_identity_check÷   s×  € ô $¤L´j·o±oÔ$FÐR[Ô\ˆØ×!Ñ! /°;Ó?ˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ó9Ø#Ÿ/™/¬*Ä×@]Ñ@]Ô*^Ó_ˆÜ�?Ó#Ð( qÐ(Ð# qÑ(×(×(Õ(Ð# q×(×(×(×(×(Ñ(Œs×(×(Ó(Œs×(×(×(×(×(Ò(�?×(×(Ó(�?×(×(Ô(Ð#×(×(Ò( q×(×(×(×(×(×(Ó(Ø˜qÑ!Ð4Ð!×(Ñ(Ð4¨HÐ4Ð(¨HÑ4×4×4Õ4Ð(¨H×4×4Ó4Ð!×4×4Ò4Ð(×4×4Ò4¨H×4×4×4×4×4×4Ö4r"   r,   r$   c                 óL  — ||_         ||j                  _         |j                  |d«      }|j                  }t        j
                  }||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}|j                  t        t         j"                  ¬	«      «      }
t%        |
«      }d
}||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t$        «      rt        j                  t$        «      nddt        j                  «       v st        j                  |
«      rt        j                  |
«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}}|
d   }|j&                  }d}||k(  }|s€t        j                  d|fd||f«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}}y )Nrv   rV   rw   ri   r   rj   rk   rl   rþ   rÅ   r   r  Úperm_eventsr  r   Úscope_check_failedr  r  )rù   r8   rn   ro   r   r~   r9   r:   r;   r<   r=   r>   r?   r@   r  r	   r   ÚPERMISSION_CHECKr  ri   )rA   r,   r$   rù   ri   rB   rr   rD   rR   rs   r  r_   rC   r^   s                 r#   Ú+test_scope_check_logged_as_permission_checkzMTestPermissionGatewayAuditLogging.test_scope_check_logged_as_permission_check  sØ  € ð &ˆÔØ*3ˆ×ÑÔ'Ø×!Ñ! -°Ó>ˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ó9Ø—o‘o¤j¼N×<[Ñ<[Ô&\Ó]ˆÜ�;ÓÐ$ 1Ð$Ð 1Ñ$×$×$Õ$Ð 1×$×$×$×$×$Ñ$Œs×$×$Ó$Œs×$×$×$×$×$Ò$�;×$×$Ó$�;×$×$Ô$Ð×$×$Ò$ 1×$×$×$×$×$×$Ó$Ø˜1‰~Ð<ˆ~×$Ñ$Ð<Ð(<Ð<Ð$Ð(<Ñ<×<×<Õ<Ð$Ð(<×<×<Ó<ˆ~×<×<Ò<Ð$×<×<Ò<Ð(<×<×<×<×<×<×<Ö<r"   c                 ó€  — t        t        t        j                  ¬«      |¬«      }|j	                  |d«      }|j
                  }t        j                  }||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }d	d
|iz  }	t        t        j                  |	«      «      ‚d x}x}}|j!                  t#        t$        j&                  ¬«      «      }
t)        |
«      }d}||k\  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  t(        «      rt        j                  t(        «      nddt        j                  «       v st        j                  |
«      rt        j                  |
«      ndt        j                  |«      t        j                  |«      dœz  }d	d
|iz  }	t        t        j                  |	«      «      ‚d x}x}}d„ |
D «       }t+        |«      }|s•ddt        j                  «       v st        j                  t*        «      rt        j                  t*        «      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}}y )Nr)   rý   rY   rV   r‰   ri   r   rj   rk   rl   rþ   rÅ   )ú>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sr  r  r  c              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)r¹   N©ri   ©Ú.0Úes     r#   ú	<genexpr>z\TestPermissionGatewayAuditLogging.test_approve_logged_as_permission_check.<locals>.<genexpr>  s   è ø€ ÒH°q�1—8‘8Ð2Õ2ÑHùó   ‚ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}ÚanyrL   )r   r   r   r+   rn   ro   r   rŒ   r9   r:   r;   r<   r=   r>   r?   r@   r  r	   r   r  r  r  )rA   r$   rù   r,   ri   rB   rr   rD   rR   rs   r  r_   rC   rQ   s                 r#   Ú'test_approve_logged_as_permission_checkzITestPermissionGatewayAuditLogging.test_approve_logged_as_permission_check  sÌ  € ô $¤L´j·o±oÔ$FÐR[Ô\ˆØ×!Ñ! -°ÓAˆØ�‰ÐEÔ"4×"EÑ"EÐEˆÐ"EÑE×E×EÕEˆÐ"E×E×E×E×E×EÑEˆv×E×EÓEˆv×E×EÔEˆ×E×E×E×E×EÐEÔ"4×E×EÓEÔ"4×E×EÔEÐ"E×E×E×E×E×E×EÓEØ—o‘o¤j¼N×<[Ñ<[Ô&\Ó]ˆÜ�;ÓÐ$ 1Ð$Ð 1Ñ$×$×$Õ$Ð 1×$×$×$×$×$Ñ$Œs×$×$Ó$Œs×$×$×$×$×$Ò$�;×$×$Ó$�;×$×$Ô$Ð×$×$Ò$ 1×$×$×$×$×$×$Ó$ÙH¸KÔHÐHŒsÐHÓHÐHÑH×H×H×H×HÕHŒs×H×HÓHŒs×H×HÔHÐH×H×HÒHÐH×H×H×H×H×HÓHr"   c                 ó¾  — t        t        t        j                  ¬«      |¬«      }|j	                  |d«      }|j
                  }t        j                  }||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }d	d
|iz  }	t        t        j                  |	«      «      ‚d x}x}}|j!                  t#        t$        j&                  ¬«      «      }
d„ |
D «       }t)        |«      }|s•ddt        j                  «       v st        j                  t(        «      rt        j                  t(        «      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}}d„ |
D «       }t)        |«      }|s•ddt        j                  «       v st        j                  t(        «      rt        j                  t(        «      ndt        j                  |«      t        j                  |«      dœz  }t        t        j                  |«      «      ‚d x}}y )Nr)   rý   rU   rV   rh   ri   r   rj   rk   rl   rþ   c              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)Úscope_check_passedNr  r  s     r#   r  zZTestPermissionGatewayAuditLogging.test_allow_logged_as_permission_check.<locals>.<genexpr>  s   è ø€ ÒI¸�1—8‘8Ð3Õ3ÑIùr  r  r  rL   c              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)ÚallowedNr  r  s     r#   r  zZTestPermissionGatewayAuditLogging.test_allow_logged_as_permission_check.<locals>.<genexpr>  s   è ø€ Ò>¨Q�1—8‘8˜yÕ(Ñ>ùr  )r   r   r   r+   rn   ro   r   rp   r9   r:   r;   r<   r=   r>   r?   r@   r  r	   r   r  r  )rA   r$   rù   r,   ri   rB   rr   rD   rR   rs   r  rQ   s               r#   Ú%test_allow_logged_as_permission_checkzGTestPermissionGatewayAuditLogging.test_allow_logged_as_permission_check  s›  € ô $¤L´j·o±oÔ$FÐR[Ô\ˆØ×!Ñ! -°Ó=ˆØ�‰Ð:Ô"4×":Ñ":Ð:ˆÐ":Ñ:×:×:Õ:ˆÐ":×:×:×:×:×:Ñ:ˆv×:×:Ó:ˆv×:×:Ô:ˆ×:×:×:×:×:Ð:Ô"4×:×:Ó:Ô"4×:×:Ô:Ð":×:×:×:×:×:×:Ó:Ø—o‘o¤j¼N×<[Ñ<[Ô&\Ó]ˆÙI¸[ÔIÐIŒsÐIÓIÐIÑI×I×I×I×IÕIŒs×I×IÓIŒs×I×IÔIÐI×I×IÒIÐI×I×I×I×I×IÒIÙ>°+Ô>Ð>ŒsÐ>Ó>Ð>Ñ>×>×>×>×>Õ>Œs×>×>Ó>Œs×>×>Ô>Ð>×>×>Ò>Ð>×>×>×>×>×>Ó>r"   c                 óô  — |j                   }d }||u }|s­t        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                  |d«      }|j                  }t        j                  }	||	k(  }|söt        j                  d|fd	||	f«      d
t        j                  «       v st        j
                  |«      rt        j                  |«      nd
t        j                  |«      dt        j                  «       v st        j
                  t        «      rt        j                  t        «      ndt        j                  |	«      dœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}}	y )NrI   )z1%(py2)s
{%(py2)s = %(py0)s.audit_log
} is %(py5)sr,   r2   r6   r7   rU   rV   rh   ri   r   rj   rk   rl   )rù   r9   r:   r;   r<   r=   r>   r?   r@   rn   ro   r   rp   )rA   r,   r$   rB   rC   rD   rE   rF   ri   rr   rR   rs   s               r#   Útest_no_audit_when_no_logz;TestPermissionGatewayAuditLogging.test_no_audit_when_no_log   s  € Ø× Ñ Ð( DÐ(Ð  DÐ(×(×(Õ(Ð  D×(×(×(×(×(Ñ(ˆw×(×(Ó(ˆw×(×(Ô(Ð ×(×(Ò( D×(×(×(×(×(×(Ó(Ø×!Ñ! -°Ó=ˆØ�‰Ð:Ô"4×":Ñ":Ð:ˆÐ":Ñ:×:×:Õ:ˆÐ":×:×:×:×:×:Ñ:ˆv×:×:Ó:ˆv×:×:Ô:ˆ×:×:×:×:×:Ð:Ô"4×:×:Ó:Ô"4×:×:Ô:Ð":×:×:×:×:×:×:Ô:r"   )rb   rc   rd   r
   r   r	  r   r  r  r   r"  r!   r"   r#   rû   rû   ö   sŸ   „ ð5Ø,ð5Ø9Að5à	ó5ð	=Ø(ð	=Ø9Fð	=ØS[ð	=à	ó	=ðIØ*ðIØ7?ðIà	óIð?Ø*ð?Ø7?ð?à	ó?ð;Ð1Bð ;ÐS`ð ;Ðeiô ;r"   rû   )Úpublish_contentÚsend_external_messageÚcredential_accessÚdata_uploadÚNEWLY_SCOPED_ACTIONSc                  óÀ   — t        t        j                  «       «      } t        D �ch c]  }|j                  ’Œ }}t        ddt        j                  || z
  ¬«      S c c}w )zCA trusted agent holding every scope EXCEPT the four required above.zagent-scopedr   r   )Úsetr'  Úvaluesr   Úvaluer
   r   r   )ÚrequiredÚscopeÚ
all_scopess      r#   Úunscoped_sensitive_agentr/  4  sX   € ô Ô'×.Ñ.Ó0Ó1€HÜ+:Ö; %�%—+“+Ð;€JÐ;ÜØØÜ×&Ñ&Ø˜HÑ$ô	ð ùò <s   ¦Ac                   óè  — e Zd Zej                  j                  d eej                  «       «      «      de	de
de
ddfd„«       Zej                  j                  d eej                  «       «      «      de	dede
de
ddf
d	„«       Zej                  j                  d eej                  «       «      «      de	de
de
ddfd
„«       Zej                  j                  d ee«      «      de	de
ddfd„«       Zy)ÚTestNewlyScopedSensitiveActions)rŽ   Úexpected_scoper,   rŽ   r2  r   Nc                 óN  — |j                   } ||«      }d}||u }|�st        j                  d|fd||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}}|j                  } ||«      }||k(  }|�s/t        j                  d	|fd
||f«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j
                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j
                  |«      rt        j                  |«      nddœz  }
dd|
iz  }t        t        j                  |«      «      ‚d x}x}}t        |   }||k(  }|s™t        j                  d	|fd||f«      t        j                  |«      dt        j                  «       v st        j
                  |«      rt        j                  |«      nddœz  }dd|iz  }t        t        j                  |«      «      ‚d x}}y )NTrI   )zW%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.has_scope_mapping
}(%(py3)s)
} is %(py8)sr,   rŽ   )r3   r4   r|   r5   rl   zassert %(py10)sÚpy10rV   )zS%(py5)s
{%(py5)s = %(py2)s
{%(py2)s = %(py0)s.require_scope
}(%(py3)s)
} == %(py7)sr2  )r3   r4   r|   r5   r7   rŠ   r‹   )z%(py1)s == %(py3)s)rX   r|   zassert %(py5)sr5   )rž   r9   r:   r;   r<   r=   r>   r?   r@   r�   r   )rA   r,   rŽ   r2  rB   rC   r¡   r�   rs   Ú@py_format11rF   r�   r^   r_   Ú@py_format4rE   s                   r#   Ú2test_action_reaches_scope_gate_with_required_scopezRTestNewlyScopedSensitiveActions.test_action_reaches_scope_gate_with_required_scopeB  sÄ  € ð ×(Ñ(Ð8Ñ(¨Ó0Ð8°DÐ8Ð0°DÐ8×8×8Ö8Ð0°D×8×8×8×8×8Ñ8ˆw×8×8Ó8ˆw×8×8Ô8Ð(×8×8×8×8×8Ð8¨×8×8Ó8¨×8×8Ô8Ð0×8×8Ò8°D×8×8×8×8×8×8Õ8Ø×$Ñ$Ð>Ñ$ VÓ,Ð>Ð,°Ñ>×>×>Ö>Ð,°×>×>×>×>×>Ñ>ˆw×>×>Ó>ˆw×>×>Ô>Ð$×>×>×>×>×>Ð> V×>×>Ó> V×>×>Ô>Ð,×>×>×>×>×>Ð>°×>×>Ó>°×>×>×>×>×>×>Õ>Ü(¨Ñ0ÐBÐ0°NÑB×B×BÕBÐ0°N×B×BÓBÐ0×B×B×B×B×BÐB°N×B×BÓB°N×B×B×B×B×B×BÔBr"   r/  c                 ó(  — |j                  ||«      }|j                  }t        j                  }||k(  }|söt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      dt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }	dd|	iz  }
t        t	        j                  |
«      «      ‚d x}x}}|j                  }||k(  }|sÚt	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      d	t        j                  «       v st	        j                  |«      rt	        j                  |«      nd	d
œz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}}|j                  }||v }|sÚt	        j
                  d|fd||f«      d	t        j                  «       v st	        j                  |«      rt	        j                  |«      nd	dt        j                  «       v st	        j                  |«      rt	        j                  |«      ndt	        j                  |«      d
œz  }dd|iz  }	t        t	        j                  |	«      «      ‚d x}}y )NrV   rw   ri   r   rj   rk   rl   ©z6%(py2)s
{%(py2)s = %(py0)s.scope_required
} == %(py4)sr2  rL   rN   rO   rx   )z.%(py0)s in %(py4)s
{%(py4)s = %(py2)s.reason
})rn   ro   r   r~   r9   r:   r;   r<   r=   r>   r?   r@   rô   r   )rA   r,   r/  rŽ   r2  ri   rB   rr   rD   rR   rs   rQ   s               r#   Ú+test_denied_when_agent_lacks_required_scopezKTestNewlyScopedSensitiveActions.test_denied_when_agent_lacks_required_scopeL  s¬  € ð ×!Ñ!Ð":¸FÓCˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ó9Ø×$Ñ$Ð6Ð$¨Ñ6×6×6Õ6Ð$¨×6×6×6×6×6Ñ6ˆv×6×6Ó6ˆv×6×6Ô6Ð$×6×6×6×6×6Ð6¨×6×6Ó6¨×6×6×6×6×6×6Ó6Ø!'§¡Ð.ˆ~ Ð.×.×.Õ.ˆ~ ×.×.×.×.×.Ñ.ˆ~×.×.Ó.ˆ~×.×.×.×.×.Ò. ×.×.Ó. ×.×.Ô. ×.×.×.×.×.×.Ò.r"   c                 ó  — t        ddt        j                  |h¬«      }|j                  ||«      }|j                  }t
        j                  }||k(  }|söt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  t
        «      rt        j                  t
        «      ndt        j                  |«      dœz  }	d	d
|	iz  }
t        t        j                  |
«      «      ‚d x}x}}|j                  }d}||u }|s­t        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}|j                   }||k(  }|sÚt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}}y )Nzagent-with-scoper   r   rV   r‰   ri   r   rj   rk   rl   TrI   r¸   r2   r6   r7   r9  r2  rL   rN   rO   )r
   r   r   rn   ro   r   rŒ   r9   r:   r;   r<   r=   r>   r?   r@   r¹   rô   )rA   r,   rŽ   r2  rà   ri   rB   rr   rD   rR   rs   rC   rE   rF   rQ   s                  r#   Ú6test_reaches_policy_and_approval_gate_when_scoped_heldzVTestNewlyScopedSensitiveActions.test_reaches_policy_and_approval_gate_when_scoped_held[  sÂ  € ô Ø'ØÜ"×*Ñ*Ø"Ð#ô	
ˆð ×!Ñ! %¨Ó0ˆØ�‰ÐEÔ"4×"EÑ"EÐEˆÐ"EÑE×E×EÕEˆÐ"E×E×E×E×E×EÑEˆv×E×EÓEˆv×E×EÔEˆ×E×E×E×E×EÐEÔ"4×E×EÓEÔ"4×E×EÔEÐ"E×E×E×E×E×E×EÓEØ×'Ñ'Ð/¨4Ð/Ð'¨4Ð/×/×/Õ/Ð'¨4×/×/×/×/×/Ñ/ˆv×/×/Ó/ˆv×/×/Ô/Ð'×/×/Ò/¨4×/×/×/×/×/×/Ó/Ø×$Ñ$Ð6Ð$¨Ñ6×6×6Õ6Ð$¨×6×6×6×6×6Ñ6ˆv×6×6Ó6ˆv×6×6Ô6Ð$×6×6×6×6×6Ð6¨×6×6Ó6¨×6×6×6×6×6×6Ô6r"   c                 ó2  — |j                   }d|j                  «       › d�} ||«      }t        |   }||k(  }|sÕt        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      ndt        j                  |«      t        j                  |«      t        j                  |«      t        j                  |«      dœz  }dd|iz  }	t        t        j                  |	«      «      ‚d x}x}x}x}}y )	Nz  ú rV   r˜   r,   r™   rš   r›   )r�   Úupperr'  r9   r:   r;   r<   r=   r>   r?   r@   )
rA   r,   rŽ   rB   rD   rr   r    r¡   r�   r¢   s
             r#   Ú2test_case_and_whitespace_variants_reach_same_scopezRTestNewlyScopedSensitiveActions.test_case_and_whitespace_variants_reach_same_scopeo  s  € ð ×$Ñ$ð 	
 r¨&¯,©,«.Ð)9¸Ð%;ð 	
Ñ$Ð%;Ó<ð 	
Ô@TØñA
ð 	
Ð<ð A
ñ 
÷ 	
ïé ó	
Ð<ð A
÷ 	
ò 	
ç	�6÷	
ò 	
ïé ð ÷ 	
ñ 	
ç 	�	ð ÷ 	
ò 	
ç 	�	ð %÷ 	
ð 	
ç 	�	ð &<÷ 	
ð 	
ç 	�	ð =÷ 	
ð 	
ç 	�	ðA
÷ 	
÷ 	
÷ 	
ñ 	
ïé ÷	
÷ 	
ô 	
r"   )rb   rc   rd   r«   r¬   r­   Úsortedr'  Úitemsr   r®   r7  r
   r:  r<  r@  r!   r"   r#   r1  r1  A  s_  „ Ø‡[�[×ÑØ$¡fÐ-A×-GÑ-GÓ-IÓ&JóðCØ(ðCØ25ðCØGJðCà	òCóðCð ‡[�[×ÑØ$¡fÐ-A×-GÑ-GÓ-IÓ&Jóð
/à"ð
/ð #0ð
/ð ð	
/ð
 ð
/ð 
ò
/óð
/ð ‡[�[×ÑØ$¡fÐ-A×-GÑ-GÓ-IÓ&Jóð7Ø(ð7Ø25ð7ØGJð7à	ò7óð7ð" ‡[�[×Ñ˜X¡vÐ.BÓ'CÓDð
Ø(ð
Ø25ð
à	ò
ó Eñ
r"   r1  c                   ó4   — e Zd Zdd„Zdd„Zdd„Zdd„Zdd„Zy)ÚTestVocabularyInvariantsNc                 óB  — t         D �ch c]  }|t        vr
|t        vr|’Œ }}t        «       }||k(  }|sât	        j
                  d|fd||f«      dt        j                  «       v st	        j                  |«      rt	        j                  |«      nddt        j                  «       v st	        j                  t        «      rt	        j                  t        «      ndt	        j                  |«      dœz  }dd|iz  }t        t	        j                  |«      «      ‚dx}}yc c}w )	zÕAn action can never be reachable-but-unregistered: everything the
        permission gateway can pass step 1 for is either scope-mapped or
        explicitly named safe, and every sensitive action is scope-mapped.rV   ©z)%(py0)s == %(py4)s
{%(py4)s = %(py2)s()
}Úunmappedr)  rL   rN   rO   N)r   r   r   r)  r9   r:   r;   r<   r=   r>   r?   r@   )rA   rŽ   rG  rD   rB   rQ   rR   s          r#   Ú/test_no_action_is_both_unregistered_and_allowedzHTestVocabularyInvariants.test_no_action_is_both_unregistered_and_allowedy  s³   € ô (ö
àØÔ6Ñ6¸6ÔI[Ñ;[ò ð
ˆð 
ô
 ›5Ð ˆx˜5Ñ × × Õ ˆx˜5× × × × × Ñ ˆx× × Ó ˆx× × × × × Ò œ3× × Ó œ3× × Ô ˜5× × × × × × Ò ùò
s   ‰Dc                 ód  — t         t        t        «      z
  }t        «       }||k(  }|�st        j                  d|fd||f«      dt        j                  «       v st        j                  |«      rt        j                  |«      nddt        j                  «       v st        j                  t        «      rt        j                  t        «      ndt        j                  |«      dœz  }t        j                  dt        |«      › �«      dz   d|iz  }t        t        j                  |«      «      ‚d x}}y )	NrV   rF  Úmissingr)  rL   z#sensitive actions without a scope: z
>assert %(py6)srO   )r   r)  r   r9   r:   r;   r<   r=   r>   Ú_format_assertmsgrA  r?   r@   )rA   rJ  rD   rB   rQ   rR   s         r#   Ú3test_every_sensitive_action_has_a_scope_requirementzLTestVocabularyInvariants.test_every_sensitive_action_has_a_scope_requirement„  s¡   € Ü#¤cÔ*CÓ&DÑDˆÜ›%ÐXˆw˜%Ñ×X×XÖXˆw˜%×X×X×X×X×XÑXˆw×X×XÓXˆw×X×X×X×X×XÒXœ#×X×XÓXœ#×X×XÔX˜%×X×X×XÐ#FÄvÈgÃÐFWÐ!X×X×X×X×X×X×Xr"   c                 óú  — h d£}t        |«      }t        |k(  }|�st        j                  d|fdt        |f«      dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      nddt	        j
                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      t        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}t        t        z  }t        «       }||k(  }|�s3t        j                  d|fd	||f«      dt	        j
                  «       v st        j                  t        «      rt        j                  t        «      ndd
t	        j
                  «       v st        j                  t        «      rt        j                  t        «      nd
dt	        j
                  «       v st        j                  t         «      rt        j                  t         «      ndt        j                  |«      dœz  }dd|iz  }t        t        j                  |«      «      ‚d x}x}}y )N>   Úcoder•   rn   rV   )z0%(py0)s == %(py6)s
{%(py6)s = %(py2)s(%(py4)s)
}r   Ú	frozensetrj   rk   rl   )z5(%(py0)s & %(py1)s) == %(py6)s
{%(py6)s = %(py4)s()
}r   )r3   rX   rM   rO   )rO  r   r9   r:   r;   r<   r=   r>   r?   r@   r   )rA   rD   rr   rB   rR   rs   r_   s          r#   Ú&test_known_safe_actions_is_not_widenedz?TestVocabularyInvariants.test_known_safe_actions_is_not_widenedˆ  sE  € ò 0LÐL¤YÐ/KÓ%LÐLÔ!Ð%LÑL×L×LÖLÔ!Ð%L×L×L×L×L×LÑLÔ!×L×LÓLÔ!×L×L×L×L×LÒL¤Y×L×LÓL¤Y×L×LÔLÐ/K×L×LÒLÐ%L×L×L×L×L×L×LÓLÜ!Ô$5Ñ5ÐD¼»ÐDÐ5¸ÑD×D×DÖDÐ5¸×D×D×D×D×DÑDÔ!×D×DÓDÔ!×D×D×D×D×DÒDÔ$5×D×DÓDÔ$5×D×D×D×D×DÒD¼×D×DÓD¼×D×DÔD¸×D×D×D×D×D×DÔDr"   c           	      ó¶  — t        t        t        j                  ¬«      «      }t	        ddt
        j                  t        D �ch c]  }|j                  ’Œ c}¬«      }t        j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}|_        |j                  |d«      }|j                  }t        j                  }||k(  }	|	söt!        j"                  d|	fd||f«      dt%        j&                  «       v st!        j(                  |«      rt!        j*                  |«      ndt!        j*                  |«      d	t%        j&                  «       v st!        j(                  t        «      rt!        j*                  t        «      nd	t!        j*                  |«      d
œz  }
dd|
iz  }t-        t!        j.                  |«      «      ‚dx}x}	}|j0                  }d}||u }	|	s­t!        j"                  d|	fd||f«      dt%        j&                  «       v st!        j(                  |«      rt!        j*                  |«      ndt!        j*                  |«      t!        j*                  |«      dœz  }dd|iz  }t-        t!        j.                  |«      «      ‚dx}x}	}d}|j2                  }||v }|s­t!        j"                  d|fd||f«      t!        j*                  |«      dt%        j&                  «       v st!        j(                  |«      rt!        j*                  |«      ndt!        j*                  |«      dœz  }dd|iz  }t-        t!        j.                  |«      «      ‚dx}x}}yc c}w c c}}w )zÐDocumented, deliberate denial: if a sensitive action ever loses its
        scope mapping again, it is denied with a reason that says exactly that,
        instead of being reported as an unknown action name.r)   r   r   r   r%  rV   rw   ri   r   rj   rk   rl   NrI   )z6%(py2)s
{%(py2)s = %(py0)s.scope_required
} is %(py5)sr2   r6   r7   z!has no identity scope requirementrx   rz   r{   )r   r   r   r+   r
   r   r   r   r+  r   rB  r]   rn   ro   r   r~   r9   r:   r;   r<   r=   r>   r?   r@   rô   r   )rA   r,   r-  rà   ÚkÚvri   rB   rr   rD   rR   rs   rC   rE   rF   r^   r_   s                    r#   Ú?test_sensitive_action_without_scope_is_denied_with_clear_reasonzXTestVocabularyInvariants.test_sensitive_action_without_scope_is_denied_with_clear_reasonŽ  s  € ô $¤L´j·o±oÔ$FÓGˆÜØØÜ"×*Ñ*Ü-<Ö= E�E—K“KÒ=ô	
ˆô 7×<Ñ<Ó>÷$
Ù�Q˜À!ÐGZÓBZˆAˆq‰Dó$
ˆÔ ð ×!Ñ! %Ð)<Ó=ˆØ�‰Ð9Ô"4×"9Ñ"9Ð9ˆÐ"9Ñ9×9×9Õ9ˆÐ"9×9×9×9×9×9Ñ9ˆv×9×9Ó9ˆv×9×9Ô9ˆ×9×9×9×9×9Ð9Ô"4×9×9Ó9Ô"4×9×9Ô9Ð"9×9×9×9×9×9×9Ó9Ø×$Ñ$Ð,¨Ð,Ð$¨Ð,×,×,Õ,Ð$¨×,×,×,×,×,Ñ,ˆv×,×,Ó,ˆv×,×,Ô,Ð$×,×,Ò,¨×,×,×,×,×,×,Ó,Ø2ÐC°f·m±mÐCÐ2°mÐC×C×CÕCÐ2°m×C×CÓCÐ2×C×C×C×C×CÐC°f×C×CÓC°f×C×CÔC°m×C×C×C×C×C×CÔCùò >ùó$
s   ÁMÁ4MÂMc                 ód  — t        «       }t        t        t        j                  ¬«      |¬«      }t        ddt        j                  t        j                  j                  h¬«      }t        j                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ c}}|_        |j                  }d} |||«      }|j                  }	t         j"                  }
|	|
k(  }|�sst%        j&                  d|fd|	|
f«      d	t)        j*                  «       v st%        j,                  |«      rt%        j.                  |«      nd	t%        j.                  |«      d
t)        j*                  «       v st%        j,                  |«      rt%        j.                  |«      nd
t%        j.                  |«      t%        j.                  |«      t%        j.                  |	«      dt)        j*                  «       v st%        j,                  t         «      rt%        j.                  t         «      ndt%        j.                  |
«      dœz  }dd|iz  }t1        t%        j2                  |«      «      ‚d x}x}x}x}	x}}
|j5                  t7        t8        j:                  ¬«      «      }d„ |D «       }t=        |«      }|s•ddt)        j*                  «       v st%        j,                  t<        «      rt%        j.                  t<        «      ndt%        j.                  |«      t%        j.                  |«      dœz  }t1        t%        j2                  |«      «      ‚d x}}y c c}}w )Nr)   rý   r   r   r   r&  rV   )z’%(py9)s
{%(py9)s = %(py7)s
{%(py7)s = %(py2)s
{%(py2)s = %(py0)s.evaluate
}(%(py3)s, %(py5)s)
}.decision
} == %(py13)s
{%(py13)s = %(py11)s.DENY
}r,   rà   r   )r3   r4   r|   r5   r7   r‹   r›   r¾   zassert %(py15)sÚpy15rþ   c              3   ó:   K  — | ]  }|j                   d k(  –— Œ y­w)Úunscoped_sensitive_actionNr  r  s     r#   r  zUTestVocabularyInvariants.test_sensitive_unscoped_denial_is_audited.<locals>.<genexpr>¯  s   è ø€ ÒK¸q�1—8‘8Ð:Õ:ÑKùr  r  r  rL   )r   r   r   r   r+   r
   r   r   r   ÚNETWORKr+  r   rB  r]   rn   ro   r   r~   r9   r:   r;   r<   r=   r>   r?   r@   r  r	   r   r  r  )rA   rù   r,   rà   rR  rS  rB   rC   r�   r    Ú@py_assert12rÊ   rÐ   Ú@py_format16ÚeventsrD   rQ   s                    r#   Ú)test_sensitive_unscoped_denial_is_auditedzBTestVocabularyInvariants.test_sensitive_unscoped_denial_is_audited¡  sû  € Ü“Jˆ	Ü#¤L´j·o±oÔ$FÐR[Ô\ˆÜØØÜ"×*Ñ*Ü#×+Ñ+×1Ñ1Ð2ô	
ˆô 7×<Ñ<Ó>÷$
Ù�Q˜À!À}ÓBTˆAˆq‰Dó$
ˆÔ ð ×ÑÐY }ÐYÑ  }Ó5ÐYÐ5×>Ñ>ÐYÔBT×BYÑBYÐYÐ>ÐBYÑY×Y×YÖYÐ>ÐBY×Y×Y×Y×Y×YÑYˆw×Y×YÓYˆw×Y×YÔYÐ×Y×Y×Y×Y×YÐY ×Y×YÓY ×Y×YÔY }×Y×YÒYÐ5×Y×YÒYÐ>×Y×Y×Y×Y×YÐYÔBT×Y×YÓYÔBT×Y×YÔYÐBY×Y×Y×Y×Y×Y×Y×YÑYØ—‘¤´~×7VÑ7VÔ!WÓXˆÙKÀFÔKÐKŒsÐKÓKÐKÑK×K×K×K×KÕKŒs×K×KÓKŒs×K×KÔKÐK×K×KÒKÐK×K×K×K×K×KÓKùó$
s   Á=L,ÂL,ra   )rb   rc   rd   rH  rL  rP  rT  r]  r!   r"   r#   rD  rD  x  s   „ ó	!óYóEóDô&Lr"   rD  )5Ú__doc__Úbuiltinsr;   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter9   r«   Ú#cyberbrain26.security_plane.actionsr   r   r   r   Ú!cyberbrain26.security_plane.auditr   r   r	   Ú$cyberbrain26.security_plane.identityr
   r   r   Ú&cyberbrain26.security_plane.permissionr   r   r   r   Ú"cyberbrain26.security_plane.policyr   r   r   r   Úfixturer$   r'   r,   r.   rf   r°   r¶   rÞ   rì   rù   rû   rY  r+  ÚSECRETSr'  Údictr®   Ú__annotations__r/  r1  rD  r!   r"   r#   ú<module>rl     sš  ðÚ "ç  „ ƒ÷ó ÷ SÑ R÷ñ ÷
ó ÷ó ð ‡�ð�}ò ó ðð ‡�ð˜ò ó ðð ‡�ðAÐ"ò Aó ðA÷Qñ Q÷ GAñ GA÷T:ñ :÷:ñ :÷B)ñ )÷20ñ 0ð. ‡�ð�8ò ó ð÷-;ñ -;ðn '×.Ñ.×4Ñ4Ø,×4Ñ4×:Ñ:Ø(×0Ñ0×6Ñ6Ø"×*Ñ*×0Ñ0ñ	(Ð �d˜3 ˜8‘nó ð ‡�ð	 -ò 	ó ð	÷4
ñ 4
÷n7Lò 7Lr"   