X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=geekigeeki.py;h=d63850fb57b8e55494930871cc8f4f23271b3b5c;hb=5a2e445da1711b54343334087b760b86935fb876;hp=b3eed3c52d509732419e6ed9546be3aebe3353b6;hpb=465199e5822dfa85ca4fddb8bf0ae79641e0aa4e;p=geekigeeki.git
diff --git a/geekigeeki.py b/geekigeeki.py
index b3eed3c..d63850f 100755
--- a/geekigeeki.py
+++ b/geekigeeki.py
@@ -3,7 +3,7 @@
#
# Copyright (C) 1999, 2000 Martin Pool
# Copyright (C) 2002 Gerardo Poggiali
-# Copyright (C) 2007, 2008, 2009 Bernie Innocenti
+# Copyright (C) 2007, 2008, 2009, 2010 Bernie Innocenti
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -29,7 +29,6 @@ file_re = re.compile(r"([A-Za-z0-9_\-][A-Za-z0-9_\.\-/ ]*)$")
url_re = re.compile(r"[a-z]{3,8}://[^\s'\"]+\S$")
ext_re = re.compile(r"\.([^\./]+)$")
-# CGI stuff ---------------------------------------------------------
def config_get(key, default=None):
return globals().get(key, default)
@@ -106,11 +105,12 @@ def url_args(kvargs):
return '?' + '&'.join(argv)
return ''
-# Formatting stuff --------------------------------------------------
def emit_header(mtime=None, mime_type="text/html"):
if mtime:
print("Last-Modified: " + strftime("%a, %d %b %Y %H:%M:%S GMT", gmtime(mtime)))
- print("Content-type: " + mime_type + "; charset=utf-8\n")
+ if mime_type:
+ print("Content-type: " + mime_type + "; charset=utf-8")
+ print('')
def send_guru(msg_text, msg_type):
if not msg_text: return
@@ -123,10 +123,14 @@ def send_guru(msg_text, msg_type):
print('' \
% relative_url('sys/GuruMeditation.js'))
-def send_httperror(status="403 Not Found", query=""):
+def send_httperror(status="403 Not Found", query="", trace=False):
print("Status: %s" % status)
+ msg_text = "%s: on query '%s'" % (status, query)
+ if trace:
+ import traceback
+ msg_text += '\n\n' + traceback.format_exc()
page = Page()
- page.send_title(msg_text=("%s: on query '%s'" % (status, query)))
+ page.send_title(msg_text=msg_text)
page.send_footer()
def link_tag(dest, text=None, privileged=False, **kvargs):
@@ -175,10 +179,8 @@ def link_inline_glob(pattern, descr=None, kvargs={}):
else:
return link_inline(pattern, descr, kvargs)
-# Search ---------------------------------------------------
-
def search_stats(hits, searched):
- return("%d hits out of %d pages searched.\n" % (hits, searched))
+ return "%d hits out of %d pages searched.\n" % (hits, searched)
def handle_fullsearch(query, form):
needle = form['q'].value
@@ -220,28 +222,23 @@ def handle_titlesearch(query, form):
WikiFormatter(out).print_html()
def handle_raw(pagename, form):
- if not file_re.match(pagename):
- send_httperror("403 Forbidden", pagename)
- return
-
Page(pagename).send_raw()
-def handle_edit(pagename, form):
- if not file_re.match(pagename):
- send_httperror("403 Forbidden", pagename)
- return
+def handle_atom(pagename, form):
+ Page(pagename).send_atom()
+def handle_edit(pagename, form):
pg = Page(form['q'].value)
if 'save' in form:
if form['file'].value:
pg.save(form['file'].file.read(), form['changelog'].value)
else:
pg.save(form['savetext'].value.replace('\r\n', '\n'), form['changelog'].value)
- pg.format()
+ pg.send()
elif 'cancel' in form:
pg.msg_text = 'Editing canceled'
pg.msg_type = 'notice'
- pg.format()
+ pg.send()
else: # preview or edit
text = None
if 'preview' in form:
@@ -249,16 +246,13 @@ def handle_edit(pagename, form):
pg.send_editor(text)
def handle_get(pagename, form):
- if file_re.match(pagename):
- # FIMXE: this is all bullshit, MimeTypes bases its guess on the extension!
- from mimetypes import MimeTypes
- mimetype, encoding = MimeTypes().guess_type(pagename)
- if mimetype:
- Page(pagename).send_raw(mimetype=mimetype, args=form)
- else:
- Page(pagename).format()
- else:
- send_httperror("403 Forbidden", pagename)
+ if not ext_re.search(pagename): # FIXME: no extension guesses a wiki page
+ Page(pagename).send()
+ else:
+ # FIMXE: this is all bullshit, MimeTypes bases its guess on the extension!
+ from mimetypes import MimeTypes
+ mimetype, encoding = MimeTypes().guess_type(pagename)
+ Page(pagename).send_raw(mimetype=mimetype, args=form)
# Used by sys/macros/WordIndex and sys/macros/TitleIndex
def make_index_key():
@@ -532,11 +526,18 @@ class WikiFormatter:
print(self._indent_to(0))
print('
')
+class HttpException(Exception):
+ def __init__(self, error, query):
+ self.error = error
+ self.query = query
+
class Page:
def __init__(self, page_name="Limbo"):
self.page_name = page_name.rstrip('/');
self.msg_text = ''
self.msg_type = 'error'
+ if not file_re.match(self.page_name):
+ raise HttpException("403 Forbidden", self.page_name)
def split_title(self):
# look for the end of words and the start of a new word and insert a space there
@@ -697,16 +698,12 @@ class Page:
else:
print(' | ' + link_tag(name, 'Login', cssclass='navlink', privileged=True))
- else:
- print(' | Immutable Page')
-
user = remote_user()
if user != 'AnonymousCoward':
print(' | ' + link_tag('User/' + user, user) + '')
print('
')
-
def send_footer(self):
if config_get('debug_cgi', False):
cgi.print_arguments()
@@ -715,7 +712,7 @@ class Page:
footer = self.pragma("footer", "sys/footer")
if footer != "off":
link_inline(footer, kvargs = {
- 'LAST_MODIFIED': strftime(config_get('datetime_fmt', '%a %d %b %Y %I:%M %p'), localtime(self._mtime()))
+ 'LAST_MODIFIED': strftime(config_get('datetime_fmt', '%Y-%m-%dT%I:%M:%S%p'), localtime(self._mtime()))
})
print("