
    BhP]                     "   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
 d dlmZ d dlmZmZmZmZmZmZ d dlmZmZ d d	lmZ d d
lmZ d dlmZ ddgZ G d de      Z edd       G d de             Z edd       G d de             Z y)    )get_user_model)AnonymousUserGroup)Site)override_settings)create_page)get_visible_page_contents)ACCESS_CHILDRENACCESS_DESCENDANTSACCESS_PAGEACCESS_PAGE_AND_CHILDRENACCESS_PAGE_AND_DESCENDANTSPage)GlobalPagePermissionPagePermission)CMSTestCase)user_can_view_page)	menu_poolViewPermissionTreeBugTests&ViewPermissionComplexMenuAllNodesTestsc                        e Zd ZdZdZdZdZdZdZ fdZ	 fdZ
d	 Zd
 Zd ZddZddZd Zd Zd Zd Zd ZddZddZddZ xZS )ViewPermissionTestsao  
    Test various combinations of view permissions pages and menus
    Focus on the different grant types and inheritance options of grant on
    Given the tree:

        |- Page_a
        |- Page_b
        | |- Page_b_a
        | |- Page_b_b
        | | |- Page_b_b_a
        | | | |- Page_b_b_a_a
        | | |- Page_b_b_b
        | | |- Page_b_b_c
        | |- Page_b_c
        | |- Page_b_d
        | | |- Page_b_d_a
        | | |- Page_b_d_b
        | | |- Page_b_d_c
        |- Page_c
        | |- Page_c_a
        | |- Page_c_b
        |- Page_d
        | |- Page_d_a
        | |- Page_d_b
        | |- Page_d_c
     group_b_ACCESS_PAGE_AND_CHILDRENgroup_b_b_ACCESS_CHILDREN#group_b_ACCESS_PAGE_AND_DESCENDANTSgroup_b_b_ACCESS_DESCENDANTSgroup_d_ACCESS_PAGEc                 b    t               | _        d| j                  _        t        |           y )N   )r   sitepksupersetUpself	__class__s    Q/home/dcms/DCMS/lib/python3.12/site-packages/cms/tests/test_menu_page_viewperm.pyr#   zViewPermissionTests.setUp:   s     F			    c                 "    t         |           y N)r"   tearDownr$   s    r'   r+   zViewPermissionTests.tearDown?   s    r(   c                    dddd}t        di |}|j                          t        di |}t        di |}t        d	i |}t        d
d|i|}t        dd|i|}t        dd|i|}t        dd|i|}	t        dd|i|}
t        dd|i|}t        dd|i|}t        dd|i|}t        dd|i|}t        dd|i|}t        dd|i|}t        dd|i|}t        dd|i|}t        dd|i|}t        dd|i|}t        dd|i|}t        dd|i|}|||||||	|
|||||||||||||g}g }|D ]!  }|j                  |j                                # |S )Nnav_playground.htmlenTtemplatelanguagein_navigationparent)page_a)page_b)page_c)page_d)page_b_a)page_b_b)
page_b_b_a)
page_b_b_b)
page_b_b_c)page_b_b_a_a)page_b_c)page_b_d)
page_b_d_a)
page_b_d_b)
page_b_d_c)page_c_a)page_c_b)page_d_a)page_d_b)page_d_c)page_d_d)r   set_as_homepageappendreload)r%   	stdkwargshomepager5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   pages	new_pagespages                             r'   _setup_tree_pagesz%ViewPermissionTests._setup_tree_pagesB   s   -!
	
 595  "333333F&FIFF&FIF LhL)L
 LhL)L
 LhL)L
"R*R	RF&FIFF&FIF LhL)L
 LhL)L
 LhL)L
F&FIFF&FIFF&FIFF&FIFF&FIFF&FIF +
0 	 	,DT[[]+	,r(   c                    dd| j                   fdd| j                   fdd| j                  fdd| j                  fdd| j                  fdd| j                  fd	d| j                  fd
d| j                  fdd| j                  fdd| j                  fdg}t               j                  j                         j                         }|D ]k  \  }}}| j                  ||      }|st        j                  j                  |      \  }}|j                  }	|	j                  |       |j                          m | j                  dt               j                  j                         j                         |z
         y)z>
        Setup a group for every grant on ACCESS TYPE
        user_1Tuser_1_nostaffFuser_2user_2_nostaffuser_3user_3_nostaffuser_4user_4_nostaffuser_5user_5_nostaff)
