tests/test-remote-hidden.t
author Raphaël Gomès <rgomes@octobus.net>
Mon, 08 Jul 2024 17:51:56 +0200
branchstable
changeset 51664 b65ca8a0f674
parent 50447 45c7bada5200
child 51906 0f26ee69cf36
permissions -rw-r--r--
Added tag 6.8 for changeset 11f41248595b

========================================================
Test the ability to access a hidden revision on a server
========================================================

#require serve

  $ . $TESTDIR/testlib/obsmarker-common.sh
  $ cat >> $HGRCPATH << EOF
  > [ui]
  > ssh = "$PYTHON" "$RUNTESTDIR/dummyssh"
  > [phases]
  > # public changeset are not obsolete
  > publish=false
  > [experimental]
  > evolution=all
  > [ui]
  > logtemplate='{rev}:{node|short} {desc} [{phase}]\n'
  > EOF

Setup a simple repository with some hidden revisions
----------------------------------------------------

Testing the `served.hidden` view

  $ hg init repo-with-hidden
  $ cd repo-with-hidden

  $ echo 0 > a
  $ hg ci -qAm "c_Public"
  $ hg phase --public
  $ echo 1 > a
  $ hg ci -m "c_Amend_Old"
  $ echo 2 > a
  $ hg ci -m "c_Amend_New" --amend
  $ hg up ".^"
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ echo 3 > a
  $ hg ci -m "c_Pruned"
  created new head
  $ hg debugobsolete --record-parents `getid 'desc("c_Pruned")'` -d '0 0'
  1 new obsolescence markers
  obsoleted 1 changesets
  $ hg up ".^"
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ echo 4 > a
  $ hg ci -m "c_Secret" --secret
  created new head
  $ echo 5 > a
  $ hg ci -m "c_Secret_Pruned" --secret
  $ hg debugobsolete --record-parents `getid 'desc("c_Secret_Pruned")'` -d '0 0'
  1 new obsolescence markers
  obsoleted 1 changesets
  $ hg up null
  0 files updated, 0 files merged, 1 files removed, 0 files unresolved

  $ hg log -G -T '{rev}:{node|short} {desc} [{phase}]\n' --hidden
  x  5:8d28cbe335f3 c_Secret_Pruned [secret]
  |
  o  4:1c6afd79eb66 c_Secret [secret]
  |
  | x  3:5d1575e42c25 c_Pruned [draft]
  |/
  | o  2:c33affeb3f6b c_Amend_New [draft]
  |/
  | x  1:be215fbb8c50 c_Amend_Old [draft]
  |/
  o  0:5f354f46e585 c_Public [public]
  
  $ hg debugobsolete
  be215fbb8c5090028b00154c1fe877ad1b376c61 c33affeb3f6b4e9621d1839d6175ddc07708807c 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '9', 'operation': 'amend', 'user': 'test'}
  5d1575e42c25b7f2db75cd4e0b881b1c35158fae 0 {5f354f46e5853535841ec7a128423e991ca4d59b} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
  8d28cbe335f311bc89332d7bbe8a07889b6914a0 0 {1c6afd79eb6663275bbe30097e162b1c24ced0f0} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}

  $ cd ..

Test the feature
================

Check cache pre-warm
--------------------

  $ ls -1 repo-with-hidden/.hg/cache
  branch2
  branch2-base
  branch2-served
  branch2-served.hidden
  branch2-visible
  rbc-names-v1
  rbc-revs-v1
  tags2
  tags2-visible

Check that the `served.hidden` repoview
---------------------------------------

  $ hg -R repo-with-hidden serve -p $HGPORT -d --pid-file hg.pid --config web.view=served.hidden
  $ cat hg.pid >> $DAEMON_PIDS

changesets in secret and higher phases are not visible through hgweb

  $ hg -R repo-with-hidden log --template "revision:    {rev}\\n" --rev "reverse(not secret())"
  revision:    2
  revision:    0
  $ hg -R repo-with-hidden log --template "revision:    {rev}\\n" --rev "reverse(not secret())" --hidden
  revision:    3
  revision:    2
  revision:    1
  revision:    0
  $ get-with-headers.py localhost:$HGPORT 'log?style=raw' | grep revision:
  revision:    3
  revision:    2
  revision:    1
  revision:    0

  $ killdaemons.py

