コード例 #1
0
ファイル: SpellCheck.py プロジェクト: jonpatterns/sycamore
def execute(pagename, request):
    _ = request.getText
    page = Page(pagename, request.cursor)
    if request.user.may.read(pagename):
        badwords, badwords_re, msg = checkSpelling(page, request)
    else:
        badwords = []
        msg = _("You can't check spelling on a page you can't read.")

    if badwords:
        page.send_page(request, msg=msg, hilite_re=badwords_re)
    else:
        page.send_page(request, msg=msg)
コード例 #2
0
ファイル: SpellCheck.py プロジェクト: ivanov/sycamore
def execute(pagename, request):
    _ = request.getText
    page = Page(pagename, request.cursor)
    if request.user.may.read(pagename):
        badwords, badwords_re, msg = checkSpelling(page, request)
    else:
        badwords = []
        msg = _("You can't check spelling on a page you can't read.")

    if badwords:
        page.send_page(request, msg=msg, hilite_re=badwords_re)
    else:
        page.send_page(request, msg=msg)
コード例 #3
0
ファイル: userinfo.py プロジェクト: rtucker/sycamore
def execute(pagename, request):
    _ = request.getText
    request.formatter = Formatter(request)
    page = Page(pagename, request)
    if not page.page_name.startswith(config.user_page_prefix.lower()):
        return page.send_page(msg="Not a user page.")
    username = pagename[len(config.user_page_prefix):]

    request.http_headers()

    wikiutil.simple_send_title(request, pagename,
                               strict_title="User %s's information" % username)


    request.write('<div id="content" class="content">\n\n')
    InfoBar(request, page).render()
    request.write('<div id="tabPage">')

    if config.wiki_farm:
    	request.write('<h3>Watched Wikis</h3>')
	display_watched_wikis(request, username)

    request.write('<h3>Bookmarks</h3>\n')
    display_bookmarks(request, username)

    request.write('<h3>Edits</h3>\n')
    display_edits(request, username, pagename)

    request.write('</div></div>')
    wikiutil.send_footer(request, pagename, showpage=1, noedit=True)
コード例 #4
0
ファイル: captcha.py プロジェクト: jonpatterns/sycamore
def execute(pagename, request):
    page = Page(pagename, request)
    msg = None
    form = request.form

    if form.has_key('id'):
        id = request.form['id'][0]
        return send_human_readable(id, request)
    return page.send_page(msg=msg)
コード例 #5
0
ファイル: captcha.py プロジェクト: philipn/sycamore
def execute(pagename, request):
    page = Page(pagename, request)
    msg = None
    form = request.form

    if form.has_key("id"):
        id = request.form["id"][0]
        return send_human_readable(id, request)
    return page.send_page(msg=msg)
コード例 #6
0
ファイル: __init__.py プロジェクト: ivanov/sycamore
def loadLanguage(request, lang):
    """
    Load text dictionary for a specific language.

    Note that while ISO language coded use a dash, like 'en-us', our
    languages files use '_' like 'en_us' because they are saved as
    Python source files.

    """
    from Sycamore.util import pysupport
    lang_module = "Sycamore.i18n." + filename(lang)
    texts = pysupport.importName(lang_module, "text") 
    meta = pysupport.importName(lang_module, "meta") 

    # FIXME this doesnt work, leads to &amp;amp;amp;...
    # maybe parser.wiki._do_ent_repl is the problem?
    
    # please help finding this bug. I want to get rid of html in i18n texts
    # and a nice way to do is to replace them by wiki markup. so we wont have
    # to change them every time we go to a new html standard (like html 4.01
    # now and soon maybe xhtml).
    
    # use the wiki parser now to replace some wiki markup with html
    # maybe this is the better implementation, less overhead
    if 0:
        from Sycamore.Page import Page
        from Sycamore.parser.wiki import Parser
        from Sycamore.formatter.text_html import Formatter
        import cStringIO
        for key in texts:
            text = texts[key]
            out = cStringIO.StringIO()
            request.redirect(out)
            print "making parser ..."
            parser = Parser(text, request)
            formatter = Formatter(request)
            p = Page("$$$$i18n$$$$")
            formatter.setPage(p)
            print "formatting ..."
            parser.format(formatter)
            print "formatting finished ..."
            text = out.getvalue()
            request.redirect()
            #if text.startswith("<p>\n"):
            #    text = text[4:]
            #if text.endswith("</p>\n"):
            #    text = text[:-5]
            #print text
            
            # XXX catch problem early:
            if "&amp;amp;" in text:
                raise str(key)+str(text)
            
            texts[key] = text
        
    #alternative implementation, also doesnt work:
    if 0:
        import cStringIO
        from Sycamore.Page import Page
        page = Page("$$$i18n$$$")
        #key = "xxx"
        for key in texts:
            text = texts[key]
            page.set_raw_body(text, 1)
            out = cStringIO.StringIO()
            request.redirect(out)
            page.send_page(request, content_only=1)
            text = out.getvalue()
            if text.startswith("<p>\n"):
                text = text[4:]
            if text.endswith("</p>\n"):
                text = text[:-5]
            #print text
            request.redirect()
            texts[key] = text
        
    # TODO caching for CGI or performance will suck
    # pickle texts dict to caching area

    # XXX UNICODE
    # convert to unicode
    #encoding = meta['encoding']
    #for t in texts:
    #    texts[t] = texts[t].decode(encoding)
    return texts
