changeset 8899:af20f57282ff i18n

Merge stable
author Mads Kiilerich <mads@kiilerich.com>
date Sun, 30 May 2021 01:34:48 +0200
parents 078e2bb7d402 (current diff) 7ac728ed359a (diff)
children 864cc8e10bf3
files docs/setup.rst kallithea/i18n/be/LC_MESSAGES/kallithea.po kallithea/i18n/bg/LC_MESSAGES/kallithea.po kallithea/i18n/cs/LC_MESSAGES/kallithea.po kallithea/i18n/da/LC_MESSAGES/kallithea.po kallithea/i18n/de/LC_MESSAGES/kallithea.po kallithea/i18n/el/LC_MESSAGES/kallithea.po kallithea/i18n/es/LC_MESSAGES/kallithea.po kallithea/i18n/fr/LC_MESSAGES/kallithea.po kallithea/i18n/hu/LC_MESSAGES/kallithea.po kallithea/i18n/ja/LC_MESSAGES/kallithea.po kallithea/i18n/kallithea.pot kallithea/i18n/lb/LC_MESSAGES/kallithea.po kallithea/i18n/nb_NO/LC_MESSAGES/kallithea.po kallithea/i18n/nl_BE/LC_MESSAGES/kallithea.po kallithea/i18n/pl/LC_MESSAGES/kallithea.po kallithea/i18n/pt/LC_MESSAGES/kallithea.po kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po kallithea/i18n/ru/LC_MESSAGES/kallithea.po kallithea/i18n/sk/LC_MESSAGES/kallithea.po kallithea/i18n/tr/LC_MESSAGES/kallithea.po kallithea/i18n/uk/LC_MESSAGES/kallithea.po kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.po kallithea/i18n/zh_TW/LC_MESSAGES/kallithea.po
diffstat 38 files changed, 285 insertions(+), 220 deletions(-) [+]
line wrap: on
line diff
--- a/.hgtags	Fri May 14 16:44:27 2021 +0200
+++ b/.hgtags	Sun May 30 01:34:48 2021 +0200
@@ -80,3 +80,4 @@
 a22edac2be58eaf68d1940d4dfeb88fadbabb43a 0.6.1
 22bfca5da6f56738f6220d24bb6ce2f9bc4f9b1e 0.6.2
 213450cbdc11fff8508ba25101dc05ab74048e55 0.6.3
+7324ff1929d558075500ca483889b28e904ef934 0.7.0
--- a/CONTRIBUTORS	Fri May 14 16:44:27 2021 +0200
+++ b/CONTRIBUTORS	Sun May 30 01:34:48 2021 +0200
@@ -1,19 +1,26 @@
 List of contributors to Kallithea project:
 
-    Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> 2014-2020
-    Mads Kiilerich <mads@kiilerich.com> 2016-2020
+    Thomas De Schampheleire <thomas.de_schampheleire@nokia.com> 2014-2021
+    Mads Kiilerich <mads@kiilerich.com> 2016-2021
+    ssantos <ssantos@web.de> 2018-2021
+    Private <adamantine.sword@gmail.com> 2019-2021
+    Étienne Gilli <etienne@gilli.io> 2020-2021
+    fresh <fresh190@protonmail.com> 2020-2021
+    robertus <robertuss12@gmail.com> 2020-2021
+    Eugenia Russell <eugenia.russell2019@gmail.com> 2021
+    Michalis <michalisntovas@yahoo.gr> 2021
+    vs <vsuhachev@yandex.ru> 2021
+    Александр <akonn7@mail.ru> 2021
     Asterios Dimitriou <steve@pci.gr> 2016-2017 2020
     Allan Nordhøy <epost@anotheragency.no> 2017-2020
     Anton Schur <tonich.sh@gmail.com> 2017 2020
-    ssantos <ssantos@web.de> 2018-2020
     Manuel Jacob <me@manueljacob.de> 2019-2020
-    Private <adamantine.sword@gmail.com> 2019-2020
+    Artem <kovalevartem.ru@gmail.com> 2020
     David Ignjić <ignjic@gmail.com> 2020
     Dennis Fink <dennis.fink@c3l.lu> 2020
-    Étienne Gilli <etienne@gilli.io> 2020
     J. Lavoie <j.lavoie@net-c.ca> 2020
-    robertus <robertuss12@gmail.com> 2020
     Ross Thomas <ross@lns-nevasoft.com> 2020
+    Tim Ooms <tatankat@users.noreply.github.com> 2020
     Andrej Shadura <andrew@shadura.me> 2012 2014-2017 2019
     Étienne Gilli <etienne.gilli@gmail.com> 2015-2017 2019
     Adi Kriegisch <adi@cg.tuwien.ac.at> 2019
--- a/MANIFEST.in	Fri May 14 16:44:27 2021 +0200
+++ b/MANIFEST.in	Sun May 30 01:34:48 2021 +0200
@@ -12,6 +12,7 @@
 include           dev_requirements.txt
 include           development.ini
 include           pytest.ini