Test --remote-hidden for local peer
-----------------------------------

  $ hg clone --pull repo-with-hidden client
  requesting all changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 2 changes to 1 files
  2 new obsolescence markers
  new changesets 5f354f46e585:c33affeb3f6b (1 drafts)
  updating to branch default
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ hg -R client log -G --hidden -v
  @  1:c33affeb3f6b c_Amend_New [draft]
  |
  o  0:5f354f46e585 c_Public [public]
  

pulling an hidden changeset should fail:

  $ hg -R client pull -r be215fbb8c50
  pulling from $TESTTMP/repo-with-hidden
  abort: filtered revision 'be215fbb8c50' (not in 'served' subset)
  [10]

pulling an hidden changeset with --remote-hidden should succeed:

  $ hg -R client pull --remote-hidden --traceback -r be215fbb8c50
  pulling from $TESTTMP/repo-with-hidden
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files (+1 heads)
  (1 other changesets obsolete on arrival)
  (run 'hg heads' to see heads)
  $ hg -R client log -G --hidden -v
  x  2:be215fbb8c50 c_Amend_Old [draft]
  |
  | @  1:c33affeb3f6b c_Amend_New [draft]
  |/
  o  0:5f354f46e585 c_Public [public]
  

Pulling a secret changeset is still forbidden:

secret visible:

  $ hg -R client pull --remote-hidden -r 8d28cbe335f3
  pulling from $TESTTMP/repo-with-hidden
  abort: filtered revision '8d28cbe335f3' (not in 'served.hidden' subset)
  [10]

secret hidden:

  $ hg -R client pull --remote-hidden -r 1c6afd79eb66
  pulling from $TESTTMP/repo-with-hidden
  abort: filtered revision '1c6afd79eb66' (not in 'served.hidden' subset)
  [10]

Test accessing hidden changeset through hgweb
---------------------------------------------

  $ hg -R repo-with-hidden serve -p $HGPORT -d --pid-file hg.pid --config "experimental.server.allow-hidden-access=*" -E error.log --accesslog access.log
  $ cat hg.pid >> $DAEMON_PIDS

Hidden changeset are hidden by default:

  $ get-with-headers.py localhost:$HGPORT 'log?style=raw' | grep revision:
  revision:    2
  revision:    0

Hidden changeset are visible when requested:

  $ get-with-headers.py localhost:$HGPORT 'log?style=raw&access-hidden=1' | grep revision:
  revision:    3
  revision:    2
  revision:    1
  revision:    0

Same check on a server that do not allow hidden access:
```````````````````````````````````````````````````````

  $ hg -R repo-with-hidden serve -p $HGPORT1 -d --pid-file hg2.pid --config "experimental.server.allow-hidden-access=" -E error.log --accesslog access.log
  $ cat hg2.pid >> $DAEMON_PIDS

Hidden changeset are hidden by default:

  $ get-with-headers.py localhost:$HGPORT1 'log?style=raw' | grep revision:
  revision:    2
  revision:    0

Hidden changeset are still hidden despite being the hidden access request:

  $ get-with-headers.py localhost:$HGPORT1 'log?style=raw&access-hidden=1' | grep revision:
  revision:    2
  revision:    0

Test --remote-hidden for http peer
----------------------------------

  $ hg clone --pull http://localhost:$HGPORT client-http
  requesting all changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 2 changes to 1 files
  2 new obsolescence markers
  new changesets 5f354f46e585:c33affeb3f6b (1 drafts)
  updating to branch default
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ hg -R client-http log -G --hidden -v
  @  1:c33affeb3f6b c_Amend_New [draft]
  |
  o  0:5f354f46e585 c_Public [public]
  

pulling an hidden changeset should fail:

  $ hg -R client-http pull -r be215fbb8c50
  pulling from http://localhost:$HGPORT/
  abort: filtered revision 'be215fbb8c50' (not in 'served' subset)
  [255]

pulling an hidden changeset with --remote-hidden should succeed:

  $ hg -R client-http pull --remote-hidden -r be215fbb8c50
  pulling from http://localhost:$HGPORT/
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files (+1 heads)
  (1 other changesets obsolete on arrival)
  (run 'hg heads' to see heads)
  $ hg -R client-http log -G --hidden -v
  x  2:be215fbb8c50 c_Amend_Old [draft]
  |
  | @  1:c33affeb3f6b c_Amend_New [draft]
  |/
  o  0:5f354f46e585 c_Public [public]
  

Pulling a secret changeset is still forbidden:

secret visible:

  $ hg -R client-http pull --remote-hidden -r 8d28cbe335f3
  pulling from http://localhost:$HGPORT/
  abort: filtered revision '8d28cbe335f3' (not in 'served.hidden' subset)
  [255]

secret hidden:

  $ hg -R client-http pull --remote-hidden -r 1c6afd79eb66
  pulling from http://localhost:$HGPORT/
  abort: filtered revision '1c6afd79eb66' (not in 'served.hidden' subset)
  [255]

Same check on a server that do not allow hidden access:
```````````````````````````````````````````````````````

  $ hg clone --pull http://localhost:$HGPORT1 client-http2
  requesting all changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 2 changes to 1 files
  2 new obsolescence markers
  new changesets 5f354f46e585:c33affeb3f6b (1 drafts)
  updating to branch default
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ hg -R client-http2 log -G --hidden -v
  @  1:c33affeb3f6b c_Amend_New [draft]
  |
  o  0:5f354f46e585 c_Public [public]
  

