Ejemplo n.º 1
0
def main():
    names = sorted(name for name in resource_listdir('trac.wiki',
                                                     'default-pages')
                        if not name.startswith('.'))

    env = EnvironmentStub()
    load_components(env)
    with env.db_transaction:
        for name in names:
            wiki = WikiPage(env, name)
            wiki.text = resource_string('trac.wiki', 'default-pages/' +
                                        name).decode('utf-8')
            if wiki.text:
                wiki.save('trac', '')
            else:
                printout('%s: Skipped empty page' % name)

    req = Mock(href=Href('/'), abs_href=Href('http://trac.edgewall.org/'),
               perm=MockPerm(), chrome={})
    for name in sys.argv[1:]:
        name = os.path.basename(name)
        wiki = WikiPage(env, name)
        if not wiki.exists:
            continue
        context = web_context(req, wiki.resource, absurls=True)
        rst = wiki2rest(env, context, wiki)
        sys.stdout.write(rst)
Ejemplo n.º 2
0
def main():
    all_pages = sorted(
        name for name in resource_listdir('trac.wiki', 'default-pages')
        if not name.startswith('.'))
    args = parse_args(all_pages)
    if args.pages:
        pages = sorted(args.pages)
    else:
        pages = all_pages

    if args.download:
        download_default_pages(pages, args.prefix, args.strict)

    env = EnvironmentStub(disable=['trac.mimeview.pygments.*'])
    load_components(env)
    with env.db_transaction:
        for name in all_pages:
            wiki = WikiPage(env, name)
            wiki.text = resource_string('trac.wiki', 'default-pages/' +
                                        name).decode('utf-8')
            if wiki.text:
                wiki.save('trac', '')
            else:
                printout('%s: Skipped empty page' % name)

    req = Mock(href=Href('/'),
               abs_href=Href('http://localhost/'),
               perm=MockPerm())
    for name in pages:
        wiki = WikiPage(env, name)
        if not wiki.exists:
            continue
        context = web_context(req, wiki.resource)
        out = DummyIO()
        DefaultWikiChecker(env, context, name).format(wiki.text, out)
Ejemplo n.º 3
0
 def setUp(self):
     wiki = WikiPage(self.env)
     wiki.name = 'WikiStart'
     wiki.text = '--'
     wiki.save('joe', 'Entry page', '::1', datetime.now(utc))
     if self._setup:
         self._setup(self)
Ejemplo n.º 4
0
    def save_wiki_data(self, req):
        page = WikiPage(self.env, self.name)
        if not page.exists:
            self.log.error('Wiki page "%s" doesn\'t exist' % self.name)
            return None

        lines = page.text.split('\n')
        first = -1
        last = -1
        new_lines = []

        for index, line in enumerate(lines):
            if first < 0:
                new_lines.append(line)
                if self.data_start_regexp.match(line):
                    first = index + 1
                    new_lines.append(self.get_json(False, True))
            elif last < 0:
                if self.data_end_regexp.match(line):
                    last = index - 1
                    new_lines.append(line)
            else:
                new_lines.append(line)

        if last > 0:
            page.text = '\n'.join(new_lines)
            try:
                page.save(req.authname, 'Kanban board data changed', req.remote_addr)
            except TracError as e:
                self.log.error('TracError: "%s"' % e.message)
Ejemplo n.º 5
0
    def test_delete_page(self):
        page = WikiPage(self.env)
        page.name = 'SandBox'
        page.text = 'Contents for SandBox'
        page.save('trac', 'create page')

        mod = WikiModule(self.env)
        req = MockRequest(self.env,
                          path_info='/wiki/SandBox',
                          method='GET',
                          args={
                              'action': 'delete',
                              'version': '1'
                          })
        self.assertTrue(mod.match_request(req))
        resp = mod.process_request(req)
        self.assertEqual(2, len(resp))
        self.assertIn('Are you sure you want to completely delete this page?',
                      self._render_template(req, resp[0], resp[1]))

        req = MockRequest(self.env,
                          path_info='/wiki/SandBox',
                          method='POST',
                          args={'action': 'delete'})
        self.assertTrue(mod.match_request(req))
        self.assertRaises(RequestDone, mod.process_request, req)
        self.assertIn('The page SandBox has been deleted.',
                      req.chrome.get('notices'))
        self.assertEqual(False, WikiPage(self.env, 'SandBox').exists)
Ejemplo n.º 6
0
 def _do_wiki_upgrade(self):
     """Move all wiki pages starting with Trac prefix to unbranded user
     guide pages.
     """
     wiki_admin = WikiAdmin(self.env)
     pages = wiki_admin.get_wiki_list()
     for old_name in pages:
         if old_name.startswith('Trac'):
             new_name = wiki.new_name(old_name)
             if not new_name:
                 continue
             if new_name in pages:
                 printout(
                     _(
                         'Ignoring %(page)s : '
                         'The page %(new_page)s already exists',
                         page=old_name,
                         new_page=new_name))
                 continue
             try:
                 wiki_admin._do_rename(old_name, new_name)
             except AdminCommandError, exc:
                 printout(
                     _('Error moving %(page)s : %(message)s',
                       page=old_name,
                       message=unicode(exc)))
             else:
                 # On success, rename links in other pages
                 self._do_wiki_rename_links(old_name, new_name)
                 # On success, insert redirection page
                 redirection = WikiPage(self.env, old_name)
                 redirection.text = _('See [wiki:"%(name)s"].',
                                      name=new_name)
                 comment = 'Bloodhound guide update'
                 redirection.save('bloodhound', comment, '0.0.0.0')
Ejemplo n.º 7
0
def add_pages(tc, names):
    now = datetime.now(utc)
    for name in names:
        w = WikiPage(tc.env)
        w.name = name
        w.text = '--'
        w.save('joe', 'the page ' + name, '::1', now)
Ejemplo n.º 8
0
def main():
    options, args = parse_args()
    names = sorted(name
                   for name in resource_listdir('trac.wiki', 'default-pages')
                   if not name.startswith('.'))
    if args:
        args = sorted(set(names) & set(map(os.path.basename, args)))
    else:
        args = names

    if options.download:
        download_default_pages(args, options.prefix)

    env = EnvironmentStub()
    load_components(env)
    with env.db_transaction:
        for name in names:
            wiki = WikiPage(env, name)
            wiki.text = resource_string('trac.wiki', 'default-pages/' +
                                        name).decode('utf-8')
            if wiki.text:
                wiki.save('trac', '')
            else:
                printout('%s: Skipped empty page' % name)

    req = Mock(href=Href('/'),
               abs_href=Href('http://localhost/'),
               perm=MockPerm())
    for name in args:
        wiki = WikiPage(env, name)
        if not wiki.exists:
            continue
        context = web_context(req, wiki.resource)
        out = DummyIO()
        DefaultWikiChecker(env, context, name).format(wiki.text, out)
Ejemplo n.º 9
0
 def _do_wiki_upgrade(self):
     """Move all wiki pages starting with Trac prefix to unbranded user
     guide pages.
     """
     wiki_admin = WikiAdmin(self.env)
     pages = wiki_admin.get_wiki_list()
     for old_name in pages:
         if old_name.startswith('Trac'):
             new_name = wiki.new_name(old_name)
             if not new_name:
                 continue
             if new_name in pages:
                 printout(_('Ignoring %(page)s : '
                            'The page %(new_page)s already exists',
                            page=old_name, new_page=new_name))
                 continue
             try:
                 wiki_admin._do_rename(old_name, new_name)
             except AdminCommandError, exc:
                 printout(_('Error moving %(page)s : %(message)s',
                            page=old_name, message=unicode(exc)))
             else:
                 # On success, rename links in other pages
                 self._do_wiki_rename_links(old_name, new_name)
                 # On success, insert redirection page
                 redirection = WikiPage(self.env, old_name)
                 redirection.text = _('See [wiki:"%(name)s"].', name=new_name)
                 comment = 'Bloodhound guide update'
                 redirection.save('bloodhound', comment, '0.0.0.0')
    def import_wiki_pages(self, template_path):
        """Creates wiki pages from wiki.xml template file.

        Creates wiki pages inside the project using data extracted from
        an wiki.ml file. We don't set the author or version as that wouldn't 
        be applicable to a new project.
        """

        # open the wiki XML file, parse the data and create wiki pages
        full_path = os.path.join(template_path, 'wiki.xml')
        try:
            tree = ET.ElementTree(file=full_path)
            for page in tree.getroot():
                if page.text:
                    wikipage = WikiPage(self.env, page.attrib['name'])
                    wikipage.readonly = int(page.attrib['readonly']) # we store as a string in xml
                    wikipage.text = page.text
                    wikipage.save(None, None, None)
                    self.log.info("Wiki page %s created", page.attrib['name'])
                else:
                    self.log.debug("Cannot create wiki pages with no text. "
                                   "Unable to import %s", wikipage)
        except IOError as exception:
            if exception.errno == errno.ENOENT:
                self.log.info("Path to wiki.xml file %s does not exist. Unable "
                              "to import wiki pages from template.", full_path)
