diff --git a/app.fcgi b/app.fcgi index b8371f6..24aa0e8 100755 --- a/app.fcgi +++ b/app.fcgi @@ -5,7 +5,7 @@ from time import asctime from logging import DEBUG from logging.handlers import TimedRotatingFileHandler -from flask import Flask, request +from flask import Flask, g, request from flask.ext.mako import MakoTemplates, render_template from flup.server.fcgi import WSGIServer @@ -15,10 +15,24 @@ app = Flask(__name__) MakoTemplates(app) app.logger.setLevel(DEBUG) -app.logger.addHandler(TimedRotatingFileHandler("logs/app.log", when="D", - interval=1, backupCount=7)) +app.logger.addHandler(TimedRotatingFileHandler( + "logs/app.log", when="D", interval=1, backupCount=7)) app.logger.info(u"Flask server started " + asctime()) +@app.before_request +def prepare_cookies(): + cookie_string = request.environ.get("HTTP_COOKIE") + g.cookies = parse_cookies(request.script_root, cookie_string) + g.new_cookies = [] + +@app.after_request +def add_new_cookies(response): + if g.new_cookies: + if "Set-Cookie" in response.headers: + g.new_cookies.insert(0, response.headers["Set-Cookie"]) + response.headers["Set-Cookie"] = "; ".join(g.new_cookies) + return response + @app.after_request def write_access_log(response): msg = u"%s %s -> %s" @@ -27,21 +41,15 @@ def write_access_log(response): @app.route("/") def index(): - root = request.environ["SCRIPT_NAME"] - cookies = parse_cookies(root, request.environ.get("HTTP_COOKIE")) - return render_template("index.mako", root=root, environ=request.environ, cookies=cookies) + return render_template("index.mako") @app.route("/settings", methods=["GET", "POST"]) def settings(): - root = request.environ["SCRIPT_NAME"] - cookies = parse_cookies(root, request.environ.get("HTTP_COOKIE")) - return render_template("settings.mako", root=root, environ=request.environ, cookies=cookies) + return render_template("settings.mako") @app.route("/debug") def debug(): - root = request.environ["SCRIPT_NAME"] - cookies = parse_cookies(root, request.environ.get("HTTP_COOKIE")) - return render_template("debug.mako", root=root, environ=request.environ, cookies=cookies) + return render_template("debug.mako") if __name__ == '__main__': WSGIServer(app).run() diff --git a/copyvios/background.py b/copyvios/background.py index a11efe7..8031f21 100644 --- a/copyvios/background.py +++ b/copyvios/background.py @@ -7,16 +7,14 @@ import re from time import time from earwigbot import exceptions +from flask import g from .misc import get_bot, open_sql_connection -_descurl = None - -def set_background(context, cookies, selected): - global _descurl +def set_background(context, selected): conn = open_sql_connection(get_bot(), "globals") - if "CopyviosScreenCache" in cookies: - cache = cookies["CopyviosScreenCache"].value + if "CopyviosScreenCache" in g.cookies: + cache = g.cookies["CopyviosScreenCache"].value try: screen = loads(cache) int(screen["width"]) @@ -32,12 +30,9 @@ def set_background(context, cookies, selected): info = _update_url(conn, "background_list", 2, _get_fresh_list) filename, url, descurl, width, height = info bg_url = _build_url(screen, filename, url, width, height) - _descurl = descurl + g.descurl = descurl return bg_url -def get_desc_url(context): - return _descurl - def _update_url(conn, service, bg_id, callback): query1 = "SELECT update_time FROM updates WHERE update_service = ?" query2 = "SELECT 1 FROM background WHERE background_id = ?" diff --git a/copyvios/cookies.py b/copyvios/cookies.py index 0344168..affe99c 100644 --- a/copyvios/cookies.py +++ b/copyvios/cookies.py @@ -4,6 +4,8 @@ import base64 from Cookie import CookieError, SimpleCookie from datetime import datetime, timedelta +from flask import g + class _CookieManager(SimpleCookie): MAGIC = "--cpv2" @@ -40,14 +42,15 @@ class _CookieManager(SimpleCookie): def parse_cookies(path, cookies): return _CookieManager(path, cookies) -def set_cookie(headers, cookies, key, value, days=0): - cookies[key] = value +def set_cookie(key, value, days=0): + g.cookies[key] = value if days: - expires = datetime.utcnow() + timedelta(days=days) - cookies[key]["expires"] = expires.strftime("%a, %d %b %Y %H:%M:%S GMT") - cookies[key]["path"] = cookies.path - headers.append(("Set-Cookie", cookies[key].OutputString())) - -def delete_cookie(headers, cookies, key): - set_cookie(headers, cookies, key, u"", days=-1) - del cookies[key] + expire_dt = datetime.utcnow() + timedelta(days=days) + expires = expire_dt.strftime("%a, %d %b %Y %H:%M:%S GMT") + g.cookies[key]["expires"] = expires + g.cookies[key]["path"] = g.cookies.path + g.new_cookies.append(g.cookies[key].OutputString()) + +def delete_cookie(key): + set_cookie(key, u"", days=-1) + del g.cookies[key] diff --git a/copyvios/misc.py b/copyvios/misc.py index ecfd674..e8cb721 100644 --- a/copyvios/misc.py +++ b/copyvios/misc.py @@ -4,19 +4,20 @@ from os.path import expanduser from urlparse import parse_qs from earwigbot.bot import Bot +from flask import request import oursql _bot = None _connections = {} class Query(object): - def __init__(self, environ, method="GET"): + def __init__(self, method="GET"): self.query = {} if method == "GET": - parsed = parse_qs(environ["QUERY_STRING"]) + parsed = parse_qs(request.environ["QUERY_STRING"]) elif method == "POST": - size = int(environ.get("CONTENT_LENGTH", 0)) - parsed = parse_qs(environ["wsgi.input"].read(size)) + size = int(request.environ.get("CONTENT_LENGTH", 0)) + parsed = parse_qs(request.environ["wsgi.input"].read(size)) else: parsed = {} for key, value in parsed.iteritems(): @@ -50,8 +51,9 @@ def open_sql_connection(bot, dbname): conn_args = bot.config.wiki["_copyviosSQL"][dbname] if "read_default_file" not in conn_args and "user" not in conn_args and "passwd" not in conn_args: conn_args["read_default_file"] = expanduser("~/.my.cnf") - elif "read_default_file" in args: - args["read_default_file"] = expanduser(args["read_default_file"]) + elif "read_default_file" in conn_args: + default_file = expanduser(conn_args["read_default_file"]) + conn_args["read_default_file"] = default_file if "autoping" not in conn_args: conn_args["autoping"] = True if "autoreconnect" not in conn_args: diff --git a/copyvios/settings.py b/copyvios/settings.py index de24a8b..0e518f1 100644 --- a/copyvios/settings.py +++ b/copyvios/settings.py @@ -1,17 +1,18 @@ # -*- coding: utf-8 -*- +from flask import g from markupsafe import escape from .cookies import set_cookie, delete_cookie from .misc import get_bot, Query from .sites import get_sites -def main(context, environ, headers, cookies): - query = Query(environ, method="POST") +def main(context): + query = Query(method="POST") if query.action == "set": - status = _do_set(query, headers, cookies) + status = _do_set(query) elif query.action == "delete": - status = _do_delete(query, headers, cookies) + status = _do_delete(query) else: status = None @@ -19,37 +20,39 @@ def main(context, environ, headers, cookies): langs, projects = get_sites(bot) return bot, status, langs, projects -def _do_set(query, headers, cookies): +def _do_set(query): + cookies = g.cookies changes = set() if query.lang: key = "CopyviosDefaultLang" if key not in cookies or cookies[key].value != query.lang: - set_cookie(headers, cookies, key, query.lang, 1095) + set_cookie(key, query.lang, 1095) changes.add("site") if query.project: key = "CopyviosDefaultProject" if key not in cookies or cookies[key].value != query.project: - set_cookie(headers, cookies, key, query.project, 1095) + set_cookie(key, query.project, 1095) changes.add("site") if query.background: key = "CopyviosBackground" if key not in cookies or cookies[key].value != query.background: - set_cookie(headers, cookies, key, query.background, 1095) - delete_cookie(headers, cookies, "EarwigBackgroundCache") + set_cookie(key, query.background, 1095) + delete_cookie("EarwigBackgroundCache") changes.add("background") if changes: changes = ", ".join(sorted(list(changes))) return "Updated {0}.".format(changes) return None -def _do_delete(query, headers, cookies): +def _do_delete(query): + cookies = g.cookies if query.cookie in cookies: - delete_cookie(headers, cookies, query.cookie.encode("utf8")) + delete_cookie(query.cookie.encode("utf8")) template = u'Deleted cookie {0}.' return template.format(escape(query.cookie)) elif query.all: number = len(cookies) for cookie in cookies.values(): - delete_cookie(headers, cookies, cookie.key) + delete_cookie(cookie.key) return "Deleted {0} cookies.".format(number) return None diff --git a/templates/debug.mako b/templates/debug.mako index c5ead57..5c43e61 100644 --- a/templates/debug.mako +++ b/templates/debug.mako @@ -1,11 +1,10 @@ -<%include file="/support/header.mako" args="title='Debug - Earwig\'s Copyvio Detector', root=root, cookies=cookies"/> +<%include file="/support/header.mako" args="title='Debug - Earwig\'s Copyvio Detector'"/> +<%! from flask import request %>\ -<%include file="/support/footer.mako" args="cookies=cookies"/> +<%include file="/support/footer.mako"/> diff --git a/templates/index.mako b/templates/index.mako index 70998bf..920c10a 100644 --- a/templates/index.mako +++ b/templates/index.mako @@ -1,4 +1,4 @@ -<%include file="/support/header.mako" args="title='Earwig\'s Copyvio Detector', root=root, cookies=cookies"/> +<%include file="/support/header.mako" args="title='Earwig\'s Copyvio Detector'"/> <%namespace module="copyvios" import="main, highlight_delta"/>\ <%namespace module="copyvios.misc" import="urlstrip"/>\ <% @@ -158,4 +158,4 @@ % endif -<%include file="/support/footer.mako" args="cookies=cookies"/> +<%include file="/support/footer.mako"/> diff --git a/templates/settings.mako b/templates/settings.mako index 149d007..16dd3fe 100644 --- a/templates/settings.mako +++ b/templates/settings.mako @@ -1,21 +1,25 @@ -<%namespace module="copyvios.settings" import="main"/>\ -<% bot, status, langs, projects = main(environ, headers, cookies) %>\ -<%include file="/support/header.mako" args="title='Settings - Earwig\'s Copyvio Detector', root=root, cookies=cookies"/> -<%! from json import dumps, loads %>\ +<%! + from json import dumps, loads + + from flask import g, request + from copyvios.settings import main +%>\ +<% bot, status, langs, projects = main() %>\ +<%include file="/support/header.mako" args="title='Settings - Earwig\'s Copyvio Detector'"/> % if status:

