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

r29153:90d84e1e default
r32050:77eaf953 4.1.3 stable
Show More
posplit
81 lines | 2.8 KiB | text/plain | TextLexer
Wagner Bruna
i18n: script for splitting large messages on .po/.pot files...
r11389 #!/usr/bin/env python
#
# posplit - split messages in paragraphs on .po/.pot files
#
# license: MIT/X11/Expat
#
Pulkit Goyal
py3: make i18n/posplit use print_function
r29153 from __future__ import absolute_import, print_function
Pulkit Goyal
py3: make i18n/posplit use absolute_import
r29152
import polib
Simon Heimberg
i18n: posplit writes a warning for translators before rst directives...
r20359 import re
Wagner Bruna
i18n: script for splitting large messages on .po/.pot files...
r11389 import sys
def addentry(po, entry, cache):
e = cache.get(entry.msgid)
if e:
e.occurrences.extend(entry.occurrences)
else:
po.append(entry)
cache[entry.msgid] = entry
def mkentry(orig, delta, msgid, msgstr):
entry = polib.POEntry()
entry.merge(orig)
entry.msgid = msgid or orig.msgid
entry.msgstr = msgstr or orig.msgstr
entry.occurrences = [(p, int(l) + delta) for (p, l) in orig.occurrences]
return entry
if __name__ == "__main__":
po = polib.pofile(sys.argv[1])
cache = {}
entries = po[:]
po[:] = []
Simon Heimberg
i18n: posplit writes a warning for translators before rst directives...
r20359 findd = re.compile(r' *\.\. (\w+)::') # for finding directives
Wagner Bruna
i18n: script for splitting large messages on .po/.pot files...
r11389 for entry in entries:
msgids = entry.msgid.split(u'\n\n')
if entry.msgstr:
msgstrs = entry.msgstr.split(u'\n\n')
else:
msgstrs = [u''] * len(msgids)
if len(msgids) != len(msgstrs):
# places the whole existing translation as a fuzzy
# translation for each paragraph, to give the
# translator a chance to recover part of the old
# translation - erasing extra paragraphs is
# probably better than retranslating all from start
if 'fuzzy' not in entry.flags:
entry.flags.append('fuzzy')
msgstrs = [entry.msgstr] * len(msgids)
delta = 0
for msgid, msgstr in zip(msgids, msgstrs):
Simon Heimberg
i18n: posplit removes the entry "::" from the pot file...
r20361 if msgid and msgid != '::':
Wagner Bruna
i18n: script for splitting large messages on .po/.pot files...
r11389 newentry = mkentry(entry, delta, msgid, msgstr)
Simon Heimberg
i18n: posplit writes a warning for translators before rst directives...
r20359 mdirective = findd.match(msgid)
if mdirective:
Simon Heimberg
i18n: leave out entries which contain only a rst directive...
r20362 if not msgid[mdirective.end():].rstrip():
# only directive, nothing to translate here
FUJIWARA Katsunori
i18n: calculate correct line number in source of messages to be translated...
r28074 delta += 2
Simon Heimberg
i18n: leave out entries which contain only a rst directive...
r20362 continue
Simon Heimberg
i18n: posplit writes a warning for translators before rst directives...
r20359 directive = mdirective.group(1)
Simon Heimberg
i18n: leave out entries which contain only rst syntax...
r20363 if directive in ('container', 'include'):
if msgid.rstrip('\n').count('\n') == 0:
# only rst syntax, nothing to translate
FUJIWARA Katsunori
i18n: calculate correct line number in source of messages to be translated...
r28074 delta += 2
Simon Heimberg
i18n: leave out entries which contain only rst syntax...
r20363 continue
else:
# lines following directly, unexpected
Pulkit Goyal
py3: make i18n/posplit use print_function
r29153 print('Warning: text follows line with directive' \
' %s' % directive)
Simon Heimberg
i18n: posplit writes a warning for translators before rst directives...
r20359 comment = 'do not translate: .. %s::' % directive
if not newentry.comment:
newentry.comment = comment
elif comment not in newentry.comment:
newentry.comment += '\n' + comment
Wagner Bruna
i18n: script for splitting large messages on .po/.pot files...
r11389 addentry(po, newentry, cache)
delta += 2 + msgid.count('\n')
po.save()