Ejemplo n.º 11
0
    def set_password(self, user, password):
        import re

        if len(user) < 3:
            raise TracError("user name must be at least 3 characters long")
        if not re.match(r"^\w+$", user):
            raise TracError("user name must consist only of alpha-numeric characters")
        if user not in self.get_users():
            from trac.wiki.model import WikiPage

            db = self.env.get_db_cnx()
            page = WikiPage(self.env, user, db=db)
            # User creation with existing page
            if page.exists:
                raise TracError('wiki page "%s" already exists' % user)
            else:
                from tractags.api import TagEngine

                tagspace = TagEngine(self.env).tagspace.wiki

                tagspace.add_tags(None, user, ["user"])
                page.text = """= %(user)s =\n\n[[ListTagged(%(user)s)]]\n\n[[TagIt(user)]]""" % {"user": user}
                page.save(user, "New user %s registered" % user, None)
                self.env.log.debug("New user %s registered" % user)
        HtPasswdStore.set_password(self, user, password)
Ejemplo n.º 12
0
 def setUp(self):
     wiki = WikiPage(self.env)
     wiki.name = 'WikiStart'
     wiki.text = '--'
     wiki.save('joe', 'Entry page', '::1', datetime.now(utc))
     if self._setup:
         self._setup(self)
Ejemplo n.º 13
0
 def add_pages(tc, names):
     for name in names:
         now = datetime_now(utc)
         w = WikiPage(tc.env)
         w.name = name
         w.text = '--'
         w.save('joe', 'the page ' + name, now)
Ejemplo n.º 14
0
    def set_password(self, user, password):
        import re
        if len(user) < 3:
            raise TracError('user name must be at least 3 characters long')
        if not re.match(r'^\w+$', user):
            raise TracError(
                'user name must consist only of alpha-numeric characters')
        if user not in self.get_users():
            from trac.wiki.model import WikiPage
            db = self.env.get_db_cnx()
            page = WikiPage(self.env, user, db=db)
            # User creation with existing page
            if page.exists:
                raise TracError('wiki page "%s" already exists' % user)
            else:
                from tractags.api import TagEngine
                tagspace = TagEngine(self.env).tagspace.wiki

                tagspace.add_tags(None, user, ['user'])
                page.text = '''= %(user)s =\n\n[[ListTagged(%(user)s)]]\n\n[[TagIt(user)]]''' % {
                    'user': user
                }
                page.save(user, 'New user %s registered' % user, None)
                self.env.log.debug("New user %s registered" % user)
        HtPasswdStore.set_password(self, user, password)
Ejemplo n.º 15
0
 def initialize_agilo(self, project_name, db_url, svn_repo, demo=False):
     try:
         self.do_initenv('%s %s %s %s' % (project_name,
                                          db_url, 'svn', 
                                          svn_repo or 'somewhere'))
         # Now add agilo and the template path
         env = Environment(self.envname)
         ac = AgiloConfig(env)
         if not svn_repo:
             # remove the fake from the config
             ac.change_option('repository_dir', '', 'trac')
         # sets the restric_owner option
         ac.change_option('restrict_owner',
                          'true',
                          'ticket')
         # this is also saving the config
         ac.enable_agilo()
         # update wiki
         wiki = WikiPage(env, name='WikiStart')
         wiki.text = agilo_wiki
         wiki.save('admin', 'Updated to Agilo', '127.0.0.1')
         # reset the env
         self.env_set(envname=self.envname, env=env)
         # Now initialize Agilo
         self.do_upgrade('upgrade --no-backup')
         # Now create the demo if needed
         if demo:
             try:
                 from create_demo_data import _create_demo_data
                 _create_demo_data(env)
             except ImportError, e:
                 env.log.error(exception_to_unicode(e))
     except:
         pass
Ejemplo n.º 16
0
def main():
    options, args = parse_args()
    names = sorted(name for name in resource_listdir('trac.wiki',
                                                     'default-pages')
                        if not name.startswith('.'))
    if args:
        args = sorted(set(names) & set(map(os.path.basename, args)))
    else:
        args = names

    if options.download:
        download_default_pages(args, options.prefix)

    env = EnvironmentStub()
    load_components(env)
    with env.db_transaction:
        for name in names:
            wiki = WikiPage(env, name)
            wiki.text = resource_string('trac.wiki', 'default-pages/' +
                                        name).decode('utf-8')
            if wiki.text:
                wiki.save('trac', '')
            else:
                printout('%s: Skipped empty page' % name)

    req = Mock(href=Href('/'), abs_href=Href('http://localhost/'),
               perm=MockPerm())
    for name in args:
        wiki = WikiPage(env, name)
        if not wiki.exists:
            continue
        context = web_context(req, wiki.resource)
        out = DummyIO()
        DefaultWikiChecker(env, context, name).format(wiki.text, out)
Ejemplo n.º 17
0
 def add_wiki_page(self, env, name, text):
     page = WikiPage(env, name)
     if page.time:
         self.note("  ** Page %s already exists, not adding it." % name)
         return
     page.text = text
     page.save(author="(System)", comment="Initial page import")
Ejemplo n.º 18
0
 def initialize_agilo(self, project_name, db_url, svn_repo, demo=False):
     try:
         self.do_initenv(
             '%s %s %s %s' %
             (project_name, db_url, 'svn', svn_repo or 'somewhere'))
         # Now add agilo and the template path
         env = Environment(self.envname)
         ac = AgiloConfig(env)
         if not svn_repo:
             # remove the fake from the config
             ac.change_option('repository_dir', '', 'trac')
         # sets the restric_owner option
         ac.change_option('restrict_owner', 'true', 'ticket')
         # this is also saving the config
         ac.enable_agilo()
         # update wiki
         wiki = WikiPage(env, name='WikiStart')
         wiki.text = agilo_wiki
         wiki.save('admin', 'Updated to Agilo', '127.0.0.1')
         # reset the env
         self.env_set(envname=self.envname, env=env)
         # Now initialize Agilo
         self.do_upgrade('upgrade --no-backup')
         # Now create the demo if needed
         if demo:
             try:
                 from create_demo_data import _create_demo_data
                 _create_demo_data(env)
             except ImportError, e:
                 env.log.error(exception_to_unicode(e))
     except:
         pass
Ejemplo n.º 19
0
def add_pages(tc, names):
    now = datetime.now(utc)
    for name in names:
        w = WikiPage(tc.env)
        w.name = name
        w.text = "--"
        w.save("joe", "the page " + name, "::1", now)
Ejemplo n.º 20
0
def main():
    names = sorted(name
                   for name in resource_listdir('trac.wiki', 'default-pages')
                   if not name.startswith('.'))

    env = EnvironmentStub()
    load_components(env)
    with env.db_transaction:
        for name in names:
            wiki = WikiPage(env, name)
            wiki.text = resource_string('trac.wiki', 'default-pages/' +
                                        name).decode('utf-8')
            if wiki.text:
                wiki.save('trac', '')
            else:
                printout('%s: Skipped empty page' % name)

    req = Mock(href=Href('/'),
               abs_href=Href('http://trac.edgewall.org/'),
               perm=MockPerm(),
               chrome={})
    for name in sys.argv[1:]:
        name = os.path.basename(name)
        wiki = WikiPage(env, name)
        if not wiki.exists:
            continue
        context = web_context(req, wiki.resource, absurls=True)
        rst = wiki2rest(env, context, wiki)
        sys.stdout.write(rst)
