Beispiel #1
0
def mapJS(wiki_name, page_locs, nearby_locs, request):
    """
    Create a string containing javascript for google map
    page = the page object
    place = place object of center of map
    nearby = dictionary of nearby places
    """
    # pick center point as the first point if there's more than one point
    # associated with the page
    center = page_locs[0]

    pagename = center.pagename
    page = Page(pagename, request, wiki_name=wiki_name)
    out = """
<script type="text/javascript">
//<![CDATA[
function doLoad() {
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl()); 
map.setCenter(new GLatLng(%s,%s),16);
        """ % (center.latitude, center.longitude)

    nearbys_processed = {}
    i = 0  # for 'a' 'b' labels on markers
    if nearby_locs:
        for x in nearby_locs:
            nearby_page = Page(x.pagename, request, wiki_name=wiki_name)
            if (x.pagename, x.latitude, x.longitude) in nearbys_processed:
                # only plot a given nearby point once
                # (it is sometimes easier to just have repeated nearbys
                # in the query, hence we filter them out here)
                continue
            namestr = ("""'<b><a href="%s" target=_parent>%s</a></b>"""
                       """<br>%s'""" % (nearby_page.url(relative=False),
                                        x.pagename.replace("'", "\\" + "'"),
                                        x.address.replace("'", "\\" + "'")))
            out += """
            var point = new GLatLng(%s,%s);
            map.addOverlay(createMarker(point,%s, %s));
            """ % (x.latitude, x.longitude, i, namestr)
            # add it as plotted
            nearbys_processed[(x.pagename, x.latitude, x.longitude)] = None
            i += 1

    for x in page_locs:
        namestr = (
            """'<b><a href="%s" target=_parent>%s</a></b>"""
            """<br>%s'""" %
            (page.url(relative=False), x.pagename.replace(
                "'", "\\" + "'"), x.address.replace("'", "\\" + "'")))
        out += ("var p_point = new GLatLng(%s,%s);\n"
                "var myArrow = createArrow(p_point,%s);\n"
                "map.addOverlay(myArrow);\n"
                "GEvent.trigger(myArrow,'click');" %
                (x.latitude, x.longitude, namestr))

    out += """
            loaded = true;
       }
       //]]>
       </script>"""
    return out
Beispiel #2
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))
Beispiel #3
0
def mapJS(wiki_name, page_locs, nearby_locs, request):
    """
    Create a string containing javascript for google map
    page = the page object
    place = place object of center of map
    nearby = dictionary of nearby places
    """
    # pick center point as the first point if there's more than one point
    # associated with the page
    center = page_locs[0]

    pagename = center.pagename
    page = Page(pagename, request, wiki_name=wiki_name)
    out = """
<script type="text/javascript">
//<![CDATA[
function doLoad() {
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl()); 
map.setCenter(new GLatLng(%s,%s),16);
        """ % (
        center.latitude,
        center.longitude,
    )

    nearbys_processed = {}
    i = 0  # for 'a' 'b' labels on markers
    if nearby_locs:
        for x in nearby_locs:
            nearby_page = Page(x.pagename, request, wiki_name=wiki_name)
            if (x.pagename, x.latitude, x.longitude) in nearbys_processed:
                # only plot a given nearby point once
                # (it is sometimes easier to just have repeated nearbys
                # in the query, hence we filter them out here)
                continue
            namestr = """'<b><a href="%s" target=_parent>%s</a></b>""" """<br>%s'""" % (
                nearby_page.url(relative=False),
                x.pagename.replace("'", "\\" + "'"),
                x.address.replace("'", "\\" + "'"),
            )
            out += """
            var point = new GLatLng(%s,%s);
            map.addOverlay(createMarker(point,%s, %s));
            """ % (
                x.latitude,
                x.longitude,
                i,
                namestr,
            )
            # add it as plotted
            nearbys_processed[(x.pagename, x.latitude, x.longitude)] = None
            i += 1

    for x in page_locs:
        namestr = """'<b><a href="%s" target=_parent>%s</a></b>""" """<br>%s'""" % (
            page.url(relative=False),
            x.pagename.replace("'", "\\" + "'"),
            x.address.replace("'", "\\" + "'"),
        )
        out += (
            "var p_point = new GLatLng(%s,%s);\n"
            "var myArrow = createArrow(p_point,%s);\n"
            "map.addOverlay(myArrow);\n"
            "GEvent.trigger(myArrow,'click');" % (x.latitude, x.longitude, namestr)
        )

    out += """
            loaded = true;
       }
       //]]>
       </script>"""
    return out
