Attachment 'ShowDecrypted.py'
Download 1 # -*- coding: iso-8859-1 -*-
2 """
3 MoinMoin - ShowDecrypted Action
4
5 PURPOSE:
6 This action is used to display an encrypted page
7
8 MODIFICATION HISTORY:
9 @copyright: 2008 by Frank Maloschytzki (Frank.Maloschytzki@gansnett.de)
10 @license: GNU GPL, see COPYING for details.
11 Version: 0.1
12
13 Part of code is copied from Whois.py and test.py
14
15
16
17 """
18
19 from MoinMoin.Page import Page
20 from MoinMoin.formatter.text_html import Formatter
21 from MoinMoin.action import ActionBase
22 from MoinMoin.parser.text_moin_wiki import Parser as WikiParser
23 from base64 import b64decode
24 from Crypto.Cipher import AES
25
26
27 PAGENAME = u'ThisPageDoesNotExistsAndWillNeverBeReally'
28 CRYPTHEADER = u'Encrypted Page:'
29
30
31 class ShowDecrypted(ActionBase):
32 """ Show Decrypted page action
33
34 """
35
36
37 def __init__(self, pagename, request):
38 ActionBase.__init__(self, pagename, request)
39 self.use_ticket = False
40 _ = self._
41 self.form_trigger = 'passphrase'
42 self.form_trigger_label = _('Show Decrypted')
43 self.thispage = Page(request, pagename)
44
45
46
47
48 def expandto16(self, text, fillchar=' '):
49 """ Expand length of string to multiple of 16 by adding spaces
50 """
51 i = len(text) % 16
52 if i != 0:
53 return text + fillchar*(16-i)
54 else:
55 return text
56
57
58
59
60 def parse(self, text):
61 """Parse text and return html
62 Create a page with text, then parse it and format using html formatter
63 """
64 request = self.request
65 assert text is not None
66 request.reset()
67 page = Page(request, PAGENAME)
68 page.hilite_re = None
69 page.set_raw_body(text)
70 formatter = Formatter(request)
71 formatter.setPage(page)
72 page.formatter = formatter
73 request.formatter = formatter
74 parser = WikiParser(text, request, line_anchors=False)
75 formatter.startContent('') # needed for _include_stack init
76 output = request.redirectedOutput(parser.format, formatter)
77 formatter.endContent('')
78 return output
79
80
81
82 def do_action(self):
83 _ = self._
84 form = self.form
85 passphrase = self.expandto16(form.get('pass', [u''])[0])
86 #passphrase = form.get('pass', [u''])[0]
87 text = self.thispage.get_body()
88 if text.find(CRYPTHEADER) == -1:
89 self.render_msg(_('This page is not encrypted'))
90 return
91 text = text[len(CRYPTHEADER):]
92 text = b64decode(text)
93 # Now decrypt
94 obj = AES.new(passphrase, AES.MODE_ECB)
95 ctext = obj.decrypt(text)
96
97 self.request.formatter = Formatter(self.request)
98 self.request.http_headers()
99 self.request.setContentLanguage(self.request.lang)
100 self.request.theme.send_title(self.pagename, pagename=self.pagename)
101 self.request.write(self.request.formatter.startContent("content"))
102 self.request.write(self.parse(unicode(ctext, 'latin-1')))
103 self.request.write(self.request.formatter.endContent())
104 self.request.theme.send_footer(self.pagename)
105
106 return
107
108
109
110
111 def get_form_html(self, buttons_html):
112 _ = self._
113 d = {
114 'pagename': self.pagename,
115 'pass_label': _("Passphrase"),
116 'buttons_html': buttons_html,
117 }
118 return '''
119 <table>
120 <tr>
121 <td class="label"><label>%(pass_label)s</label></td>
122 <td class="content">
123 <input type="text" name="pass" maxlength="128">
124 </td>
125 </tr>
126 <tr>
127 <td></td>
128 <td class="buttons">
129 %(buttons_html)s
130 </td>
131 </tr>
132 </table>
133 ''' % d
134
135
136
137
138 def work(self):
139 """ This is the main function called by action's
140 execute() function.
141
142 check for user and for posted forms, etc.
143 """
144 _ = self._
145 form = self.form
146
147 if form.has_key(self.form_cancel):
148 self.render_cancel()
149 return
150
151 # Validate allowance, user rights and other conditions.
152 error = None
153 if self.is_excluded():
154 error = _('Action %(actionname)s is excluded in this wiki!') % {'actionname': self.actionname }
155 elif not self.is_allowed():
156 error = _('You are not allowed to use action %(actionname)s on thispage!') % {'actionname': self.actionname }
157 if error is None:
158 self.check_condition()
159 if error:
160 self.render_msg(error)
161 elif form.has_key(self.form_trigger) or form.has_key('pass'):
162 # user hit the trigger button
163 if self.ticket_ok():
164 self.do_action()
165 return
166 else:
167 self.render_msg(_('Please use the interactive user interface to use action %(actionname)s!') % {'actionname': self.actionname })
168 return
169 else:
170 # Return a new form
171 self.render_msg(self.make_form())
172
173 def execute(pagename, request):
174 """ Do your work
175 """
176 _ = request.getText
177
178 # Don't check if personal wiki
179 # if request.user.valid:
180 # username = request.user.name
181 # else:
182 # username = ''
183 #
184 # if not username:
185 # return thispage.send_page(
186 # msg = _('Please log in first.'))
187
188
189 ShowDecrypted(pagename, request).work()
Attached Files
To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.You are not allowed to attach a file to this page.