+app.register_blueprint(filters.blueprint)
+
+class EscapeHtml(Extension):
+ def extendMarkdown(self, md, md_globals):
+ del md.preprocessors['html_block']
+ del md.inlinePatterns['html']
+
+md = Markdown(app, extensions=[EscapeHtml()])
+
+# Load config
+app.config.from_pyfile('config.py')
+
+
+class ConfigProxy:
+ def __init__(self, name):
+ self.name = name
+ @property
+ def per_host(self):
+ dict = app.config.get(self.name)
+ if dict is None:
+ return None
+ return dict.get(request.host)
+
+prefix = ConfigProxy("GROUP_PREFIX")
+times = ConfigProxy("DURATION")
+debuguser = ConfigProxy("DEBUGUSER")
+
+@app.before_request
+def lookup_user():
+ global prefix
+
+ env = request.environ
+ user = None
+ my_debuguser = debuguser.per_host
+ if my_debuguser is not None:
+ parts = my_debuguser.split("/", 1)
+ user = parts[0]
+ roles = parts[1]
+
+ if "USER_ROLES" in env:
+ parts = env.get("USER_ROLES").split("/", 1)
+ user = parts[0]
+ roles = parts[1]
+
+ if "USER" in env and "ROLES" in env:
+ user = env.get("USER")
+ roles = env.get("ROLES")
+
+
+ if user is None:
+ return "Server misconfigured", 500
+ roles = roles.split(" ")
+
+ if user == "<invalid>":
+ return "Access denied", 403;
+
+ db = get_db()
+ with db.xact():
+ rv = db.prepare("SELECT id FROM voter WHERE email=$1")(user)
+ if len(rv) == 0:
+ db.prepare("INSERT INTO voter(\"email\") VALUES($1)")(user)
+ rv = db.prepare("SELECT id FROM voter WHERE email=$1")(user)
+ g.voter = rv[0].get("id");
+ g.user = user
+ g.roles = {}
+
+ for r in roles:
+ a = r.split(":", 1)
+ if len(r)!=0:
+ val = a[1]
+ if a[0] not in g.roles:
+ g.roles[a[0]] = []
+ if val == "*":
+ g.roles[a[0]] = [group for group in prefix.per_host]
+ else:
+ g.roles[a[0]].append(val)
+ return None
+
+def get_allowed_cats(action):
+ return g.roles.get(action, []);
+
+def may(action, motion):
+ return motion in get_allowed_cats(action)