Beispiel #4
0
    def testUrl(self):
        """Test's Page.url()."""
        from Sycamore.Page import Page
        from Sycamore import farm
        list_of_wikis = self._get_list_of_wikis()

        # relative, w/o query string
        for trial in xrange(0, 200):
            pagename = make_random_string(MAX_PAGENAME_LENGTH)
            page = Page(pagename, self.request)
            pagename = page.proper_name()
            pagename_encoded = wikiutil.quoteWikiname(pagename)
            proper_url = '/%s' % pagename_encoded
            self.assertEqual(proper_url, page.url())

        # relative, w/ query string
        for trial in xrange(0, 200):
            pagename = make_random_string(MAX_PAGENAME_LENGTH)
            query = '?'
            the_range = random.randint(0, 10)
            for i in xrange(0, the_range):
                if i < (the_range-1): amperstand = '&'
                else: amperstand = ''
                query += ('%s=%s%s' %
                    (make_random_string(50, alphanum_only=True),
                     make_random_string(50, alphanum_only=True),
                     amperstand))
            page = Page(pagename, self.request)
            pagename = page.proper_name()
            pagename_encoded = wikiutil.quoteWikiname(pagename)
            proper_url = '/%s?%s' % (pagename_encoded, query)
            self.assertEqual(proper_url, page.url(querystr = query))

        original_wiki_name = self.request.config.wiki_name

        # absolute url, switched request
        for wiki_trial in xrange(0, 10):
            self.request.switch_wiki(random.choice(list_of_wikis))
            for trial in xrange(0, 200):
                pagename = make_random_string(MAX_PAGENAME_LENGTH)
                farm_url = farm.getWikiURL(self.request.config.wiki_name,
                                           self.request)
                page = Page(pagename, self.request)
                pagename = page.proper_name()
                pagename_encoded = wikiutil.quoteWikiname(pagename)
                proper_url = '%s%s' % (farm_url, pagename_encoded)
                self.assertEqual(proper_url, page.url(relative=False))

            for trial in xrange(0, 200):
                pagename = make_random_string(MAX_PAGENAME_LENGTH)
                farm_url = farm.getWikiURL(self.request.config.wiki_name,
                                           self.request)
                query = '?'
                the_range = random.randint(0, 10)
                for i in xrange(0, the_range):
                    if i < (the_range-1):
                        amperstand = '&'
                    else:
                        amperstand = ''
                    query += ('%s=%s%s' %
                        (make_random_string(50, alphanum_only=True),
                         make_random_string(50, alphanum_only=True),
                         amperstand))
                page = Page(pagename, self.request)
                pagename = page.proper_name()
                pagename_encoded = wikiutil.quoteWikiname(pagename)
                proper_url = '%s%s?%s' % (farm_url, pagename_encoded, query)
                self.assertEqual(proper_url,
                                 page.url(querystr=query, relative=False))

        self.request.switch_wiki(original_wiki_name)

        # absolute url, non-switched request
        for wiki_trial in xrange(0, 10):
            wiki_name = random.choice(list_of_wikis)
            for trial in xrange(0, 200):
                pagename = make_random_string(MAX_PAGENAME_LENGTH)
                farm_url = farm.getWikiURL(wiki_name, self.request)
                page = Page(pagename, self.request, wiki_name=wiki_name)
                pagename = page.proper_name()
                pagename_encoded = wikiutil.quoteWikiname(pagename)
                proper_url = '%s%s' % (farm_url, pagename_encoded)
                self.assertEqual(proper_url, page.url(relative=False))

            for trial in xrange(0, 200):
                pagename = make_random_string(MAX_PAGENAME_LENGTH)
                farm_url = farm.getWikiURL(wiki_name, self.request)
                query = '?'
                the_range = random.randint(0, 10)
                for i in xrange(0, the_range):
                    if i < (the_range-1):
                        amperstand = '&'
                    else:
                        amperstand = ''
                    query += ('%s=%s%s' %
                        (make_random_string(50, alphanum_only=True),
                         make_random_string(50, alphanum_only=True),
                         amperstand))
                page = Page(pagename, self.request, wiki_name=wiki_name)
                pagename = page.proper_name()
                pagename_encoded = wikiutil.quoteWikiname(pagename)
                proper_url = '%s%s?%s' % (farm_url, pagename_encoded, query)
                self.assertEqual(proper_url,
                                 page.url(querystr = query, relative=False))
