class HtmlExtract(object): def __init__(self): self.datahandlers = { DataTypes.DATA: self.datahandler, DataTypes.DATE: self.datehandler, DataTypes.TEXT: self.texthandler } self.handlers = { ExtractStore.TYPE_TABLE: self._get_tablehtml, ExtractStore.TYPE_DATA: self._get_datahtml, ExtractStore.TYPE_XML: self._get_xmlhtml, ExtractStore.TYPE_IMAGE: self._get_imagehtml, ExtractStore.TYPE_STRING: self._get_asciistringhtml } self.mime = MimeGuesser() def dump_file(self, appfile): html = "" if appfile.ftype == ExtractStore.TYPE_MULTI: navhead = """ <div class="panel-heading"> <ul class="nav nav-tabs"> """ navbody = """<div class="panel-body"><div class="tab-content">""" for contents in appfile.content: navhead += """<li><a data-toggle="tab" href="#{name}">{name}</a></li>""".format(name=contents.name) navbody += """<div id={name} class="tab-pane">""".format(name=contents.name) handler = None try: handler=self.handlers[contents.ctype] except: navbody += "No Handler Implemented" #print "Bad Handler: " + appfile.name if handler != None: navbody+=handler(contents.content,contents.tbl_info,contents.knowninfo) navbody += "</div>" navhead += "</ul></div>" #ul and panel-heading navbody += "</div></div>" html += """<div class="panel with-nav-tabs panel-default"> """ + navhead + navbody + """</div>""" #do the nav-tabs init here and add items else: handler = None try: handler = self.handlers[appfile.ftype] except: #print "No Handler: " + appfile.name html += "Error No Handler Implemented" if handler != None: html += handler(appfile.content, appfile.tbl_info) #html = html.encode("UTF-8") return html def dump_hex(self,appfile): if appfile.ftype == ExtractStore.TYPE_MULTI: if appfile.filepath == None: return "<p>Unexpected Error: no filepath specified</p>" try: f = open(appfile.filepath, "rb") content = f.read() except: return """ <p>File {} not found. Please make sure that you haven't unmounted any images regarding this case """.format(cgi.escape(appfile.filepath)) return self._get_datahtml(content) else: return self._get_datahtml(appfile.content) def dump_strings(self, appfile): if appfile.ftype == ExtractStore.TYPE_MULTI: if appfile.filepath == None: return "<p>Unexpected Error: no filepath specified</p>" try: f = open(appfile.filepath, "rb") content = f.read() except: return """ <p>File {} not found. Please make sure that you haven't unmounted any images regarding this case """.format(cgi.escape(appfile.filepath)) return self._get_stringshtml( self.restringsdump(content)) else: return self._get_stringshtml(self.restringsdump(appfile.content)) def datahandler(self, value): return """ <button class="btn btn-primary btn-sm" onclick="hideshow(this);"> Show Data <span class="glyphicon glyphicon-chevron-down"></span> </button> <pre style="display:none;">{hexdump}</pre> """.format(hexdump=self.hexdump(value)) def datehandler(self, value): return """<span class="date">{value}</span>""".format(value=value) def texthandler(self,value): print "TEXTHANDLER CALLED" return "Unimplemented" def hexdump(self, src, length=16): if src == None: return "None" FILTER = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.' for x in range(256)]) lines = [] for c in xrange(0, len(src), length): chars = src[c:c+length] mhex = ' '.join(["%02x" % ord(x) for x in chars]) printable = cgi.escape(''.join(["%s" % ((ord(x) <= 127 and FILTER[ord(x)]) or '.') for x in chars])) lines.append("%04x %-*s %s\n" % (c, length*3, mhex, printable)) return ''.join(lines) def restringsdump(self, content): for match in re.finditer("[^\x00-\x1F\x7F-\xFF]{4,}", content): yield( match.start(), cgi.escape(match.group()) ) def stringsdump(self, content, minlen=4): result = "" loc = 0 for c in content: loc += 1 if c in string.printable: result += c continue elif len(result) >= minlen: yield (loc, cgi.escape(result)) result = "" def _parse_column(self, colname, value, tblinfo=None,knowntable=None,notd=False): ret = u"" if isinstance( value, StringIO.StringIO ): value = value.buf if notd: valwrap = u"{value}" else: valwrap = u"<td>{value}</td>" knownfields = None if knowntable != None: knownfields = knowntable.knownfields if tblinfo != None: if colname in tblinfo: if tblinfo[colname] == "BLOB": if value == None: return valwrap.format(value="None") mimetype = self.mime.get_buffermimetype(str(value), True) if mimetype != None: if mimetype.startswith("image/"): return valwrap.format(value=self._get_imagehtml(value, {"mime":mimetype})) elif mimetype.startswith("bplist"): return valwrap.format(value=self._get_bplisthtml(value)) return valwrap.format(value=self.datahandler(value)) try: if knownfields != None: if colname in knownfields: return valwrap.format(value=self.datahandlers[knownfields[colname]](value)) return valwrap.format(value=value) except Exception, e: if type(value) == StringIO: value = value.buf print traceback.format_exc() print "colname: {colname}".format(colname=colname) sys.stderr.write(repr(e) + "\n") # <button type="button" class="btn btn-primary btn-sm">Small button</button> return valwrap.format(value=self.datahandler(value)) return ret
class HtmlExtract(object): def __init__(self): self.datahandlers = { DataTypes.DATA: self.datahandler, DataTypes.DATE: self.datehandler, DataTypes.TEXT: self.texthandler } self.handlers = { ExtractStore.TYPE_TABLE: self._get_tablehtml, ExtractStore.TYPE_DATA: self._get_datahtml, ExtractStore.TYPE_XML: self._get_xmlhtml, ExtractStore.TYPE_IMAGE: self._get_imagehtml, ExtractStore.TYPE_STRING: self._get_asciistringhtml } self.mime = MimeGuesser() def dump_file(self, appfile): html = "" if appfile.ftype == ExtractStore.TYPE_MULTI: navhead = """ <div class="panel-heading"> <ul class="nav nav-tabs"> """ navbody = """<div class="panel-body"><div class="tab-content">""" for contents in appfile.content: navhead += """<li><a data-toggle="tab" href="#{name}">{name}</a></li>""".format( name=contents.name) navbody += """<div id={name} class="tab-pane">""".format( name=contents.name) handler = None try: handler = self.handlers[contents.ctype] except: navbody += "No Handler Implemented" #print "Bad Handler: " + appfile.name if handler != None: navbody += handler(contents.content, contents.tbl_info, contents.knowninfo) navbody += "</div>" navhead += "</ul></div>" #ul and panel-heading navbody += "</div></div>" html += """<div class="panel with-nav-tabs panel-default"> """ + navhead + navbody + """</div>""" #do the nav-tabs init here and add items else: handler = None try: handler = self.handlers[appfile.ftype] except: #print "No Handler: " + appfile.name html += "Error No Handler Implemented" if handler != None: html += handler(appfile.content, appfile.tbl_info) #html = html.encode("UTF-8") return html def dump_hex(self, appfile): if appfile.ftype == ExtractStore.TYPE_MULTI: if appfile.filepath == None: return "<p>Unexpected Error: no filepath specified</p>" try: f = open(appfile.filepath, "rb") content = f.read() except: return """ <p>File {} not found. Please make sure that you haven't unmounted any images regarding this case """.format(cgi.escape(appfile.filepath)) return self._get_datahtml(content) else: return self._get_datahtml(appfile.content) def dump_strings(self, appfile): if appfile.ftype == ExtractStore.TYPE_MULTI: if appfile.filepath == None: return "<p>Unexpected Error: no filepath specified</p>" try: f = open(appfile.filepath, "rb") content = f.read() except: return """ <p>File {} not found. Please make sure that you haven't unmounted any images regarding this case """.format(cgi.escape(appfile.filepath)) return self._get_stringshtml(self.restringsdump(content)) else: return self._get_stringshtml(self.restringsdump(appfile.content)) def datahandler(self, value): return """ <button class="btn btn-primary btn-sm" onclick="hideshow(this);"> Show Data <span class="glyphicon glyphicon-chevron-down"></span> </button> <pre style="display:none;">{hexdump}</pre> """.format(hexdump=self.hexdump(value)) def datehandler(self, value): return """<span class="date">{value}</span>""".format(value=value) def texthandler(self, value): print "TEXTHANDLER CALLED" return "Unimplemented" def hexdump(self, src, length=16): if src == None: return "None" FILTER = ''.join([(len(repr(chr(x))) == 3) and chr(x) or '.' for x in range(256)]) lines = [] for c in xrange(0, len(src), length): chars = src[c:c + length] mhex = ' '.join(["%02x" % ord(x) for x in chars]) printable = cgi.escape(''.join([ "%s" % ((ord(x) <= 127 and FILTER[ord(x)]) or '.') for x in chars ])) lines.append("%04x %-*s %s\n" % (c, length * 3, mhex, printable)) return ''.join(lines) def restringsdump(self, content): for match in re.finditer("[^\x00-\x1F\x7F-\xFF]{4,}", content): yield (match.start(), cgi.escape(match.group())) def stringsdump(self, content, minlen=4): result = "" loc = 0 for c in content: loc += 1 if c in string.printable: result += c continue elif len(result) >= minlen: yield (loc, cgi.escape(result)) result = "" def _parse_column(self, colname, value, tblinfo=None, knowntable=None, notd=False): ret = u"" if isinstance(value, StringIO.StringIO): value = value.buf if notd: valwrap = u"{value}" else: valwrap = u"<td>{value}</td>" knownfields = None if knowntable != None: knownfields = knowntable.knownfields if tblinfo != None: if colname in tblinfo: if tblinfo[colname] == "BLOB": if value == None: return valwrap.format(value="None") mimetype = self.mime.get_buffermimetype(str(value), True) if mimetype != None: if mimetype.startswith("image/"): return valwrap.format(value=self._get_imagehtml( value, {"mime": mimetype})) elif mimetype.startswith("bplist"): return valwrap.format( value=self._get_bplisthtml(value)) return valwrap.format(value=self.datahandler(value)) try: if knownfields != None: if colname in knownfields: return valwrap.format( value=self.datahandlers[knownfields[colname]](value)) return valwrap.format(value=value) except Exception, e: if type(value) == StringIO: value = value.buf print traceback.format_exc() print "colname: {colname}".format(colname=colname) sys.stderr.write(repr(e) + "\n") # <button type="button" class="btn btn-primary btn-sm">Small button</button> return valwrap.format(value=self.datahandler(value)) return ret