6
6
import os
7
7
import pathlib
8
8
import ssl
9
+ import subprocess
9
10
import tarfile
11
+ import time
10
12
import urllib
11
13
import urllib .error
12
14
import urllib .request
@@ -85,6 +87,39 @@ def detect_file_type(filename: str): # pylint: disable=inconsistent-return-stat
85
87
return suffix , None , suffix
86
88
87
89
90
+ def download_weights (url , dest ):
91
+ start = time .time ()
92
+ print ("downloading url: " , url )
93
+ print ("downloading to: " , dest )
94
+ subprocess .check_call (["pget" , "-x" , url , dest ], close_fds = False )
95
+ print ("downloading took: " , time .time () - start )
96
+
97
+
98
+ def is_safe_member (member , target_dir ):
99
+ member_path = os .path .join (target_dir , member .name )
100
+ abs_target_dir = os .path .abspath (target_dir )
101
+ abs_member_path = os .path .abspath (member_path )
102
+
103
+ if not abs_member_path .startswith (abs_target_dir ):
104
+ return False
105
+
106
+ if member .name .startswith ("/" ) or ".." in member .name :
107
+ return False
108
+
109
+ if member .islnk () or member .issym ():
110
+ return False
111
+
112
+ return True
113
+
114
+
115
+ def safe_members (tar , target_dir ):
116
+ for member in tar .getmembers ():
117
+ if is_safe_member (member , target_dir ):
118
+ yield member
119
+ else :
120
+ print (f"Discarding unsafe member: { member .name } " )
121
+
122
+
88
123
class Download :
89
124
"""Base utility class for downloading."""
90
125
@@ -96,7 +131,7 @@ class Download:
96
131
@staticmethod
97
132
def calculate_md5 (file_path : str , chunk_size : int = 1024 * 1024 ) -> str :
98
133
"""Calculate md5 value."""
99
- md5 = hashlib .md5 ()
134
+ md5 = hashlib .md5 (usedforsecurity = False )
100
135
with open (file_path , "rb" ) as fp :
101
136
for chunk in iter (lambda : fp .read (chunk_size ), b"" ):
102
137
md5 .update (chunk )
@@ -111,15 +146,15 @@ def extract_tar(from_path: str, to_path: Optional[str] = None, compression: Opti
111
146
"""Extract tar format file."""
112
147
113
148
with tarfile .open (from_path , f"r:{ compression [1 :]} " if compression else "r" ) as tar :
114
- tar .extractall ( to_path )
149
+ tar .extract_all ( tar , members = safe_members ( tar , to_path ) )
115
150
116
151
@staticmethod
117
152
def extract_zip (from_path : str , to_path : Optional [str ] = None , compression : Optional [str ] = None ) -> None :
118
153
"""Extract zip format file."""
119
154
120
155
compression_mode = zipfile .ZIP_BZIP2 if compression else zipfile .ZIP_STORED
121
156
with zipfile .ZipFile (from_path , "r" , compression = compression_mode ) as zip_file :
122
- zip_file . extractall ( to_path )
157
+ zipfile . extract_all ( zip_file , members = safe_members ( zip_file , to_path ) )
123
158
124
159
def extract_archive (self , from_path : str , to_path : str = None ) -> str :
125
160
"""Extract and archive from path to path."""
0 commit comments