# HG changeset patch # User Paul Boddie # Date 1384208454 -3600 # Node ID 937f948a2e66665808b5158b1a79fde1afacf905 # Parent 85a7405dccb57a00029e1d4da00e4bc8b8e7dd29 Added a special MoinMoin parser for application/pgp-keys content, showing a list of keys encoded by such content and reporting various attributes of those keys. diff -r 85a7405dccb5 -r 937f948a2e66 css/moinshare.css --- a/css/moinshare.css Wed Nov 06 14:45:40 2013 +0100 +++ b/css/moinshare.css Mon Nov 11 23:20:54 2013 +0100 @@ -57,3 +57,9 @@ div.moinshare-alternative.moinshare-other:target { display: block; } + +/* PGP key information. */ + +table.moinshare-pgp-keys { + border: 1px solid black; +} diff -r 85a7405dccb5 -r 937f948a2e66 parsers/pgp_keys.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/parsers/pgp_keys.py Mon Nov 11 23:20:54 2013 +0100 @@ -0,0 +1,117 @@ +# -*- coding: iso-8859-1 -*- +""" + MoinMoin - pgp_keys (MoinShare) + + @copyright: 2012, 2013 by Paul Boddie + @license: GNU GPL (v2 or later), see COPYING.txt for details. +""" + +from MoinMessage import GPG, MoinMessageError +from MoinMessageSupport import get_homedir +from MoinSupport import parseAttributes, escattr + +Dependencies = ["pages"] + +# Parser support. + +class Parser: + + "Display data in application/pgp-keys format." + + Dependencies = Dependencies + extensions = [] + + # Input content types understood by this parser. + + input_mimetypes = ["application/pgp-keys"] + + # Output content types preferred by this parser. + + output_mimetypes = ["text/html"] + + def __init__(self, raw, request, **kw): + + """ + Initialise the parser with the given 'raw' data, 'request' and any + keyword arguments that may have been supplied. + """ + + self.raw = raw + self.request = request + self.attrs = parseAttributes(kw.get("format_args", ""), False) + + def format(self, fmt, write=None): + + """ + Format a table using the given formatter 'fmt'. If the 'write' parameter + is specified, use it to write output; otherwise, write output using the + request. + """ + + (write or self.request.write)(fmt.text(self.raw)) + + # Extra API methods. + + def formatForOutputType(self, mimetype, write=None): + + """ + Format a table for the given 'mimetype'. If the 'write' parameter is + specified, use it to write output; otherwise, write output using the + request. + """ + + request = self.request + write = write or request.write + fmt = request.html_formatter + _ = request.getText + + if not mimetype == "text/html": + return + + homedir = get_homedir(request) + if not homedir: + return + + gpg = GPG(homedir) + + write(fmt.text(_("This message contains one or more keys."))) + + write(fmt.rawHTML('' % escattr(_("A table of keys")))) + write(fmt.rawHTML("")) + write(fmt.table_row(on=1)) + write(fmt.rawHTML("")) + write(fmt.rawHTML("")) + write(fmt.rawHTML("")) + write(fmt.table_row(on=0)) + write(fmt.rawHTML("")) + + write(fmt.rawHTML("")) + + for key in gpg.getKeysFromString(self.raw): + write(fmt.table_row(on=1)) + write(fmt.table_cell(on=1)) + try: + gpg.listKeys(key["keyid"]) + write(fmt.icon("(./)")) + write(fmt.text(_("Known"))) + except MoinMessageError: + pass + write(fmt.table_cell(on=0)) + write(fmt.table_cell(on=1)) + write(fmt.text(key["userid"])) + write(fmt.table_cell(on=0)) + write(fmt.table_cell(on=1)) + write(fmt.text(key["fingerprint"])) + write(fmt.table_cell(on=0)) + write(fmt.table_row(on=0)) + + write(fmt.rawHTML("
")); write(fmt.text(_("Known"))); write(fmt.rawHTML("")); write(fmt.text(_("Identity"))); write(fmt.rawHTML("")); write(fmt.text(_("Fingerprint"))); write(fmt.rawHTML("
")) + + # Class methods. + + def getOutputTypes(self): + return self.output_mimetypes + + getOutputTypes = classmethod(getOutputTypes) + +# vim: tabstop=4 expandtab shiftwidth=4