Ejemplo n.º 21
0
    def save_wiki_data(self, req):
        page = WikiPage(self.env, self.name)
        if not page.exists:
            self.log.error('Wiki page "%s" doesn\'t exist' % self.name)
            return None

        lines = page.text.split('\n')
        first = -1
        last = -1
        new_lines = []

        for index, line in enumerate(lines):
            if first < 0:
                new_lines.append(line)
                if self.data_start_regexp.match(line):
                    first = index + 1
                    new_lines.append(self.get_json(False, True))
            elif last < 0:
                if self.data_end_regexp.match(line):
                    last = index - 1
                    new_lines.append(line)
            else:
                new_lines.append(line)

        if last > 0:
            page.text = '\n'.join(new_lines)
            try:
                page.save(req.authname, 'Kanban board data changed', req.remote_addr)
            except TracError as e:
                self.log.error('TracError: "%s"' % e.message)
Ejemplo n.º 22
0
class ReadonlyWikiPolicyTestCase(unittest.TestCase):
    def setUp(self):
        self.env = \
            EnvironmentStub(enable=['trac.attachment.LegacyAttachmentPolicy',
                                    'trac.perm.*',
                                    'trac.wiki.web_ui.*'])
        self.policy = ReadonlyWikiPolicy(self.env)
        store = DefaultPermissionStore(self.env)
        store.grant_permission('user1', 'WIKI_ADMIN')
        store.grant_permission('user2', 'WIKI_DELETE')
        store.grant_permission('user2', 'WIKI_MODIFY')
        store.grant_permission('user2', 'WIKI_RENAME')
        self.page = WikiPage(self.env, 'SomePage')
        self.page.text = 'This is a readonly page.'
        self.page.readonly = 1
        self.page.save('user', 'readonly page added')

    def test_check_permission_returns_none(self):
        perm_cache = PermissionCache(self.env, 'user1')
        self.assertIn('WIKI_ADMIN', perm_cache)
        for perm in ('WIKI_DELETE', 'WIKI_MODIFY', 'WIKI_RENAME'):
            self.assertIn(perm, perm_cache)
            self.assertIsNone(
                self.policy.check_permission(perm, perm_cache.username,
                                             self.page.resource, perm_cache))

    def test_check_permission_returns_false(self):
        perm_cache = PermissionCache(self.env, 'user2')
        self.assertNotIn('WIKI_ADMIN', perm_cache)
        for perm in ('WIKI_DELETE', 'WIKI_MODIFY', 'WIKI_RENAME'):
            self.assertIn(perm, perm_cache)
            self.assertIs(
                False,
                self.policy.check_permission(perm, perm_cache.username,
                                             self.page.resource, perm_cache))
Ejemplo n.º 23
0
def wiki_setup(tc):
    tc.env = EnvironmentStub(default_data=True,
                             enable=['trac.*', 'tractags.*'])
    tc.env.path = tempfile.mkdtemp()
    tc.db_mgr = DatabaseManager(tc.env)
    tc.db = tc.env.get_db_cnx()

    TagSetup(tc.env).upgrade_environment(tc.db)

    now = datetime.now(utc)
    wiki = WikiPage(tc.env)
    wiki.name = 'TestPage'
    wiki.text = '--'
    wiki.save('joe', 'TagsPluginTestPage', '::1', now)

    req = Mock(href=Href('/'),
               abs_href=Href('http://www.example.com/'),
               authname='anonymous',
               perm=MockPerm(),
               tz=utc,
               args={},
               locale=Locale.parse('en_US') if Locale else None)
    tc.env.href = req.href
    tc.env.abs_href = req.abs_href
    tc.context = Context.from_request(req)
    # Enable big diff output.
    tc.maxDiff = None
Ejemplo n.º 24
0
        def do_upgrade_environment(db):
            for realm in self.SCHEMA:
                realm_schema = self.SCHEMA[realm]

                if need_db_create_for_realm(self.env, realm, realm_schema, db):
                    create_db_for_realm(self.env, realm, realm_schema, db)

                elif need_db_upgrade_for_realm(self.env, realm, realm_schema, db):
                    upgrade_db_for_realm(self.env, 'testmanager.upgrades', realm, realm_schema, db)
                    
            # Create default values for configuration properties and initialize counters
            db_insert_or_ignore(self.env, 'testconfig', 'NEXT_CATALOG_ID', '0', db)
            db_insert_or_ignore(self.env, 'testconfig', 'NEXT_TESTCASE_ID', '0', db)
            db_insert_or_ignore(self.env, 'testconfig', 'NEXT_PLAN_ID', '0', db)
            
            db.commit()

            # Fix templates with a blank id
            if self._check_blank_id_templates(db):
                self._fix_blank_id_templates(db)
                db.commit()
                self.env.log.info(_("""
    Test Manager templates with blank IDs have been fixed.\n
    Please go to the Administration panel, in the Test Manager Templates
    section, and check the associations between templates and Test Cases 
    and Test Catalogs.\n
    You will have to manually fix any misconfiguration you should find.
                    """))
          
            # Create the basic "TC" Wiki page, used as the root test catalog
            tc_page = WikiPage(self.env, 'TC')
            if not tc_page.exists:
                tc_page.text = ' '
                tc_page.save('System', '', '127.0.0.1')
            
                db.commit()
            
            if self._need_upgrade(db):
                # Set custom ticket field to hold related test case
                custom = self.config['ticket-custom']
                config_dirty = False
                if 'testcaseid' not in custom:
                    custom.set('testcaseid', 'text')
                    custom.set('testcaseid.label', _("Test Case"))
                    config_dirty = True
                if 'planid' not in custom:
                    custom.set('planid', 'text')
                    custom.set('planid.label', _("Test Plan"))
                    config_dirty = True

                # Set config section for test case outcomes
                if 'test-outcomes' not in self.config:
                    self.config.set('test-outcomes', 'green.SUCCESSFUL', _("Successful"))
                    self.config.set('test-outcomes', 'yellow.TO_BE_TESTED', _("Untested"))
                    self.config.set('test-outcomes', 'red.FAILED', _("Failed"))
                    self.config.set('test-outcomes', 'default', 'TO_BE_TESTED')
                    config_dirty = True

                if config_dirty:
                    self.config.save()
Ejemplo n.º 25
0
 def _insert_page(self, name=None):
     page = WikiPage(self.env)
     if name is None:
         name = random_unique_camel()
     page.name = name
     page.text = random_paragraph()
     page.save('user1', 'Page created.')
     return name
Ejemplo n.º 26
0
 def do_rename(db):
     page.rename(new_name)
     if redirect:
         redirection = WikiPage(self.env, old_name, db=db)
         redirection.text = _('See [wiki:"%(name)s"].', name=new_name)
         author = get_reporter_id(req)
         comment = u'[wiki:"%s@%d" %s] \u2192 [wiki:"%s"].' % (
                   new_name, old_version, old_name, new_name)
         redirection.save(author, comment, req.remote_addr)
Ejemplo n.º 27
0
 def _insert_templates(self):
     page = WikiPage(self.env)
     page.name = 'PageTemplates/TheTemplate'
     page.text = 'The template below /PageTemplates'
     page.save('trac', 'create page')
     page = WikiPage(self.env)
     page.name = 'TheTemplate'
     page.text = 'The template below /'
     page.save('trac', 'create page')
Ejemplo n.º 28
0
 def do_rename(db):
     page.rename(new_name)
     if redirect:
         redirection = WikiPage(self.env, old_name, db=db)
         redirection.text = _('See [wiki:"%(name)s"].', name=new_name)
         author = get_reporter_id(req)
         comment = u'[wiki:"%s@%d" %s] \u2192 [wiki:"%s"].' % (
             new_name, old_version, old_name, new_name)
         redirection.save(author, comment, req.remote_addr)
