Source code for CveXplore.database.helpers.generic_db

"""
Generic database functions
==========================
"""
import re

from CveXplore.common.db_mapping import database_mapping
from CveXplore.common.data_source_connection import DatasourceConnection


[docs]class GenericDatabaseFactory(DatasourceConnection): """ The GenericDatabaseFactory handles the creation of general, collection based, functions which provide an instance of CveXplore functions that apply to the given collection. """
[docs] def __init__(self, collection): """ Create a new GenericDatabaseFactory and create field specific functions based on the __default_fields and the __fields_mapping. :param collection: Collection to create the functions for :type collection: str """ super().__init__(collection=collection) self.__database_mapping = database_mapping self.__default_fields = ["id"] self.__fields_mapping = { "capec": [ "name", "summary", "prerequisites", "solutions", "loa", "typical_severity", ], "cpe": ["title", "cpe_2_2", "vendor", "product"], "cwe": ["name", "status", "Description"], "via4": ["name"], "cves": [ "cvss", "cvss3", "summary", "vendors", "products", "last-modified", "Modified", "Published", ], } total_fields_list = ( self.__default_fields + self.__fields_mapping[self._collection] ) for field in total_fields_list: setattr( self, field, GenericDatabaseFieldsFunctions( field=field, collection=self._collection ), )
[docs] def get_by_id(self, id): """ Method to fetch a specific collection entry via it's id number :param id: Id number :type id: str :return: Requested data or None :rtype: object """ if not isinstance(id, str): try: id = str(id) except ValueError: return "Provided value is not a string nor can it be cast to one" return self._datasource_collection_connection.find_one({"id": id})
[docs] def __repr__(self): """ String representation of object """ return "<< GenericDatabaseFactory:{} >>".format(self._collection)
[docs]class GenericDatabaseFieldsFunctions(DatasourceConnection): """ The GenericDatabaseFieldsFunctions handles the creation of general, field based, functions """
[docs] def __init__(self, field, collection): """ Create a new GenericDatabaseFieldsFunctions and create field specific functions. :param field: Field name :type field: str :param collection: Collection to create the field functions for :type collection: str """ super().__init__(collection=collection) self.__field = field
[docs] def search(self, value): """ Method for searching for a given value. The value shall be converted to a regex. :param value: Search for value :type value: str :return: Data or None :rtype: object """ regex = re.compile(value, re.IGNORECASE) query = {self.__field: {"$regex": regex}} return self._datasource_collection_connection.find(query)
[docs] def find(self, value=None): """ Method to find a given value. :param value: Find a value :type value: str :return: Data or None :rtype: object """ if value is not None: query = {self.__field: value} else: query = None return self._datasource_collection_connection.find(query)
[docs] def __repr__(self): """ String representation of object """ return "<< GenericDatabaseFieldsFunctions:{} >>".format(self._collection)