mirror of
https://github.com/volatilityfoundation/volatility3.git
synced 2026-08-21 05:52:22 +02:00
72 lines
2.5 KiB
Python
72 lines
2.5 KiB
Python
import hashlib
|
|
import json
|
|
import logging
|
|
import os
|
|
|
|
from volatility.framework import constants
|
|
|
|
vollog = logging.getLogger(__name__)
|
|
|
|
cached_validation_filepath = os.path.join(constants.CACHE_PATH, "valid_isf.cache")
|
|
|
|
|
|
def load_cached_validations():
|
|
"""Loads up the list of successfully cached json objects, so we don't need to revalidate them"""
|
|
validhashes = set()
|
|
if os.path.exists(cached_validation_filepath):
|
|
with open(cached_validation_filepath, "r") as f:
|
|
validhashes.update(json.load(f))
|
|
return validhashes
|
|
|
|
|
|
def record_cached_validations(validations):
|
|
"""Record the cached validations, so we don't need to revalidate them in future"""
|
|
with open(cached_validation_filepath, "w") as f:
|
|
json.dump(list(validations), f)
|
|
|
|
|
|
cached_validations = load_cached_validations()
|
|
|
|
|
|
def validate(input, use_cache = True):
|
|
"""Validates an input JSON file based upon """
|
|
format = input.get('metadata', {}).get('format', None)
|
|
if not format:
|
|
vollog.debug("No schema format defined")
|
|
return False
|
|
basepath = os.path.abspath(os.path.dirname(__file__))
|
|
schema_path = os.path.join(basepath, 'schema-' + format + '.json')
|
|
if not os.path.exists(schema_path):
|
|
vollog.debug("Schema for format not found: {}".format(schema_path))
|
|
return False
|
|
with open(schema_path, 'r') as s:
|
|
schema = json.load(s)
|
|
return valid(input, schema, use_cache)
|
|
|
|
|
|
def create_json_hash(input, schema):
|
|
"""Constructs the hash of the input and schema to create a unique indentifier for a particular JSON file"""
|
|
return hashlib.sha1(bytes(json.dumps((input, schema), sort_keys = True), 'utf-8')).hexdigest()
|
|
|
|
|
|
def valid(input, schema, use_cache = True):
|
|
"""Validates a json schema"""
|
|
input_hash = create_json_hash(input, schema)
|
|
if input_hash in cached_validations and use_cache:
|
|
return True
|
|
try:
|
|
import jsonschema
|
|
vollog.debug("Validating JSON against schema...")
|
|
jsonschema.validate(input, schema)
|
|
cached_validations.add(input_hash)
|
|
vollog.debug("JSON validated against schema (result cached)")
|
|
except ImportError:
|
|
vollog.info("Dependency for validation unavailable: jsonschema")
|
|
vollog.debug("All validations will report success, even with malformed input")
|
|
return True
|
|
except:
|
|
vollog.debug("Schema validation error", exc_info = True)
|
|
return False
|
|
record_cached_validations(cached_validations)
|
|
return True
|