Ejemplo n.º 29
0
 def _process_page(self, page, author = None, comment = None, ipnr = None):
   
   if self.boilerplate_start_re.search( page.text ) != None:
     
     # If the audit info isn't available, grab it from the boilerplate page.
     if author == None or comment == None:
       page = WikiPage( self.env, page.name )
     if author == None:
       author = page.author
     if comment == None:
       comment = page.comment
     if ipnr == None:
       ipnr = '127.0.0.1' # I don't know what else to do here.
     
     # Extract the boilerplate text and the wanted pages.
     buf = StringIO()
     page_list = {}
     inboilerplate = False
     for line in page.text.splitlines():
       if inboilerplate:
         if self.boilerplate_end_re.search( line ) != None:
           inboilerplate = False
         else:
           buf.write( line )
           buf.write( '\n' )
       else:
         if self.boilerplate_start_re.search( line ) != None:
           inboilerplate = True
         else:
           if line.startswith('||') and line.endswith('||') and line[3] != "'":
             try:
               descriptor = ([i.strip() for i in line.strip('||').split('||')])
               name = descriptor[0]
               arguments = descriptor[1:]
               m = self.extractpagename_re.search( name )
               if m != None:
                 name = m.string[m.start(1):m.end(1)]
                 self.env.log.warning("extracted name = " + name )
               page_list[ name ] = arguments
             except Exception, e:
               self.env.log.warning("Invalid page line: %s (%s)", line, e)
     
     # Generate the derived pages as instructed.
     page_names = page_list.keys()
     page_names.sort()
     for name in page_names:
       text = buf.getvalue()
       args = page_list[ name ]
       text = text.replace( '{{0}}', name )
       i = 0
       for arg in args:
         text = text.replace('{{%d}}' % (i+1), args[i])
         i += 1
       newpage = WikiPage( self.env, name )
       if newpage.text != text:
         newpage.text = text
         newpage.save( author, comment, ipnr )
Ejemplo n.º 30
0
    def upgrade_environment(self, db):
        # Create or update db
        for realm in self.SCHEMA:
            realm_metadata = self.SCHEMA[realm]

            if need_db_create_for_realm(self.env, realm, realm_metadata, db):
                create_db_for_realm(self.env, realm, realm_metadata, db)

            elif need_db_upgrade_for_realm(self.env, realm, realm_metadata,
                                           db):
                upgrade_db_for_realm(self.env, 'testmanager.upgrades', realm,
                                     realm_metadata, db)

        # Create default values for configuration properties and initialize counters
        db_insert_or_ignore(self.env, 'testconfig', 'NEXT_CATALOG_ID', '0')
        db_insert_or_ignore(self.env, 'testconfig', 'NEXT_TESTCASE_ID', '0')
        db_insert_or_ignore(self.env, 'testconfig', 'NEXT_PLAN_ID', '0')

        # Create the basic "TC" Wiki page, used as the root test catalog
        tc_page = WikiPage(self.env, 'TC')
        if not tc_page.exists:
            tc_page.text = ' '
            tc_page.save('System', '', '127.0.0.1')

        if self._need_upgrade(db):
            # Set custom ticket field to hold related test case
            custom = self.config['ticket-custom']
            config_dirty = False
            if 'testcaseid' not in custom:
                custom.set('testcaseid', 'text')
                custom.set('testcaseid.label', _("Test Case"))
                config_dirty = True
            if 'planid' not in custom:
                custom.set('planid', 'text')
                custom.set('planid.label', _("Test Plan"))
                config_dirty = True

            # Set config section for test case outcomes
            if 'test-outcomes' not in self.config:
                self.config.set('test-outcomes', 'green.SUCCESSFUL',
                                _("Successful"))
                self.config.set('test-outcomes', 'yellow.TO_BE_TESTED',
                                _("Untested"))
                self.config.set('test-outcomes', 'red.FAILED', _("Failed"))
                self.config.set('test-outcomes', 'default', 'TO_BE_TESTED')
                config_dirty = True

            # Set config section for default visible columns in tabular view
            if self.config.get('testmanager',
                               'testcatalog.visible_description') == '':
                self.config.set('testmanager',
                                'testcatalog.visible_description', 'False')
                config_dirty = True

            if config_dirty:
                self.config.save()
Ejemplo n.º 31
0
    def _do_rename(self, req, page):
        if page.readonly:
            req.perm(page.resource).require('WIKI_ADMIN')
        else:
            req.perm(page.resource).require('WIKI_RENAME')

        if 'cancel' in req.args:
            req.redirect(get_resource_url(self.env, page.resource, req.href))

        old_name, old_version = page.name, page.version
        new_name = req.args.get('new_name', '')
        new_name = re.sub(r'/{2,}', '/', new_name.strip('/'))
        redirect = req.args.get('redirect')

        # verify input parameters
        warn = None
        if not new_name:
            warn = _("A new name is mandatory for a rename.")
        elif not validate_page_name(new_name):
            warn = _("The new name is invalid (a name which is separated "
                     "with slashes cannot be '.' or '..').")
        elif new_name == old_name:
            warn = _("The new name must be different from the old name.")
        elif WikiPage(self.env, new_name).exists:
            warn = _("The page %(name)s already exists.", name=new_name)
        if warn:
            add_warning(req, warn)
            return self._render_confirm_rename(req, page, new_name)

        with self.env.db_transaction as db:
            page.rename(new_name)
            if redirect:
                redirection = WikiPage(self.env, old_name, db=db)
                redirection.text = _('See [wiki:"%(name)s"].', name=new_name)
                author = get_reporter_id(req)
                comment = u'[wiki:"%s@%d" %s] \u2192 [wiki:"%s"].' % (
                    new_name, old_version, old_name, new_name)
                redirection.save(author, comment, req.remote_addr)

        add_notice(
            req,
            _("The page %(old_name)s has been renamed to "
              "%(new_name)s.",
              old_name=old_name,
              new_name=new_name))
        if redirect:
            add_notice(
                req,
                _(
                    "The page %(old_name)s has been recreated "
                    "with a redirect to %(new_name)s.",
                    old_name=old_name,
                    new_name=new_name))

        req.redirect(req.href.wiki(old_name if redirect else new_name))
Ejemplo n.º 32
0
    def user_created(self, user, password):
        req = FakeRequest(self.env, user)
        resource = Resource('wiki', user)
        tag_system = TagSystem(self.env)
        tag_system.add_tags(req, resource, ['user',])

        page = WikiPage(self.env, user)
        page.text = '''= %(user)s =\n\n[[ListTagged(%(user)s)]]\n''' % {'user' : user}
        page.save(user, 'New user %s registered' % user, None)

        self.env.log.debug("New user %s registered" % user)
Ejemplo n.º 33
0
    def setUp(self):
        self.env = EnvironmentStub(enable=[AutoWikify])
        self.req = Mock(
            authname='anonymous', perm=MockPerm(), tz=None, args={},
            href=Href('/'), abs_href=Href('http://www.example.com/'))
        self.autowikify = AutoWikify(self.env)

        for name in (u'autowikify', u'あいうName', u'Nameあいう',
                     u'かきくけこ'):
            page = WikiPage(self.env, name)
            page.text = name
            page.save('admin', '', '::1')
        self.context = Context.from_request(self.req, WikiPage(self.env, name))
Ejemplo n.º 34
0
 def setUp(self):
     self.env = self._create_env()
     # TODO: remove the following lines in order to discover
     #       all the places were we should use the req.href
     #       instead of env.href
     self.env.href = self.req.href
     self.env.abs_href = self.req.abs_href
     wiki = WikiPage(self.env)
     wiki.name = 'WikiStart'
     wiki.text = '--'
     wiki.save('joe', 'Entry page', '::1', datetime_now(utc))
     if self._setup:
         self._setup(self)
Ejemplo n.º 35
0
def wiki_setup(tc):
    wiki1 = WikiPage(tc.env)
    wiki1.name = 'TestPage'
    wiki1.text = '--'
    wiki1.save('joe', 'normal WikiPageNames', '::1', 42)

    wiki2 = WikiPage(tc.env)
    wiki2.name = 'Space 1 23'
    wiki2.text = '--'
    wiki2.save('joe', 'not a WikiPageNames', '::1', 42)

    wiki3 = WikiPage(tc.env)
    wiki3.name = u"C'est l'\xe9t\xe9"
    wiki3.text = '--'
    wiki3.save('joe', 'unicode WikiPageNames', '::1', 42)

    imt = WikiPage(tc.env)
    imt.name = u"InterMapTxt"
    imt.text = """
This is the InterMapTxt
----
{{{
MeatBall 	http://www.usemod.com/cgi-bin/mb.pl? # $1 in MeatBall...
tsvn            tsvn:
complex         http://server/$1/page/$2?format=txt  # resource $2 in $1
}}}
----
{{{
nolink          http://noweb
}}}
"""
    imt.save('joe', 'test InterWiki links', '::1', 42)