+include           pytype_requirements.txt
 include           requirements.txt
 include           tox.ini
 recursive-include docs *
--- a/development.ini	Fri May 14 16:44:27 2021 +0200
+++ b/development.ini	Sun May 30 01:34:48 2021 +0200
@@ -81,6 +81,7 @@
 #[filter:proxy-prefix]
 #use = egg:PasteDeploy#prefix
 #prefix = /<your-prefix>
+#translate_forwarded_server = False
 
 [app:main]
 use = egg:kallithea
@@ -111,11 +112,17 @@
 ## cut off limit for large diffs (size in bytes)
 cut_off_limit = 256000
 
-## force https in Kallithea, fixes https redirects, assumes it's always https
-force_https = false
+## WSGI environment variable to get the IP address of the client (default REMOTE_ADDR)
+#remote_addr_variable = HTTP_X_FORWARDED_FOR
+
+## WSGI environment variable to get the protocol (http or https) of the client connection (default wsgi.url_scheme)
+#url_scheme_variable = HTTP_X_FORWARDED_PROTO
 
-## use Strict-Transport-Security headers
-use_htsts = false
+## always pretend the client connected using HTTPS (default false)
+#force_https = true
+
+## use Strict-Transport-Security headers (default false)
+#use_htsts = true
 
 ## number of commits stats will parse on each iteration
 commit_parse_limit = 25
--- a/docs/conf.py	Fri May 14 16:44:27 2021 +0200
+++ b/docs/conf.py	Sun May 30 01:34:48 2021 +0200
@@ -47,7 +47,7 @@
 
 # General information about the project.
 project = 'Kallithea'
-copyright = '2010-2020 by various authors, licensed as GPLv3.'
+copyright = '2010-2021 by various authors, licensed as GPLv3.'
 
 # The version info for the project you're documenting, acts as replacement for
 # |version| and |release|, also used in various other places throughout the
--- a/docs/setup.rst	Fri May 14 16:44:27 2021 +0200
+++ b/docs/setup.rst	Sun May 30 01:34:48 2021 +0200
@@ -406,6 +406,38 @@
    user that Kallithea runs.
 
 
+Proxy setups
+------------
+
+When Kallithea is processing HTTP requests from a user, it will see and use
+some of the basic properties of the connection, both at the TCP/IP level and at
+the HTTP level. The WSGI server will provide this information to Kallithea in
+the "environment".
+
+In some setups, a proxy server will take requests from users and forward
+them to the actual Kallithea server. The proxy server will thus be the
+immediate client of the Kallithea WSGI server, and Kallithea will basically see
+it as such. To make sure Kallithea sees the request as it arrived from the
+client to the proxy server, the proxy server must be configured to
+somehow pass the original information on to Kallithea, and Kallithea must be
+configured to pick that information up and trust it.
+
+Kallithea will by default rely on its WSGI server to provide the IP of the
+client in the WSGI environment as ``REMOTE_ADDR``, but it can be configured to
+get it from an HTTP header that has been set by the proxy server. For
+example, if the proxy server puts the client IP in the ``X-Forwarded-For``
+HTTP header, set::
+
+    remote_addr_variable = HTTP_X_FORWARDED_FOR
+
+Kallithea will by default rely on finding the protocol (``http`` or ``https``)
+in the WSGI environment as ``wsgi.url_scheme``. If the proxy server puts
+the protocol of the client request in the ``X-Forwarded-Proto`` HTTP header,
+Kallithea can be configured to trust that header by setting::
+
+    url_scheme_variable = HTTP_X_FORWARDED_PROTO
+
+
 HTTPS support
 -------------
 
@@ -414,10 +446,9 @@
 Alternatively, you can use some special configuration settings to control
 directly which scheme/protocol Kallithea will use when generating URLs:
 
-- With ``https_fixup = true``, the scheme will be taken from the
-  ``X-Url-Scheme``, ``X-Forwarded-Scheme`` or ``X-Forwarded-Proto`` HTTP header
-  (default ``http``).
-- With ``force_https = true`` the default will be ``https``.
+- With ``url_scheme_variable`` set, the scheme will be taken from that HTTP
+  header.
+- With ``force_https = true``, the scheme will be seen as ``https``.
 - With ``use_htsts = true``, Kallithea will set ``Strict-Transport-Security`` when using https.
 
 .. _nginx_virtual_host:
--- a/kallithea/__init__.py	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/__init__.py	Sun May 30 01:34:48 2021 +0200
@@ -36,7 +36,7 @@
 if sys.version_info < (3, 6):
     raise Exception('Kallithea requires python 3.6 or later')
 
