(self, filename_crc)
| 572 | return self.filename.encode('utf-8'), self.flag_bits | _MASK_UTF_FILENAME |
| 573 | |
| 574 | def _decodeExtra(self, filename_crc): |
| 575 | # Try to decode the extra field. |
| 576 | extra = self.extra |
| 577 | unpack = struct.unpack |
| 578 | while len(extra) >= 4: |
| 579 | tp, ln = unpack('<HH', extra[:4]) |
| 580 | if ln+4 > len(extra): |
| 581 | raise BadZipFile("Corrupt extra field %04x (size=%d)" % (tp, ln)) |
| 582 | if tp == 0x0001: |
| 583 | data = extra[4:ln+4] |
| 584 | # ZIP64 extension (large files and/or large archives) |
| 585 | try: |
| 586 | if self.file_size in (0xFFFF_FFFF_FFFF_FFFF, 0xFFFF_FFFF): |
| 587 | field = "File size" |
| 588 | self.file_size, = unpack('<Q', data[:8]) |
| 589 | data = data[8:] |
| 590 | if self.compress_size == 0xFFFF_FFFF: |
| 591 | field = "Compress size" |
| 592 | self.compress_size, = unpack('<Q', data[:8]) |
| 593 | data = data[8:] |
| 594 | if self.header_offset == 0xFFFF_FFFF: |
| 595 | field = "Header offset" |
| 596 | self.header_offset, = unpack('<Q', data[:8]) |
| 597 | except struct.error: |
| 598 | raise BadZipFile(f"Corrupt zip64 extra field. " |
| 599 | f"{field} not found.") from None |
| 600 | elif tp == 0x7075: |
| 601 | data = extra[4:ln+4] |
| 602 | # Unicode Path Extra Field |
| 603 | try: |
| 604 | up_version, up_name_crc = unpack('<BL', data[:5]) |
| 605 | if up_version == 1 and up_name_crc == filename_crc: |
| 606 | up_unicode_name = data[5:].decode('utf-8') |
| 607 | if up_unicode_name: |
| 608 | self.filename = _sanitize_filename(up_unicode_name) |
| 609 | else: |
| 610 | import warnings |
| 611 | warnings.warn("Empty unicode path extra field (0x7075)", stacklevel=2) |
| 612 | except struct.error as e: |
| 613 | raise BadZipFile("Corrupt unicode path extra field (0x7075)") from e |
| 614 | except UnicodeDecodeError as e: |
| 615 | raise BadZipFile('Corrupt unicode path extra field (0x7075): invalid utf-8 bytes') from e |
| 616 | |
| 617 | extra = extra[ln+4:] |
| 618 | |
| 619 | @classmethod |
| 620 | def from_file(cls, filename, arcname=None, *, strict_timestamps=True): |
no test coverage detected