@@ -2488,38 +2488,51 @@ def OutSideArchiveCreate(self):
2488
2488
for TargetFolder, __, TargetFile in os.walk(self.filePath(ArchiveDFile)):
2489
2489
for TFile in TargetFile:
2490
2490
if not TFile.startswith('.'):
2491
- FilePaths = os.path.join(TargetFolder, TFile).replace(os.getcwd(), os.curdir)
2491
+ FilePaths = os.path.join(TargetFolder, TFile).replace(os.getcwd().replace(os.sep, '/') , os.curdir)
2492
2492
ZF.write(FilePaths)
2493
2493
os.chdir(BackupNowPath[0])
2494
2494
if mode == 'TarArchive':
2495
2495
os.chdir(self.rootPath())
2496
2496
with tarfile.open(FileName, 'w:gz') as Tgz:
2497
2497
for TarAddFiles in self.selectedIndexes():
2498
- Tgz.add(self.filePath(TarAddFiles).replace(os.getcwd(), os.curdir))
2498
+ Tgz.add(self.filePath(TarAddFiles).replace(os.getcwd().replace(os.sep, '/') , os.curdir))
2499
2499
os.chdir(BackupNowPath[0])
2500
2500
if mode == '7ZipArchive':
2501
2501
os.chdir(self.rootPath())
2502
2502
with py7zr.SevenZipFile(FileName, 'w') as SevenZipper:
2503
2503
for SevenFilesIndex in self.selectedIndexes():
2504
- SevenZipper.writeall(self.filePath(SevenFilesIndex).replace(os.getcwd(), os.curdir))
2504
+ SevenZipper.writeall(self.filePath(SevenFilesIndex).replace(os.getcwd().replace(os.sep, '/') , os.curdir))
2505
2505
os.chdir(BackupNowPath[0])
2506
2506
2507
+ def is_within_directory(self, directory, target):
2508
+ abs_directory = os.path.abspath(directory)
2509
+ abs_target = os.path.abspath(target)
2510
+ prefix = os.path.commonprefix([abs_directory, abs_target])
2511
+ return prefix == abs_directory
2512
+
2513
+ def safe_extract(self, tars, path='.', members=None, numeric_owner=False):
2514
+ for member in tars.getmembers():
2515
+ member_path = os.path.join(path, member.name)
2516
+ if not self.is_within_directory(path, member_path):
2517
+ raise Exception("Attempted Path Traversal in Tar File")
2518
+ tars.extractall(path=path, members=members, numeric_owner=numeric_owner)
2519
+
2507
2520
def OutSideUnArchive(self):
2508
2521
BackupNowPath[0] = os.getcwd()
2509
2522
os.chdir(self.rootPath())
2510
2523
for DetectFile in self.selectedIndexes():
2511
2524
if self.filePath(DetectFile).endswith('.zip'):
2512
2525
os.makedirs(self.filePath(DetectFile).replace(os.getcwd(), os.curdir).split('.zip')[0], exist_ok=True)
2513
2526
with zipfile.ZipFile(self.filePath(DetectFile), 'r') as ExtractZip:
2514
- ExtractZip.extractall(path='{}{}{}'.format(os.getcwd(), '/', self.filePath(DetectFile).split(os.getcwd())[-1].split('.zip')[0]))
2527
+ ExtractZip.extractall(path='{}{}{}'.format(os.getcwd(), '/', self.filePath(DetectFile).split(os.getcwd().replace(os.sep, '/') )[-1].split('.zip')[0]))
2515
2528
if self.filePath(DetectFile).endswith('.tar.gz'):
2516
2529
os.makedirs(self.filePath(DetectFile).replace(os.getcwd(), os.curdir).split('.tar.gz')[0], exist_ok=True)
2517
2530
with tarfile.open(self.filePath(DetectFile), 'r') as ExtractTgz:
2518
- ExtractTgz.extractall( path='{}{}{}'.format(os.getcwd(), '/', self.filePath(DetectFile).split(os.getcwd())[-1].split('.tar.gz')[0]))
2531
+ self.safe_extract(ExtractTgz, path='{}{}{}'.format(os.getcwd(), '/', self.filePath(DetectFile).split(os.getcwd().replace(os.sep, '/' ))[-1].split('.tar.gz')[0]))
2519
2532
if self.filePath(DetectFile).endswith('.7z'):
2520
2533
os.makedirs(self.filePath(DetectFile).replace(os.getcwd(), os.curdir).split('.7z')[0], exist_ok=True)
2521
2534
with py7zr.SevenZipFile(self.filePath(DetectFile), 'r') as ExtractSevenZip:
2522
- ExtractSevenZip.extractall(path='{}{}{}'.format(os.getcwd(), '/', self.filePath(DetectFile).split(os.getcwd())[-1].split('.7z')[0]))
2535
+ ExtractSevenZip.extractall(path='{}{}{}'.format(os.getcwd(), '/', self.filePath(DetectFile).split(os.getcwd().replace(os.sep, '/') )[-1].split('.7z')[0]))
2523
2536
os.chdir(BackupNowPath[0])
2524
2537
2525
2538
def dragEnterEvent(self, event):
0 commit comments