user_staffTNname   N)GROUPNAME_1GROUPNAME_2GROUPNAME_3GROUPNAME_4GROUPNAME_5r   objectsallcount_create_userr   get_or_createuser_setaddsaveassertEqual)
r%   userdatadefault_users_countusernameis_staff	groupnameusergroup_rk   s
             r'   _setup_user_groupsz&ViewPermissionTests._setup_user_groups   sh   
 tT--.ud&6&67tT--.ud&6&67tT--.ud&6&67tT--.ud&6&67tT--.ud&6&67&
 -.66::<BBD-5 	)Hh	$$Xx8D ==66I6Fq >>T"

	 	^-5599;AACFYYZr(   c                    d| j                   t        fd| j                  t        fd| j                  t
        fd| j                  t        fd| j                  t        fg}|D ]i  \  }}}t        j                  j                  |      }t        j                  j                  |      }t        j                  j                  d|||       k | j!                  dt        j                  j#                         j%                                | j!                  d	t&        j                  j#                         j%                                y
)zS
        Setup a view restriction with every type of the grant_on ACCESS_*
        r5   r9   r7   pagecontent_set__titlename__iexactTcan_viewru   rP   grant_on   r   N)ra   r   rb   r
   rc   r   rd   r   re   r   r   rf   getr   r   creatern   rg   rh   r   )r%   datatitlers   inheritrP   ru   s          r'   _setup_view_restrictionsz,ViewPermissionTests._setup_view_restrictions   s   
 t'')AB))?;t'')DE))+=>t''5
 *. 	c%E9g<<##5#ADMM%%9%=E""))4u4Za)b	c
 	N22668>>@A088<<>DDFGr(   c                 z    |s| j                   }|j                  |      }| j                  |j                  d       y )N   clientr   rn   status_coder%   urlr   responses       r'   assertPageFoundz#ViewPermissionTests.assertPageFound   1    [[F::c?--s3r(   c                 z    |s| j                   }|j                  |      }| j                  |j                  d       y )Ni  r   r   s       r'   assertPageNotFoundz&ViewPermissionTests.assertPageNotFound   r   r(   c                 :    | j                  t        ||             y r*   )
assertTruer   r%   rP   rt   s      r'   assertViewAllowedz%ViewPermissionTests.assertViewAllowed   s    *467r(   c                 :    | j                  t        ||             y r*   )assertFalser   r   s      r'   assertViewNotAllowedz(ViewPermissionTests.assertViewNotAllowed   s    +D$78r(   c                     | j                  ||      }t        j                  |      }|j                         }|j	                         }d}|D ]  }|j	                         |k(  sd} n | j                  |       y NFT)get_requestr   get_renderer	get_nodesget_absolute_urlr   	r%   rP   rt   requestmenu_renderernodes
target_urlfound_in_menunodes	            r'   assertInMenuz ViewPermissionTests.assertInMenu   s{    ""4.!..w7'')**,
 	D$$&*4 $	 	&r(   c                     | j                  ||      }t        j                  |      }|j                         }|j	                         }d}|D ]  }|j	                         |k(  sd} n | j                  |       y r   )r   r   r   r   r   r   r   s	            r'   assertNotInMenuz#ViewPermissionTests.assertNotInMenu   s}    ""4.!..w7'')**,
 	D$$&*4 $	 	'r(   c           
          |D ]<  }d}d}||v rd}||v rd}| j                  |xr | xs | xr |d| d| d|        > y)z
        test all visible page ids are either in_public and not in_restricted
        or not in_public and in_restricted
        FTzpage_id z in_public: z, in_restricted: )msgN)r   )r%   visible_page_idsrestricted_pagespublic_page_idspage_idin_restricted	in_publics          r'   assertNodeMembershipsz)ViewPermissionTests.assertNodeMemberships   sx    
 ( 
	G!MI** $/) 	OO0=0V)m6Uwi|I;>OP]_  
	r(   c                    d}|dt               j                  dk(  r|dz   }t               }||t               j                  dz   <    t               j                  j                  d	i |}| j                  |      }|D cg c]  }|j                          }}t        ||| j                        D 	cg c]  }	|	j                  j                   }
}	t        j                  j                  |      j                  dd      }| j                  t        |
      t        |             t        j                  j!                  |      j                  dd      }| j#                  |
