# -*- coding: utf-8 -*-
"""This file contains a class for managing digest hashers for Plaso."""
[docs]
class HashersManager(object):
"""Class that implements the hashers manager."""
_hasher_classes = {}
[docs]
@classmethod
def DeregisterHasher(cls, hasher_class):
"""Deregisters a hasher class.
The hasher classes are identified based on their lower case name.
Args:
hasher_class (type): class object of the hasher.
Raises:
KeyError: if hasher class is not set for the corresponding name.
"""
hasher_name = hasher_class.NAME.lower()
if hasher_name not in cls._hasher_classes:
raise KeyError(f'hasher class not set for name: {hasher_class.NAME:s}.')
del cls._hasher_classes[hasher_name]
[docs]
@classmethod
def GetHasherNamesFromString(cls, hasher_names_string):
"""Retrieves a list of a hasher names from a comma separated string.
Takes a string of comma separated hasher names transforms it to a list of
hasher names.
Args:
hasher_names_string (str): comma separated names of hashers to enable,
the string 'all' to enable all hashers or 'none' to disable all
hashers.
Returns:
list[str]: names of valid hashers from the string, or an empty list if no
valid names are found.
"""
hasher_names = []
if not hasher_names_string or hasher_names_string.strip() == 'none':
return hasher_names
if hasher_names_string.strip() == 'all':
return cls.GetHasherNames()
for hasher_name in hasher_names_string.split(','):
hasher_name = hasher_name.strip()
if not hasher_name:
continue
hasher_name = hasher_name.lower()
if hasher_name in cls._hasher_classes:
hasher_names.append(hasher_name)
return hasher_names
[docs]
@classmethod
def GetHasherNames(cls):
"""Retrieves the names of all loaded hashers.
Returns:
list[str]: hasher names.
"""
return cls._hasher_classes.keys()
[docs]
@classmethod
def GetHasher(cls, hasher_name):
"""Retrieves an instance of a specific hasher.
Args:
hasher_name (str): the name of the hasher to retrieve.
Returns:
BaseHasher: hasher.
Raises:
KeyError: if hasher class is not set for the corresponding name.
"""
hasher_name = hasher_name.lower()
if hasher_name not in cls._hasher_classes:
raise KeyError(f'hasher class not set for name: {hasher_name:s}.')
hasher_class = cls._hasher_classes[hasher_name]
return hasher_class()
[docs]
@classmethod
def GetHashers(cls, hasher_names):
"""Retrieves instances for all the specified hashers.
Args:
hasher_names (list[str]): names of the hashers to retrieve.
Returns:
list[BaseHasher]: hashers.
"""
hashers = []
for hasher_name, hasher_class in cls._hasher_classes.items():
if hasher_name in hasher_names:
hashers.append(hasher_class())
return hashers
[docs]
@classmethod
def GetHasherClasses(cls, hasher_names=None):
"""Retrieves the registered hashers.
Args:
hasher_names (list[str]): names of the hashers to retrieve.
Yields:
tuple: containing:
str: parser name
type: next hasher class.
"""
for hasher_name, hasher_class in cls._hasher_classes.items():
if not hasher_names or hasher_name in hasher_names:
yield hasher_name, hasher_class
[docs]
@classmethod
def RegisterHasher(cls, hasher_class):
"""Registers a hasher class.
The hasher classes are identified based on their lower case name.
Args:
hasher_class (type): class object of the hasher.
Raises:
KeyError: if hasher class is already set for the corresponding name.
"""
hasher_name = hasher_class.NAME.lower()
if hasher_name in cls._hasher_classes:
raise KeyError(
f'hasher class already set for name: {hasher_class.NAME:s}.')
cls._hasher_classes[hasher_name] = hasher_class