89
def unzip(path, file, overwrite=False):
89
def unzip(path, file):
90
90
"""Unzips a zip file (or file-like object) into a path.
91
91
Note: All files go directly into the path. To avoid having a "zip bomb"
92
92
situation, the zip file should have a single directory in it with all the
94
94
The path is an absolute path in the current filesystem
95
(if this code is executed inside the jail, then it's inside the jail).
95
(if this code is executed inside the jail, then it's inside the jail,
96
if it's not then it's not).
97
# XXX: Really bad, but circular imports need avoiding.
98
from ivle.fileservice_lib.exceptions import WillNotOverwrite
100
98
zip = zipfile.ZipFile(file, 'r')
101
99
# First test the zip file
102
100
if zip.testzip() is not None:
103
101
raise OSError("ZIP: Bad zip file")
106
for filename in zip.namelist():
107
localpath = os.path.join(path, filename)
108
if os.path.exists(localpath):
109
raise WillNotOverwrite(filename)
111
103
for filename in zip.namelist():
112
104
localpath = os.path.join(path, filename)
113
105
# Create directory for filename
114
106
(file_dir, _) = os.path.split(localpath)
115
107
if not os.path.exists(file_dir):
116
108
os.makedirs(file_dir)
118
110
if filename.endswith(os.sep):
119
111
# Is a directory make the directory
120
112
if not os.path.exists(localpath):