Ejemplo n.º 36
0
    def upgrade_environment(self, db):
        # Create or update db
        for realm in self.SCHEMA:
            realm_metadata = self.SCHEMA[realm]

            if need_db_create_for_realm(self.env, realm, realm_metadata, db):
                create_db_for_realm(self.env, realm, realm_metadata, db)

            elif need_db_upgrade_for_realm(self.env, realm, realm_metadata, db):
                upgrade_db_for_realm(self.env, 'testmanager.upgrades', realm, realm_metadata, db)

        # Create default values for configuration properties and initialize counters
        db_insert_or_ignore(self.env, 'testconfig', 'NEXT_CATALOG_ID', '0')
        db_insert_or_ignore(self.env, 'testconfig', 'NEXT_TESTCASE_ID', '0')
        db_insert_or_ignore(self.env, 'testconfig', 'NEXT_PLAN_ID', '0')
        
        # Create the basic "TC" Wiki page, used as the root test catalog
        tc_page = WikiPage(self.env, 'TC')
        if not tc_page.exists:
            tc_page.text = ' '
            tc_page.save('System', '', '127.0.0.1')
        
        if self._need_upgrade(db):
            # Set custom ticket field to hold related test case
            custom = self.config['ticket-custom']
            config_dirty = False
            if 'testcaseid' not in custom:
                custom.set('testcaseid', 'text')
                custom.set('testcaseid.label', _("Test Case"))
                config_dirty = True
            if 'planid' not in custom:
                custom.set('planid', 'text')
                custom.set('planid.label', _("Test Plan"))
                config_dirty = True

            # Set config section for test case outcomes
            if 'test-outcomes' not in self.config:
                self.config.set('test-outcomes', 'green.SUCCESSFUL', _("Successful"))
                self.config.set('test-outcomes', 'yellow.TO_BE_TESTED', _("Untested"))
                self.config.set('test-outcomes', 'red.FAILED', _("Failed"))
                self.config.set('test-outcomes', 'default', 'TO_BE_TESTED')
                config_dirty = True

            # Set config section for default visible columns in tabular view
            if self.config.get('testmanager', 'testcatalog.visible_description') == '':
                self.config.set('testmanager', 'testcatalog.visible_description', 'False')
                config_dirty = True
                
            if config_dirty:
                self.config.save()
Ejemplo n.º 37
0
    def _controller_import(self, req, cat, page, component):
        """ Performs import. """

        # Data to be passed to view
        data = {'operations': {}}

        # User selected pages
        selected_pages = req.args.get('wikiimport_selected_pages')

        # User has selected some pages
        if selected_pages:

            # Choose between preconfigured and raw instance
            if req.args.get('wikiimport_instance_path'):
                data['instance_path'] = req.args.get(
                    'wikiimport_instance_path')
                source_env = Environment(data['instance_path'])
                instance_identifier = data['instance_path']
            else:
                data['instance_id'] = req.args.get('wikiimport_instance_id')
                source_env = self._get_instance_env(data['instance_id'])
                instance_identifier = data['instance_id']

            # Get operations to be performed
            data['operations'] = self._get_page_operations(
                source_env, self.env)

            # This is required in order to display pages list alphabetically
            data['sorted_pages'] = data['operations'].keys()
            data['sorted_pages'].sort()

            # Discard operation for pages that were unchecked on the preview page
            for page in data['sorted_pages']:
                if page not in selected_pages:
                    del data['operations'][page]

            # Update local wiki
            for page, operation in data['operations'].items():
                source_page = WikiPage(source_env, page)
                local_page = WikiPage(self.env, page)
                local_page.text = source_page.text
                local_page.save(
                    get_reporter_id(req, 'author'),
                    'Importing pages from "%s" using [http://trac-hacks.org/wiki/WikiImportPlugin WikiImport plugin].'
                    % instance_identifier, req.remote_addr)

        # Add stylesheet to view
        add_stylesheet(req, 'wikiimport/css/wikiimport.css')

        return 'admin_wikiimport_import.html', data
Ejemplo n.º 38
0
def wiki_setup(tc):
    wiki1 = WikiPage(tc.env)
    wiki1.name = 'TestPage'
    wiki1.text = '--'
    wiki1.save('joe', 'normal WikiPageNames', '::1', 42)

    wiki2 = WikiPage(tc.env)
    wiki2.name = 'Space 1 23'
    wiki2.text = '--'
    wiki2.save('joe', 'not a WikiPageNames', '::1', 42)

    wiki3 = WikiPage(tc.env)
    wiki3.name = u"C'est l'\xe9t\xe9"
    wiki3.text = '--'
    wiki3.save('joe', 'unicode WikiPageNames', '::1', 42)

    imt = WikiPage(tc.env)
    imt.name = u"InterMapTxt"
    imt.text = """
This is the InterMapTxt
----
{{{
MeatBall 	http://www.usemod.com/cgi-bin/mb.pl? # $1 in MeatBall...
tsvn            tsvn:
complex         http://server/$1/page/$2?format=txt  # resource $2 in $1
}}}
----
{{{
nolink          http://noweb
}}}
"""
    imt.save('joe', 'test InterWiki links', '::1', 42)
Ejemplo n.º 39
0
    def test_rename_wiki_page(self):
        sid = 'subscriber'
        page = WikiPage(self.env)
        page.name = name = 'PageInitial'
        page.text = 'Page content'
        page.save('actor', 'page created')
        ws = WatchSubscriber(self.env)
        ws.set_watch(sid, 1, 'wiki', name)

        new_name = 'PageRenamed'
        page.rename(new_name)

        self.assertFalse(ws.is_watching(sid, 1, 'wiki', name))
        self.assertTrue(ws.is_watching(sid, 1, 'wiki', new_name))
Ejemplo n.º 40
0
def wiki_setup(tc):
    tc.env = EnvironmentStub(default_data=True,
                             enable=['trac.*', 'tractags.*'])
    tc.env.path = tempfile.mkdtemp()
    tc.db_mgr = DatabaseManager(tc.env)
    tc.db = tc.env.get_db_cnx()

    cursor = tc.db.cursor()
    cursor.execute("DROP TABLE IF EXISTS tags")
    cursor.execute("DROP TABLE IF EXISTS tags_change")
    cursor.execute("DELETE FROM system WHERE name='tags_version'")
    cursor.execute("DELETE FROM permission WHERE action %s" % tc.db.like(),
                   ('TAGS_%', ))

    TagSetup(tc.env).upgrade_environment(tc.db)

    now = datetime.now(utc)
    wiki = WikiPage(tc.env)
    wiki.name = 'TestPage'
    wiki.text = '--'
    wiki.save('joe', 'TagsPluginTestPage', '::1', now)

    cursor = tc.db.cursor()
    # Populate table with initial test data.
    cursor.executemany(
        """
        INSERT INTO tags
               (tagspace, name, tag)
        VALUES (%s,%s,%s)
    """, [
            ('wiki', 'TestPage', '2ndtag'),
            ('wiki', 'TestPage', 'a.really?_\wild-thing'),
            ('wiki', 'TestPage', 'heavily-quoted'),
            ('wiki', 'TestPage', 'onetag'),
            ('wiki', 'TestPage', 'tagged'),
            ('wiki', 'TestPage', "single'quote"),
        ])

    req = Mock(href=Href('/'),
               abs_href=Href('http://www.example.com/'),
               authname='anonymous',
               perm=MockPerm(),
               tz=utc,
               args={},
               locale=locale_en)
    tc.env.href = req.href
    tc.env.abs_href = req.abs_href
    tc.context = Context.from_request(req)
    # Enable big diff output.
    tc.maxDiff = None
