示例#1
0
 def link_emit(self, node):
     target = node.content
     m = self.addr_re.match(target)
     if m:
         if m.group("page_name"):
             # link to a page
             word = m.group("page_name")
             if word.startswith(wikiutil.PARENT_PREFIX):
                 word = word[wikiutil.PARENT_PREFIX_LEN :]
             elif word.startswith(wikiutil.CHILD_PREFIX):
                 word = "%s/%s" % (self.formatter.page.page_name, word[wikiutil.CHILD_PREFIX_LEN :])
             # handle anchors
             parts = rsplit(word, "#", 1)
             anchor = ""
             if len(parts) == 2:
                 word, anchor = parts
             return "".join(
                 [
                     self.formatter.pagelink(1, word, anchor=anchor),
                     self.emit_children(node) or self.formatter.text(target),
                     self.formatter.pagelink(0, word),
                 ]
             )
         elif m.group("extern_addr"):
             # external link
             address = m.group("extern_addr")
             proto = m.group("extern_proto")
             return "".join(
                 [
                     self.formatter.url(1, address, css=proto),
                     self.emit_children(node) or self.formatter.text(target),
                     self.formatter.url(0),
                 ]
             )
         elif m.group("inter_wiki"):
             # interwiki link
             wiki = m.group("inter_wiki")
             page = m.group("inter_page")
             return "".join(
                 [
                     self.formatter.interwikilink(1, wiki, page),
                     self.emit_children(node) or self.formatter.text(page),
                     self.formatter.interwikilink(0),
                 ]
             )
         elif m.group("attach_scheme"):
             # link to an attachment
             scheme = m.group("attach_scheme")
             attachment = m.group("attach_addr")
             url = wikiutil.url_unquote(attachment, want_unicode=True)
             text = self.get_text(node)
             return "".join(
                 [
                     self.formatter.attachment_link(1, url),
                     self.formatter.text(text),
                     self.formatter.attachment_link(0),
                 ]
             )
     return "".join(["[[", self.formatter.text(target), "]]"])
示例#2
0
 def _replace_target(self, target):
     target_and_anchor = rsplit(target, '#', 1)
     if len(target_and_anchor) > 1:
         target, anchor = target_and_anchor
         target = self._replace(('PAGE', target))
         return '%s#%s' % (target, anchor)
     else:
         target = self._replace(('PAGE', target))
         return target
示例#3
0
 def _replace_target(self, target):
     target_and_anchor = rsplit(target, '#', 1)
     if len(target_and_anchor) > 1:
         target, anchor = target_and_anchor
         target = self._replace(('PAGE', target))
         return '%s#%s' % (target, anchor)
     else:
         target = self._replace(('PAGE', target))
         return target
示例#4
0
 def _replace_target(self, target):
     target_and_anchor = rsplit(target, "#", 1)
     if len(target_and_anchor) > 1:
         target, anchor = target_and_anchor
         target = self._replace(("PAGE", target))
         return "%s#%s" % (target, anchor)
     else:
         target = self._replace(("PAGE", target))
         return target
示例#5
0
 def interwikilink(self, on, interwiki='', pagename='', **kw):
     """ calls pagelink() for internal interwikilinks
         to make sure they get counted for self.pagelinks.
         IMPORTANT: on and off must be called with same parameters, see
                    also the text_html formatter.
     """
     wikitag, wikiurl, wikitail, wikitag_bad = wikiutil.resolve_interwiki(self.request, interwiki, pagename)
     if wikitag == 'Self' or wikitag == self.request.cfg.interwikiname:
         if '#' in wikitail:
             wikitail, kw['anchor'] = rsplit(wikitail, '#', 1)
             wikitail = wikiutil.url_unquote(wikitail)
         return self.pagelink(on, wikitail, **kw)
     return ''
示例#6
0
    def _verify_endpoint_identity(self, identity):
        """
           Verify that the given identity matches the current endpoint.

           We always serve out /UserName?action=... for the UserName
           OpenID and this is pure paranoia to make sure it is that way
           on incoming data.

           Also verify that the given identity is allowed to have an OpenID.
        """
        request = self.request
        cfg = request.cfg

        # we can very well split on the last slash since usernames
        # must not contain slashes
        base, received_name = rsplit(identity, '/', 1)
        check_name = received_name

        if received_name == '':
            pg = wikiutil.getFrontPage(request)
            if pg:
                received_name = pg.page_name
                check_name = received_name
                if 'openid.user' in pg.pi:
                    received_name = pg.pi['openid.user']

        # some sanity checking
        # even if someone goes to http://johannes.sipsolutions.net/
        # we'll serve out http://johannes.sipsolutions.net/JohannesBerg?action=serveopenid
        # (if JohannesBerg is set as page_front_page)
        # For the #OpenIDUser PI, we need to allow the page that includes the PI,
        # hence use check_name here (see above for how it is assigned)
        fullidentity = '/'.join([base, check_name])
        thisurl = request.getQualifiedURL(request.page.url(request))
        if not thisurl == fullidentity:
            return False

        # again, we never put an openid.server link on this page...
        # why are they here?
        if cfg.openid_server_restricted_users_group:
            request.dicts.addgroup(request, cfg.openid_server_restricted_users_group)
            if not request.dicts.has_member(cfg.openid_server_restricted_users_group, received_name):
                return False

        return True