${status}

% endif

This page contains some configurable options for the copyvio detector. Settings are saved as cookies. You can view and delete all cookies generated by this site at the bottom of this page.

-
+ @@ -67,11 +71,11 @@
Default site: http:// .

Cookies

- % if cookies: + % if g.cookies: <% cookie_order = ["CopyviosDefaultProject", "CopyviosDefaultLang", "CopyviosBackground", "CopyviosShowDetails", "CopyviosScreenCache"] %>\ - % for key in [key for key in cookie_order if key in cookies]: - <% cookie = cookies[key] %>\ + % for key in [key for key in cookie_order if key in g.cookies]: + <% cookie = g.cookies[key] %>\ % try: @@ -85,7 +89,7 @@ % endtry
${key | h}${cookie.value | h} -
+ @@ -95,7 +99,7 @@ % endfor
- + @@ -106,4 +110,4 @@ % else:

No cookies!

% endif -<%include file="/support/footer.mako" args="cookies=cookies"/> +<%include file="/support/footer.mako"/> diff --git a/templates/support/footer.mako b/templates/support/footer.mako index 3419b3e..58060b1 100644 --- a/templates/support/footer.mako +++ b/templates/support/footer.mako @@ -1,11 +1,10 @@ -<%page args="cookies"/>\ -<%namespace module="copyvios.background" import="get_desc_url"/>\ +<%! from flask import g %>\