コード例 #7
0
ファイル: Security.py プロジェクト: ivanov/sycamore
def execute(pagename, request):
    _ = request.getText
    page = Page(pagename, request)
    actname = __name__.split('.')[-1] 
    if not request.user.may.admin(page):
        msg = _("You don't have admin permissions on this page, "
                "so you cannot change security settings.")
        return page.send_page(msg)
    
    if request.form.has_key('button'):
        # process save
        groups = [] 
        groups_dict = {}
        for key in request.form:
            if key.endswith('_groupname'):
                groups.append(unquoteWikiname(key[:-10]))
            else:
                if key.endswith('_may_read'):
                    dowhat = 'read'
                    groupname = unquoteWikiname(key[:-9])
                elif key.endswith('_may_edit'):
                    dowhat = 'edit'
                    groupname = unquoteWikiname(key[:-9])
                elif key.endswith('_may_delete'):
                    dowhat = 'delete'
                    groupname = unquoteWikiname(key[:-11])
                elif key.endswith('_may_admin'):
                    dowhat = 'admin'
                    groupname = unquoteWikiname(key[:-10])
                else:
                    continue

                if not groups_dict.has_key(groupname):
                    groups_dict[groupname] = [False, False, False, False]

                groups_dict[groupname][ACL_RIGHTS_TABLE[dowhat]] = True

        # set groups we weren't sent any checkboxes for to
        # all false (nothing checked)
        groups_no_checks = filter(lambda(groupname): (
            groupname not in groups_dict), groups)
        for groupname in groups_no_checks:
            groups_dict[groupname] = [False, False, False, False]
 
        wikiacl.setACL(pagename, groups_dict, request)
        return page.send_page(
            msg = _("Security settings sucessfully changed!"))

    formhtml = ['<h3>Security settings for "%s":</h3>' % pagename]

    button = _("Save")
    url = page.url()
    d = {'url': url, 'actname': actname, 'button': button}
    formhtml.append('<form method="POST" action="%(url)s">\n'
                    '<input type="hidden" name="action" value="%(actname)s">\n'
                    % d)

    custom_groups = user.getGroupList(request, exclude_special_groups=True)
    grouplist = ['All', 'Known'] + custom_groups
    for groupname in grouplist:
        # "All" and "Known" are a bit condense
        if groupname == 'All':
            written_groupname = 'Everybody'
        elif groupname == 'Known':
            written_groupname = 'Logged in people'
        else:
            written_groupname = groupname

        group = wikiacl.Group(groupname, request, fresh=True)

        # we want to show the 'change security' option only if
        # it makes some sense
        show_admin = groupname in custom_groups

        formhtml.append('<h6>%s</h6>' % written_groupname)
        formhtml.append('<input type="hidden" name="%s_groupname" '
                                  'value="1">' % quoteWikiname(groupname))
        if group.may(page, 'read'):
            formhtml.append('<input type="checkbox" checked '
                                    'name="%s_may_read" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_read" '
                                   'value="1">' % quoteWikiname(groupname))
        formhtml.append(' read ')

        if group.may(page, 'edit'):
            formhtml.append('<input type="checkbox" checked '
                                   'name="%s_may_edit" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_edit" '
                                   'value="1">' % quoteWikiname(groupname))
        formhtml.append(' edit ') 

        if group.may(page, 'delete'):
            formhtml.append('<input type="checkbox" checked '
                                   'name="%s_may_delete" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_delete" '
                                   'value="1">' % quoteWikiname(groupname))
        formhtml.append(' delete ')

        if show_admin:
            if group.may(page, 'admin'):
                formhtml.append('<input type="checkbox" checked '
                                       'name="%s_may_admin" value="1">' %
                                quoteWikiname(groupname))
            else:
                formhtml.append('<input type="checkbox" name="%s_may_admin" '
                                       'value="1">' % quoteWikiname(groupname))
            formhtml.append(' change security ')

    formhtml.append(
        '<p><input type="submit" name="button" value="%(button)s">\n'
        '</p>\n'
        '</form>' % d)

    page.send_page(msg=''.join(formhtml))
