Example #1
0
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
Example #2
0
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