# -*- coding: iso-8859-1 -*-
"""
    MoinMoin - ShowDecrypted Action

    PURPOSE:
        This action is used to display an encrypted page

    MODIFICATION HISTORY:
        @copyright: 2008 by Frank Maloschytzki (Frank.Maloschytzki@gansnett.de)
        @license: GNU GPL, see COPYING for details.
        Version: 0.1

    Part of code is copied from Whois.py  and test.py



"""

from MoinMoin.Page import Page
from MoinMoin.formatter.text_html import Formatter
from MoinMoin.action import ActionBase
from MoinMoin.parser.text_moin_wiki import Parser as WikiParser
from base64 import b64decode
from Crypto.Cipher import AES


PAGENAME = u'ThisPageDoesNotExistsAndWillNeverBeReally'
CRYPTHEADER = u'Encrypted Page:'


class ShowDecrypted(ActionBase):
    """ Show Decrypted page action

    """


    def __init__(self, pagename, request):
        ActionBase.__init__(self, pagename, request)
        self.use_ticket = False
        _ = self._
        self.form_trigger = 'passphrase'
        self.form_trigger_label = _('Show Decrypted')
        self.thispage = Page(request, pagename)




    def expandto16(self, text, fillchar=' '):
        """ Expand length of string to multiple of 16 by adding spaces
        """
        i = len(text) % 16
        if i != 0:
            return text + fillchar*(16-i)
        else:
            return text




    def parse(self, text):
        """Parse text and return html
        Create a page with text, then parse it and format using html formatter
        """
        request = self.request
        assert text is not None
        request.reset()
        page = Page(request, PAGENAME)
        page.hilite_re = None
        page.set_raw_body(text)
        formatter = Formatter(request)
        formatter.setPage(page)
        page.formatter = formatter
        request.formatter = formatter
        parser = WikiParser(text, request, line_anchors=False)
        formatter.startContent('') # needed for _include_stack init
        output = request.redirectedOutput(parser.format, formatter)
        formatter.endContent('')
        return output



    def do_action(self):
        _ = self._
        form = self.form
        passphrase = self.expandto16(form.get('pass', [u''])[0])
        #passphrase = form.get('pass', [u''])[0]
        text = self.thispage.get_body()
        if text.find(CRYPTHEADER) == -1:
            self.render_msg(_('This page is not encrypted'))
            return
        text = text[len(CRYPTHEADER):]
        text = b64decode(text)
        # Now decrypt
        obj = AES.new(passphrase, AES.MODE_ECB)
        ctext = obj.decrypt(text)

        self.request.formatter = Formatter(self.request)
        self.request.http_headers()
        self.request.setContentLanguage(self.request.lang)
        self.request.theme.send_title(self.pagename, pagename=self.pagename)
        self.request.write(self.request.formatter.startContent("content"))
        self.request.write(self.parse(unicode(ctext, 'latin-1')))
        self.request.write(self.request.formatter.endContent())
        self.request.theme.send_footer(self.pagename)
        
        return

    
    

    def get_form_html(self, buttons_html):
        _ = self._
        d = {
            'pagename': self.pagename,
            'pass_label': _("Passphrase"),
            'buttons_html': buttons_html,
        }
        return '''
<table>
               <tr>
               <td class="label"><label>%(pass_label)s</label></td>
               <td class="content">
               <input type="text" name="pass" maxlength="128">
               </td>
               </tr>
               <tr>
               <td></td>
               <td class="buttons">
               %(buttons_html)s
               </td>
               </tr>
</table>
''' % d

    
    
    
    def work(self):
        """ This is the main function called by action's
            execute() function.

            check for user and for posted forms, etc.
        """
        _ = self._
        form = self.form

        if form.has_key(self.form_cancel):
            self.render_cancel()
            return

        # Validate allowance, user rights and other conditions.
        error = None
        if self.is_excluded():
            error = _('Action %(actionname)s is excluded in this wiki!') % {'actionname': self.actionname }
        elif not self.is_allowed():
            error = _('You are not allowed to use action %(actionname)s on thispage!') % {'actionname': self.actionname }
        if error is None:
            self.check_condition()
        if error:
            self.render_msg(error)
        elif form.has_key(self.form_trigger) or form.has_key('pass'):
            # user hit the trigger button
            if self.ticket_ok():
                self.do_action()
                return
            else:
                self.render_msg(_('Please use the interactive user interface to use action %(actionname)s!') % {'actionname': self.actionname })
            return
        else:
            # Return a new form
            self.render_msg(self.make_form())

def execute(pagename, request):
    """ Do your work
    """
    _ = request.getText

# Don't check if personal wiki
#    if request.user.valid:
#        username = request.user.name
#    else:
#        username = ''
#
#    if not username:
#        return thispage.send_page(
#            msg = _('Please log in first.'))

    
    ShowDecrypted(pagename, request).work()
