Пример #1
0
    def OnBtnSaveReportButton(self, event):
        self.startTime = time.time()
        dlg = wx.FileDialog(self, "Save Known Files Report", ".", "", "*.csv",
                            wx.SAVE)
        try:
            if dlg.ShowModal() == wx.ID_OK:
                db = SqliteDatabase(Globals.FileSystemName)
                if not db.OpenConnection():
                    return

                busy = wx.BusyInfo("It might take a while...")
                wx.Yield()

                query = "select DirPath||'%s'||Name, MD5 from %s where KnownFile = 1;" % (
                    os.path.sep, Globals.CurrentEvidenceID)
                fileName = dlg.GetPath()

                fout = open(fileName, 'wb')
                fout.write('Report Generated on: %s\n' % (time.ctime()))
                rows = db.FetchAllRows(query)

                fout.write('There are %d total known files.\n\n' % (len(rows)))
                delimeter = ";"
                if self.radComma.GetValue():
                    delimeter = ","

                for row in rows:
                    fout.write("%s%s%s\n" %
                               (unicode(row[0]), delimeter, unicode(row[1])))

                db.CloseConnection()
                fout.close()
                self.elapsedTime = CommonFunctions.ConvertSecondsToYearDayHourMinSec(
                    time.time() - self.startTime)
                msg = "Done generating report! (%s)" % (self.elapsedTime)
                CommonFunctions.ShowErrorMessage(self, msg, error=False)

        except Exception, value:
            CommonFunctions.ShowErrorMessage(
                self, "Failed to Save Known Files Report! Error: %s" % value)
    def OnBtnOKButton(self, event):
        self.startTime = time.time()
        busy = wx.BusyInfo(
            "Extracting Emails and Attachments and generating reports...It might take some time; just relax!"
        )
        wx.Yield()
        """
        import keyextract
        keyextract.msg_Folder_Path = self.txtMessageFolderPath.GetValue()
        keyextract.result_Dir_Path = self.txtResultFolderPath.GetValue()
        keyextract.file_Name = self.txtKeywordsFile.GetValue()
        keyextract.DoIt()
        """

        db = SqliteDatabase(Globals.EmailsFileName)
        if not db.OpenConnection():
            return

        keywordsFile = self.txtKeywordsFile.GetValue()
        outPutPath = self.txtResultFolderPath.GetValue()
        if not outPutPath:
            outPutPath = "."

        self.ReportOutputPath = os.path.join(outPutPath, "KeywordsReport")
        self.MessageOutputPath = os.path.join(self.ReportOutputPath,
                                              "Messages")
        #self.HTMLOutputPath = os.path.join(self.ReportOutputPath, "HTML")
        if not keywordsFile:
            return

        keywordsList = self.ReadKeywords(keywordsFile)

        for keyword in keywordsList:
            self.searchBitMap(db, keyword.strip())

        self.elapsedTime = CommonFunctions.ConvertSecondsToYearDayHourMinSec(
            time.time() - self.startTime)
        msg = "Done generating report! (%s)" % (self.elapsedTime)
        CommonFunctions.ShowErrorMessage(self, msg, error=False)
        self.Close()
    def searchBitMap(self, db, keyword, encoded=True):

        self.SearchDocIDList = []
        #self.webDocs = {}
        self.searchWords = ''
        self.wordList = []
        self.startTime = 0
        self.elapsedTime = ''

        self.encoded = encoded
        word = ''
        totalResult = 0

        self.searchWords = keyword
        if not self.searchWords:
            #CommonFunctions.ShowErrorMessage(self, "Failed to Export Phone List. Error: %s"%value)
            return

        if encoded:
            query = "select keyword, compressed from %s where (Keyword = " % Constants.TextCatBitMapIndex
        else:
            query = "select keyword, bitmap from %s where (Keyword = '" % Constants.TextCatBitMapIndex

        i = 0
        for word in string.split(self.searchWords, ' '):
            word = word.strip().lower()
            word = word.strip('"')

            if word not in Globals.EmailsStopwords:
                i += 1
                self.wordList.append(word)
                if i == 1:
                    query += db.SqlSQuote(word)
                else:
                    query += " or keyword = %s" % (db.SqlSQuote(word))

        query += ")"
        if self.wordList < 0:
            return None

        #print query
        bitMap = []
        docIndex = 0

        #print query
        rows = db.FetchAllRows(query)
        totalResult = len(rows)
        """
        if totalResult < len(self.wordList):
            self.elapsedTime = CommonFunctions.ConvertSecondsToYearDayHourMinSec(time.time() - self.startTime)
            self.MessagesHeading = "%d Results for %s (%s)"%(len(self.SearchDocIDList), self.searchWords, self.elapsedTime)
            return None
        """

        if totalResult < 1:
            self.elapsedTime = CommonFunctions.ConvertSecondsToYearDayHourMinSec(
                time.time() - self.startTime)
            self.MessagesHeading = "%d Results for %s (%s)" % (len(
                self.SearchDocIDList), self.searchWords, self.elapsedTime)
            return None

        if totalResult == 1:
            if self.encoded:
                bitMap = binascii.rledecode_hqx(rows[0][1])
            else:
                bitMap = rows[0][1]
        elif totalResult > 1:
            if self.encoded:
                bits = binascii.rledecode_hqx(rows[0][1])
                for bit in bits:
                    bitMap.append(bit)
            else:
                for bit in rows[0][1]:  # get the bitmap of first word/row
                    bitMap.append(bit)

        i = 1

        while i < totalResult:
            row = rows[i]
            i += 1
            index = 0  # start from the beginning of the bitmap
            if encoded:
                bits = binascii.rledecode_hqx(row[1])
            else:
                bits = row[1]

            for bit in bits:
                if self.searchWords.startswith('"'):
                    bitMap[index] = str(int(bitMap[index]) & int(bit))

                else:
                    bitMap[index] = str(int(bitMap[index]) | int(bit))
                index += 1

        #print bitMap
        docIndex = 1
        for bit in bitMap:
            if bit == '1':
                #if len(self.docIDString) >= 1:
                #    self.docIDString += ','
                self.SearchDocIDList.append(docIndex)
                #self.docIDString += str(docIndex)
            docIndex += 1

        if len(self.SearchDocIDList) == 0:
            return

        if keyword.startswith('"'):
            keyword = keyword.replace('"', "'")

        msgOutputPath = os.path.join(self.MessageOutputPath, keyword)
        try:
            os.makedirs(msgOutputPath)
        except:
            pass

        for key in Globals.MessageDict:
            for msg in Globals.MessageDict[key]:
                if msg.DocID in self.SearchDocIDList:
                    destPath = os.path.join(msgOutputPath,
                                            os.path.basename(msg.filePath))
                    if not os.path.isfile(destPath):
                        shutil.copyfile(msg.filePath, destPath)