コード例 #8
0
ファイル: revert.py プロジェクト: rtucker/sycamore
def execute(pagename, request):
    from Sycamore.PageEditor import PageEditor
    _ = request.getText
    actname = __name__.split('.')[-1]
    page = Page(pagename, request)
    permanent = False
    showrc = True
    if not request.user.may.edit(page):
        return page.send_page(
            msg = _('You are not allowed to revert this page!'))

    # check whether the user clicked the delete button
    if request.form.has_key('button') and request.form.has_key('ticket'):
        # check whether this is a valid deletion request (make outside
        # attacks harder by requiring two full HTTP transactions)
        if not _checkTicket(request.form['ticket'][0]):
            return page.send_page(
                msg = _('Please use the interactive user interface to '
                        'revert pages!'))
        # revert the page
        if request.form.has_key('version'):
            version = int(request.form['version'][0])
            oldpg = Page(pagename, request, version=version)
            date = oldpg.prev_date
            if request.form.has_key('comment'):
                entered_comment = request.form['comment'][0]
            else:
                entered_comment = ''
            if len(entered_comment) > wikiaction.MAX_COMMENT_LENGTH:
                return page.send_page(msg = _(
                    'Comments must be less than %s characters long.' %
                    wikiaction.MAX_COMMENT_LENGTH))
            else:
                comment = 'v%s' % str(version)

            comment = "%sc%s" % (comment, entered_comment)
        else:
            return

        if (request.form.has_key('permanent') and
            request.form['permanent'][0] and request.user.may.admin(page)):
            permanent = True
            if (request.form.has_key('noshowrc') and
                request.form['noshowrc'][0]):
                showrc = False

        pg = PageEditor(pagename, request)
        savemsg = revert_to_page(oldpg, request, pg, comment=comment,
                                 permanent=permanent, showrc=showrc)
        return pg.send_page(msg=savemsg,
                            force_regenerate_content=(permanent and not
                                                      showrc))

    # get version
    if request.form.has_key('version'):
        version = request.form['version'][0]
    else:
        return page.send_page(msg= _(
            'Please use the interactive user interface to revert pages!'))

    oldpg = Page(pagename, request, version=version)
    # send revert form
    url = page.url()
    ticket = _createTicket()
    button = _('Revert')
    comment_label = _("Reason for the revert:")
    if request.user.may.admin(page):
        admin_label = (
            '<p>Permanently remove newer versions: '
            '<input id="noshowrctoggle" type="checkbox" name="permanent" '
                   'value="1"><span id="noshowrc">'
            "Don't log on Recent Changes: "
            '<input type="checkbox" name="noshowrc" value="1"></span></p>\n'
            '<script type="text/javascript">\n'
            "document.getElementById('noshowrc').style.visibility = "
                "'hidden';\n"
            "document.getElementById('noshowrc').style.paddingLeft = "
                "'1em';\n"
            "document.getElementById('noshowrctoggle').onclick = "
                "function () {\n"
            "document.getElementById('noshowrc').style.visibility = "
                "document.getElementById('noshowrctoggle').checked ? "
                    "'visible' : 'hidden'; \n"
            "}\n"
            "</script>\n"
        )
    else:
        admin_label = ''

    formhtml = (
        '<form method="GET" action="%(url)s">'
        '<input type="hidden" name="action" value="%(actname)s">'
        '<input type="hidden" name="ticket" value="%(ticket)s">'
        '<input type="hidden" name="version" value="%(version)s">'
        '<p>'
        '%(comment_label)s'
        '</p>'
        '<input type="text" name="comment" size="60" maxlength="80">'
        '<input type="submit" name="button" value="%(button)s">'
        '%(admin_label)s'
        '</form>' % {
            'url': url,
            'actname': actname,
            'ticket': ticket,
            'button': button,
            'comment_label': comment_label,
            'version': version,
            'admin_label': admin_label,
    })

    return oldpg.send_page(msg=formhtml)
