##// 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:

r31008:636cf3f7 default
r32050:77eaf953 4.1.3 stable
Show More
test-hgweb-no-request-uri.t
179 lines | 4.4 KiB | text/troff | Tads3Lexer
/ tests / test-hgweb-no-request-uri.t
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 This tests if hgweb and hgwebdir still work if the REQUEST_URI variable is
no longer passed with the request. Instead, SCRIPT_NAME and PATH_INFO
should be used from d74fc8dec2b4 onward to route the request.
Martin Geisler
tests: remove redundant mkdir...
r13956 $ hg init repo
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 $ cd repo
$ echo foo > bar
$ hg add bar
$ hg commit -m "test"
$ hg tip
changeset: 0:61c9426e69fe
tag: tip
user: test
date: Thu Jan 01 00:00:00 1970 +0000
summary: test
$ cat > request.py <<EOF
timeless
py3: use absolute_import in test-hgweb-no-request-uri.t
r28858 > from __future__ import absolute_import
> import os
> import sys
> from mercurial.hgweb import (
> hgweb,
> hgwebdir,
> )
timeless
pycompat: switch to util.stringio for py3 compat
r28861 > from mercurial import (
> util,
> )
> stringio = util.stringio
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 >
timeless
pycompat: switch to util.stringio for py3 compat
r28861 > errors = stringio()
> input = stringio()
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 >
> def startrsp(status, headers):
Adrian Buehlmann
check-code: add 'no tab indent' check for unified tests...
r12743 > print '---- STATUS'
> print status
> print '---- HEADERS'
> print [i for i in headers if i[0] != 'ETag']
> print '---- DATA'
> return output.write
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 >
> env = {
Adrian Buehlmann
check-code: add 'no tab indent' check for unified tests...
r12743 > 'wsgi.version': (1, 0),
> 'wsgi.url_scheme': 'http',
> 'wsgi.errors': errors,
> 'wsgi.input': input,
> 'wsgi.multithread': False,
> 'wsgi.multiprocess': False,
> 'wsgi.run_once': False,
> 'REQUEST_METHOD': 'GET',
> 'SCRIPT_NAME': '',
> 'SERVER_NAME': '127.0.0.1',
> 'SERVER_PORT': os.environ['HGPORT'],
> 'SERVER_PROTOCOL': 'HTTP/1.0'
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 > }
>
> def process(app):
Adrian Buehlmann
check-code: add 'no tab indent' check for unified tests...
r12743 > content = app(env, startrsp)
> sys.stdout.write(output.getvalue())
> sys.stdout.write(''.join(content))
Mads Kiilerich
hgweb: make the test suite use hgweb in a more WSGI compliant way...
r18646 > getattr(content, 'close', lambda : None)()
Adrian Buehlmann
check-code: add 'no tab indent' check for unified tests...
r12743 > print '---- ERRORS'
> print errors.getvalue()
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 >
timeless
pycompat: switch to util.stringio for py3 compat
r28861 > output = stringio()
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 > env['PATH_INFO'] = '/'
> env['QUERY_STRING'] = 'style=atom'
> process(hgweb('.', name = 'repo'))
>
timeless
pycompat: switch to util.stringio for py3 compat
r28861 > output = stringio()
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 > env['PATH_INFO'] = '/file/tip/'
> env['QUERY_STRING'] = 'style=raw'
> process(hgweb('.', name = 'repo'))
>
timeless
pycompat: switch to util.stringio for py3 compat
r28861 > output = stringio()
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 > env['PATH_INFO'] = '/'
> env['QUERY_STRING'] = 'style=raw'
> process(hgwebdir({'repo': '.'}))
>
timeless
pycompat: switch to util.stringio for py3 compat
r28861 > output = stringio()
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 > env['PATH_INFO'] = '/repo/file/tip/'
> env['QUERY_STRING'] = 'style=raw'
> process(hgwebdir({'repo': '.'}))
> EOF
$ python request.py
---- STATUS
200 Script output follows
---- HEADERS
[('Content-Type', 'application/atom+xml; charset=ascii')]
---- DATA
<?xml version="1.0" encoding="ascii"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<!-- Changelog -->
Augie Fackler
tests: add (glob) annotations to output lines with 127.0.0.1
r29519 <id>http://127.0.0.1:$HGPORT/</id> (glob)
<link rel="self" href="http://127.0.0.1:$HGPORT/atom-log"/> (glob)
<link rel="alternate" href="http://127.0.0.1:$HGPORT/"/> (glob)
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 <title>repo Changelog</title>
<updated>1970-01-01T00:00:00+00:00</updated>
<entry>
Aaron Jensen
hgweb: adding branch, tags, bookmarks, user, and file list to atom feed entries
r21056 <title>[default] test</title>
Augie Fackler
tests: add (glob) annotations to output lines with 127.0.0.1
r29519 <id>http://127.0.0.1:$HGPORT/#changeset-61c9426e69fef294feed5e2bbfc97d39944a5b1c</id> (glob)
<link href="http://127.0.0.1:$HGPORT/rev/61c9426e69fe"/> (glob)
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 <author>
<name>test</name>
<email>&#116;&#101;&#115;&#116;</email>
</author>
<updated>1970-01-01T00:00:00+00:00</updated>
<published>1970-01-01T00:00:00+00:00</published>
<content type="xhtml">
av6
hgweb: reindent atom/changelogentry.tmpl...
r29439 <table xmlns="http://www.w3.org/1999/xhtml">
<tr>
<th style="text-align:left;">changeset</th>
<td>61c9426e69fe</td>
</tr>
<tr>
<th style="text-align:left;">branch</th>
<td>default</td>
</tr>
<tr>
<th style="text-align:left;">bookmark</th>
<td></td>
</tr>
<tr>
<th style="text-align:left;">tag</th>
<td>tip</td>
</tr>
<tr>
<th style="text-align:left;">user</th>
<td>&#116;&#101;&#115;&#116;</td>
</tr>
<tr>
<th style="text-align:left;vertical-align:top;">description</th>
<td>test</td>
</tr>
<tr>
<th style="text-align:left;vertical-align:top;">files</th>
<td>bar<br /></td>
</tr>
</table>
Matt Mackall
tests: unify test-hgweb-no-request-uri
r12439 </content>
</entry>
</feed>
---- ERRORS
---- STATUS
200 Script output follows
---- HEADERS
[('Content-Type', 'text/plain; charset=ascii')]
---- DATA
-rw-r--r-- 4 bar
---- ERRORS
---- STATUS
200 Script output follows
---- HEADERS
[('Content-Type', 'text/plain; charset=ascii')]
---- DATA
/repo/
---- ERRORS
---- STATUS
200 Script output follows
---- HEADERS
[('Content-Type', 'text/plain; charset=ascii')]
---- DATA
-rw-r--r-- 4 bar
---- ERRORS
Mads Kiilerich
tests: add missing trailing 'cd ..'...
r16913
$ cd ..