Esempio n. 1
0
 def test_store_signature(self):
     wt = self.make_branch_and_tree('.')
     branch = wt.branch
     branch.lock_write()
     try:
         branch.repository.start_write_group()
         try:
             branch.repository.store_revision_signature(
                 gpg.LoopbackGPGStrategy(None), b'FOO', b'A')
         except errors.NoSuchRevision:
             branch.repository.abort_write_group()
             raise tests.TestNotApplicable(
                 "repository does not support signing non-present"
                 "revisions")
         except:
             branch.repository.abort_write_group()
             raise
         else:
             branch.repository.commit_write_group()
     finally:
         branch.unlock()
     # A signature without a revision should not be accessible.
     self.assertRaises(errors.NoSuchRevision,
                       branch.repository.has_signature_for_revision_id,
                       b'A')
     if wt.branch.repository._format.supports_setting_revision_ids:
         wt.commit("base", rev_id=b'A', allow_pointless=True)
         self.assertEqual(b'-----BEGIN PSEUDO-SIGNED CONTENT-----\n'
                          b'FOO-----END PSEUDO-SIGNED CONTENT-----\n',
                          branch.repository.get_signature_text(b'A'))
Esempio n. 2
0
 def test_verify_revision_signature_not_signed(self):
     wt = self.make_branch_and_tree('.')
     a = wt.commit("base", allow_pointless=True)
     strategy = gpg.LoopbackGPGStrategy(None)
     self.assertEqual(
         (gpg.SIGNATURE_NOT_SIGNED, None),
         wt.branch.repository.verify_revision_signature(a, strategy))
Esempio n. 3
0
 def test_sign_revision(self):
     if self.repository_format.supports_revision_signatures:
         raise tests.TestNotApplicable(
             "repository supports signing revisions")
     wt = self.make_branch_and_tree('source')
     a = wt.commit('A', allow_pointless=True)
     repo = wt.branch.repository
     repo.lock_write()
     repo.start_write_group()
     self.assertRaises(errors.UnsupportedOperation,
                       repo.sign_revision, a, gpg.LoopbackGPGStrategy(None))
     repo.commit_write_group()
Esempio n. 4
0
 def test_sign_existing_revision(self):
     wt = self.make_branch_and_tree('.')
     a = wt.commit("base", allow_pointless=True)
     strategy = gpg.LoopbackGPGStrategy(None)
     repo = wt.branch.repository
     self.addCleanup(repo.lock_write().unlock)
     repo.start_write_group()
     repo.sign_revision(a, strategy)
     repo.commit_write_group()
     self.assertEqual(b'-----BEGIN PSEUDO-SIGNED CONTENT-----\n'
                      + Testament.from_revision(repo,
                                                a).as_short_text() +
                      b'-----END PSEUDO-SIGNED CONTENT-----\n',
                      repo.get_signature_text(a))
Esempio n. 5
0
 def makeARepoWithSignatures(self):
     wt = self.make_branch_and_tree('a-repo-with-sigs')
     rev1 = wt.commit('rev1', allow_pointless=True)
     repo = wt.branch.repository
     repo.lock_write()
     repo.start_write_group()
     try:
         repo.sign_revision(rev1, gpg.LoopbackGPGStrategy(None))
     except errors.UnsupportedOperation:
         self.assertFalse(repo._format.supports_revision_signatures)
         raise TestNotApplicable(
             "repository format does not support signatures")
     repo.commit_write_group()
     repo.unlock()
     return repo, rev1
Esempio n. 6
0
 def test_clone_preserves_signatures(self):
     wt = self.make_branch_and_tree('source')
     a = wt.commit('A', allow_pointless=True)
     repo = wt.branch.repository
     repo.lock_write()
     repo.start_write_group()
     repo.sign_revision(a, gpg.LoopbackGPGStrategy(None))
     repo.commit_write_group()
     repo.unlock()
     # FIXME: clone should work to urls,
     # wt.clone should work to disks.
     self.build_tree(['target/'])
     d2 = repo.controldir.clone(urlutils.local_path_to_url('target'))
     self.assertEqual(repo.get_signature_text(a),
                      d2.open_repository().get_signature_text(a))