pulling an hidden changeset should fail:

  $ hg -R client-http2 pull -r be215fbb8c50
  pulling from http://localhost:$HGPORT1/
  abort: filtered revision 'be215fbb8c50' (not in 'served' subset)
  [255]

pulling an hidden changeset with --remote-hidden should fail too:

  $ hg -R client-http2 pull --remote-hidden -r be215fbb8c50
  pulling from http://localhost:$HGPORT1/
  abort: filtered revision 'be215fbb8c50' (not in 'served' subset)
  [255]

Test --remote-hidden for ssh peer
----------------------------------

  $ hg clone --pull ssh://user@dummy/repo-with-hidden client-ssh
  requesting all changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 2 changes to 1 files
  2 new obsolescence markers
  new changesets 5f354f46e585:c33affeb3f6b (1 drafts)
  updating to branch default
  1 files updated, 0 files merged, 0 files removed, 0 files unresolved
  $ hg -R client-ssh log -G --hidden -v
  @  1:c33affeb3f6b c_Amend_New [draft]
  |
  o  0:5f354f46e585 c_Public [public]
  

Check on a server that do not allow hidden access:
``````````````````````````````````````````````````

pulling an hidden changeset should fail:

  $ hg -R client-ssh pull -r be215fbb8c50
  pulling from ssh://user@dummy/repo-with-hidden
  abort: filtered revision 'be215fbb8c50' (not in 'served' subset)
  [255]

pulling an hidden changeset with --remote-hidden should succeed:

  $ hg -R client-ssh pull --remote-hidden -r be215fbb8c50
  pulling from ssh://user@dummy/repo-with-hidden
  remote: ignoring request to access hidden changeset by unauthorized user: * (glob)
  abort: filtered revision 'be215fbb8c50' (not in 'served' subset)
  [255]
  $ hg -R client-ssh log -G --hidden -v
  @  1:c33affeb3f6b c_Amend_New [draft]
  |
  o  0:5f354f46e585 c_Public [public]
  

Check on a server that do allow hidden access:
``````````````````````````````````````````````

  $ cat << EOF >> repo-with-hidden/.hg/hgrc
  > [experimental]
  > server.allow-hidden-access=*
  > EOF

pulling an hidden changeset should fail:

  $ hg -R client-ssh pull -r be215fbb8c50
  pulling from ssh://user@dummy/repo-with-hidden
  abort: filtered revision 'be215fbb8c50' (not in 'served' subset)
  [255]

pulling an hidden changeset with --remote-hidden should succeed:

  $ hg -R client-ssh pull --remote-hidden -r be215fbb8c50
  pulling from ssh://user@dummy/repo-with-hidden
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files (+1 heads)
  (1 other changesets obsolete on arrival)
  (run 'hg heads' to see heads)
  $ hg -R client-ssh log -G --hidden -v
  x  2:be215fbb8c50 c_Amend_Old [draft]
  |
  | @  1:c33affeb3f6b c_Amend_New [draft]
  |/
  o  0:5f354f46e585 c_Public [public]
  

Pulling a secret changeset is still forbidden:

secret visible:

  $ hg -R client-ssh pull --remote-hidden -r 8d28cbe335f3
  pulling from ssh://user@dummy/repo-with-hidden
  abort: filtered revision '8d28cbe335f3' (not in 'served.hidden' subset)
  [255]

secret hidden:

  $ hg -R client-ssh pull --remote-hidden -r 1c6afd79eb66
  pulling from ssh://user@dummy/repo-with-hidden
  abort: filtered revision '1c6afd79eb66' (not in 'served.hidden' subset)
  [255]

=============
Final cleanup
=============

  $ killdaemons.py