-VERSION = (0, 6, 99)
+VERSION = (0, 7, 0)
 BACKENDS = {
     'hg': 'Mercurial repository',
     'git': 'Git repository',
--- a/kallithea/config/application.py	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/config/application.py	Sun May 30 01:34:48 2021 +0200
@@ -35,7 +35,7 @@
     app = SimpleGit(app, config)
 
     # Enable https redirects based on HTTP_X_URL_SCHEME set by proxy
-    if any(asbool(config.get(x)) for x in ['https_fixup', 'force_https', 'use_htsts']):
+    if any(asbool(config.get(x)) for x in ['url_scheme_variable', 'force_https', 'use_htsts']):
         app = HttpsFixup(app, config)
 
     app = PermanentRepoUrl(app, config)
--- a/kallithea/config/middleware/https_fixup.py	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/config/middleware/https_fixup.py	Sun May 30 01:34:48 2021 +0200
@@ -26,6 +26,7 @@
 """
 
 
+import kallithea
 from kallithea.lib.utils2 import asbool
 
 
@@ -54,20 +55,17 @@
         middleware you should set this header inside your
         proxy ie. nginx, apache etc.
         """
-        # DETECT PROTOCOL !
-        if 'HTTP_X_URL_SCHEME' in environ:
-            proto = environ.get('HTTP_X_URL_SCHEME')
-        elif 'HTTP_X_FORWARDED_SCHEME' in environ:
-            proto = environ.get('HTTP_X_FORWARDED_SCHEME')
-        elif 'HTTP_X_FORWARDED_PROTO' in environ:
-            proto = environ.get('HTTP_X_FORWARDED_PROTO')
-        else:
-            proto = 'http'
-        org_proto = proto
+        proto = None
 
         # if we have force, just override
         if asbool(self.config.get('force_https')):
             proto = 'https'
+        else:
+            # get protocol from configured WSGI environment variable
+            url_scheme_variable = kallithea.CONFIG.get('url_scheme_variable')
+            if url_scheme_variable:
+                proto = environ.get(url_scheme_variable)
 
-        environ['wsgi.url_scheme'] = proto
-        environ['wsgi._org_proto'] = org_proto
+        if proto:
+            environ['wsgi._org_proto'] = environ.get('wsgi.url_scheme')
+            environ['wsgi.url_scheme'] = proto
--- a/kallithea/controllers/base.py	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/controllers/base.py	Sun May 30 01:34:48 2021 +0200
@@ -64,35 +64,29 @@
 
 def _filter_proxy(ip):
     """
-    HEADERS can have multiple ips inside the left-most being the original
-    client, and each successive proxy that passed the request adding the IP
-    address where it received the request from.
+    HTTP_X_FORWARDED_FOR headers can have multiple IP addresses, with the
+    leftmost being the original client. Each proxy that is forwarding the
+    request will usually add the IP address it sees the request coming from.
 
-    :param ip:
+    The client might have provided a fake leftmost value before hitting the
+    first proxy, so if we have a proxy that is adding one IP address, we can
+    only trust the rightmost address.
     """
     if ',' in ip:
         _ips = ip.split(',')
-        _first_ip = _ips[0].strip()
+        _first_ip = _ips[-1].strip()
         log.debug('Got multiple IPs %s, using %s', ','.join(_ips), _first_ip)
         return _first_ip
     return ip
 
 
 def get_ip_addr(environ):
-    proxy_key = 'HTTP_X_REAL_IP'
-    proxy_key2 = 'HTTP_X_FORWARDED_FOR'
-    def_key = 'REMOTE_ADDR'
-
-    ip = environ.get(proxy_key)
-    if ip:
-        return _filter_proxy(ip)
-
-    ip = environ.get(proxy_key2)
-    if ip:
-        return _filter_proxy(ip)
-
-    ip = environ.get(def_key, '0.0.0.0')
-    return _filter_proxy(ip)
+    """The web server will set REMOTE_ADDR to the unfakeable IP layer client IP address.
+    If using a proxy server, make it possible to use another value, such as
+    the X-Forwarded-For header, by setting `remote_addr_variable = HTTP_X_FORWARDED_FOR`.
+    """
+    remote_addr_variable = kallithea.CONFIG.get('remote_addr_variable', 'REMOTE_ADDR')
+    return _filter_proxy(environ.get(remote_addr_variable, '0.0.0.0'))
 
 
 def get_path_info(environ):
--- a/kallithea/i18n/be/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/be/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2017-08-20 10:44+0000\n"
 "Last-Translator: Viktar Vauchkevich <victorenator@gmail.com>\n"
 "Language-Team: Belarusian <https://hosted.weblate.org/projects/kallithea/"
@@ -18,26 +18,26 @@
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Generator: Weblate 2.17-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr "Рэпазітар не знойдзены на файлавай сістэме"
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Яшчэ не было змен"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr "Набор змен для %s %s не знойдзены ў %s"
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 #, fuzzy
 #| msgid "Your account is disabled"
 msgid "SSH access is disabled."
--- a/kallithea/i18n/bg/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/bg/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.4.99\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -17,26 +17,26 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 2.6.0\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr ""
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/cs/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/cs/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2015-11-12 08:51+0000\n"
 "Last-Translator: Michal Čihař <michal@cihar.com>\n"
 "Language-Team: Czech <https://hosted.weblate.org/projects/kallithea/"
@@ -17,26 +17,26 @@
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
 "X-Generator: Weblate 2.5-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr ""
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/da/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/da/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3.99\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2019-03-14 01:03+0000\n"
 "Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
 "Language-Team: Danish <https://hosted.weblate.org/projects/kallithea/"
@@ -16,26 +16,26 @@
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.5.1\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr "CSRF-token lækage opdaget, alle form-tokens er invalideret"
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr "Repository ikke fundet i filsystemet"
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Der er ingen changesets endnu"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr "Changeset for %s %s ikke fundet i %s"
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/de/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/de/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2020-12-21 05:29+0000\n"
 "Last-Translator: J. Lavoie <j.lavoie@net-c.ca>\n"
 "Language-Team: German <https://hosted.weblate.org/projects/kallithea/"
@@ -16,28 +16,28 @@
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.4-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 "Es wurde ein CSRF Leck entdeckt. Alle Formular Token sind abgelaufen"
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr "Das Repository konnte nicht im Filesystem gefunden werden"
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Es gibt noch keine Änderungssätze"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, fuzzy, python-format
 #| msgid "Changeset not found"
 msgid "Changeset for %s %s not found in %s"
 msgstr "Änderungssatz nicht gefunden"
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 #, fuzzy
 #| msgid "Your account is disabled"
 msgid "SSH access is disabled."
--- a/kallithea/i18n/el/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/el/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2021-05-10 09:32+0000\n"
 "Last-Translator: Eugenia Russell <eugenia.russell2019@gmail.com>\n"
 "Language-Team: Greek <https://hosted.weblate.org/projects/kallithea/"
@@ -16,28 +16,28 @@
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.7-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 "Εντοπίστηκε διαρροή ενός διακριτικού CSRF - όλα τα διακριτικά της φόρμας "
 "έχουν λήξει"
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr "Το αποθετήριο δε βρέθηκε στο σύστημα αρχείων"
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Δεν υπάρχουν σετ αλλαγών ακόμα"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr "Το σετ αλλαγών για %s %sδεν βρέθηκε στο %s"
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr "Η πρόσβαση μέσω SSH είναι απενεργοποιημένη."
 
--- a/kallithea/i18n/es/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/es/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2018-04-18 11:43+0000\n"
 "Last-Translator: Jesús Sánchez <jsanchezfdz95@gmail.com>\n"
 "Language-Team: Spanish <https://hosted.weblate.org/projects/kallithea/"
@@ -16,26 +16,26 @@
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.0-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Aún no hay cambios"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/fr/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/fr/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2021-05-15 17:32+0000\n"
 "Last-Translator: Étienne Gilli <etienne@gilli.io>\n"
 "Language-Team: French <https://hosted.weblate.org/projects/kallithea/"
@@ -16,28 +16,28 @@
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 4.7-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 "Une fuite de jeton CSRF a été détectée - tous les jetons de formulaire "
 "sont considérés comme expirés"
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr "Dépôt non trouvé sur le système de fichiers"
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Il n’y a aucun changement pour le moment"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr "Ensemble de changements pour %s %s non trouvé dans %s"
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr "L'accès SSH est désactivé."
 
@@ -953,8 +953,8 @@
 "Hook names with \".kallithea_\" are reserved for internal use. Please use "
 "another hook name."
 msgstr ""
-"Les noms de hook avec \".kallithea_\" sont réservés pour un usage interne. "
-"Merci de choisir un autre nom pour le hook."
+"Les noms de hook avec \".kallithea_\" sont réservés pour un usage "
+"interne. Merci de choisir un autre nom pour le hook."
 
 #: kallithea/controllers/admin/settings.py:339
 msgid "Added new hook"
@@ -1304,8 +1304,8 @@
 "Invalid SSH key - base64 part %r seems truncated (it is too short for "
 "declared string length %s)"
 msgstr ""
-"Clé SSH invalide – la partie base64 %r semble tronquée (elle est trop court "
-"pour la taille déclarée %s)"
+"Clé SSH invalide – la partie base64 %r semble tronquée (elle est trop "
+"court pour la taille déclarée %s)"
 
 #: kallithea/lib/ssh.py:132
 #, python-format
@@ -1313,13 +1313,14 @@
 "Invalid SSH key - base64 part %r seems truncated (it contains too few "
 "strings for a %s key)"
 msgstr ""
-"Clé SSH invalide – la partie base64 %r semble tronquée (elle ne contient pas "
-"assez de parties pour une clé %s)"
+"Clé SSH invalide – la partie base64 %r semble tronquée (elle ne contient "
+"pas assez de parties pour une clé %s)"
 
 #: kallithea/lib/ssh.py:134
 #, python-format
 msgid "Invalid SSH key - it is a %s key but the base64 part contains %r"
-msgstr "Clé SSH invalide – c'est une clé %s mais la partie base64 contient %r"
+msgstr ""
+"Clé SSH invalide – c'est une clé %s mais la partie base64 contient %r"
 
 #: kallithea/lib/webutils.py:623
 #, python-format
@@ -1543,8 +1544,8 @@
 "[Comment] %(repo_name)s changeset %(short_id)s \"%(message_short)s\" on "
 "%(branch)s by %(cs_author_username)s"
 msgstr ""
-"[Commentaire] Changeset %(short_id)s « %(message_short)s » de %(repo_name)s "
-"dans %(branch)s par %(cs_author_username)s"
+"[Commentaire] Changeset %(short_id)s « %(message_short)s » de "
+"%(repo_name)s dans %(branch)s par %(cs_author_username)s"
 
 #: kallithea/model/notification.py:174
 #, python-format
@@ -1800,7 +1801,8 @@
 #: kallithea/model/validators.py:401
 msgid "Invalid repository URL. It must be a valid http, https, or ssh URL"
 msgstr ""
-"URL de dépôt invalide. Ce doit être une URL valide de type http, https ou ssh"
+"URL de dépôt invalide. Ce doit être une URL valide de type http, https ou "
+"ssh"
 
 #: kallithea/model/validators.py:426
 msgid "Fork has to be the same type as parent"
@@ -3497,9 +3499,9 @@
 "post-receive hooks internally. Installation of these hooks is managed in "
 "%s."
 msgstr ""
-"Kallithea ne supporte pas les hooks Git personnalisés. Kallithea utilise des "
-"hooks Git de post-réception en interne. L'installation de ces hooks est "
-"gérée dans %s."
+"Kallithea ne supporte pas les hooks Git personnalisés. Kallithea utilise "
+"des hooks Git de post-réception en interne. L'installation de ces hooks "
+"est gérée dans %s."
 
 #: kallithea/templates/admin/settings/settings_hooks.html:48
 msgid "Custom Hooks are not enabled"
@@ -3559,9 +3561,9 @@
 "hooks that don't seem to come from Kallithea will be disabled by renaming "
 "to .bak extension."
 msgstr ""
-"Installe les hooks internes de Kallithea pour tous les dépôts Git. Les hooks "
-"existants qui ne semblent pas être livrés avec Kallithea seront désactivés "
-"en les renommant avec l'extension .bak."
+"Installe les hooks internes de Kallithea pour tous les dépôts Git. Les "
+"hooks existants qui ne semblent pas être livrés avec Kallithea seront "
+"désactivés en les renommant avec l'extension .bak."
 
 #: kallithea/templates/admin/settings/settings_mapping.html:41
 msgid "Rescan Repositories"
@@ -3747,12 +3749,13 @@
 "hostname\n"
 "                                                    "
 msgstr ""
-"Modèle de construction d'URL de clone. Par exemple : "
-"'{scheme}://{user}@{netloc}/{repo}'.\n"
+"Modèle de construction d'URL de clone. Par exemple : '{scheme}://{user}"
+"@{netloc}/{repo}'.\n"
 "                                                       Les variables "
 "suivantes sont disponibles :\n"
-"                                                        {scheme}    'http' "
-"ou 'https' envoyé à partir du serveur Kallithea en cours d'utilisation,\n"
+"                                                        {scheme}    "
+"'http' ou 'https' envoyé à partir du serveur Kallithea en cours "
+"d'utilisation,\n"
 "                                                        {user}     nom de "
 "l'utilisateur courant,\n"
 "                                                        {netloc}    "
@@ -3761,8 +3764,8 @@
 "complet du dépôt,\n"
 "                                                        {repoid}    ID du "
 "dépôt, peut être utilisé pour cloner par ID,\n"
-"                                                        {system_user}  nom "
-"de l'utilisateur système Kallithea,\n"
+"                                                        {system_user}  "
+"nom de l'utilisateur système Kallithea,\n"
 "                                                        {hostname}  nom "
 "d'hôte du serveur\n"
 "                                                    "
--- a/kallithea/i18n/hu/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/hu/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2015-04-11 00:59+0200\n"
 "Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
 "Language-Team: Hungarian <https://hosted.weblate.org/projects/kallithea/"
@@ -17,26 +17,26 @@
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 2.3-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr ""
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/ja/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/ja/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2019-08-27 07:23+0000\n"
 "Last-Translator: leela <53352@protonmail.com>\n"
 "Language-Team: Japanese <https://hosted.weblate.org/projects/kallithea/"
@@ -16,27 +16,27 @@
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Weblate 3.9-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr "ファイルシステム内にリポジトリが見つかりません"
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "まだチェンジセットがありません"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, fuzzy, python-format
 #| msgid "Changeset not found"
 msgid "Changeset for %s %s not found in %s"
 msgstr "リビジョンが見つかりません"
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 #, fuzzy
 #| msgid "Your account is disabled"
 msgid "SSH access is disabled."
--- a/kallithea/i18n/kallithea.pot	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/kallithea.pot	Sun May 30 01:34:48 2021 +0200
@@ -6,9 +6,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: Kallithea 0.6.99\n"
+"Project-Id-Version: Kallithea 0.7.0\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -17,25 +17,25 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Generated-By: Babel 2.8.1\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr ""
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/lb/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/lb/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -3,7 +3,7 @@
 msgid ""
 msgstr ""
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2020-04-13 19:42+0000\n"
 "Last-Translator: Dennis Fink <dennis.fink@c3l.lu>\n"
 "Language: lb\n"
@@ -13,26 +13,26 @@
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.0-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Et sinn nach keng Ännerungen do"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr "SSH Accès ass ausgeschalt."
 
--- a/kallithea/i18n/nb_NO/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/nb_NO/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3.99\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2020-08-11 11:32+0000\n"
 "Last-Translator: Allan Nordhøy <epost@anotheragency.no>\n"
 "Language-Team: Norwegian Bokmål <https://hosted.weblate.org/projects/"
@@ -16,26 +16,26 @@
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 4.2-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Ingen endringssett enda"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/nl_BE/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/nl_BE/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2019-10-05 19:28+0000\n"
 "Last-Translator: Thomas De Schampheleire <patrickdepinguin@gmail.com>\n"
 "Language-Team: Flemish <https://hosted.weblate.org/projects/kallithea/"
@@ -17,26 +17,26 @@
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 3.9-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Er zijn nog geen changesets"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/pl/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/pl/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2021-01-15 18:32+0000\n"
 "Last-Translator: robertus <robertuss12@gmail.com>\n"
 "Language-Team: Polish <https://hosted.weblate.org/projects/kallithea/"
@@ -17,29 +17,29 @@
 "%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Generator: Weblate 4.5-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 "Wykryto wyciek tokenu CSRF — wszystkie tokeny formularza zostały "
 "unieważnione"
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 #, fuzzy
 msgid "Repository not found in the filesystem"
 msgstr "Nie znaleziono repozytorium w systemie plików"
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Brak zestawienia zmian"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr "Zmiany dla %s %s nie zostały znalezione w %s"
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr "Dostęp SSH jest wyłączony."
 
--- a/kallithea/i18n/pt/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/pt/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.6.1\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2021-05-10 09:32+0000\n"
 "Last-Translator: ssantos <ssantos@web.de>\n"
 "Language-Team: none\n"
@@ -19,26 +19,26 @@
 "X-Generator: Weblate 4.7-dev\n"
 "Generated-By: Babel 2.8.0\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Não há nenhum changeset ainda"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/pt_BR/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2014-02-13 14:34+0000\n"
 "Last-Translator: Marcin Kuźmiński <marcin@python-works.com>\n"
 "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
@@ -15,27 +15,27 @@
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1)\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Não há nenhum changeset ainda"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, fuzzy, python-format
 #| msgid "Changeset not found"
 msgid "Changeset for %s %s not found in %s"
 msgstr "Conjunto de alterações não encontrado"
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 #, fuzzy
 #| msgid "Your account is disabled"
 msgid "SSH access is disabled."
