예제 #1
0
 def _generate_file_tree(self, root_uid: str, uid: str, whitelist: List[str]) -> FileTreeNode:
     root = FileTreeNode(None)
     with ConnectTo(FrontEndDbInterface, self._config) as sc:
         child_uids = [
             child_uid
             for child_uid in sc.get_specific_fields_of_db_entry(uid, {'files_included': 1})['files_included']
             if whitelist is None or child_uid in whitelist
         ]
         for node in sc.generate_file_tree_nodes_for_uid_list(child_uids, root_uid or uid, whitelist):
             root.add_child_node(node)
     return root
예제 #2
0
 def _generate_exclusive_files_tree(self, exclusive_files, root_uid, uid):
     root = FileTreeNode(None)
     with ConnectTo(FrontEndDbInterface, self._config) as sc:
         child_uids = sc.get_specific_fields_of_db_entry(
             uid, {'files_included': 1})['files_included']
         for child_uid in child_uids:
             if not exclusive_files or child_uid in exclusive_files:
                 for node in sc.generate_file_tree_node(
                         child_uid, root_uid, whitelist=exclusive_files):
                     root.add_child_node(node)
     return root
예제 #3
0
 def get_node_for_virtual_file(self, current_virtual_path, fo_data,
                               root_uid, uid, whitelist):
     node = FileTreeNode(uid=None,
                         root_uid=root_uid,
                         virtual=True,
                         name=current_virtual_path.pop(0))
     for child_node in self.generate_file_tree_node(
             uid,
             root_uid,
             current_virtual_path=current_virtual_path,
             fo_data=fo_data,
             whitelist=whitelist):
         node.add_child_node(child_node)
     return node
예제 #4
0
 def _ajax_get_tree_children(self, uid, root_uid=None, compare_id=None):
     exclusive_files = self._get_exclusive_files(compare_id, root_uid)
     children = []
     root = FileTreeNode(None)
     with ConnectTo(FrontEndDbInterface, self._config) as sc:
         child_uids = sc.get_specific_fields_of_db_entry(
             uid, {'files_included': 1})['files_included']
         for child_uid in child_uids:
             if not exclusive_files or child_uid in exclusive_files:
                 for node in sc.generate_file_tree_node(
                         child_uid, root_uid, whitelist=exclusive_files):
                     root.add_child_node(node)
     for child_node in root.get_list_of_child_nodes():
         child = self._generate_jstree_node(child_node)
         children.append(child)
     return jsonify(children)
예제 #5
0
 def generate_file_tree_level(self, uid, root_uid, whitelist=None, fo_data=None):
     if fo_data is None:
         fo_data = self.get_specific_fields_of_db_entry({'_id': uid}, VirtualPathFileTree.FO_DATA_FIELDS)
     try:
         for node in VirtualPathFileTree(root_uid, fo_data, whitelist).get_file_tree_nodes():
             yield node
     except (KeyError, TypeError):  # the requested data is not in the DB aka the file has not been analyzed yet
         yield FileTreeNode(uid, root_uid, not_analyzed=True, name='{uid} (not analyzed yet)'.format(uid=uid))
예제 #6
0
 def get_node_for_real_file(self, current_virtual_path, fo_data, root_uid,
                            uid, whitelist):
     mime_type = fo_data['processed_analysis'].get(
         'file_type', {}).get('mime') or 'file-type-plugin/not-run-yet'
     return FileTreeNode(uid,
                         root_uid=root_uid,
                         virtual=False,
                         name=self._get_file_name(current_virtual_path,
                                                  fo_data),
                         size=fo_data['size'],
                         mime_type=mime_type,
                         has_children=self._has_children(
                             fo_data, whitelist))
예제 #7
0
 def generate_file_tree_node(self, uid, root_uid, current_virtual_path=None, fo_data=None, whitelist=None):
     required_fields = {'virtual_file_path': 1, 'files_included': 1, 'file_name': 1, 'size': 1, 'processed_analysis.file_type.mime': 1, '_id': 1}
     if fo_data is None:
         fo_data = self.get_specific_fields_of_db_entry({'_id': uid}, required_fields)
     try:
         if root_uid not in fo_data['virtual_file_path']:  # file tree for a file object (instead of a firmware)
             fo_data['virtual_file_path'] = get_partial_virtual_path(fo_data['virtual_file_path'], root_uid)
         if current_virtual_path is None:
             for entry in fo_data['virtual_file_path'][root_uid]:  # the same file may occur several times with different virtual paths
                 current_virtual_path = entry.split('/')[1:]
                 yield self._create_node_from_virtual_path(uid, root_uid, current_virtual_path, fo_data, whitelist)
         else:
             yield self._create_node_from_virtual_path(uid, root_uid, current_virtual_path, fo_data, whitelist)
     except Exception:  # the requested data is not present in the DB aka the file has not been analyzed yet
         yield FileTreeNode(uid=uid, root_uid=root_uid, not_analyzed=True, name='{} (not analyzed yet)'.format(uid))
