From 13a58ef5cb599d3e8e3a9484bd84fa6fae3f3390 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Fri, 13 Dec 2013 21:56:52 -0500 Subject: [PATCH] Add page class handler This also adds support for sessions and a somewhat custom page dispatcher. Signed-off-by: Simo Sorce --- examples/ipsilon.conf | 6 +++++ src/ipsilon.py | 4 +++- src/root.py | 15 ++++-------- src/util/page.py | 53 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 12 deletions(-) create mode 100755 src/util/page.py diff --git a/examples/ipsilon.conf b/examples/ipsilon.conf index 17cf5e9..cca7786 100644 --- a/examples/ipsilon.conf +++ b/examples/ipsilon.conf @@ -3,3 +3,9 @@ log.screen = True base.dir = "../" admin.config.db = "/var/lib/ipsilon/adminconfig.sqlite" user.prefs.db = "/var/lib/ipsilon/userprefs.sqlite" + +tools.sessions.on = True +tools.sessions.storage_type = "file" +tools.sessions.storage_path = "/var/lib/ipsilon/sessions" +tools.sessions.timeout = 60 +tools.protect.on = True diff --git a/src/ipsilon.py b/src/ipsilon.py index 879de7d..7a782d6 100755 --- a/src/ipsilon.py +++ b/src/ipsilon.py @@ -26,10 +26,10 @@ import threading import cherrypy from util import plugin from util import data +from util import page from jinja2 import Environment, FileSystemLoader import root - cherrypy.config.update('ipsilon.conf') plugins = plugin.Plugins(path=cherrypy.config['base.dir']) @@ -45,6 +45,8 @@ for option in admin_config: templates = os.path.join(cherrypy.config['base.dir'], 'templates') env = Environment(loader=FileSystemLoader(templates)) +cherrypy.tools.protect = cherrypy.Tool('before_handler', page.protect) + if __name__ == "__main__": conf = { '/': {'tools.staticdir.root': os.getcwd()}, '/ui': { 'tools.staticdir.on': True, diff --git a/src/root.py b/src/root.py index 0c6cd41..50247f7 100755 --- a/src/root.py +++ b/src/root.py @@ -18,6 +18,7 @@ # along with this program. If not, see . from util import data +from util import page import cherrypy class Site(object): @@ -78,16 +79,8 @@ class User(object): #TODO: implement setting sites via the user object ? raise AttributeError -class Root(object): +class Root(page.Page): - def __init__(self, template_env): - self._env = template_env - - @cherrypy.expose - def index_html(self): + def root(self): tmpl = self._env.get_template('index.html') - return tmpl.render(title='Root', user=User(None)) - - @cherrypy.expose - def index(self): - return self.index_html() + return tmpl.render(title='Root', user=User(self.username)) diff --git a/src/util/page.py b/src/util/page.py new file mode 100755 index 0000000..4236e9f --- /dev/null +++ b/src/util/page.py @@ -0,0 +1,53 @@ +#!/usr/bin/python +# +# Copyright (C) 2013 Simo Sorce +# +# see file 'COPYING' for use and warranty information +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +import cherrypy + +def protect(): + if cherrypy.request.login: + user = cherrypy.session.get('user', None) + if user == cherrypy.request.login: + return + else: + cherrypy.session.regenerate() + cherrypy.session['user'] = cherrypy.request.login + +class Page(object): + def __init__(self, template_env): + self._env = template_env + self.username = None + + def __call__(self, *args, **kwargs): + self.username = cherrypy.session.get('user', None) + + if len(args) > 0: + op = getattr(self, args[0], None) + if callable(op) and getattr(self, args[0]+'.exposed', None): + return op(args[1:], **kwargs) + else: + op = getattr(self, 'root', None) + if callable(op): + return op(**kwargs) + + return self.default(*args, **kwargs) + + def default(self, *args, **kwargs): + raise cherrypy.HTTPError(404) + + exposed = True -- 2.20.1