--- a/kallithea/i18n/ru/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/ru/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2021-02-14 06:50+0000\n"
 "Last-Translator: vs <vsuhachev@yandex.ru>\n"
 "Language-Team: Russian <https://hosted.weblate.org/projects/kallithea/"
@@ -17,26 +17,26 @@
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Generator: Weblate 4.5-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr "Обнаружена утечка CSRF-токена — истёк срок действия токенов форм"
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr "Репозиторий не найден на файловой системе"
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Наборы изменений отсутствуют"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr "Набор изменений для %s %s не найден в %s"
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr "Доступ по SSH отключен."
 
--- a/kallithea/i18n/sk/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/sk/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2015-04-01 12:59+0200\n"
 "Last-Translator: Andrej Shadura <andrew@shadura.me>\n"
 "Language-Team: Slovak <https://hosted.weblate.org/projects/kallithea/"
@@ -17,26 +17,26 @@
 "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2\n"
 "Generated-By: Babel 1.3\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Zatiaľ nie sú žiadne zmeny"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/tr/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/tr/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.4.99\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2019-11-05 08:03+0000\n"
 "Last-Translator: Hüseyin Tunç <huseyin.tunc@bulutfon.com>\n"
 "Language-Team: Turkish <https://hosted.weblate.org/projects/kallithea/"
