ó
ø¢TQc           @   s™  d  d l  Z  d  d l Z d  d l 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 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 d  d l m Z d  d l m Z d  d l m  Z  m! Z! d  d l" m# Z# m$ Z$ m% Z% m& Z& d  d l' m( Z( e d d1 d d d e j) d e  j* j+ e  j* j, e e- ƒ ƒ d ƒ f d e. d d2 ƒ d e f d „  ƒ  Yƒ Z/ e( d e/ f d „  ƒ  Yƒ Z0 e( d  e/ f d! „  ƒ  Yƒ Z1 e d" d# ƒ d$ e/ f d% „  ƒ  Yƒ Z2 e( d& e/ f d' „  ƒ  Yƒ Z3 e( d( e/ f d) „  ƒ  Yƒ Z4 e( d* e/ f d+ „  ƒ  Yƒ Z5 e( d, e/ f d- „  ƒ  Yƒ Z6 e( d. e/ f d/ „  ƒ  Yƒ Z7 d S(3   iÿÿÿÿN(   t   global_settingst   settings(   t   Sitet   RequestSite(   t   User(   t   mail(   t   SuspiciousOperation(   t   reverset   NoReverseMatch(   t	   QueryDict(   t
   force_text(   t   escape(   t   urlquote(   t   upath(   t   TestCase(   t   override_settings(   t   SESSION_KEYt   REDIRECT_FIELD_NAME(   t   AuthenticationFormt   PasswordChangeFormt   SetPasswordFormt   PasswordResetForm(   t   skipIfCustomUsert	   LANGUAGESt   ent   Englisht   LANGUAGE_CODEt   TEMPLATE_LOADERSt   TEMPLATE_DIRSt	   templatest   USE_TZt   PASSWORD_HASHERSs.   django.contrib.auth.hashers.SHA1PasswordHashert   AuthViewsTestCasec           B   s2   e  Z d  Z d g Z d Z d d „ Z d „  Z RS(   s:   
    Helper base class for all the follow test cases.
    s   authtestdata.jsons   django.contrib.auth.tests.urlst   passwordc         C   sp   |  j  j d i d d 6| d 6ƒ } |  j | j d ƒ |  j | d j t j ƒ ƒ |  j t |  j  j	 k ƒ d  S(   Ns   /login/t
   testclientt   usernameR!   i.  t   Location(
   t   clientt   postt   assertEqualt   status_codet
   assertTruet   endswithR   t   LOGIN_REDIRECT_URLR   t   session(   t   selfR!   t   response(    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   login+   s    c         K   s   |  j  | t t | ƒ ƒ |  S(   N(   t   assertContainsR   R
   (   R-   R.   t   textt   kwargs(    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   assertContainsEscaped4   s    (   t   __name__t
   __module__t   __doc__t   fixturest   urlsR/   R3   (    (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR       s
   		t   AuthViewNamedURLTestsc           B   s   e  Z d  Z d „  Z RS(   s   django.contrib.auth.urlsc         C   sÑ   d g  i  f d g  i  f d g  i  f d g  i  f d g  i  f d g  i  f d g  i d d	 6d
 d 6f d g  i  f g } xV | D]N \ } } } y t  | d | d | ƒWq{ t k
 rÈ |  j d | ƒ q{ Xq{ Wd S(   s   Named URLs should be reversibleR/   t   logoutt   password_changet   password_change_donet   password_resett   password_reset_donet   password_reset_confirmt   aaaaaaat   uidb36s
   1111-aaaaat   tokent   password_reset_completet   argsR2   s5   Reversal of url named '%s' failed with NoReverseMatchN(   R   R   t   fail(   R-   t   expected_named_urlst   nameRD   R2   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_named_urls<   s    	
(   R4   R5   R8   RH   (    (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR9   8   s   t   PasswordResetTestc           B   s¿   e  Z d  „  Z d „  Z d „  Z e d d g ƒ d „  ƒ Z e d e ƒ d „  ƒ Z e d e ƒ d „  ƒ Z	 d	 „  Z
 d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   c         C   su   |  j  j d ƒ } |  j | j d ƒ |  j  j d i d d 6ƒ } |  j | t j d ƒ |  j t t	 j
 ƒ d ƒ d S(   sH   Error is raised if the provided email address isn't currently registereds   /password_reset/iÈ   s   not_a_real_email@email.comt   emailt   unknowni    N(   R%   t   getR'   R(   R&   R3   R   t   error_messagest   lenR   t   outbox(   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_email_not_foundU   s
    c         C   s†   |  j  j d i d d 6ƒ } |  j | j d ƒ |  j t t j ƒ d ƒ |  j d t j d j k ƒ |  j t	 j
 t j d j ƒ d S(	   sE   Email is sent if a valid email address is provided for password resets   /password_reset/s   staffmember@example.comRJ   i.  i   s   http://i    N(   R%   R&   R'   R(   RN   R   RO   R)   t   bodyR   t   DEFAULT_FROM_EMAILt
   from_email(   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_email_found]   s
    c         C   sf   |  j  j d i d d 6ƒ } |  j | j d ƒ |  j t t j ƒ d ƒ |  j d t j d j ƒ d S(   sk   Email is sent if a valid email address is provided for password reset when a custom from_email is provided.s   /password_reset_from_email/s   staffmember@example.comRJ   i.  i   i    N(   R%   R&   R'   R(   RN   R   RO   RS   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_email_found_custom_frome   s    t   ALLOWED_HOSTSs   adminsite.comc         C   sŒ   |  j  j d i d d 6d d ƒ} |  j | j d ƒ |  j t t j ƒ d ƒ |  j d t j d	 j k ƒ |  j t	 j
 t j d	 j ƒ d
 S(   sc   If the reset view is marked as being for admin, the HTTP_HOST header is used for a domain override.s   /admin_password_reset/s   staffmember@example.comRJ   t	   HTTP_HOSTs   adminsite.comi.  i   s   http://adminsite.comi    N(   R%   R&   R'   R(   RN   R   RO   R)   RQ   R   RR   RS   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_admin_resetl   s    	t   DEBUG_PROPAGATE_EXCEPTIONSc      	   C   sS   |  j  t ƒ % |  j j d i d d 6d d ƒWd QX|  j t t j ƒ d ƒ d S(   s9   Poisoned HTTP_HOST headers can't be used for reset emailss   /password_reset/s   staffmember@example.comRJ   RW   s$   www.example:dr.frankenstein@evil.tldNi    (   t   assertRaisesR   R%   R&   R'   RN   R   RO   (   R-   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_poisoned_http_hosty   s
    
c      	   C   sS   |  j  t ƒ % |  j j d i d d 6d d ƒWd QX|  j t t j ƒ d ƒ d S(   sH   Poisoned HTTP_HOST headers can't be used for reset emails on admin viewss   /admin_password_reset/s   staffmember@example.comRJ   RW   s$   www.example:dr.frankenstein@evil.tldNi    (   RZ   R   R%   R&   R'   RN   R   RO   (   R-   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt"   test_poisoned_http_host_admin_site‹   s
    c         C   s\   |  j  j d i d d 6ƒ } |  j | j d ƒ |  j t t j ƒ d ƒ |  j t j d ƒ S(   Ns   /password_reset/s   staffmember@example.comRJ   i.  i   i    (   R%   R&   R'   R(   RN   R   RO   t   _read_signup_email(   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   _test_confirm_start•   s    c         C   sE   t  j d | j ƒ } |  j | d  k	 d ƒ | j ƒ  | j ƒ  d f S(   Ns   https?://[^/]*(/.*reset/\S*)s   No URL found in sent emaili    (   t   ret   searchRQ   R)   t   Nonet   groupt   groups(   R-   RJ   t   urlmatch(    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR]   œ   s    c         C   s8   |  j  ƒ  \ } } |  j j | ƒ } |  j | d ƒ d  S(   Ns   Please enter your new password(   R^   R%   RL   R0   (   R-   t   urlt   pathR.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_confirm_valid¡   s    c         C   sN   |  j  ƒ  \ } } | d  d | d } |  j j | ƒ } |  j | d ƒ d  S(   Niûÿÿÿt   0i   iÿÿÿÿs#   The password reset link was invalidt   0000(   R^   R%   RL   R0   (   R-   Re   Rf   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_confirm_invalid§   s    c         C   s&   |  j  j d ƒ } |  j | d ƒ d  S(   Ns   /reset/123456-1-1/s#   The password reset link was invalid(   R%   RL   R0   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_confirm_invalid_user°   s    c         C   s&   |  j  j d ƒ } |  j | d ƒ d  S(   Ns   /reset/zzzzzzzzzzzzz-1-1/s#   The password reset link was invalid(   R%   RL   R0   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_confirm_overflow_userµ   s    c         C   sy   |  j  ƒ  \ } } | d  d | d } |  j j | i d d 6d d 6ƒ t j j d	 d
 ƒ } |  j | j d ƒ ƒ d  S(   NiûÿÿÿRh   i   iÿÿÿÿt   anewpasswordt   new_password1s    anewpasswordt   new_password2RJ   s   staffmember@example.comRi   (   R^   R%   R&   R   t   objectsRL   R)   t   check_password(   R-   Re   Rf   t   u(    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_confirm_invalid_postº   s    c         C   s™   |  j  ƒ  \ } } |  j j | i d d 6d d 6ƒ } |  j | j d ƒ t j j d d ƒ } |  j | j	 d ƒ ƒ |  j j | ƒ } |  j
 | d ƒ d  S(   NRm   Rn   Ro   i.  RJ   s   staffmember@example.coms#   The password reset link was invalid(   R^   R%   R&   R'   R(   R   Rp   RL   R)   Rq   R0   (   R-   Re   Rf   R.   Rr   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_confirm_completeÈ   s    c         C   sP   |  j  ƒ  \ } } |  j j | i d d 6d d 6ƒ } |  j | t j d ƒ d  S(   NRm   Rn   t   xRo   t   password_mismatch(   R^   R%   R&   R3   R   RM   (   R-   Re   Rf   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt    test_confirm_different_passwordsÖ   s    (   R4   R5   RP   RT   RU   R   RX   t   TrueR[   R\   R^   R]   Rg   Rj   Rk   Rl   Rs   Rt   Rw   (    (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyRI   R   s   			
									t   AUTH_USER_MODELs   auth.CustomUsert   CustomUserPasswordResetTestc           B   s,   e  Z d  g Z d „  Z d „  Z d „  Z RS(   s   custom_user.jsonc         C   s\   |  j  j d i d d 6ƒ } |  j | j d ƒ |  j t t j ƒ d ƒ |  j t j d ƒ S(   Ns   /password_reset/s   staffmember@example.comRJ   i.  i   i    (   R%   R&   R'   R(   RN   R   RO   R]   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR^   á   s    c         C   sE   t  j d | j ƒ } |  j | d  k	 d ƒ | j ƒ  | j ƒ  d f S(   Ns   https?://[^/]*(/.*reset/\S*)s   No URL found in sent emaili    (   R_   R`   RQ   R)   Ra   Rb   Rc   (   R-   RJ   Rd   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR]   è   s    c         C   s8   |  j  ƒ  \ } } |  j j | ƒ } |  j | d ƒ d  S(   Ns   Please enter your new password(   R^   R%   RL   R0   (   R-   Re   Rf   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_confirm_valid_custom_userí   s    (   R4   R5   R7   R^   R]   R{   (    (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyRz   Ý   s   			t   ChangePasswordTestc           B   sJ   e  Z d  d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   R!   c         C   sX   |  j  j d i d d 6| d 6ƒ } |  j | t j d i t j j d ƒ j d 6ƒ d  S(   Ns   /login/R"   R#   R!   t   invalid_login(	   R%   R&   R3   R   RM   R   t   _metat	   get_fieldt   verbose_name(   R-   R!   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt
   fail_login÷   s
    c         C   s   |  j  j d ƒ } d  S(   Ns   /logout/(   R%   RL   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR:      s    c         C   sO   |  j  ƒ  |  j j d i d d 6d d 6d d 6ƒ } |  j | t j d ƒ d  S(   Ns   /password_change/t   donutst   old_passwordt	   password1Rn   Ro   t   password_incorrect(   R/   R%   R&   R3   R   RM   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt4   test_password_change_fails_with_invalid_old_password  s    
c         C   sO   |  j  ƒ  |  j j d i d d 6d d 6d d 6ƒ } |  j | t j d ƒ d  S(	   Ns   /password_change/R!   Rƒ   R„   Rn   R‚   Ro   Rv   (   R/   R%   R&   R3   R   RM   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt4   test_password_change_fails_with_mismatched_passwords  s    
c         C   s   |  j  ƒ  |  j j d i d d 6d d 6d d 6ƒ } |  j | j d ƒ |  j | d j d	 ƒ ƒ |  j ƒ  |  j  d d ƒ d  S(
   Ns   /password_change/R!   Rƒ   R„   Rn   Ro   i.  R$   s   /password_change/done/(   R/   R%   R&   R'   R(   R)   R*   R   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_password_change_succeeds  s    

c         C   se   |  j  ƒ  |  j j d i d d 6d d 6d d 6ƒ } |  j | j d ƒ |  j | d j d	 ƒ ƒ d  S(
   Ns   /password_change/R!   Rƒ   R„   Rn   Ro   i.  R$   s   /password_change/done/(   R/   R%   R&   R'   R(   R)   R*   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt"   test_password_change_done_succeeds!  s    
c         C   s\   |  j  d d ƒ D |  j j d ƒ } |  j | j d ƒ |  j | d j d ƒ ƒ Wd  QXd  S(   Nt	   LOGIN_URLs   /login/s   /password_change/done/i.  R$   s#   /login/?next=/password_change/done/(   R   R%   RL   R'   R(   R)   R*   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_password_change_done_fails+  s    (	   R4   R5   R   R:   R†   R‡   Rˆ   R‰   R‹   (    (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR|   ô   s   								
t	   LoginTestc           B   s   e  Z d  „  Z d d „ Z RS(   c         C   sµ   |  j  j t d ƒ ƒ } |  j | j d ƒ t j j rz t j j	 ƒ  } |  j | j
 d | ƒ |  j | j
 d | j ƒ n |  j | j
 d t ƒ |  j t | j
 d t ƒ d ƒ d  S(   Ns   django.contrib.auth.views.loginiÈ   t   sitet	   site_namet   forms'   Login form is not an AuthenticationForm(   R%   RL   R   R'   R(   R   R~   t	   installedRp   t   get_currentt   contextRG   t   assertIsInstanceR   R)   t
   isinstanceR   (   R-   R.   R   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt(   test_current_site_in_context_after_login5  s    R!   c         C   s$  t  d ƒ } x‡ d D] } d i | d 6t d 6t | ƒ d	 6} |  j j | i d
 d 6| d 6ƒ } |  j | j d ƒ |  j | | d k d | ƒ q Wx‡ d D] } d i | d 6t d 6t | ƒ d 6} |  j j | i d
 d 6| d 6ƒ } |  j | j d ƒ |  j | | d k d | ƒ q Wd  S(   Ns   django.contrib.auth.views.logins   http://example.coms   https://example.coms   ftp://exampel.coms   //example.coms   %(url)s?%(next)s=%(bad_url)sRe   t   nextt   bad_urlR"   R#   R!   i.  R$   s   %s should be blockeds   /view/?param=http://example.coms    /view/?param=https://example.coms   /view?param=ftp://exampel.coms   view/?param=//example.coms	   https:///s   //testserver/s   /url%20with%20spaces/s   %(url)s?%(next)s=%(good_url)st   good_urls   %s should be allowed(   s   http://example.coms   https://example.coms   ftp://exampel.coms   //example.com(   s   /view/?param=http://example.coms    /view/?param=https://example.coms   /view?param=ftp://exampel.coms   view/?param=//example.coms	   https:///s   //testserver/s   /url%20with%20spaces/(	   R   R   R   R%   R&   R'   R(   t   assertFalseR)   (   R-   R!   t	   login_urlR—   t	   nasty_urlR.   R˜   t   safe_url(    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_security_checkA  s@      
     
(   R4   R5   R•   R   (    (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyRŒ   2  s   	t   LoginURLSettingsc           B   sP   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C   s#   t  t |  ƒ j ƒ  t j |  _ d  S(   N(   t   superRž   t   setUpR   RŠ   t   old_LOGIN_URL(   R-   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR    p  s    c         C   s#   t  t |  ƒ j ƒ  |  j t _ d  S(   N(   RŸ   Rž   t   tearDownR¡   R   RŠ   (   R-   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR¢   t  s    c         C   s6   | t  _ |  j j d ƒ } |  j | j d ƒ | d S(   Ns   /login_required/i.  R$   (   R   RŠ   R%   RL   R'   R(   (   R-   Rš   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   get_login_required_urlx  s    	c         C   sX   d } |  j  | ƒ } t d d t ƒ} d | d <|  j | d | | j d ƒ f ƒ d  S(   Ns   /login/t    t   mutables   /login_required/R–   s   http://testserver%s?%st   /(   R£   R	   Rx   R'   t	   urlencode(   R-   Rš   t   login_required_urlt   querystring(    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_standard_login_url~  s    
c         C   sX   d } |  j  | ƒ } t d d t ƒ} d | d <|  j | d | | j d ƒ f ƒ d  S(   Ns   http://remote.example.com/loginR¤   R¥   s!   http://testserver/login_required/R–   s   %s?%sR¦   (   R£   R	   Rx   R'   R§   (   R-   Rš   R¨   R©   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_remote_login_url†  s    
	c         C   sX   d } |  j  | ƒ } t d d t ƒ} d | d <|  j | d | | j d ƒ f ƒ d  S(   Ns   https:///login/R¤   R¥   s!   http://testserver/login_required/R–   s   %s?%sR¦   (   R£   R	   Rx   R'   R§   (   R-   Rš   R¨   R©   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_https_login_urlŽ  s    
	c         C   sR   d } |  j  | ƒ } t d d t ƒ} d | d <|  j | d | j d ƒ ƒ d  S(   Ns   /login/?pretty=1s   pretty=1R¥   s   /login_required/R–   s   http://testserver/login/?%sR¦   (   R£   R	   Rx   R'   R§   (   R-   Rš   R¨   R©   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_login_url_with_querystring–  s    
c         C   s\   d } |  j  d | ƒ } t d d t ƒ} d | d <|  j | d | | j d ƒ f ƒ d  S(	   Ns    http://remote.example.com/login/s   %s?next=/default/R¤   R¥   s!   http://testserver/login_required/R–   s   %s?%sR¦   (   R£   R	   Rx   R'   R§   (   R-   Rš   R¨   R©   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt+   test_remote_login_url_with_next_querystringž  s    	

(
   R4   R5   R    R¢   R£   Rª   R«   R¬   R­   R®   (    (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyRž   m  s   							t
   LogoutTestc           B   sS   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z	 RS(	   c         C   s   |  j  t |  j j k ƒ d  S(   N(   R)   R   R%   R,   (   R-   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   confirm_logged_out«  s    c         C   s:   |  j  ƒ  |  j j d ƒ } |  j | d ƒ |  j ƒ  d S(   s<   Logout without next_page option renders the default templates   /logout/s
   Logged outN(   R/   R%   RL   R0   R°   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   test_logout_default®  s    
c         C   s6   |  j  ƒ  |  j j d ƒ } |  j d | j k ƒ d  S(   Ns   /logout/R   (   R/   R%   RL   R)   R’   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt
   test_14377µ  s    
c         C   s–   |  j  ƒ  |  j j d ƒ } |  j | j d ƒ |  j | d j d ƒ ƒ |  j j d ƒ } |  j | j d ƒ |  j | d j d ƒ ƒ |  j ƒ  d  S(   Ns   /logout/next_page/i.  R$   s   /somewhere/s   /logout/next_page/?next=/login/s   /login/(   R/   R%   RL   R'   R(   R)   R*   R°   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt(   test_logout_with_overridden_redirect_url»  s    
c         C   sW   |  j  ƒ  |  j j d ƒ } |  j | j d ƒ |  j | d j d ƒ ƒ |  j ƒ  d S(   sB   Logout with next_page option given redirects to specified resources   /logout/next_page/i.  R$   s   /somewhere/N(   R/   R%   RL   R'   R(   R)   R*   R°   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt$   test_logout_with_next_page_specifiedÈ  s
    
c         C   sW   |  j  ƒ  |  j j d ƒ } |  j | j d ƒ |  j | d j d ƒ ƒ |  j ƒ  d S(   s8   Logout with query string redirects to specified resources   /logout/?next=/login/i.  R$   s   /login/N(   R/   R%   RL   R'   R(   R)   R*   R°   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt"   test_logout_with_redirect_argumentÐ  s
    
c         C   sW   |  j  ƒ  |  j j d ƒ } |  j | j d ƒ |  j | d j d ƒ ƒ |  j ƒ  d S(   s?   Logout with custom query string redirects to specified resources(   /logout/custom_query/?follow=/somewhere/i.  R$   s   /somewhere/N(   R/   R%   RL   R'   R(   R)   R*   R°   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt)   test_logout_with_custom_redirect_argumentØ  s
    
R!   c         C   s*  t  d ƒ } xŠ d D]‚ } d i | d 6t d 6t | ƒ d	 6} |  j ƒ  |  j j | ƒ } |  j | j d
 ƒ |  j | | d k d | ƒ |  j	 ƒ  q WxŠ d D]‚ } d i | d 6t d 6t | ƒ d 6} |  j ƒ  |  j j | ƒ } |  j | j d
 ƒ |  j
 | | d k d | ƒ |  j	 ƒ  q  Wd  S(   Ns    django.contrib.auth.views.logouts   http://example.coms   https://example.coms   ftp://exampel.coms   //example.coms   %(url)s?%(next)s=%(bad_url)sRe   R–   R—   i.  R$   s   %s should be blockeds   /view/?param=http://example.coms    /view/?param=https://example.coms   /view?param=ftp://exampel.coms   view/?param=//example.coms	   https:///s   //testserver/s   /url%20with%20spaces/s   %(url)s?%(next)s=%(good_url)sR˜   s   %s should be allowed(   s   http://example.coms   https://example.coms   ftp://exampel.coms   //example.com(   s   /view/?param=http://example.coms    /view/?param=https://example.coms   /view?param=ftp://exampel.coms   view/?param=//example.coms	   https:///s   //testserver/s   /url%20with%20spaces/(   R   R   R   R/   R%   RL   R'   R(   R™   R°   R)   (   R-   R!   t
   logout_urlR—   R›   R.   R˜   Rœ   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR   à  s@      

     

(
   R4   R5   R°   R±   R²   R³   R´   Rµ   R¶   R   (    (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR¯   ¨  s   							t   ChangelistTestsc           B   s   e  Z d  Z d „  Z RS(   s$   django.contrib.auth.tests.urls_adminc         C   s[   t  j j d d ƒ j d t d t ƒ |  j ƒ  |  j t ƒ  |  j j	 d ƒ } Wd  QXd  S(   NR#   R"   t   is_stafft   is_superusers,   /admin/auth/user/?password__startswith=sha1$(
   R   Rp   t   filtert   updateRx   R/   RZ   R   R%   RL   (   R-   R.   (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt*   test_changelist_disallows_password_lookups  s    %
(   R4   R5   R8   R½   (    (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyR¸     s   (   R   R   (   (   R   R   (   s.   django.contrib.auth.hashers.SHA1PasswordHasher(8   t   osR_   t   django.confR    R   t   django.contrib.sites.modelsR   R   t   django.contrib.auth.modelsR   t   django.coreR   t   django.core.exceptionsR   t   django.core.urlresolversR   R   t   django.httpR	   t   django.utils.encodingR
   t   django.utils.htmlR   t   django.utils.httpR   t   django.utils._osR   t   django.testR   t   django.test.utilsR   t   django.contrib.authR   R   t   django.contrib.auth.formsR   R   R   R   t   django.contrib.auth.tests.utilsR   R   Rf   t   joint   dirnamet   __file__t   FalseR    R9   RI   Rz   R|   RŒ   Rž   R¯   R¸   (    (    (    s8   ../Django//lib/python/django/contrib/auth/tests/views.pyt   <module>   sR   "	*	Š=::_