Mercurial > hg
view tests/test-treediscovery-legacy.t @ 36754:e3c228b4510d stable
wireproto: declare operation type for most commands (BC) (SEC)
The permissions model of hgweb relies on a dictionary to declare
the operation associated with each command - either "pull" or
"push." This dictionary was established by d3147b4e3e8a in 2008.
Unfortunately, we neglected to update this dictionary as new
wire protocol commands were introduced.
This commit defines the operations of most wire protocol commands
in the permissions dictionary. The "batch" command is omitted because
it is special and requires a more complex solution.
Since permissions checking is skipped unless a command has an entry in
this dictionary (this security issue will be addressed in a subsequent
commit), the practical effect of this change is that various wire
protocol commands now HTTP 401 if web.deny_read or web.allow-pull,
etc are set to deny access. This is reflected by test changes. Note
how various `hg pull` and `hg push` operations now fail before
discovery. (They fail during the initial "capabilities" request.)
This change fixes a security issue where built-in wire protocol
commands would return repository data even if the web config were
configured to deny access to that data.
I'm on the fence as to whether we should HTTP 401 the capabilities
request. On one hand, it can expose repository metadata and can tell
callers things like what version of Mercurial the server is running.
On the other hand, a client may need to know the capabilities in order
to authenticate in a follow-up request. It appears that Mercurial
clients handle the HTTP 401 on *any* protocol request, so we should
be OK sending a 401 for "capabilities." But if this causes problems,
it should be possible to allow "capabilities" to always work.
.. bc::
Various read-only wire protocol commands now return HTTP 401
Unauthorized if the hgweb configuration denies read/pull access to
the repository.
Previously, various wire protocol commands would still work and
return data if read access was disabled.
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Tue, 20 Feb 2018 18:54:27 -0800 |
parents | eb586ed5d8ce |
children | b4b7427b5786 |
line wrap: on
line source
#require killdaemons Tests discovery against servers without getbundle support: $ cat >> $HGRCPATH <<EOF > [ui] > logtemplate="{rev} {node|short}: {desc} {branches}\n" > EOF $ cp $HGRCPATH $HGRCPATH-withcap $ CAP="getbundle known changegroupsubset bundle2" $ . "$TESTDIR/notcapable" $ cp $HGRCPATH $HGRCPATH-nocap $ cp $HGRCPATH-withcap $HGRCPATH Prep for test server without branchmap support $ CAP="branchmap" $ . "$TESTDIR/notcapable" $ cp $HGRCPATH $HGRCPATH-nocap-branchmap $ cp $HGRCPATH-withcap $HGRCPATH Setup HTTP server control: $ remote=http://localhost:$HGPORT/ $ export remote $ tstart() { > echo '[web]' > $1/.hg/hgrc > echo 'push_ssl = false' >> $1/.hg/hgrc > echo 'allow_push = *' >> $1/.hg/hgrc > cp $HGRCPATH-nocap $HGRCPATH > hg serve -R $1 -p $HGPORT -d --pid-file=hg.pid -E errors.log > cat hg.pid >> $DAEMON_PIDS > } $ tstop() { > killdaemons.py > cp $HGRCPATH-withcap $HGRCPATH > } Both are empty: $ hg init empty1 $ hg init empty2 $ tstart empty2 $ hg incoming -R empty1 $remote comparing with http://localhost:$HGPORT/ no changes found [1] $ hg outgoing -R empty1 $remote comparing with http://localhost:$HGPORT/ no changes found [1] $ hg pull -R empty1 $remote pulling from http://localhost:$HGPORT/ no changes found $ hg push -R empty1 $remote pushing to http://localhost:$HGPORT/ no changes found [1] $ tstop Base repo: $ hg init main $ cd main $ hg debugbuilddag -mo '+2:tbase @name1 +3:thead1 <tbase @name2 +4:thead2 @both /thead1 +2:tmaintip' $ hg log -G o 11 a19bfa7e7328: r11 both | o 10 8b6bad1512e1: r10 both | o 9 025829e08038: r9 both |\ | o 8 d8f638ac69e9: r8 name2 | | | o 7 b6b4d315a2ac: r7 name2 | | | o 6 6c6f5d5f3c11: r6 name2 | | | o 5 70314b29987d: r5 name2 | | o | 4 e71dbbc70e03: r4 name1 | | o | 3 2c8d5d5ec612: r3 name1 | | o | 2 a7892891da29: r2 name1 |/ o 1 0019a3b924fd: r1 | o 0 d57206cc072a: r0 $ cd .. $ tstart main Full clone: $ hg clone main full updating to branch default 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd full $ hg incoming $remote comparing with http://localhost:$HGPORT/ searching for changes no changes found [1] $ hg outgoing $remote comparing with http://localhost:$HGPORT/ searching for changes no changes found [1] $ hg pull $remote pulling from http://localhost:$HGPORT/ searching for changes no changes found $ hg push $remote pushing to http://localhost:$HGPORT/ searching for changes no changes found [1] $ cd .. Local is empty: $ cd empty1 $ hg incoming $remote --rev name1 comparing with http://localhost:$HGPORT/ abort: cannot look up remote changes; remote repository does not support the 'changegroupsubset' capability! [255] $ hg incoming $remote comparing with http://localhost:$HGPORT/ 0 d57206cc072a: r0 1 0019a3b924fd: r1 2 a7892891da29: r2 name1 3 2c8d5d5ec612: r3 name1 4 e71dbbc70e03: r4 name1 5 70314b29987d: r5 name2 6 6c6f5d5f3c11: r6 name2 7 b6b4d315a2ac: r7 name2 8 d8f638ac69e9: r8 name2 9 025829e08038: r9 both 10 8b6bad1512e1: r10 both 11 a19bfa7e7328: r11 both $ hg outgoing $remote comparing with http://localhost:$HGPORT/ no changes found [1] $ hg push $remote pushing to http://localhost:$HGPORT/ no changes found [1] $ hg pull $remote pulling from http://localhost:$HGPORT/ requesting all changes adding changesets adding manifests adding file changes added 12 changesets with 24 changes to 2 files new changesets d57206cc072a:a19bfa7e7328 (run 'hg update' to get a working copy) $ hg incoming $remote comparing with http://localhost:$HGPORT/ searching for changes no changes found [1] $ cd .. Local is subset: $ cp $HGRCPATH-withcap $HGRCPATH $ hg clone main subset --rev name2 ; cd subset adding changesets adding manifests adding file changes added 6 changesets with 12 changes to 2 files new changesets d57206cc072a:d8f638ac69e9 updating to branch name2 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cp $HGRCPATH-nocap $HGRCPATH $ hg incoming $remote comparing with http://localhost:$HGPORT/ searching for changes 6 a7892891da29: r2 name1 7 2c8d5d5ec612: r3 name1 8 e71dbbc70e03: r4 name1 9 025829e08038: r9 both 10 8b6bad1512e1: r10 both 11 a19bfa7e7328: r11 both $ hg outgoing $remote comparing with http://localhost:$HGPORT/ searching for changes no changes found [1] $ hg push $remote pushing to http://localhost:$HGPORT/ searching for changes no changes found [1] $ hg pull $remote pulling from http://localhost:$HGPORT/ searching for changes adding changesets adding manifests adding file changes added 6 changesets with 12 changes to 2 files new changesets a7892891da29:a19bfa7e7328 (run 'hg update' to get a working copy) $ hg incoming $remote comparing with http://localhost:$HGPORT/ searching for changes no changes found [1] $ cd .. Remote is empty: $ tstop ; tstart empty2 $ cd main $ hg incoming $remote comparing with http://localhost:$HGPORT/ searching for changes no changes found [1] $ hg outgoing $remote comparing with http://localhost:$HGPORT/ searching for changes 0 d57206cc072a: r0 1 0019a3b924fd: r1 2 a7892891da29: r2 name1 3 2c8d5d5ec612: r3 name1 4 e71dbbc70e03: r4 name1 5 70314b29987d: r5 name2 6 6c6f5d5f3c11: r6 name2 7 b6b4d315a2ac: r7 name2 8 d8f638ac69e9: r8 name2 9 025829e08038: r9 both 10 8b6bad1512e1: r10 both 11 a19bfa7e7328: r11 both $ hg pull $remote pulling from http://localhost:$HGPORT/ searching for changes no changes found $ hg push $remote pushing to http://localhost:$HGPORT/ searching for changes remote: adding changesets remote: adding manifests remote: adding file changes remote: added 12 changesets with 24 changes to 2 files $ hg outgoing $remote comparing with http://localhost:$HGPORT/ searching for changes no changes found [1] $ cd .. Local is superset: $ tstop $ hg clone main subset2 --rev name2 adding changesets adding manifests adding file changes added 6 changesets with 12 changes to 2 files new changesets d57206cc072a:d8f638ac69e9 updating to branch name2 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ tstart subset2 $ cd main $ hg incoming $remote comparing with http://localhost:$HGPORT/ searching for changes no changes found [1] $ hg outgoing $remote comparing with http://localhost:$HGPORT/ searching for changes 2 a7892891da29: r2 name1 3 2c8d5d5ec612: r3 name1 4 e71dbbc70e03: r4 name1 9 025829e08038: r9 both 10 8b6bad1512e1: r10 both 11 a19bfa7e7328: r11 both $ hg pull $remote pulling from http://localhost:$HGPORT/ searching for changes no changes found $ hg push $remote pushing to http://localhost:$HGPORT/ searching for changes abort: push creates new remote branches: both, name1! (use 'hg push --new-branch' to create new remote branches) [255] $ hg push $remote --new-branch pushing to http://localhost:$HGPORT/ searching for changes remote: adding changesets remote: adding manifests remote: adding file changes remote: added 6 changesets with 12 changes to 2 files $ hg outgoing $remote comparing with http://localhost:$HGPORT/ searching for changes no changes found [1] $ cd .. Partial pull: $ tstop ; tstart main $ hg clone $remote partial --rev name2 abort: partial pull cannot be done because other repository doesn't support changegroupsubset. [255] $ hg init partial; cd partial $ hg incoming $remote --rev name2 comparing with http://localhost:$HGPORT/ abort: cannot look up remote changes; remote repository does not support the 'changegroupsubset' capability! [255] $ hg pull $remote --rev name2 pulling from http://localhost:$HGPORT/ abort: partial pull cannot be done because other repository doesn't support changegroupsubset. [255] $ cd .. $ tstop Exercise pushing to server without branchmap capability $ cp $HGRCPATH-nocap-branchmap $HGRCPATH-nocap $ hg init rlocal $ cd rlocal $ echo A > A $ hg ci -Am A adding A $ cd .. $ hg clone rlocal rremote updating to branch default 1 files updated, 0 files merged, 0 files removed, 0 files unresolved $ cd rlocal $ echo B > B $ hg ci -Am B adding B $ cd .. $ tstart rremote $ cd rlocal $ hg incoming $remote comparing with http://localhost:$HGPORT/ searching for changes no changes found [1] $ hg outgoing $remote comparing with http://localhost:$HGPORT/ searching for changes 1 27547f69f254: B $ hg pull $remote pulling from http://localhost:$HGPORT/ searching for changes no changes found $ hg push $remote pushing to http://localhost:$HGPORT/ searching for changes remote: adding changesets remote: adding manifests remote: adding file changes remote: added 1 changesets with 1 changes to 1 files $ hg outgoing $remote comparing with http://localhost:$HGPORT/ searching for changes no changes found [1] $ cd .. $ tstop