@@ -20,26 +20,26 @@
 "X-Generator: Weblate 3.10-dev\n"
 "Generated-By: Babel 2.6.0\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr ""
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/uk/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/uk/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3.2\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2019-11-13 10:04+0000\n"
 "Last-Translator: Oleksandr Shtalinberg <o.shtalinberg@gmail.com>\n"
 "Language-Team: Ukrainian <https://hosted.weblate.org/projects/kallithea/"
@@ -17,26 +17,26 @@
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Generator: Weblate 3.10-dev\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr "Виявлено витік токенів CSRF - всі маркери форми минули"
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr "Репозиторій не знайдено у файловій системі"
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "Наборів змін немає"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr "Набір змін для %s %s не знайдено в %s"
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 msgid "SSH access is disabled."
 msgstr ""
 
--- a/kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/zh_CN/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2019-08-14 19:00+0000\n"
 "Last-Translator: Elizabeth Sherrock <lizzyd710@gmail.com>\n"
 "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
@@ -17,26 +17,26 @@
 "X-Generator: Weblate 3.8-dev\n"
 "Generated-By: Babel 1.3\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr "还没有修订集"
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, fuzzy, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr "未找到修订集"
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 #, fuzzy
 #| msgid "Your account is disabled"
 msgid "SSH access is disabled."
