X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=geekigeeki.py;h=71ce72406f6b94893516fcb03862964f48e1bdeb;hb=746aad914bdc194bf3905b56d2339250fb11772f;hp=e7001abc60ce63edd26aa03c838c6208816b53ec;hpb=76a9e7542e0ed64a3054882db2cf4ae18e4f558e;p=geekigeeki.git diff --git a/geekigeeki.py b/geekigeeki.py index e7001ab..71ce724 100755 --- a/geekigeeki.py +++ b/geekigeeki.py @@ -19,12 +19,10 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -__version__ = '$Revision: 1.63+gerry+bernie $'[11:-2]; +__version__ = '$Revision: 1.63+gerry+bernie $'[11:-2] import cgi, sys, string, os, re, errno, time, stat from os import path, environ -from socket import gethostbyaddr -from time import localtime, strftime # Regular expression defining a WikiWord # (but this definition is also assumed in other places) @@ -35,24 +33,39 @@ url_re = re.compile(r"^[a-z]{3,8}://[^\s'\"]+\S$") title_done = False -def emit_header(type="text/html"): - print "Content-type: " + type + "; charset=utf-8" - print +# CGI stuff --------------------------------------------------------- -# Formatting stuff -------------------------------------------------- - -def get_scriptname(): +def script_name(): return environ.get('SCRIPT_NAME', '') +def privileged_path(): + return privileged_url or script_name() + +def remote_user(): + user = environ.get('REMOTE_USER', '') + if user is None or user == '' or user == 'anonymous': + user = 'AnonymousCoward' + return user + +def remote_host(): + return environ.get('REMOTE_ADDR', '') + def get_hostname(addr): try: + from socket import gethostbyaddr return gethostbyaddr(addr)[0] + ' (' + addr + ')' except: - return addr; + return addr + +# Formatting stuff -------------------------------------------------- + +def emit_header(type="text/html"): + print "Content-type: " + type + "; charset=utf-8" + print def send_guru(msg, msg_type): - if msg is None or len(msg) == 0: return + if msg is None or msg == '': return print '
'
     if msg_type == 'error':
         print '    Software Failure.  Press left mouse button to continue.\n'
@@ -60,7 +73,7 @@ def send_guru(msg, msg_type):
     if msg_type == 'error':
         print '      Guru Meditation #DEADBEEF.ABADC0DE'
     print '
' - # FIXME: This simple JS code is harder to pass than ACID 3.0 + # FIXME: This simple JS snippet is harder to pass than ACID 3.0 print """ """ -def send_title(name, text="Limbo", msg=None, msg_type = 'error'): +def send_title(name, text="Limbo", msg=None, msg_type='error'): global title_done if title_done: return @@ -94,55 +107,62 @@ def send_title(name, text="Limbo", msg=None, msg_type = 'error'): """ print "%s: %s" % (site_name, text) - print ' ' + print ' ' if not name: - print ' ' + print ' ' if css_url: print ' ' % css_url print '' # Body - if name and allow_edit: - print '' + if name and privileged_url is not None: + print '' else: print '' + title_done = True send_guru(msg, msg_type) # Navbar - print '' -def link_tag(params, text=None, ss_class=None): +def link_tag(params, text=None, ss_class=None, authentication=False): if text is None: text = params # default classattr = '' - # Prevent crawlers from following links to generated pages - # and links added by potential spammers - if ss_class == 'external' or ss_class == 'navlink': - classattr += 'rel="nofollow" ' if ss_class: classattr += 'class="%s" ' % ss_class - return '%s' % (classattr, get_scriptname(), - params, text) + # Prevent crawlers from following links to generated pages + # and links added by potential spammers + if ss_class == 'external' or ss_class == 'navlink': + classattr += 'rel="nofollow" ' + if authentication: + path = privileged_path() + else: + path = script_name() + return '%s' % (classattr, path, params, text) # Search --------------------------------------------------- @@ -200,7 +220,7 @@ def do_raw(pagename): Page(pagename).send_raw() def do_savepage(pagename): - if not allow_edit: + if privileged_url is None: raise 'editing disallowed for ' + pagename global form @@ -231,18 +251,23 @@ def page_list(): def send_footer(name, mod_string=None): - print '" @@ -488,8 +560,6 @@ class PageFormatter: class Page: def __init__(self, page_name): self.page_name = page_name - self.remote_user = 'AnonymousCoward' - self.remote_host = environ.get('REMOTE_ADDR', '') self.msg = '' self.msg_type = 'error' self.attrs = {} @@ -499,15 +569,12 @@ class Page: # and insert a space there return re.sub('([a-z])([A-Z])', r'\1 \2', self.page_name) - def _text_filename(self): return path.join(text_dir, self.page_name) - def _tmp_filename(self): return path.join(text_dir, ('#' + self.page_name + '.' + `os.getpid()` + '#')) - def exists(self): try: os.stat(self._text_filename()) @@ -563,7 +630,7 @@ class Page: acl = attrs["acl"] for rule in acl.split(): (user,perms) = acl.split(':') - if user == self.remote_user or user == "All": + if user == remote_user() or user == "All": if 'write' in perms.split(','): return True return False @@ -582,6 +649,7 @@ class Page: def _last_modified(self): if not self.exists(): return None + from time import localtime, strftime modtime = localtime(os.stat(self._text_filename())[stat.ST_MTIME]) return strftime(datetime_fmt, modtime) @@ -589,10 +657,10 @@ class Page: send_title(None, 'Edit ' + self.split_title(), msg=self.msg, msg_type=self.msg_type) print ('

