# Path: appAux.py
# def loadFile(file_fullpath, max_chunk_size = 0):
#     """Abstracts loading a regular file and a file from within a zip archive.
#     Args:
#         file_fullpath (str): Full path to file to load
#         max_chunk_size (int): maximum number of bytes to be read from the file
#     Returns:
#         file_pointer (StringIO): Data read from fileFullPath
#     """
#     global zipCache
#     global zipCache_hits
#     global zipCache_misses
#     logger.debug("Loading file %s" % file_fullpath)
#     if ".zip/" in file_fullpath:
#         m = re.match(r'^((?:.*)\.zip)[\\/](.*)$', file_fullpath)
#         if m:
#             zip_container = m.group(1)
#             if m.lastindex > 1:
#                 file_fullpath_unprocessed = m.group(2)
#                 if '.zip' in file_fullpath_unprocessed:
#                     m = re.match(r'^(.*)(?:\.zip[\\/](.*))*$', file_fullpath_unprocessed)
#                     if m:
#                         zip_container_relative_path = m.group(1)
#                         if m.lastindex > 1:
#                             file_fullpath_unprocessed = m.group(2)
#                         else:
#                             file_fullpath_unprocessed = None
#                     else:
#                         logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#                 else:
#                     zip_container_relative_path = file_fullpath_unprocessed
# 
#                 # If not in the zipCache we add it
#             if zip_container not in zipCache:
#                 zipCache_misses +=1
#                 if zipfile.is_zipfile(loadFile(zip_container)):
#                     zipCache[zip_container] = zipfile.ZipFile(loadFile(zip_container))
#                 else:
#                     logger.error("Invalid ZIP file found: %s" % file_fullpath)
#                     return None
#             else:
#                 zipCache_hits += 1
#                 # print("ZipCache hits / misses: %d/%d" % (zipCache_hits, zipCache_misses))
# 
#             # Extract file_pointer from zip:
#             file_pointer = StringIO(zipCache[zip_container].read(zip_container_relative_path))
#             if max_chunk_size != 0:
#                 file_pointer = StringIO(file_pointer.read(max_chunk_size))
# 
#         else:
#             logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#     else:
#             # Extract file_pointer:
#             input_file = open(file_fullpath, 'rb')
#             if max_chunk_size == 0:
#                 file_pointer = StringIO(input_file.read())
#             else: file_pointer = StringIO(input_file.read(max_chunk_size))
#     assert(file_pointer is not None)
# 
#     logger.debug("Read %d bytes [%s]" % (getFileSize(file_pointer), toHex(file_pointer.read(20))))
#     # Return file pointer to pos 0
#     file_pointer.seek(0, 0)
# 
#     return file_pointer
# 
# def toHex(data):
#     return ':'.join(x.encode('hex') for x in data)


import logging
import re
import hashlib
from appAux import loadFile, toHex
    def checkMagic(self, file_name_fullpath):
        # Validate the file is actually a file the ingect pulgin can work with
        # Ingest plugins _must_ override this
        return True

    def id_filename(self, file_name_fullpath):
        # Emulate file magic functionality without external deps
        # Limited to:
        # 'MS Windows registry file, NT/2000 or above'
        # 'XML 1.0 document, ASCII text'
        magic_id = None
        file_chunk = loadFile(file_name_fullpath, 1000)
        if 'regf' in file_chunk.getvalue(): magic_id = 'MS Windows registry file, NT/2000 or above'
        elif '?xml' in file_chunk.getvalue(): magic_id = 'XML 1.0 document, ASCII text'
        elif 'Last Modified,Last Update' in file_chunk.getvalue(): magic_id = 'ShimCacheParser CSV'
        else: logger.warning("Unknown magic in file: %s [%s]" % (file_name_fullpath, toHex(file_chunk.getvalue())))

        # Perform deeper check to distinguish subtype
        if 'IssueList' in file_chunk.getvalue(): magic_id += '+ Mir IssueList file'
        elif 'batchresult' in file_chunk.getvalue(): magic_id += '+ Mir batchresult file'
        elif 'AmCacheItem' in file_chunk.getvalue(): magic_id += '+ Mir AmCache Lua_v1 file'
        elif 'itemList' in file_chunk.getvalue(): magic_id += '+ Mir itemList file'


        file_chunk.close()
        return magic_id

    def calculateID(self, file_name_fullpath):
        # Lazy instanceID calculation, overwrite to make it faster if possible for the ingest format
        instanceID = None

