Download Install Tutorial Docs FAQ Tools WikiLicense Team IRC Planet Involvement Shop Book

Changeset 1068

Show
Ignore:
Timestamp:
04/24/06 19:13:25
Author:
fumanchu
Message:

Fixed session auth for new tool API.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/cherrypy/lib/cptools.py

    r1051 r1068  
    212212 
    213213 
    214 class SessionAuthenticator: 
    215      
    216     login_screen = """<html><body> 
    217     Message: %(error_msg)s 
    218     <form method="post" action="do_login"> 
    219         Login: <input type="text" name="login" value="%(login)s" size="10" /><br /> 
    220         Password: <input type="password" name="password" size="10" /><br /> 
    221         <input type="hidden" name="from_page" value="%(from_page)s" /><br /> 
    222         <input type="submit" /> 
    223     </form> 
     214_login_screen = """<html><body> 
     215Message: %(error_msg)s 
     216<form method="post" action="do_login"> 
     217    Login: <input type="text" name="login" value="%(login)s" size="10" /><br /> 
     218    Password: <input type="password" name="password" size="10" /><br /> 
     219    <input type="hidden" name="from_page" value="%(from_page)s" /><br /> 
     220    <input type="submit" /> 
     221</form> 
    224222</body></html>""" 
    225      
    226     def __call__(check_login_and_password, not_logged_in, 
    227                  load_user_by_username, session_key = 'username', 
    228                  on_login = None, on_logout = None, 
    229                  login_screen = None): 
     223 
     224def session_auth(check_login_and_password=None, not_logged_in=None, 
     225                 load_user_by_username=None, session_key = 'username', 
     226                 on_login = None, on_logout = None, login_screen = None): 
     227     
     228    if login_screen is None: 
     229        login_screen = _login_screen 
     230     
     231    request = cherrypy.request 
     232    tdata = cherrypy.thread_data 
     233    sess = getattr(cherrypy, "session", None) 
     234    if sess is None: 
     235        # Shouldn't this raise an error (if the session filter isn't enabled)? 
     236        return False 
     237     
     238    request.user = None 
     239    tdata.user = None 
     240     
     241##    conf = cherrypy.config.get 
     242##    if conf('static_filter.on', False): 
     243##        return 
     244    if request.path.endswith('login_screen'): 
     245        return False 
     246    elif request.path.endswith('do_logout'): 
     247        login = sess.get(session_key) 
     248        sess[session_key] = None 
     249        request.user = None 
     250        tdata.user = None 
     251        if login and on_logout: 
     252            on_logout(login) 
     253        from_page = request.params.get('from_page', '..') 
     254        raise cherrypy.HTTPRedirect(from_page) 
     255    elif request.path.endswith('do_login'): 
     256        from_page = request.params.get('from_page', '..') 
     257        login = request.params['login'] 
     258        password = request.params['password'] 
     259        error_msg = check_login_and_password(login, password) 
     260        if error_msg: 
     261            kw = {"from_page": from_page, 
     262                  "login": login, "error_msg": error_msg} 
     263            cherrypy.response.body = login_screen % kw 
     264            return True 
    230265         
    231         if login_screen is None: 
    232             login_screen = self.login_screen 
    233          
    234         cherrypy.request.user = None 
    235         cherrypy.thread_data.user = None 
    236          
    237         conf = cherrypy.config.get 
    238         if conf('static_filter.on', False): 
    239             return 
    240         if cherrypy.request.path.endswith('login_screen'): 
    241             return 
    242         elif cherrypy.request.path.endswith('do_logout'): 
    243             login = cherrypy.session.get(session_key) 
    244             cherrypy.session[session_key] = None 
    245             cherrypy.request.user = None 
    246             cherrypy.thread_data.user = None 
    247             if login and on_logout: 
    248                 on_logout(login) 
    249             from_page = cherrypy.request.params.get('from_page', '..') 
    250             raise cherrypy.HTTPRedirect(from_page) 
    251         elif cherrypy.request.path.endswith('do_login'): 
    252             from_page = cherrypy.request.params.get('from_page', '..') 
    253             login = cherrypy.request.params['login'] 
    254             password = cherrypy.request.params['password'] 
    255             error_msg = check_login_and_password(login, password) 
    256             if error_msg: 
    257                 kw = {"from_page": from_page, 
    258                       "login": login, "error_msg": error_msg} 
    259                 cherrypy.response.body = login_screen % kw 
    260                 cherrypy.request.execute_main = False 
    261             else: 
    262                 cherrypy.session[session_key] = login 
    263                 if on_login: 
    264                     on_login(login) 
    265                 if not from_page: 
    266                     from_page = '/' 
    267                 raise cherrypy.HTTPRedirect(from_page) 
    268             return 
    269  
    270         # Check if user is logged in 
    271         temp_user = None 
    272         if (not cherrypy.session.get(session_key)) and not_logged_in: 
    273             # Call not_logged_in so that applications where anynymous user 
    274             #   is OK can handle it 
    275             temp_user = not_logged_in() 
    276         if (not cherrypy.session.get(session_key)) and not temp_user: 
    277             kw = {"from_page": cherrypy.request.browser_url, 
    278                   "login": "", "error_msg": ""} 
    279             cherrypy.response.body = login_screen % kw 
    280             cherrypy.request.execute_main = False 
    281             return 
    282          
    283         # Everything is OK: user is logged in 
    284         if load_user_by_username and not cherrypy.thread_data.user: 
    285             username = temp_user or cherrypy.session[session_key] 
    286             cherrypy.request.user = load_user_by_username(username) 
    287             cherrypy.thread_data.user = cherrypy.request.user 
    288  
     266        sess[session_key] = login 
     267        if on_login: 
     268            on_login(login) 
     269        raise cherrypy.HTTPRedirect(from_page or "/") 
     270     
     271    # Check if user is logged in 
     272    temp_user = None 
     273    if (not sess.get(session_key)) and not_logged_in: 
     274        # Call not_logged_in so that applications where anonymous user 
     275        #   is OK can handle it 
     276        temp_user = not_logged_in() 
     277    if (not sess.get(session_key)) and not temp_user: 
     278        kw = {"from_page": request.browser_url, "login": "", "error_msg": ""} 
     279        cherrypy.response.body = login_screen % kw 
     280        return True 
     281     
     282    # Everything is OK: user is logged in 
     283    if load_user_by_username and not tdata.user: 
     284        username = temp_user or sess[session_key] 
     285        request.user = load_user_by_username(username) 
     286        tdata.user = request.user 
     287     
     288    return False 
    289289 
    290290def virtual_host(use_x_forwarded_host=True, **domains): 
  • trunk/cherrypy/test/test_sessionauthenticate_filter.py

    r1017 r1068  
    1212    cherrypy.root = Test() 
    1313     
     14    def check(login, password): 
     15        # Dummy check_login_and_password function 
     16        if login != 'login' or password != 'password': 
     17            return u'Wrong login/password' 
     18     
    1419    cherrypy.config.update({ 
    1520            'server.log_to_screen': False, 
    1621            'server.environment': 'production', 
    17             'session_filter.on': True, 
    18             '/': {'session_authenticate_filter.on':True}, 
     22            'tools.sessions.on': True, 
     23            '/': { 
     24                'tools.session_auth.on': True, 
     25                'tools.session_auth.check_login_and_password': check, 
     26                }, 
    1927            }) 
    2028 

Hosted by WebFaction

Log in as guest/cpguest to create tickets