
    Vh                     Z    d dl mZ d dlmZ d dlmZ d dlmZ d Zd Zd Z	d Z
d	 Zdd
Zy)    )
cmp_to_key)to_text)binary_type)string_typesc                 r    | j                  d      r%| j                  d      r| j                  d      d   } | S )Nzarn:aws:iam::z:root:   )
startswithendswithsplit)arns    j/home/dcms/DCMS/lib/python3.12/site-packages/ansible_collections/amazon/aws/plugins/module_utils/policy.py_canonify_root_arnr   &   s2     ~~o&3<<+@iinQJ    c                      |dv r	| dk(  rddiS | S )zi
    Converts special cases where there are multiple ways to write the same thing into a single form
    )NotPrincipal	Principal*AWS )itemkeys     r   _canonify_policy_dict_itemr   .   s#     ++3;3<Kr   c                 <    t        | t              rt        |       S | S )N)
isinstancelisttuple)elements    r   _tuplify_listr   :   s    '4 W~Nr   c                 D   t        | t              r#t        t        |       j	                         g      S t        | t
              rt        t        |       g      S t        | t              r0| D ]*  }t        |g       }t        |      }|j                  |       , nt        | t              st        | t              rt        |       } t        |       } | gS t        | t              rit        | j                               }|j!                          |D ];  }t#        | |   |      }t        |g       }t        |      }|j                  ||f       = t%        |      dk(  rt        |d   t              r|d   }t        |t              r|j!                  t'        t(                     |S )a  
    Takes a policy and returns a list, the contents of which are all hashable and sorted.
    Example input policy:
    {'Version': '2012-10-17',
     'Statement': [{'Action': 's3:PutObjectAcl',
                    'Sid': 'AddCannedAcl2',
                    'Resource': 'arn:aws:s3:::test_policy/*',
                    'Effect': 'Allow',
                    'Principal': {'AWS': ['arn:aws:iam::XXXXXXXXXXXX:user/username1', 'arn:aws:iam::XXXXXXXXXXXX:user/username2']}
                   }]}
    Returned value:
    [('Statement',  ((('Action', ('s3:PutObjectAcl',)),
                      ('Effect', ('Allow',)),
                      ('Principal', ('AWS', (('arn:aws:iam::XXXXXXXXXXXX:user/username1',), ('arn:aws:iam::XXXXXXXXXXXX:user/username2',)))),
                      ('Resource', ('arn:aws:s3:::test_policy/*',)), ('Sid', ('AddCannedAcl2',)))),
     ('Version', ('2012-10-17',)))]

       r   )r   )r   boolr   strlowerintr   _hashable_policyr   appendr   r   r   r   dictkeyssortr   lenr   _py3cmp)policypolicy_listeachhashed_policy
tupleifiedsorted_keysr   r   s           r   r&   r&   @   si   ( &$c&k'')*++	FC	 c&k]##&$ 	+D,T26M&}5Jz*	+ 
FL	)Z-L#F+x	FD	!6;;=) 	2C0cBG,Wb9M&}5JZ01	2 ;1KNE!B!!n+t$Z01r   c                     	 | |kD  ry| |k  ryy# t         $ rT}t        |      j                  d      }t        |      j                  d      }d||fvr||k  rY d}~y||k  rY d}~y d}~ww xY w)zgPython 2 can sort lists of mixed types. Strings < tuples. Without this function this fails on Python 3.r!   r   r#   r   N)	TypeErrorr   find)abestr_indtup_inds        r   r,   r,   u   sz    q5U 
 !*//%(!*//'*gw'' 7"
s$     	A,?A'A'&A''A,c                 $   |rdt        | t              r"| j                         } | j                  d|       t        |t              r"|j                         }|j                  d|       t	        t        |g             t	        t        | g             k7  S )ztCompares the existing policy and the updated policy
    Returns True if there is a difference between policies.
    Version)r   r(   copy
setdefaultsetr&   )current_policy
new_policydefault_versions      r   compare_policiesrD      s{    
 nd++002N%%iAj$'#*J!!)_=
B/0C8HY[8\4]]]r   N)z
2008-10-17)	functoolsr   ansible.module_utils._textr   ansible.module_utils.sixr   r   r   r   r   r&   r,   rD   r   r   r   <module>rH      s3   > ! . 0 1	2j,^r   