コード例 #9
0
def execute(pagename, request):
    _ = request.getText
    page = Page(pagename, request)
    actname = __name__.split('.')[-1]
    if not request.user.may.admin(page):
        msg = _("You don't have admin permissions on this page, "
                "so you cannot change security settings.")
        return page.send_page(msg)

    if request.form.has_key('button'):
        # process save
        groups = []
        groups_dict = {}
        for key in request.form:
            if key.endswith('_groupname'):
                groups.append(unquoteWikiname(key[:-10]))
            else:
                if key.endswith('_may_read'):
                    dowhat = 'read'
                    groupname = unquoteWikiname(key[:-9])
                elif key.endswith('_may_edit'):
                    dowhat = 'edit'
                    groupname = unquoteWikiname(key[:-9])
                elif key.endswith('_may_delete'):
                    dowhat = 'delete'
                    groupname = unquoteWikiname(key[:-11])
                elif key.endswith('_may_admin'):
                    dowhat = 'admin'
                    groupname = unquoteWikiname(key[:-10])
                else:
                    continue

                if not groups_dict.has_key(groupname):
                    groups_dict[groupname] = [False, False, False, False]

                groups_dict[groupname][ACL_RIGHTS_TABLE[dowhat]] = True

        # set groups we weren't sent any checkboxes for to
        # all false (nothing checked)
        groups_no_checks = filter(
            lambda (groupname): (groupname not in groups_dict), groups)
        for groupname in groups_no_checks:
            groups_dict[groupname] = [False, False, False, False]

        wikiacl.setACL(pagename, groups_dict, request)
        return page.send_page(msg=_("Security settings sucessfully changed!"))

    formhtml = ['<h3>Security settings for "%s":</h3>' % pagename]

    button = _("Save")
    url = page.url()
    d = {'url': url, 'actname': actname, 'button': button}
    formhtml.append(
        '<form method="POST" action="%(url)s">\n'
        '<input type="hidden" name="action" value="%(actname)s">\n' % d)

    custom_groups = user.getGroupList(request, exclude_special_groups=True)
    grouplist = ['All', 'Known'] + custom_groups
    for groupname in grouplist:
        # "All" and "Known" are a bit condense
        if groupname == 'All':
            written_groupname = 'Everybody'
        elif groupname == 'Known':
            written_groupname = 'Logged in people'
        else:
            written_groupname = groupname

        group = wikiacl.Group(groupname, request, fresh=True)

        # we want to show the 'change security' option only if
        # it makes some sense
        show_admin = groupname in custom_groups

        formhtml.append('<h6>%s</h6>' % written_groupname)
        formhtml.append('<input type="hidden" name="%s_groupname" '
                        'value="1">' % quoteWikiname(groupname))
        if group.may(page, 'read'):
            formhtml.append('<input type="checkbox" checked '
                            'name="%s_may_read" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_read" '
                            'value="1">' % quoteWikiname(groupname))
        formhtml.append(' read ')

        if group.may(page, 'edit'):
            formhtml.append('<input type="checkbox" checked '
                            'name="%s_may_edit" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_edit" '
                            'value="1">' % quoteWikiname(groupname))
        formhtml.append(' edit ')

        if group.may(page, 'delete'):
            formhtml.append('<input type="checkbox" checked '
                            'name="%s_may_delete" value="1">' %
                            quoteWikiname(groupname))
        else:
            formhtml.append('<input type="checkbox" name="%s_may_delete" '
                            'value="1">' % quoteWikiname(groupname))
        formhtml.append(' delete ')

        if show_admin:
            if group.may(page, 'admin'):
                formhtml.append('<input type="checkbox" checked '
                                'name="%s_may_admin" value="1">' %
                                quoteWikiname(groupname))
            else:
                formhtml.append('<input type="checkbox" name="%s_may_admin" '
                                'value="1">' % quoteWikiname(groupname))
            formhtml.append(' change security ')

    formhtml.append(
        '<p><input type="submit" name="button" value="%(button)s">\n'
        '</p>\n'
        '</form>' % d)

    page.send_page(msg=''.join(formhtml))
