Mercurial > ~astiob > upreckon > hgweb
comparison zipfiles/zipfile31.py @ 170:b993d9257400
Updated zipfiles
author | Oleg Oshmyan <chortos@inbox.lv> |
---|---|
date | Thu, 16 Jun 2011 01:24:10 +0100 |
parents | 45d4a9dc707b |
children |
comparison
equal
deleted
inserted
replaced
169:d7f4b051ad79 | 170:b993d9257400 |
---|---|
896 | 896 |
897 return info | 897 return info |
898 | 898 |
899 def setpassword(self, pwd): | 899 def setpassword(self, pwd): |
900 """Set default password for encrypted files.""" | 900 """Set default password for encrypted files.""" |
901 assert isinstance(pwd, bytes) | 901 if pwd and not isinstance(pwd, bytes): |
902 self.pwd = pwd | 902 raise TypeError("pwd: expected bytes, got %s" % type(pwd)) |
903 if pwd: | |
904 self.pwd = pwd | |
905 else: | |
906 self.pwd = None | |
903 | 907 |
904 def read(self, name, pwd=None): | 908 def read(self, name, pwd=None): |
905 """Return file bytes (as a string) for name.""" | 909 """Return file bytes (as a string) for name.""" |
906 return self.open(name, "r", pwd).read() | 910 return self.open(name, "r", pwd).read() |
907 | 911 |
908 def open(self, name, mode="r", pwd=None): | 912 def open(self, name, mode="r", pwd=None): |
909 """Return file-like object for 'name'.""" | 913 """Return file-like object for 'name'.""" |
910 if mode not in ("r", "U", "rU"): | 914 if mode not in ("r", "U", "rU"): |
911 raise RuntimeError('open() requires mode "r", "U", or "rU"') | 915 raise RuntimeError('open() requires mode "r", "U", or "rU"') |
916 if pwd and not isinstance(pwd, bytes): | |
917 raise TypeError("pwd: expected bytes, got %s" % type(pwd)) | |
912 if not self.fp: | 918 if not self.fp: |
913 raise RuntimeError( | 919 raise RuntimeError( |
914 "Attempt to read ZIP archive that was already closed") | 920 "Attempt to read ZIP archive that was already closed") |
915 | 921 |
916 # Only open a new file for instances where we were not | 922 # Only open a new file for instances where we were not |
938 fheader = struct.unpack(structFileHeader, fheader) | 944 fheader = struct.unpack(structFileHeader, fheader) |
939 fname = zef_file.read(fheader[_FH_FILENAME_LENGTH]) | 945 fname = zef_file.read(fheader[_FH_FILENAME_LENGTH]) |
940 if fheader[_FH_EXTRA_FIELD_LENGTH]: | 946 if fheader[_FH_EXTRA_FIELD_LENGTH]: |
941 zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH]) | 947 zef_file.read(fheader[_FH_EXTRA_FIELD_LENGTH]) |
942 | 948 |
943 if fname != zinfo.orig_filename.encode("utf-8"): | 949 if zinfo.flag_bits & 0x800: |
950 # UTF-8 filename | |
951 fname_str = fname.decode("utf-8") | |
952 else: | |
953 fname_str = fname.decode("cp437") | |
954 | |
955 if fname_str != zinfo.orig_filename: | |
944 raise BadZipfile( | 956 raise BadZipfile( |
945 'File name in directory %r and header %r differ.' | 957 'File name in directory %r and header %r differ.' |
946 % (zinfo.orig_filename, fname)) | 958 % (zinfo.orig_filename, fname)) |
947 | 959 |
948 # check for encrypted flag & handle password | 960 # check for encrypted flag & handle password |
959 # The first 12 bytes in the cypher stream is an encryption header | 971 # The first 12 bytes in the cypher stream is an encryption header |
960 # used to strengthen the algorithm. The first 11 bytes are | 972 # used to strengthen the algorithm. The first 11 bytes are |
961 # completely random, while the 12th contains the MSB of the CRC, | 973 # completely random, while the 12th contains the MSB of the CRC, |
962 # or the MSB of the file time depending on the header type | 974 # or the MSB of the file time depending on the header type |
963 # and is used to check the correctness of the password. | 975 # and is used to check the correctness of the password. |
964 bytes = zef_file.read(12) | 976 header = zef_file.read(12) |
965 h = list(map(zd, bytes[0:12])) | 977 h = list(map(zd, header[0:12])) |
966 if zinfo.flag_bits & 0x8: | 978 if zinfo.flag_bits & 0x8: |
967 # compare against the file type from extended local headers | 979 # compare against the file type from extended local headers |
968 check_byte = (zinfo._raw_time >> 8) & 0xff | 980 check_byte = (zinfo._raw_time >> 8) & 0xff |
969 else: | 981 else: |
970 # compare against the CRC otherwise | 982 # compare against the CRC otherwise |