Skip to content

Commit

Permalink
The client also needs to be able to unpickle zodbpickle.binary
Browse files Browse the repository at this point in the history
Fixes #113
  • Loading branch information
jamadden committed Mar 28, 2018
1 parent 6693ddf commit b3ee072
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 14 deletions.
4 changes: 4 additions & 0 deletions CHANGES.rst
Expand Up @@ -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)
------------------

Expand Down
7 changes: 5 additions & 2 deletions src/ZEO/asyncio/marshal.py
Expand Up @@ -24,6 +24,7 @@
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):
Expand Down Expand Up @@ -132,6 +133,8 @@ def reduce_exception(exc):

exception_type_type = type(Exception)

_SAFE_MODULE_NAMES = ('ZopeUndo.Prefix', 'copy_reg', '__builtin__', 'zodbpickle')

def find_global(module, name):
"""Helper for message unpickler"""
try:
Expand All @@ -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

Expand All @@ -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:
Expand Down
13 changes: 7 additions & 6 deletions src/ZEO/tests/ConnectionTests.py
Expand Up @@ -965,13 +965,14 @@ def checkTimeout(self):
self.assertRaises(ClientDisconnected, storage.tpc_finish, txn)

# Make sure it's logged as CRITICAL
for line in open("server.log"):
if (('Transaction timeout after' in line) and
('CRITICAL ZEO.StorageServer' in line)
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')
break
else:
self.fail('bad logging')

storage.close()

Expand Down
9 changes: 5 additions & 4 deletions src/ZEO/tests/testZEO.py
Expand Up @@ -1353,10 +1353,11 @@ def client_labels():
>>> db.close()
>>> @wait_until
... def check_for_test_label_2():
... for line in open('server.log'):
... if 'test-label-2' in line:
... print(line.split()[1:4])
... return True
... with open('server.log') as f:
... for line in f:
... if 'test-label-2' in line:
... print(line.split()[1:4])
... return True
['INFO', 'ZEO.StorageServer', '(test-label-2']
"""
Expand Down
4 changes: 2 additions & 2 deletions src/ZEO/tests/testZEO2.py
Expand Up @@ -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'),
Expand Down

0 comments on commit b3ee072

Please sign in to comment.