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
with Python 3.7. See `issue 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)
------------------
......
......@@ -24,6 +24,7 @@ import logging
from .._compat import Unpickler, Pickler, BytesIO, PY3, PYPY
from ..shortrepr import short_repr
PY2 = not PY3
logger = logging.getLogger(__name__)
def encoder(protocol, server=False):
......@@ -132,6 +133,8 @@ _silly = ('__doc__',)
exception_type_type = type(Exception)
_SAFE_MODULE_NAMES = ('ZopeUndo.Prefix', 'copy_reg', '__builtin__', 'zodbpickle')
def find_global(module, name):
"""Helper for message unpickler"""
try:
......@@ -144,7 +147,7 @@ def find_global(module, name):
except AttributeError:
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:
return r
......@@ -156,7 +159,7 @@ def find_global(module, name):
def server_find_global(module, name):
"""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,))
try:
......
......@@ -965,13 +965,14 @@ class TimeoutTests(CommonSetupTearDown):
self.assertRaises(ClientDisconnected, storage.tpc_finish, txn)
# 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
('CRITICAL ZEO.StorageServer' in line)
):
break
else:
self.assertTrue(False, 'bad logging')
self.fail('bad logging')
storage.close()
......
......@@ -1353,7 +1353,8 @@ You can specify the client label via a configuration file as well:
>>> db.close()
>>> @wait_until
... 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:
... print(line.split()[1:4])
... return True
......
......@@ -500,8 +500,8 @@ def test_suite():
doctest.DocTestSuite(
setUp=ZODB.tests.util.setUp, tearDown=setupstack.tearDown,
checker=renormalizing.RENormalizing([
(re.compile('\d+/test-addr'), ''),
(re.compile("'lock_time': \d+.\d+"), 'lock_time'),
(re.compile(r'\d+/test-addr'), ''),
(re.compile(r"'lock_time': \d+.\d+"), 'lock_time'),
(re.compile(r"'start': '[^\n]+'"), 'start'),
(re.compile('ZODB.POSException.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