def getExtraField(self): if self.getExtraFieldLDLength() == 0: return None #Handler for case where offset cannot be found in central Directory if self.zip64Flag["offsetZip64"]: #If Offset flag present use central directory to find offset in extrafield startPosition = (46 + self.getFileNameLength()) extraField = self.centralDirectory[startPosition:( startPosition + self.getExtraFieldCDLength())] efParser = extra_field_parse.HeaderIdMapping() efMappings = efParser.HeaderIds() start = extraField.find("\x01\x00") blockMagic = extraField[start:start + 2] blockSize = struct.unpack("<H", extraField[start + 2:start + 4])[0] parser = efMappings[blockMagic]["parseField"]() zip64 = parser.parse(efBlock, self.zip64Flag) offset = zip64["RelativeOffset"] startPosition = (offset + 30 + self.getFileNameLength()) extraField = self.localDirectory[startPosition:( startPosition + self.getExtraFieldLDLength())] else: startPosition = (self.getRelativeOffset() + 30 + self.getFileNameLength()) extraField = self.localDirectory[startPosition:( startPosition + self.getExtraFieldLDLength())] return self.parseExtraField(extraField)
def parseExtraField(self, extraField): parsedExtraField = [] efParser = extra_field_parse.HeaderIdMapping() efMappings = efParser.HeaderIds() while extraField: blockMagic = extraField[0:2] blockSize = struct.unpack("<H", extraField[2:4])[0] efBlock = extraField[:4 + blockSize] if blockMagic in efMappings.keys(): #Mapping Header Is known (may or may not have been parsed) parser = efMappings[blockMagic]["parseField"]() parsedExtraField.append(parser.parse(efBlock, self.zip64Flag)) else: #No Header Hits parser = efMappings["Unknown"]["parseField"]() parsedExtraField.append(parser.parse(efBlock, self.zip64Flag)) extraField = extraField[4 + blockSize:] return parsedExtraField