| 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> |
|---|
| | 215 | Message: %(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> |
|---|
| 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 | |
|---|
| | 224 | def 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 |
|---|
| 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 |
|---|