示例#1
0
def ReadNotes(db, notes, source, user, is_ios):
    '''Read Notestore.sqlite'''
    if IsHighSierraOrAboveDb(db):
        ReadNotesHighSierraAndAbove(db, notes, source, user, is_ios)
        return

    if CommonFunctions.ColumnExists(db, 'ZICCLOUDSYNCINGOBJECT',
                                    'ZISPASSWORDPROTECTED'):
        enc_possible = True
    else:
        enc_possible = False

    query1 = " SELECT n.Z_12FOLDERS as folder_id , n.Z_9NOTES as note_id, d.ZDATA as data, " + ("c1.ZISPASSWORDPROTECTED as encrypted, c1.ZPASSWORDHINT, " if enc_possible else "") + \
            " c2.ZTITLE2 as folder, c2.ZDATEFORLASTTITLEMODIFICATION as folder_title_modified, " \
            " c1.ZCREATIONDATE as created, c1.ZMODIFICATIONDATE1 as modified, c1.ZSNIPPET as snippet, c1.ZTITLE1 as title, c1.ZACCOUNT2 as acc_id, " \
            " c5.ZACCOUNTTYPE as acc_type, c5.ZIDENTIFIER as acc_identifier, c5.ZNAME as acc_name, " \
            " c3.ZMEDIA as media_id, c3.ZFILESIZE as att_filesize, c3.ZMODIFICATIONDATE as att_modified, c3.ZPREVIEWUPDATEDATE as att_previewed, c3.ZTITLE as att_title, c3.ZTYPEUTI, c3.ZIDENTIFIER as att_uuid, " \
            " c4.ZFILENAME, c4.ZIDENTIFIER as media_uuid " \
            " FROM Z_12NOTES as n " \
            " LEFT JOIN ZICNOTEDATA as d ON d.ZNOTE = n.Z_9NOTES " \
            " LEFT JOIN ZICCLOUDSYNCINGOBJECT as c1 ON c1.Z_PK = n.Z_9NOTES " \
            " LEFT JOIN ZICCLOUDSYNCINGOBJECT as c2 ON c2.Z_PK = n.Z_12FOLDERS " \
            " LEFT JOIN ZICCLOUDSYNCINGOBJECT as c3 ON c3.ZNOTE = n.Z_9NOTES " \
            " LEFT JOIN ZICCLOUDSYNCINGOBJECT as c4 ON c3.ZMEDIA = c4.Z_PK " \
            " LEFT JOIN ZICCLOUDSYNCINGOBJECT as c5 ON c5.Z_PK = c1.ZACCOUNT2 " \
            " ORDER BY note_id "
    query2 = " SELECT n.Z_11FOLDERS as folder_id , n.Z_8NOTES as note_id, d.ZDATA as data, "  + ("c1.ZISPASSWORDPROTECTED as encrypted, c1.ZPASSWORDHINT, " if enc_possible else "") + \
            " c2.ZTITLE2 as folder, c2.ZDATEFORLASTTITLEMODIFICATION as folder_title_modified, " \
            " c1.ZCREATIONDATE as created, c1.ZMODIFICATIONDATE1 as modified, c1.ZSNIPPET as snippet, c1.ZTITLE1 as title, c1.ZACCOUNT2 as acc_id, " \
            " c5.ZACCOUNTTYPE as acc_type, c5.ZIDENTIFIER as acc_identifier, c5.ZNAME as acc_name, " \
            " c3.ZMEDIA as media_id, c3.ZFILESIZE as att_filesize, c3.ZMODIFICATIONDATE as att_modified, c3.ZPREVIEWUPDATEDATE as att_previewed, c3.ZTITLE as att_title, c3.ZTYPEUTI, c3.ZIDENTIFIER as att_uuid, " \
            " c4.ZFILENAME, c4.ZIDENTIFIER as media_uuid " \
            " FROM Z_11NOTES as n " \
            " LEFT JOIN ZICNOTEDATA as d ON d.ZNOTE = n.Z_8NOTES " \
            " LEFT JOIN ZICCLOUDSYNCINGOBJECT as c1 ON c1.Z_PK = n.Z_8NOTES " \
            " LEFT JOIN ZICCLOUDSYNCINGOBJECT as c2 ON c2.Z_PK = n.Z_11FOLDERS " \
            " LEFT JOIN ZICCLOUDSYNCINGOBJECT as c3 ON c3.ZNOTE = n.Z_8NOTES " \
            " LEFT JOIN ZICCLOUDSYNCINGOBJECT as c4 ON c3.ZMEDIA = c4.Z_PK " \
            " LEFT JOIN ZICCLOUDSYNCINGOBJECT as c5 ON c5.Z_PK = c1.ZACCOUNT2 " \
            " ORDER BY note_id "
    cursor, error1 = ExecuteQuery(db, query1)
    if cursor:
        ReadQueryResults(cursor, notes, enc_possible, user, source)
    else:  # Try query2
        cursor, error2 = ExecuteQuery(db, query2)
        if cursor:
            ReadQueryResults(cursor, notes, enc_possible, user, source)
        else:
            log.error(
                'Query execution failed.\n Query 1 error: {}\n Query 2 error: {}'
                .format(error1, error2))
