|
33 | 33 | from pickle import PicklingError
|
34 | 34 | from threading import Lock, RLock
|
35 | 35 | import uuid
|
| 36 | +import time |
36 | 37 |
|
37 | 38 | from numcodecs.compat import ensure_bytes, ensure_contiguous_ndarray
|
38 | 39 | from numcodecs.registry import codec_registry
|
@@ -1254,7 +1255,22 @@ def __setitem__(self, key, value):
|
1254 | 1255 | err_read_only()
|
1255 | 1256 | value = ensure_contiguous_ndarray(value)
|
1256 | 1257 | with self.mutex:
|
1257 |
| - self.zf.writestr(key, value) |
| 1258 | + # writestr(key, value) writes with default permissions from |
| 1259 | + # zipfile (600) that are too restrictive, build ZipInfo for |
| 1260 | + # the key to work around limitation |
| 1261 | + keyinfo = zipfile.ZipInfo(filename=key, |
| 1262 | + date_time=time.localtime(time.time())[:6]) |
| 1263 | + keyinfo.compress_type = self.compression |
| 1264 | + if keyinfo.filename[-1] == os.sep: |
| 1265 | + keyinfo.external_attr = 0o40775 << 16 # drwxrwxr-x |
| 1266 | + keyinfo.external_attr |= 0x10 # MS-DOS directory flag |
| 1267 | + else: |
| 1268 | + keyinfo.external_attr = 0o644 << 16 # ?rw-r--r-- |
| 1269 | + |
| 1270 | + if isinstance(value, str): |
| 1271 | + value = value.encode("utf-8") |
| 1272 | + |
| 1273 | + self.zf.writestr(keyinfo, value) |
1258 | 1274 |
|
1259 | 1275 | def __delitem__(self, key):
|
1260 | 1276 | raise NotImplementedError
|
|
0 commit comments