Ejemplo n.º 41
0
	def _controller_import(self, req, cat, page, component):
		""" Performs import. """

		# Data to be passed to view
		data = {'operations': {}}

		# User selected pages
		selected_pages = req.args.get('wikiimport_selected_pages')

		# User has selected some pages
		if selected_pages:

			# Choose between preconfigured and raw instance
			if req.args.get('wikiimport_instance_path'):
				data['instance_path'] = req.args.get('wikiimport_instance_path')
				source_env = Environment(data['instance_path'])
				instance_identifier = data['instance_path']
			else:
				data['instance_id'] = req.args.get('wikiimport_instance_id')
				source_env = self._get_instance_env(data['instance_id'])
				instance_identifier = data['instance_id']

			# Get operations to be performed
			data['operations'] = self._get_page_operations(source_env, self.env)

			# This is required in order to display pages list alphabetically
			data['sorted_pages'] = data['operations'].keys()
			data['sorted_pages'].sort()

			# Discard operation for pages that were unchecked on the preview page
			for page in data['sorted_pages']:
				if page not in selected_pages: 
					del data['operations'][page]

			# Update local wiki
			for page, operation in data['operations'].items():
				source_page = WikiPage(source_env, page)
				local_page = WikiPage(self.env, page)
				local_page.text = source_page.text
				local_page.save(
					get_reporter_id(req, 'author'), 
					'Importing pages from "%s" using [http://trac-hacks.org/wiki/WikiImportPlugin WikiImport plugin].' % instance_identifier,
					req.remote_addr
				)

		# Add stylesheet to view
		add_stylesheet(req, 'wikiimport/css/wikiimport.css');

		return 'admin_wikiimport_import.html', data
Ejemplo n.º 42
0
 def test_index_wikis(self):
     self._insert_component('comp16')
     self._insert_component('comp20')
     wiki1 = WikiPage(self.env, name="Testwiki1", version="1")
     wiki1.text = "This is the wiki <comp20 open door> text content."
     wiki1.save('adeponte', 'My comment', '192.168.1.2')
     wiki2 = WikiPage(self.env, name="Testwiki2", version="1")
     wiki2.text = "This is the wiki <comp16 close door> text content."
     wiki2.save('bob', 'His Comment', '182.123.321.456')
     req_cache_sys = RequirementCacheSystem(self.env)
     req_cache_sys.index_wikis()
     req_wiki_cache = RequirementWikiCache(self.env, 'comp20', 'open', 'door', 'Testwiki1', '1')
     self.assertEqual(req_wiki_cache.exists, True)
     req_wiki_cache = RequirementWikiCache(self.env, 'comp16', 'close', 'door', 'Testwiki2', '1')
     self.assertEqual(req_wiki_cache.exists, True)
Ejemplo n.º 43
0
def interwiki_setup(tc):
    tc.env.config.set('interwiki', 'shields', 'https://img.shields.io/')
    tc.env.config.set('interwiki', 'travis',
                      'https://travis-ci.org/$1?branch=$2 Travis CI')
    page = WikiPage(tc.env)
    page.name = 'InterMapTxt'
    page.text = """
The InterWikiTxt page
----
{{{
SO  http://stackoverflow.com/questions/ # Question $1 in StackOverflow
CreoleWiki   http://wikicreole.org/wiki/
}}}
"""
    page.save('admin', 'created page')
Ejemplo n.º 44
0
    def _do_rename(self, req, page):
        if page.readonly:
            req.perm(page.resource).require('WIKI_ADMIN')
        else:
            req.perm(page.resource).require('WIKI_RENAME')

        if 'cancel' in req.args:
            req.redirect(get_resource_url(self.env, page.resource, req.href))

        old_name, old_version = page.name, page.version
        new_name = req.args.get('new_name', '')
        new_name = re.sub(r'/{2,}', '/', new_name.strip('/'))
        redirect = req.args.get('redirect')

        # verify input parameters
        warn = None
        if not new_name:
            warn = _("A new name is mandatory for a rename.")
        elif not validate_page_name(new_name):
            warn = _("The new name is invalid (a name which is separated "
                     "with slashes cannot be '.' or '..').")
        elif new_name == old_name:
            warn = _("The new name must be different from the old name.")
        elif WikiPage(self.env, new_name).exists:
            warn = _("The page %(name)s already exists.", name=new_name)
        if warn:
            add_warning(req, warn)
            return self._render_confirm_rename(req, page, new_name)

        with self.env.db_transaction as db:
            page.rename(new_name)
            if redirect:
                redirection = WikiPage(self.env, old_name, db=db)
                redirection.text = _('See [wiki:"%(name)s"].', name=new_name)
                author = get_reporter_id(req)
                comment = u'[wiki:"%s@%d" %s] \u2192 [wiki:"%s"].' % (
                          new_name, old_version, old_name, new_name)
                redirection.save(author, comment, req.remote_addr)

        add_notice(req, _("The page %(old_name)s has been renamed to "
                          "%(new_name)s.", old_name=old_name,
                          new_name=new_name))
        if redirect:
            add_notice(req, _("The page %(old_name)s has been recreated "
                              "with a redirect to %(new_name)s.",
                              old_name=old_name, new_name=new_name))

        req.redirect(req.href.wiki(old_name if redirect else new_name))
Ejemplo n.º 45
0
    def process_request(self, req):
        global page_version
        repos = RepositoryManager(self.env).repository_dir
        repdir = repos.split('.git')[0]
        dirList = os.listdir(repdir + 'wiki')
        dirList.sort()
        count_do = 0
        count_no = 0

        for sFile in dirList:
            if sFile.find('.txt') == -1:
                continue
            try:
                filename = os.path.splitext(sFile)[0]
                if filename not in page_version:
                    page_version[filename] = 0
                content = read_file(repdir + 'wiki/' + sFile)
                page = WikiPage(self.env, filename)
                page.text = content.decode('unicode-escape')
                if page_version[filename] != page.version:
                    print (filename + ': local page version does not match online version!')
                    print ('Local version: ' + str(page_version[filename]) + ' <-> online version: ' + str(page.version) + '. Overwrite? (y/n)')
                    user_input = raw_input()
                    if user_input == 'y':
                        page.save(author='me', comment='', remote_addr='127.0.0.1')
                        count_do = count_do + 1
                        print (filename + ' created/modified as wiki page from version ' + str(page_version[filename]) + ' to version ' + str(page.version))
                        page_version[filename] = page.version
                    else:
                        print 'Page not created/modified'
                        count_no = count_no + 1
                        continue
                else:
                    page.save(author='me', comment='', remote_addr='127.0.0.1')
                    count_do = count_do + 1
                    print (filename + ' created/modified as wiki page from version ' + str(page_version[filename]) + ' to version ' + str(page.version))
                    page_version[filename] = page.version
            except:
                count_no = count_no + 1
                print (filename + ' not modified or changed; remained untouched')
                continue

        cont = str(count_do) + ' wiki pages created/modified and ' + str(count_no) + ' untouched'
        req.send_response(200)
        req.send_header('Content-Type', 'text/plain')
        req.send_header('Content-Length', len(cont))
        req.end_headers()
        req.write(cont)
Ejemplo n.º 46
0
    def test_upgrade_v1_to_current(self):
        # The initial db schema from r2963 - 02-Jan-2008 by Alec Thomas.
        schema = [
            Table('votes', key=('resource', 'username',
                                'vote'))[Column('resource'),
                                         Column('username'),
                                         Column('vote', 'int'), ]
        ]
        self._schema_init(schema)

        # Populate tables with test data.
        cursor = self.db.cursor()
        cursor.executemany(
            """
            INSERT INTO votes
                   (resource,username,vote)
            VALUES (%s,%s,%s)
        """, (('ticket/1', 'user', -1), ('ticket/2', 'user', 1),
              ('wiki/DeletedPage', 'user', -1),
              ('wiki/ExistingPage', 'user', 1)))
        # Resources must exist for successful data migration.
        t = Ticket(self.env, db=self.db)
        t['summary'] = 'test ticket'
        t.insert()
        w = WikiPage(self.env, 'ExistingPage')
        w.text = 'content'
        w.save('author', 'comment', '::1')
        self._verify_schema_unregistered()
        self.assertEquals(1, self.votes.get_schema_version(self.db))
        self.assertTrue(self.votes.environment_needs_upgrade(self.db))

        # Data migration and registration of unversioned schema.
        self.votes.upgrade_environment(self.db)
        self._verify_curr_schema()

        cursor.execute('SELECT * FROM votes')
        votes = cursor.fetchall()
        t_votes = [
            id for realm, id, ver, u, v, t, c in votes if realm == 'ticket'
        ]
        w_votes = [
            id for realm, id, ver, u, v, t, c in votes if realm == 'wiki'
        ]
        self.assertTrue('1' in t_votes)
        if resource_check:
            self.assertFalse('2' in t_votes)
            self.assertFalse('DeletedPage' in w_votes)
        self.assertTrue('ExistingPage' in w_votes)
