Compare commits
No commits in common. 'c8-stream-2.7' and 'c9' have entirely different histories.
c8-stream-
...
c9
@ -1 +1 @@
|
||||
9adbd49864392713c6a3080aeb0a9e6432577277 SOURCES/Babel-2.5.1.tar.gz
|
||||
1ce15f82eba5184cabe6ac1491cb58262e27adfd SOURCES/Babel-2.9.1.tar.gz
|
||||
|
@ -1 +1 @@
|
||||
SOURCES/Babel-2.5.1.tar.gz
|
||||
SOURCES/Babel-2.9.1.tar.gz
|
||||
|
@ -1,128 +0,0 @@
|
||||
diff --git a/babel/localedata.py b/babel/localedata.py
|
||||
index 4b6d3b6..080b723 100644
|
||||
--- a/babel/localedata.py
|
||||
+++ b/babel/localedata.py
|
||||
@@ -13,6 +13,8 @@
|
||||
"""
|
||||
|
||||
import os
|
||||
+import re
|
||||
+import sys
|
||||
import threading
|
||||
from collections import MutableMapping
|
||||
from itertools import chain
|
||||
@@ -33,6 +35,7 @@ def get_base_dir():
|
||||
_cache = {}
|
||||
_cache_lock = threading.RLock()
|
||||
_dirname = os.path.join(get_base_dir(), 'locale-data')
|
||||
+_windows_reserved_name_re = re.compile("^(con|prn|aux|nul|com[0-9]|lpt[0-9])$", re.I)
|
||||
|
||||
|
||||
def normalize_locale(name):
|
||||
@@ -49,6 +52,22 @@ def normalize_locale(name):
|
||||
return locale_id
|
||||
|
||||
|
||||
+def resolve_locale_filename(name):
|
||||
+ """
|
||||
+ Resolve a locale identifier to a `.dat` path on disk.
|
||||
+ """
|
||||
+
|
||||
+ # Clean up any possible relative paths.
|
||||
+ name = os.path.basename(name)
|
||||
+
|
||||
+ # Ensure we're not left with one of the Windows reserved names.
|
||||
+ if sys.platform == "win32" and _windows_reserved_name_re.match(os.path.splitext(name)[0]):
|
||||
+ raise ValueError("Name %s is invalid on Windows" % name)
|
||||
+
|
||||
+ # Build the path.
|
||||
+ return os.path.join(_dirname, '%s.dat' % name)
|
||||
+
|
||||
+
|
||||
def exists(name):
|
||||
"""Check whether locale data is available for the given locale.
|
||||
|
||||
@@ -60,7 +79,7 @@ def exists(name):
|
||||
return False
|
||||
if name in _cache:
|
||||
return True
|
||||
- file_found = os.path.exists(os.path.join(_dirname, '%s.dat' % name))
|
||||
+ file_found = os.path.exists(resolve_locale_filename(name))
|
||||
return True if file_found else bool(normalize_locale(name))
|
||||
|
||||
|
||||
@@ -102,6 +121,7 @@ def load(name, merge_inherited=True):
|
||||
:raise `IOError`: if no locale data file is found for the given locale
|
||||
identifer, or one of the locales it inherits from
|
||||
"""
|
||||
+ name = os.path.basename(name)
|
||||
_cache_lock.acquire()
|
||||
try:
|
||||
data = _cache.get(name)
|
||||
@@ -119,7 +139,7 @@ def load(name, merge_inherited=True):
|
||||
else:
|
||||
parent = '_'.join(parts[:-1])
|
||||
data = load(parent).copy()
|
||||
- filename = os.path.join(_dirname, '%s.dat' % name)
|
||||
+ filename = resolve_locale_filename(name)
|
||||
with open(filename, 'rb') as fileobj:
|
||||
if name != 'root' and merge_inherited:
|
||||
merge(data, pickle.load(fileobj))
|
||||
diff --git a/tests/test_localedata.py b/tests/test_localedata.py
|
||||
index 3599b21..173e7a3 100644
|
||||
--- a/tests/test_localedata.py
|
||||
+++ b/tests/test_localedata.py
|
||||
@@ -11,12 +11,18 @@
|
||||
# individuals. For the exact contribution history, see the revision
|
||||
# history and logs, available at http://babel.edgewall.org/log/.
|
||||
|
||||
+import os
|
||||
+import pickle
|
||||
+import sys
|
||||
+import tempfile
|
||||
import unittest
|
||||
import random
|
||||
from operator import methodcaller
|
||||
import sys
|
||||
|
||||
-from babel import localedata, numbers
|
||||
+import pytest
|
||||
+
|
||||
+from babel import localedata, Locale, UnknownLocaleError, numbers
|
||||
|
||||
class MergeResolveTestCase(unittest.TestCase):
|
||||
|
||||
@@ -117,3 +123,33 @@ def test_locale_argument_acceptance():
|
||||
assert normalized_locale == None
|
||||
locale_exist = localedata.exists(['en_us', None])
|
||||
assert locale_exist == False
|
||||
+
|
||||
+def test_locale_name_cleanup():
|
||||
+ """
|
||||
+ Test that locale identifiers are cleaned up to avoid directory traversal.
|
||||
+ """
|
||||
+ no_exist_name = os.path.join(tempfile.gettempdir(), "babel%d.dat" % random.randint(1, 99999))
|
||||
+ with open(no_exist_name, "wb") as f:
|
||||
+ pickle.dump({}, f)
|
||||
+
|
||||
+ try:
|
||||
+ name = os.path.splitext(os.path.relpath(no_exist_name, localedata._dirname))[0]
|
||||
+ except ValueError:
|
||||
+ if sys.platform == "win32":
|
||||
+ pytest.skip("unable to form relpath")
|
||||
+ raise
|
||||
+
|
||||
+ assert not localedata.exists(name)
|
||||
+ with pytest.raises(IOError):
|
||||
+ localedata.load(name)
|
||||
+ with pytest.raises(UnknownLocaleError):
|
||||
+ Locale(name)
|
||||
+
|
||||
+
|
||||
+@pytest.mark.skipif(sys.platform != "win32", reason="windows-only test")
|
||||
+def test_reserved_locale_names():
|
||||
+ for name in ("con", "aux", "nul", "prn", "com8", "lpt5"):
|
||||
+ with pytest.raises(ValueError):
|
||||
+ localedata.load(name)
|
||||
+ with pytest.raises(ValueError):
|
||||
+ Locale(name)
|
@ -1,160 +0,0 @@
|
||||
From 5dfa1057b809f9bf848916a1001c742cf5229f46 Mon Sep 17 00:00:00 2001
|
||||
From: Tomas Orsava <torsava@redhat.com>
|
||||
Date: Mon, 18 Jun 2018 15:14:52 +0200
|
||||
Subject: [PATCH] Skip tests involving freezegun module which we're not
|
||||
shipping
|
||||
|
||||
---
|
||||
tests/messages/test_frontend.py | 31 +++++++++++++++----------------
|
||||
1 file changed, 15 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/tests/messages/test_frontend.py b/tests/messages/test_frontend.py
|
||||
index 20904a3..236dd5c 100644
|
||||
--- a/tests/messages/test_frontend.py
|
||||
+++ b/tests/messages/test_frontend.py
|
||||
@@ -11,7 +11,6 @@
|
||||
# individuals. For the exact contribution history, see the revision
|
||||
# history and logs, available at http://babel.edgewall.org/log/.
|
||||
import shlex
|
||||
-from freezegun import freeze_time
|
||||
from datetime import datetime
|
||||
from distutils.dist import Distribution
|
||||
from distutils.errors import DistutilsOptionError
|
||||
@@ -150,7 +149,7 @@ class ExtractMessagesTestCase(unittest.TestCase):
|
||||
self.cmd.output_file = self._pot_file()
|
||||
self.assertRaises(DistutilsOptionError, self.cmd.finalize_options)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_extraction_with_default_mapping(self):
|
||||
self.cmd.copyright_holder = 'FooBar, Inc.'
|
||||
self.cmd.msgid_bugs_address = 'bugs.address@email.tld'
|
||||
@@ -208,7 +207,7 @@ msgstr[1] ""
|
||||
actual_content = f.read()
|
||||
self.assertEqual(expected_content, actual_content)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_extraction_with_mapping_file(self):
|
||||
self.cmd.copyright_holder = 'FooBar, Inc.'
|
||||
self.cmd.msgid_bugs_address = 'bugs.address@email.tld'
|
||||
@@ -261,7 +260,7 @@ msgstr[1] ""
|
||||
actual_content = f.read()
|
||||
self.assertEqual(expected_content, actual_content)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_extraction_with_mapping_dict(self):
|
||||
self.dist.message_extractors = {
|
||||
'project': [
|
||||
@@ -392,7 +391,7 @@ class InitCatalogTestCase(unittest.TestCase):
|
||||
self.cmd.output_file = 'dummy'
|
||||
self.assertRaises(DistutilsOptionError, self.cmd.finalize_options)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_with_output_dir(self):
|
||||
self.cmd.input_file = 'project/i18n/messages.pot'
|
||||
self.cmd.locale = 'en_US'
|
||||
@@ -444,7 +443,7 @@ msgstr[1] ""
|
||||
actual_content = f.read()
|
||||
self.assertEqual(expected_content, actual_content)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_keeps_catalog_non_fuzzy(self):
|
||||
self.cmd.input_file = 'project/i18n/messages_non_fuzzy.pot'
|
||||
self.cmd.locale = 'en_US'
|
||||
@@ -496,7 +495,7 @@ msgstr[1] ""
|
||||
actual_content = f.read()
|
||||
self.assertEqual(expected_content, actual_content)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_correct_init_more_than_2_plurals(self):
|
||||
self.cmd.input_file = 'project/i18n/messages.pot'
|
||||
self.cmd.locale = 'lv_LV'
|
||||
@@ -550,7 +549,7 @@ msgstr[2] ""
|
||||
actual_content = f.read()
|
||||
self.assertEqual(expected_content, actual_content)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_correct_init_singular_plural_forms(self):
|
||||
self.cmd.input_file = 'project/i18n/messages.pot'
|
||||
self.cmd.locale = 'ja_JP'
|
||||
@@ -601,7 +600,7 @@ msgstr[0] ""
|
||||
actual_content = f.read()
|
||||
self.assertEqual(expected_content, actual_content)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_supports_no_wrap(self):
|
||||
self.cmd.input_file = 'project/i18n/long_messages.pot'
|
||||
self.cmd.locale = 'en_US'
|
||||
@@ -662,7 +661,7 @@ msgstr[1] ""
|
||||
actual_content = f.read()
|
||||
self.assertEqual(expected_content, actual_content)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_supports_width(self):
|
||||
self.cmd.input_file = 'project/i18n/long_messages.pot'
|
||||
self.cmd.locale = 'en_US'
|
||||
@@ -827,7 +826,7 @@ commands:
|
||||
def assert_pot_file_exists(self):
|
||||
assert os.path.isfile(self._pot_file())
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_extract_with_default_mapping(self):
|
||||
pot_file = self._pot_file()
|
||||
self.cli.run(sys.argv + ['extract',
|
||||
@@ -883,7 +882,7 @@ msgstr[1] ""
|
||||
actual_content = f.read()
|
||||
self.assertEqual(expected_content, actual_content)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_extract_with_mapping_file(self):
|
||||
pot_file = self._pot_file()
|
||||
self.cli.run(sys.argv + ['extract',
|
||||
@@ -934,7 +933,7 @@ msgstr[1] ""
|
||||
actual_content = f.read()
|
||||
self.assertEqual(expected_content, actual_content)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_extract_with_exact_file(self):
|
||||
"""Tests that we can call extract with a particular file and only
|
||||
strings from that file get extracted. (Note the absence of strings from file1.py)
|
||||
@@ -983,7 +982,7 @@ msgstr[1] ""
|
||||
actual_content = f.read()
|
||||
self.assertEqual(expected_content, actual_content)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_init_with_output_dir(self):
|
||||
po_file = self._po_file('en_US')
|
||||
self.cli.run(sys.argv + ['init',
|
||||
@@ -1034,7 +1033,7 @@ msgstr[1] ""
|
||||
def _i18n_dir(self):
|
||||
return os.path.join(self.datadir, 'project', 'i18n')
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_init_singular_plural_forms(self):
|
||||
po_file = self._po_file('ja_JP')
|
||||
self.cli.run(sys.argv + ['init',
|
||||
@@ -1081,7 +1080,7 @@ msgstr[0] ""
|
||||
actual_content = f.read()
|
||||
self.assertEqual(expected_content, actual_content)
|
||||
|
||||
- @freeze_time("1994-11-11")
|
||||
+ @pytest.mark.skip(reason="Not shipping the freezegun module")
|
||||
def test_init_more_than_2_plural_forms(self):
|
||||
po_file = self._po_file('lv_LV')
|
||||
self.cli.run(sys.argv + ['init',
|
||||
--
|
||||
2.14.4
|
||||
|
@ -1,15 +0,0 @@
|
||||
diff -up Babel-2.3.4/setup.py.orig Babel-2.3.4/setup.py
|
||||
--- Babel-2.3.4/setup.py.orig 2016-04-11 11:58:25.000000000 +0200
|
||||
+++ Babel-2.3.4/setup.py 2016-04-25 13:35:54.458765892 +0200
|
||||
@@ -59,7 +59,10 @@ setup(
|
||||
# This version identifier is currently necessary as
|
||||
# pytz otherwise does not install on pip 1.4 or
|
||||
# higher.
|
||||
- 'pytz>=0a',
|
||||
+ ### But the version confuses setuptools 8 and higher so remove it in the
|
||||
+ ### system package
|
||||
+ #'pytz>=0a',
|
||||
+ 'pytz',
|
||||
],
|
||||
|
||||
cmdclass={'import_cldr': import_cldr},
|
Loading…
Reference in new issue