Beispiel #5
0
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)
Beispiel #6
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))
Beispiel #7
0
def execute(pagename, request):
    """
    Send recent changes as an RSS document
    """
    from Sycamore.formatter.text_html import Formatter
    formatter = Formatter(request)
    page = Page(pagename, request) 
    wiki_global = False
    bookmarks = False
    theuser = None
    if request.form.has_key('user'):
        # bookmarks
        username = urllib.unquote_plus(request.form['user'][0])
        if request.form.has_key('global') and request.form['global']:
            wiki_global = True
        theuser = user.User(request, name=username)
    if request.form.has_key('bookmarks') and request.form['bookmarks']:
        bookmarks = True

    if bookmarks and theuser:
        if not wiki_global:
            rss_init_text = (
                '<?xml version="1.0" ?>'
                '<rss version="2.0" '
                     'xmlns:dc="http://purl.org/dc/elements/1.1/">'
                '<channel><title>Bookmarks - %s @ %s</title><link>%s</link>'
                '<description>Bookmarks for user %s on %s.</description>'
                '<language>en-us</language>\n'
                '</channel> \n'
                '</rss>\n' %
                (username, request.config.sitename,
                 user.getUserLinkURL(request, theuser), username,
                 request.config.sitename))
        else:
            rss_init_text = (
                '<?xml version="1.0" ?>\n'
                '<rss version="2.0" '
                     'xmlns:dc="http://purl.org/dc/elements/1.1/">'
                '<channel><title>Interwiki Bookmarks - %s</title>'
                '<link>%s</link>'
                '<description>Interwiki bookmarks for user %s</description>'
                '<language>en-us</language>\n'
                '</channel>\n'
                '</rss>\n' %
                (username, user.getUserLinkURL(request, theuser), username))

        userid = theuser.id
        changes = wikidb.getRecentChanges(request, per_page_limit=1,
                                          userFavoritesFor=userid,
                                          wiki_global=wiki_global)
    elif pagename.lower() == rc_pagename.lower():
        rss_init_text = (
        '<?xml version="1.0" ?>\n'
        '<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">'
        '<channel><title>Recent Changes - %s</title><link>%s</link>'
        '<description>Recent Changes on %s.</description>'
        '<language>en-us</language>\n'
        '</channel>\n'
        '</rss>\n' %
        (request.config.sitename, page.url(relative=False),
         request.config.sitename))
        # get normal recent changes 
        changes = wikidb.getRecentChanges(request, total_changes_limit=100)
    elif pagename.lower() == interwiki_rc_pagename.lower() and theuser:
        wiki_global = True
        rss_init_text = (
            '<?xml version="1.0" ?>\n'
            '<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">\n'
            '<channel><title>Interwiki Recent Changes for %s</title>'
            '<link>%s</link>'
            '<description>Interwiki Recent Changes for %s.</description>'
            '<language>en-us</language>\n'
            '</channel>\n' 
            '</rss>\n' % 
            (theuser.propercased_name, page.url(relative=False),
             theuser.propercased_name))
        # get interwiki normal recent changes 
        changes = wikidb.getRecentChanges(request, total_changes_limit=100,
                                          wiki_global=True,
                                          on_wikis=theuser.getWatchedWikis())
    else:
        rss_init_text = (
            '<?xml version="1.0" ?>\n'
            '<rss version="2.0" '
                 'xmlns:dc="http://purl.org/dc/elements/1.1/">'
            '<channel><title>Recent Changes for "%s" - %s</title>'
            '<link>%s</link>'
            '<description>Recent Changes of the page "%s" on %s.</description>'
            '<language>en-us</language>\n'
            '</channel>\n'
            '</rss>\n' %
            (pagename, request.config.sitename, page.url(relative=False),
             pagename, request.config.sitename))
        # get page-specific recent changes 
        changes = wikidb.getRecentChanges(request, page=pagename.lower())

    rss_dom = xml.dom.minidom.parseString(rss_init_text)
    channel = rss_dom.getElementsByTagName("channel")[0]
    original_wiki = request.config.wiki_name
    for line in changes:
        if wiki_global:
            request.switch_wiki(line.wiki_name)
        if line.ed_time == None:
            line.ed_time = 0
        page = Page(line.pagename, request)
        line.comment = Comment(request, line.comment, line.action,
                               page=page).render()
        item = rss_dom.createElement("item")
        item_link = rss_dom.createElement("link")
        if wiki_global:
            permalink = farm.page_url(line.wiki_name, line.pagename, formatter)
        else:
            permalink = page.url(relative=False)
        item_link.appendChild(rss_dom.createTextNode(permalink))
        item.appendChild(item_link)
        item_description = rss_dom.createElement("description")
        if line.action in ['SAVE', 'SAVENEW', 'RENAME', 'COMMENT_MACRO',
                           'SAVE/REVERT', 'DELETE']:
            if not request.user.may.read(page):
                continue
            version2 = Page(line.pagename, request,
                            prev_date=line.ed_time).get_version()
            version1 = version2 - 1
            description = "%s %s" % (
                line.comment, do_diff(line.pagename, request,
                                      in_wiki_interface=False, text_mode=True,
                                      version1=version1, version2=version2))
            guid = "%s?action=diff&version1=%i&version2=%i&ts=%i" % (
                permalink, version1, version2, line.ed_time)
        else:
            description = line.comment
            guid = "%s?action=recall&version=%i&ts=%i" % (
                permalink,
                Page(line.pagename, request,
                    prev_date=line.ed_time).get_version(),
                line.ed_time)
        item_guid = rss_dom.createElement("guid")
        item_guid.appendChild(rss_dom.createTextNode(guid))
        item.appendChild(item_guid)
        item_description.appendChild(rss_dom.createTextNode(description))
        item_title = rss_dom.createElement("title")
        item_title.appendChild(rss_dom.createTextNode(line.pagename))
        item.appendChild(item_title)
        item_date = rss_dom.createElement("dc:date")
        item_date.appendChild(rss_dom.createTextNode(
            time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(line.ed_time))))
        item.appendChild(item_date)
        creator = rss_dom.createElement("dc:creator")
        creator.appendChild(rss_dom.createTextNode(
            user.User(request, line.userid).propercased_name))
        item.appendChild(creator)
        item.appendChild(item_description)
        channel.appendChild(item)

    if wiki_global:
        request.switch_wiki(original_wiki)
    the_xml = rss_dom.toxml()
    request.http_headers()
    request.write(the_xml)
Beispiel #8
0
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)