Esempio n. 7
0
    def test_item_keys_introduced_by(self):
        # Make a repo with one revision and one versioned file.
        tree = self.make_branch_and_tree('t')
        self.build_tree(['t/foo'])
        tree.add('foo', b'file1')
        tree.commit('message', rev_id=b'rev_id')
        repo = tree.branch.repository
        repo.lock_write()
        repo.start_write_group()
        try:
            repo.sign_revision(b'rev_id', gpg.LoopbackGPGStrategy(None))
        except errors.UnsupportedOperation:
            signature_texts = []
        else:
            signature_texts = [b'rev_id']
        repo.commit_write_group()
        repo.unlock()
        repo.lock_read()
        self.addCleanup(repo.unlock)

        # Item keys will be in this order, for maximum convenience for
        # generating data to insert into knit repository:
        #   * files
        #   * inventory
        #   * signatures
        #   * revisions
        expected_item_keys = [
            ('file', b'file1', [b'rev_id']),
            ('inventory', None, [b'rev_id']),
            ('signatures', None, signature_texts),
            ('revisions', None, [b'rev_id'])]
        item_keys = list(repo.item_keys_introduced_by([b'rev_id']))
        item_keys = [
            (kind, file_id, list(versions))
            for (kind, file_id, versions) in item_keys]

        if repo.supports_rich_root():
            # Check for the root versioned file in the item_keys, then remove
            # it from streamed_names so we can compare that with
            # expected_record_names.
            # Note that the file keys can be in any order, so this test is
            # written to allow that.
            inv = repo.get_inventory(b'rev_id')
            root_item_key = ('file', inv.root.file_id, [b'rev_id'])
            self.assertIn(root_item_key, item_keys)
            item_keys.remove(root_item_key)

        self.assertEqual(expected_item_keys, item_keys)
Esempio n. 8
0
 def test_verify_revision_signatures(self):
     wt = self.make_branch_and_tree('.')
     a = wt.commit("base", allow_pointless=True)
     b = wt.commit("second", allow_pointless=True)
     strategy = gpg.LoopbackGPGStrategy(None)
     repo = wt.branch.repository
     self.addCleanup(repo.lock_write().unlock)
     repo.start_write_group()
     repo.sign_revision(a, strategy)
     repo.commit_write_group()
     self.assertEqual(b'-----BEGIN PSEUDO-SIGNED CONTENT-----\n'
                      + Testament.from_revision(repo, a).as_short_text()
                      + b'-----END PSEUDO-SIGNED CONTENT-----\n',
                      repo.get_signature_text(a))
     self.assertEqual(
         [(a, gpg.SIGNATURE_VALID, None),
          (b, gpg.SIGNATURE_NOT_SIGNED, None)],
         list(repo.verify_revision_signatures([a, b], strategy)))
Esempio n. 9
0
 def test_install_revisions(self):
     wt = self.make_branch_and_tree('source')
     wt.commit('A', allow_pointless=True, rev_id=b'A')
     repo = wt.branch.repository
     repo.lock_write()
     repo.start_write_group()
     repo.sign_revision(b'A', gpg.LoopbackGPGStrategy(None))
     repo.commit_write_group()
     repo.unlock()
     repo.lock_read()
     self.addCleanup(repo.unlock)
     repo2 = self.make_repository('repo2')
     revision = repo.get_revision(b'A')
     tree = repo.revision_tree(b'A')
     signature = repo.get_signature_text(b'A')
     repo2.lock_write()
     self.addCleanup(repo2.unlock)
     vf_repository.install_revisions(repo2, [(revision, tree, signature)])
     self.assertEqual(revision, repo2.get_revision(b'A'))
     self.assertEqual(signature, repo2.get_signature_text(b'A'))