# Path: appAux.py
# def loadFile(file_fullpath, max_chunk_size = 0):
#     """Abstracts loading a regular file and a file from within a zip archive.
#     Args:
#         file_fullpath (str): Full path to file to load
#         max_chunk_size (int): maximum number of bytes to be read from the file
#     Returns:
#         file_pointer (StringIO): Data read from fileFullPath
#     """
#     global zipCache
#     global zipCache_hits
#     global zipCache_misses
#     logger.debug("Loading file %s" % file_fullpath)
#     if ".zip/" in file_fullpath:
#         m = re.match(r'^((?:.*)\.zip)[\\/](.*)$', file_fullpath)
#         if m:
#             zip_container = m.group(1)
#             if m.lastindex > 1:
#                 file_fullpath_unprocessed = m.group(2)
#                 if '.zip' in file_fullpath_unprocessed:
#                     m = re.match(r'^(.*)(?:\.zip[\\/](.*))*$', file_fullpath_unprocessed)
#                     if m:
#                         zip_container_relative_path = m.group(1)
#                         if m.lastindex > 1:
#                             file_fullpath_unprocessed = m.group(2)
#                         else:
#                             file_fullpath_unprocessed = None
#                     else:
#                         logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#                 else:
#                     zip_container_relative_path = file_fullpath_unprocessed
# 
#                 # If not in the zipCache we add it
#             if zip_container not in zipCache:
#                 zipCache_misses +=1
#                 if zipfile.is_zipfile(loadFile(zip_container)):
#                     zipCache[zip_container] = zipfile.ZipFile(loadFile(zip_container))
#                 else:
#                     logger.error("Invalid ZIP file found: %s" % file_fullpath)
#                     return None
#             else:
#                 zipCache_hits += 1
#                 # print("ZipCache hits / misses: %d/%d" % (zipCache_hits, zipCache_misses))
# 
#             # Extract file_pointer from zip:
#             file_pointer = StringIO(zipCache[zip_container].read(zip_container_relative_path))
#             if max_chunk_size != 0:
#                 file_pointer = StringIO(file_pointer.read(max_chunk_size))
# 
#         else:
#             logger.error("Issue extracting container and relative path from ZIP file: %s" % file_fullpath)
#     else:
#             # Extract file_pointer:
#             input_file = open(file_fullpath, 'rb')
#             if max_chunk_size == 0:
#                 file_pointer = StringIO(input_file.read())
#             else: file_pointer = StringIO(input_file.read(max_chunk_size))
#     assert(file_pointer is not None)
# 
#     logger.debug("Read %d bytes [%s]" % (getFileSize(file_pointer), toHex(file_pointer.read(20))))
#     # Return file pointer to pos 0
#     file_pointer.seek(0, 0)
# 
#     return file_pointer
# 
# def toHex(data):
#     return ':'.join(x.encode('hex') for x in data)


# Path: Ingest/ingest.py
import logging
import re
import hashlib
from appAux import loadFile, toHex

    def checkMagic(self, file_name_fullpath):
        # Validate the file is actually a file the ingect pulgin can work with
        # Ingest plugins _must_ override this
        return True

    def id_filename(self, file_name_fullpath):
        # Emulate file magic functionality without external deps
        # Limited to:
        # 'MS Windows registry file, NT/2000 or above'
        # 'XML 1.0 document, ASCII text'
        magic_id = None
        file_chunk = loadFile(file_name_fullpath, 1000)
        if 'regf' in file_chunk.getvalue(): magic_id = 'MS Windows registry file, NT/2000 or above'
        elif '?xml' in file_chunk.getvalue(): magic_id = 'XML 1.0 document, ASCII text'
        elif 'Last Modified,Last Update' in file_chunk.getvalue(): magic_id = 'ShimCacheParser CSV'
        else: logger.warning("Unknown magic in file: %s [%s]" % (file_name_fullpath, toHex(file_chunk.getvalue())))

        # Perform deeper check to distinguish subtype
        if 'IssueList' in file_chunk.getvalue(): magic_id += '+ Mir IssueList file'
        elif 'batchresult' in file_chunk.getvalue(): magic_id += '+ Mir batchresult file'
        elif 'AmCacheItem' in file_chunk.getvalue(): magic_id += '+ Mir AmCache Lua_v1 file'
        elif 'itemList' in file_chunk.getvalue(): magic_id += '+ Mir itemList file'


        file_chunk.close()
        return magic_id

    def calculateID(self, file_name_fullpath):
        # Lazy instanceID calculation, overwrite to make it faster if possible for the ingest format
        instanceID = None

        content_file = loadFile(file_name_fullpath)