Commit b3ee072b authored by Jason Madden's avatar Jason Madden

The client also needs to be able to unpickle zodbpickle.binary

Fixes #113
parent 6693ddf7
...@@ -16,6 +16,10 @@ Changelog ...@@ -16,6 +16,10 @@ Changelog
with Python 3.7. See `issue 104 with Python 3.7. See `issue 104
<https://github.com/zopefoundation/ZEO/issues/104>`_. <https://github.com/zopefoundation/ZEO/issues/104>`_.
- Fix: Client-side updates for ZODB 5.4.0 or databases that already
had ``zodbpickle.binary`` OIDs. See `issue 113
<https://github.com/zopefoundation/ZEO/issues/113>`_.
5.1.2 (2018-03-27) 5.1.2 (2018-03-27)
------------------ ------------------
......
...@@ -24,6 +24,7 @@ import logging ...@@ -24,6 +24,7 @@ import logging
from .._compat import Unpickler, Pickler, BytesIO, PY3, PYPY from .._compat import Unpickler, Pickler, BytesIO, PY3, PYPY
from ..shortrepr import short_repr from ..shortrepr import short_repr
PY2 = not PY3
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
def encoder(protocol, server=False): def encoder(protocol, server=False):
...@@ -132,6 +133,8 @@ _silly = ('__doc__',) ...@@ -132,6 +133,8 @@ _silly = ('__doc__',)
exception_type_type = type(Exception) exception_type_type = type(Exception)
_SAFE_MODULE_NAMES = ('ZopeUndo.Prefix', 'copy_reg', '__builtin__', 'zodbpickle')
def find_global(module, name): def find_global(module, name):
"""Helper for message unpickler""" """Helper for message unpickler"""
try: try:
...@@ -144,7 +147,7 @@ def find_global(module, name): ...@@ -144,7 +147,7 @@ def find_global(module, name):
except AttributeError: except AttributeError:
raise ImportError("module %s has no global %s" % (module, name)) raise ImportError("module %s has no global %s" % (module, name))
safe = getattr(r, '__no_side_effects__', 0) safe = getattr(r, '__no_side_effects__', 0) or (PY2 and module in _SAFE_MODULE_NAMES)
if safe: if safe:
return r return r
...@@ -156,7 +159,7 @@ def find_global(module, name): ...@@ -156,7 +159,7 @@ def find_global(module, name):
def server_find_global(module, name): def server_find_global(module, name):
"""Helper for message unpickler""" """Helper for message unpickler"""
if module not in ('ZopeUndo.Prefix', 'copy_reg', '__builtin__', 'zodbpickle'): if module not in _SAFE_MODULE_NAMES:
raise ImportError("Module not allowed: %s" % (module,)) raise ImportError("Module not allowed: %s" % (module,))
try: try:
......
...@@ -965,13 +965,14 @@ class TimeoutTests(CommonSetupTearDown): ...@@ -965,13 +965,14 @@ class TimeoutTests(CommonSetupTearDown):
self.assertRaises(ClientDisconnected, storage.tpc_finish, txn) self.assertRaises(ClientDisconnected, storage.tpc_finish, txn)
# Make sure it's logged as CRITICAL # Make sure it's logged as CRITICAL
for line in open("server.log"): with open("server.log") as f:
for line in f:
if (('Transaction timeout after' in line) and if (('Transaction timeout after' in line) and
('CRITICAL ZEO.StorageServer' in line) ('CRITICAL ZEO.StorageServer' in line)
): ):
break break
else: else:
self.assertTrue(False, 'bad logging') self.fail('bad logging')
storage.close() storage.close()
......
...@@ -1353,7 +1353,8 @@ You can specify the client label via a configuration file as well: ...@@ -1353,7 +1353,8 @@ You can specify the client label via a configuration file as well:
>>> db.close() >>> db.close()
>>> @wait_until >>> @wait_until
... def check_for_test_label_2(): ... def check_for_test_label_2():
... for line in open('server.log'): ... with open('server.log') as f:
... for line in f:
... if 'test-label-2' in line: ... if 'test-label-2' in line:
... print(line.split()[1:4]) ... print(line.split()[1:4])
... return True ... return True
......
...@@ -500,8 +500,8 @@ def test_suite(): ...@@ -500,8 +500,8 @@ def test_suite():
doctest.DocTestSuite( doctest.DocTestSuite(
setUp=ZODB.tests.util.setUp, tearDown=setupstack.tearDown, setUp=ZODB.tests.util.setUp, tearDown=setupstack.tearDown,
checker=renormalizing.RENormalizing([ checker=renormalizing.RENormalizing([
(re.compile('\d+/test-addr'), ''), (re.compile(r'\d+/test-addr'), ''),
(re.compile("'lock_time': \d+.\d+"), 'lock_time'), (re.compile(r"'lock_time': \d+.\d+"), 'lock_time'),
(re.compile(r"'start': '[^\n]+'"), 'start'), (re.compile(r"'start': '[^\n]+'"), 'start'),
(re.compile('ZODB.POSException.StorageTransactionError'), (re.compile('ZODB.POSException.StorageTransactionError'),
'StorageTransactionError'), 'StorageTransactionError'),
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment