From cf3594f46545c44bdc2cc50fbdafecd1d86980b2 Mon Sep 17 00:00:00 2001
From: Gioacchino Vino <gioacchino.vino@infn.it>
Date: Mon, 29 Apr 2024 13:15:34 +0200
Subject: [PATCH] Added logic accepted/know issues during oid validation

---
 files/gvm_library.py |  6 ++++--
 files/scan.py        |  6 +++---
 files/utilities.py   | 26 +++++++++++++++++++++++++-
 3 files changed, 32 insertions(+), 6 deletions(-)

diff --git a/files/gvm_library.py b/files/gvm_library.py
index 4dfd993..95cdee2 100644
--- a/files/gvm_library.py
+++ b/files/gvm_library.py
@@ -447,7 +447,9 @@ class Task:
         with open(filename, "wb") as fh:
             fh.write(base64.b64decode(code))
             
-    def get_report_info(self, issues_to_drop: List[str]) -> Dict:
+    def get_report_info(self,
+                        accepted_issues: List[str],
+                        known_issues: List[str]) -> Dict:
         report = dict()
         res = self.client.get_report(self.report_id,
                                      report_format_id=ReportFormats.anonymous_xml,
@@ -462,7 +464,7 @@ class Task:
         glob_threat = 'None'
         for o, s, t, p in zip(o_ids, severities, treats, ports):
             logging.debug(f"Detected oid: {o}, severity: {s}, threat: {t} and port: {p}")
-            if o in issues_to_drop: 
+            if (o not in accepted_issues) and (o in known_issues):
                 logging.debug(f"Dropped issue {o}") 
                 continue
             if p in report:
diff --git a/files/scan.py b/files/scan.py
index b9e9c0b..7e41fae 100644
--- a/files/scan.py
+++ b/files/scan.py
@@ -5,7 +5,7 @@ import json
 import os
 from gvm_library import GVMClient, ReportFormats, GvmException, pretty_json
 from gvm_library import PortList, Task, Target
-from utilities import import_dep_info, process_global_reports_info, read_not_relevant_issues
+from utilities import import_dep_info, process_global_reports_info, read_issues
 import argparse
 
 ### GVM Options ###
@@ -79,7 +79,7 @@ gvm = GVMClient(auth_n = auth_name, auth_p = auth_passwd)
 logging.info(f"gvm version: {gvm.get_version()}")
 
 # Retrieve issues irrelevant for INFN
-issues_to_drop = read_not_relevant_issues()
+accepted_issues, known_issues = read_issues()
 
 tasks = list()
 targets = list()
@@ -124,7 +124,7 @@ for host,ports in endpoints.items():
                          filename = f"{report_filename}.pdf")
         task.save_report(format = ReportFormats.txt, 
                          filename = f"{report_filename}.txt")
-        reports[host] = task.get_report_info(issues_to_drop)
+        reports[host] = task.get_report_info(accepted_issues, known_issues)
     else:
         reports[host] = {'global': {"severity": -1, "threat": f"Scan Error. task.id: {task.id}"} }
 
diff --git a/files/utilities.py b/files/utilities.py
index a6c7d6e..a5e1174 100644
--- a/files/utilities.py
+++ b/files/utilities.py
@@ -1,6 +1,6 @@
 import json
 import logging
-from typing import Dict, List
+from typing import Dict, List, Tuple
 import git
 import os
 
@@ -74,4 +74,28 @@ def read_not_relevant_issues() -> List[str]:
     with open(file_path, 'r') as file:
         return [line.strip() for line in file.readlines() if not line.startswith('#')]
     
+def read_issues() -> Tuple[List[str],List[str]]:
+    git_sec_user = os.environ.get("GIT_SEC_USER")
+    git_sec_token = os.environ.get("GIT_SEC_TOKEN")
+    git_repo = "baltig.infn.it/infn-cloud/security-scans.git"
+    repo_url = f"https://{git_sec_user}:{git_sec_token}@{git_repo}"
+    destination_folder = 'repo'
+    git.Repo.clone_from(repo_url, destination_folder)
+
+    accepted_file_paths = ['repo/queues/accepted.txt']
+    known_file_path = ['repo/queues/held.txt',
+                       'repo/queues/new.txt',
+                       'repo/queues/overridden.txt']
+    accepted_issues = []
+    known_issues = []
+
+    for f in accepted_file_paths:
+        with open(f, 'r') as file:
+            accepted_issues += [line.strip() for line in file.readlines()
+                                    if not line.startswith('#')]
+    for f in known_file_path:
+        with open(f, 'r') as file:
+            known_issues += [line.strip() for line in file.readlines()
+                                    if not line.startswith('#')]
+    return accepted_issues, known_issues
     
\ No newline at end of file
-- 
GitLab