--- a/kallithea/i18n/zh_TW/LC_MESSAGES/kallithea.po	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/i18n/zh_TW/LC_MESSAGES/kallithea.po	Sun May 30 01:34:48 2021 +0200
@@ -4,7 +4,7 @@
 msgstr ""
 "Project-Id-Version: Kallithea 0.3\n"
 "Report-Msgid-Bugs-To: translations@kallithea-scm.org\n"
-"POT-Creation-Date: 2021-05-12 11:36+0200\n"
+"POT-Creation-Date: 2021-05-30 01:30+0200\n"
 "PO-Revision-Date: 2017-03-10 18:26+0000\n"
 "Last-Translator: mao <mao@lins.fju.edu.tw>\n"
 "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/"
@@ -17,26 +17,26 @@
 "X-Generator: Weblate 2.12\n"
 "Generated-By: Babel 1.3\n"
 
-#: kallithea/controllers/base.py:476
+#: kallithea/controllers/base.py:470
 msgid ""
 "CSRF token leak has been detected - all form tokens have been expired"
 msgstr ""
 
-#: kallithea/controllers/base.py:572
+#: kallithea/controllers/base.py:566
 msgid "Repository not found in the filesystem"
 msgstr ""
 
-#: kallithea/controllers/base.py:593 kallithea/controllers/changelog.py:67
+#: kallithea/controllers/base.py:587 kallithea/controllers/changelog.py:67
 #: kallithea/controllers/pullrequests.py:249
 msgid "There are no changesets yet"
 msgstr ""
 