||       yc c}w c c}	w )
z
        helper function to check the expected_granted_pages are
        not in the restricted_pages list and
        all visible pages are in the expected_granted_pages
        Nemailz@django-cms.org__iexact)pagecontent_set__title__inidT)flat )r   USERNAME_FIELDdictrf   r   r   get_content_objr	   r    rP   r!   r   filtervalues_listrn   lenexcluder   )r%   	all_pagesexpected_granted_pagesrq   rt   queryr   rP   all_contentpage_contentr   r   r   s                r'   assertGrantedVisibilityz+ViewPermissionTests.assertGrantedVisibility   sj    ..'9#&77FEBJE."11J>?/>#++//8%8D""4(:CD$t++-DD5NwXceienen5o
%1L  
 
 ,,--I_-`llt m 
 	-.4J0KL<<//Ka/bnnt o 
 	""#35EW E
s   >E)0E.c           
      ~    d}|r|j                         }|xs
 t               i i i i i ||i d	}t        dt        f|      S )N/)	rt   REQUESTCOOKIESMETAPOSTGETpath	path_infosessionRequest)r   r   typeobject)r%   rt   rP   r   attrss        r'   r   zViewPermissionTests.get_request  sT    ((*D+MO

 Iy%00r(   c                 N    |D ci c]  }|j                  |      | c}S c c}w )N)r1   )r   )r%   rN   r1   rP   s       r'   get_url_dictz ViewPermissionTests.get_url_dict  s)    KPQ4%%x%8$>QQQs   "r*   )NN)r.   )__name__
__module____qualname____doc__ra   rb   rc   rd   re   r#   r+   rQ   rw   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r&   s   @r'   r   r      ss    6 5K-K7K0K'K
=~[8H&4489
'
("X:1$Rr(   r   Trg   )CMS_PERMISSIONCMS_PUBLIC_FORc                   @    e Zd ZdZd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)r   zG
    Test CMS_PUBLIC_FOR=all group access and menu nodes rendering
    c                    | j                         }| j                         }|D cg c]  }|j                          }}t        ||| j                        }| j                  t        |      t        |             t        j                  |      }|j                         }| j                  t        |      t        |             yc c}w )z<
        All pages are visible to an anonymous user
        N)
rQ   r   r   r	   r    rn   r   r   r   r   )r%   r   r   rP   rg   visibler   r   s           r'   *test_public_pages_anonymous_norestrictionszQViewPermissionComplexMenuAllNodesTests.test_public_pages_anonymous_norestrictions'  s     **,	""$2;<$t##%<<+GS$))DS3w<0!..w7'')USX. =s   Cc                    | j                          | j                         }| j                          g d}| j                  ||       | j	                  |      }t               }| j                  ||d         }t        j                  |      }|j                         }| j                  t        |      d       | j                  |d   |       | j                  |d   |       | j                  |d   |       | j                  |d   |       | j                  |d   |       | j                  |d   |       | j                  |d   |       | j                  |d   |       y	)
z
        Anonymous user should only see the pages in the rendered menu
        that have no permissions assigned,directly or indirectly
        )r4   r6   rC   rD   rE   rF   rG   rH   z/en/   z/en/page_c/z/en/page_c/page_c_a/z/en/page_c/page_c_b//en/page_b//en/page_d/N)rw   rQ   r   r   r   r   r   r   r   r   rn   r   r   r   r   )r%   r   grantedurlsrt   r   r   r   s           r'   test_public_menu_anonymous_userzFViewPermissionComplexMenuAllNodesTests.test_public_menu_anonymous_user4  sG   
 	!**,	%%'n$$Y8  +""4f6!..w7'')UQ'$v,-$}-t4$56=$56=!!$}"5t<T-0$7!!$}"5t<T-0$7r(   c                    | j                          | j                         }| j                          g d}| j                  |      }t	               j
                  dk(  r%t	               j                  j                  d      }n$t	               j                  j                  d      }| j                  ||d       | j                  |d   |       | j                  |d   |       | j                  |d   |       | j                  |d   |       | j                  |d	   |       | j                  |d	   |       | j                  |d
   |       | j                  |d
   |       | j                  |d   |       | j                  |d   |       y)zi
        simulate behaviour of group b member
        group_b_ACCESS_PAGE_AND_CHILDREN to page_b
        )r4   r6   rC   rD   r5   r8   r9   r>   r?   rE   rF   rG   rH   r   zuser_1@django-cms.orgr   rS   rq   r   /en/page_b/page_b_b//en/page_b/page_b_b/page_b_b_a/r   /en/page_d/page_d_a/N)rw   rQ   r   r   r   r   rf   r   r   r   r   r   r   r%   r   r   r   rt   s        r'   *test_menu_access_page_and_children_group_1zQViewPermissionComplexMenuAllNodesTests.test_menu_access_page_and_children_group_1M  sz   
 	!**,	%%'
"   +**g5!#++//6M/ND!#++///BD$$Y($KtM2D9$}-t4t$:;TB$56=!!$'H"I4PT"CDdK!!$}"5t<T-0$7t$:;TBT"894@r(   c                 H   | j                          | j                         }| j                          g d}| j                  ||d       | j	                  |      }t               j                  dk(  r%t               j                  j                  d      }n$t               j                  j                  d      }| j                  |d   |       | j                  |d   |       | j                  |d	   |       | j                  |d
   |       | j                  |d   |       y)z|
        simulate behaviour of group 2 member
        GROUPNAME_2 = 'group_b_b_ACCESS_CHILDREN'
        to page_b_b
        )r4   r6   rC   rD   r:   r;   r<   rE   rF   rG   rH   rU   r   r   zuser_2@django-cms.orgr   r   r   z,/en/page_b/page_b_b/page_b_b_a/page_b_b_a_a/r   r   Nrw   rQ   r   r   r   r   r   rf   r   r   r   r   s        r'   !test_menu_access_children_group_2zHViewPermissionComplexMenuAllNodesTests.test_menu_access_children_group_2|  s    	!**,	%%'
 	$$Y($K  +**g5!#++//6M/ND!#++///BD!!$'=">Et$EFM!!$'U"VX\]!!$}"5t<t$:;TBr(   c                    | j                          | j                         }| j                          g d}| j                  ||d       | j	                  |      }t               j                  dk(  r%t               j                  j                  d      }n$t               j                  j                  d      }| j                  |d   |       | j                  |d   |       | j                  |d	   |       | j                  |d
   |       y)zl
        simulate behaviour of group 3 member
        group_b_ACCESS_PAGE_AND_DESCENDANTS to page_b
        )r4   r5   r8   r9   r:   r=   r;   r<   r>   r?   r@   rA   rB   r6   rC   rD   rE   rF   rG   rH   rW   r   r   zuser_3@django-cms.orgr   r   z/en/page_b/page_b_d/page_b_d_a/r   r   N)rw   rQ   r   r   r   r   r   rf   r   r   r   r   s        r'   -test_menu_access_page_and_descendants_group_3zTViewPermissionComplexMenuAllNodesTests.test_menu_access_page_and_descendants_group_3  s    
 	!**,	%%'
, 	$$Y($K  +**g5!#++//6M/ND!#++///BDtM2D9t$EFM!!$}"5t<t$:;TBr(   c                 H   | j                          | j                         }| j                          g d}| j                  ||d       | j	                  |      }t               j                  dk(  r%t               j                  j                  d      }n$t               j                  j                  d      }| j                  |d   |       | j                  |d   |       | j                  |d	   |       | j                  |d
   |       | j                  |d   |       y)zg
        simulate behaviour of group 4 member
        group_b_b_ACCESS_DESCENDANTS to page_b_b
        )r4   r:   r=   r;   r<   r6   rC   rD   rE   rF   rG   rH   rY   r   r   zuser_4@django-cms.orgr   r   r   r   r   r   Nr   r   s        r'   $test_menu_access_descendants_group_4zKViewPermissionComplexMenuAllNodesTests.test_menu_access_descendants_group_4  s   
 	!**,	%%'
 	$$Y($K  +**g5!#++//6M/ND!#++///BD!!$}"5t<!!$'=">Et$EFM!!$}"5t<t$:;TBr(   c                 H   | j                          | j                         }| j                          g d}| j                  ||d       | j	                  |      }t               j                  dk(  r%t               j                  j                  d      }n$t               j                  j                  d      }| j                  |d   |       | j                  |d   |       | j                  |d	   |       | j                  |d
   |       | j                  |d   |       y)z\
        simulate behaviour of group b member
        group_d_ACCESS_PAGE to page_d
        )	r4   r6   rC   rD   r7   rE   rF   rG   rH   r[   r   r   zuser_5@django-cms.orgr   r   r   r   r   r   Nr   r   s        r'   test_menu_access_page_group_5zDViewPermissionComplexMenuAllNodesTests.test_menu_access_page_group_5  s   
 	!**,	%%'

 	$$Y($K  +**g5!#++//6M/ND!#++///BD 	!!$}"5t<!!$'=">E!!$'H"I4PtM2D9t$:;TBr(   c                 x   | j                          | j                         }t        j                  j	                  d      }t
        j                  j	                  | j                        }t        j                  j                  d||       | j                  |      }| j                  |d   t                      y)zW
        PagePermissions with can_view=False shouldn't hide pages in the menu.
        r5   ry   r^   F)r~   ru   rP   r   N)rw   rQ   r   rf   r   r   ra   r   r   r   r   r   )r%   r   rP   ru   r   s        r'   $test_non_view_permission_doesnt_hidezKViewPermissionComplexMenuAllNodesTests.test_non_view_permission_doesnt_hide  s     	!**,	||x@!!t'7'7!8%%uE%M  +$}-}?r(   N)r   r   r   r   r   r   r   r   r   r   r   r   r   r(   r'   r   r     s:    
/82-A^#CJ)CV"CH CD
@r(   c                   ,    e Zd ZdZdZd Zd Zd Zd Zy)r   a!  Test issue 1113
    https://github.com/divio/django-cms/issues/1113
     Wrong view permission calculation in PagePermission.objects.for_page
     grant_on=ACCESS_PAGE_AND_CHILDREN or ACCESS_PAGE_AND_DESCENDANTS to page 6
     Test if this affects the menu entries and page visibility
    group_6_ACCESS_PAGEc                     dddd}t        di |}|j                          t        dd|i|}t        dd|i|}t        d	d|i|}t        d
d|i|}t        dd|i|}||||||gS )z
        Tree Structure
            |- Page_1
            |  |- Page_2
            |    |- Page_3
            |      |- Page_4 (false positive)
            |  |- Page_5
            |  |  |- Page_6 (group 6 page access)
        r-   r.   Tr/   r3   )page_1)page_2)page_3)page_4)page_5)page_6)r   rI   )r%   rL   rM   r   r  r  r  r  s           r'   _setup_pagesz'ViewPermissionTreeBugTests._setup_pages-  s     .!
	
 595  "DhD)DBfB	BBfB	BDhD)DBfB	B
 	
r(   c                     | j                  dd      }t        j                  j                  | j                        }|j
                  }|j                  |       |j                          y )Nuser_6Tr^   )ri   r   rf   r   GROUPNAME_6rk   rl   rm   )r%   rt   ru   rk   s       r'   _setup_userz&ViewPermissionTreeBugTests._setup_userL  sO      40$$$*:*:$;>>T

r(   c                 4   t         j                  j                  d      }t        j                  j                  | j                        }t
        j                  j                  d||t               t
        j                  j                  d||t               y)z<
        Setup group_6_ACCESS_PAGE view restriction
        r  ry   r{   Tr}   N)	r   rf   r   r   r  r   r   r   r   )r%   rP   ru   s      r'   _setup_permviewbugz-ViewPermissionTreeBugTests._setup_permviewbugS  st     ||x@!!t/?/?!@%%t5tVn%o%%t5tVq%rr(   c                    | j                         }| j                          | j                          |D ]  }t        j                  j                  |      }|j                         dk(  r| j                  t        |      d       Rd|j                         z  }| j                  t        |      d|        g d}| j                  |      }t               }| j                  ||       | j                  |d   |       | j                  |d   |       | j                  |d	   |       g d
}| j                  ||d       t               j                  dk(  r%t               j                  j!                  d      }n$t               j                  j!                  d      }d}| j                  ||   |       d	}| j                  ||   |       y )N)rP   r     zPermission wrong at page %sr   )r   r   r  r  r  z/en/page_2/page_3/page_4/z/en/page_5/z/en/page_5/page_6/)r   r   r  r  r  r  r  r   r   zuser_6@django-cms.orgr   )r  r	  r  r   rf   for_page	get_titlern   r   r   r   r   r   r   r   r   r   )	r%   r   rP   permr   r   r   rt   r   s	            r'   test_pageforbugz*ViewPermissionTreeBugTests.test_pageforbug\  s   %%'	! 	4D!))222=D~~8+  TA.3t~~7GH  TAs3	4
   +$$Y8t$?@$GtM2D9!!$';"<dC
 	$$Y($K**g5!#++//6M/ND!#++///BD)tCy$/"tCy$/r(   N)	r   r   r   r   r  r  r	  r  r  r   r(   r'   r   r     s#    
 (K
>s-0r(   N)!django.contrib.authr   django.contrib.auth.modelsr   r   django.contrib.sites.modelsr   django.test.utilsr   cms.apir   cms.cms_menusr	   
cms.modelsr
   r   r   r   r   r   cms.models.permissionmodelsr   r   cms.test_utils.testcasesr   cms.utils.page_permissionsr   menus.menu_poolr   __all__r   r   r   r   r(   r'   <module>r     s    . ; , /  3  M 0 9 %')Q
RCR+ CRL z@-@ z@	z@z f0!4 f0	f0r(   