Mercurial > kallithea
changeset 7785:b5b91e854308
ssh: set a valid locale in the ssh-serve process
In the SSH client configuration, the setting 'SendEnv' could contain variables
like 'LANG', 'LC_ALL', and others. This causes these environment variables
(with their values at the client-side) to be set in the server. However, not
every locale setting valid in the client, is also valid on the server.
This could lead to the error:
'locale.Error: unsupported locale setting'
when 'from mercurial import archival, merge as hg_merge, patch, ui' is
called.
Fix this problem by providing an ini setting 'ssh_locale' that the user can
set correctly, and which will be used to set LC_ALL and LANGUAGE in the
'kallithea-cli ssh-serve' process.
If an environment variable LC_ALL is set, it takes precedence over all other
'LC_xxx' variables, as well as over LANG. So, setting LC_ALL ensures that no
user setting of 'LC_xxx' or 'LANG' could influence ssh-serve badly.
There is one environment variable that might overrule LC_ALL, specifically
for showing messages: 'LANGUAGE'. GNU gettext lets it take precedence over
LC_ALL [1]:
"GNU gettext gives preference to LANGUAGE over LC_ALL and LANG for the
purpose of message handling"
So, also set LANGUAGE to the same value as we set LC_ALL to.
The principle of setting a specific locale in the server process to fix this
error, was first proposed by Dominik Ruf.
[1] https://www.gnu.org/software/gettext/manual/html_node/The-LANGUAGE-variable.html#The-LANGUAGE-variable
author | Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> |
---|---|
date | Fri, 19 Jul 2019 01:12:35 +0200 |
parents | 719ed95c437e |
children | 0f33c1da2fd5 |
files | development.ini kallithea/bin/kallithea_cli_ssh.py kallithea/lib/paster_commands/template.ini.mako |
diffstat | 3 files changed, 17 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/development.ini Mon Nov 17 14:42:45 2014 -0500 +++ b/development.ini Fri Jul 19 01:12:35 2019 +0200 @@ -238,6 +238,12 @@ ## Path to be used in ssh_authorized_keys file to invoke kallithea-cli with ssh-serve. #kallithea_cli_path = /srv/kallithea/venv/bin/kallithea-cli +## Locale to be used in the ssh-serve command. +## This is needed because an SSH client may try to use its own locale +## settings, which may not be available on the server. +## See `locale -a` for valid values on this system. +#ssh_locale = C.UTF-8 + #################################### ### CELERY CONFIG #### ####################################
--- a/kallithea/bin/kallithea_cli_ssh.py Mon Nov 17 14:42:45 2014 -0500 +++ b/kallithea/bin/kallithea_cli_ssh.py Fri Jul 19 01:12:35 2019 +0200 @@ -45,6 +45,11 @@ sys.stderr.write("SSH access is disabled.\n") return sys.exit(1) + ssh_locale = kallithea.CONFIG.get('ssh_locale') + if ssh_locale: + os.environ['LC_ALL'] = ssh_locale # trumps everything, including LANG, except LANGUAGE + os.environ['LANGUAGE'] = ssh_locale # trumps LC_ALL for GNU gettext message handling + ssh_original_command = os.environ.get('SSH_ORIGINAL_COMMAND', '') connection = re.search('^([\d\.]+)', os.environ.get('SSH_CONNECTION', '')) client_ip = connection.group(1) if connection else '0.0.0.0'
--- a/kallithea/lib/paster_commands/template.ini.mako Mon Nov 17 14:42:45 2014 -0500 +++ b/kallithea/lib/paster_commands/template.ini.mako Fri Jul 19 01:12:35 2019 +0200 @@ -341,6 +341,12 @@ kallithea_cli_path = ${kallithea_cli_path} %endif +<%text>## Locale to be used in the ssh-serve command.</%text> +<%text>## This is needed because an SSH client may try to use its own locale</%text> +<%text>## settings, which may not be available on the server.</%text> +<%text>## See `locale -a` for valid values on this system.</%text> +#ssh_locale = C.UTF-8 + <%text>####################################</%text> <%text>### CELERY CONFIG ####</%text> <%text>####################################</%text>