예제 #8
0
 def _create_node_from_virtual_path(self, uid, root_uid, current_virtual_path, fo_data, whitelist=None):
     if len(current_virtual_path) > 1:  # in the middle of a virtual file path
         node = FileTreeNode(uid=None, root_uid=root_uid, virtual=True, name=current_virtual_path.pop(0))
         for child_node in self.generate_file_tree_node(uid, root_uid, current_virtual_path=current_virtual_path, fo_data=fo_data, whitelist=whitelist):
             node.add_child_node(child_node)
     else:  # at the end of a virtual path aka a 'real' file
         if whitelist:
             has_children = any(f in fo_data['files_included'] for f in whitelist)
         else:
             has_children = fo_data['files_included'] != []
         mime_type = fo_data['processed_analysis']['file_type']['mime'] if 'file_type' in fo_data['processed_analysis'] else 'file-type-plugin/not-run-yet'
         node = FileTreeNode(uid, root_uid=root_uid, virtual=False, name=fo_data['file_name'], size=fo_data['size'], mime_type=mime_type, has_children=has_children)
     return node
예제 #9
0
    def test_node_merging(self):
        parent_node = FileTreeNode('123',
                                   virtual=False,
                                   name='parent',
                                   size=1,
                                   mime_type='somefile')
        child_node_folder_1 = FileTreeNode(None, virtual=True, name='folder')
        child_node_folder_2 = FileTreeNode(None, virtual=True, name='folder')
        child_node_file_1 = FileTreeNode('abc', virtual=False, name='file_1')
        child_node_file_2 = FileTreeNode('def', virtual=False, name='file_2')
        child_node_folder_1.add_child_node(child_node_file_1)
        child_node_folder_2.add_child_node(child_node_file_2)
        parent_node.add_child_node(child_node_folder_1)
        parent_node.add_child_node(child_node_folder_2)

        assert parent_node.has_children
        assert len(parent_node.get_list_of_child_nodes()) == 1
        assert list(
            parent_node.children.keys()) == [child_node_folder_1.get_id()]
        assert child_node_folder_1 in parent_node
        assert child_node_folder_2 in parent_node
        assert len(parent_node.children[
            child_node_folder_1.get_id()].get_list_of_child_nodes()) == 2
        folder_id = child_node_folder_1.get_id()
        assert child_node_file_1 in parent_node.children[folder_id]
        assert child_node_file_2 in parent_node.children[folder_id]
예제 #10
0
    def test_node_creation(self):
        parent_node = FileTreeNode('123',
                                   virtual=False,
                                   name='parent',
                                   size=1,
                                   mime_type='somefile')
        child_node = FileTreeNode('456',
                                  root_uid='123',
                                  virtual=True,
                                  name='child')
        parent_node.add_child_node(child_node)

        assert parent_node.uid == '123'
        assert parent_node.root_uid is None
        assert child_node.root_uid == '123'
        assert not parent_node.virtual
        assert parent_node.size == 1
        assert parent_node.type == 'somefile'
        assert parent_node.has_children
        assert parent_node.get_list_of_child_nodes() == [child_node]
        assert parent_node.get_id() == ('parent', False)
        assert list(parent_node.children.keys()) == [child_node.get_id()]
        assert parent_node.get_names_of_children() == [child_node.name]
        assert not child_node.has_children
        assert child_node in parent_node
        assert 'Node ' in parent_node.__repr__()
        assert parent_node != child_node
        assert parent_node.print_tree() is None
