1 # -*- coding: iso-8859-1 -*- 2 """ 3 MoinMoin - pgp_keys (MoinShare) 4 5 @copyright: 2012, 2013, 2014 by Paul Boddie <paul@boddie.org.uk> 6 @license: GNU GPL (v2 or later), see COPYING.txt for details. 7 """ 8 9 from MoinMessage import GPG, MoinMessageError 10 from MoinMessageSupport import get_homedir 11 from MoinSupport import parseAttributes, escattr 12 13 Dependencies = ["pages"] 14 15 # Parser support. 16 17 class Parser: 18 19 "Display data in application/pgp-keys format." 20 21 Dependencies = Dependencies 22 extensions = [] 23 24 # Input content types understood by this parser. 25 26 input_mimetypes = ["application/pgp-keys"] 27 28 # Output content types preferred by this parser. 29 30 output_mimetypes = ["text/html"] 31 32 def __init__(self, raw, request, **kw): 33 34 """ 35 Initialise the parser with the given 'raw' data, 'request' and any 36 keyword arguments that may have been supplied. 37 """ 38 39 self.raw = raw 40 self.request = request 41 self.attrs = parseAttributes(kw.get("format_args", ""), False) 42 43 def format(self, fmt, write=None): 44 45 """ 46 Format a key using the given formatter 'fmt'. If the 'write' parameter 47 is specified, use it to write output; otherwise, write output using the 48 request. 49 """ 50 51 (write or self.request.write)(fmt.text(self.raw)) 52 53 # Extra API methods. 54 55 def formatForOutputType(self, mimetype, write=None): 56 57 """ 58 Format a key for the given 'mimetype'. If the 'write' parameter is 59 specified, use it to write output; otherwise, write output using the 60 request. 61 """ 62 63 request = self.request 64 write = write or request.write 65 fmt = request.html_formatter 66 _ = request.getText 67 68 if not mimetype == "text/html": 69 return 70 71 homedir = get_homedir(request) 72 if not homedir: 73 return 74 75 gpg = GPG(homedir) 76 77 write(fmt.text(_("This message contains one or more keys."))) 78 79 write(fmt.rawHTML('<table class="moinshare-pgp-keys" summary="%s">' % escattr(_("A table of keys")))) 80 write(fmt.rawHTML("<thead>")) 81 write(fmt.table_row(on=1)) 82 write(fmt.rawHTML("<th>")); write(fmt.text(_("Known"))); write(fmt.rawHTML("</th>")) 83 write(fmt.rawHTML("<th>")); write(fmt.text(_("Identity"))); write(fmt.rawHTML("</th>")) 84 write(fmt.rawHTML("<th>")); write(fmt.text(_("Confirmed by"))); write(fmt.rawHTML("</th>")) 85 write(fmt.table_row(on=0)) 86 write(fmt.rawHTML("</thead>")) 87 88 write(fmt.rawHTML("<tbody>")) 89 90 # For each key in the message, show whether it is already known to GPG, 91 # the user of the key, and whether other known people have signed it. 92 93 for key in gpg.getKeysFromString(self.raw): 94 write(fmt.table_row(on=1)) 95 96 # Known... 97 98 write(fmt.table_cell(on=1)) 99 try: 100 gpg.listKeys(key["keyid"]) 101 write(fmt.icon("(./)")) 102 write(fmt.text(_("Known"))) 103 except MoinMessageError: 104 pass 105 write(fmt.table_cell(on=0)) 106 107 # Identity... 108 109 write(fmt.table_cell(on=1)) 110 write(fmt.text(key["userid"])); write(fmt.linebreak(0)) 111 write(fmt.small(on=1)); write(fmt.text(key["fingerprint"])); write(fmt.small(on=0)) 112 write(fmt.table_cell(on=0)) 113 114 # Confirmed by... 115 116 write(fmt.table_cell(on=1)) 117 118 first = True 119 120 for signature in key["signatures"]: 121 122 # Skip unknown signers and self-signatures. 123 124 signer = signature["userid"] 125 if not signer: 126 continue 127 try: 128 gpg.listKeys(signature["keyid"]) 129 except MoinMessageError: 130 continue 131 132 if not first: 133 write(fmt.linebreak(0)) 134 write(fmt.text(signer)) 135 first = False 136 137 write(fmt.table_cell(on=0)) 138 write(fmt.table_row(on=0)) 139 140 write(fmt.rawHTML("</tbody></table>")) 141 142 # Class methods. 143 144 def getOutputTypes(self): 145 return self.output_mimetypes 146 147 getOutputTypes = classmethod(getOutputTypes) 148 149 # vim: tabstop=4 expandtab shiftwidth=4