Editing ' + self.page_name - + ' for ' + self.remote_user - + ' from ' + get_hostname(self.remote_host) + + ' for ' + cgi.escape(remote_user()) + + ' from ' + cgi.escape(get_hostname(remote_host())) + '

') - print '
' % (get_scriptname(), self.page_name) + print '
' % (script_name(), self.page_name) print '' % (self.page_name) print """""" % (preview or self.get_raw_body()) print """ @@ -608,6 +676,7 @@ class Page: print "
" PageFormatter(preview).print_html() print "
" + send_footer(self.page_name) def send_raw(self): emit_header("text/plain") @@ -629,10 +698,11 @@ class Page: self._write_file(newtext) rc = 0 if post_edit_hook: + # FIXME: what's the std way to perform shell quoting in python? cmd = ( post_edit_hook - + ' ' + text_dir + '/' + self.page_name - + ' ' + self.remote_user - + ' ' + self.remote_host + + " '" + text_dir + '/' + self.page_name + + "' '" + remote_user() + + "' '" + remote_host() + "'" ) out = os.popen(cmd) msg = out.read() @@ -652,20 +722,26 @@ def send_verbatim(filename, mime_type='application/octet-stream'): emit_header(mime_type) sys.stdout.write(data) -# --------------------------------------------------------------- +# Main --------------------------------------------------------------- try: # Configuration values + site_name = 'Codewiz' + + # set to None for read-only sites + # leave empty ('') to allow anonymous edits + # otherwise, set to a URL that requires authentication + privileged_url = 'https://www.codewiz.org/~bernie/wiki' + data_dir = '/home/bernie/public_html/wiki' text_dir = path.join(data_dir, 'text') - allow_edit = True # Is it possible to edit pages? - site_name = 'codewiz.org' - changed_time_fmt = '[%I:%M %p] ' - date_fmt = '%a %d %b %Y' + css_url = '../wikidata/geekigeeki.css' # optional stylesheet link + history_url = '../wikigit/wiki.git' + post_edit_hook = './post_edit_hook.sh' datetime_fmt = '%a %d %b %Y %I:%M %p' + allow_edit = True # Is it possible to edit pages? show_hosts = True # show hostnames? - css_url = '../wikidata/pikiplus.css' # stylesheet link, or '' nonexist_qm = False # show '?' for nonexistent? - post_edit_hook = './post_edit_hook.sh' + debug_cgi = False # Set to True for CGI var dump form = cgi.FieldStorage() @@ -690,6 +766,7 @@ try: if word_re.match(query): Page(query).send_page() elif img_re.match(query): + #FIXME: use correct mime type send_verbatim(query, 'image/jpeg') else: send_verbatim(query)