示例#2
0
def ReadNotesHighSierraAndAbove(db, notes, source, user, is_ios):
    '''Read Notestore.sqlite'''

    try:
        query_1 = \
        """
        SELECT n.Z_PK, n.ZNOTE as note_id, n.ZDATA as data, c1.ZISPASSWORDPROTECTED as encrypted, c1.ZPASSWORDHINT, 
        c3.ZFILESIZE,  c4.ZFILENAME, c4.ZIDENTIFIER as att_uuid, 
        c1.ZTITLE1 as title, c1.ZSNIPPET as snippet, c1.ZIDENTIFIER as noteID, 
        c1.ZCREATIONDATE1 as created, c1.ZLASTVIEWEDMODIFICATIONDATE, c1.ZMODIFICATIONDATE1 as modified,
        c2.ZACCOUNT3, c2.ZTITLE2 as folderName, c2.ZIDENTIFIER as folderID, 
        c5.ZNAME as acc_name, c5.ZIDENTIFIER as acc_identifier, c5.ZACCOUNTTYPE, 
        c3.ZSUMMARY, c3.ZTITLE, c3.ZURLSTRING, c3.ZTYPEUTI  FROM ZICNOTEDATA as n 
        LEFT JOIN ZICCLOUDSYNCINGOBJECT as c1 ON c1.ZNOTEDATA = n.Z_PK 
        LEFT JOIN ZICCLOUDSYNCINGOBJECT as c2 ON c2.Z_PK = c1.ZFOLDER 
        LEFT JOIN ZICCLOUDSYNCINGOBJECT as c3 ON c3.ZNOTE= n.ZNOTE 
        LEFT JOIN ZICCLOUDSYNCINGOBJECT as c4 ON c4.ZATTACHMENT1= c3.Z_PK 
        LEFT JOIN ZICCLOUDSYNCINGOBJECT as c5 ON c5.Z_PK = c1.ZACCOUNT2 
        ORDER BY note_id
        """
        query_2 = \
        """
        SELECT n.Z_PK, n.ZNOTE as note_id, n.ZDATA as data, c1.ZISPASSWORDPROTECTED as encrypted, c1.ZPASSWORDHINT, 
        c3.ZFILESIZE,  c4.ZFILENAME, c4.ZIDENTIFIER as att_uuid,  
        c1.ZTITLE1 as title, c1.ZSNIPPET as snippet, c1.ZIDENTIFIER as noteID, 
        c1.ZCREATIONDATE1 as created, c1.ZLASTVIEWEDMODIFICATIONDATE, c1.ZMODIFICATIONDATE1 as modified,
        c2.ZACCOUNT4, c2.ZTITLE2 as folderName, c2.ZIDENTIFIER as folderID, 
        c5.ZNAME as acc_name, c5.ZIDENTIFIER as acc_identifier, c5.ZACCOUNTTYPE,  
        c3.ZSUMMARY, c3.ZTITLE, c3.ZURLSTRING, c3.ZTYPEUTI  FROM ZICNOTEDATA as n 
        LEFT JOIN ZICCLOUDSYNCINGOBJECT as c1 ON c1.ZNOTEDATA = n.Z_PK 
        LEFT JOIN ZICCLOUDSYNCINGOBJECT as c2 ON c2.Z_PK = c1.ZFOLDER 
        LEFT JOIN ZICCLOUDSYNCINGOBJECT as c3 ON c3.ZNOTE= n.ZNOTE 
        LEFT JOIN ZICCLOUDSYNCINGOBJECT as c4 ON c4.ZATTACHMENT1= c3.Z_PK 
        LEFT JOIN ZICCLOUDSYNCINGOBJECT as c5 ON c5.Z_PK = c1.ZACCOUNT3   
        ORDER BY note_id
        """
        if CommonFunctions.ColumnExists(db, 'ZICCLOUDSYNCINGOBJECT',
                                        'ZACCOUNT4'):
            query = query_2
        else:
            query = query_1

        # ZACCOUNTTYPE - 1=iCloud, 3=local
        db.row_factory = sqlite3.Row
        cursor = db.execute(query)
        for row in cursor:
            try:
                att_path = ''
                if row['encrypted']:
                    text_content = ''
                    pw_hint = row['ZPASSWORDHINT']
                else:
                    pw_hint = ''
                    data = GetUncompressedData(row['data'])
                    text_content = ProcessNoteBodyBlob(data)
                if row['att_uuid'] != None:
                    try:
                        if is_ios:
                            base_path, _ = os.path.split(source)
                            att_path = base_path + '/Accounts/' + row[
                                'acc_identifier'] + '/Media/' + row[
                                    'att_uuid'] + '/' + (
                                        row['ZFILENAME'] if row['ZFILENAME']
                                        is not None else row['att_uuid'])
                        elif user:
                            att_path = '/Users/' + user + '/Library/Group Containers/group.com.apple.notes/Media/' + row[
                                'att_uuid'] + '/' + (
                                    row['ZFILENAME'] if row['ZFILENAME']
                                    is not None else row['att_uuid'])
                        else:
                            att_path = 'Media/' + row['att_uuid'] + '/' + (
                                row['ZFILENAME'] if row['ZFILENAME']
                                is not None else row['att_uuid'])
                    except TypeError as ex:
                        log.error('Error computing att path for row ' +
                                  str(row['note_id']) + ' Error was ' +
                                  str(ex))

                note = Note(
                    row['note_id'], row['folderName'], row['title'],
                    row['snippet'], text_content, row['att_uuid'], att_path,
                    row['acc_name'], row['acc_identifier'], '',
                    CommonFunctions.ReadMacAbsoluteTime(row['created']),
                    CommonFunctions.ReadMacAbsoluteTime(row['modified']),
                    'NoteStore', row['encrypted'], pw_hint, user, source,
                    row['ZTYPEUTI'], row['ZSUMMARY'], row['ZURLSTRING'],
                    row['ZTITLE'])
                notes.append(note)
            except sqlite3.Error:
                log.exception('Error fetching row data')
    except sqlite3.Error:
        log.exception('Query  execution failed. Query was: ' + query)