def get_or_create_summary(sid, results, user_classification, completed): user_classification = CLASSIFICATION.normalize_classification(user_classification, long_format=False) cache_key = f"{sid}_{user_classification}_with_sections" for illegal_char in [" ", ":", "/"]: cache_key = cache_key.replace(illegal_char, "") summary_cache = STORAGE.submission_summary.get_if_exists(cache_key, as_obj=False) if not summary_cache: summary = STORAGE.get_summary_from_keys( results, cl_engine=CLASSIFICATION, user_classification=user_classification, keep_heuristic_sections=True) expiry = now_as_iso(config.datastore.ilm.days_until_archive * 24 * 60 * 60) partial = not completed or "missing_results" in summary or "missing_files" in summary # Do not cache partial summary if not partial: summary_cache = { "attack_matrix": json.dumps(summary['attack_matrix']), "tags": json.dumps(summary['tags']), "expiry_ts": expiry, "heuristics": json.dumps(summary['heuristics']), "classification": summary['classification'], "filtered": summary["filtered"], "heuristic_sections": json.dumps(summary['heuristic_sections']), "heuristic_name_map": json.dumps(summary['heuristic_name_map']) } STORAGE.submission_summary.save(cache_key, summary_cache) return { "attack_matrix": summary['attack_matrix'], "tags": summary['tags'], "expiry_ts": expiry, "heuristics": summary['heuristics'], "classification": summary['classification'], "filtered": summary["filtered"], "partial": partial, "heuristic_sections": summary['heuristic_sections'], "heuristic_name_map": summary['heuristic_name_map'] } return { "attack_matrix": json.loads(summary_cache['attack_matrix']), "tags": json.loads(summary_cache['tags']), "expiry_ts": summary_cache["expiry_ts"], "heuristics": json.loads(summary_cache['heuristics']), "classification": summary_cache['classification'], "filtered": summary_cache["filtered"], "partial": False, "heuristic_sections": json.loads(summary_cache['heuristic_sections']), "heuristic_name_map": json.loads(summary_cache['heuristic_name_map']) }
def get_or_create_summary(sid, results, user_classification): cache_key = f"{sid}_{CLASSIFICATION.normalize_classification(user_classification, long_format=False)}" for illegal_char in [" ", ":", "/"]: cache_key = cache_key.replace(illegal_char, "") summary_cache = STORAGE.submission_summary.get_if_exists(cache_key, as_obj=False) if not summary_cache: summary = STORAGE.get_summary_from_keys( results, cl_engine=CLASSIFICATION, user_classification=user_classification) expiry = now_as_iso(config.datastore.ilm.days_until_archive * 24 * 60 * 60) # Do not cache summaries that have errors... if "missing_results" not in summary and "missing_files" not in summary: summary_cache = { "attack_matrix": json.dumps(summary['attack_matrix']), "tags": json.dumps(summary['tags']), "expiry_ts": expiry, "heuristics": json.dumps(summary['heuristics']), "classification": summary['classification'], "filtered": summary["filtered"] } STORAGE.submission_summary.save(cache_key, summary_cache) return { "attack_matrix": summary['attack_matrix'], "tags": summary['tags'], "expiry_ts": expiry, "heuristics": summary['heuristics'], "classification": summary['classification'], "filtered": summary["filtered"], "partial": "missing_results" in summary or "missing_files" in summary } return { "attack_matrix": json.loads(summary_cache['attack_matrix']), "tags": json.loads(summary_cache['tags']), "expiry_ts": summary_cache["expiry_ts"], "heuristics": json.loads(summary_cache['heuristics']), "classification": summary_cache['classification'], "filtered": summary_cache["filtered"], "partial": False }