##// END OF EJS Templates
dispatch: protect against malicious 'hg serve --stdio' invocations (sec)...
dispatch: protect against malicious 'hg serve --stdio' invocations (sec) Some shared-ssh installations assume that 'hg serve --stdio' is a safe command to run for minimally trusted users. Unfortunately, the messy implementation of argument parsing here meant that trying to access a repo named '--debugger' would give the user a pdb prompt, thereby sidestepping any hoped-for sandboxing. Serving repositories over HTTP(S) is unaffected. We're not currently hardening any subcommands other than 'serve'. If your service exposes other commands to users with arbitrary repository names, it is imperative that you defend against repository names of '--debugger' and anything starting with '--config'. The read-only mode of hg-ssh stopped working because it provided its hook configuration to "hg serve --stdio" via --config parameter. This is banned for security reasons now. This patch switches it to directly call ui.setconfig(). If your custom hosting infrastructure relies on passing --config to "hg serve --stdio", you'll need to find a different way to get that configuration into Mercurial, either by using ui.setconfig() as hg-ssh does in this patch, or by placing an hgrc file someplace where Mercurial will read it. mitrandir@fb.com provided some extra fixes for the dispatch code and for hg-ssh in places that I overlooked.

File last commit:

r31791:39f6333e default
r32050:77eaf953 4.1.3 stable
Show More
get-with-headers.py
92 lines | 2.4 KiB | text/x-python | PythonLexer
/ tests / get-with-headers.py
Eric Hopper
Add a test for getting raw files via the web UI.
r2532 #!/usr/bin/env python
Martin Geisler
tests: fix doc string in get-with-headers.py
r8447 """This does HTTP GET requests given a host:port and path and returns
Eric Hopper
Add a test for getting raw files via the web UI.
r2532 a subset of the headers plus the body of the result."""
Robert Stanca
py3: use print_function in get-with-headers.py
r28726 from __future__ import absolute_import, print_function
Gregory Szorc
tests: use absolute_import in /get-with-headers.py...
r27296
import json
import os
import sys
Patrick Mezard
get-with-headers: fix stream modes under Windows
r7054
Pulkit Goyal
py3: conditionalize httplib import...
r29455 from mercurial import (
util,
)
httplib = util.httplib
Patrick Mezard
get-with-headers: fix stream modes under Windows
r7054 try:
Gregory Szorc
tests: use absolute_import in /get-with-headers.py...
r27296 import msvcrt
Patrick Mezard
get-with-headers: fix stream modes under Windows
r7054 msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY)
except ImportError:
pass
Dirkjan Ochtman
tests: extend get-with-headers to support cache testing
r12182 twice = False
if '--twice' in sys.argv:
sys.argv.remove('--twice')
twice = True
Pierre-Yves David
get-with-headers: add a --headeronly switch...
r18400 headeronly = False
if '--headeronly' in sys.argv:
sys.argv.remove('--headeronly')
headeronly = True
Gregory Szorc
get-with-headers: support parsing and pretty printing JSON...
r24543 formatjson = False
if '--json' in sys.argv:
sys.argv.remove('--json')
formatjson = True
Dirkjan Ochtman
tests: extend get-with-headers to support cache testing
r12182
Gregory Szorc
protocol: send application/mercurial-0.2 responses to capable clients...
r30764 hgproto = None
if '--hgproto' in sys.argv:
idx = sys.argv.index('--hgproto')
hgproto = sys.argv[idx + 1]
sys.argv.pop(idx)
sys.argv.pop(idx)
Dirkjan Ochtman
tests: extend get-with-headers to support cache testing
r12182 tag = None
def request(host, path, show):
Mads Kiilerich
tests: prepare get-with-headers.py for MSYS...
r17017 assert not path.startswith('/'), path
Dirkjan Ochtman
tests: extend get-with-headers to support cache testing
r12182 global tag
headers = {}
if tag:
headers['If-None-Match'] = tag
Gregory Szorc
protocol: send application/mercurial-0.2 responses to capable clients...
r30764 if hgproto:
headers['X-HgProto-1'] = hgproto
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561
Dirkjan Ochtman
tests: extend get-with-headers to support cache testing
r12182 conn = httplib.HTTPConnection(host)
Mads Kiilerich
tests: prepare get-with-headers.py for MSYS...
r17017 conn.request("GET", '/' + path, None, headers)
Dirkjan Ochtman
tests: extend get-with-headers to support cache testing
r12182 response = conn.getresponse()
Robert Stanca
py3: use print_function in get-with-headers.py
r28726 print(response.status, response.reason)
Mads Kiilerich
serve: don't send any content headers with 304 responses...
r18380 if show[:1] == ['-']:
Mads Kiilerich
tests: make test-hgweb.t output stable...
r18393 show = sorted(h for h, v in response.getheaders()
if h.lower() not in show)
Dirkjan Ochtman
tests: extend get-with-headers to support cache testing
r12182 for h in [h.lower() for h in show]:
if response.getheader(h, None) is not None:
Robert Stanca
py3: use print_function in get-with-headers.py
r28726 print("%s: %s" % (h, response.getheader(h)))
Pierre-Yves David
get-with-headers: add a --headeronly switch...
r18400 if not headeronly:
Robert Stanca
py3: use print_function in get-with-headers.py
r28726 print()
Gregory Szorc
hgweb: send proper HTTP response after uncaught exception...
r23409 data = response.read()
Gregory Szorc
get-with-headers: support parsing and pretty printing JSON...
r24543
# Pretty print JSON. This also has the beneficial side-effect
# of verifying emitted JSON is well-formed.
if formatjson:
# json.dumps() will print trailing newlines. Eliminate them
# to make tests easier to write.
data = json.loads(data)
lines = json.dumps(data, sort_keys=True, indent=2).splitlines()
for line in lines:
Robert Stanca
py3: use print_function in get-with-headers.py
r28726 print(line.rstrip())
Gregory Szorc
get-with-headers: support parsing and pretty printing JSON...
r24543 else:
sys.stdout.write(data)
Dirkjan Ochtman
tests: extend get-with-headers to support cache testing
r12182
Pierre-Yves David
get-with-headers: add a --headeronly switch...
r18400 if twice and response.getheader('ETag', None):
tag = response.getheader('ETag')
Dirkjan Ochtman
tests: extend get-with-headers to support cache testing
r12182
return response.status
status = request(sys.argv[1], sys.argv[2], sys.argv[3:])
if twice:
status = request(sys.argv[1], sys.argv[2], sys.argv[3:])
if 200 <= status <= 305:
Bryan O'Sullivan
hgweb: return meaningful HTTP status codes instead of nonsense
r5561 sys.exit(0)
sys.exit(1)