示例#7
0
    def _verify_endpoint_identity(self, identity):
        """
           Verify that the given identity matches the current endpoint.

           We always serve out /UserName?action=... for the UserName
           OpenID and this is pure paranoia to make sure it is that way
           on incoming data.

           Also verify that the given identity is allowed to have an OpenID.
        """
        request = self.request
        cfg = request.cfg

        # we can very well split on the last slash since usernames
        # must not contain slashes
        base, received_name = rsplit(identity, '/', 1)
        check_name = received_name

        if received_name == '':
            pg = wikiutil.getFrontPage(request)
            if pg:
                received_name = pg.page_name
                check_name = received_name
                if 'openid.user' in pg.pi:
                    received_name = pg.pi['openid.user']

        # some sanity checking
        # even if someone goes to http://johannes.sipsolutions.net/
        # we'll serve out http://johannes.sipsolutions.net/JohannesBerg?action=serveopenid
        # (if JohannesBerg is set as page_front_page)
        # For the #OpenIDUser PI, we need to allow the page that includes the PI,
        # hence use check_name here (see above for how it is assigned)
        fullidentity = '/'.join([base, check_name])
        thisurl = request.getQualifiedURL(request.page.url(request))
        if not thisurl == fullidentity:
            return False

        # again, we never put an openid.server link on this page...
        # why are they here?
        openid_group_name = cfg.openid_server_restricted_users_group
        if openid_group_name and received_name not in request.groups.get(openid_group_name, []):
            return False

        return True
示例#8
0
    def visit_reference(self, node):
        """
            Pass links to MoinMoin to get the correct wiki space url. Extract
            the url and pass it on to the html4css1 writer to handle. Inline
            images are also handled by visit_image. Not sure what the "drawing:"
            link scheme is used for, so for now it is handled here.

            Also included here is a hack to allow MoinMoin macros. This routine
            checks for a link which starts with "<<". This link is passed to the
            MoinMoin formatter and the resulting markup is inserted into the
            document in the place of the original link reference.
        """
        if 'refuri' in node.attributes:
            refuri = node['refuri']
            prefix = ''
            link = refuri
            if ':' in refuri:
                prefix, link = refuri.lstrip().split(':', 1)

            # First see if MoinMoin should handle completely. Exits through add_wiki_markup.
            if refuri.startswith('<<') and refuri.endswith('>>'): # moin macro
                self.process_wiki_text(refuri)
                self.wiki_text = self.fixup_wiki_formatting(self.wiki_text)
                self.add_wiki_markup()

            if prefix == 'drawing': # twikidraw drawing
                self.process_wiki_text("[[%s]]" % refuri)
                self.wiki_text = self.fixup_wiki_formatting(self.wiki_text)
                self.add_wiki_markup()

            # From here down, all links are handled by docutils (except
            # missing attachments), just fixup node['refuri'].
            if prefix == 'attachment':
                if not AttachFile.exists(self.request, self.request.page.page_name, link):
                    # Attachment doesn't exist, give to MoinMoin to insert upload text.
                    self.process_wiki_text("[[%s]]" % refuri)
                    self.wiki_text = self.fixup_wiki_formatting(self.wiki_text)
                    self.add_wiki_markup()
                # Attachment exists, just get a link to it.
                node['refuri'] = AttachFile.getAttachUrl(self.request.page.page_name, link, self.request)
                if not [i for i in node.children if i.__class__ == docutils.nodes.image]:
                    node['classes'].append(prefix)
            elif prefix == 'wiki':
                wiki_name, page_name = wikiutil.split_interwiki(link)
                wikitag, wikiurl, wikitail, err = wikiutil.resolve_interwiki(self.request, wiki_name, page_name)
                wikiurl = wikiutil.mapURL(self.request, wikiurl)
                node['refuri'] = wikiutil.join_wiki(wikiurl, wikitail)
                # Only add additional class information if the reference does
                # not have a child image (don't want to add additional markup
                # for images with targets).
                if not [i for i in node.children if i.__class__ == docutils.nodes.image]:
                    node['classes'].append('interwiki')
            elif prefix != '':
                # Some link scheme (http, file, https, mailto, etc.), add class
                # information if the reference doesn't have a child image (don't
                # want additional markup for images with targets).
                # Don't touch the refuri.
                if not [i for i in node.children if i.__class__ == docutils.nodes.image]:
                    node['classes'].append(prefix)
            else:
                # Default case - make a link to a wiki page.
                pagename = refuri
                anchor = ''
                if '#' in refuri:
                    pagename, anchor = rsplit(refuri, '#', 1)
                page = Page(self.request, wikiutil.AbsPageName(self.formatter.page.page_name, pagename))
                node['refuri'] = page.url(self.request, anchor=anchor)
                if not page.exists():
                    node['classes'].append('nonexistent')
        html4css1.HTMLTranslator.visit_reference(self, node)