Ejemplo n.º 47
0
 def setUp(self):
     self.env = EnvironmentStub()
     self.env.path = tempfile.mkdtemp(prefix='trac-tempenv-')
     self.tmpdir = os.path.join(self.env.path, 'tmp')
     os.mkdir(self.tmpdir)
     self.filename = os.path.join(self.tmpdir, 'file.txt')
     create_file(self.filename, self.page_text)
     self.admin = WikiAdmin(self.env)
     with self.env.db_transaction:
         for name, readonly in (('WritablePage', [0, 1, 0]),
                                ('ReadOnlyPage', [1, 0, 1, 0, 1])):
             for r in readonly:
                 page = WikiPage(self.env, name)
                 page.text = '[wiki:%s@%d]' % (name, page.version + 1)
                 page.readonly = r
                 page.save('trac', '')
Ejemplo n.º 48
0
    def putPage(self, req, pagename, content, attributes):
        """ writes the content of the page. """
        page = WikiPage(self.env, pagename)
        if page.readonly:
            req.perm(page.resource).require("WIKI_ADMIN")
        elif not page.exists:
            req.perm(page.resource).require("WIKI_CREATE")
        else:
            req.perm(page.resource).require("WIKI_MODIFY")

        page.text = content
        if req.perm(page.resource).has_permission("WIKI_ADMIN"):
            page.readonly = attributes.get("readonly") and 1 or 0

        page.save(attributes.get("author", req.authname), attributes.get("comment"), req.remote_addr)
        return True
Ejemplo n.º 49
0
    def process_request(self, req):
        pagename = req.args.get('page', '')
        template = req.args.get('template', '')

        assert pagename, "Must specify a page name"

        if pagename.endswith('/'):
            req.redirect(req.href.newpage(pagename.strip('/')))

        page = WikiPage(self.env, pagename)
        template_page = WikiPage(self.env,
                                 WikiModule.PAGE_TEMPLATES_PREFIX + template)

        fields = self._find_fields(template_page.text)

        #If page already exists, tell it
        if page.version != 0:
            add_warning(req, "Page %s already exists" % pagename)
            req.perm(page.resource).require('WIKI_MODIFY')
        else:
            req.perm.require('WIKI_CREATE')

        #Add wiki styles css
        add_stylesheet(req, 'common/css/wiki.css')

        data = {
            'template_page': template_page,
            'template': template,
            'page': page,
            'fields': fields
        }

        #Template has no fields?
        if len(fields) == 0:
            if page.version == 0 and template:
                req.redirect(
                    req.href.wiki(page.name, action='edit', template=template))
            else:
                req.redirect(req.href.wiki(page.name))
        elif req.method == 'POST':
            page.text = self._replace_fields(fields, template_page.text, req)
            page.save(req.authname, 'New page from template %s' % template,
                      req.remote_addr)
            req.redirect(req.href.wiki(page.name))
        else:
            return 'newpage.html', data, None
Ejemplo n.º 50
0
    def putPage(self, req, pagename, content, attributes):
        """ writes the content of the page. """
        page = WikiPage(self.env, pagename)
        if page.readonly:
            req.perm(page.resource).require('WIKI_ADMIN')
        elif not page.exists:
            req.perm(page.resource).require('WIKI_CREATE')
        else:
            req.perm(page.resource).require('WIKI_MODIFY')

        page.text = content
        if req.perm(page.resource).has_permission('WIKI_ADMIN'):
            page.readonly = attributes.get('readonly') and 1 or 0

        page.save(attributes.get('author', req.authname),
                  attributes.get('comment'), req.remote_addr)
        return True
Ejemplo n.º 51
0
    def putPage(self, req, pagename, content, attributes):
        """ writes the content of the page. """
        page = WikiPage(self.env, pagename)
        if page.readonly:
            req.perm.assert_permission('WIKI_ADMIN')
        elif not page.exists:
            req.perm.assert_permission('WIKI_CREATE')
        else:
            req.perm.assert_permission('WIKI_MODIFY')

        page.text = content
        if req.perm.has_permission('WIKI_ADMIN'):
            page.readonly = attributes.get('readonly') and 1 or 0

        page.save(attributes.get('author', req.authname),
                  attributes.get('comment'),
                  req.remote_addr)
        return True
Ejemplo n.º 52
0
def wiki_setup(tc):
    tc.env = EnvironmentStub(default_data=True,
                             enable=['trac.*', 'tractags.*'])
    tc.env.path = tempfile.mkdtemp()
    tc.db_mgr = DatabaseManager(tc.env)
    tc.db = tc.env.get_db_cnx()

    cursor = tc.db.cursor()
    cursor.execute("DROP TABLE IF EXISTS tags")
    cursor.execute("DROP TABLE IF EXISTS tags_change")
    cursor.execute("DELETE FROM system WHERE name='tags_version'")
    cursor.execute("DELETE FROM permission WHERE action %s"
                   % tc.db.like(), ('TAGS_%',))

    TagSetup(tc.env).upgrade_environment(tc.db)

    now = datetime.now(utc)
    wiki = WikiPage(tc.env)
    wiki.name = 'TestPage'
    wiki.text = '--'
    wiki.save('joe', 'TagsPluginTestPage', '::1', now)

    cursor = tc.db.cursor()
    # Populate table with initial test data.
    cursor.executemany("""
        INSERT INTO tags
               (tagspace, name, tag)
        VALUES (%s,%s,%s)
    """, [('wiki', 'TestPage', '2ndtag'),
          ('wiki', 'TestPage', 'a.really?_\wild-thing'),
          ('wiki', 'TestPage', 'heavily-quoted'),
          ('wiki', 'TestPage', 'onetag'),
          ('wiki', 'TestPage', 'tagged'),
          ('wiki', 'TestPage', "single'quote"),
         ])

    req = Mock(href=Href('/'), abs_href=Href('http://www.example.com/'),
               authname='anonymous', perm=MockPerm(), tz=utc, args={},
               locale=locale_en)
    tc.env.href = req.href
    tc.env.abs_href = req.abs_href
    tc.context = Context.from_request(req)
    # Enable big diff output.
    tc.maxDiff = None
Ejemplo n.º 53
0
    def test_upgrade_v1_to_current(self):
        # The initial db schema from r2963 - 02-Jan-2008 by Alec Thomas.
        schema = [
            Table('votes', key=('resource', 'username', 'vote'))[
                Column('resource'),
                Column('username'),
                Column('vote', 'int'),
                ]
            ]
        self._schema_init(schema)

        # Populate tables with test data.
        cursor = self.db.cursor()
        cursor.executemany("""
            INSERT INTO votes
                   (resource,username,vote)
            VALUES (%s,%s,%s)
        """, (('ticket/1','user',-1), ('ticket/2','user',1),
              ('wiki/DeletedPage','user',-1), ('wiki/ExistingPage','user',1)))
        # Resources must exist for successful data migration.
        t = Ticket(self.env, db=self.db)
        t['summary'] = 'test ticket'
        t.insert()
        w = WikiPage(self.env, 'ExistingPage')
        w.text = 'content'
        w.save('author', 'comment', '::1')
        self._verify_schema_unregistered()
        self.assertEquals(1, self.votes.get_schema_version(self.db))
        self.assertTrue(self.votes.environment_needs_upgrade(self.db))

        # Data migration and registration of unversioned schema.
        self.votes.upgrade_environment(self.db)
        self._verify_curr_schema()

        cursor.execute('SELECT * FROM votes')
        votes = cursor.fetchall()
        t_votes = [id for realm,id,ver,u,v,t,c in votes if realm == 'ticket']
        w_votes = [id for realm,id,ver,u,v,t,c in votes if realm == 'wiki']
        self.assertTrue('1' in t_votes)
        if resource_check:
            self.assertFalse('2' in t_votes)
            self.assertFalse('DeletedPage' in w_votes)
        self.assertTrue('ExistingPage' in w_votes)