-#: kallithea/controllers/base.py:596
+#: kallithea/controllers/base.py:590
 #, python-format
 msgid "Changeset for %s %s not found in %s"
 msgstr ""
 
-#: kallithea/controllers/base.py:637
+#: kallithea/controllers/base.py:631
 #, fuzzy
 #| msgid "Your account is disabled"
 msgid "SSH access is disabled."
--- a/kallithea/lib/vcs/backends/git/repository.py	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/lib/vcs/backends/git/repository.py	Sun May 30 01:34:48 2021 +0200
@@ -192,7 +192,11 @@
         >>> GitRepository._check_url('git://example.com/\t')
         Traceback (most recent call last):
         ...
+        urllib.error.URLError: <urlopen error Invalid ...>
+
+        The failure above will be one of, depending on the level of WhatWG support:
         urllib.error.URLError: <urlopen error Invalid whitespace character in path: '\t'>
+        urllib.error.URLError: <urlopen error Invalid url: 'git://example.com/    ' normalizes to 'git://example.com/'>
         """
         try:
             parsed_url = urllib.parse.urlparse(url)
@@ -204,6 +208,10 @@
         if os.path.isabs(url) and os.path.isdir(url):
             return
 
+        unparsed_url = urllib.parse.urlunparse(parsed_url)
+        if unparsed_url != url:
+            raise urllib.error.URLError("Invalid url: '%s' normalizes to '%s'" % (url, unparsed_url))
+
         if parsed_url.scheme == 'git':
             # Mitigate problems elsewhere with incorrect handling of encoded paths.
             # Don't trust urllib.parse.unquote but be prepared for more flexible implementations elsewhere.
--- a/kallithea/templates/about.html	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/templates/about.html	Sun May 30 01:34:48 2021 +0200
@@ -24,20 +24,27 @@
   necessarily limited to the following:</p>
   <ul>
 
-  <li>Copyright &copy; 2012&ndash;2020, Mads Kiilerich</li>
-  <li>Copyright &copy; 2014&ndash;2020, Thomas De Schampheleire</li>
-  <li>Copyright &copy; 2015&ndash;2017, 2019&ndash;2020, Étienne Gilli</li>
+  <li>Copyright &copy; 2012&ndash;2021, Mads Kiilerich</li>
+  <li>Copyright &copy; 2014&ndash;2021, Thomas De Schampheleire</li>
+  <li>Copyright &copy; 2015&ndash;2017, 2019&ndash;2021, Étienne Gilli</li>
+  <li>Copyright &copy; 2018&ndash;2021, ssantos</li>
+  <li>Copyright &copy; 2019&ndash;2021, Private</li>
+  <li>Copyright &copy; 2020&ndash;2021, fresh</li>
+  <li>Copyright &copy; 2020&ndash;2021, robertus</li>
+  <li>Copyright &copy; 2021, Eugenia Russell</li>
+  <li>Copyright &copy; 2021, Michalis</li>
+  <li>Copyright &copy; 2021, vs</li>
+  <li>Copyright &copy; 2021, Александр</li>
   <li>Copyright &copy; 2016&ndash;2017, 2020, Asterios Dimitriou</li>
   <li>Copyright &copy; 2017&ndash;2020, Allan Nordhøy</li>
   <li>Copyright &copy; 2017, 2020, Anton Schur</li>
-  <li>Copyright &copy; 2018&ndash;2020, ssantos</li>
   <li>Copyright &copy; 2019&ndash;2020, Manuel Jacob</li>
-  <li>Copyright &copy; 2019&ndash;2020, Private</li>
+  <li>Copyright &copy; 2020, Artem</li>
   <li>Copyright &copy; 2020, David Ignjić</li>
   <li>Copyright &copy; 2020, Dennis Fink</li>
   <li>Copyright &copy; 2020, J. Lavoie</li>
-  <li>Copyright &copy; 2020, robertus</li>
   <li>Copyright &copy; 2020, Ross Thomas</li>
+  <li>Copyright &copy; 2020, Tim Ooms</li>
   <li>Copyright &copy; 2012, 2014&ndash;2017, 2019, Andrej Shadura</li>
   <li>Copyright &copy; 2019, Adi Kriegisch</li>
   <li>Copyright &copy; 2019, Danni Randeris</li>
--- a/kallithea/templates/base/base.html	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/templates/base/base.html	Sun May 30 01:34:48 2021 +0200
@@ -23,7 +23,7 @@
             <a class="navbar-link" href="${h.url('kallithea_project_url')}" target="_blank">Kallithea</a>,
         %endif
         which is
-        <a class="navbar-link" href="${h.canonical_url('about')}#copyright">&copy; 2010&ndash;2020 by various authors &amp; licensed under GPLv3</a>.
+        <a class="navbar-link" href="${h.canonical_url('about')}#copyright">&copy; 2010&ndash;2021 by various authors &amp; licensed under GPLv3</a>.
         %if c.issues_url:
             &ndash; <a class="navbar-link" href="${c.issues_url}" target="_blank">${_('Support')}</a>
         %endif
--- a/kallithea/templates/ini/template.ini.mako	Fri May 14 16:44:27 2021 +0200
+++ b/kallithea/templates/ini/template.ini.mako	Sun May 30 01:34:48 2021 +0200
@@ -145,6 +145,7 @@
 #[filter:proxy-prefix]
 #use = egg:PasteDeploy#prefix
 #prefix = /<your-prefix>
+#translate_forwarded_server = False
 
 [app:main]
 use = egg:kallithea
@@ -174,11 +175,17 @@
 <%text>##</%text> cut off limit for large diffs (size in bytes)
 cut_off_limit = 256000
 
-<%text>##</%text> force https in Kallithea, fixes https redirects, assumes it's always https
-force_https = false
+<%text>##</%text> WSGI environment variable to get the IP address of the client (default REMOTE_ADDR)
+#remote_addr_variable = HTTP_X_FORWARDED_FOR
+
+<%text>##</%text> WSGI environment variable to get the protocol (http or https) of the client connection (default wsgi.url_scheme)
+#url_scheme_variable = HTTP_X_FORWARDED_PROTO
 
-<%text>##</%text> use Strict-Transport-Security headers
-use_htsts = false
+<%text>##</%text> always pretend the client connected using HTTPS (default false)
+#force_https = true
+
+<%text>##</%text> use Strict-Transport-Security headers (default false)
+#use_htsts = true
 
 <%text>##</%text> number of commits stats will parse on each iteration
 commit_parse_limit = 25
--- a/setup.py	Fri May 14 16:44:27 2021 +0200
+++ b/setup.py	Sun May 30 01:34:48 2021 +0200
@@ -73,6 +73,7 @@
     "paginate_sqlalchemy >= 0.3.0, < 0.4",
     "bcrypt >= 3.1.0, < 3.2",
     "pip >= 20.0, < 999",
+    "chardet >= 3",
 ]
 
 dependency_links = [