changeset 43131:c17a63eb5d4c

sidedata: apply basic but tight security around exchange We don't currently have code to deal with exchange between repository using sidedata and repository not using sidedata. Until we implement such code (eg: dropping side data when pushing to a non-sidedata repo) we prevent the two kind of repo to speak to each other. This is somewhere similar to what 'treemanifest' does. Note that sidedata exchange is broken unless one use changegroup v3 anyway. See next changeset for details. Differential Revision: https://phab.mercurial-scm.org/D6939
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Sun, 06 Oct 2019 23:36:51 -0400
parents c88075eb28e3
children 8f807a83d53b
files mercurial/bundle2.py mercurial/exchange.py
diffstat 2 files changed, 25 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/bundle2.py	Tue Oct 08 02:19:04 2019 -0400
+++ b/mercurial/bundle2.py	Sun Oct 06 23:36:51 2019 -0400
@@ -1711,6 +1711,8 @@
             part.addparam(
                 b'targetphase', b'%d' % phases.secret, mandatory=False
             )
+        if b'exp-sidedata-flag' in repo.requirements:
+            part.addparam(b'exp-sidedata', b'1')
 
     if opts.get(b'streamv2', False):
         addpartbundlestream2(bundler, repo, stream=True)
@@ -1930,7 +1932,14 @@
 
 
 @parthandler(
-    b'changegroup', (b'version', b'nbchanges', b'treemanifest', b'targetphase')
+    b'changegroup',
+    (
+        b'version',
+        b'nbchanges',
+        b'exp-sidedata',
+        b'treemanifest',
+        b'targetphase',
+    ),
 )
 def handlechangegroup(op, inpart):
     """apply a changegroup part on the repo
@@ -1965,6 +1974,14 @@
             op.repo.ui, op.repo.requirements, op.repo.features
         )
         op.repo._writerequirements()
+
+    bundlesidedata = bool(b'exp-sidedata' in inpart.params)
+    reposidedata = bool(b'exp-sidedata-flag' in op.repo.requirements)
+    if reposidedata and not bundlesidedata:
+        msg = b"repository is using sidedata but the bundle source do not"
+        hint = b'this is currently unsupported'
+        raise error.Abort(msg, hint=hint)
+
     extrakwargs = {}
     targetphase = inpart.params.get(b'targetphase')
     if targetphase is not None:
@@ -2551,5 +2568,7 @@
         part.addparam(b'version', cgversion)
         if b'treemanifest' in repo.requirements:
             part.addparam(b'treemanifest', b'1')
+        if b'exp-sidedata-flag' in repo.requirements:
+            part.addparam(b'exp-sidedata', b'1')
 
     return bundler
--- a/mercurial/exchange.py	Tue Oct 08 02:19:04 2019 -0400
+++ b/mercurial/exchange.py	Sun Oct 06 23:36:51 2019 -0400
@@ -1049,6 +1049,8 @@
         cgpart.addparam(b'version', version)
     if b'treemanifest' in pushop.repo.requirements:
         cgpart.addparam(b'treemanifest', b'1')
+    if b'exp-sidedata-flag' in pushop.repo.requirements:
+        cgpart.addparam(b'exp-sidedata', b'1')
 
     def handlereply(op):
         """extract addchangegroup returns from server reply"""
@@ -2511,6 +2513,9 @@
     if b'treemanifest' in repo.requirements:
         part.addparam(b'treemanifest', b'1')
 
+    if b'exp-sidedata-flag' in repo.requirements:
+        part.addparam(b'exp-sidedata', b'1')
+
     if (
         kwargs.get(r'narrow', False)
         and kwargs.get(r'narrow_acl', False)