Ejemplo n.º 54
0
    def process_request(self, req):
        pagename = req.args.get('page', '')
        template = req.args.get('template', '')
        
        assert pagename, "Must specify a page name"

        if pagename.endswith('/'):
            req.redirect(req.href.newpage(pagename.strip('/')))

        page = WikiPage(self.env, pagename)
        template_page =  WikiPage(self.env, WikiModule.PAGE_TEMPLATES_PREFIX + template)
        
        fields = self._find_fields(template_page.text)
        
        #If page already exists, tell it
        if page.version != 0:
            add_warning(req, "Page %s already exists" % pagename)
            req.perm(page.resource).require('WIKI_MODIFY')
        else:
            req.perm.require('WIKI_CREATE')

        #Add wiki styles css
        add_stylesheet(req, 'common/css/wiki.css')

        data = {'template_page': template_page,
            'template': template,
            'page': page,
            'fields': fields}
        
        #Template has no fields?
        if len(fields) == 0:
            if page.version == 0 and template:
                req.redirect(req.href.wiki(page.name, action='edit', template=template))
            else:
                req.redirect(req.href.wiki(page.name))
        elif req.method == 'POST':
            page.text = self._replace_fields(fields, template_page.text, req)
            page.save(req.authname, 'New page from template %s' % template, req.remote_addr)
            req.redirect(req.href.wiki(page.name))
        else:
            return 'newpage.html', data, None
Ejemplo n.º 55
0
class DefaultWikiPolicyTestCase(unittest.TestCase):

    def setUp(self):
        self.env = \
            EnvironmentStub(enable=['trac.attachment.LegacyAttachmentPolicy',
                                    'trac.perm.*',
                                    'trac.wiki.web_ui.*'])
        self.env.config.set('trac', 'permission_policies',
                            'DefaultWikiPolicy,DefaultPermissionPolicy')
        self.policy = DefaultWikiPolicy(self.env)
        store = DefaultPermissionStore(self.env)
        store.grant_permission('user1', 'WIKI_ADMIN')
        store.grant_permission('user2', 'WIKI_DELETE')
        store.grant_permission('user2', 'WIKI_MODIFY')
        store.grant_permission('user2', 'WIKI_RENAME')
        self.page = WikiPage(self.env, 'SomePage')
        self.page.text = 'This is a readonly page.'
        self.page.readonly = 1
        self.page.save('user', 'readonly page added')

    def test_user_with_wiki_admin_can_modify_readonly_page(self):
        """User with WIKI_ADMIN cannot modify a readonly page."""
        perm_cache = PermissionCache(self.env, 'user1', self.page.resource)
        self.assertIn('WIKI_ADMIN', perm_cache)
        for perm in ('WIKI_DELETE', 'WIKI_MODIFY', 'WIKI_RENAME'):
            self.assertIn(perm, perm_cache)
            self.assertIsNone(
                self.policy.check_permission(perm, perm_cache.username,
                                             self.page.resource, perm_cache))

    def test_user_without_wiki_admin_cannot_modify_readonly_page(self):
        """User without WIKI_ADMIN cannot modify a readonly page."""
        perm_cache = PermissionCache(self.env, 'user2', self.page.resource)
        self.assertNotIn('WIKI_ADMIN', perm_cache)
        for perm in ('WIKI_DELETE', 'WIKI_MODIFY', 'WIKI_RENAME'):
            self.assertNotIn(perm, perm_cache)
            self.assertFalse(
                self.policy.check_permission(perm, perm_cache.username,
                                             self.page.resource, perm_cache))
Ejemplo n.º 56
0
    def test_view_page_with_invalid_pattern(self):
        """Page with invalid pattern should render fine, but not allow
        an edit without correcting the invalid pattern.
        """
        text = """{{{
(?i)eventbrite\.com
(?i)sneaker(?:supplier|nice\.com
}}}"""
        page = WikiPage(self.env)
        page.text = text
        page.name = 'BadContent'
        try:
            page.save('anonymous', 'Page created.')
        except TracError:
            self.assertTrue(WikiPage(self.env, 'BadContent').exists)
        else:
            self.fail("Saving page with invalid content did not "
                      "raise a TracError.")
        req = MockRequest(self.env, authname='user', args={
            'action': 'view',
        }, path_info='/wiki/BadContent')

        data = self._dispatch_request(req)[1]

        self.assertEqual(page.text, data['text'])

        req = MockRequest(self.env, authname='user', args={
            'action': 'edit',
            'preview': True,
            'version': 1,
            'text': text
        }, method='POST', path_info='/wiki/BadContent')
        self._dispatch_request(req)

        self.assertIn('Invalid Wiki page: Error in pattern '
                      '<tt>(?i)sneaker(?:supplier|nice\\.com</tt>: '
                      '<i>unbalanced parenthesis</i>.',
                      req.chrome['warnings'])
Ejemplo n.º 57
0
def wiki_setup(tc):
    tc.env = EnvironmentStub(default_data=True,
                             enable=['trac.*', 'tractags.*'])
    tc.env.path = tempfile.mkdtemp()
    tc.db_mgr = DatabaseManager(tc.env)
    tc.db = tc.env.get_db_cnx()

    TagSetup(tc.env).upgrade_environment(tc.db)

    now = datetime.now(utc)
    wiki = WikiPage(tc.env)
    wiki.name = 'TestPage'
    wiki.text = '--'
    wiki.save('joe', 'TagsPluginTestPage', '::1', now)

    req = Mock(href=Href('/'), abs_href=Href('http://www.example.com/'),
               authname='anonymous', perm=MockPerm(), tz=utc, args={},
               locale=Locale.parse('en_US') if Locale else None)
    tc.env.href = req.href
    tc.env.abs_href = req.abs_href
    tc.context = Context.from_request(req)
    # Enable big diff output.
    tc.maxDiff = None
Ejemplo n.º 58
0
    def add_wiki_file_to_trac(self, filename, path):
        try:
            conn = self.env.get_db_cnx()
            c = conn.cursor()
            results = c.execute("SELECT name, version FROM wiki_local WHERE name= '%s'" % filename)
            if results.fetchone() is None:
                c.execute("INSERT INTO wiki_local VALUES ('%s', 0)" % filename)
                conn.commit()
            content = read_file(path)
            page = WikiPage(self.env, filename)
            page.text = content.decode('unicode-escape')
            vers = c.execute("SELECT version FROM wiki_local WHERE name = '%s'" % filename)
            local_version = vers.fetchone()[0]
            if local_version != page.version:
                print (filename + ': local page version does not match online version!')
                print ('Local version: ' + str(local_version) + ' <-> online version: ' + str(page.version) + '. Overwrite? (y/n)')
                saved_stdin = sys.stdin
                sys.stdin = open('/dev/tty', 'r')
                user_input = raw_input()
                if user_input == 'y':
                    page.save(author='me', comment='', remote_addr='127.0.0.1')
                    print (filename + ' created/modified as wiki page from version ' + str(local_version) + ' to version ' + str(page.version))
                    c.execute("UPDATE wiki_local SET version = '%s' WHERE name = '%s'" % (page.version, filename))
                    conn.commit()
                    conn.close()
                else:
                    print 'Page not created/modified'
            #print (filename + ': wikipage created/modified.')

            else:
                page.save(author='me', comment='', remote_addr='127.0.0.1')
                print (filename + ' created/modified as wiki page from version ' + str(local_version) + ' to version ' + str(page.version))
                c.execute("UPDATE wiki_local SET version = '%s' WHERE name = '%s'" % (page.version, filename))
                conn.commit()
                conn.close()
        except:
            print (filename + ' not modified or changed; remained untouched')