コード例 #10
0
ファイル: randomitem.py プロジェクト: ivanov/sycamore
def execute(macro, args, formatter=None):
    if not formatter:
        formatter = macro.formatter
    _ = macro.request.getText

    re_args = re.search('(?P<caption>.+)\,\s(?P<the_rest>.*)', args)
    pagename = re_args.group('caption')
    items = re_args.group('the_rest')
    page = Page(pagename, macro.request)

    try:
        links = max(int(items), 1)
    except StandardError:
        links = 1

    raw = page.get_raw_body(fresh=macro.request.set_cache)
    if not macro.request.user.may.read(page):
        raw = ""

    # this selects lines looking like a list item
    # !!! TODO: make multi-line quotes possible
    # (optionally split by "----" or something)
    quotes = raw.splitlines()
    if links > 1:
        quotes = [quote for quote in quotes if quote.startswith(' *')]
        random.shuffle(quotes)
        while len(quotes) > links:
            quotes = quotes[:-1]
        quote = ''

        for name in quotes:
            quote = quote + name + '\n'
            
        page.set_raw_body(quote, 1)
        out = cStringIO.StringIO()
        macro.request.redirect(out)
        page.send_page(content_only=1,
                       content_id="randomquote_%s" %
                                   wikiutil.quoteWikiname(page.page_name) )
        quote = out.getvalue()
        macro.request.redirect()
    else:
        quotes = [quote.strip() for quote in quotes]
        quotes = [quote[2:] for quote in quotes if quote.startswith('* ')]
        if quotes:
            quote = random.choice(quotes)
        else:
            quote = ''

        page.set_raw_body(quote, 1)
        out = cStringIO.StringIO()
        macro.request.redirect(out)
        page.send_page(content_only=1,
                       content_id="randomquote_%s" %
                                  wikiutil.quoteWikiname(page.page_name) )
        quote = out.getvalue()
        macro.request.redirect()

    if not quotes:
        return (macro.formatter.highlight(1) +
                _('No quotes on %(pagename)s.') % {'pagename': pagename} +
                macro.formatter.highlight(0))
    
    return quote.decode(config.charset)
コード例 #11
0
def execute(pagename, request):
    from Sycamore.PageEditor import PageEditor
    _ = request.getText
    actname = __name__.split('.')[-1]
    page = Page(pagename, request)
    msg = None
    form = request.form
    wikiname = None
    
    if not config.wiki_farm or not config.allow_web_based_wiki_creation:
        return page.send_page(msg='You are not allowed to create new wikis.')
    if not request.user.valid:
        return page.send_page(msg='You must be logged in to create new wikis.')

    if do_email_auth:
        if request.form.has_key('send_email') and request.form['send_email'][0]:
            if (not request.form.has_key('wikiname') or not
                request.form['wikiname'][0]):
                return page.send_page(msg='Missing wiki name.')
            wikiname = request.form['wikiname'][0].lower()
            if not farm.isValidWikiName(wikiname):
                msg = ('Wiki creation failed because the wiki name "%s" is '
                       'invalid.  You may only use the numbers 0-9, the '
                       'letters a-z, and the dash "-" in a wiki name.' %
                       wikiname)
            elif wikiutil.isInFarm(wikiname, request):
                msg = 'Wiki "%s" already exists!' % wikiname 
            else:
                msg = send_validation_email(wikiname, request)
            return page.send_page(msg=msg)
        email_code = has_valid_email_link(request)
        if not email_code:
            return page.send_page(msg=("Invalid email link. "
                                       "To create a wiki you must follow the link send to your email account."))
        
    if form.has_key('wikiname') and form['wikiname'][0]:
        can_create_wiki = False
        wikiname = form['wikiname'][0].lower()
        if do_email_auth:
            if not config.captcha_support:
                can_create_wiki = True
            elif form.has_key('captcha_id') and form.has_key('captcha_code'):
                this_captcha = captcha.Captcha(page, id=form['captcha_id'][0])
                if this_captcha.check(form['captcha_code'][0]):
                    can_create_wiki = True
                else:
                    msg = ('Human verification was incorrect.  '
                           'Please try again!')
            else:
                if form.has_key('audio'):
                    type = 'wav'
                else:
                    type = 'png'
                captcha.send_captcha(page, wikiname, actname, email_code, type)
                return
        else:
            can_create_wiki = True

        if can_create_wiki:
            msg = farm.create_wiki(wikiname, request.user.name, request)
            if do_email_auth:
                _clearAuthCode(request, wikiname, email_code)
            if msg:
                # there was a problem
                return page.send_page(msg=msg)

            farm.add_wiki_to_watch(wikiname, request) 

            formatter = Formatter(request)
            wiki_location = farm.link_to_wiki(wikiname, formatter)
            msg = (
                'Wiki "%s" created successfully! '
                'Follow this link to get to your wiki:\n'
                '<p>\n'
                '%s\n'
                '</p>\n'
                '<p>\n'
                'The wiki was added to your list of watched wikis '
                '(change in '
                    '<a href="%sUser_Settings">your account settings</a>).\n'
                '</p>' %
                (wikiname, wiki_location, farm.getBaseFarmURL(request)))

    return page.send_page(msg=msg)
