##// END OF EJS Templates
dirstate-v2: add devel config option to control write behavior...
dirstate-v2: add devel config option to control write behavior This will help us to write predictable tests checking behavior in each case.

File last commit:

r49730:6000f5b2 default
r51117:ecd28d89 stable
Show More
hg-ssh
117 lines | 3.5 KiB | text/plain | TextLexer
Gregory Szorc
global: use python3 in shebangs...
r46434 #!/usr/bin/env python3
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537 #
Thomas Arendsen Hein
Adjust contrib/hg-ssh for moved dispatch() function.
r5191 # Copyright 2005-2007 by Intevation GmbH <intevation@intevation.de>
Martin Geisler
add blank line after copyright notices and after header
r8228 #
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537 # Author(s):
# Thomas Arendsen Hein <thomas@intevation.de>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
"""
hg-ssh - a wrapper for ssh access to a limited set of mercurial repos
To be used in ~/.ssh/authorized_keys with the "command" option, see sshd(8):
command="hg-ssh path/to/repo1 /path/to/repo2 ~/repo3 ~user/repo4" ssh-dss ...
(probably together with these other useful options:
no-port-forwarding,no-X11-forwarding,no-agent-forwarding)
Andreas Freimuth
hg-ssh: fix duplicate word in docstring
r13996 This allows pull/push over ssh from/to the repositories given as arguments.
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
If all your repositories are subdirectories of a common directory, you can
allow shorter paths with:
command="cd path/to/my/repositories && hg-ssh repo1 subdir/repo2"
Thomas Arendsen Hein
Added hint to hg-ssh that you can use shell pattern matching.
r1640
You can use pattern matching of your normal shell, e.g.:
command="cd repos && hg-ssh user/thomas/* projects/{mercurial,foo}"
David Schleimer
hg-ssh: read-only flag...
r16836
You can also add a --read-only flag to allow read-only access to a key, e.g.:
command="hg-ssh --read-only repos/*"
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537 """
Augie Fackler
contrib: update hg-ssh to conform with import style checks
r33892
import os
hg-ssh: normalize the drive of the current working directory on windows...
r48420 import re
Augie Fackler
contrib: update hg-ssh to conform with import style checks
r33892 import shlex
import sys
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
Thomas Arendsen Hein
Enable demandimport only in scripts, not in importable modules (issue605)...
r5197 # enable importing on demand to reduce startup time
Gregory Szorc
black: blacken scripts...
r44058 import hgdemandimport
hgdemandimport.enable()
Thomas Arendsen Hein
Enable demandimport only in scripts, not in importable modules (issue605)...
r5197
Augie Fackler
contrib: update hg-ssh to conform with import style checks
r33892 from mercurial import (
dispatch,
Pulkit Goyal
py3: use pycompat.fsencode to convert path to bytes...
r38121 pycompat,
Augie Fackler
contrib: update hg-ssh to conform with import style checks
r33892 ui as uimod,
)
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
Gregory Szorc
black: blacken scripts...
r44058
David Schleimer
hg-ssh: refactor to have main() method...
r16779 def main():
Yuya Nishihara
sshserver: do setbinary() by caller (API)...
r37963 # Prevent insertion/deletion of CRs
dispatch.initstdio()
David Schleimer
hg-ssh: refactor to have main() method...
r16779 cwd = os.getcwd()
hg-ssh: normalize the drive of the current working directory on windows...
r48420 if os.name == 'nt':
# os.getcwd() is inconsistent on the capitalization of the drive
# letter, so adjust it. see https://bugs.python.org/issue40368
if re.match('^[a-z]:', cwd):
cwd = cwd[0:1].upper() + cwd[1:]
David Schleimer
hg-ssh: read-only flag...
r16836 readonly = False
args = sys.argv[1:]
while len(args):
if args[0] == '--read-only':
readonly = True
args.pop(0)
else:
break
Gregory Szorc
black: blacken scripts...
r44058 allowed_paths = [
os.path.normpath(os.path.join(cwd, os.path.expanduser(path)))
for path in args
]
David Schleimer
hg-ssh: refactor to have main() method...
r16779 orig_cmd = os.getenv('SSH_ORIGINAL_COMMAND', '?')
try:
cmdargv = shlex.split(orig_cmd)
FUJIWARA Katsunori
misc: use modern exception syntax...
r28047 except ValueError as e:
David Schleimer
hg-ssh: refactor to have main() method...
r16779 sys.stderr.write('Illegal command "%s": %s\n' % (orig_cmd, e))
sys.exit(255)
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
David Schleimer
hg-ssh: refactor to have main() method...
r16779 if cmdargv[:2] == ['hg', '-R'] and cmdargv[3:] == ['serve', '--stdio']:
path = cmdargv[2]
repo = os.path.normpath(os.path.join(cwd, os.path.expanduser(path)))
if repo in allowed_paths:
Pulkit Goyal
py3: use pycompat.fsencode to convert path to bytes...
r38121 cmd = [b'-R', pycompat.fsencode(repo), b'serve', b'--stdio']
Augie Fackler
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)...
r32050 req = dispatch.request(cmd)
David Schleimer
hg-ssh: read-only flag...
r16836 if readonly:
Augie Fackler
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)...
r32050 if not req.ui:
req.ui = uimod.ui.load()
Gregory Szorc
black: blacken scripts...
r44058 req.ui.setconfig(
b'hooks',
b'pretxnopen.hg-ssh',
b'python:__main__.rejectpush',
b'hg-ssh',
)
req.ui.setconfig(
b'hooks',
b'prepushkey.hg-ssh',
b'python:__main__.rejectpush',
b'hg-ssh',
)
Augie Fackler
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)...
r32050 dispatch.dispatch(req)
David Schleimer
hg-ssh: refactor to have main() method...
r16779 else:
sys.stderr.write('Illegal repository "%s"\n' % repo)
sys.exit(255)
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537 else:
David Schleimer
hg-ssh: refactor to have main() method...
r16779 sys.stderr.write('Illegal command "%s"\n' % orig_cmd)
Mads Kiilerich
hg-ssh: exit with 255 instead of -1 on error...
r16607 sys.exit(255)
Thomas Arendsen Hein
Added hg-ssh - a wrapper for ssh access to a limited set of mercurial repos...
r1537
Gregory Szorc
black: blacken scripts...
r44058
David Schleimer
hg-ssh: read-only flag...
r16836 def rejectpush(ui, **kwargs):
Pulkit Goyal
py3: add b'' prefixes in contrib/hg-ssh...
r38119 ui.warn((b"Permission denied\n"))
David Schleimer
hg-ssh: read-only flag...
r16836 # mercurial hooks use unix process conventions for hook return values
# so a truthy return means failure
return True
Gregory Szorc
black: blacken scripts...
r44058
David Schleimer
hg-ssh: refactor to have main() method...
r16779 if __name__ == '__main__':
main()