예제 #11
0
    def test_node_merging(self):
        parent_node = FileTreeNode('123',
                                   virtual=False,
                                   name='parent',
                                   size=1,
                                   mime_type='somefile')
        child_node_folder_1 = FileTreeNode(None, virtual=True, name='folder')
        child_node_folder_2 = FileTreeNode(None, virtual=True, name='folder')
        child_node_file_1 = FileTreeNode('abc', virtual=False, name='file_1')
        child_node_file_2 = FileTreeNode('def', virtual=False, name='file_2')
        child_node_folder_1.add_child_node(child_node_file_1)
        child_node_folder_2.add_child_node(child_node_file_2)
        parent_node.add_child_node(child_node_folder_1)
        parent_node.add_child_node(child_node_folder_2)

        self.assertTrue(parent_node.has_children)
        self.assertEqual(len(parent_node.get_list_of_child_nodes()), 1)
        self.assertEqual(list(parent_node.children.keys()),
                         [child_node_folder_1.get_id()])
        self.assertTrue(child_node_folder_1 in parent_node)
        self.assertTrue(child_node_folder_2 in parent_node)
        self.assertEqual(
            len(parent_node.children[
                child_node_folder_1.get_id()].get_list_of_child_nodes()), 2)
        folder_id = child_node_folder_1.get_id()
        self.assertTrue(child_node_file_1 in parent_node.children[folder_id])
        self.assertTrue(child_node_file_2 in parent_node.children[folder_id])
예제 #12
0
    def test_node_creation(self):
        parent_node = FileTreeNode('123',
                                   virtual=False,
                                   name='parent',
                                   size=1,
                                   mime_type='somefile')
        child_node = FileTreeNode('456',
                                  root_uid='123',
                                  virtual=True,
                                  name='child')
        parent_node.add_child_node(child_node)

        self.assertEqual(parent_node.uid, '123')
        self.assertEqual(parent_node.root_uid, None)
        self.assertEqual(child_node.root_uid, '123')
        self.assertFalse(parent_node.virtual)
        self.assertEqual(parent_node.size, 1)
        self.assertEqual(parent_node.type, 'somefile')
        self.assertTrue(parent_node.has_children)
        self.assertEqual(parent_node.get_list_of_child_nodes(), [child_node])
        self.assertEqual(parent_node.get_id(), ('parent', False))
        self.assertEqual(list(parent_node.children.keys()),
                         [child_node.get_id()])
        self.assertEqual(parent_node.get_names_of_children(),
                         [child_node.name])
        self.assertFalse(child_node.has_children)
        self.assertTrue(child_node in parent_node)
        assert 'Node ' in parent_node.__repr__()
        self.assertNotEqual(parent_node, child_node)
        assert parent_node.print_tree() is None
예제 #13
0
    def test_node_creation(self):
        parent_node = FileTreeNode("123", False, "parent", 1, "somefile")
        child_node = FileTreeNode("456", True, "child")
        parent_node.add_child_node(child_node)

        self.assertEqual(parent_node.uid, "123")
        self.assertFalse(parent_node.virtual)
        self.assertEqual(parent_node.size, 1)
        self.assertEqual(parent_node.type, "somefile")
        self.assertTrue(parent_node.has_children)
        self.assertEqual(parent_node.get_list_of_child_nodes(), [child_node])
        self.assertEqual(parent_node.get_id(), ("parent", False))
        self.assertEqual(list(parent_node.children.keys()), [child_node.get_id()])
        self.assertEqual(parent_node.get_names_of_children(), [child_node.name])
        self.assertFalse(child_node.has_children)
        self.assertTrue(child_node in parent_node)
        self.assertTrue(parent_node, FileTreeNode("123", False, "parent", 1, "somefile"))
예제 #14
0
    def test_node_merging(self):
        parent_node = FileTreeNode("123", False, "parent", 1, "somefile")
        child_node_folder_1 = FileTreeNode(None, True, "folder")
        child_node_folder_2 = FileTreeNode(None, True, "folder")
        child_node_file_1 = FileTreeNode("abc", False, "file_1")
        child_node_file_2 = FileTreeNode("def", False, "file_2")
        child_node_folder_1.add_child_node(child_node_file_1)
        child_node_folder_2.add_child_node(child_node_file_2)
        parent_node.add_child_node(child_node_folder_1)
        parent_node.add_child_node(child_node_folder_2)

        self.assertTrue(parent_node.has_children)
        self.assertEqual(len(parent_node.get_list_of_child_nodes()), 1)
        self.assertEqual(list(parent_node.children.keys()), [child_node_folder_1.get_id()])
        self.assertTrue(child_node_folder_1 in parent_node)
        self.assertTrue(child_node_folder_2 in parent_node)
        self.assertEqual(len(parent_node.children[child_node_folder_1.get_id()].get_list_of_child_nodes()), 2)
        folder_id = child_node_folder_1.get_id()
        self.assertTrue(child_node_file_1 in parent_node.children[folder_id])
        self.assertTrue(child_node_file_2 in parent_node.children[folder_id])