コード例 #12
0
ファイル: revert.py プロジェクト: jonpatterns/sycamore
def execute(pagename, request):
    from Sycamore.PageEditor import PageEditor
    _ = request.getText
    actname = __name__.split('.')[-1]
    page = Page(pagename, request)
    permanent = False
    showrc = True
    if not request.user.may.edit(page):
        return page.send_page(
            msg = _('You are not allowed to revert this page!'))

    # check whether the user clicked the delete button
    if request.form.has_key('button') and request.form.has_key('ticket'):
        # check whether this is a valid deletion request (make outside
        # attacks harder by requiring two full HTTP transactions)
        if not _checkTicket(request.form['ticket'][0]):
            return page.send_page(
                msg = _('Please use the interactive user interface to '
                        'revert pages!'))
        # revert the page
        if request.form.has_key('version'):
            version = int(request.form['version'][0])
            oldpg = Page(pagename, request, version=version)
            date = oldpg.prev_date
            if request.form.has_key('comment'):
                entered_comment = request.form['comment'][0]
            else:
                entered_comment = ''
            if len(entered_comment) > wikiaction.MAX_COMMENT_LENGTH:
                return page.send_page(msg = _(
                    'Comments must be less than %s characters long.' %
                    wikiaction.MAX_COMMENT_LENGTH))
            else:
                comment = 'v%s' % str(version)

            comment = "%sc%s" % (comment, entered_comment)
        else:
            return

        if (request.form.has_key('permanent') and
            request.form['permanent'][0] and request.user.may.admin(page)):
            permanent = True
            if (request.form.has_key('noshowrc') and
                request.form['noshowrc'][0]):
                showrc = False

        pg = PageEditor(pagename, request)
        savemsg = revert_to_page(oldpg, request, pg, comment=comment,
                                 permanent=permanent, showrc=showrc)
        return pg.send_page(msg=savemsg,
                            force_regenerate_content=(permanent and not
                                                      showrc))

    # get version
    if request.form.has_key('version'):
        version = request.form['version'][0]
    else:
        return page.send_page(msg= _(
            'Please use the interactive user interface to revert pages!'))

    oldpg = Page(pagename, request, version=version)
    # send revert form
    url = page.url()
    ticket = _createTicket()
    button = _('Revert')
    comment_label = _("Reason for the revert:")
    if request.user.may.admin(page):
        admin_label = (
            '<p>Permanently remove newer versions: '
            '<input id="noshowrctoggle" type="checkbox" name="permanent" '
                   'value="1"><span id="noshowrc">'
            "Don't log on Recent Changes: "
            '<input type="checkbox" name="noshowrc" value="1"></span></p>\n'
            '<script type="text/javascript">\n'
            "document.getElementById('noshowrc').style.visibility = "
                "'hidden';\n"
            "document.getElementById('noshowrc').style.paddingLeft = "
                "'1em';\n"
            "document.getElementById('noshowrctoggle').onclick = "
                "function () {\n"
            "document.getElementById('noshowrc').style.visibility = "
                "document.getElementById('noshowrctoggle').checked ? "
                    "'visible' : 'hidden'; \n"
            "}\n"
            "</script>\n"
        )
    else:
        admin_label = ''

    formhtml = (
        '<form method="GET" action="%(url)s">'
        '<input type="hidden" name="action" value="%(actname)s">'
        '<input type="hidden" name="ticket" value="%(ticket)s">'
        '<input type="hidden" name="version" value="%(version)s">'
        '<p>'
        '%(comment_label)s'
        '</p>'
        '<input type="text" name="comment" size="60" maxlength="80">'
        '<input type="submit" name="button" value="%(button)s">'
        '%(admin_label)s'
        '</form>' % {
            'url': url,
            'actname': actname,
            'ticket': ticket,
            'button': button,
            'comment_label': comment_label,
            'version': version,
            'admin_label': admin_label,
    })

    return oldpg.send_page(msg=formhtml)