diff --git a/.gitmessage b/.gitmessage new file mode 100644 index 0000000..e5b9827 --- /dev/null +++ b/.gitmessage @@ -0,0 +1,5 @@ +[optional scope]: + +[optional body] + +[optional footer] \ No newline at end of file diff --git a/Database_Baseline.zip b/Database_Baseline.zip index c7e0512..575cd5f 100644 Binary files a/Database_Baseline.zip and b/Database_Baseline.zip differ diff --git a/Dockerfile b/Dockerfile index b395466..e6c1397 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM php:7.2.8-apache-stretch +FROM php:apache-stretch COPY conf/docker-php.ini /usr/local/etc/php/php.ini RUN apt update && apt -y install zlib1g-dev mysql-client RUN docker-php-ext-install mysqli zip diff --git a/README.pdf b/README.pdf index 344eee7..99f77c7 100644 Binary files a/README.pdf and b/README.pdf differ diff --git a/ajax.php b/ajax.php index 1875a6b..d0e859b 100644 --- a/ajax.php +++ b/ajax.php @@ -48,10 +48,14 @@ */ set_time_limit(0); +include_once 'vendor/autoload.php'; include_once 'config.inc'; include_once 'import.inc'; include_once 'helper.inc'; +use Monolog\Logger; +use Monolog\Handler\StreamHandler; + chdir(dirname(__FILE__)); $db = new db(); @@ -229,8 +233,10 @@ elseif ($action == 'get-cat-data') { $checklist = $db->get_Checklist_By_File($fname); if (isset($checklist[0])) { - $checklist[0]->type = ucfirst($checklist[0]->type); - print header(JSON) . json_encode($checklist[0]); + $chk = $checklist[0]; + + $chk->type = ucfirst($chk->type); + print header(JSON) . json_encode($chk); } else { print header(JSON) . json_encode(array('error' => 'Error finding checklist')); @@ -542,8 +548,7 @@ function sw_filter($is_os = false) 'table_joins' => [ "LEFT JOIN `sagacity`.`target_software` ts ON ts.`sft_id` = s.`id`" . ($tgt_id ? " AND ts.`tgt_id` = $tgt_id" : "") ], - 'order' => 's.cpe', - 'limit' => 25 + 'order' => 's.cpe' ]); $sw = $db->help->execute(); @@ -1482,9 +1487,11 @@ function get_hosts($cat_id = null) $ste_id = filter_input(INPUT_COOKIE, 'ste', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE); $tgts = []; + $exp_scan_srcs = null; if ($cat_id) { $ste_cat = $db->get_Category($cat_id)[0]; $tgts = $db->get_Target_By_Category($cat_id); + $exp_scan_srcs = $db->get_Expected_Category_Sources($ste_cat); } elseif (is_numeric($ste_id)) { $tgts = $db->get_Unassigned_Targets($ste_id); @@ -1494,13 +1501,8 @@ function get_hosts($cat_id = null) } foreach ($tgts as $tgt) { + /** @var target $tgt */ $chks = $db->get_Target_Checklists($tgt->get_ID()); - if ($cat_id) { - $exp_scan_srcs = $db->get_Expected_Category_Sources($ste_cat); - } - else { - $exp_scan_srcs = null; - } $scan_srcs = $db->get_Target_Scan_Sources($tgt, $exp_scan_srcs); $icons = []; $icon_str = ''; @@ -1518,18 +1520,20 @@ function get_hosts($cat_id = null) foreach ($icons as $icon => $data) { $icon_str .= ""; } - + foreach ($scan_srcs as $src) { - $icon = $src['src']->get_Icon(); - if($src['scan_error']) { - $icon = strtolower($src['src']->get_Name()) . "-failed.png"; + if(isset($src['src']) && is_a($src['src'], 'source')) { + $icon = $src['src']->get_Icon(); + if(isset($src['scan_error']) && $src['scan_error']) { + $icon = strtolower($src['src']->get_Name()) . "-failed.png"; + } + + $src_str .= "get_Name()}"; + if (isset($src['file_name']) && $src['file_name']) { + $src_str .= "\n{$src['file_name']}"; + } + $src_str .= "' class='checklist_image' />"; } - - $src_str .= "get_Name()}"; - if (isset($src['count']) && $src['count']) { - $src_str .= " ({$src['count']})"; - } - $src_str .= "' class='checklist_image' />"; } $ret['targets'][] = array_merge([ @@ -1552,8 +1556,8 @@ function get_hosts($cat_id = null) 'cat_1' => $tgt->getCat1Count(), 'cat_2' => $tgt->getCat2Count(), 'cat_3' => $tgt->getCat3Count(), - 'comp' => $tgt->getCompliantPercent(), - 'assessed' => $tgt->getAssessedPercent() + 'comp' => floatval(number_format($tgt->getCompliantPercent(), 6)), + 'assessed' => floatval(number_format($tgt->getAssessedPercent(), 6)) ]); } diff --git a/classes/checklist.inc b/classes/checklist.inc index 28a550d..966da27 100644 --- a/classes/checklist.inc +++ b/classes/checklist.inc @@ -21,6 +21,7 @@ * - May 13, 2017 - Added WindowsFirewall.jpg image for checklist * - May 19, 2017 - Fixed typo for WindowsFirewall * - Aug 23, 2017 - JO, Expanded checklist icons + * - Nov 6, 2018 - Deleted duplicate BIND 9 checklist icon entry */ /** @@ -545,9 +546,6 @@ class checklist case (preg_match("/Mobile Device/i", $this->name) ? true : false): $this->icon = 'mobile-device.jpg'; break; - case (preg_match("/BIND 9/i", $this->name) ? true : false): - $this->icon = 'BIND DNS.jpg'; - break; case (preg_match("/Remote Access/i", $this->name) ? true : false): $this->icon = 'remote-access.gif'; break; diff --git a/classes/finding.inc b/classes/finding.inc index 103cced..a488fd6 100644 --- a/classes/finding.inc +++ b/classes/finding.inc @@ -22,478 +22,539 @@ * - May 25, 2017 - Fixed bug of get_Category method returning empty severity (defaults to II if empty) * - Jan 10, 2018 - Formatting * - May 24, 2018 - Simplified get_Finding_Status_ID method + * - Nov 6, 2018 - Removed ID property to keep from duplicate findings */ /** * Represents a finding * * @author Ryan Prather - * + * */ -class finding { +class finding +{ - /** - * Finding ID - * - * @var integer - */ - protected $id = null; + /** + * Target ID + * + * @var integer + */ + protected $tgt_id = null; - /** - * Target ID - * - * @var integer - */ - protected $tgt_id = null; + /** + * PDI ID + * + * @var integer + */ + protected $pdi_id = null; - /** - * PDI ID - * - * @var integer - */ - protected $pdi_id = null; + /** + * Scan ID + * + * @var integer + */ + protected $scan_id = null; - /** - * Scan ID - * - * @var integer - */ - protected $scan_id = null; + /** + * Finding Status ID + * + * @var integer + */ + protected $finding_status_id = null; - /** - * Finding Status ID - * - * @var integer - */ - protected $finding_status_id = null; + /** + * Updated category for the finding + * + * @var int + */ + protected $cat = null; - /** - * Updated category for the finding - * - * @var int - */ - protected $cat = null; + /** + * Array of ia controls that apply to this finding + * + * @var array:string + */ + protected $ia_controls = array(); - /** - * Array of ia controls that apply to this finding - * - * @var array:string - */ - protected $ia_controls = array(); + /** + * Notes + * + * @var string + */ + protected $notes = null; - /** - * Notes - * - * @var string - */ - protected $notes = null; + /** + * Analyst Notes + * + * @var string + */ + protected $analyst_notes = null; - /** - * Change ID - * - * @var integer - */ - protected $change_id = null; + /** + * Scanner Notes + * + * @var string + */ + protected $scanner_notes = null; - /** - * Original source - * - * @var string - */ - protected $orig_src = null; + /** + * Change ID + * + * @var integer + */ + protected $change_id = null; - /** - * Finding iteration (incremented if finding is updated - * - * @var integer - */ - protected $finding_itr = null; + /** + * Original source + * + * @var string + */ + protected $orig_src = null; - /** - * Array of statuses - * - * @var array:string - */ - protected $STATUS = [ - 1 => 'Not Reviewed', - 2 => 'Not a Finding', - 3 => 'Open', - 4 => 'Not Applicable', - 5 => 'No Data', - 6 => 'Exception', - 7 => 'False Positive' - ]; + /** + * Finding iteration (incremented if finding is updated + * + * @var integer + */ + protected $finding_itr = null; - /** - * Constant for no change - * - * @var integer - */ - const NC = 0; + /** + * Array of statuses + * + * @var array:string + */ + protected $STATUS = [ + 1 => 'Not Reviewed', + 2 => 'Not a Finding', + 3 => 'Open', + 4 => 'Not Applicable', + 5 => 'No Data', + 6 => 'Exception', + 7 => 'False Positive' + ]; - /** - * Constant for change ID::TO_OPEN - * - * @var integer - */ - const TO_OPEN = 1; + /** + * Constant for no change + * + * @var integer + */ + const NC = 0; - /** - * Constant for change ID::TO_NF - * - * @var integer - */ - const TO_NF = 2; + /** + * Constant for change ID::TO_OPEN + * + * @var integer + */ + const TO_OPEN = 1; - /** - * Constant for change ID::TO_NA - * - * @var integer - */ - const TO_NA = 3; + /** + * Constant for change ID::TO_NF + * + * @var integer + */ + const TO_NF = 2; - /** - * Constructor - * - * @param integer $int_ID - * @param integer $int_Tgt_ID - * @param integer $int_PDI_ID - * @param integer $int_Scan_ID - * @param integer|string $Finding_Status - * @param string $str_Notes - * @param integer $int_Change_ID - * @param string $str_Orig_Src - * @param integer $int_Finding_Itr - */ - public function __construct($int_ID, $int_Tgt_ID, $int_PDI_ID, $int_Scan_ID, $Finding_Status, $str_Notes, $int_Change_ID, $str_Orig_Src, $int_Finding_Itr) { - $this->id = $int_ID; - $this->tgt_id = $int_Tgt_ID; - $this->pdi_id = $int_PDI_ID; - $this->scan_id = $int_Scan_ID; - if (is_numeric($Finding_Status)) { - $this->finding_status_id = $Finding_Status; - } - else { - $this->finding_status_id = $this->get_Finding_Status_ID($Finding_Status); - } - $this->notes = $str_Notes; - $this->change_id = $int_Change_ID; - $this->orig_src = $str_Orig_Src; - $this->finding_itr = $int_Finding_Itr; - } + /** + * Constant for change ID::TO_NA + * + * @var integer + */ + const TO_NA = 3; - /** - * Getter function for Finding ID - * - * @return integer - */ - public function get_ID() { - return $this->id; - } - - /** - * Getter function for target ID - * - * @return integer - */ - public function get_Tgt_ID() { - return $this->tgt_id; - } - - /** - * Setter function for target ID - * - * @param integer $int_Tgt_ID - */ - public function set_Tgt_ID($int_Tgt_ID) { - $this->tgt_id = $int_Tgt_ID; - } - - /** - * Getter function for PDI ID - * - * @return integer - */ - public function get_PDI_ID() { - return $this->pdi_id; - } - - /** - * Setter function for PDI ID - * - * @param integer $int_PDI_ID - */ - public function set_PDI_ID($int_PDI_ID) { - $this->pdi_id = $int_PDI_ID; - } - - /** - * Getter function for Scan ID - * - * @return integer - */ - public function get_Scan_ID() { - return $this->scan_id; - } - - /** - * Setter function for Scan ID - * - * @param integer $int_Scan_ID - */ - public function set_Scan_ID($int_Scan_ID) { - $this->scan_id = $int_Scan_ID; - } - - /** - * Getter function for Finding status ID - * - * @return integer - */ - public function get_Finding_Status() { - return $this->finding_status_id; - } - - /** - * Getter function for Finding status ID based on string - * - * @param string $status - * @return integer - */ - public function get_Finding_Status_ID($status) { - $arr_flip = array_flip($this->STATUS); - if(isset($arr_flip[$status])) { - return $arr_flip[$status]; - } - else { - return $arr_flip['Not Reviewed']; - } - } - - /** - * Getter function for finding status string - * - * @param integer $int_Status_ID - * @return string - */ - public function get_Finding_Status_String($int_Status_ID = null) { - if ($int_Status_ID) { - return $this->STATUS[$int_Status_ID]; - } - else { - return $this->STATUS[$this->finding_status_id]; - } - } - - /** - * Setter function for finding status - * - * @param integer $int_Finding_Status_ID - */ - public function set_Finding_Status($int_Finding_Status_ID) { - $this->finding_status_id = $int_Finding_Status_ID; - } - - /** - * Setter function for finding status - * - * @param string $str_New_Status - */ - public function set_Finding_Status_By_String($str_New_Status) { - $this->finding_status_id = $this->get_Finding_Status_ID($str_New_Status); - } - - /** - * Getter function for notes - * - * @return string - */ - public function get_Notes() { - return $this->notes; - } - - /** - * Setter function for notes - * - * @param string $str_Notes - */ - public function set_Notes($str_Notes) { - $this->notes = $str_Notes; - } - - /** - * Function to prepend notes to the existing list - * - * @param string $str_Notes - */ - public function prepend_Notes($str_Notes) { - $this->notes = $str_Notes . PHP_EOL . $this->notes; - } - - /** - * Function to append notes - * - * @param string $str_Notes - * @param boolean $merge - */ - public function append_Notes($str_Notes, $merge = false) { - $this->notes .= PHP_EOL . ($merge ? "(Merged Target)" . PHP_EOL : "") . $str_Notes; - } - - /** - * Getter function for change ID - * - * @return integer - */ - public function get_Change_ID() { - if ($this->change_id) { - return $this->change_id; - } - else { - return $this::NC; - } - } - - /** - * Setter function for change ID - * - * @param integer $int_Change_ID - */ - public function set_Change_ID($int_Change_ID) { - $this->change_id = $int_Change_ID; - } - - /** - * Getter function for original source - * - * @return string - */ - public function get_Original_Source() { - return $this->orig_src; - } - - /** - * Setter function for original source - * - * @param string $str_Original_Source - */ - public function set_Original_Source($str_Original_Source) { - $this->orig_src = $str_Original_Source; - } - - /** - * Getter function for finding iteration - * - * @return integer - */ - public function get_Finding_Iteration() { - return $this->finding_itr; - } - - /** - * Setter function for finding iteration - * - * @param integer $int_Finding_Iteration - */ - public function set_Finding_Iteration($int_Finding_Iteration) { - $this->finding_itr = $int_Finding_Iteration; - } - - /** - * Increment the finding count by 1 - */ - public function inc_Finding_Count() { - $this->finding_itr++; - } - - /** - * Getter function for deconflicted status - * - * @param string $str_New_Status - * @return string - */ - public function get_Deconflicted_Status($str_New_Status) { - // must get original status first! - return deconflict_status::$DECONFLICTED_STATUS[$this->get_Finding_Status_String()][$str_New_Status]; - } - - /** - * Getter function for category - * - * @return int - */ - public function get_Category() { - if (empty($this->cat)) { - return 2; - } - return $this->cat; - } - - /** - * Setter function for category - * - * @param mixed $cat_in - */ - public function set_Category($cat_in) { - if (is_numeric($cat_in)) { - $this->cat = $cat_in; - } - elseif (is_string($cat_in)) { - $this->cat = substr_count($cat_in, "I"); - } - } - - /** - * Getter function for IA controls - * - * @return array:string - */ - public function get_IA_Controls() { - return $this->ia_controls; - } - - /** - * Getter function for IA Controls - * - * @return string - */ - public function get_IA_Controls_String() { - return implode(" ", $this->ia_controls); - } - - /** - * Setter function for the IA Controls - * - * @param mixed $ia_controls_in - */ - public function set_IA_Controls($ia_controls_in) { - if (is_array($ia_controls_in)) { - $this->ia_controls = $ia_controls_in; - } - elseif (is_string($ia_controls_in)) { - $this->ia_controls = explode(" ", $ia_controls_in); - } - } - - /** - * Function to add an IA control the the array - * - * @param string $ia_control_in - */ - public function add_IA_Control($ia_control_in) { - $add = true; - foreach ($this->ia_controls as $ia) { - if ($ia == $ia_control_in) { - $add = false; - break; - } + /** + * Constructor + * + * @param integer $int_Tgt_ID + * @param integer $int_PDI_ID + * @param integer $int_Scan_ID + * @param integer|string $Finding_Status + * @param string $str_Notes + * @param integer $int_Change_ID + * @param string $str_Orig_Src + * @param integer $int_Finding_Itr + */ + public function __construct($int_Tgt_ID, $int_PDI_ID, $int_Scan_ID, $Finding_Status, $str_Notes, $int_Change_ID, $str_Orig_Src, $int_Finding_Itr) + { + $this->tgt_id = $int_Tgt_ID; + $this->pdi_id = $int_PDI_ID; + $this->scan_id = $int_Scan_ID; + if (is_numeric($Finding_Status)) { + $this->finding_status_id = $Finding_Status; + } else { + $this->finding_status_id = $this->get_Finding_Status_ID($Finding_Status); + } + $this->notes = $str_Notes; + $this->change_id = $int_Change_ID; + $this->orig_src = $str_Orig_Src; + $this->finding_itr = $int_Finding_Itr; } - if ($add) { - $this->ia_controls[] = $ia_control_in; + /** + * Getter function for target ID + * + * @return integer + */ + public function get_Tgt_ID() + { + return $this->tgt_id; } - } + /** + * Setter function for target ID + * + * @param integer $int_Tgt_ID + */ + public function set_Tgt_ID($int_Tgt_ID) + { + $this->tgt_id = $int_Tgt_ID; + } + + /** + * Getter function for PDI ID + * + * @return integer + */ + public function get_PDI_ID() + { + return $this->pdi_id; + } + + /** + * Setter function for PDI ID + * + * @param integer $int_PDI_ID + */ + public function set_PDI_ID($int_PDI_ID) + { + $this->pdi_id = $int_PDI_ID; + } + + /** + * Getter function for Scan ID + * + * @return integer + */ + public function get_Scan_ID() + { + return $this->scan_id; + } + + /** + * Setter function for Scan ID + * + * @param integer $int_Scan_ID + */ + public function set_Scan_ID($int_Scan_ID) + { + $this->scan_id = $int_Scan_ID; + } + + /** + * Getter function for Finding status ID + * + * @return integer + */ + public function get_Finding_Status() + { + return $this->finding_status_id; + } + + /** + * Getter function for Finding status ID based on string + * + * @param string $status + * @return integer + */ + public function get_Finding_Status_ID($status) + { + $arr_flip = array_flip($this->STATUS); + if (isset($arr_flip[$status])) { + return $arr_flip[$status]; + } else { + return $arr_flip['Not Reviewed']; + } + } + + /** + * Getter function for finding status string + * + * @param integer $int_Status_ID + * @return string + */ + public function get_Finding_Status_String($int_Status_ID = null) + { + if ($int_Status_ID) { + return $this->STATUS[$int_Status_ID]; + } else { + return $this->STATUS[$this->finding_status_id]; + } + } + + /** + * Setter function for finding status + * + * @param integer $int_Finding_Status_ID + */ + public function set_Finding_Status($int_Finding_Status_ID) + { + $this->finding_status_id = $int_Finding_Status_ID; + } + + /** + * Setter function for finding status + * + * @param string $str_New_Status + */ + public function set_Finding_Status_By_String($str_New_Status) + { + $this->finding_status_id = $this->get_Finding_Status_ID($str_New_Status); + } + + /** + * Getter function for notes + * + * @return string + */ + public function get_Notes() + { + return $this->notes; + } + + /** + * Setter function for notes + * + * @param string $str_Notes + */ + public function set_Notes($str_Notes) + { + $this->notes = $str_Notes; + } + + /** + * Function to prepend notes to the existing list + * + * @param string $str_Notes + */ + public function prepend_Notes($str_Notes) + { + $this->notes = $str_Notes . PHP_EOL . $this->notes; + } + + /** + * Function to append notes + * + * @param string $str_Notes + * @param boolean $merge + */ + public function append_Notes($str_Notes, $merge = false) + { + $this->notes .= PHP_EOL . ($merge ? "(Merged Target)" . PHP_EOL : "") . $str_Notes; + } + + /** + * Getter function for the analyst notes + * + * @return string + */ + public function get_Analyst_Notes() + { + return $this->analyst_notes; + } + + /** + * Setter function for the analyst notes + * + * @param string $str_Notes + */ + public function set_Analyst_Notes($str_Notes) + { + $this->analyst_notes = $str_Notes; + } + + /** + * Getter function for the scanner notes + * + * @return string + */ + public function get_Scanner_Notes() + { + return $this->scanner_notes; + } + + /** + * Setter function for the scanner notes + * + * @param string $str_Notes + */ + public function set_Scanner_Notes($str_Notes) + { + $this->scanner_notes = $str_Notes; + } + + /** + * Getter function for change ID + * + * @return integer + */ + public function get_Change_ID() + { + if ($this->change_id) { + return $this->change_id; + } else { + return $this::NC; + } + } + + /** + * Setter function for change ID + * + * @param integer $int_Change_ID + */ + public function set_Change_ID($int_Change_ID) + { + $this->change_id = $int_Change_ID; + } + + /** + * Getter function for original source + * + * @return string + */ + public function get_Original_Source() + { + return $this->orig_src; + } + + /** + * Setter function for original source + * + * @param string $str_Original_Source + */ + public function set_Original_Source($str_Original_Source) + { + $this->orig_src = $str_Original_Source; + } + + /** + * Getter function for finding iteration + * + * @return integer + */ + public function get_Finding_Iteration() + { + return $this->finding_itr; + } + + /** + * Setter function for finding iteration + * + * @param integer $int_Finding_Iteration + */ + public function set_Finding_Iteration($int_Finding_Iteration) + { + $this->finding_itr = $int_Finding_Iteration; + } + + /** + * Increment the finding count by 1 + */ + public function inc_Finding_Count() + { + $this->finding_itr ++; + } + + /** + * Getter function for deconflicted status + * + * @param string $str_New_Status + * @return string + */ + public function get_Deconflicted_Status($str_New_Status) + { + // must get original status first! + return deconflict_status::$DECONFLICTED_STATUS[$this->get_Finding_Status_String()][$str_New_Status]; + } + + /** + * Getter function for category + * + * @return int + */ + public function get_Category() + { + if (empty($this->cat)) { + return 2; + } + return $this->cat; + } + + /** + * Setter function for category + * + * @param mixed $cat_in + */ + public function set_Category($cat_in) + { + if (is_numeric($cat_in)) { + $this->cat = $cat_in; + } elseif (is_string($cat_in)) { + $this->cat = substr_count($cat_in, "I"); + } + } + + /** + * Getter function for IA controls + * + * @return array:string + */ + public function get_IA_Controls() + { + return $this->ia_controls; + } + + /** + * Getter function for IA Controls + * + * @return string + */ + public function get_IA_Controls_String() + { + return implode(" ", $this->ia_controls); + } + + /** + * Setter function for the IA Controls + * + * @param mixed $ia_controls_in + */ + public function set_IA_Controls($ia_controls_in) + { + if (is_array($ia_controls_in)) { + $this->ia_controls = $ia_controls_in; + } elseif (is_string($ia_controls_in)) { + $this->ia_controls = explode(" ", $ia_controls_in); + } + } + + /** + * Function to add an IA control the the array + * + * @param string $ia_control_in + */ + public function add_IA_Control($ia_control_in) + { + $add = true; + foreach ($this->ia_controls as $ia) { + if ($ia == $ia_control_in) { + $add = false; + break; + } + } + + if ($add) { + $this->ia_controls[] = $ia_control_in; + } + } } /** @@ -501,22 +562,22 @@ class finding { * * @author Ryan Prather */ -class finding_status { +class finding_status +{ - /** - * The database ID of the finding status - * - * @var int - */ - public $id = 0; - - /** - * The status of the finding - * - * @var string - */ - public $status = ''; + /** + * The database ID of the finding status + * + * @var int + */ + public $id = 0; + /** + * The status of the finding + * + * @var string + */ + public $status = ''; } /** @@ -524,99 +585,97 @@ class finding_status { * * @author Ryan Prather */ -class deconflict_status { - - /** - * Stores the matrix of current -> new statuses - * - * @var array:string - * - * / Finding Definitions - * Open: The finding is valid for this host - the host does not meet the requirements - * Not a Finding: The finding is not valid for this host - the host meets the requirements - * Not Applicable: The requirement does not apply to this host - prerequisites do not exist. - * Not Reviewed: The finding has not yet been reviewed. - * Exception: (A type of Open) - The finding is valid, but the system cannot comply for a valid reason - * False Positive: (A type of Not a Finding) - The scanning tool incorrectly reported Open. - * No Data: Because dissimilar checklists were merged, there is no data available for this item (Uncommon) - * - * General Precedence Order: E, FP, O, NF, NA, NR, ND - * Exception - the newest E or FP always take precedence (security engineer input) - * - * Decision Table: - * orig\new | E | FP | O | NF | NA | NR | ND - * E | E | FP | E | E | E | E | E - * FP | E | FP | FP | FP | FP | FP | FP - * O | E | FP | O | O | O | O | O - * NF | E | FP | O | NF | NF | NF | NF - * NA | E | FP | O | NF | NA | NA | NA - * NR | E | FP | O | NF | NA | NR | NR - * ND | E | FP | O | NF | NA | NR | ND - */ - static $DECONFLICTED_STATUS = [ - 'Exception' => [ - 'Exception' => 'Exception', - 'False Positive' => 'False Positive', - 'Open' => 'Exception', - 'Not a Finding' => 'Exception', - 'Not Applicable' => 'Exception', - 'Not Reviewed' => 'Exception', - 'No Data' => 'Exception' - ], - 'False Positive' => [ - 'Exception' => 'Exception', - 'False Positive' => 'False Positive', - 'Open' => 'False Positive', - 'Not a Finding' => 'False Positive', - 'Not Applicable' => 'False Positive', - 'Not Reviewed' => 'False Positive', - 'No Data' => 'False Positive' - ], - 'Open' => [ - 'Exception' => 'Exception', - 'False Positive' => 'False Positive', - 'Open' => 'Open', - 'Not a Finding' => 'Open', - 'Not Applicable' => 'Open', - 'Not Reviewed' => 'Open', - 'No Data' => 'Open' - ], - 'Not a Finding' => [ - 'Exception' => 'Exception', - 'False Positive' => 'False Positive', - 'Open' => 'Open', - 'Not a Finding' => 'Not a Finding', - 'Not Applicable' => 'Not a Finding', - 'Not Reviewed' => 'Not a Finding', - 'No Data' => 'Not a Finding' - ], - 'Not Applicable' => [ - 'Exception' => 'Exception', - 'False Positive' => 'False Positive', - 'Open' => 'Open', - 'Not a Finding' => 'Not a Finding', - 'Not Applicable' => 'Not Applicable', - 'Not Reviewed' => 'Not Applicable', - 'No Data' => 'Not Applicable' - ], - 'Not Reviewed' => [ - 'Exception' => 'Exception', - 'False Positive' => 'False Positive', - 'Open' => 'Open', - 'Not a Finding' => 'Not a Finding', - 'Not Applicable' => 'Not Applicable', - 'Not Reviewed' => 'Not Reviewed', - 'No Data' => 'Not Reviewed' - ], - 'No Data' => [ - 'Exception' => 'Exception', - 'False Positive' => 'False Positive', - 'Open' => 'Open', - 'Not a Finding' => 'Not a Finding', - 'Not Applicable' => 'Not Applicable', - 'Not Reviewed' => 'Not Reviewed', - 'No Data' => 'No Data' - ] - ]; +class deconflict_status +{ + /** + * Stores the matrix of current -> new statuses + * + * @var array:string / Finding Definitions + * Open: The finding is valid for this host - the host does not meet the requirements + * Not a Finding: The finding is not valid for this host - the host meets the requirements + * Not Applicable: The requirement does not apply to this host - prerequisites do not exist. + * Not Reviewed: The finding has not yet been reviewed. + * Exception: (A type of Open) - The finding is valid, but the system cannot comply for a valid reason + * False Positive: (A type of Not a Finding) - The scanning tool incorrectly reported Open. + * No Data: Because dissimilar checklists were merged, there is no data available for this item (Uncommon) + * + * General Precedence Order: E, FP, O, NF, NA, NR, ND + * Exception - the newest E or FP always take precedence (security engineer input) + * + * Decision Table: + * orig\new | E | FP | O | NF | NA | NR | ND + * E | E | FP | E | E | E | E | E + * FP | E | FP | FP | FP | FP | FP | FP + * O | E | FP | O | O | O | O | O + * NF | E | FP | O | NF | NF | NF | NF + * NA | E | FP | O | NF | NA | NA | NA + * NR | E | FP | O | NF | NA | NR | NR + * ND | E | FP | O | NF | NA | NR | ND + */ + static $DECONFLICTED_STATUS = [ + 'Exception' => [ + 'Exception' => 'Exception', + 'False Positive' => 'False Positive', + 'Open' => 'Exception', + 'Not a Finding' => 'Exception', + 'Not Applicable' => 'Exception', + 'Not Reviewed' => 'Exception', + 'No Data' => 'Exception' + ], + 'False Positive' => [ + 'Exception' => 'Exception', + 'False Positive' => 'False Positive', + 'Open' => 'False Positive', + 'Not a Finding' => 'False Positive', + 'Not Applicable' => 'False Positive', + 'Not Reviewed' => 'False Positive', + 'No Data' => 'False Positive' + ], + 'Open' => [ + 'Exception' => 'Exception', + 'False Positive' => 'False Positive', + 'Open' => 'Open', + 'Not a Finding' => 'Open', + 'Not Applicable' => 'Open', + 'Not Reviewed' => 'Open', + 'No Data' => 'Open' + ], + 'Not a Finding' => [ + 'Exception' => 'Exception', + 'False Positive' => 'False Positive', + 'Open' => 'Open', + 'Not a Finding' => 'Not a Finding', + 'Not Applicable' => 'Not a Finding', + 'Not Reviewed' => 'Not a Finding', + 'No Data' => 'Not a Finding' + ], + 'Not Applicable' => [ + 'Exception' => 'Exception', + 'False Positive' => 'False Positive', + 'Open' => 'Open', + 'Not a Finding' => 'Not a Finding', + 'Not Applicable' => 'Not Applicable', + 'Not Reviewed' => 'Not Applicable', + 'No Data' => 'Not Applicable' + ], + 'Not Reviewed' => [ + 'Exception' => 'Exception', + 'False Positive' => 'False Positive', + 'Open' => 'Open', + 'Not a Finding' => 'Not a Finding', + 'Not Applicable' => 'Not Applicable', + 'Not Reviewed' => 'Not Reviewed', + 'No Data' => 'Not Reviewed' + ], + 'No Data' => [ + 'Exception' => 'Exception', + 'False Positive' => 'False Positive', + 'Open' => 'Open', + 'Not a Finding' => 'Not a Finding', + 'Not Applicable' => 'Not Applicable', + 'Not Reviewed' => 'Not Reviewed', + 'No Data' => 'No Data' + ] + ]; } diff --git a/classes/host_list.inc b/classes/host_list.inc index 1594b6d..24f44de 100644 --- a/classes/host_list.inc +++ b/classes/host_list.inc @@ -13,6 +13,8 @@ * Change Log: * - Jan 16, 2018 - File created * - Feb 6, 2018 - Added getter/setter methods + * - Nov 6, 2018 - Deleted unused constructor + * - Nov 8, 2018 - Added method to increase finding count */ /** @@ -65,14 +67,6 @@ class host_list */ private $_scanNotes = null; - /** - * Constructor - */ - public function __construct() - { - - } - /** * Getter function for _targetId * @@ -152,6 +146,16 @@ class host_list { $this->_findingCount = $intFindingCount; } + + /** + * Method to add findings to the count + * + * @param int $intFindingCount + */ + public function addFindingCount($intFindingCount) + { + $this->_findingCount += $intFindingCount; + } /** * Getter function for _scanError diff --git a/classes/import.inc b/classes/import.inc index dd7fc5a..db9c6bb 100644 --- a/classes/import.inc +++ b/classes/import.inc @@ -39,85 +39,89 @@ include_once 'vendor/autoload.php'; * * @author Ryan Prather */ -class import { +class import +{ - /** - * The current include_once path - * - * @var string - */ - protected $current_path = ''; + /** + * The current include_once path + * + * @var string + */ + protected $current_path = ''; - /** - * String array of regular expressions. - * Files matching these expressions will be skipped - * - * @var string - */ - protected $SKIP = array( - '/HBSS/i', - '/SharePoint/i', - '/ISSE/i', - '/_[Mm]ac/i', - '/Guard/i', - '/SME_PED/i', - '/_zOS_/i', - '/BlackBerry/i', - '/C2\-Fix/i', - '/Enclave_Zone/i', - '/General_Mobile/i', - '/Remote_/i', - '/_Tandem/i', - '/xenapp/i', - '/internet/i', - '/android/i', - '/JVAP/i', - '/apple/i', - '/OpenVMS/i', - '/VVoIP/i', - '/Wireless/i', - '/REL-LAN/i', - '/dictionary/i', - '/IBM_/i', - '/Smartphone/i', - '/Exchange/i', - '/Juniper/i', - '/Mobility/i', - '/ESXi/i', - '/FW_SRG/i', - '/PlayBook_OS/i', - '/vCenter_Server/i' - ); + /** + * String array of regular expressions. + * Files matching these expressions will be skipped + * + * @var string + */ + protected $SKIP = array( + '/HBSS/i', + '/SharePoint/i', + '/ISSE/i', + '/_[Mm]ac/i', + '/Guard/i', + '/SME_PED/i', + '/_zOS_/i', + '/BlackBerry/i', + '/C2\-Fix/i', + '/Enclave_Zone/i', + '/General_Mobile/i', + '/Remote_/i', + '/_Tandem/i', + '/xenapp/i', + '/internet/i', + '/android/i', + '/JVAP/i', + '/apple/i', + '/OpenVMS/i', + '/VVoIP/i', + '/Wireless/i', + '/REL-LAN/i', + '/dictionary/i', + '/IBM_/i', + '/Smartphone/i', + '/Exchange/i', + '/Juniper/i', + '/Mobility/i', + '/ESXi/i', + '/FW_SRG/i', + '/PlayBook_OS/i', + '/vCenter_Server/i' + ); - /** - * Class constructor - */ - public function __construct() { - set_time_limit(0); - } - - /** - * Class destructor to reset the include_once path and time limits - */ - public function __destruct() { - set_time_limit(30); - } - - /** - * Function to scan the tmp directory for result files and call the appropriate parsers - */ - public function scan_Result_Files($redirect = true) { - chdir(DOC_ROOT . "/exec"); - - $ignore = filter_input(INPUT_POST, 'ignore', FILTER_VALIDATE_BOOLEAN) ? "true" : "false"; - $doc_root = realpath(DOC_ROOT); - $ste = filter_input(INPUT_COOKIE, 'ste', FILTER_VALIDATE_INT); - if (!$ste) { - $ste = filter_input(INPUT_POST, 'ste', FILTER_VALIDATE_INT); + /** + * Class constructor + */ + public function __construct() + { + set_time_limit(0); } - $location = filter_input(INPUT_POST, 'location', FILTER_SANITIZE_STRING); - $conf = <<run(); + + if ($redirect) { + header("/results/"); + } } - $script = realpath(defined('PHP_BIN') ? PHP_BIN : PHP) . - " -c " . realpath(PHP_CONF) . - " -f " . realpath(DOC_ROOT . "/exec/background_results.php"); + /** + * Function to scan '/xampp/www/tmp' directory for catalog files + */ + public function scan_Catalog_Files() + { + chdir(DOC_ROOT . "/tmp"); + $files = glob("*"); - if (LOG_LEVEL == E_DEBUG) { - Sagacity_Error::err_handler("Script to execute: $script", E_DEBUG); + foreach ($files as $file) { + if (substr($file, - 3) == 'zip') { + // $this->import_STIG_ZIP("../tmp/$file"); + } elseif (preg_match('/pdi\-|\_catalog/i', $file)) { + // $this->import_PDI_CSV("../tmp/$file"); + } elseif (preg_match('/\-xccdf\.xml$/i', $file)) { + // $this->import_STIG("../tmp/$file"); + } + } } - $process = new Cocur\BackgroundProcess\BackgroundProcess("cd " . realpath(DOC_ROOT . "/exec") . " && " . $script); - $process->run(); + /** + * Function to scan host data files and import findings + */ + public function import_Host_Data_Collection() + { + $db = new db(); - if ($redirect) { - header("/results/"); - } - } + $doc_root = realpath(DOC_ROOT); + $overwrite = (isset($_REQUEST['overwrite']) && $_REQUEST['overwrite'] ? "true" : "false"); - /** - * Function to scan '/xampp/www/tmp' directory for catalog files - */ - public function scan_Catalog_Files() { - chdir(DOC_ROOT . "/tmp"); - $files = glob("*"); - - foreach ($files as $file) { - if (substr($file, -3) == 'zip') { - // $this->import_STIG_ZIP("../tmp/$file"); - } - elseif (preg_match('/pdi\-|\_catalog/i', $file)) { - // $this->import_PDI_CSV("../tmp/$file"); - } - elseif (preg_match('/\-xccdf\.xml$/i', $file)) { - // $this->import_STIG("../tmp/$file"); - } - } - } - - /** - * Function to scan host data files and import findings - */ - public function import_Host_Data_Collection() { - $db = new db(); - - $doc_root = realpath(DOC_ROOT); - $overwrite = (isset($_REQUEST['overwrite']) && $_REQUEST['overwrite'] ? "true" : "false"); - - $conf = <<CurrentDirectory = DOC_ROOT; - $shell->run($script, 0, false); - } - elseif (substr(strtolower(PHP_OS), 0, 3) == 'lin') { - exec("$script > /dev/null &"); - } - else { - Sagacity_Error::err_handler("Unknown OS: " . PHP_OS); - } - - - header("Location: /ste/"); - } - - /** - * function to import PDI CSV file to database - */ - public function import_PDI_CSV() { - $db = new db(); - - $handle = fopen(DOC_ROOT . "/tmp/All-PDI-Catalog.csv", "r"); - $data = fgetcsv($handle); - $data = fgetcsv($handle); - - while ($data = fgetcsv($handle)) { - $catalog = array( - 'stig_id' => (isset($data[0]) ? $data[0] : ""), - 'vms_id' => (isset($data[1]) ? $data[1] : ""), - 'cat_lvl' => (isset($data[2]) ? $data[2] : "II"), - 'ia_controls' => (isset($data[3]) ? $data[3] : ""), - 'short_title' => (isset($data[4]) ? $data[4] : ""), - 'description' => (isset($data[5]) ? $data[5] : ""), - 'notes' => (isset($data[6]) ? $data[6] : ""), - 'retina_id' => (isset($data[7]) ? $data[7] : ""), - 'vul_id' => (isset($data[8]) ? $data[8] : ""), - 'check_contents' => (isset($data[9]) ? $data[9] : ""), - 'sv_rule_id' => (isset($data[10]) ? $data[10] : ""), - 'nessus_id' => (isset($data[11]) ? $data[11] : "") - ); - - if ($catalog['stig_id'] != 'No Reference') { - $ref = $db->get_STIG($catalog['stig_id']); - } - - if (is_null($ref) && $catalog['vms_id'] != 'No Reference') { - $ref = $db->get_GoldDisk($catalog['vms_id']); - } - - if (is_array($ref) && count($ref) && isset($ref[0])) { - $ref = $ref[0]; - } - - if (!is_null($ref)) { - $pdi = new pdi($ref->get_PDI_ID(), $catalog['cat_lvl'], "NOW"); - $pdi->set_Short_Title($catalog['short_title']); - $pdi->set_Group_Title($catalog['short_title']); - $pdi->set_Description($catalog['description']); - - if ($catalog['ia_controls']) { - $ia_controls = array(); - foreach (explode(" ", $catalog['ia_controls']) as $ia) { - $ia_controls[] = new ia_control($ref->get_PDI_ID(), substr($ia, 0, -2), substr($ia, -1)); - } - - if (!$db->save_IA_Control($ia_controls)) { - print "error updating ia controls on id: " . $ref->get_ID() . "
"; - } + if (substr(strtolower(PHP_OS), 0, 3) == 'win') { + $shell = new COM("WScript.Shell"); + $shell->CurrentDirectory = DOC_ROOT; + $shell->run($script, 0, false); + } elseif (substr(strtolower(PHP_OS), 0, 3) == 'lin') { + exec("$script > /dev/null &"); + } else { + Sagacity_Error::err_handler("Unknown OS: " . PHP_OS); } - // Check for retina data - if ($catalog['retina_id']) { - $retina = new retina($ref->get_PDI_ID(), $catalog['retina_id']); - - if (!$db->save_Retina($retina)) { - print "error updating retina id: " . $catalog['retina_id'] . "
"; - } - } - - // Vul_ID - if ($catalog['vul_id']) { - - } - - if ($catalog['sv_rule_id']) { - $sv_rule = array(); - foreach (explode(" ", $catalog['sv_rule_id']) as $rule) { - $sv_rule[] = new sv_rule($ref->get_PDI_ID(), $rule); - } - - if (!$db->save_SV_Rule($sv_rule)) { - print "error updating sv rule on pdi: " . $ref->get_ID() . "
"; - } - } - - if ($catalog['nessus_id']) { - $nessus = new nessus($ref->get_PDI_ID(), $catalog['nessus_id']); - - if (!$db->save_Nessus($nessus)) { - print "error updating nessus id: " . $catalog['nessus_id'] . "
"; - } - } - } - else { - $pdi = new pdi(0, $catalog['cat_lvl'], "NOW"); - $pdi->set_Short_Title($catalog['short_title']); - $pdi->set_Group_Title($catalog['short_title']); - $pdi->set_Description($catalog['description']); - - $pdi_id = $db->save_PDI($pdi); - - if ($catalog['stig_id'] != 'No Reference') { - $stig = new stig($pdi_id, $catalog['stig_id'], $catalog['description']); - $ref = $stig; - $db->add_Stig($stig); - } - - if ($catalog['vms_id'] != 'No Reference') { - $golddisk = new golddisk($pdi_id, $catalog['vms_id'], $catalog['short_title']); - - if ($ref == null) { - $ref = $golddisk; - } - - $db->save_GoldDisk($golddisk); - } - - if ($catalog['ia_controls']) { - $ia_controls = array(); - foreach (explode(" ", $catalog['ia_controls']) as $ia) { - $ia_controls[] = new ia_control($pdi_id, substr($ia, 0, -2), substr($ia, -1)); - } - - if (!$db->save_IA_Control($ia_controls)) { - print "error updating ia controls on pdi_id: " . $ref->get_ID() . "
"; - } - } - - // Check for retina data - if ($catalog['retina_id']) { - $retina = new retina($pdi_id, $catalog['retina_id']); - - if (!$db->save_Retina($retina)) { - print "error updating retina id: " . $catalog['retina_id'] . "
"; - } - } - - // Vul_ID - if ($catalog['vul_id']) { - - } - - // sv_rule - if ($catalog['sv_rule_id']) { - $sv_rule = array(); - foreach (explode(" ", $catalog['sv_rule_id']) as $rule) { - $sv_rule[] = new sv_rule($pdi_id, $rule); - } - - if (!$db->save_SV_Rule($sv_rule)) { - print "error updating sv rule on pdi: " . $ref->get_ID() . "
"; - } - } - - if ($catalog['nessus_id']) { - $nessus = new nessus($pdi_id, $catalog['nessus_id']); - - if (!$db->save_Nessus($nessus)) { - print "error updating nessus id: " . $catalog['nessus_id'] . "
"; - } - } - } - } - fclose($handle); - } - - /** - * function for SRR script - * runs script net-SRR.pl - * exports a csv format file - */ - public function net_SRR() { - - } - - /** - * function for unix SRR conversion to csv - * runs script unix-xml-to-echecklist.pl - * runs script unix-srr-to-csv.pl - */ - public function unix_srr_to_csv() { - - } - - /** - * Function to import DISA STIG content to database - * - * @param array $request - */ - public function import_STIG_XML($request = array()) { - $script = realpath(defined('PHP_BIN') ? PHP_BIN : PHP) . " " . - realpath(DOC_ROOT . "/exec/background_stigs.php") . " " . - (isset($request['delete']) ? ' --delete' : '') . - (isset($request['override']) ? " --ia" : ""); - - $shell = new COM("WScript.Shell"); - $shell->CurrentDirectory = DOC_ROOT . "/exec"; - $shell->run($script, 0, false); - - header("location: " . $_SERVER['HTTP_REFERER']); - } - - /** - * Function to convert a retina CSV to an eChecklist and store on database - */ - public function retina_csv_echecklist() { - $files = glob('*.csv'); - $db = new db(); - - $source = $db->get_Sources('Retina'); - $ste = $db->get_STE($_REQUEST['ste'])[0]; - - foreach ($files as $file) { - $scan = new scan(null, $source, $ste, '1', $file, 'CURRENT_TIMESTAMP'); - $db->save_Scan($scan); - - exec(PERL . "/perl " . DOC_ROOT . "/exec/retina-csv-to-echecklist.pl " . DOC_ROOT . "/tmp/$file --db", $output, $result); - } - } - - /** - * function to import golddisk info into scans table - * runs script golddisk-xml-to-echecklist.pl - */ - public function golddisk_xml_echecklist() { - $files = glob('*.xml'); - $db = new db(); - - $source = $db->get_Sources('Golddisk'); - $ste = $db->get_STE($_REQUEST['ste'])[0]; - - foreach ($files as $file) { - $scan = new scan(null, $source, $ste, '1', $file, 'CURRENT_TIMESTAMP'); - $db->save_Scan($scan); - - exec(PERL . "/perl " . DOC_ROOT . "/exec/golddisk-xml-to-echecklist.pl " . DOC_ROOT . "/tmp/$file --db", $output, $result); - } - } - - /** - * - */ - public function import_IAVM_CVE() { - $filename = '../tmp/iavm-to-cve(u).xml'; - $xml = simplexml_load_file($filename); - $db = new db(); - - foreach ($xml->IAVM as $iavm) { - $vms_id = preg_replace('/V[0]+/', 'V-', (string) $iavm->S['VMSKey']); - $stig_id = (string) $iavm->S['IAVM']; - $title = (string) $iavm->S['Title']; - $release_date = DateTime::createFromFormat('d M Y', $iavm->S['ReleaseDate']); - $revision_date = DateTime::createFromFormat('d M Y', $iavm->Revision['Date']); - - $cves_tags = $iavm->CVEs; - $cves = array(); - - $pdi = $db->get_Stig($stig_id); - if (is_array($pdi) && count($pdi) && isset($pdi[0]) && is_a($pdi[0], 'stig')) { - $pdi = $pdi[0]; - } - - if (is_null($pdi)) { - $pdi = $db->get_GoldDisk($vms_id); - if (is_array($pdi) && count($pdi) && isset($pdi[0]) && is_a($pdi[0], 'golddisk')) { - $pdi = $pdi[0]; - } - } - - if (is_null($pdi)) { - $cat_lvl = substr_count((string) $iavm->S['Severity'], 'I'); - $pdi = new pdi(null, $cat_lvl, (string) $iavm->S['ReleaseDate']); - $pdi->set_Short_Title($title); - $pdi->set_Group_Title($title); - $pdi->set_Description($title); - $pdi_id = $db->save_PDI($pdi); - - $stig = new stig($pdi_id, $stig_id, $title); - $db->add_Stig($stig); - - $golddisk = new golddisk($pdi_id, $vms_id, $title); - $db->save_GoldDisk($golddisk); - } - else { - $pdi_id = $pdi->get_PDI_ID(); - } - - foreach ($cves_tags->CVENumber as $cve) { - $cve_id = (string) $cve; - - $cves[] = new cve(null, $cve_id, $release_date, $title); - } - - $db->add_CVE($cves); - - $ref_tags = $iavm->References; - $refs = array(); - - foreach ($ref_tags->Reference as $ref) { - $ref_type = ''; - $adv_id = ''; - $url = (string) $ref['URL']; - $name = (string) $ref['RefName']; - $match = array(); - - $refs[] = new advisory($pdi_id, $adv_id, $name, $ref_type, $url); - } + header("Location: /ste/"); } - $ref = $row[8]; - $url = $row[9]; - - if (strpos($ref, 'Microsoft') !== false) { - $x++; - $type = 'Microsoft'; - $ret = preg_match('/(MS\d{2}\-\d{3}|KB\d{6,7}|\d{6,7})/', $ref, $match); - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($ref, 'Adobe') !== false) { - $x++; - $type = 'Adobe'; - $ret = preg_match('/(APSA\d{2}\-\d{2}|APSB\d{2}\-\d{2})/', $ref, $match); - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($ref, 'Apache') !== false) { - $x++; - $type = 'Apache'; - $ret = preg_match('/(CVE\-\d{4}\-\d{4}|S\d\-\d{3})/', $ref, $match); - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($ref, 'CERT') !== false) { - $x++; - $type = 'US-CERT'; - $match = array(); - - if (strpos($url, 'techalerts') !== false) { - $ret = preg_match('/(TA\d{2}\-\d{3}\s).html/', $url, $match); - } - elseif (strpos($url, 'vuls') !== false) { - $ret = preg_match('/([^\/]+)$/', $url, $match); - } - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($ref, 'Cisco') !== false) { - $x++; - $type = 'Cisco'; - $ret = preg_match('/([^\/]+)(\.s?html)$/', $url, $match); - - if (count($match) > 0) { - $id = $match[1]; - } - else { - $ret = preg_match('/([^\/]+)$/', $url, $match); - if (count($match)) { - $id = $match[1]; - } - } - } - elseif (strpos($ref, 'Citrix') !== false) { - $x++; - $type = 'Citrix'; - $ret = preg_match('/([^\/]+)$/', $url, $match); - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($ref, 'Debian') !== false) { - $x++; - $type = 'Debian'; - $ret = preg_match('/([^\/]+)$/', $url, $match); - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($ref, 'HP') !== false) { - $x++; - $type = 'HP'; - $ret = preg_match('/(HPSB\S+\ SSRT\S+)[\ ?\)?]/', $ref, $match); - - if (count($match)) { - $id = $match[1]; - } - else { - $ret = preg_match('/(HPSB\S+)[\ ?\)?]/', $ref, $match); - if (count($match)) { - $id = $match[1]; - } - } - } - elseif (strpos($ref, 'IBM') !== false) { - $x++; - $type = 'IBM'; - $ret = preg_match('/(\d{5,8})/', $ref, $match); - - if (count($match)) { - $id = $match[1]; - } - else { - $ret = preg_match('/([^\=|\/]+)$/', $url, $match); - if (count($match)) { - $id = $match[1]; - } - } - } - elseif (strpos($ref, 'Juniper') !== false) { - $x++; - $type = 'Juniper'; - $ret = preg_match('/(PSN\-\d{4}\-\d{2}\-\d{3}|JSA\d{5})/', $url, $match); - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($ref, 'Oracle') !== false) { - $x++; - $type = 'Oracle'; - $url = basename($url); - $ret = preg_match('/([\S]+)\.html/', $url, $match); - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($ref, 'McAfee') !== false) { - $x++; - $type = 'McAfee'; - $query = parse_query($url); - - if (count($match)) { - $id = isset($query['id']) ? $query['id'] : ''; - } - } - elseif (strpos($ref, 'Red Hat') !== false) { - $x++; - $type = 'Red Hat'; - $ret = preg_match('/([^\/]+)\.html/', $url, $match); - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($ref, 'Secunia') !== false) { - $x++; - $type = 'Secunia'; - $ret = preg_match('/([^\/]+)\/([^\/]+)\/?$/', $url, $match); - - if (count($match)) { - if ($match[2] == 'advisory') { - $id = $match[1]; - } - elseif (is_numeric($match[1]) && count($match[2]) == 1) { - $id = $match[1]; - } - else { - $id = $match[2]; - } - } - } - elseif (strpos($url, 'securitytracker') !== false) { - $x++; - $type = 'Security Tracker'; - $ret = preg_match('/([^\/]+)\.html$/', $url, $match); - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($ref, 'SecurityFocus') !== false) { - $x++; - $type = 'SecurityFocus'; - $ret = preg_match('/([^\/]+)\/?$/', $url, $match); - - if (count($match)) { - if ($match[1] != 'info') { - $id = $match[1]; - } - else { - $ret = preg_match('/([^\/]+)\/info/', $url, $match); - $id = $match[1]; - } - } - } - elseif (strpos($ref, 'Sun') !== false) { - $x++; - $type = 'Sun'; - $query = parse_query($url); - - $id = isset($query['assetkey']) ? $query['assetkey'] : ''; - - if (!$id) { - $ret = preg_match('/([^\/]+)$/', parse_url($url, PHP_URL_PATH), $match); - $id = $match[1]; - } - } - elseif (strpos($ref, 'Symantec') !== false) { - $x++; - $type = 'Symantec'; - $ret = preg_match('/(\d{5}|SYM\d{2}\-\d{3})/', $ref, $match); - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($url, 'ZDI') !== false) { - $x++; - $type = 'ZDI'; - $ret = preg_match('/([^\/]+)(\.html|\/)$/', $url, $match); - - if (count($match)) { - $id = $match[1]; - } - } - elseif (strpos($ref, 'Wireshark') !== false) { - $x++; - $type = 'Wireshark'; - $ret = preg_match('/([^\/]+)\.html$/', $url, $match); - - if (count($match)) { - $id = $match[1]; - } - } - } - - /** - * - * @param string $in - * @return multitype:Ambigous <> - */ - public function parse_query($in) { /** - * Use this function to parse out the query array element from - * the output of parse_url(). + * function to import PDI CSV file to database */ - $query_string = substr($in, strpos($in, '?') + 1); - $query_arr = explode('&', $query_string); - $arr = array(); + public function import_PDI_CSV() + { + $db = new db(); - foreach ($query_arr as $val) { - $x = explode('=', $val); - $arr[$x[0]] = isset($x[1]) ? $x[1] : ''; + $handle = fopen(DOC_ROOT . "/tmp/All-PDI-Catalog.csv", "r"); + $data = fgetcsv($handle); + $data = fgetcsv($handle); + + while ($data = fgetcsv($handle)) { + $catalog = array( + 'stig_id' => (isset($data[0]) ? $data[0] : ""), + 'vms_id' => (isset($data[1]) ? $data[1] : ""), + 'cat_lvl' => (isset($data[2]) ? $data[2] : "II"), + 'ia_controls' => (isset($data[3]) ? $data[3] : ""), + 'short_title' => (isset($data[4]) ? $data[4] : ""), + 'description' => (isset($data[5]) ? $data[5] : ""), + 'notes' => (isset($data[6]) ? $data[6] : ""), + 'retina_id' => (isset($data[7]) ? $data[7] : ""), + 'vul_id' => (isset($data[8]) ? $data[8] : ""), + 'check_contents' => (isset($data[9]) ? $data[9] : ""), + 'sv_rule_id' => (isset($data[10]) ? $data[10] : ""), + 'nessus_id' => (isset($data[11]) ? $data[11] : "") + ); + + if ($catalog['stig_id'] != 'No Reference') { + $ref = $db->get_STIG($catalog['stig_id']); + } + + if (is_null($ref) && $catalog['vms_id'] != 'No Reference') { + $ref = $db->get_GoldDisk($catalog['vms_id']); + } + + if (is_array($ref) && count($ref) && isset($ref[0])) { + $ref = $ref[0]; + } + + if (! is_null($ref)) { + $pdi = new pdi($ref->get_PDI_ID(), $catalog['cat_lvl'], "NOW"); + $pdi->set_Short_Title($catalog['short_title']); + $pdi->set_Group_Title($catalog['short_title']); + $pdi->set_Description($catalog['description']); + + if ($catalog['ia_controls']) { + $ia_controls = array(); + foreach (explode(" ", $catalog['ia_controls']) as $ia) { + $ia_controls[] = new ia_control($ref->get_PDI_ID(), substr($ia, 0, - 2), substr($ia, - 1)); + } + + if (! $db->save_IA_Control($ia_controls)) { + print "error updating ia controls on id: " . $ref->get_ID() . "
"; + } + } + + // Check for retina data + if ($catalog['retina_id']) { + $retina = new retina($ref->get_PDI_ID(), $catalog['retina_id']); + + if (! $db->save_Retina($retina)) { + print "error updating retina id: " . $catalog['retina_id'] . "
"; + } + } + + // Vul_ID + if ($catalog['vul_id']) {} + + if ($catalog['sv_rule_id']) { + $sv_rule = array(); + foreach (explode(" ", $catalog['sv_rule_id']) as $rule) { + $sv_rule[] = new sv_rule($ref->get_PDI_ID(), $rule); + } + + if (! $db->save_SV_Rule($sv_rule)) { + print "error updating sv rule on pdi: " . $ref->get_ID() . "
"; + } + } + + if ($catalog['nessus_id']) { + $nessus = new nessus($ref->get_PDI_ID(), $catalog['nessus_id']); + + if (! $db->save_Nessus($nessus)) { + print "error updating nessus id: " . $catalog['nessus_id'] . "
"; + } + } + } else { + $pdi = new pdi(0, $catalog['cat_lvl'], "NOW"); + $pdi->set_Short_Title($catalog['short_title']); + $pdi->set_Group_Title($catalog['short_title']); + $pdi->set_Description($catalog['description']); + + $pdi_id = $db->save_PDI($pdi); + + if ($catalog['stig_id'] != 'No Reference') { + $stig = new stig($pdi_id, $catalog['stig_id'], $catalog['description']); + $ref = $stig; + $db->add_Stig($stig); + } + + if ($catalog['vms_id'] != 'No Reference') { + $golddisk = new golddisk($pdi_id, $catalog['vms_id'], $catalog['short_title']); + + if ($ref == null) { + $ref = $golddisk; + } + + $db->save_GoldDisk($golddisk); + } + + if ($catalog['ia_controls']) { + $ia_controls = array(); + foreach (explode(" ", $catalog['ia_controls']) as $ia) { + $ia_controls[] = new ia_control($pdi_id, substr($ia, 0, - 2), substr($ia, - 1)); + } + + if (! $db->save_IA_Control($ia_controls)) { + print "error updating ia controls on pdi_id: " . $ref->get_ID() . "
"; + } + } + + // Check for retina data + if ($catalog['retina_id']) { + $retina = new retina($pdi_id, $catalog['retina_id']); + + if (! $db->save_Retina($retina)) { + print "error updating retina id: " . $catalog['retina_id'] . "
"; + } + } + + // Vul_ID + if ($catalog['vul_id']) {} + + // sv_rule + if ($catalog['sv_rule_id']) { + $sv_rule = array(); + foreach (explode(" ", $catalog['sv_rule_id']) as $rule) { + $sv_rule[] = new sv_rule($pdi_id, $rule); + } + + if (! $db->save_SV_Rule($sv_rule)) { + print "error updating sv rule on pdi: " . $ref->get_ID() . "
"; + } + } + + if ($catalog['nessus_id']) { + $nessus = new nessus($pdi_id, $catalog['nessus_id']); + + if (! $db->save_Nessus($nessus)) { + print "error updating nessus id: " . $catalog['nessus_id'] . "
"; + } + } + } + } + fclose($handle); } - unset($val, $x, $var); - return $arr; - } - /** - * Function for fixing a DISA OVAL file - */ - public function fix_Oval() { - chdir("../tmp"); - $files = glob("*-oval.xml"); - $ret = ''; - $db = new db(); + /** + * function for SRR script + * runs script net-SRR.pl + * exports a csv format file + */ + public function net_SRR() + {} - foreach ($files as $file) { - $xml = new DOMDocument(); - if (!$xml->load($file)) { - error_log("error reading xml file"); - } - $xml->formatOutput = true; - $xml->preserveWhiteSpace = true; - $const_arr = null; + /** + * function for unix SRR conversion to csv + * runs script unix-xml-to-echecklist.pl + * runs script unix-srr-to-csv.pl + */ + public function unix_srr_to_csv() + {} - $variables = $xml->getElementsByTagName("variables") - ->item(0); - $first_node = $variables->firstChild; - while ($node = $xml->getElementsByTagName("external_variable") - ->item(0)) { - $id = $node->getAttribute("id"); - $id = explode(':', $id)[3]; + /** + * Function to import DISA STIG content to database + * + * @param array $request + */ + public function import_STIG_XML($request = array()) + { + $script = realpath(defined('PHP_BIN') ? PHP_BIN : PHP) . " " . realpath(DOC_ROOT . "/exec/background_stigs.php") . " " . (isset($request['delete']) ? ' --delete' : '') . (isset($request['override']) ? " --ia" : ""); - $comment = $node->getAttribute("comment"); - $ver = $node->getAttribute("version"); - $datatype = $node->getAttribute("datatype"); + $shell = new COM("WScript.Shell"); + $shell->CurrentDirectory = DOC_ROOT . "/exec"; + $shell->run($script, 0, false); - $tmp = $db->get_Oval_Const($id); - $const_arr[$tmp['const_id']]['values'] = $tmp['values']; - $const_arr[$tmp['const_id']]['ver'] = $ver; - $const_arr[$tmp['const_id']]['datatype'] = $datatype; - $const_arr[$tmp['const_id']]['comment'] = $comment; + header("location: " . $_SERVER['HTTP_REFERER']); + } - $var_com = $xml->createElement('variable_component'); - $var_com->setAttribute('var_ref', "oval:smc.gpea.windows:var:" . $tmp['const_id']); + /** + * Function to convert a retina CSV to an eChecklist and store on database + */ + public function retina_csv_echecklist() + { + $files = glob('*.csv'); + $db = new db(); - $loc_var = $xml->createElement('local_variable'); - $loc_var->setAttribute('id', "oval:mil.disa.fso.windows:var:" . $id); - $loc_var->setAttribute('version', $ver); - $loc_var->setAttribute('datatype', $datatype); - $loc_var->setAttribute('comment', $comment); - $loc_var->appendChild($var_com); + $source = $db->get_Sources('Retina'); + $ste = $db->get_STE($_REQUEST['ste'])[0]; - $variables->replaceChild($loc_var, $node); - } + foreach ($files as $file) { + $scan = new scan(null, $source, $ste, '1', $file, 'CURRENT_TIMESTAMP'); + $db->save_Scan($scan); - foreach ($const_arr as $key => $value) { - $const_var = $xml->createElement('constant_variable'); - $const_var->setAttribute('id', 'oval:smc.gpea.windows:var:' . $key); - $const_var->setAttribute('version', $const_arr[$key]['ver']); - $const_var->setAttribute('datatype', $const_arr[$key]['datatype']); - $const_var->setAttribute('comment', $const_arr[$key]['comment']); + exec(PERL . "/perl " . DOC_ROOT . "/exec/retina-csv-to-echecklist.pl " . DOC_ROOT . "/tmp/$file --db", $output, $result); + } + } - foreach ($value['values'] as $val) { - $txt = $xml->createTextNode($val); - $val_var = $xml->createElement("value"); - $val_var->appendChild($txt); + /** + * function to import golddisk info into scans table + * runs script golddisk-xml-to-echecklist.pl + */ + public function golddisk_xml_echecklist() + { + $files = glob('*.xml'); + $db = new db(); - $const_var->appendChild($val_var); + $source = $db->get_Sources('Golddisk'); + $ste = $db->get_STE($_REQUEST['ste'])[0]; + + foreach ($files as $file) { + $scan = new scan(null, $source, $ste, '1', $file, 'CURRENT_TIMESTAMP'); + $db->save_Scan($scan); + + exec(PERL . "/perl " . DOC_ROOT . "/exec/golddisk-xml-to-echecklist.pl " . DOC_ROOT . "/tmp/$file --db", $output, $result); + } + } + + /** + */ + public function import_IAVM_CVE() + { + $filename = '../tmp/iavm-to-cve(u).xml'; + $xml = simplexml_load_file($filename); + $db = new db(); + + foreach ($xml->IAVM as $iavm) { + $vms_id = preg_replace('/V[0]+/', 'V-', (string) $iavm->S['VMSKey']); + $stig_id = (string) $iavm->S['IAVM']; + $title = (string) $iavm->S['Title']; + $release_date = DateTime::createFromFormat('d M Y', $iavm->S['ReleaseDate']); + $revision_date = DateTime::createFromFormat('d M Y', $iavm->Revision['Date']); + + $cves_tags = $iavm->CVEs; + $cves = array(); + + $pdi = $db->get_Stig($stig_id); + if (is_array($pdi) && count($pdi) && isset($pdi[0]) && is_a($pdi[0], 'stig')) { + $pdi = $pdi[0]; + } + + if (is_null($pdi)) { + $pdi = $db->get_GoldDisk($vms_id); + if (is_array($pdi) && count($pdi) && isset($pdi[0]) && is_a($pdi[0], 'golddisk')) { + $pdi = $pdi[0]; + } + } + + if (is_null($pdi)) { + $cat_lvl = substr_count((string) $iavm->S['Severity'], 'I'); + $pdi = new pdi(null, $cat_lvl, (string) $iavm->S['ReleaseDate']); + $pdi->set_Short_Title($title); + $pdi->set_Group_Title($title); + $pdi->set_Description($title); + $pdi_id = $db->save_PDI($pdi); + + $stig = new stig($pdi_id, $stig_id, $title); + $db->add_Stig($stig); + + $golddisk = new golddisk($pdi_id, $vms_id, $title); + $db->save_GoldDisk($golddisk); + } else { + $pdi_id = $pdi->get_PDI_ID(); + } + + foreach ($cves_tags->CVENumber as $cve) { + $cve_id = (string) $cve; + + $cves[] = new cve(null, $cve_id, $release_date, $title); + } + + $db->add_CVE($cves); + + $ref_tags = $iavm->References; + $refs = array(); + + foreach ($ref_tags->Reference as $ref) { + $ref_type = ''; + $adv_id = ''; + $url = (string) $ref['URL']; + $name = (string) $ref['RefName']; + $match = array(); + + $refs[] = new advisory($pdi_id, $adv_id, $name, $ref_type, $url); + } } - $variables->appendChild($const_var); - } + $ref = $row[8]; + $url = $row[9]; - rename($file, "oval\\$file"); - return $xml->saveXML(); + if (strpos($ref, 'Microsoft') !== false) { + $x ++; + $type = 'Microsoft'; + $ret = preg_match('/(MS\d{2}\-\d{3}|KB\d{6,7}|\d{6,7})/', $ref, $match); + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($ref, 'Adobe') !== false) { + $x ++; + $type = 'Adobe'; + $ret = preg_match('/(APSA\d{2}\-\d{2}|APSB\d{2}\-\d{2})/', $ref, $match); + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($ref, 'Apache') !== false) { + $x ++; + $type = 'Apache'; + $ret = preg_match('/(CVE\-\d{4}\-\d{4}|S\d\-\d{3})/', $ref, $match); + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($ref, 'CERT') !== false) { + $x ++; + $type = 'US-CERT'; + $match = array(); + + if (strpos($url, 'techalerts') !== false) { + $ret = preg_match('/(TA\d{2}\-\d{3}\s).html/', $url, $match); + } elseif (strpos($url, 'vuls') !== false) { + $ret = preg_match('/([^\/]+)$/', $url, $match); + } + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($ref, 'Cisco') !== false) { + $x ++; + $type = 'Cisco'; + $ret = preg_match('/([^\/]+)(\.s?html)$/', $url, $match); + + if (count($match) > 0) { + $id = $match[1]; + } else { + $ret = preg_match('/([^\/]+)$/', $url, $match); + if (count($match)) { + $id = $match[1]; + } + } + } elseif (strpos($ref, 'Citrix') !== false) { + $x ++; + $type = 'Citrix'; + $ret = preg_match('/([^\/]+)$/', $url, $match); + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($ref, 'Debian') !== false) { + $x ++; + $type = 'Debian'; + $ret = preg_match('/([^\/]+)$/', $url, $match); + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($ref, 'HP') !== false) { + $x ++; + $type = 'HP'; + $ret = preg_match('/(HPSB\S+\ SSRT\S+)[\ ?\)?]/', $ref, $match); + + if (count($match)) { + $id = $match[1]; + } else { + $ret = preg_match('/(HPSB\S+)[\ ?\)?]/', $ref, $match); + if (count($match)) { + $id = $match[1]; + } + } + } elseif (strpos($ref, 'IBM') !== false) { + $x ++; + $type = 'IBM'; + $ret = preg_match('/(\d{5,8})/', $ref, $match); + + if (count($match)) { + $id = $match[1]; + } else { + $ret = preg_match('/([^\=|\/]+)$/', $url, $match); + if (count($match)) { + $id = $match[1]; + } + } + } elseif (strpos($ref, 'Juniper') !== false) { + $x ++; + $type = 'Juniper'; + $ret = preg_match('/(PSN\-\d{4}\-\d{2}\-\d{3}|JSA\d{5})/', $url, $match); + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($ref, 'Oracle') !== false) { + $x ++; + $type = 'Oracle'; + $url = basename($url); + $ret = preg_match('/([\S]+)\.html/', $url, $match); + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($ref, 'McAfee') !== false) { + $x ++; + $type = 'McAfee'; + $query = parse_query($url); + + if (count($match)) { + $id = isset($query['id']) ? $query['id'] : ''; + } + } elseif (strpos($ref, 'Red Hat') !== false) { + $x ++; + $type = 'Red Hat'; + $ret = preg_match('/([^\/]+)\.html/', $url, $match); + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($ref, 'Secunia') !== false) { + $x ++; + $type = 'Secunia'; + $ret = preg_match('/([^\/]+)\/([^\/]+)\/?$/', $url, $match); + + if (count($match)) { + if ($match[2] == 'advisory') { + $id = $match[1]; + } elseif (is_numeric($match[1]) && count($match[2]) == 1) { + $id = $match[1]; + } else { + $id = $match[2]; + } + } + } elseif (strpos($url, 'securitytracker') !== false) { + $x ++; + $type = 'Security Tracker'; + $ret = preg_match('/([^\/]+)\.html$/', $url, $match); + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($ref, 'SecurityFocus') !== false) { + $x ++; + $type = 'SecurityFocus'; + $ret = preg_match('/([^\/]+)\/?$/', $url, $match); + + if (count($match)) { + if ($match[1] != 'info') { + $id = $match[1]; + } else { + $ret = preg_match('/([^\/]+)\/info/', $url, $match); + $id = $match[1]; + } + } + } elseif (strpos($ref, 'Sun') !== false) { + $x ++; + $type = 'Sun'; + $query = parse_query($url); + + $id = isset($query['assetkey']) ? $query['assetkey'] : ''; + + if (! $id) { + $ret = preg_match('/([^\/]+)$/', parse_url($url, PHP_URL_PATH), $match); + $id = $match[1]; + } + } elseif (strpos($ref, 'Symantec') !== false) { + $x ++; + $type = 'Symantec'; + $ret = preg_match('/(\d{5}|SYM\d{2}\-\d{3})/', $ref, $match); + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($url, 'ZDI') !== false) { + $x ++; + $type = 'ZDI'; + $ret = preg_match('/([^\/]+)(\.html|\/)$/', $url, $match); + + if (count($match)) { + $id = $match[1]; + } + } elseif (strpos($ref, 'Wireshark') !== false) { + $x ++; + $type = 'Wireshark'; + $ret = preg_match('/([^\/]+)\.html$/', $url, $match); + + if (count($match)) { + $id = $match[1]; + } + } } - } - private function getElementById($doc, $id) { - $xpath = new DOMXPath($doc); - return $xpath->query("//*[@id='$id']") - ->item(0); - } + /** + * + * @param string $in + * @return multitype:Ambigous <> + */ + public function parse_query($in) + { + /** + * Use this function to parse out the query array element from + * the output of parse_url(). + */ + $query_string = substr($in, strpos($in, '?') + 1); + $query_arr = explode('&', $query_string); + $arr = array(); + foreach ($query_arr as $val) { + $x = explode('=', $val); + $arr[$x[0]] = isset($x[1]) ? $x[1] : ''; + } + unset($val, $x, $var); + return $arr; + } + + /** + * Function for fixing a DISA OVAL file + */ + public function fix_Oval() + { + chdir("../tmp"); + $files = glob("*-oval.xml"); + $ret = ''; + $db = new db(); + + foreach ($files as $file) { + $xml = new DOMDocument(); + if (! $xml->load($file)) { + error_log("error reading xml file"); + } + $xml->formatOutput = true; + $xml->preserveWhiteSpace = true; + $const_arr = null; + + $variables = $xml->getElementsByTagName("variables")->item(0); + $first_node = $variables->firstChild; + while ($node = $xml->getElementsByTagName("external_variable")->item(0)) { + $id = $node->getAttribute("id"); + $id = explode(':', $id)[3]; + + $comment = $node->getAttribute("comment"); + $ver = $node->getAttribute("version"); + $datatype = $node->getAttribute("datatype"); + + $tmp = $db->get_Oval_Const($id); + $const_arr[$tmp['const_id']]['values'] = $tmp['values']; + $const_arr[$tmp['const_id']]['ver'] = $ver; + $const_arr[$tmp['const_id']]['datatype'] = $datatype; + $const_arr[$tmp['const_id']]['comment'] = $comment; + + $var_com = $xml->createElement('variable_component'); + $var_com->setAttribute('var_ref', "oval:smc.gpea.windows:var:" . $tmp['const_id']); + + $loc_var = $xml->createElement('local_variable'); + $loc_var->setAttribute('id', "oval:mil.disa.fso.windows:var:" . $id); + $loc_var->setAttribute('version', $ver); + $loc_var->setAttribute('datatype', $datatype); + $loc_var->setAttribute('comment', $comment); + $loc_var->appendChild($var_com); + + $variables->replaceChild($loc_var, $node); + } + + foreach ($const_arr as $key => $value) { + $const_var = $xml->createElement('constant_variable'); + $const_var->setAttribute('id', 'oval:smc.gpea.windows:var:' . $key); + $const_var->setAttribute('version', $const_arr[$key]['ver']); + $const_var->setAttribute('datatype', $const_arr[$key]['datatype']); + $const_var->setAttribute('comment', $const_arr[$key]['comment']); + + foreach ($value['values'] as $val) { + $txt = $xml->createTextNode($val); + $val_var = $xml->createElement("value"); + $val_var->appendChild($txt); + + $const_var->appendChild($val_var); + } + + $variables->appendChild($const_var); + } + + rename($file, "oval\\$file"); + return $xml->saveXML(); + } + } + + private function getElementById($doc, $id) + { + $xpath = new DOMXPath($doc); + return $xpath->query("//*[@id='$id']")->item(0); + } } diff --git a/classes/scan.inc b/classes/scan.inc index 0870132..c1c7c63 100644 --- a/classes/scan.inc +++ b/classes/scan.inc @@ -83,7 +83,7 @@ class scan /** * Array of hosts * - * @var array + * @var array:host_list */ protected $host_list = array(); @@ -613,6 +613,31 @@ class scan { $this->host_count = $total_host_count_in; } + + /** + * Method to set a host error + * + * @param int $tgt_id + * @param boolean $is_error + * @param string $err_msg + * + * @return boolean + */ + public function set_Host_Error($tgt_id, $is_error, $err_msg = null) + { + if(isset($this->host_list[$tgt_id])) { + $h = $this->host_list[$tgt_id]; + + $h->setScanError($is_error); + $h->setScanNotes($err_msg); + + $this->host_list[$tgt_id] = $h; + + return true; + } + + return false; + } /** * Function to return string of the td row for the upload progress page diff --git a/classes/ste_cat.inc b/classes/ste_cat.inc index 5b3bc86..cf6f4a3 100644 --- a/classes/ste_cat.inc +++ b/classes/ste_cat.inc @@ -254,10 +254,10 @@ class ste_cat */ public function get_Table_Row($intCount = 0, $status_count = null) { - $nf = 0; - $open = 0; - $na = 0; - if (!is_null($status_count)) { + $nf = $this->nf; + $open = $this->open; + $na = $this->na; + if (!is_null($status_count) && is_array($status_count)) { if (isset($status_count['nf'])) { $nf = $status_count['nf']; } @@ -271,6 +271,10 @@ class ste_cat } } + if(!$intCount) { + $intCount = $this->tgt_count; + } + $cat_sources = []; if (is_array($this->sources) && count($this->sources)) { foreach ($this->sources as $src) { diff --git a/classes/system.inc b/classes/system.inc index e5cab1c..8d9f036 100644 --- a/classes/system.inc +++ b/classes/system.inc @@ -110,7 +110,7 @@ class system { /** * System diagram * - * @var binary + * @var mixed */ protected $diagram = null; @@ -294,7 +294,7 @@ class system { /** * Getter function for system diagram * - * @return binary + * @return mixed */ public function get_Diagram() { return $this->diagram; @@ -303,7 +303,7 @@ class system { /** * Setter function for system diagram * - * @param binary $bin_diag_in + * @param mixed $bin_diag_in */ public function set_Diagram($bin_diag_in) { $this->diagram = $bin_diag_in; diff --git a/conf/my.ini b/conf/my.ini index 5133c37..6360dc3 100644 --- a/conf/my.ini +++ b/conf/my.ini @@ -147,8 +147,7 @@ innodb_log_group_home_dir = "C:/xampp/mysql/data" #innodb_log_arch_dir = "C:/xampp/mysql/data" ## You can set .._buffer_pool_size up to 50 - 80 % ## of RAM but beware of setting memory usage too high -innodb_buffer_pool_size = 16M -innodb_additional_mem_pool_size = 2M +innodb_buffer_pool_size = 20M ## Set .._log_file_size to 25 % of buffer pool size innodb_log_file_size = 5M innodb_log_buffer_size = 8M diff --git a/conf/php-dev.ini b/conf/php-dev.ini new file mode 100644 index 0000000..8d1c1ee --- /dev/null +++ b/conf/php-dev.ini @@ -0,0 +1,2050 @@ +[PHP] + +;;;;;;;;;;;;;;;;;;; +; About php.ini ; +;;;;;;;;;;;;;;;;;;; +; PHP's initialization file, generally called php.ini, is responsible for +; configuring many of the aspects of PHP's behavior. + +; PHP attempts to find and load this configuration from a number of locations. +; The following is a summary of its search order: +; 1. SAPI module specific location. +; 2. The PHPRC environment variable. (As of PHP 5.2.0) +; 3. A number of predefined registry keys on Windows (As of PHP 5.2.0) +; 4. Current working directory (except CLI) +; 5. The web server's directory (for SAPI modules), or directory of PHP +; (otherwise in Windows) +; 6. The directory from the --with-config-file-path compile time option, or the +; Windows directory (C:\windows or C:\winnt) +; See the PHP docs for more specific information. +; http://php.net/configuration.file + +; The syntax of the file is extremely simple. Whitespace and Lines +; beginning with a semicolon are silently ignored (as you probably guessed). +; Section headers (e.g. [Foo]) are also silently ignored, even though +; they might mean something in the future. + +; Directives following the section heading [PATH=/www/mysite] only +; apply to PHP files in the /www/mysite directory. Directives +; following the section heading [HOST=www.example.com] only apply to +; PHP files served from www.example.com. Directives set in these +; special sections cannot be overridden by user-defined INI files or +; at runtime. Currently, [PATH=] and [HOST=] sections only work under +; CGI/FastCGI. +; http://php.net/ini.sections + +; Directives are specified using the following syntax: +; directive = value +; Directive names are *case sensitive* - foo=bar is different from FOO=bar. +; Directives are variables used to configure PHP or PHP extensions. +; There is no name validation. If PHP can't find an expected +; directive because it is not set or is mistyped, a default value will be used. + +; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one +; of the INI constants (On, Off, True, False, Yes, No and None) or an expression +; (e.g. E_ALL & ~E_NOTICE), a quoted string ("bar"), or a reference to a +; previously set variable or directive (e.g. ${foo}) + +; Expressions in the INI file are limited to bitwise operators and parentheses: +; | bitwise OR +; ^ bitwise XOR +; & bitwise AND +; ~ bitwise NOT +; ! boolean NOT + +; Boolean flags can be turned on using the values 1, On, True or Yes. +; They can be turned off using the values 0, Off, False or No. + +; An empty string can be denoted by simply not writing anything after the equal +; sign, or by using the None keyword: + +; foo = ; sets foo to an empty string +; foo = None ; sets foo to an empty string +; foo = "None" ; sets foo to the string 'None' + +; If you use constants in your value, and these constants belong to a +; dynamically loaded extension (either a PHP extension or a Zend extension), +; you may only use these constants *after* the line that loads the extension. + +;;;;;;;;;;;;;;;;;;; +; About this file ; +;;;;;;;;;;;;;;;;;;; +; PHP comes packaged with two INI files. One that is recommended to be used +; in production environments and one that is recommended to be used in +; development environments. + +; php.ini-production contains settings which hold security, performance and +; best practices at its core. But please be aware, these settings may break +; compatibility with older or less security conscience applications. We +; recommending using the production ini in production and testing environments. + +; php.ini-development is very similar to its production variant, except it's +; much more verbose when it comes to errors. We recommending using the +; development version only in development environments as errors shown to +; application users can inadvertently leak otherwise secure information. + +;;;;;;;;;;;;;;;;;;; +; Quick Reference ; +;;;;;;;;;;;;;;;;;;; +; The following are all the settings which are different in either the production +; or development versions of the INIs with respect to PHP's default behavior. +; Please see the actual settings later in the document for more details as to why +; we recommend these changes in PHP's behavior. + +; allow_call_time_pass_reference +; Default Value: On +; Development Value: Off +; Production Value: Off + +; display_errors +; Default Value: On +; Development Value: On +; Production Value: Off + +; display_startup_errors +; Default Value: Off +; Development Value: On +; Production Value: Off + +; error_reporting +; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED +; Development Value: E_ALL +; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT + +; html_errors +; Default Value: On +; Development Value: On +; Production value: Off + +; log_errors +; Default Value: Off +; Development Value: On +; Production Value: On + +; magic_quotes_gpc +; Default Value: On +; Development Value: Off +; Production Value: Off + +; max_input_time +; Default Value: -1 (Unlimited) +; Development Value: 60 (60 seconds) +; Production Value: 60 (60 seconds) + +; output_buffering +; Default Value: Off +; Development Value: 4096 +; Production Value: 4096 + +; register_argc_argv +; Default Value: On +; Development Value: Off +; Production Value: Off + +; register_long_arrays +; Default Value: On +; Development Value: Off +; Production Value: Off + +; request_order +; Default Value: None +; Development Value: "GP" +; Production Value: "GP" + +; session.bug_compat_42 +; Default Value: On +; Development Value: On +; Production Value: Off + +; session.bug_compat_warn +; Default Value: On +; Development Value: On +; Production Value: Off + +; session.gc_divisor +; Default Value: 100 +; Development Value: 1000 +; Production Value: 1000 + +; session.hash_bits_per_character +; Default Value: 4 +; Development Value: 5 +; Production Value: 5 + +; short_open_tag +; Default Value: On +; Development Value: Off +; Production Value: Off + +; track_errors +; Default Value: Off +; Development Value: On +; Production Value: Off + +; url_rewriter.tags +; Default Value: "a=href,area=href,frame=src,form=,fieldset=" +; Development Value: "a=href,area=href,frame=src,input=src,form=fakeentry" +; Production Value: "a=href,area=href,frame=src,input=src,form=fakeentry" + +; variables_order +; Default Value: "EGPCS" +; Development Value: "GPCS" +; Production Value: "GPCS" + +;;;;;;;;;;;;;;;;;;;; +; php.ini Options ; +;;;;;;;;;;;;;;;;;;;; +; Name for user-defined php.ini (.htaccess) files. Default is ".user.ini" +;user_ini.filename = ".user.ini" + +; To disable this feature set this option to empty value +;user_ini.filename = + +; TTL for user-defined php.ini files (time-to-live) in seconds. Default is 300 seconds (5 minutes) +;user_ini.cache_ttl = 300 + +;;;;;;;;;;;;;;;;;;;; +; Language Options ; +;;;;;;;;;;;;;;;;;;;; + +; Enable the PHP scripting language engine under Apache. +; http://php.net/engine +engine=On + +; This directive determines whether or not PHP will recognize code between +; tags as PHP source which should be processed as such. It's been +; recommended for several years that you not use the short tag "short cut" and +; instead to use the full tag combination. With the wide spread use +; of XML and use of these tags by other languages, the server can become easily +; confused and end up parsing the wrong code in the wrong context. But because +; this short cut has been a feature for such a long time, it's currently still +; supported for backwards compatibility, but we recommend you don't use them. +; Default Value: On +; Development Value: Off +; Production Value: Off +; http://php.net/short-open-tag +short_open_tag=Off +; XAMPP for Linux is currently old fashioned +;short_open_tag = On + +; Allow ASP-style <% %> tags. +; http://php.net/asp-tags +asp_tags=Off + +; The number of significant digits displayed in floating point numbers. +; http://php.net/precision +precision=14 + +; Enforce year 2000 compliance (will cause problems with non-compliant browsers) +; http://php.net/y2k-compliance +y2k_compliance=On + +; Output buffering is a mechanism for controlling how much output data +; (excluding headers and cookies) PHP should keep internally before pushing that +; data to the client. If your application's output exceeds this setting, PHP +; will send that data in chunks of roughly the size you specify. +; Turning on this setting and managing its maximum buffer size can yield some +; interesting side-effects depending on your application and web server. +; You may be able to send headers and cookies after you've already sent output +; through print or echo. You also may see performance benefits if your server is +; emitting less packets due to buffered output versus PHP streaming the output +; as it gets it. On production servers, 4096 bytes is a good setting for performance +; reasons. +; Note: Output buffering can also be controlled via Output Buffering Control +; functions. +; Possible Values: +; On = Enabled and buffer is unlimited. (Use with caution) +; Off = Disabled +; Integer = Enables the buffer and sets its maximum size in bytes. +; Note: This directive is hardcoded to Off for the CLI SAPI +; Default Value: Off +; Development Value: 4096 +; Production Value: 4096 +; http://php.net/output-buffering +output_buffering=4096 + +; You can redirect all of the output of your scripts to a function. For +; example, if you set output_handler to "mb_output_handler", character +; encoding will be transparently converted to the specified encoding. +; Setting any output handler automatically turns on output buffering. +; Note: People who wrote portable scripts should not depend on this ini +; directive. Instead, explicitly set the output handler using ob_start(). +; Using this ini directive may cause problems unless you know what script +; is doing. +; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler" +; and you cannot use both "ob_gzhandler" and "zlib.output_compression". +; Note: output_handler must be empty if this is set 'On' !!!! +; Instead you must use zlib.output_handler. +; http://php.net/output-handler +;output_handler = + +; Transparent output compression using the zlib library +; Valid values for this option are 'off', 'on', or a specific buffer size +; to be used for compression (default is 4KB) +; Note: Resulting chunk size may vary due to nature of compression. PHP +; outputs chunks that are few hundreds bytes each as a result of +; compression. If you prefer a larger chunk size for better +; performance, enable output_buffering in addition. +; Note: You need to use zlib.output_handler instead of the standard +; output_handler, or otherwise the output will be corrupted. +; http://php.net/zlib.output-compression +zlib.output_compression=Off + +; http://php.net/zlib.output-compression-level +;zlib.output_compression_level = -1 + +; You cannot specify additional output handlers if zlib.output_compression +; is activated here. This setting does the same as output_handler but in +; a different order. +; http://php.net/zlib.output-handler +;zlib.output_handler = + +; Implicit flush tells PHP to tell the output layer to flush itself +; automatically after every output block. This is equivalent to calling the +; PHP function flush() after each and every call to print() or echo() and each +; and every HTML block. Turning this option on has serious performance +; implications and is generally recommended for debugging purposes only. +; http://php.net/implicit-flush +; Note: This directive is hardcoded to On for the CLI SAPI +implicit_flush=Off + +; The unserialize callback function will be called (with the undefined class' +; name as parameter), if the unserializer finds an undefined class +; which should be instantiated. A warning appears if the specified function is +; not defined, or if the function doesn't include/implement the missing class. +; So only set this entry, if you really want to implement such a +; callback-function. +unserialize_callback_func= + +; When floats & doubles are serialized store serialize_precision significant +; digits after the floating point. The default value ensures that when floats +; are decoded with unserialize, the data will remain the same. +serialize_precision=100 + +; This directive allows you to enable and disable warnings which PHP will issue +; if you pass a value by reference at function call time. Passing values by +; reference at function call time is a deprecated feature which will be removed +; from PHP at some point in the near future. The acceptable method for passing a +; value by reference to a function is by declaring the reference in the functions +; definition, not at call time. This directive does not disable this feature, it +; only determines whether PHP will warn you about it or not. These warnings +; should enabled in development environments only. +; Default Value: On (Suppress warnings) +; Development Value: Off (Issue warnings) +; Production Value: Off (Issue warnings) +; http://php.net/allow-call-time-pass-reference +allow_call_time_pass_reference=Off + +; open_basedir, if set, limits all file operations to the defined directory +; and below. This directive makes most sense if used in a per-directory +; or per-virtualhost web server configuration file. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +; http://php.net/open-basedir +;open_basedir = + +; This directive allows you to disable certain functions for security reasons. +; It receives a comma-delimited list of function names. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +; http://php.net/disable-functions +disable_functions= + +; This directive allows you to disable certain classes for security reasons. +; It receives a comma-delimited list of class names. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +; http://php.net/disable-classes +disable_classes= + +; Colors for Syntax Highlighting mode. Anything that's acceptable in +; would work. +; http://php.net/syntax-highlighting +;highlight.string = #DD0000 +;highlight.comment = #FF9900 +;highlight.keyword = #007700 +;highlight.bg = #FFFFFF +;highlight.default = #0000BB +;highlight.html = #000000 + +; If enabled, the request will be allowed to complete even if the user aborts +; the request. Consider enabling it if executing long requests, which may end up +; being interrupted by the user or a browser timing out. PHP's default behavior +; is to disable this feature. +; http://php.net/ignore-user-abort +;ignore_user_abort = On + +; Determines the size of the realpath cache to be used by PHP. This value should +; be increased on systems where PHP opens many files to reflect the quantity of +; the file operations performed. +; http://php.net/realpath-cache-size +;realpath_cache_size = 16k + +; Duration of time, in seconds for which to cache realpath information for a given +; file or directory. For systems with rarely changing files, consider increasing this +; value. +; http://php.net/realpath-cache-ttl +;realpath_cache_ttl = 120 + +; Enables or disables the circular reference collector. +; http://php.net/zend.enable-gc +zend.enable_gc=On + +; If enabled, scripts may be written in encodings that are incompatible with +; the scanner. CP936, Big5, CP949 and Shift_JIS are the examples of such +; encodings. To use this feature, mbstring extension must be enabled. +; Default: Off +;zend.multibyte = Off + +; Allows to set the default encoding for the scripts. This value will be used +; unless "declare(encoding=...)" directive appears at the top of the script. +; Only affects if zend.multibyte is set. +; Default: "" +;zend.script_encoding = + +;;;;;;;;;;;;;;;;; +; Miscellaneous ; +;;;;;;;;;;;;;;;;; + +; Decides whether PHP may expose the fact that it is installed on the server +; (e.g. by adding its signature to the Web server header). It is no security +; threat in any way, but it makes it possible to determine whether you use PHP +; on your server or not. +; http://php.net/expose-php +expose_php=Off + +;;;;;;;;;;;;;;;;;;; +; Resource Limits ; +;;;;;;;;;;;;;;;;;;; + +; Maximum execution time of each script, in seconds +; http://php.net/max-execution-time +; Note: This directive is hardcoded to 0 for the CLI SAPI +max_execution_time=30 + +; Maximum amount of time each script may spend parsing request data. It's a good +; idea to limit this time on productions servers in order to eliminate unexpectedly +; long running scripts. +; Note: This directive is hardcoded to -1 for the CLI SAPI +; Default Value: -1 (Unlimited) +; Development Value: 60 (60 seconds) +; Production Value: 60 (60 seconds) +; http://php.net/max-input-time +max_input_time=60 + +; Maximum input variable nesting level +; http://php.net/max-input-nesting-level +;max_input_nesting_level = 64 + +; How many GET/POST/COOKIE input variables may be accepted +; max_input_vars = 1000 + +; Maximum amount of memory a script may consume (128MB) +; http://php.net/memory-limit +memory_limit=1024M + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Error handling and logging ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; This directive informs PHP of which errors, warnings and notices you would like +; it to take action for. The recommended way of setting values for this +; directive is through the use of the error level constants and bitwise +; operators. The error level constants are below here for convenience as well as +; some common settings and their meanings. +; By default, PHP is set to take action on all errors, notices and warnings EXCEPT +; those related to E_NOTICE and E_STRICT, which together cover best practices and +; recommended coding standards in PHP. For performance reasons, this is the +; recommend error reporting setting. Your production server shouldn't be wasting +; resources complaining about best practices and coding standards. That's what +; development servers and development settings are for. +; Note: The php.ini-development file has this setting as E_ALL | E_STRICT. This +; means it pretty much reports everything which is exactly what you want during +; development and early testing. +; +; Error Level Constants: +; E_ALL - All errors and warnings (includes E_STRICT as of PHP 6.0.0) +; E_ERROR - fatal run-time errors +; E_RECOVERABLE_ERROR - almost fatal run-time errors +; E_WARNING - run-time warnings (non-fatal errors) +; E_PARSE - compile-time parse errors +; E_NOTICE - run-time notices (these are warnings which often result +; from a bug in your code, but it's possible that it was +; intentional (e.g., using an uninitialized variable and +; relying on the fact it's automatically initialized to an +; empty string) +; E_STRICT - run-time notices, enable to have PHP suggest changes +; to your code which will ensure the best interoperability +; and forward compatibility of your code +; E_CORE_ERROR - fatal errors that occur during PHP's initial startup +; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's +; initial startup +; E_COMPILE_ERROR - fatal compile-time errors +; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) +; E_USER_ERROR - user-generated error message +; E_USER_WARNING - user-generated warning message +; E_USER_NOTICE - user-generated notice message +; E_DEPRECATED - warn about code that will not work in future versions +; of PHP +; E_USER_DEPRECATED - user-generated deprecation warnings +; +; Common Values: +; E_ALL (Show all errors, warnings and notices including coding standards.) +; E_ALL & ~E_NOTICE (Show all errors, except for notices) +; E_ALL & ~E_NOTICE & ~E_STRICT (Show all errors, except for notices and coding standards warnings.) +; E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR (Show only errors) +; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED +; Development Value: E_ALL +; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT +; http://php.net/error-reporting +error_reporting=E_ALL + +; This directive controls whether or not and where PHP will output errors, +; notices and warnings too. Error output is very useful during development, but +; it could be very dangerous in production environments. Depending on the code +; which is triggering the error, sensitive information could potentially leak +; out of your application such as database usernames and passwords or worse. +; It's recommended that errors be logged on production servers rather than +; having the errors sent to STDOUT. +; Possible Values: +; Off = Do not display any errors +; stderr = Display errors to STDERR (affects only CGI/CLI binaries!) +; On or stdout = Display errors to STDOUT +; Default Value: On +; Development Value: On +; Production Value: Off +; http://php.net/display-errors +display_errors=On + +; The display of errors which occur during PHP's startup sequence are handled +; separately from display_errors. PHP's default behavior is to suppress those +; errors from clients. Turning the display of startup errors on can be useful in +; debugging configuration problems. But, it's strongly recommended that you +; leave this setting off on production servers. +; Default Value: Off +; Development Value: On +; Production Value: Off +; http://php.net/display-startup-errors +; XAMPP: Turn display_startup_errors = Off here for a full Joomla support +display_startup_errors=On + +; Besides displaying errors, PHP can also log errors to locations such as a +; server-specific log, STDERR, or a location specified by the error_log +; directive found below. While errors should not be displayed on productions +; servers they should still be monitored and logging is a great way to do that. +; Default Value: Off +; Development Value: On +; Production Value: On +; http://php.net/log-errors +log_errors=On + +; Set maximum length of log_errors. In error_log information about the source is +; added. The default is 1024 and 0 allows to not apply any maximum length at all. +; http://php.net/log-errors-max-len +log_errors_max_len=1024 + +; Do not log repeated messages. Repeated errors must occur in same file on same +; line unless ignore_repeated_source is set true. +; http://php.net/ignore-repeated-errors +ignore_repeated_errors=Off + +; Ignore source of message when ignoring repeated messages. When this setting +; is On you will not log errors with repeated messages from different files or +; source lines. +; http://php.net/ignore-repeated-source +ignore_repeated_source=Off + +; If this parameter is set to Off, then memory leaks will not be shown (on +; stdout or in the log). This has only effect in a debug compile, and if +; error reporting includes E_WARNING in the allowed list +; http://php.net/report-memleaks +report_memleaks=On + +; This setting is on by default. +;report_zend_debug = 0 + +; Store the last error/warning message in $php_errormsg (boolean). Setting this value +; to On can assist in debugging and is appropriate for development servers. It should +; however be disabled on production servers. +; Default Value: Off +; Development Value: On +; Production Value: Off +; http://php.net/track-errors +;track_errors=On + +; Turn off normal error reporting and emit XML-RPC error XML +; http://php.net/xmlrpc-errors +;xmlrpc_errors = 0 + +; An XML-RPC faultCode +;xmlrpc_error_number = 0 + +; When PHP displays or logs an error, it has the capability of inserting html +; links to documentation related to that error. This directive controls whether +; those HTML links appear in error messages or not. For performance and security +; reasons, it's recommended you disable this on production servers. +; Note: This directive is hardcoded to Off for the CLI SAPI +; Default Value: On +; Development Value: On +; Production value: On +; http://php.net/html-errors +html_errors=On + +; If html_errors is set On PHP produces clickable error messages that direct +; to a page describing the error or function causing the error in detail. +; You can download a copy of the PHP manual from http://php.net/docs +; and change docref_root to the base URL of your local copy including the +; leading '/'. You must also specify the file extension being used including +; the dot. PHP's default behavior is to leave these settings empty. +; Note: Never use this feature for production boxes. +; http://php.net/docref-root +; Examples +;docref_root = "/phpmanual/" + +; http://php.net/docref-ext +;docref_ext = .html + +; String to output before an error message. PHP's default behavior is to leave +; this setting blank. +; http://php.net/error-prepend-string +; Example: +;error_prepend_string = "" + +; String to output after an error message. PHP's default behavior is to leave +; this setting blank. +; http://php.net/error-append-string +; Example: +;error_append_string = "" + +; Log errors to specified file. PHP's default behavior is to leave this value +; empty. +; http://php.net/error-log +; Example: +;error_log = php_errors.log +error_log="C:\xampp\php\logs\php_error_log" +; Log errors to syslog (Event Log on NT, not valid in Windows 95). +;error_log = syslog + +;windows.show_crt_warning +; Default value: 0 +; Development value: 0 +; Production value: 0 + +;;;;;;;;;;;;;;;;; +; Data Handling ; +;;;;;;;;;;;;;;;;; + +; Note - track_vars is ALWAYS enabled + +; The separator used in PHP generated URLs to separate arguments. +; PHP's default setting is "&". +; http://php.net/arg-separator.output +; Example: +;arg_separator.output = "&" + +; List of separator(s) used by PHP to parse input URLs into variables. +; PHP's default setting is "&". +; NOTE: Every character in this directive is considered as separator! +; http://php.net/arg-separator.input +; Example: +;arg_separator.input = ";&" + +; This directive determines which super global arrays are registered when PHP +; starts up. G,P,C,E & S are abbreviations for the following respective super +; globals: GET, POST, COOKIE, ENV and SERVER. There is a performance penalty +; paid for the registration of these arrays and because ENV is not as commonly +; used as the others, ENV is not recommended on productions servers. You +; can still get access to the environment variables through getenv() should you +; need to. +; Default Value: "EGPCS" +; Development Value: "GPCS" +; Production Value: "GPCS"; +; http://php.net/variables-order +variables_order="GPCS" + +; This directive determines which super global data (G,P,C,E & S) should +; be registered into the super global array REQUEST. If so, it also determines +; the order in which that data is registered. The values for this directive are +; specified in the same manner as the variables_order directive, EXCEPT one. +; Leaving this value empty will cause PHP to use the value set in the +; variables_order directive. It does not mean it will leave the super globals +; array REQUEST empty. +; Default Value: None +; Development Value: "GP" +; Production Value: "GP" +; http://php.net/request-order +request_order="GPCS" + +; Whether or not to register the EGPCS variables as global variables. You may +; want to turn this off if you don't want to clutter your scripts' global scope +; with user data. This makes most sense when coupled with track_vars - in which +; case you can access all of the GPC variables through the $HTTP_*_VARS[], +; variables. +; You should do your best to write your scripts so that they do not require +; register_globals to be on; Using form variables as globals can easily lead +; to possible security problems, if the code is not very well thought of. +; http://php.net/register-globals +register_globals=Off + +; Determines whether the deprecated long $HTTP_*_VARS type predefined variables +; are registered by PHP or not. As they are deprecated, we obviously don't +; recommend you use them. They are on by default for compatibility reasons but +; they are not recommended on production servers. +; Default Value: On +; Development Value: Off +; Production Value: Off +; http://php.net/register-long-arrays +register_long_arrays=Off + +; This directive determines whether PHP registers $argv & $argc each time it +; runs. $argv contains an array of all the arguments passed to PHP when a script +; is invoked. $argc contains an integer representing the number of arguments +; that were passed when the script was invoked. These arrays are extremely +; useful when running scripts from the command line. When this directive is +; enabled, registering these variables consumes CPU cycles and memory each time +; a script is executed. For performance reasons, this feature should be disabled +; on production servers. +; Note: This directive is hardcoded to On for the CLI SAPI +; Default Value: On +; Development Value: Off +; Production Value: Off +; http://php.net/register-argc-argv +register_argc_argv=Off + +; When enabled, the ENV, REQUEST and SERVER variables are created when they're +; first used (Just In Time) instead of when the script starts. If these +; variables are not used within a script, having this directive on will result +; in a performance gain. The PHP directive register_argc_argv must be disabled +; for this directive to have any affect. +; http://php.net/auto-globals-jit +auto_globals_jit=On + +; Whether PHP will read the POST data. +; This option is enabled by default. +; Most likely, you won't want to disable this option globally. It causes $_POST +; and $_FILES to always be empty; the only way you will be able to read the +; POST data will be through the php://input stream wrapper. This can be useful +; to proxy requests or to process the POST data in a memory efficient fashion. +; http://php.net/enable-post-data-reading +;enable_post_data_reading = Off + +; Maximum size of POST data that PHP will accept. +; Its value may be 0 to disable the limit. It is ignored if POST data reading +; is disabled through enable_post_data_reading. +; http://php.net/post-max-size +post_max_size=1G + +; Magic quotes are a preprocessing feature of PHP where PHP will attempt to +; escape any character sequences in GET, POST, COOKIE and ENV data which might +; otherwise corrupt data being placed in resources such as databases before +; making that data available to you. Because of character encoding issues and +; non-standard SQL implementations across many databases, it's not currently +; possible for this feature to be 100% accurate. PHP's default behavior is to +; enable the feature. We strongly recommend you use the escaping mechanisms +; designed specifically for the database your using instead of relying on this +; feature. Also note, this feature has been deprecated as of PHP 5.3.0 and is +; scheduled for removal in PHP 6. +; Default Value: On +; Development Value: Off +; Production Value: Off +; http://php.net/magic-quotes-gpc +magic_quotes_gpc=Off + +; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. +; http://php.net/magic-quotes-runtime +magic_quotes_runtime=Off + +; Use Sybase-style magic quotes (escape ' with '' instead of \'). +; http://php.net/magic-quotes-sybase +magic_quotes_sybase=Off + +; Automatically add files before PHP document. +; http://php.net/auto-prepend-file +auto_prepend_file= + +; Automatically add files after PHP document. +; http://php.net/auto-append-file +auto_append_file= + +; By default, PHP will output a character encoding using +; the Content-type: header. To disable sending of the charset, simply +; set it to be empty. +; +; PHP's built-in default is text/html +; http://php.net/default-mimetype +default_mimetype="text/html" + +; PHP's default character set is set to empty. +; http://php.net/default-charset +;default_charset = "UTF-8" + +; Always populate the $HTTP_RAW_POST_DATA variable. PHP's default behavior is +; to disable this feature. If post reading is disabled through +; enable_post_data_reading, $HTTP_RAW_POST_DATA is *NOT* populated. +; http://php.net/always-populate-raw-post-data +;always_populate_raw_post_data = On + +;;;;;;;;;;;;;;;;;;;;;;;;; +; Paths and Directories ; +;;;;;;;;;;;;;;;;;;;;;;;;; + +; UNIX: "/path1:/path2" +;include_path = ".:/php/includes" +; +; Windows: "\path1;\path2" +include_path=".;C:\xampp\php\PEAR;C:\xampp\www;C:\xampp\www\inc;C:\xampp\www\classes" +; +; PHP's default setting for include_path is ".;/path/to/php/pear" +; http://php.net/include-path + +; The root of the PHP pages, used only if nonempty. +; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root +; if you are running php as a CGI under any web server (other than IIS) +; see documentation for security issues. The alternate is to use the +; cgi.force_redirect configuration below +; http://php.net/doc-root +doc_root= + +; The directory under which PHP opens the script using /~username used only +; if nonempty. +; http://php.net/user-dir +user_dir= + +; Directory in which the loadable extensions (modules) reside. +; http://php.net/extension-dir +; extension_dir = "./" +; On windows: +extension_dir="C:\xampp\php\ext" + +; Whether or not to enable the dl() function. The dl() function does NOT work +; properly in multithreaded servers, such as IIS or Zeus, and is automatically +; disabled on them. +; http://php.net/enable-dl +enable_dl=On + +; cgi.force_redirect is necessary to provide security running PHP as a CGI under +; most web servers. Left undefined, PHP turns this on by default. You can +; turn it off here AT YOUR OWN RISK +; **You CAN safely turn this off for IIS, in fact, you MUST.** +; http://php.net/cgi.force-redirect +;cgi.force_redirect = 1 + +; if cgi.nph is enabled it will force cgi to always sent Status: 200 with +; every request. PHP's default behavior is to disable this feature. +;cgi.nph = 1 + +; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape +; (iPlanet) web servers, you MAY need to set an environment variable name that PHP +; will look for to know it is OK to continue execution. Setting this variable MAY +; cause security issues, KNOW WHAT YOU ARE DOING FIRST. +; http://php.net/cgi.redirect-status-env +;cgi.redirect_status_env = ; + +; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI. PHP's +; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok +; what PATH_INFO is. For more information on PATH_INFO, see the cgi specs. Setting +; this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting +; of zero causes PHP to behave as before. Default is 1. You should fix your scripts +; to use SCRIPT_FILENAME rather than PATH_TRANSLATED. +; http://php.net/cgi.fix-pathinfo +;cgi.fix_pathinfo=1 + +; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate +; security tokens of the calling client. This allows IIS to define the +; security context that the request runs under. mod_fastcgi under Apache +; does not currently support this feature (03/17/2002) +; Set to 1 if running under IIS. Default is zero. +; http://php.net/fastcgi.impersonate +;fastcgi.impersonate = 1; + +; Disable logging through FastCGI connection. PHP's default behavior is to enable +; this feature. +;fastcgi.logging = 0 + +; cgi.rfc2616_headers configuration option tells PHP what type of headers to +; use when sending HTTP response code. If it's set 0 PHP sends Status: header that +; is supported by Apache. When this option is set to 1 PHP will send +; RFC2616 compliant header. +; Default is zero. +; http://php.net/cgi.rfc2616-headers +;cgi.rfc2616_headers = 0 + +;;;;;;;;;;;;;;;; +; File Uploads ; +;;;;;;;;;;;;;;;; + +; Whether to allow HTTP file uploads. +; http://php.net/file-uploads +file_uploads=On + +; Temporary directory for HTTP uploaded files (will use system default if not +; specified). +; http://php.net/upload-tmp-dir +upload_tmp_dir="C:\xampp\tmp" + +; Maximum allowed size for uploaded files. +; http://php.net/upload-max-filesize +upload_max_filesize=1G + +; Maximum number of files that can be uploaded via a single request +max_file_uploads=20 + +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; + +; Whether to allow the treatment of URLs (like http:// or ftp://) as files. +; http://php.net/allow-url-fopen +allow_url_fopen=On + +; Whether to allow include/require to open URLs (like http:// or ftp://) as files. +; http://php.net/allow-url-include +allow_url_include=Off + +; Define the anonymous ftp password (your email address). PHP's default setting +; for this is empty. +; http://php.net/from +;from="john@doe.com" + +; Define the User-Agent string. PHP's default setting for this is empty. +; http://php.net/user-agent +;user_agent="PHP" + +; Default timeout for socket based streams (seconds) +; http://php.net/default-socket-timeout +default_socket_timeout=60 + +; If your scripts have to deal with files from Macintosh systems, +; or you are running on a Mac and need to deal with files from +; unix or win32 systems, setting this flag will cause PHP to +; automatically detect the EOL character in those files so that +; fgets() and file() will work regardless of the source of the file. +; http://php.net/auto-detect-line-endings +;auto_detect_line_endings = Off + +;;;;;;;;;;;;;;;;;;;;;; +; Dynamic Extensions ; +;;;;;;;;;;;;;;;;;;;;;; + +; If you wish to have an extension loaded automatically, use the following +; syntax: +; +; extension=modulename.extension +; +; For example, on Windows: +; +; extension=msql.dll +; +; ... or under UNIX: +; +; extension=msql.so +; +; ... or with a path: +; +; extension=/path/to/extension/msql.so +; +; If you only provide the name of the extension, PHP will look for it in its +; default extension directory. +; +; Windows Extensions +; Note that ODBC support is built in, so no dll is needed for it. +; Note that many DLL files are located in the extensions/ (PHP 4) ext/ (PHP 5) +; extension folders as well as the separate PECL DLL download (PHP 5). +; Be sure to appropriately set the extension_dir directive. + +extension=php_bz2.dll +extension=php_curl.dll +extension=php_mbstring.dll +extension=php_exif.dll +;extension=php_fileinfo.dll +extension=php_gd2.dll +extension=php_gettext.dll +;extension=php_gmp.dll +;extension=php_intl.dll +;extension=php_imap.dll +;extension=php_interbase.dll +;extension=php_ldap.dll +;extension=php_mssql.dll +;extension=php_mbstring.dll +;extension=php_exif.dll ; Must be after mbstring as it depends on it +;extension=php_mysql.dll +extension=php_mysqli.dll +;extension=php_oci8.dll ; Use with Oracle 10gR2 Instant Client +;extension=php_oci8_11g.dll ; Use with Oracle 11gR2 Instant Client + +extension=php_openssl.dll +;extension=php_pdo_firebird.dll +extension=php_pdo_mysql.dll +;extension=php_pdo_oci.dll +;extension=php_pdo_odbc.dll +;extension=php_pdo_pgsql.dll +extension=php_pdo_sqlite.dll +;extension=php_pdo_sqlite_external.dll +;extension=php_pgsql.dll +;extension=php_pspell.dll +;extension=php_shmop.dll +;extension=php_pthreads.dll +; The MIBS data available in the PHP distribution must be installed. +; See http://www.php.net/manual/en/snmp.installation.php +;extension=php_snmp.dll + +extension=php_soap.dll +extension=php_sockets.dll +extension=php_sqlite3.dll +;extension=php_sybase_ct.dll +;extension=php_tidy.dll +extension=php_xmlrpc.dll +extension=php_xsl.dll + +;;;;;;;;;;;;;;;;;;; +; Module Settings ; +;;;;;;;;;;;;;;;;;;; + +[CLI Server] +; Whether the CLI web server uses ANSI color coding in its terminal output. +cli_server.color=On + +[Date] +; Defines the default timezone used by the date functions +; http://php.net/date.timezone +date.timezone=America/Denver + +; http://php.net/date.default-latitude +;date.default_latitude = 31.7667 + +; http://php.net/date.default-longitude +;date.default_longitude = 35.2333 + +; http://php.net/date.sunrise-zenith +;date.sunrise_zenith = 90.583333 + +; http://php.net/date.sunset-zenith +;date.sunset_zenith = 90.583333 + +[filter] +; http://php.net/filter.default +;filter.default = unsafe_raw + +; http://php.net/filter.default-flags +;filter.default_flags = + +[iconv] +;iconv.input_encoding = ISO-8859-1 +;iconv.internal_encoding = ISO-8859-1 +;iconv.output_encoding = ISO-8859-1 + +[intl] +;intl.default_locale = +; This directive allows you to produce PHP errors when some error +; happens within intl functions. The value is the level of the error produced. +; Default is 0, which does not produce any errors. +;intl.error_level = E_WARNING + +[sqlite] +; http://php.net/sqlite.assoc-case +;sqlite.assoc_case = 0 + +[sqlite3] +;sqlite3.extension_dir = + +[Pcre] +;PCRE library backtracking limit. +; http://php.net/pcre.backtrack-limit +;pcre.backtrack_limit=100000 + +;PCRE library recursion limit. +;Please note that if you set this value to a high number you may consume all +;the available process stack and eventually crash PHP (due to reaching the +;stack size limit imposed by the Operating System). +; http://php.net/pcre.recursion-limit +;pcre.recursion_limit=100000 + +[Pdo] +; Whether to pool ODBC connections. Can be one of "strict", "relaxed" or "off" +; http://php.net/pdo-odbc.connection-pooling +;pdo_odbc.connection_pooling=strict + +;pdo_odbc.db2_instance_name + +[Pdo_mysql] +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/pdo_mysql.cache_size +pdo_mysql.cache_size=2000 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/pdo_mysql.default-socket +pdo_mysql.default_socket="MySQL" + +[Phar] +; http://php.net/phar.readonly +;phar.readonly = On + +; http://php.net/phar.require-hash +;phar.require_hash = On + +;phar.cache_list = + +[Syslog] +; Whether or not to define the various syslog variables (e.g. $LOG_PID, +; $LOG_CRON, etc.). Turning it off is a good idea performance-wise. In +; runtime, you can define these variables by calling define_syslog_variables(). +; http://php.net/define-syslog-variables +define_syslog_variables=Off + +[mail function] +; XAMPP: Comment out this if you want to work with an SMTP Server like Mercury +; SMTP = localhost +; smtp_port = 25 + +; For Win32 only. +; http://php.net/sendmail-from +;sendmail_from = postmaster@localhost + +; XAMPP IMPORTANT NOTE (1): If XAMPP is installed in a base directory with spaces (e.g. c:\program filesC:\xampp) fakemail and mailtodisk do not work correctly. +; XAMPP IMPORTANT NOTE (2): In this case please copy the sendmail or mailtodisk folder in your root folder (e.g. C:\sendmail) and use this for sendmail_path. +; XAMPP: Comment out this if you want to work with fakemail for forwarding to your mailbox (sendmail.exe in the sendmail folder) +;sendmail_path = "\"C:\xampp\sendmail\sendmail.exe\" -t" + +; XAMPP: Comment out this if you want to work with mailToDisk, It writes all mails in the C:\xampp\mailoutput folder +sendmail_path="C:\xampp\mailtodisk\mailtodisk.exe" + +; Force the addition of the specified parameters to be passed as extra parameters +; to the sendmail binary. These parameters will always replace the value of +; the 5th parameter to mail(), even in safe mode. +;mail.force_extra_parameters = + +; Add X-PHP-Originating-Script: that will include uid of the script followed by the filename +mail.add_x_header=Off + +; Log all mail() calls including the full path of the script, line #, to address and headers +;mail.log = "C:\xampp\php\logs\php_mail.log" + +[SQL] +; http://php.net/sql.safe-mode +sql.safe_mode=Off + +[ODBC] +; http://php.net/odbc.default-db +;odbc.default_db = Not yet implemented + +; http://php.net/odbc.default-user +;odbc.default_user = Not yet implemented + +; http://php.net/odbc.default-pw +;odbc.default_pw = Not yet implemented + +; Controls the ODBC cursor model. +; Default: SQL_CURSOR_STATIC (default). +;odbc.default_cursortype + +; Allow or prevent persistent links. +; http://php.net/odbc.allow-persistent +odbc.allow_persistent=On + +; Check that a connection is still valid before reuse. +; http://php.net/odbc.check-persistent +odbc.check_persistent=On + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/odbc.max-persistent +odbc.max_persistent=-1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +; http://php.net/odbc.max-links +odbc.max_links=-1 + +; Handling of LONG fields. Returns number of bytes to variables. 0 means +; passthru. +; http://php.net/odbc.defaultlrl +odbc.defaultlrl=4096 + +; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. +; See the documentation on odbc_binmode and odbc_longreadlen for an explanation +; of odbc.defaultlrl and odbc.defaultbinmode +; http://php.net/odbc.defaultbinmode +odbc.defaultbinmode=1 + +;birdstep.max_links = -1 + +[Interbase] +; Allow or prevent persistent links. +ibase.allow_persistent=1 + +; Maximum number of persistent links. -1 means no limit. +ibase.max_persistent=-1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +ibase.max_links=-1 + +; Default database name for ibase_connect(). +;ibase.default_db = + +; Default username for ibase_connect(). +;ibase.default_user = + +; Default password for ibase_connect(). +;ibase.default_password = + +; Default charset for ibase_connect(). +;ibase.default_charset = + +; Default timestamp format. +ibase.timestampformat="%Y-%m-%d %H:%M:%S" + +; Default date format. +ibase.dateformat="%Y-%m-%d" + +; Default time format. +ibase.timeformat="%H:%M:%S" + +[MySQL] +; Allow accessing, from PHP's perspective, local files with LOAD DATA statements +; http://php.net/mysql.allow_local_infile +mysql.allow_local_infile=On + +; Allow or prevent persistent links. +; http://php.net/mysql.allow-persistent +mysql.allow_persistent=On + +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/mysql.cache_size +mysql.cache_size=2000 + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/mysql.max-persistent +mysql.max_persistent=-1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +; http://php.net/mysql.max-links +mysql.max_links=-1 + +; Default port number for mysql_connect(). If unset, mysql_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +; http://php.net/mysql.default-port +mysql.default_port=3306 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/mysql.default-socket +mysql.default_socket="MySQL" + +; Default host for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysql.default-host +mysql.default_host= + +; Default user for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysql.default-user +mysql.default_user= + +; Default password for mysql_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysql.default_password") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +; http://php.net/mysql.default-password +mysql.default_password= + +; Maximum time (in seconds) for connect timeout. -1 means no limit +; http://php.net/mysql.connect-timeout +mysql.connect_timeout=3 + +; Trace mode. When trace_mode is active (=On), warnings for table/index scans and +; SQL-Errors will be displayed. +; http://php.net/mysql.trace-mode +mysql.trace_mode=Off + +[MySQLi] + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/mysqli.max-persistent +mysqli.max_persistent=-1 + +; Allow accessing, from PHP's perspective, local files with LOAD DATA statements +; http://php.net/mysqli.allow_local_infile +mysqli.allow_local_infile=On + +; Allow or prevent persistent links. +; http://php.net/mysqli.allow-persistent +mysqli.allow_persistent=On + +; Maximum number of links. -1 means no limit. +; http://php.net/mysqli.max-links +mysqli.max_links=-1 + +; If mysqlnd is used: Number of cache slots for the internal result set cache +; http://php.net/mysqli.cache_size +mysqli.cache_size=2000 + +; Default port number for mysqli_connect(). If unset, mysqli_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +; http://php.net/mysqli.default-port +mysqli.default_port=3306 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +; http://php.net/mysqli.default-socket +mysqli.default_socket="MySQL" + +; Default host for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysqli.default-host +mysqli.default_host= + +; Default user for mysql_connect() (doesn't apply in safe mode). +; http://php.net/mysqli.default-user +mysqli.default_user= + +; Default password for mysqli_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +; http://php.net/mysqli.default-pw +mysqli.default_pw= + +; Allow or prevent reconnect +mysqli.reconnect=1 + +[mysqlnd] +; Enable / Disable collection of general statstics by mysqlnd which can be +; used to tune and monitor MySQL operations. +; http://php.net/mysqlnd.collect_statistics +mysqlnd.collect_statistics=On + +; Enable / Disable collection of memory usage statstics by mysqlnd which can be +; used to tune and monitor MySQL operations. +; http://php.net/mysqlnd.collect_memory_statistics +mysqlnd.collect_memory_statistics=Off + +; Size of a pre-allocated buffer used when sending commands to MySQL in bytes. +; http://php.net/mysqlnd.net_cmd_buffer_size +;mysqlnd.net_cmd_buffer_size = 2048 + +; Size of a pre-allocated buffer used for reading data sent by the server in +; bytes. +; http://php.net/mysqlnd.net_read_buffer_size +;mysqlnd.net_read_buffer_size = 32768 + +[OCI8] + +; Connection: Enables privileged connections using external +; credentials (OCI_SYSOPER, OCI_SYSDBA) +; http://php.net/oci8.privileged-connect +;oci8.privileged_connect = Off + +; Connection: The maximum number of persistent OCI8 connections per +; process. Using -1 means no limit. +; http://php.net/oci8.max-persistent +;oci8.max_persistent = -1 + +; Connection: The maximum number of seconds a process is allowed to +; maintain an idle persistent connection. Using -1 means idle +; persistent connections will be maintained forever. +; http://php.net/oci8.persistent-timeout +;oci8.persistent_timeout = -1 + +; Connection: The number of seconds that must pass before issuing a +; ping during oci_pconnect() to check the connection validity. When +; set to 0, each oci_pconnect() will cause a ping. Using -1 disables +; pings completely. +; http://php.net/oci8.ping-interval +;oci8.ping_interval = 60 + +; Connection: Set this to a user chosen connection class to be used +; for all pooled server requests with Oracle 11g Database Resident +; Connection Pooling (DRCP). To use DRCP, this value should be set to +; the same string for all web servers running the same application, +; the database pool must be configured, and the connection string must +; specify to use a pooled server. +;oci8.connection_class = + +; High Availability: Using On lets PHP receive Fast Application +; Notification (FAN) events generated when a database node fails. The +; database must also be configured to post FAN events. +;oci8.events = Off + +; Tuning: This option enables statement caching, and specifies how +; many statements to cache. Using 0 disables statement caching. +; http://php.net/oci8.statement-cache-size +;oci8.statement_cache_size = 20 + +; Tuning: Enables statement prefetching and sets the default number of +; rows that will be fetched automatically after statement execution. +; http://php.net/oci8.default-prefetch +;oci8.default_prefetch = 100 + +; Compatibility. Using On means oci_close() will not close +; oci_connect() and oci_new_connect() connections. +; http://php.net/oci8.old-oci-close-semantics +;oci8.old_oci_close_semantics = Off + +[PostgresSQL] +; Allow or prevent persistent links. +; http://php.net/pgsql.allow-persistent +pgsql.allow_persistent=On + +; Detect broken persistent links always with pg_pconnect(). +; Auto reset feature requires a little overheads. +; http://php.net/pgsql.auto-reset-persistent +pgsql.auto_reset_persistent=Off + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/pgsql.max-persistent +pgsql.max_persistent=-1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +; http://php.net/pgsql.max-links +pgsql.max_links=-1 + +; Ignore PostgreSQL backends Notice message or not. +; Notice message logging require a little overheads. +; http://php.net/pgsql.ignore-notice +pgsql.ignore_notice=0 + +; Log PostgreSQL backends Noitce message or not. +; Unless pgsql.ignore_notice=0, module cannot log notice message. +; http://php.net/pgsql.log-notice +pgsql.log_notice=0 + +[Sybase-CT] +; Allow or prevent persistent links. +; http://php.net/sybct.allow-persistent +sybct.allow_persistent=On + +; Maximum number of persistent links. -1 means no limit. +; http://php.net/sybct.max-persistent +sybct.max_persistent=-1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +; http://php.net/sybct.max-links +sybct.max_links=-1 + +; Minimum server message severity to display. +; http://php.net/sybct.min-server-severity +sybct.min_server_severity=10 + +; Minimum client message severity to display. +; http://php.net/sybct.min-client-severity +sybct.min_client_severity=10 + +; Set per-context timeout +; http://php.net/sybct.timeout +;sybct.timeout= + +;sybct.packet_size + +; The maximum time in seconds to wait for a connection attempt to succeed before returning failure. +; Default: one minute +;sybct.login_timeout= + +; The name of the host you claim to be connecting from, for display by sp_who. +; Default: none +;sybct.hostname= + +; Allows you to define how often deadlocks are to be retried. -1 means "forever". +; Default: 0 +;sybct.deadlock_retry_count= + +[bcmath] +; Number of decimal digits for all bcmath functions. +; http://php.net/bcmath.scale +bcmath.scale=0 + +[browscap] +; http://php.net/browscap +browscap="C:\xampp\php\extras\browscap.ini" + +[Session] +; Handler used to store/retrieve data. +; http://php.net/session.save-handler +session.save_handler=files + +; Argument passed to save_handler. In the case of files, this is the path +; where data files are stored. Note: Windows users have to change this +; variable in order to use PHP's session functions. +; +; The path can be defined as: +; +; session.save_path = "N;/path" +; +; where N is an integer. Instead of storing all the session files in +; /path, what this will do is use subdirectories N-levels deep, and +; store the session data in those directories. This is useful if you +; or your OS have problems with lots of files in one directory, and is +; a more efficient layout for servers that handle lots of sessions. +; +; NOTE 1: PHP will not create this directory structure automatically. +; You can use the script in the ext/session dir for that purpose. +; NOTE 2: See the section on garbage collection below if you choose to +; use subdirectories for session storage +; +; The file storage module creates files using mode 600 by default. +; You can change that by using +; +; session.save_path = "N;MODE;/path" +; +; where MODE is the octal representation of the mode. Note that this +; does not overwrite the process's umask. +; http://php.net/session.save-path +session.save_path="C:\xampp\tmp" + +; Whether to use cookies. +; http://php.net/session.use-cookies +session.use_cookies=1 + +; http://php.net/session.cookie-secure +;session.cookie_secure = + +; This option forces PHP to fetch and use a cookie for storing and maintaining +; the session id. We encourage this operation as it's very helpful in combatting +; session hijacking when not specifying and managing your own session id. It is +; not the end all be all of session hijacking defense, but it's a good start. +; http://php.net/session.use-only-cookies +session.use_only_cookies=0 + +; Name of the session (used as cookie name). +; http://php.net/session.name +session.name=SESID + +; Initialize session on request startup. +; http://php.net/session.auto-start +session.auto_start=0 + +; Lifetime in seconds of cookie or, if 0, until browser is restarted. +; http://php.net/session.cookie-lifetime +session.cookie_lifetime=0 + +; The path for which the cookie is valid. +; http://php.net/session.cookie-path +session.cookie_path=/ + +; The domain for which the cookie is valid. +; http://php.net/session.cookie-domain +session.cookie_domain= + +; Whether or not to add the httpOnly flag to the cookie, which makes it inaccessible to browser scripting languages such as JavaScript. +; http://php.net/session.cookie-httponly +session.cookie_httponly= + +; Handler used to serialize data. php is the standard serializer of PHP. +; http://php.net/session.serialize-handler +session.serialize_handler=php + +; Defines the probability that the 'garbage collection' process is started +; on every session initialization. The probability is calculated by using +; gc_probability/gc_divisor. Where session.gc_probability is the numerator +; and gc_divisor is the denominator in the equation. Setting this value to 1 +; when the session.gc_divisor value is 100 will give you approximately a 1% chance +; the gc will run on any give request. +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; http://php.net/session.gc-probability +session.gc_probability=1 + +; Defines the probability that the 'garbage collection' process is started on every +; session initialization. The probability is calculated by using the following equation: +; gc_probability/gc_divisor. Where session.gc_probability is the numerator and +; session.gc_divisor is the denominator in the equation. Setting this value to 1 +; when the session.gc_divisor value is 100 will give you approximately a 1% chance +; the gc will run on any give request. Increasing this value to 1000 will give you +; a 0.1% chance the gc will run on any give request. For high volume production servers, +; this is a more efficient approach. +; Default Value: 100 +; Development Value: 1000 +; Production Value: 1000 +; http://php.net/session.gc-divisor +session.gc_divisor=1000 + +; After this number of seconds, stored data will be seen as 'garbage' and +; cleaned up by the garbage collection process. +; http://php.net/session.gc-maxlifetime +session.gc_maxlifetime=1440 + +; NOTE: If you are using the subdirectory option for storing session files +; (see session.save_path above), then garbage collection does *not* +; happen automatically. You will need to do your own garbage +; collection through a shell script, cron entry, or some other method. +; For example, the following script would is the equivalent of +; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): +; cd /path/to/sessions; find -cmin +24 | xargs rm + +; PHP 4.2 and less have an undocumented feature/bug that allows you to +; to initialize a session variable in the global scope. +; PHP 4.3 and later will warn you, if this feature is used. +; You can disable the feature and the warning separately. At this time, +; the warning is only displayed, if bug_compat_42 is enabled. This feature +; introduces some serious security problems if not handled correctly. It's +; recommended that you do not use this feature on production servers. But you +; should enable this on development servers and enable the warning as well. If you +; do not enable the feature on development servers, you won't be warned when it's +; used and debugging errors caused by this can be difficult to track down. +; Default Value: On +; Development Value: On +; Production Value: Off +; http://php.net/session.bug-compat-42 +session.bug_compat_42=On + +; This setting controls whether or not you are warned by PHP when initializing a +; session value into the global space. session.bug_compat_42 must be enabled before +; these warnings can be issued by PHP. See the directive above for more information. +; Default Value: On +; Development Value: On +; Production Value: Off +; http://php.net/session.bug-compat-warn +session.bug_compat_warn=On + +; Check HTTP Referer to invalidate externally stored URLs containing ids. +; HTTP_REFERER has to contain this substring for the session to be +; considered as valid. +; http://php.net/session.referer-check +session.referer_check= + +; How many bytes to read from the file. +; http://php.net/session.entropy-length +session.entropy_length=0 + +; Specified here to create the session id. +; http://php.net/session.entropy-file +; Defaults to /dev/urandom +; On systems that don't have /dev/urandom but do have /dev/arandom, this will default to /dev/arandom +; If neither are found at compile time, the default is no entropy file. +; On windows, setting the entropy_length setting will activate the +; Windows random source (using the CryptoAPI) +;session.entropy_file = /dev/urandom +session.entropy_file= + +; http://php.net/session.entropy-length +;session.entropy_length = 16 + +; Set to {nocache,private,public,} to determine HTTP caching aspects +; or leave this empty to avoid sending anti-caching headers. +; http://php.net/session.cache-limiter +session.cache_limiter=nocache + +; Document expires after n minutes. +; http://php.net/session.cache-expire +session.cache_expire=180 + +; trans sid support is disabled by default. +; Use of trans sid may risk your users security. +; Use this option with caution. +; - User may send URL contains active session ID +; to other person via. email/irc/etc. +; - URL that contains active session ID may be stored +; in publically accessible computer. +; - User may access your site with the same session ID +; always using URL stored in browser's history or bookmarks. +; http://php.net/session.use-trans-sid +session.use_trans_sid=0 + +; Select a hash function for use in generating session ids. +; Possible Values +; 0 (MD5 128 bits) +; 1 (SHA-1 160 bits) +; This option may also be set to the name of any hash function supported by +; the hash extension. A list of available hashes is returned by the hash_algos() +; function. +; http://php.net/session.hash-function +session.hash_function=0 + +; Define how many bits are stored in each character when converting +; the binary hash data to something readable. +; Possible values: +; 4 (4 bits: 0-9, a-f) +; 5 (5 bits: 0-9, a-v) +; 6 (6 bits: 0-9, a-z, A-Z, "-", ",") +; Default Value: 4 +; Development Value: 5 +; Production Value: 5 +; http://php.net/session.hash-bits-per-character +session.hash_bits_per_character=5 + +; The URL rewriter will look for URLs in a defined set of HTML tags. +; form/fieldset are special; if you include them here, the rewriter will +; add a hidden field with the info which is otherwise appended +; to URLs. If you want XHTML conformity, remove the form entry. +; Note that all valid entries require a "=", even if no value follows. +; Default Value: "a=href,area=href,frame=src,form=,fieldset=" +; Development Value: "a=href,area=href,frame=src,input=src,form=fakeentry" +; Production Value: "a=href,area=href,frame=src,input=src,form=fakeentry" +; http://php.net/url-rewriter.tags +url_rewriter.tags="a=href,area=href,frame=src,input=src,form=fakeentry" + +; Enable upload progress tracking in $_SESSION +; Default Value: On +; Development Value: On +; Production Value: On +; http://php.net/session.upload-progress.enabled +;session.upload_progress.enabled = On + +; Cleanup the progress information as soon as all POST data has been read +; (i.e. upload completed). +; Default Value: On +; Development Value: On +; Production Value: On +; http://php.net/session.upload-progress.cleanup +;session.upload_progress.cleanup = On + +; A prefix used for the upload progress key in $_SESSION +; Default Value: "upload_progress_" +; Development Value: "upload_progress_" +; Production Value: "upload_progress_" +; http://php.net/session.upload-progress.prefix +;session.upload_progress.prefix = "upload_progress_" + +; The index name (concatenated with the prefix) in $_SESSION +; containing the upload progress information +; Default Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Development Value: "PHP_SESSION_UPLOAD_PROGRESS" +; Production Value: "PHP_SESSION_UPLOAD_PROGRESS" +; http://php.net/session.upload-progress.name +;session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS" + +; How frequently the upload progress should be updated. +; Given either in percentages (per-file), or in bytes +; Default Value: "1%" +; Development Value: "1%" +; Production Value: "1%" +; http://php.net/session.upload-progress.freq +;session.upload_progress.freq = "1%" + +; The minimum delay between updates, in seconds +; Default Value: 1 +; Development Value: 1 +; Production Value: 1 +; http://php.net/session.upload-progress.min-freq +;session.upload_progress.min_freq = "1" + +[MSSQL] +; Allow or prevent persistent links. +mssql.allow_persistent=On + +; Maximum number of persistent links. -1 means no limit. +mssql.max_persistent=-1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +mssql.max_links=-1 + +; Minimum error severity to display. +mssql.min_error_severity=10 + +; Minimum message severity to display. +mssql.min_message_severity=10 + +; Compatibility mode with old versions of PHP 3.0. +mssql.compatability_mode=Off + +; Connect timeout +;mssql.connect_timeout = 5 + +; Query timeout +;mssql.timeout = 60 + +; Valid range 0 - 2147483647. Default = 4096. +;mssql.textlimit = 4096 + +; Valid range 0 - 2147483647. Default = 4096. +;mssql.textsize = 4096 + +; Limits the number of records in each batch. 0 = all records in one batch. +;mssql.batchsize = 0 + +; Specify how datetime and datetim4 columns are returned +; On => Returns data converted to SQL server settings +; Off => Returns values as YYYY-MM-DD hh:mm:ss +;mssql.datetimeconvert = On + +; Use NT authentication when connecting to the server +mssql.secure_connection=Off + +; Specify max number of processes. -1 = library default +; msdlib defaults to 25 +; FreeTDS defaults to 4096 +;mssql.max_procs = -1 + +; Specify client character set. +; If empty or not set the client charset from freetds.comf is used +; This is only used when compiled with FreeTDS +;mssql.charset = "ISO-8859-1" + +[Assertion] +; Assert(expr); active by default. +; http://php.net/assert.active +;assert.active = On + +; Issue a PHP warning for each failed assertion. +; http://php.net/assert.warning +;assert.warning = On + +; Don't bail out by default. +; http://php.net/assert.bail +;assert.bail = Off + +; User-function to be called if an assertion fails. +; http://php.net/assert.callback +;assert.callback = 0 + +; Eval the expression with current error_reporting(). Set to true if you want +; error_reporting(0) around the eval(). +; http://php.net/assert.quiet-eval +;assert.quiet_eval = 0 + +[COM_DOT_NET] +extension=php_com_dotnet.dll + +[COM] +; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs +; http://php.net/com.typelib-file +;com.typelib_file = + +; allow Distributed-COM calls +; http://php.net/com.allow-dcom +;com.allow_dcom = true + +; autoregister constants of a components typlib on com_load() +; http://php.net/com.autoregister-typelib +;com.autoregister_typelib = true + +; register constants casesensitive +; http://php.net/com.autoregister-casesensitive +;com.autoregister_casesensitive = false + +; show warnings on duplicate constant registrations +; http://php.net/com.autoregister-verbose +;com.autoregister_verbose = true + +; The default character set code-page to use when passing strings to and from COM objects. +; Default: system ANSI code page +;com.code_page= + +[mbstring] +; language for internal character representation. +; http://php.net/mbstring.language +;mbstring.language = Japanese + +; internal/script encoding. +; Some encoding cannot work as internal encoding. +; (e.g. SJIS, BIG5, ISO-2022-*) +; http://php.net/mbstring.internal-encoding +;mbstring.internal_encoding = EUC-JP + +; http input encoding. +; http://php.net/mbstring.http-input +;mbstring.http_input = auto + +; http output encoding. mb_output_handler must be +; registered as output buffer to function +; http://php.net/mbstring.http-output +;mbstring.http_output = SJIS + +; enable automatic encoding translation according to +; mbstring.internal_encoding setting. Input chars are +; converted to internal encoding by setting this to On. +; Note: Do _not_ use automatic encoding translation for +; portable libs/applications. +; http://php.net/mbstring.encoding-translation +;mbstring.encoding_translation = Off + +; automatic encoding detection order. +; auto means +; http://php.net/mbstring.detect-order +;mbstring.detect_order = auto + +; substitute_character used when character cannot be converted +; one from another +; http://php.net/mbstring.substitute-character +;mbstring.substitute_character = none; + +; overload(replace) single byte functions by mbstring functions. +; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), +; etc. Possible values are 0,1,2,4 or combination of them. +; For example, 7 for overload everything. +; 0: No overload +; 1: Overload mail() function +; 2: Overload str*() functions +; 4: Overload ereg*() functions +; http://php.net/mbstring.func-overload +;mbstring.func_overload = 0 + +; enable strict encoding detection. +;mbstring.strict_detection = Off + +; This directive specifies the regex pattern of content types for which mb_output_handler() +; is activated. +; Default: mbstring.http_output_conv_mimetype=^(text/|application/xhtml\+xml) +;mbstring.http_output_conv_mimetype= + +; Allows to set script encoding. Only affects if PHP is compiled with --enable-zend-multibyte +; Default: "" +;mbstring.script_encoding= + +[gd] +; Tell the jpeg decode to ignore warnings and try to create +; a gd image. The warning will then be displayed as notices +; disabled by default +; http://php.net/gd.jpeg-ignore-warning +;gd.jpeg_ignore_warning = 0 + +[exif] +; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. +; With mbstring support this will automatically be converted into the encoding +; given by corresponding encode setting. When empty mbstring.internal_encoding +; is used. For the decode settings you can distinguish between motorola and +; intel byte order. A decode setting cannot be empty. +; http://php.net/exif.encode-unicode +;exif.encode_unicode = ISO-8859-15 + +; http://php.net/exif.decode-unicode-motorola +;exif.decode_unicode_motorola = UCS-2BE + +; http://php.net/exif.decode-unicode-intel +;exif.decode_unicode_intel = UCS-2LE + +; http://php.net/exif.encode-jis +;exif.encode_jis = + +; http://php.net/exif.decode-jis-motorola +;exif.decode_jis_motorola = JIS + +; http://php.net/exif.decode-jis-intel +;exif.decode_jis_intel = JIS + +[Tidy] +; The path to a default tidy configuration file to use when using tidy +; http://php.net/tidy.default-config +;tidy.default_config = "C:\xampp\php\extras\default.tcfg" + +; Should tidy clean and repair output automatically? +; WARNING: Do not use this option if you are generating non-html content +; such as dynamic images +; http://php.net/tidy.clean-output +tidy.clean_output=Off + +[soap] +; Enables or disables WSDL caching feature. +; http://php.net/soap.wsdl-cache-enabled +soap.wsdl_cache_enabled=1 + +; Sets the directory name where SOAP extension will put cache files. +; http://php.net/soap.wsdl-cache-dir +soap.wsdl_cache_dir="/tmp" + +; (time to live) Sets the number of second while cached file will be used +; instead of original one. +; http://php.net/soap.wsdl-cache-ttl +soap.wsdl_cache_ttl=86400 + +; Sets the size of the cache limit. (Max. number of WSDL files to cache) +soap.wsdl_cache_limit=5 + +[sysvshm] +; A default size of the shared memory segment +;sysvshm.init_mem = 10000 + +[ldap] +; Sets the maximum number of open links or -1 for unlimited. +ldap.max_links=-1 + +[mcrypt] +; For more information about mcrypt settings see http://php.net/mcrypt-module-open + +; Directory where to load mcrypt algorithms +; Default: Compiled in into libmcrypt (usually /usr/local/lib/libmcrypt) +;mcrypt.algorithms_dir= + +; Directory where to load mcrypt modes +; Default: Compiled in into libmcrypt (usually /usr/local/lib/libmcrypt) +;mcrypt.modes_dir= + +[dba] +;dba.default_handler= + +[FrontBase] +;fbsql.allow_persistent = On +;fbsql.autocommit = On +;fbsql.show_timestamp_decimals = Off +;fbsql.default_database = +;fbsql.default_database_password = +;fbsql.default_host = +;fbsql.default_password = +;fbsql.default_user = "_SYSTEM" +;fbsql.generate_warnings = Off +;fbsql.max_connections = 128 +;fbsql.max_links = 128 +;fbsql.max_persistent = -1 +;fbsql.max_results = 128 + +[mime_magic] +mime_magic.magicfile="C:\xampp\php\extras\magic.mime" +;mime_magic.debug = On + +[eAccelerator] +;zend_extension = "C:\xampp\php\ext\php_eaccelerator_ts.dll" + +; The amount of shared memory (in megabytes) that eAccelerator will use. +; "0" means OS default. Default value is "0". +eaccelerator.shm_size="0" + +; The directory that is used for disk cache. eAccelerator stores precompiled +; code, session data, content and user entries here. The same data can be +; stored in shared memory also (for more quick access). Default value is +; "/tmp/eaccelerator". +eaccelerator.cache_dir="C:\xampp\tmp" + +; Enables or disables eAccelerator. Should be "1" for enabling or +; "0" for disabling. Default value is "1". +eaccelerator.enable="1" + +; Enables or disables debug logging. Setting this to 1 will print information +; to the log file about the cach hits of a file. +eaccelerator.debug=0 + +; Set the log file for eaccelerator. When this option isn't set then the data +; will be logged to stderr +;eaccelerator.log_file = "C:\xampp\apache\logs\eaccelerator.log" + +; Enables or disables PHP file modification checking. Should be "1" +; for enabling or "0" for disabling. You should set it to "1" if you want +; to recompile PHP files after modification. Default value is "1". +eaccelerator.check_mtime="1" + +; Determine which PHP files must be cached. You may specify the number of +; patterns (for example "*.php *.phtml") which specifies to cache or +; not to cache. If pattern starts with the character "!", it means to ignore +; files which are matched by the following pattern. Default value is "" that +; means - all PHP scripts will be cached. +eaccelerator.filter="" + +; Disables putting large values into shared memory by "eaccelerator_put()" +; function. +; It indicates the largest allowed size in bytes (10240, 10K, 1M). The "0" +; disables the limit. Default value is "0". +eaccelerator.shm_max="0" + +; When eAccelerator fails to get shared memory for new script it removes +; all scripts which were not accessed at last "shm_ttl" seconds from shared +; memory. Default value is "0" that means - don't remove any files from +; shared memory. +eaccelerator.shm_ttl="0" + +; When eAccelerator fails to get shared memory for new script it tryes to +; remove old script if the previous try was made more then "shm_prune_period" +; seconds ago. Default value is "0" that means - don't try to remove any +; files from shared memory. +eaccelerator.shm_prune_period="0" + +; Enables or disables caching of compiled scripts on disk. It has no effect +; on session data and content caching. +; Default value is "0" that means - use disk and shared memory for caching. +eaccelerator.shm_only="0" + +[XDebug] +zend_extension = "C:\xampp\php\ext\php_xdebug-2.6.0-7.2-vc15.dll" +xdebug.profiler_append = 0 +xdebug.profiler_enable = 1 +xdebug.profiler_enable_trigger = 0 +xdebug.profiler_output_dir = "C:\xampp\tmp" +xdebug.profiler_output_name = "cachegrind.out.%t-%s" +xdebug.trace_output_dir = "C:\xampp\tmp" diff --git a/conf/php.ini b/conf/php.ini index c141325..c1bf064 100644 --- a/conf/php.ini +++ b/conf/php.ini @@ -2039,17 +2039,3 @@ eaccelerator.shm_prune_period="0" ; on session data and content caching. ; Default value is "0" that means - use disk and shared memory for caching. eaccelerator.shm_only="0" - -[XDebug] -;zend_extension = "C:\xampp\php\ext\php_xdebug.dll" -;xdebug.profiler_append = 0 -;xdebug.profiler_enable = 1 -;xdebug.profiler_enable_trigger = 0 -;xdebug.profiler_output_dir = "C:\xampp\tmp" -;xdebug.profiler_output_name = "cachegrind.out.%t-%s" -;xdebug.remote_enable = 1 -;xdebug.remote_handler = "dbgp" -;xdebug.remote_port = 9000 -;xdebug.remote_host = "127.0.0.1" -;xdebug.remote_connect_back = 1 -;xdebug.trace_output_dir = "C:\xampp\tmp" diff --git a/conf/php_xdebug-2.6.0-7.2-vc15.dll b/conf/php_xdebug-2.6.0-7.2-vc15.dll new file mode 100644 index 0000000..23deaf7 Binary files /dev/null and b/conf/php_xdebug-2.6.0-7.2-vc15.dll differ diff --git a/config.inc b/config.inc index 8fc06d5..0656b55 100644 --- a/config.inc +++ b/config.inc @@ -30,8 +30,8 @@ define('E_DEBUG', 65535); define('DOC_ROOT', '{DOC_ROOT}'); define('PWD_FILE', '{PWD_FILE}'); define('TMP', '{TMP_PATH}'); -define('VER', '1.3.3'); -define('REL_DATE', '2018-08-31'); +define('VER', '1.3.4'); +define('REL_DATE', '2018-11-30'); define('LOG_LEVEL', '{E_ERROR}'); define('LOG_PATH', '{LOG_PATH}'); define('SALT', '{SALT}'); diff --git a/data/catmgmt.inc b/data/catmgmt.inc index 175e3a6..708f9c5 100644 --- a/data/catmgmt.inc +++ b/data/catmgmt.inc @@ -13,29 +13,30 @@ * Change Log: * - May 2, 2018 - File created, Moved catalog mgmt html content from index page to this for easier viewing and refined the code a little */ - +global $db; ?> - - - + + + - -
- - - - - - - - - - +
File NameStatusStart Time% CompleteSTIG Count
+ + + + + + + + + + - - get_Catalog_Script(); - $odd = true; - foreach ($cat_scripts as $key => $cat_script) { - print << + get_Catalog_Script(); + foreach ($cat_scripts as $cat_script) { + print << - + + -EOL; - } - ?> - -
File NameStatusStart Time% CompleteSTIG CounteChecklist
{$cat_script->file_name} + {$cat_script->file_name} + {$cat_script->status} {$cat_script->start_time->format("Y-m-d H:i:s")} {$cat_script->perc_comp} {$cat_script->stig_count} + +
+EOR; + } + ?> + +
-
\ No newline at end of file +
diff --git a/data/gen-echecklist.php b/data/gen-echecklist.php new file mode 100644 index 0000000..8120fc8 --- /dev/null +++ b/data/gen-echecklist.php @@ -0,0 +1,197 @@ +pushHandler(new StreamHandler(LOG_PATH . "/echecklist-export.log", $log_level)); + +global $conditions, $validation, $borders; + +$db = new db(); +$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, FILTER_NULL_ON_FAILURE); + +if(!$id) { + die("Failed to read checklist ID"); +} + +$host_status = [ + $conditions['open'], + $conditions['exception'], + $conditions['false_positive'], + $conditions['not_a_finding'], + $conditions['not_applicable'], + $conditions['no_data'], + $conditions['not_reviewed'], + $conditions['true'], + $conditions['false'] +]; + +/** @var checklist $chk */ +$chk = $db->get_Checklist($id); +if(is_array($chk) && count($chk) && isset($chk[0])) { + $chk = $chk[0]; +} else { + die("Failed to find the checklist"); +} + +$Reader = \PhpOffice\PhpSpreadsheet\IOFactory::createReaderForFile("../ste/eChecklist-Template.xlsx"); +$ss = $Reader->load("../ste/eChecklist-Template.xlsx"); + +$log->debug("Loaded template"); + +$ss->setActiveSheetIndexByName('Cover Sheet') + ->setCellValue("B5", "{$chk->get_Name()} eChecklist") + ->setCellValue("B9", "") + ->setCellValue("B2", (substr($chk->get_File_Name(), 0, 1) == 'U' ? "UNCLASSIFIED" : "FOUO")) + ->setCellValue("B12", "by:\r" . COMPANY . "\r" . COMP_ADD) + ->setCellValue("B15", "Derived from: " . SCG . "\rReasons: \rDeclassify on: " . DECLASSIFY_ON); + +// set properties +$ss->getProperties() + ->setCreator(CREATOR); +$ss->getProperties() + ->setLastModifiedBy(LAST_MODIFIED_BY); +$ss->getProperties() + ->setCompany(COMPANY); +$ss->getProperties() + ->setTitle("{$chk->get_Name()} eChecklist"); +$ss->getProperties() + ->setSubject("{$chk->get_Name()} eChecklist"); +$ss->getProperties() + ->setDescription("{$chk->get_Name()} eChecklist"); + +// set active sheet +$ss->setActiveSheetIndex(2); +$sheet = $ss->getActiveSheet(); +$sheet->setCellValue("B9", "{$chk->get_Name()} V{$chk->get_Version()}R{$chk->get_Release()} ({$chk->get_type()})"); +$sheet->setTitle($chk->get_Name()); +$sheet->setCellValue("A1", (substr($chk->get_File_Name(), 0, 1) == 'U' ? "UNCLASSIFIED" : "UNCLASSIFIED//FOUO")); + +$db->help->select("pdi", null, [ + [ + 'field' => 'pcl.checklist_id', + 'op' => '=', + 'value' => $id + ] +], [ + 'table_joins' => [ + "JOIN pdi_checklist_lookup pcl ON pcl.pdi_id = pdi.pdi_id" + ] +]); +$pdis = $db->help->execute(); + +$row = 11; +if(is_array($pdis) && count($pdis)) { + foreach($pdis as $p) { + $overall_str = "=IF(" . + "COUNTIF(F{$row}:F{$row},\"Open\")+" . + "COUNTIF(F{$row}:F{$row},\"Exception\")" . + ">0,\"Open\",\"Not a Finding\")"; + $same_str = "=IF(" . + "COUNTIF(F{$row}:F{$row},F{$row})=" . + "COLUMNS(F{$row}:F{$row}), TRUE, FALSE)"; + + $sheet->setCellValue("A{$row}", $p['STIG_ID']) + ->setCellValue("B{$row}", $p['VMS_ID']) + ->setCellValue("C{$row}", $p['CAT']) + ->setCellValue("D{$row}", $p['IA_Controls']) + ->setCellValue("E{$row}", $p['short_title']) + ->setCellValue("F{$row}", "Not Reviewed") + ->setCellValue("G{$row}", $overall_str) + ->setCellValue("H{$row}", $same_str, true) + ->setCellValue("I{$row}", "") + ->setCellValue("J{$row}", $p['check_contents']) + ->getStyle("H11:H{$sheet->getHighestDataRow()}") + ->setConditionalStyles([$conditions['true'], $conditions['false']]); + $row++; + } + + $sheet->setDataValidation("F11:F{$row}", clone $validation['host_status']); + $sheet->getStyle("F11:G{$row}") + ->setConditionalStyles($host_status); + $sheet->getStyle("C11:C{$row}") + ->setConditionalStyles(array($conditions['cat_1'], $conditions['cat_2'], $conditions['cat_3'])); + + $sheet->getStyle("I11:I{$row}") + ->setConditionalStyles( + [ + $conditions['open_conflict'], + $conditions['nf_na_conflict'] + ] + ); + + $sheet->getStyle("A1:I{$row}") + ->applyFromArray($borders); + $sheet->freezePane("A11"); + $sheet->setAutoFilter("A10:I10"); + + $sheet->getColumnDimension("F")->setWidth(14.14); + $sheet->setCellValue("F8", "=COUNTIFS(F11:F{$row}, \"Open\", \$C\$11:\$C\${$row}, \"I\")") + ->setCellValue("F9", "=COUNTIF(F11:F{$row}, \"Not Reviewed\")") + ->setCellValue("F10", "Example"); + $sheet->getStyle("F10") + ->getFont() + ->setBold(true); + $sheet->getStyle("F10") + ->getFill() + ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) + ->setStartColor($GLOBALS['yellow']); + + $open_cat_1 = "=COUNTIFS(F11:F{$row}, \"Open\", \$C\$11:\$C\${$row}, \"I\")"; + $open_cat_2 = "=COUNTIFS(F11:F{$row}, \"Open\", \$C\$11:\$C\${$row}, \"II\")"; + $open_cat_3 = "=COUNTIFS(F11:F{$row}, \"Open\", \$C\$11:\$C\${$row}, \"III\")"; + $not_a_finding = "=COUNTIF(F11:F{$row}, \"Not a Finding\")"; + $not_applicable = "=COUNTIF(F11:F{$row}, \"Not Applicable\")"; + $not_reviewed = "=COUNTIF(F11:F{$row}, \"Not Reviewed\")"; + + $sheet->getStyle("G8:H8") + ->getFill() + ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) + ->setStartColor($GLOBALS['orange']); + $sheet->getStyle("G9:H9") + ->getFill() + ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) + ->setStartColor($GLOBALS['green']); + $sheet->getStyle("G10:H10") + ->getFill() + ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) + ->setStartColor($GLOBALS['yellow']); + $sheet->getStyle("I10:J10") + ->getFill() + ->setFillType(\PhpOffice\PhpSpreadsheet\Style\Fill::FILL_SOLID) + ->setStartColor($GLOBALS['light_gray']); + + $sheet->setCellValue("G8", "=COUNTIF(G11:H{$row}, \"Open\")") + ->setCellValue("G9", "=COUNTIF(G11:G{$row}, \"Not a Finding\")") + ->setCellValue("H8", "=COUNTIF(H11:H{$row}, FALSE)") + ->setCellValue("H9", "=COUNTIF(H11:H{$row}, TRUE)") + ->setCellValue("E3", "") + ->setCellValue("E4", "") + ->setCellValue("G4", "") + ->setCellValue('C2', $open_cat_1) + ->setCellValue('C3', $open_cat_2) + ->setCellValue('C4', $open_cat_3) + ->setCellValue('C5', $not_a_finding) + ->setCellValue('C6', $not_applicable) + ->setCellValue('C7', $not_reviewed); + +} else { + print "Error"; +} + +/**/ +$writer = new Xlsx($ss); +$writer->setPreCalculateFormulas(false); +header("Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); +header("Content-disposition: attachment; filename='{$chk->get_Name()}-eChecklist.xlsx'"); +$writer->save("php://output"); diff --git a/data/index.php b/data/index.php index ed15648..a1fdeda 100644 --- a/data/index.php +++ b/data/index.php @@ -405,253 +405,7 @@ include_once 'header.inc'; include_once 'settings.inc'; } elseif ($page == 'CatMgmt') { - ?> - - - - - - - - -
- - - - - - - - - - - - - get_Catalog_Script(); - $odd = true; - foreach ($cat_scripts as $key => $cat_script) { - print "" . - "" . - "" . - "" . - "" . - "" . - ""; - } - ?> - -
File NameStatusStart Time% CompleteSTIG Count
{$cat_script->file_name}{$cat_script->status}{$cat_script->start_time->format("Y-m-d H:i:s")}{$cat_script->perc_comp}{$cat_script->stig_count}
-
- - - -
- Back"; - exit; - } + if (! isset($_REQUEST['ste'])) { + print "You must select an ST&E Back"; + exit(); + } - if ($_REQUEST['export'] == 'Export STE') { - export_STE(); - } - elseif ($_REQUEST['export'] == 'Export Host List') { - export_Host_List(); - } -} -elseif (isset($cmd['import'])) { - import_STE(); -} -else { - print "Usage: php ste_export_import.php -f=\"{path_to_ste_import_file}\" --import" . PHP_EOL; + if ($_REQUEST['export'] == 'Export STE') { + export_STE(); + } elseif ($_REQUEST['export'] == 'Export Host List') { + export_Host_List(); + } +} elseif (isset($cmd['import'])) { + import_STE(); +} else { + print "Usage: php ste_export_import.php -f=\"{path_to_ste_import_file}\" --import" . PHP_EOL; } /** * Function to export an ST&E */ -function export_STE() { - set_time_limit(0); - global $db; +function export_STE() +{ + set_time_limit(0); + global $db; - $log = new Sagacity_Error("STE_Export.log"); + $log = new Sagacity_Error("STE_Export.log"); - $ste = $db->get_STE($_REQUEST['ste'])[0]; - $json = [ - 'ste' => [ - 'id' => $ste->get_ID(), - 'system_id' => $ste->get_System()->get_ID(), - 'site_id' => $ste->get_Site()->get_ID(), - 'eval_start' => $ste->get_Eval_Start_Date()->format("Y-m-d"), - 'eval_end' => $ste->get_Eval_End_Date()->format("Y-m-d") - ], - 'systems' => [], - 'site' => [], - 'ste_cats' => [], - 'targets' => [], - 'scans' => [], - 'tech_findings' => [], - 'proc_findings' => [] - ]; - - $system_arr = $db->get_System($ste->get_System()->get_ID()); - foreach ($system_arr as $key => $sys) { - $json['systems'][] = [ - 'id' => $sys->get_ID(), - 'name' => $sys->get_Name(), - 'mac' => $sys->get_MAC(), - 'classification' => $sys->get_Classification(), - 'abbr' => $sys->get_Abbreviation(), - 'exec-summary' => $sys->get_Executive_Summary(), - 'accrediation-type' => $sys->get_Accreditation_Type(), - 'desc' => $sys->get_Description(), - 'mitigations' => $sys->get_Mitigations() - ]; - } - - $json['site'] = [ - 'id' => $ste->get_Site()->get_ID(), - 'name' => $ste->get_Site()->get_Name(), - 'address' => $ste->get_Site()->get_Address(), - 'city' => $ste->get_Site()->get_City(), - 'state' => $ste->get_Site()->get_State(), - 'zip' => $ste->get_Site()->get_Zip(), - 'country' => $ste->get_Site()->get_Country(), - 'poc' => $ste->get_Site()->get_POC_Name(), - 'email' => $ste->get_Site()->get_POC_Email(), - 'phone' => $ste->get_Site()->get_POC_Phone() - ]; - - $cat_arr = $db->get_STE_Cat_List($ste->get_ID()); - foreach ($cat_arr as $key => $cat) { - $json['ste_cats'][] = [ - 'id' => $cat->get_ID(), - 'ste_id' => $cat->get_STE_ID(), - 'name' => $cat->get_Name(), - 'analyst' => $cat->get_Analyst() - ]; - } - - $all_findings = []; - $targets_arr = $db->get_Target_Details($ste->get_ID()); - $used_cats = []; - if (empty($targets_arr)) { - $log->script_log("There are no targets in the ST&E", E_ERROR); - } - foreach ($targets_arr as $key => $tgt) { - if (!in_array($tgt->get_Cat_ID(), $used_cats)) { - $all_findings = array_merge($all_findings, $db->get_Category_Findings($tgt->get_Cat_ID())); - $used_cats[] = $tgt->get_Cat_ID(); - } - $os = $db->get_Software($tgt->get_OS_ID())[0]; - - $tgt_node = [ - 'id' => $tgt->get_ID(), - 'ste_id' => $tgt->get_STE_ID(), - 'cat_id' => $tgt->get_Cat_ID(), - 'os_id' => $tgt->get_OS_ID(), - 'os_string' => $tgt->get_OS_String(), - 'os_man' => $os->get_Man(), - 'os_name' => $os->get_Name(), - 'os_ver' => $os->get_Version(), - 'name' => $tgt->get_Name(), - 'location' => $tgt->get_Location(), - 'source' => $tgt->get_Source(), - 'pp_flag' => '0', - 'pp_off' => '1', - 'login' => $tgt->get_Login(), - 'class' => $tgt->classification, - 'status' => [ - 'auto' => $tgt->get_Auto_Status_ID(), - 'manual' => $tgt->get_Man_Status_ID(), - 'data' => $tgt->get_Data_Status_ID(), - 'fp_cat1' => $tgt->get_FP_Cat1_Status_ID() - ], - 'notes' => $tgt->get_Notes(), - 'netstat' => $tgt->get_Netstat_Connections(), - 'missing_patches' => $tgt->get_Missing_Patches(), - 'interfaces' => [], - 'software_list' => [], - 'checklist_list' => [] + $ste = $db->get_STE($_REQUEST['ste'])[0]; + $json = [ + 'ste' => [ + 'id' => $ste->get_ID(), + 'system_id' => $ste->get_System()->get_ID(), + 'site_id' => $ste->get_Site()->get_ID(), + 'eval_start' => $ste->get_Eval_Start_Date()->format("Y-m-d"), + 'eval_end' => $ste->get_Eval_End_Date()->format("Y-m-d") + ], + 'systems' => [], + 'site' => [], + 'ste_cats' => [], + 'targets' => [], + 'scans' => [], + 'tech_findings' => [], + 'proc_findings' => [] ]; - foreach ($tgt->interfaces as $int) { - $int_node = [ - 'id' => $int->get_ID(), - 'name' => $int->get_Name(), - 'ipv4' => $int->get_IPv4(), - 'ipv6' => $int->get_IPv6(), - 'hostname' => $int->get_Hostname(), - 'fqdn' => $int->get_FQDN(), - 'desc' => $int->get_Description(), - 'tcp_ports' => [], - 'udp_ports' => [] - ]; - - foreach ($int->get_TCP_Ports() as $tcp) { - $int_node['tcp_ports'][] = [ - 'number' => $tcp->get_Port(), - 'name' => $tcp->get_IANA_Name(), - 'banner' => $tcp->get_Banner(), - 'notes' => $tcp->get_Notes() + $system_arr = $db->get_System($ste->get_System() + ->get_ID()); + foreach ($system_arr as $sys) { + $json['systems'][] = [ + 'id' => $sys->get_ID(), + 'name' => $sys->get_Name(), + 'mac' => $sys->get_MAC(), + 'classification' => $sys->get_Classification(), + 'abbr' => $sys->get_Abbreviation(), + 'exec-summary' => $sys->get_Executive_Summary(), + 'accrediation-type' => $sys->get_Accreditation_Type(), + 'desc' => $sys->get_Description(), + 'mitigations' => $sys->get_Mitigations() ]; - } + } - foreach ($int->get_UDP_Ports() as $udp) { - $int_node['udp_ports'][] = [ - 'number' => $udp->get_Port(), - 'name' => $udp->get_IANA_Name(), - 'banner' => $udp->get_Banner(), - 'notes' => $udp->get_Notes() + $json['site'] = [ + 'id' => $ste->get_Site()->get_ID(), + 'name' => $ste->get_Site()->get_Name(), + 'address' => $ste->get_Site()->get_Address(), + 'city' => $ste->get_Site()->get_City(), + 'state' => $ste->get_Site()->get_State(), + 'zip' => $ste->get_Site()->get_Zip(), + 'country' => $ste->get_Site()->get_Country(), + 'poc' => $ste->get_Site()->get_POC_Name(), + 'email' => $ste->get_Site()->get_POC_Email(), + 'phone' => $ste->get_Site()->get_POC_Phone() + ]; + + $cat_arr = $db->get_STE_Cat_List($ste->get_ID()); + foreach ($cat_arr as $cat) { + $json['ste_cats'][] = [ + 'id' => $cat->get_ID(), + 'ste_id' => $cat->get_STE_ID(), + 'name' => $cat->get_Name(), + 'analyst' => $cat->get_Analyst() ]; - } - - $tgt_node['interfaces'][] = $int_node; } - foreach ($tgt->software as $sw) { - $tgt_node['software_list'][] = [ - 'id' => $sw->get_ID(), - 'man' => $sw->get_Man(), - 'name' => $sw->get_Name(), - 'ver' => $sw->get_Version(), - 'string' => $sw->get_SW_String(), - 'short_string' => $sw->get_Shortened_SW_String() - ]; + $all_findings = []; + $targets_arr = $db->get_Target_Details($ste->get_ID()); + $used_cats = []; + if (empty($targets_arr)) { + $log->script_log("There are no targets in the ST&E", E_ERROR); } + foreach ($targets_arr as $tgt) { + if (! in_array($tgt->get_Cat_ID(), $used_cats)) { + $all_findings = array_merge($all_findings, $db->get_Category_Findings($tgt->get_Cat_ID())); + $used_cats[] = $tgt->get_Cat_ID(); + } + $os = $db->get_Software($tgt->get_OS_ID())[0]; - foreach ($tgt->checklists as $chk) { - $tgt_node['checklist_list'][] = [ - 'id' => $chk->get_ID(), - 'checklist_id' => $chk->get_Checklist_ID(), - 'type' => $chk->get_type(), - 'class' => $chk->get_Classification(), - 'version' => $chk->get_Version(), - 'release' => $chk->get_Release() - ]; - } - - $json['targets'][] = $tgt_node; - } - - if (!is_null($scan_arr = $db->get_ScanData($ste->get_ID()))) { - foreach ($scan_arr as $scan) { - $scan_node = [ - 'id' => $scan->get_ID(), - 'ste_id' => $scan->get_STE()->get_ID(), - 'src_id' => $scan->get_Source()->get_ID(), - 'itr' => $scan->get_Itr(), - 'file_name' => $scan->get_File_Name(), - 'file_date' => $scan->get_File_Date(), - 'host_list' => [] - ]; - - foreach ($scan->get_Host_List() as $host) { - $scan_node['host_list'][] = [ - 'tgt_id' => $host['target']->get_ID(), - 'tgt_name' => $host['target']->get_Name(), - 'count' => $host['count'] + $tgt_node = [ + 'id' => $tgt->get_ID(), + 'ste_id' => $tgt->get_STE_ID(), + 'cat_id' => $tgt->get_Cat_ID(), + 'os_id' => $tgt->get_OS_ID(), + 'os_string' => $tgt->get_OS_String(), + 'os_man' => $os->get_Man(), + 'os_name' => $os->get_Name(), + 'os_ver' => $os->get_Version(), + 'name' => $tgt->get_Name(), + 'location' => $tgt->get_Location(), + 'source' => $tgt->get_Source(), + 'pp_flag' => '0', + 'pp_off' => '1', + 'login' => $tgt->get_Login(), + 'class' => $tgt->classification, + 'status' => [ + 'auto' => $tgt->get_Auto_Status_ID(), + 'manual' => $tgt->get_Man_Status_ID(), + 'data' => $tgt->get_Data_Status_ID(), + 'fp_cat1' => $tgt->get_FP_Cat1_Status_ID() + ], + 'notes' => $tgt->get_Notes(), + 'netstat' => $tgt->get_Netstat_Connections(), + 'missing_patches' => $tgt->get_Missing_Patches(), + 'interfaces' => [], + 'software_list' => [], + 'checklist_list' => [] ]; - } - $json['scans'][] = $scan_node; - } - } + foreach ($tgt->interfaces as $int) { + $int_node = [ + 'id' => $int->get_ID(), + 'name' => $int->get_Name(), + 'ipv4' => $int->get_IPv4(), + 'ipv6' => $int->get_IPv6(), + 'hostname' => $int->get_Hostname(), + 'fqdn' => $int->get_FQDN(), + 'desc' => $int->get_Description(), + 'tcp_ports' => [], + 'udp_ports' => [] + ]; - foreach ($all_findings as $worksheet_name => $data) { - foreach ($data['stigs'] as $stig_id => $data2) { - $stig = $db->get_Stig($stig_id); - if (is_array($stig) && count($stig) && isset($stig[0]) && is_a($stig[0], 'stig')) { - $stig = $stig[0]; - } - else { - continue; - } + foreach ($int->get_TCP_Ports() as $tcp) { + $int_node['tcp_ports'][] = [ + 'number' => $tcp->get_Port(), + 'name' => $tcp->get_IANA_Name(), + 'banner' => $tcp->get_Banner(), + 'notes' => $tcp->get_Notes() + ]; + } - $ec = $db->get_eChecklist($stig, $data2['chk_id']); + foreach ($int->get_UDP_Ports() as $udp) { + $int_node['udp_ports'][] = [ + 'number' => $udp->get_Port(), + 'name' => $udp->get_IANA_Name(), + 'banner' => $udp->get_Banner(), + 'notes' => $udp->get_Notes() + ]; + } - $find_node = [ - 'stig_id' => $stig->get_ID(), - 'vms_id' => $ec->get_VMS_ID(), - 'cat' => $ec->get_Cat_Level_String(), - 'short_title' => $ec->get_Short_Title(), - 'check_contents' => $ec->get_Check_Contents(), - 'notes' => $data2['notes'], - 'target_status' => [], - 'ia_controls' => [] - ]; - - foreach ($data['target_list'] as $host_name => $col_id) { - $tgt = $db->get_Target_Details($ste->get_ID(), $host_name)[0]; - $finding = $db->get_Finding($tgt, $stig)[0]; - - if (is_null($finding)) { - continue; + $tgt_node['interfaces'][] = $int_node; } - $find_node['target_status'][] = [ - 'tgt_name' => $host_name, - 'status' => (isset($data2[$host_name]) ? $data2[$host_name] : 'Not Applicable'), - 'scan_id' => $finding->get_Scan_ID() - ]; - } + foreach ($tgt->software as $sw) { + $tgt_node['software_list'][] = [ + 'id' => $sw->get_ID(), + 'man' => $sw->get_Man(), + 'name' => $sw->get_Name(), + 'ver' => $sw->get_Version(), + 'string' => $sw->get_SW_String(), + 'short_string' => $sw->get_Shortened_SW_String() + ]; + } - foreach ($data2['ia_control'] as $ia) { - $find_node['ia_controls'] = $ia; - } + foreach ($tgt->checklists as $chk) { + $tgt_node['checklist_list'][] = [ + 'id' => $chk->get_ID(), + 'checklist_id' => $chk->get_Checklist_ID(), + 'type' => $chk->get_type(), + 'class' => $chk->get_Classification(), + 'version' => $chk->get_Version(), + 'release' => $chk->get_Release() + ]; + } - $json['tech_findings'][] = $find_node; + $json['targets'][] = $tgt_node; } - } - header(JSON); - header('Content-disposition: attachment; filename="' . $sys->get_Name() . '-' . $ste->get_Site()->get_Name() . '-ste-export.json"'); - print json_encode($json, JSON_PRETTY_PRINT); + if (! is_null($scan_arr = $db->get_ScanData($ste->get_ID()))) { + foreach ($scan_arr as $scan) { + $scan_node = [ + 'id' => $scan->get_ID(), + 'ste_id' => $scan->get_STE()->get_ID(), + 'src_id' => $scan->get_Source()->get_ID(), + 'itr' => $scan->get_Itr(), + 'file_name' => $scan->get_File_Name(), + 'file_date' => $scan->get_File_Date(), + 'host_list' => [] + ]; + + foreach ($scan->get_Host_List() as $host) { + /** @var host_list $host */ + $scan_node['host_list'][] = [ + 'tgt_id' => $host->getTargetId(), + 'tgt_name' => $host->getTargetName(), + 'count' => $host->getFindingCount() + ]; + } + + $json['scans'][] = $scan_node; + } + } + + foreach ($all_findings as $data) { + foreach ($data['stigs'] as $stig_id => $data2) { + $stig = $db->get_Stig($stig_id); + if (is_array($stig) && count($stig) && isset($stig[0]) && is_a($stig[0], 'stig')) { + $stig = $stig[0]; + } else { + continue; + } + + $ec = $db->get_eChecklist($stig, $data2['chk_id']); + + $find_node = [ + 'stig_id' => $stig->get_ID(), + 'vms_id' => $ec->get_VMS_ID(), + 'cat' => $ec->get_Cat_Level(), + 'short_title' => $ec->get_Short_Title(), + 'check_contents' => $ec->get_Check_Contents(), + 'notes' => trim($data2['echecklist']->get_Notes()), + 'target_status' => [], + 'ia_controls' => $data2['echecklist']->get_IA_Controls() + ]; + + unset($data['stigs'][$stig_id]['echecklist']); + unset($data['stigs'][$stig_id]['chk_id']); + + foreach ($data['stigs'][$stig_id] as $host_name => $status) { + $find_node['target_status'][] = [ + 'tgt_name' => $host_name, + 'status' => $status, + //'scan_id' => $finding->get_Scan_ID() + ]; + } + + $json['tech_findings'][] = $find_node; + } + } + + header(JSON); + header('Content-disposition: attachment; filename="' . $sys->get_Name() . '-' . $ste->get_Site()->get_Name() . '-ste-export.json"'); + print json_encode($json, JSON_PRETTY_PRINT); } /** * Function to export the hosts in an ST&E */ -function export_Host_List() { - global $db; - $csv = "Target ID,Name,HostName,IPv4,FQDN,OS" . PHP_EOL; +function export_Host_List() +{ + global $db; + $csv = "Target ID,Name,HostName,IPv4,FQDN,OS" . PHP_EOL; - $ste = $db->get_STE($_REQUEST['ste'])[0]; + $ste = $db->get_STE($_REQUEST['ste'])[0]; - $tgts = $db->get_Target_Details($_REQUEST['ste']); + $tgts = $db->get_Target_Details($_REQUEST['ste']); - foreach ($tgts as $key => $tgt) { - $csv .= $tgt->get_ID() . "," . $tgt->get_Name() . ","; + foreach ($tgts as $tgt) { + $csv .= $tgt->get_ID() . "," . $tgt->get_Name() . ","; - $int_str = ''; - $fqdn_str = ''; - $host_str = ''; - foreach ($tgt->interfaces as $key2 => $int) { - if (false) { - $int = new interfaces(); - } - $host_str .= $int->get_Hostname() . ","; - $int_str .= $int->get_IPv4() . ","; - $fqdn_str .= $int->get_FQDN() . ","; + $int_str = ''; + $fqdn_str = ''; + $host_str = ''; + foreach ($tgt->interfaces as $int) { + /** @var interfaces $int */ + $host_str .= $int->get_Hostname() . ","; + $int_str .= $int->get_IPv4() . ","; + $fqdn_str .= $int->get_FQDN() . ","; + } + $host_str = substr($host_str, 0, - 1); + $int_str = substr($int_str, 0, - 1); + $fqdn_str = substr($fqdn_str, 0, - 1); + + $csv .= "\"$host_str\",\"$int_str\",\"$fqdn_str\","; + + $os = $db->get_Software($tgt->get_OS_ID())[0]; + $csv .= $os->get_Man() . " " . $os->get_Name() . " " . $os->get_Version() . PHP_EOL; } - $host_str = substr($host_str, 0, -1); - $int_str = substr($int_str, 0, -1); - $fqdn_str = substr($fqdn_str, 0, -1); - $csv .= "\"$host_str\",\"$int_str\",\"$fqdn_str\","; - - $os = $db->get_Software($tgt->get_OS_ID())[0]; - $csv .= $os->get_Man() . " " . $os->get_Name() . " " . $os->get_Version() . PHP_EOL; - } - - header('Content-type: plain/text'); - header('Content-disposition: attachment; filename="' . $ste->get_System()->get_Name() . '-' . $ste->get_Site()->get_Name() . '-host-list.csv"'); - print $csv; + header('Content-type: plain/text'); + header('Content-disposition: attachment; filename="' . $ste->get_System()->get_Name() . '-' . $ste->get_Site()->get_Name() . '-host-list.csv"'); + print $csv; } /** * Function to import an ST&E */ -function import_STE() { - global $cmd, $db; - set_time_limit(0); - $base_name = basename($cmd['f']); - include_once 'helper.inc'; - $log = new Sagacity_Error($cmd['f']); - - if (!file_exists($cmd['f'])) { - $log->script_log("File not found", E_ERROR); - } - - $xml = new DOMDocument(); - $ste_cat_arr = array(); - $all_scans = array(); - $all_tgts = array(); - - if (!$xml->load($cmd['f'])) { - $log->script_log("Error loading XML", E_ERROR); - } - - $site_node = getValue($xml, "/root/site", null, true); - - if ($site_node->length) { - $site_node = $site_node->item(0); - $site = $db->get_Site($site_node->getAttribute("name")); - if (is_array($site) && count($site)) { - $site = $site[0]; - print "Existing site " . $site->get_Name() . PHP_EOL; - } - else { - print "Adding new site " . $site_node->getAttribute("name") . PHP_EOL; - $site = new site(null, $site_node->getAttribute("name"), $site_node->getAttribute("address"), $site_node->getAttribute("city"), $site_node->getAttribute("state"), $site_node->getAttribute("zip"), $site_node->getAttribute("country"), $site_node->getAttribute("poc_name"), $site_node->getAttribute("poc_email"), $site_node->getAttribute("poc_phone")); - - $site->set_ID($db->save_Site($site)); - } - } - else { - $log->script_log("No site associated with this ST&E", E_ERROR); - } - - $sys_nodes = getValue($xml, "/root/systems/system", null, true); - - if ($sys_nodes->length) { - foreach ($sys_nodes as $node) { - $sys = $db->get_System($node->getAttribute("name")); - if (is_array($sys) && count($sys)) { - $sys = $sys[0]; - print "Existing system " . $sys->get_Name() . PHP_EOL; - } - else { - print "Adding new system " . $node->getAttribute("name") . PHP_EOL; - $sys = new system(null, $node->getAttribute("name"), $node->getAttribute("mac"), $node->getAttribute("classified")); - - $sys->set_ID($db->save_System($sys)); - } - } - } - else { - $log->script_log("No system associated with this ST&E", E_ERROR); - } - - $ste_node = getValue($xml, "/root/ste", null, true); - - if ($ste_node->length) { - print "Adding new ST&E" . PHP_EOL; - $ste_node = $ste_node->item(0); - $old_ste_id = $ste_node->getAttribute("id"); - - $ste = new ste(null, $sys->get_ID(), $site->get_Id(), $ste_node->getAttribute("eval_start"), $ste_node->getAttribute("eval_end"), false, 0); - - $ste->set_ID($db->save_STE($ste)); - } - else { - $log->script_log("No ST&E in this export file", E_ERROR); - } - - $cat_nodes = getValue($xml, "/root/ste_cats/cat", null, true); - - if ($cat_nodes->length) { - foreach ($cat_nodes as $node) { - print "Adding new category " . $node->getAttribute("name") . PHP_EOL; - $id = $node->getAttribute('id'); - $ste_cat_arr[$id] = new ste_cat(null, $ste->get_ID(), $node->getAttribute("name"), $node->getAttribute("analysts")); - - $ste_cat_arr[$id]->set_ID($db->save_Category($ste_cat_arr[$id])); - } - } - else { - $log->script_log("There are no categories in this ST&E", E_ERROR); - } - - $tgt_nodes = getValue($xml, "/root/targets/target", null, true); - - if ($tgt_nodes->length) { - foreach ($tgt_nodes as $node) { - print "Adding new target " . $node->getAttribute("name") . PHP_EOL; - $cat_id = $node->getAttribute("cat_id"); - - $os = $db->get_Software([ - 'man' => $node->getAttribute("os_man"), - 'name' => $node->getAttribute("os_name"), - 'ver' => $node->getAttribute("os_ver") - ]); - - if (is_array($os) && count($os)) { - $os = $os[0]; - } - else { - $os = $db->getSoftware(array( - 'man' => 'Generic', - 'name' => 'Generic', - 'ver' => 'N/A' - ), false)[0]; - } - - $statuses = getValue($xml, "status", $node, true)->item(0); - $notes = getValue($xml, "notes", $node); - $netstat = getValue($xml, "netstat_connection", $node); - $patches = getValue($xml, "missing_patches", $node); - $os_string = getValue($xml, "os_string", $node); - - $tgt = new target($node->getAttribute("name")); - $tgt->set_STE_ID($ste->get_ID()); - $tgt->set_Cat_ID($ste_cat_arr[$cat_id]->get_ID()); - $tgt->set_OS_ID($os->get_ID()); - $tgt->set_OS_String($node->getAttribute("os_string")); - $tgt->set_Auto_Status_ID($statuses->getAttribute("auto")); - $tgt->set_Man_Status_ID($statuses->getAttribute("manual")); - $tgt->set_Data_Status_ID($statuses->getAttribute("data")); - $tgt->set_FP_Cat1_Status_ID($statuses->getAttribute("fp_cat1")); - $tgt->set_Location($node->getAttribute("location")); - $tgt->set_Notes($notes); - $tgt->set_Netstat_Connections($netstat); - $tgt->set_Login($node->getAttribute("login")); - $tgt->set_Missing_Patches($patches); - $tgt->set_PP_Flag($node->getAttribute("pp_flag")); - $tgt->set_PP_Suspended($node->getAttribute("pp_off")); - - $ints = getValue($xml, "interfaces/interface", $node, true); - foreach ($ints as $int_node) { - $int = new interfaces(null, null, $int_node->getAttribute("name"), $int_node->getAttribute("ipv4"), $int_node->getAttribute("ipv6"), $int_node->getAttribute("hostname"), $int_node->getAttribute("fqdn"), getValue($xml, "description", $int_node)); - - $tcp_nodes = getValues($xml, "tcp_ports/port", $int_node, true); - foreach ($tcp_nodes as $tcp) { - $int->add_TCP_Ports(new tcp_ports(null, $tcp->getAttribute("number"), $tcp->getAttribute("name"), getValue($xml, "banner", $tcp), getValue($xml, "notes", $tcp))); - } - - $udp_nodes = getValues($xml, "udp_ports/port", $int_node, true); - foreach ($udp_nodes as $udp) { - $int->add_UDP_Ports(new udp_ports(null, $udp->getAttribute("number"), $udp->getAttribute("name"), getValue($xml, "banner", $udp), getValue($xml, "notes", $udp))); - } - - $tgt->interfaces[] = $int; - } - - $sw_nodes = getValue($xml, "software_list/software", $node, true); - foreach ($sw_nodes as $sw) { - $tgt->software[] = $db->get_Software(array( - 'man' => $sw->getAttribute("sw_man"), - 'name' => $sw->getAttribute("sw_name"), - 'ver' => $sw->getAttribute("sw_ver") - ))[0]; - } - - $chk_nodes = getValue($xml, "checklist_list/checklist", $node, true); - foreach ($chk_nodes as $chk) { - $tgt->checklists[] = $db->get_Checklist(array( - 'checklist_id' => $chk->getAttribute('checklist_id'), - 'type' => $chk->getAttribute('type'), - 'version' => $chk->getAttribute('version'), - 'release' => $chk->getAttribute('release') - ))[0]; - } - - $tgt->set_ID($db->save_Target($tgt)); - $all_tgts[$node->getAttribute("id")] = $tgt; - } - } - else { - $log->script_log("No targets were found on this ST&E", E_ERROR); - } - - $scan_nodes = getValue($xml, "/root/scans/scan", null, true); - if ($scan_nodes->length) { - foreach ($scan_nodes as $node) { - $src = $db->get_Sources($node->getAttribute("src_id")); - print "Adding new scan result file " . $node->getAttribute("file_name") . PHP_EOL; - $scan = new scan(null, $src, $ste, $node->getAttribute('itr'), $node->getAttribute("file_name"), $node->getAttribute('file_date')); - - $host_list_nodes = getValue($xml, "host_list", $node, true); - foreach ($host_list_nodes as $host) { - $scan_tgt = $db->get_Target_Details($ste->get_ID(), $host->getAttribute('tgt_name'))[0]; - $hl = new host_list(); - $hl->setTargetId($scan_tgt->get_ID()); - $hl->setTargetName($scan_tgt->get_Name()); - $hl->setFindingCount($host->getAttribute("count")); - $hl->setScanError(false); - - $scan->add_Target_to_Host_List($hl); - } - - $scan->set_ID($db->save_Scan($scan)); - $all_scans[$node->getAttribute("id")] = $scan; - } - } - else { - $log->script_log("No scan result files were found in this ST&E", E_ERROR); - } - - $x = 1; - $finding_nodes = getValue($xml, "/root/tech_findings/finding", null, true); - if ($finding_nodes->length) { - print "Adding findings (total " . $finding_nodes->length . ")" . PHP_EOL; - foreach ($finding_nodes as $node) { - print "."; - if ($x % 100 == 0) { - print "\t$x" . PHP_EOL; - } - - $ia_nodes = getValue($xml, "ia_control", $node, true); - $ia_arr = array(); - foreach ($ia_nodes as $ia) { - $ia_arr[] = $ia->textContent; - } - - $cc = getValue($xml, "check_contents", $node); - - $tgt_status_nodes = getValue($xml, "target_status", $node, true); - foreach ($tgt_status_nodes as $status_node) { - $notes = getValue($xml, "notes", $status_node); - $tgt = $db->get_Target_Details($ste->get_ID(), $status_node->getAttribute("tgt_name"))[0]; - $finding = array( - 0 => $node->getAttribute("stig_id"), - 1 => $node->getAttribute("vms_id"), - 2 => $node->getAttribute("cat"), - 3 => implode(' ', $ia_arr), - 4 => $node->getAttribute("short_title"), - 5 => $status_node->getAttribute("status"), - 6 => $notes, - 7 => $cc, - 8 => '' - ); - - $db->add_Finding($all_scans[$status_node->getAttribute("scan_id")], $tgt, $finding); - } - $x++; - } - } - else { - $log->script_log("No findings were recorded in this ST&E", E_WARNING); - } +function import_STE() +{ } diff --git a/db_schema.json b/db_schema.json index f87b9f5..d3bb478 100644 --- a/db_schema.json +++ b/db_schema.json @@ -1,6469 +1,6234 @@ { - "tables" : [ - { - "schema" : "sagacity", - "name" : "settings", - "primary_key" : [ - "id" - ], - "unique" : [ - "meta_key" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "meta_key", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "meta_value", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "db_data", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "sw_man_match", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : false, - "default" : "" - }, - { - "name" : "man", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "type", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "ms-os", - "nix-os", - "net-os", - "ms", - "nix", - "checklist", - "multiple" - ], - "ai" : false, - "nn" : true, - "default" : "multiple" - }, - { - "name" : "rgx", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ] - }, - { - "schema" : "sagacity", - "name" : "sw_name_match", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : false, - "default" : "" - }, - { - "name" : "man_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "man_override", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "name", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "type", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "ms-os", - "nix-os", - "net-os", - "ms", - "nix", - "checklist", - "multiple" - ], - "ai" : false, - "nn" : true, - "default" : "multiple" - }, - { - "name" : "rgx", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "name_match", - "dataType" : "varchar(15)", - "type" : 253, - "length" : 15, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "ver_match", - "dataType" : "varchar(15)", - "type" : 253, - "length" : 15, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "ver", - "dataType" : "varchar(15)", - "type" : 253, - "length" : 15, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "update_match", - "dataType" : "varchar(15)", - "type" : 253, - "length" : 15, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "is_os", - "dataType" : "tinyint(1)", - "type" : 1, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "multiple", - "dataType" : "tinyint(1)", - "type" : 1, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - } - ], - "constraints" : [ - { - "id" : "swnm_swmm_id", - "local" : "man_id", - "schema" : "sagacity", - "table" : "sw_man_match", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "catalog_scripts", - "primary_key" : [ - "file_name" - ], - "fields" : [ - { - "name" : "file_name", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "pid", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - }, - { - "name" : "start_time", - "dataType" : "datetime", - "type" : 12, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - }, - { - "name" : "last_update", - "dataType" : "datetime", - "type" : 12, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - }, - { - "name" : "status", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "IN QUEUE", - "RUNNING", - "COMPLETE", - "ERROR", - "SKIPPED" - ], - "ai" : false, - "nn" : true, - "default" : "IN QUEUE" - }, - { - "name" : "perc_comp", - "dataType" : "decimal(5,2)", - "type" : 0, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "stig_count", - "dataType" : "int(4)", - "type" : 3, - "length" : 4, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - } - ], - "index" : [ - { - "id" : "catalog_file_name_idx", - "type" : "index", - "ref" : "file_name" - } - ] - }, - { - "schema" : "rmf", - "name" : "family", - "primary_key" : [ - "abbr" - ], - "fields" : [ - { - "name" : "abbr", - "dataType" : "varchar(4)", - "type" : 253, - "length" : 4, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(64)", - "type" : 253, - "length" : 64, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "rmf", - "name" : "controls", - "primary_key" : [ - "family_id", - "control_id" - ], - "fields" : [ - { - "name" : "family_id", - "dataType" : "varchar(4)", - "type" : 253, - "length" : 4, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "control_id", - "dataType" : "varchar(6)", - "type" : 253, - "length" : 6, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(6)", - "type" : 253, - "length" : 6, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "pri", - "dataType" : "tinyint(1)", - "type" : 1, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "statement", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "guidance", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "rmf_family_family_id", - "local" : "family_id", - "schema" : "rmf", - "table" : "family", - "field" : "abbr", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "rmf_controls_control_id_idx", - "type" : "index", - "ref" : "control_id" - } - ] - }, - { - "schema" : "rmf", - "name" : "related_controls", - "primary_key" : [ - "control_id", - "related_control_id" - ], - "fields" : [ - { - "name" : "control_id", - "dataType" : "varchar(6)", - "type" : 253, - "length" : 64, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "related_control_id", - "dataType" : "varchar(6)", - "type" : 253, - "length" : 64, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "rmf_related_controls_control_id", - "local" : "control_id", - "schema" : "rmf", - "table" : "controls", - "field" : "control_id", - "update" : null, - "delete" : null - }, - { - "id" : "rmf_related_controls_related_id", - "local" : "related_control_id", - "schema" : "rmf", - "table" : "controls", - "field" : "control_id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "rmf_related_controls_related_id_idx", - "type" : "index", - "ref" : "related_control_id" - } - ] - }, - { - "schema" : "rmf", - "name" : "control_baseline", - "primary_key" : [ - "impact_level", - "control_id" - ], - "fields" : [ - { - "name" : "impact_level", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "low", - "moderate", - "high" - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "control_id", - "dataType" : "varchar(6)", - "type" : 253, - "length" : 6, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "rmf_control_baseline_control_id", - "local" : "control_id", - "schema" : "rmf", - "table" : "controls", - "field" : "control_id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "rmf_control_baseline_control_id_idx", - "type" : "index", - "ref" : "control_id" - } - ] - }, - { - "schema" : "rmf", - "name" : "control_enh", - "primary_key" : [ - "control_id", - "enh_id" - ], - "fields" : [ - { - "name" : "control_id", - "dataType" : "varchar(6)", - "type" : 253, - "length" : 6, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "enh_id", - "dataType" : "varchar(4)", - "type" : 253, - "length" : 4, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "desc", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "guidance", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "rmf_control_enh_control_id", - "local" : "control_id", - "schema" : "rmf", - "table" : "controls", - "field" : "control_id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "rmf_control_enh_enh_id_idx", - "type" : "index", - "ref" : "enh_id" - } - ] - }, - { - "schema" : "rmf", - "name" : "enhancement_baseline", - "primary_key" : [ - "impact", - "control_id", - "enh_id" - ], - "fields" : [ - { - "name" : "impact", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "low", - "moderate", - "high" - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "control_id", - "dataType" : "varchar(6)", - "type" : 253, - "length" : 6, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "enh_id", - "dataType" : "varchar(4)", - "type" : 253, - "length" : 4, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "rmf_enh_baseline_control_id", - "local" : "control_id", - "schema" : "rmf", - "table" : "controls", - "field" : "control_id", - "update" : null, - "delete" : null - }, - { - "id" : "rmf_eny_baseline_enh_id", - "local" : "enh_id", - "schema" : "rmf", - "table" : "control_enh", - "field" : "enh_id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "rmf_enh_baseline_enh_id_idx", - "type" : "index", - "ref" : "enh_id" - }, - { - "id" : "rmf_enh_baseline_control_id_idx", - "type" : "index", - "ref" : "control_id" - } - ] - }, - { - "schema" : "rmf", - "name" : "cci", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "control_id", - "dataType" : "varchar(6)", - "type" : 253, - "length" : 6, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "enh_id", - "dataType" : "varchar(4)", - "type" : 253, - "length" : 4, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "def", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "guidance", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "procedures", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "fk_cci_controls1", - "local" : "control_id", - "schema" : "rmf", - "table" : "controls", - "field" : "control_id", - "update" : null, - "delete" : null - }, - { - "id" : "fk_cci_control_enh1", - "local" : "enh_id", - "schema" : "rmf", - "table" : "control_enh", - "field" : "enh_id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "fk_cci_controls1_idx", - "type" : "index", - "ref" : "control_id" - }, - { - "id" : "fk_cci_control_enh1_idx", - "type" : "index", - "ref" : "enh_id" - } - ] - }, - { - "schema" : "rmf", - "name" : "emass_cci", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "control", - "dataType" : "varchar(25)", - "type" : 253, - "length" : 25, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ] - }, - { - "schema" : "sagacity", - "name" : "help", - "primary_key" : [ - "section" - ], - "fields" : [ - { - "name" : "section", - "dataType" : "varchar(10)", - "type" : 253, - "length" : 10, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "topic", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "title", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "content", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "index" : [ - { - "id" : "section_id", - "type" : "index", - "ref" : "section" - } - ] - }, - { - "schema" : "sagacity", - "name" : "pdi_catalog", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "cat", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "1", - "2", - "3" - ], - "ai" : false, - "nn" : true, - "default" : "2" - }, - { - "name" : "update", - "dataType" : "datetime", - "type" : 12, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - }, - { - "name" : "short_title", - "dataType" : "varchar(1024)", - "type" : 253, - "length" : 1024, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "check_contents", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "sites", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "address", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "city", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "state", - "dataType" : "varchar(5)", - "type" : 253, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "zip", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "country", - "dataType" : "varchar(5)", - "type" : 253, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "US" - }, - { - "name" : "poc_name", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "poc_email", - "dataType" : "varchar(64)", - "type" : 253, - "length" : 64, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "poc_phone", - "dataType" : "varchar(15)", - "type" : 253, - "length" : 15, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ] - }, - { - "schema" : "sagacity", - "name" : "system", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "abbr", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "mac", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "1", - "2", - "3" - ], - "ai" : false, - "nn" : true, - "default" : "3" - }, - { - "name" : "classification", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "Unclass", - "FOUO", - "C", - "S", - "TS", - "SCI", - "Public", - "Classified", - "Sensitive" - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "acred_type", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "diacap", - "rmf", - "pci", - "nispom", - "hipaa", - "sox", - "cobit" - ], - "ai" : false, - "nn" : false, - "default" : "diacap" - }, - { - "name" : "mitigations", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "description", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "executive_summary", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "diagram", - "dataType" : "mediumblob", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "software", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "cpe", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "cpe23", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "sw_string", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "short_sw_string", - "dataType" : "varchar(64)", - "type" : 253, - "length" : 64, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "sources", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "icon", - "dataType" : "varchar(64)", - "type" : 253, - "length" : 64, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "false_positives", - "primary_key" : [ - "pdi_id", - "src_id" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "src_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "notes", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "fp_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "fp_src_id", - "local" : "src_id", - "schema" : "sagacity", - "table" : "sources", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "exceptions", - "primary_key" : [ - "pdi_id", - "sys_id" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "sys_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "notes", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "exp_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "exp_sys_id", - "local" : "sys_id", - "schema" : "sagacity", - "table" : "system", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "task_status", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "status", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ] - }, - { - "schema" : "sagacity", - "name" : "category", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ] - }, - { - "schema" : "sagacity", - "name" : "findings_status", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "status", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ] - }, - { - "schema" : "sagacity", - "name" : "ports_proto_services", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "port", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "proto", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "tcp", - "udp", - "dccp", - "sctp" - ], - "ai" : false, - "nn" : true, - "default" : "tcp" - }, - { - "name" : "IANA_Name", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "description", - "dataType" : "varchar(500)", - "type" : 253, - "length" : 500, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "banner", - "dataType" : "varchar(500)", - "type" : 253, - "length" : 500, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "notes", - "dataType" : "varchar(500)", - "type" : 253, - "length" : 500, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "proc_ia_controls", - "primary_key" : [ - "control_id" - ], - "fields" : [ - { - "name" : "control_id", - "dataType" : "varchar(10)", - "type" : 253, - "length" : 10, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "subject_area", - "dataType" : "varchar(50)", - "type" : 253, - "length" : 50, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "description", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "threat_vul_cm", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "gen_imp_guide", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "impact", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "low", - "medium", - "high" - ], - "ai" : false, - "nn" : false, - "default" : "medium" - } - ] - }, - { - "schema" : "sagacity", - "name" : "proc_ia_sub_controls", - "primary_key" : [ - "sub_control_id" - ], - "fields" : [ - { - "name" : "sub_control_id", - "dataType" : "varchar(10)", - "type" : 253, - "length" : 10, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "parent_control_id", - "dataType" : "varchar(10)", - "type" : 253, - "length" : 10, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "objective", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "prep", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "script", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "exp_result", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "parent_cont_id", - "local" : "parent_control_id", - "schema" : "sagacity", - "table" : "proc_ia_controls", - "field" : "control_id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "parent_cont_id_idx", - "type" : "index", - "ref" : "parent_control_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "proc_level_type", - "primary_key" : [ - "proc_control_id", - "type", - "level", - "class" - ], - "fields" : [ - { - "name" : "proc_control_id", - "dataType" : "varchar(10)", - "type" : 253, - "length" : 10, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "type", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "diacap", - "rmf" - ], - "ai" : false, - "nn" : true, - "default" : "diacap" - }, - { - "name" : "level", - "dataType" : "tinyint(1)", - "type" : 1, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : null - }, - { - "name" : "class", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "cl", - "pub", - "sen", - "u", - "fouo", - "s", - "ts", - "sci" - ], - "ai" : false, - "nn" : true, - "default" : null - } - ], - "constraints" : [ - { - "id" : "proc_control_id", - "local" : "proc_control_id", - "schema" : "sagacity", - "table" : "proc_ia_controls", - "field" : "control_id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "checklist", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "checklist_id", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "description", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "date", - "dataType" : "date", - "type" : 14, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "file_name", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "ver", - "dataType" : "tinyint(3)", - "type" : 1, - "length" : 3, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "release", - "dataType" : "varchar(5)", - "type" : 253, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "type", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "benchmark", - "manual", - "policy", - "iavm" - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "icon", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "checklist_software_lookup", - "primary_key" : [ - "chk_id", - "sw_id" - ], - "fields" : [ - { - "name" : "chk_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "sw_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "chk_sw_lu_chk_id", - "local" : "chk_id", - "schema" : "sagacity", - "table" : "checklist", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "chk_sw_lu_sw_id", - "local" : "sw_id", - "schema" : "sagacity", - "table" : "software", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "chk_sw_lu_chk_id_idx", - "type" : "index", - "ref" : "chk_id" - }, - { - "id" : "chk_sw_lu_sw_id_idx", - "type" : "index", - "ref" : "sw_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "pdi_checklist_lookup", - "primary_key" : [ - "pdi_id", - "checklist_id" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "checklist_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "group_title", - "dataType" : "varchar(2048)", - "type" : 253, - "length" : 2048, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "short_title", - "dataType" : "varchar(1024)", - "type" : 253, - "length" : 1024, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "check_contents", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "fix_text", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "tweak_data", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "pdi_chk_chk_id", - "local" : "checklist_id", - "schema" : "sagacity", - "table" : "checklist", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "pdi_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "pdi_chk_chk_id_idx", - "type" : "index", - "ref" : "checklist_id" - }, - { - "id" : "pdi_pdi_id_idx", - "type" : "index", - "ref" : "pdi_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "advisories", - "primary_key" : [ - "advisory_id", - "pdi_id" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "advisory_id", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "title", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "impact", - "dataType" : "varchar(64)", - "type" : 253, - "length" : 64, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "type", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "referece", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "url", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "ad_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "ad_pdi_id_idx", - "type" : "index", - "ref" : "pdi_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "cce", - "primary_key" : [ - "pdi_id", - "cce_id" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "cce_id", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "cce_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "cce_pdi_id_idx", - "type" : "index", - "ref" : "pdi_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "cci", - "primary_key" : [ - "cci_id" - ], - "fields" : [ - { - "name" : "cci_id", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "type", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "policy", - "technical" - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "definition", - "dataType" : "varchar(500)", - "type" : 253, - "length" : 500, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "param", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "note", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "index" : [ - { - "id" : "cci_id_idx", - "type" : "index", - "ref" : "cci_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "cci_refs", - "primary_key" : [ - "cci_id", - "title" - ], - "fields" : [ - { - "name" : "cci_id", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "title", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : null - }, - { - "name" : "ver", - "dataType" : "tinyint(2)", - "type" : 1, - "length" : 2, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "url", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "index", - "dataType" : "varchar(40)", - "type" : 253, - "length" : 40, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "cci_refs_cci_id", - "local" : "cci_id", - "schema" : "sagacity", - "table" : "cci", - "field" : "cci_id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "cci_refs_cci_id_idx", - "type" : "index", - "ref" : "cci_id" - }, - { - "id" : "cci_refs_title_idx", - "type" : "index", - "ref" : "title" - } - ] - }, - { - "schema" : "sagacity", - "name" : "cve_db", - "primary_key" : [ - "cve_id" - ], - "fields" : [ - { - "name" : "cve_id", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "seq", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "status", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "phase", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "phase_date", - "dataType" : "date", - "type" : 14, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "desc", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "cvss", - "dataType" : "decimal(4,2)", - "type" : 0, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "index" : [ - { - "id" : "cve_idx", - "type" : "index", - "ref" : "cve_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "cve_references", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "cve_seq", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "source", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "url", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "val", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "cve_cve_ref_id", - "local" : "cve_seq", - "schema" : "sagacity", - "table" : "cve_db", - "field" : "cve_id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "cve_ref_idx", - "type" : "index", - "ref" : "cve_seq" - } - ] - }, - { - "schema" : "sagacity", - "name" : "cve", - "primary_key" : [ - "pdi_id", - "cve_id" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "cve_id", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "cve_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "cve_cve_id", - "local" : "cve_id", - "schema" : "sagacity", - "table" : "cve_db", - "field" : "cve_id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "cve_web", - "primary_key" : ["cve_id"], - "fields" : [ - { - "name" : "cve_id", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "xml", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "cve_web_cve_id", - "local" : "cve_id", - "schema" : "sagacity", - "table" : "cve_db", - "field" : "cve_id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "golddisk", - "primary_key" : [ - "pdi_id", - "vms_id" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "vms_id", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "short_title", - "dataType" : "varchar(64)", - "type" : 253, - "length" : 64, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "gd_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "gd_pdi_id_idx", - "type" : "index", - "ref" : "pdi_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "ia_controls", - "primary_key" : [ - "pdi_id", - "type", - "type_id" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "type", - "dataType" : "varchar(5)", - "type" : 253, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "type_id", - "dataType" : "varchar(8)", - "type" : 253, - "length" : 8, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "ia_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "ia_pdi_id_idx", - "type" : "index", - "ref" : "pdi_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "iavm_notices", - "primary_key" : [ - "noticeId" - ], - "fields" : [ - { - "name" : "noticeId", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "xmlUrl", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "htmlUrl", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "file_name", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "iavmNoticeNumber", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "title", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "type", - "dataType" : "varchar(5)", - "type" : 253, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "state", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "lastUpdated", - "dataType" : "date", - "type" : 14, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "releaseDate", - "dataType" : "date", - "type" : 14, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "supersedes", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "executiveSummary", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "fixAction", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "note", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "vulnAppsSysAndCntrmsrs", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "stigFindingSeverity", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "knownExploits", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "iavm_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "iavm_pdi_id_idx", - "type" : "index", - "ref" : "pdi_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "iavm_bids", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "iavm_notice_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "bid", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "bids_iavm_id", - "local" : "iavm_notice_id", - "schema" : "sagacity", - "table" : "iavm_notices", - "field" : "noticeId", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "bids_iavm_id_idx", - "type" : "index", - "ref" : "iavm_notice_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "iavm_mitigations", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "iavm_notice_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "header", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "body", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "mit_iavm_id", - "local" : "iavm_notice_id", - "schema" : "sagacity", - "table" : "iavm_notices", - "field" : "noticeId", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "mit_iavm_id_idx", - "type" : "index", - "ref" : "iavm_notice_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "iavm_patches", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "iavm_notice_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "type", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "title", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "url", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "patches_iavm_id", - "local" : "iavm_notice_id", - "schema" : "sagacity", - "table" : "iavm_notices", - "field" : "noticeId", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "patches_iavm_id_idx", - "type" : "index", - "ref" : "iavm_notice_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "iavm_references", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "iavm_notice_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "title", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "url", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "ref_iavm_id", - "local" : "iavm_notice_id", - "schema" : "sagacity", - "table" : "iavm_notices", - "field" : "noticeId", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "ref_iavm_id_idx", - "type" : "index", - "ref" : "iavm_notice_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "iavm_tech_overview", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "iavm_notice_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "details", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "iavm_ovw_iavm_id", - "local" : "iavm_notice_id", - "schema" : "sagacity", - "table" : "iavm_notices", - "field" : "noticeId", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "iavm_ovw_iavm_id_idx", - "type" : "index", - "ref" : "iavm_notice_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "iavm_to_cve", - "primary_key" : [ - "noticeId", - "cve_id" - ], - "fields" : [ - { - "name" : "noticeId", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "cve_id", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "cve_lookup_id", - "local" : "cve_id", - "schema" : "sagacity", - "table" : "cve_db", - "field" : "cve_id", - "update" : null, - "delete" : null - }, - { - "id" : "iavm_lookup_id", - "local" : "noticeId", - "schema" : "sagacity", - "table" : "iavm_notices", - "field" : "noticeId", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "cve_lookup_id_idx", - "type" : "index", - "ref" : "cve_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "nessus_plugins", - "primary_key" : [ - "plugin_id" - ], - "fields" : [ - { - "name" : "plugin_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "oid", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "name", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "copyright", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "version", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "file_name", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "file_date", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "nessus_meta", - "primary_key" : [ - "meta_id" - ], - "fields" : [ - { - "name" : "meta_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "plugin_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "type", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "val", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "nessus_plugin_id", - "local" : "plugin_id", - "schema" : "sagacity", - "table" : "nessus_plugins", - "field" : "plugin_id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "nessus_plugin_id_idx", - "type" : "index", - "ref" : "plugin_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "nessus", - "primary_key" : [ - "pdi_id", - "nessus_id" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "nessus_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "nessus_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "nessus_n_id", - "local" : "nessus_id", - "schema" : "sagacity", - "table" : "nessus_plugins", - "field" : "plugin_id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "nessus_pdi_id_idx", - "type" : "index", - "ref" : "pdi_id" - }, - { - "id" : "nessus_n_id_idx", - "type" : "index", - "ref" : "nessus_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "ov_convert", - "primary_key" : [ - "pdi_id", - "const_id", - "value" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "const_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "value", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "ov_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "ov_con_pdi_id_idx", - "type" : "index", - "ref" : "pdi_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "oval", - "primary_key" : [ - "pdi_id", - "oval_id" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "oval_id", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "title", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "desc", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "platform", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "ext_def", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "ext_def_op", - "dataType" : "varchar(10)", - "type" : 253, - "length" : 10, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "oval_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "oval_pdi_id_idx", - "type" : "index", - "ref" : "pdi_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "oval_ref", - "primary_key" : [ - "oval_id", - "source" - ], - "fields" : [ - { - "name" : "oval_id", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "source", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "url", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "ref_id", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "stigs", - "primary_key" : [ - "pdi_id", - "stig_id" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "stig_id", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "description", - "dataType" : "varchar(1000)", - "type" : 253, - "length" : 1000, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "tweak_data", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "stigs_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "stigs_pdi_id_idx", - "type" : "index", - "ref" : "pdi_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "sv_rule", - "primary_key" : [ - "pdi_id", - "sv_rule" - ], - "fields" : [ - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "sv_rule", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "sv_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "sv_pdi_id_idx", - "type" : "index", - "ref" : "pdi_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "people", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "org", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "name", - "dataType" : "varchar(60)", - "type" : 253, - "length" : 60, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "phone", - "dataType" : "varchar(15)", - "type" : 253, - "length" : 15, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "ste", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "system_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "site_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "eval_start", - "dataType" : "datetime", - "type" : 12, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - }, - { - "name" : "eval_end", - "dataType" : "datetime", - "type" : 12, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - }, - { - "name" : "multiple", - "dataType" : "tinyint(1)", - "type" : 1, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "primary", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "scope", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "ao", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "assumptions", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "constraints", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "recommendations", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "residual_risk", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "risk_status", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "very low", - "low", - "medium", - "high", - "very high" - ], - "ai" : false, - "nn" : false, - "default" : "medium" - }, - { - "name" : "deviations", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "conclusion", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "ste_sys_id", - "local" : "system_id", - "schema" : "sagacity", - "table" : "system", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "ste_site_id", - "local" : "site_id", - "schema" : "sagacity", - "table" : "sites", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "ste_sys_id_idx", - "type" : "index", - "ref" : "system_id" - }, - { - "id" : "ste_site_id_idx", - "type" : "index", - "ref" : "site_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "ste_team", - "primary_key" : [ - "people_id", - "ste_id" - ], - "fields" : [ - { - "name" : "people_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "ste_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "pos", - "dataType" : "varchar(60)", - "type" : 253, - "length" : 60, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "ste_team_people_id", - "local" : "people_id", - "schema" : "sagacity", - "table" : "people", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "ste_team_ste_id", - "local" : "ste_id", - "schema" : "sagacity", - "table" : "ste", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "ste_cat", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "ste_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "analysts", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "ste_cat_ste_id", - "local" : "ste_id", - "schema" : "sagacity", - "table" : "ste", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "ste_cat_ste_id_idx", - "type" : "index", - "ref" : "ste_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "ste_cat_sources", - "primary_key" : [ - "cat_id", - "src_id" - ], - "fields" : [ - { - "name" : "cat_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "src_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "ste_cat_cat_id", - "local" : "cat_id", - "schema" : "sagacity", - "table" : "ste_cat", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "ste_cat_src_id", - "local" : "src_id", - "schema" : "sagacity", - "table" : "sources", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "interview_questions", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "cat", - "dataType" : "varchar(64)", - "type" : 253, - "length" : 64, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "key", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "question", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ] - }, - { - "schema" : "sagacity", - "name" : "category_interview", - "primary_key" : [ - "cat_id", - "ques_id" - ], - "fields" : [ - { - "name" : "cat_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "ques_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "answer", - "dataType" : "tinyint(1)", - "type" : 1, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "cat_int_cat_id", - "local" : "cat_id", - "schema" : "sagacity", - "table" : "ste_cat", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "cat_int_ques_id", - "local" : "ques_id", - "schema" : "sagacity", - "table" : "interview_questions", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "cat_int_ques_id_idx", - "type" : "index", - "ref" : "ques_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "scans", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "src_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "ste_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "pid", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "itr", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "file_name", - "dataType" : "varchar(150)", - "type" : 253, - "length" : 150, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "file_date", - "dataType" : "date", - "type" : 14, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "start_time", - "dataType" : "datetime", - "type" : 12, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - }, - { - "name" : "last_update", - "dataType" : "datetime", - "type" : 12, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - }, - { - "name" : "status", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "IN QUEUE", - "RUNNING", - "COMPLETE", - "ERROR", - "TERMINATED" - ], - "ai" : false, - "nn" : true, - "default" : "IN QUEUE" - }, - { - "name" : "perc_comp", - "dataType" : "decimal(5,2)", - "type" : 0, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "last_host", - "dataType" : "varchar(64)", - "type" : 253, - "length" : 64, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "hosts_comp", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "host_count", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "notes", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "location", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "scan_src_id", - "local" : "src_id", - "schema" : "sagacity", - "table" : "sources", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "scan_ste_id", - "local" : "ste_id", - "schema" : "sagacity", - "table" : "ste", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "scan_src_id_idx", - "type" : "index", - "ref" : "src_id" - }, - { - "id" : "scan_ste_id_idx", - "type" : "index", - "ref" : "ste_id" - } - ] - }, - { - "schema" : "sagacity", - "name" : "target", - "primary_key" : [ - "ste_id", - "name" - ], - "unique" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - }, - { - "name" : "cat_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "os_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "ste_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "auto_status_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "man_status_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "data_status_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "fp_cat1_status_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "name", - "dataType" : "varchar(64)", - "type" : 253, - "length" : 64, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "location", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "source", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "cat_1", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "cat_2", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "cat_3", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "closed", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "not_applicable", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "not_reviewed", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : 0 - }, - { - "name" : "compliance", - "dataType" : "tinyint(3)", - "type" : 1, - "length" : 3, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "assessed", - "dataType" : "tinyint(3)", - "type" : 1, - "length" : 3, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "notes", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "missing_patches", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "os_string", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "pp_flag", - "dataType" : "tinyint(1)", - "type" : 1, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "1" - }, - { - "name" : "pp_off", - "dataType" : "tinyint(1)", - "type" : 1, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "class", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "U", - "FOUO", - "S" - ], - "ai" : false, - "nn" : false, - "default" : "U" - } - ], - "constraints" : [ - { - "id" : "t_cat_id", - "local" : "cat_id", - "schema" : "sagacity", - "table" : "ste_cat", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "t_os_id", - "local" : "os_id", - "schema" : "sagacity", - "table" : "software", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "t_ste_id", - "local" : "ste_id", - "schema" : "sagacity", - "table" : "ste", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "t_auto_id", - "local" : "auto_status_id", - "schema" : "sagacity", - "table" : "task_status", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "t_man_id", - "local" : "man_status_id", - "schema" : "sagacity", - "table" : "task_status", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "t_data_id", - "local" : "data_status_id", - "schema" : "sagacity", - "table" : "task_status", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "t_fp_cat1_id", - "local" : "fp_cat1_status_id", - "schema" : "sagacity", - "table" : "task_status", - "field" : "id", - "update" : null, - "delete" : null - } - ], - "index" : [ - { - "id" : "t_id_idx", - "type" : "index", - "ref" : "id" - }, - { - "id" : "t_name_idx", - "type" : "index", - "ref" : "name" - }, - { - "id" : "t_cat_id_idx", - "type" : "index", - "ref" : "cat_id" - }, - { - "id" : "t_os_id_idx", - "type" : "index", - "ref" : "os_id" - }, - { - "id" : "t_ste_id_idx", - "type" : "index", - "ref" : "ste_id" - }, - { - "id" : "t_auto_id_idx", - "type" : "index", - "ref" : "auto_status_id" - }, - { - "id" : "t_man_id_idx", - "type" : "index", - "ref" : "man_status_id" - }, - { - "id" : "t_data_status_id_idx", - "type" : "index", - "ref" : "data_status_id" - }, - { - "id" : "t_fp_cat1_id_idx", - "type" : "index", - "ref" : "fp_cat1_status_id" - } - ], - "triggers" : [ - "DROP TRIGGER IF EXISTS `sagacity`.`target_BEFORE_INSERT`", - "CREATE DEFINER=`web`@`{host}` TRIGGER `sagacity`.`target_BEFORE_INSERT` BEFORE INSERT ON `target` FOR EACH ROW", - "BEGIN", - "SELECT MAX(`id`) INTO @newid", - "FROM `sagacity`.`target`;", - "SET NEW.`id` = COALESCE(@newid + 1, 1);", - "END" - ] - }, - { - "schema" : "sagacity", - "name" : "target_net_meta", - "primary_key" : [ - "tgt_id" - ], - "fields" : [ - { - "name" : "tgt_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "netstat_connections", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "shares", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "routes", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "firewall_config", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "tnm_tgt_id", - "local" : "tgt_id", - "schema" : "sagacity", - "table" : "target", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "target_user_meta", - "primary_key" : [ - "tgt_id" - ], - "fields" : [ - { - "name" : "tgt_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "login", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "user_list", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "last_login", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "disabled_accts", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "stag_pwds", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "never_logged_in", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "pwd_never_expires", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "tum_tgt_id", - "local" : "tgt_id", - "schema" : "sagacity", - "table" : "target", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "target_sys_meta", - "primary_key" : [ - "tgt_id" - ], - "fields" : [ - { - "name" : "tgt_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "mounted", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "process_list", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "autorun", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "services", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "last_boot", - "dataType" : "datetime", - "type" : 12, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - }, - { - "name" : "remote_registry", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "copyrighted", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "is_vm", - "dataType" : "tinyint(1)", - "type" : 1, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "system", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "bios", - "dataType" : "mediumtext", - "type" : 250, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "wmi_listening_pid", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - } - ], - "constraints" : [ - { - "id" : "tsm_tgt_id", - "local" : "tgt_id", - "schema" : "sagacity", - "table" : "target", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "interfaces", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "tgt_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "ipv4", - "dataType" : "varchar(150)", - "type" : 253, - "length" : 150, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "ipv6", - "dataType" : "varchar(400)", - "type" : 253, - "length" : 400, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "hostname", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "mac", - "dataType" : "varchar(40)", - "type" : 253, - "length" : 40, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - }, - { - "name" : "fqdn", - "dataType" : "varchar(100)", - "type" : 253, - "length" : 100, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "description", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "dns", - "dataType" : "varchar(60)", - "type" : 253, - "length" : 60, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "int_tgt_id", - "local" : "tgt_id", - "schema" : "sagacity", - "table" : "target", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "target_checklist", - "primary_key" : [ - "tgt_id", - "chk_id" - ], - "fields" : [ - { - "name" : "tgt_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "chk_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "class", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "U", - "FOUO", - "S", - "TS", - "SCI" - ], - "ai" : false, - "nn" : false, - "default" : "U" - } - ], - "constraints" : [ - { - "id" : "chk_tgt_chk_id", - "local" : "chk_id", - "schema" : "sagacity", - "table" : "checklist", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "tgt_tgt_chk_id", - "local" : "tgt_id", - "schema" : "sagacity", - "table" : "target", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "target_software", - "primary_key" : [ - "tgt_id", - "sft_id" - ], - "fields" : [ - { - "name" : "tgt_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "sft_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "sw_string", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ], - "constraints" : [ - { - "id" : "sft_tgt_sft_id", - "local" : "sft_id", - "schema" : "sagacity", - "table" : "software", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "tgt_tgt_sft_id", - "local" : "tgt_id", - "schema" : "sagacity", - "table" : "target", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "host_list", - "primary_key" : [ - "scan_id", - "tgt_id" - ], - "fields" : [ - { - "name" : "scan_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "tgt_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "finding_count", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "scanner_error", - "dataType" : "tinyint(1)", - "type" : 1, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - }, - { - "name" : "notes", - "dataType" : "text", - "type" : 252, - "length" : "", - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "host_scan_id", - "local" : "scan_id", - "schema" : "sagacity", - "table" : "scans", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "host_tgt_id", - "local" : "tgt_id", - "schema" : "sagacity", - "table" : "target", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "pps_list", - "primary_key" : [ - "int_id", - "pps_id" - ], - "fields" : [ - { - "name" : "int_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "pps_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(255)", - "type" : 253, - "length" : 255, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "banner", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "notes", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "listening", - "dataType" : "tinyint(1)", - "type" : 1, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "0" - } - ], - "constraints" : [ - { - "id" : "pps_int_id", - "local" : "int_id", - "schema" : "sagacity", - "table" : "interfaces", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "pps_pps_id", - "local" : "pps_id", - "schema" : "sagacity", - "table" : "ports_proto_services", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "findings", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "tgt_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "pdi_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "scan_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "findings_status_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "cat", - "dataType" : "int(1)", - "type" : 3, - "length" : 1, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "notes", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "change_id", - "dataType" : "tinyint(2)", - "type" : 1, - "length" : 2, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "orig_src", - "dataType" : "varchar(10)", - "type" : 253, - "length" : 10, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - }, - { - "name" : "finding_itr", - "dataType" : "int(5)", - "type" : 3, - "length" : 5, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : "1" - } - ], - "constraints" : [ - { - "id" : "find_pdi_id", - "local" : "pdi_id", - "schema" : "sagacity", - "table" : "pdi_catalog", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "find_tgt_id", - "local" : "tgt_id", - "schema" : "sagacity", - "table" : "target", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "find_scan_id", - "local" : "scan_id", - "schema" : "sagacity", - "table" : "scans", - "field" : "id", - "update" : null, - "delete" : null - }, - { - "id" : "find_status_id", - "local" : "findings_status_id", - "schema" : "sagacity", - "table" : "findings_status", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "finding_controls", - "primary_key" : [ - "finding_id", - "ia_control" - ], - "fields" : [ - { - "name" : "finding_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "ia_control", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ], - "constraints" : [ - { - "id" : "find_ctrl_id", - "local" : "finding_id", - "schema" : "sagacity", - "table" : "findings", - "field" : "id", - "update" : null, - "delete" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "search_filters", - "primary_key" : [ - "id" - ], - "fields" : [ - { - "name" : "id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : true, - "nn" : true, - "default" : "" - }, - { - "name" : "name", - "dataType" : "varchar(45)", - "type" : 253, - "length" : 45, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "type", - "dataType" : "enum", - "type" : 247, - "length" : null, - "values" : [ - "target", - "scan", - "finding", - "reference" - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "criteria", - "dataType" : "text", - "type" : 252, - "length" : null, - "values" : [ - ], - "ai" : false, - "nn" : false, - "default" : null - } - ] - }, - { - "schema" : "sagacity", - "name" : "cve_sw_lookup", - "primary_key" : [ - "cve_id", - "sw_id" - ], - "fields" : [ - { - "name" : "cve_id", - "dataType" : "varchar(20)", - "type" : 253, - "length" : 20, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - }, - { - "name" : "sw_id", - "dataType" : "int(11)", - "type" : 3, - "length" : 11, - "values" : [ - ], - "ai" : false, - "nn" : true, - "default" : "" - } - ] - } - ] + "tables": [ + { + "schema": "sagacity", + "name": "settings", + "primary_key": [ + "id" + ], + "unique": [ + "meta_key" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "meta_key", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "meta_value", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "db_data", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "sagacity", + "name": "sw_man_match", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": false, + "default": "" + }, + { + "name": "man", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "type", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "ms-os", + "nix-os", + "net-os", + "ms", + "nix", + "checklist", + "multiple" + ], + "ai": false, + "nn": true, + "default": "multiple" + }, + { + "name": "rgx", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ] + }, + { + "schema": "sagacity", + "name": "sw_name_match", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": false, + "default": "" + }, + { + "name": "man_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "man_override", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "name", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "type", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "ms-os", + "nix-os", + "net-os", + "ms", + "nix", + "checklist", + "multiple" + ], + "ai": false, + "nn": true, + "default": "multiple" + }, + { + "name": "rgx", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "name_match", + "dataType": "varchar(15)", + "type": 253, + "length": 15, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "ver_match", + "dataType": "varchar(15)", + "type": 253, + "length": 15, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "ver", + "dataType": "varchar(15)", + "type": 253, + "length": 15, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "update_match", + "dataType": "varchar(15)", + "type": 253, + "length": 15, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "is_os", + "dataType": "tinyint(1)", + "type": 1, + "length": 1, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "multiple", + "dataType": "tinyint(1)", + "type": 1, + "length": 1, + "values": [], + "ai": false, + "nn": false, + "default": "0" + } + ], + "constraints": [ + { + "id": "swnm_swmm_id", + "local": "man_id", + "schema": "sagacity", + "table": "sw_man_match", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "catalog_scripts", + "primary_key": [ + "file_name" + ], + "fields": [ + { + "name": "file_name", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "pid", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": "" + }, + { + "name": "start_time", + "dataType": "datetime", + "type": 12, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": "" + }, + { + "name": "last_update", + "dataType": "datetime", + "type": 12, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": "" + }, + { + "name": "status", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "IN QUEUE", + "RUNNING", + "COMPLETE", + "ERROR", + "SKIPPED" + ], + "ai": false, + "nn": true, + "default": "IN QUEUE" + }, + { + "name": "perc_comp", + "dataType": "decimal(5,2)", + "type": 0, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "stig_count", + "dataType": "int(4)", + "type": 3, + "length": 4, + "values": [], + "ai": false, + "nn": false, + "default": "0" + } + ], + "index": [ + { + "id": "catalog_file_name_idx", + "type": "index", + "ref": "file_name" + } + ] + }, + { + "schema": "rmf", + "name": "family", + "primary_key": [ + "abbr" + ], + "fields": [ + { + "name": "abbr", + "dataType": "varchar(4)", + "type": 253, + "length": 4, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(64)", + "type": 253, + "length": 64, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "rmf", + "name": "controls", + "primary_key": [ + "family_id", + "control_id" + ], + "fields": [ + { + "name": "family_id", + "dataType": "varchar(4)", + "type": 253, + "length": 4, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "control_id", + "dataType": "varchar(6)", + "type": 253, + "length": 6, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(6)", + "type": 253, + "length": 6, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "pri", + "dataType": "tinyint(1)", + "type": 1, + "length": 1, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "statement", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "guidance", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "rmf_family_family_id", + "local": "family_id", + "schema": "rmf", + "table": "family", + "field": "abbr", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "rmf_controls_control_id_idx", + "type": "index", + "ref": "control_id" + } + ] + }, + { + "schema": "rmf", + "name": "related_controls", + "primary_key": [ + "control_id", + "related_control_id" + ], + "fields": [ + { + "name": "control_id", + "dataType": "varchar(6)", + "type": 253, + "length": 64, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "related_control_id", + "dataType": "varchar(6)", + "type": 253, + "length": 64, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "rmf_related_controls_control_id", + "local": "control_id", + "schema": "rmf", + "table": "controls", + "field": "control_id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "rmf_related_controls_related_id", + "local": "related_control_id", + "schema": "rmf", + "table": "controls", + "field": "control_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "rmf_related_controls_related_id_idx", + "type": "index", + "ref": "related_control_id" + } + ] + }, + { + "schema": "rmf", + "name": "control_baseline", + "primary_key": [ + "impact_level", + "control_id" + ], + "fields": [ + { + "name": "impact_level", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "low", + "moderate", + "high" + ], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "control_id", + "dataType": "varchar(6)", + "type": 253, + "length": 6, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "rmf_control_baseline_control_id", + "local": "control_id", + "schema": "rmf", + "table": "controls", + "field": "control_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "rmf_control_baseline_control_id_idx", + "type": "index", + "ref": "control_id" + } + ] + }, + { + "schema": "rmf", + "name": "control_enh", + "primary_key": [ + "control_id", + "enh_id" + ], + "fields": [ + { + "name": "control_id", + "dataType": "varchar(6)", + "type": 253, + "length": 6, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "enh_id", + "dataType": "varchar(4)", + "type": 253, + "length": 4, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "desc", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "guidance", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "rmf_control_enh_control_id", + "local": "control_id", + "schema": "rmf", + "table": "controls", + "field": "control_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "rmf_control_enh_enh_id_idx", + "type": "index", + "ref": "enh_id" + } + ] + }, + { + "schema": "rmf", + "name": "enhancement_baseline", + "primary_key": [ + "impact", + "control_id", + "enh_id" + ], + "fields": [ + { + "name": "impact", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "low", + "moderate", + "high" + ], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "control_id", + "dataType": "varchar(6)", + "type": 253, + "length": 6, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "enh_id", + "dataType": "varchar(4)", + "type": 253, + "length": 4, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "rmf_enh_baseline_control_id", + "local": "control_id", + "schema": "rmf", + "table": "controls", + "field": "control_id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "rmf_eny_baseline_enh_id", + "local": "enh_id", + "schema": "rmf", + "table": "control_enh", + "field": "enh_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "rmf_enh_baseline_enh_id_idx", + "type": "index", + "ref": "enh_id" + }, + { + "id": "rmf_enh_baseline_control_id_idx", + "type": "index", + "ref": "control_id" + } + ] + }, + { + "schema": "rmf", + "name": "cci", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "control_id", + "dataType": "varchar(6)", + "type": 253, + "length": 6, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "enh_id", + "dataType": "varchar(4)", + "type": 253, + "length": 4, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "def", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "guidance", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "procedures", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "fk_cci_controls1", + "local": "control_id", + "schema": "rmf", + "table": "controls", + "field": "control_id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "fk_cci_control_enh1", + "local": "enh_id", + "schema": "rmf", + "table": "control_enh", + "field": "enh_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "fk_cci_controls1_idx", + "type": "index", + "ref": "control_id" + }, + { + "id": "fk_cci_control_enh1_idx", + "type": "index", + "ref": "enh_id" + } + ] + }, + { + "schema": "rmf", + "name": "emass_cci", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "control", + "dataType": "varchar(25)", + "type": 253, + "length": 25, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ] + }, + { + "schema": "sagacity", + "name": "help", + "primary_key": [ + "section" + ], + "fields": [ + { + "name": "section", + "dataType": "varchar(10)", + "type": 253, + "length": 10, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "topic", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "title", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "content", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "index": [ + { + "id": "section_id", + "type": "index", + "ref": "section" + } + ] + }, + { + "schema": "sagacity", + "name": "pdi_catalog", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "cat", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "1", + "2", + "3" + ], + "ai": false, + "nn": true, + "default": "2" + }, + { + "name": "update", + "dataType": "datetime", + "type": 12, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": "" + }, + { + "name": "short_title", + "dataType": "varchar(1024)", + "type": 253, + "length": 1024, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "check_contents", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "sagacity", + "name": "sites", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "address", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "city", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "state", + "dataType": "varchar(5)", + "type": 253, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "zip", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "country", + "dataType": "varchar(5)", + "type": 253, + "length": 5, + "values": [], + "ai": false, + "nn": true, + "default": "US" + }, + { + "name": "poc_name", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "poc_email", + "dataType": "varchar(64)", + "type": 253, + "length": 64, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "poc_phone", + "dataType": "varchar(15)", + "type": 253, + "length": 15, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ] + }, + { + "schema": "sagacity", + "name": "system", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "abbr", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "mac", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "1", + "2", + "3" + ], + "ai": false, + "nn": true, + "default": "3" + }, + { + "name": "classification", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "Unclass", + "FOUO", + "C", + "S", + "TS", + "SCI", + "Public", + "Classified", + "Sensitive" + ], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "acred_type", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "diacap", + "rmf", + "pci", + "nispom", + "hipaa", + "sox", + "cobit" + ], + "ai": false, + "nn": false, + "default": "diacap" + }, + { + "name": "mitigations", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "description", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "executive_summary", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "diagram", + "dataType": "mediumblob", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "sagacity", + "name": "software", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "cpe", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "cpe23", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "sw_string", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "short_sw_string", + "dataType": "varchar(64)", + "type": 253, + "length": 64, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "sagacity", + "name": "sources", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "icon", + "dataType": "varchar(64)", + "type": 253, + "length": 64, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "sagacity", + "name": "false_positives", + "primary_key": [ + "pdi_id", + "src_id" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "src_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "notes", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "fp_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "fp_src_id", + "local": "src_id", + "schema": "sagacity", + "table": "sources", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "exceptions", + "primary_key": [ + "pdi_id", + "sys_id" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "sys_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "notes", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "exp_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "exp_sys_id", + "local": "sys_id", + "schema": "sagacity", + "table": "system", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "task_status", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "status", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ] + }, + { + "schema": "sagacity", + "name": "category", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ] + }, + { + "schema": "sagacity", + "name": "findings_status", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "status", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ] + }, + { + "schema": "sagacity", + "name": "ports_proto_services", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "port", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "proto", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "tcp", + "udp", + "dccp", + "sctp" + ], + "ai": false, + "nn": true, + "default": "tcp" + }, + { + "name": "IANA_Name", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "description", + "dataType": "varchar(500)", + "type": 253, + "length": 500, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "banner", + "dataType": "varchar(500)", + "type": 253, + "length": 500, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "notes", + "dataType": "varchar(500)", + "type": 253, + "length": 500, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "sagacity", + "name": "proc_ia_controls", + "primary_key": [ + "control_id" + ], + "fields": [ + { + "name": "control_id", + "dataType": "varchar(10)", + "type": 253, + "length": 10, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "subject_area", + "dataType": "varchar(50)", + "type": 253, + "length": 50, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "description", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "threat_vul_cm", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "gen_imp_guide", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "impact", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "low", + "medium", + "high" + ], + "ai": false, + "nn": false, + "default": "medium" + } + ] + }, + { + "schema": "sagacity", + "name": "proc_ia_sub_controls", + "primary_key": [ + "sub_control_id" + ], + "fields": [ + { + "name": "sub_control_id", + "dataType": "varchar(10)", + "type": 253, + "length": 10, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "parent_control_id", + "dataType": "varchar(10)", + "type": 253, + "length": 10, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "objective", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "prep", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "script", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "exp_result", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "parent_cont_id", + "local": "parent_control_id", + "schema": "sagacity", + "table": "proc_ia_controls", + "field": "control_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "parent_cont_id_idx", + "type": "index", + "ref": "parent_control_id" + } + ] + }, + { + "schema": "sagacity", + "name": "proc_level_type", + "primary_key": [ + "proc_control_id", + "type", + "level", + "class" + ], + "fields": [ + { + "name": "proc_control_id", + "dataType": "varchar(10)", + "type": 253, + "length": 10, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "type", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "diacap", + "rmf" + ], + "ai": false, + "nn": true, + "default": "diacap" + }, + { + "name": "level", + "dataType": "tinyint(1)", + "type": 1, + "length": 1, + "values": [], + "ai": false, + "nn": true, + "default": null + }, + { + "name": "class", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "cl", + "pub", + "sen", + "u", + "fouo", + "s", + "ts", + "sci" + ], + "ai": false, + "nn": true, + "default": null + } + ], + "constraints": [ + { + "id": "proc_control_id", + "local": "proc_control_id", + "schema": "sagacity", + "table": "proc_ia_controls", + "field": "control_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "checklist", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "checklist_id", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "description", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "date", + "dataType": "date", + "type": 14, + "length": null, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "file_name", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "ver", + "dataType": "tinyint(3)", + "type": 1, + "length": 3, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "release", + "dataType": "varchar(5)", + "type": 253, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "type", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "benchmark", + "manual", + "policy", + "iavm" + ], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "icon", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "sagacity", + "name": "checklist_software_lookup", + "primary_key": [ + "chk_id", + "sw_id" + ], + "fields": [ + { + "name": "chk_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "sw_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "chk_sw_lu_chk_id", + "local": "chk_id", + "schema": "sagacity", + "table": "checklist", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "chk_sw_lu_sw_id", + "local": "sw_id", + "schema": "sagacity", + "table": "software", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "chk_sw_lu_chk_id_idx", + "type": "index", + "ref": "chk_id" + }, + { + "id": "chk_sw_lu_sw_id_idx", + "type": "index", + "ref": "sw_id" + } + ] + }, + { + "schema": "sagacity", + "name": "pdi_checklist_lookup", + "primary_key": [ + "pdi_id", + "checklist_id" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "checklist_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "group_title", + "dataType": "varchar(2048)", + "type": 253, + "length": 2048, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "short_title", + "dataType": "varchar(1024)", + "type": 253, + "length": 1024, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "check_contents", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "fix_text", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "tweak_data", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "pdi_chk_chk_id", + "local": "checklist_id", + "schema": "sagacity", + "table": "checklist", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "pdi_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "pdi_chk_chk_id_idx", + "type": "index", + "ref": "checklist_id" + }, + { + "id": "pdi_pdi_id_idx", + "type": "index", + "ref": "pdi_id" + } + ] + }, + { + "schema": "sagacity", + "name": "advisories", + "primary_key": [ + "advisory_id", + "pdi_id" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "advisory_id", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "title", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "impact", + "dataType": "varchar(64)", + "type": 253, + "length": 64, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "type", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "referece", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "url", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "ad_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "ad_pdi_id_idx", + "type": "index", + "ref": "pdi_id" + } + ] + }, + { + "schema": "sagacity", + "name": "cce", + "primary_key": [ + "pdi_id", + "cce_id" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "cce_id", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "cce_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "cce_pdi_id_idx", + "type": "index", + "ref": "pdi_id" + } + ] + }, + { + "schema": "sagacity", + "name": "cci", + "primary_key": [ + "cci_id" + ], + "fields": [ + { + "name": "cci_id", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "type", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "policy", + "technical" + ], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "definition", + "dataType": "varchar(500)", + "type": 253, + "length": 500, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "param", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "note", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "index": [ + { + "id": "cci_id_idx", + "type": "index", + "ref": "cci_id" + } + ] + }, + { + "schema": "sagacity", + "name": "cci_refs", + "primary_key": [ + "cci_id", + "title" + ], + "fields": [ + { + "name": "cci_id", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "title", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": null + }, + { + "name": "ver", + "dataType": "tinyint(2)", + "type": 1, + "length": 2, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "url", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "index", + "dataType": "varchar(40)", + "type": 253, + "length": 40, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "cci_refs_cci_id", + "local": "cci_id", + "schema": "sagacity", + "table": "cci", + "field": "cci_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "cci_refs_cci_id_idx", + "type": "index", + "ref": "cci_id" + }, + { + "id": "cci_refs_title_idx", + "type": "index", + "ref": "title" + } + ] + }, + { + "schema": "sagacity", + "name": "cve_db", + "primary_key": [ + "cve_id" + ], + "fields": [ + { + "name": "cve_id", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "seq", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "status", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "phase", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "phase_date", + "dataType": "date", + "type": 14, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "desc", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "cvss", + "dataType": "decimal(4,2)", + "type": 0, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "index": [ + { + "id": "cve_idx", + "type": "index", + "ref": "cve_id" + } + ] + }, + { + "schema": "sagacity", + "name": "cve_references", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "cve_seq", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "source", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "url", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "val", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "cve_cve_ref_id", + "local": "cve_seq", + "schema": "sagacity", + "table": "cve_db", + "field": "cve_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "cve_ref_idx", + "type": "index", + "ref": "cve_seq" + } + ] + }, + { + "schema": "sagacity", + "name": "cve", + "primary_key": [ + "pdi_id", + "cve_id" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "cve_id", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "cve_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "cve_cve_id", + "local": "cve_id", + "schema": "sagacity", + "table": "cve_db", + "field": "cve_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "cve_web", + "primary_key": [ + "cve_id" + ], + "fields": [ + { + "name": "cve_id", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "xml", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "cve_web_cve_id", + "local": "cve_id", + "schema": "sagacity", + "table": "cve_db", + "field": "cve_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "golddisk", + "primary_key": [ + "pdi_id", + "vms_id" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "vms_id", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "short_title", + "dataType": "varchar(64)", + "type": 253, + "length": 64, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "gd_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "gd_pdi_id_idx", + "type": "index", + "ref": "pdi_id" + } + ] + }, + { + "schema": "sagacity", + "name": "ia_controls", + "primary_key": [ + "pdi_id", + "type", + "type_id" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "type", + "dataType": "varchar(5)", + "type": 253, + "length": 5, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "type_id", + "dataType": "varchar(8)", + "type": 253, + "length": 8, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "ia_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "ia_pdi_id_idx", + "type": "index", + "ref": "pdi_id" + } + ] + }, + { + "schema": "sagacity", + "name": "iavm_notices", + "primary_key": [ + "noticeId" + ], + "fields": [ + { + "name": "noticeId", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "xmlUrl", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "htmlUrl", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "file_name", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "iavmNoticeNumber", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "title", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "type", + "dataType": "varchar(5)", + "type": 253, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "state", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "lastUpdated", + "dataType": "date", + "type": 14, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "releaseDate", + "dataType": "date", + "type": 14, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "supersedes", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "executiveSummary", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "fixAction", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "note", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "vulnAppsSysAndCntrmsrs", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "stigFindingSeverity", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "knownExploits", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "iavm_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "iavm_pdi_id_idx", + "type": "index", + "ref": "pdi_id" + } + ] + }, + { + "schema": "sagacity", + "name": "iavm_bids", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "iavm_notice_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "bid", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "bids_iavm_id", + "local": "iavm_notice_id", + "schema": "sagacity", + "table": "iavm_notices", + "field": "noticeId", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "bids_iavm_id_idx", + "type": "index", + "ref": "iavm_notice_id" + } + ] + }, + { + "schema": "sagacity", + "name": "iavm_mitigations", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "iavm_notice_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "header", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "body", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "mit_iavm_id", + "local": "iavm_notice_id", + "schema": "sagacity", + "table": "iavm_notices", + "field": "noticeId", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "mit_iavm_id_idx", + "type": "index", + "ref": "iavm_notice_id" + } + ] + }, + { + "schema": "sagacity", + "name": "iavm_patches", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "iavm_notice_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "type", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "title", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "url", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "patches_iavm_id", + "local": "iavm_notice_id", + "schema": "sagacity", + "table": "iavm_notices", + "field": "noticeId", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "patches_iavm_id_idx", + "type": "index", + "ref": "iavm_notice_id" + } + ] + }, + { + "schema": "sagacity", + "name": "iavm_references", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "iavm_notice_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "title", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "url", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "ref_iavm_id", + "local": "iavm_notice_id", + "schema": "sagacity", + "table": "iavm_notices", + "field": "noticeId", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "ref_iavm_id_idx", + "type": "index", + "ref": "iavm_notice_id" + } + ] + }, + { + "schema": "sagacity", + "name": "iavm_tech_overview", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "iavm_notice_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "details", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "iavm_ovw_iavm_id", + "local": "iavm_notice_id", + "schema": "sagacity", + "table": "iavm_notices", + "field": "noticeId", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "iavm_ovw_iavm_id_idx", + "type": "index", + "ref": "iavm_notice_id" + } + ] + }, + { + "schema": "sagacity", + "name": "iavm_to_cve", + "primary_key": [ + "noticeId", + "cve_id" + ], + "fields": [ + { + "name": "noticeId", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "cve_id", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "cve_lookup_id", + "local": "cve_id", + "schema": "sagacity", + "table": "cve_db", + "field": "cve_id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "iavm_lookup_id", + "local": "noticeId", + "schema": "sagacity", + "table": "iavm_notices", + "field": "noticeId", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "cve_lookup_id_idx", + "type": "index", + "ref": "cve_id" + } + ] + }, + { + "schema": "sagacity", + "name": "nessus_plugins", + "primary_key": [ + "plugin_id" + ], + "fields": [ + { + "name": "plugin_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "oid", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "name", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "copyright", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "version", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "file_name", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "file_date", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "sagacity", + "name": "nessus_meta", + "primary_key": [ + "meta_id" + ], + "fields": [ + { + "name": "meta_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "plugin_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "type", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "val", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "nessus_plugin_id", + "local": "plugin_id", + "schema": "sagacity", + "table": "nessus_plugins", + "field": "plugin_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "nessus_plugin_id_idx", + "type": "index", + "ref": "plugin_id" + } + ] + }, + { + "schema": "sagacity", + "name": "nessus", + "primary_key": [ + "pdi_id", + "nessus_id" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "nessus_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "nessus_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "nessus_n_id", + "local": "nessus_id", + "schema": "sagacity", + "table": "nessus_plugins", + "field": "plugin_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "nessus_pdi_id_idx", + "type": "index", + "ref": "pdi_id" + }, + { + "id": "nessus_n_id_idx", + "type": "index", + "ref": "nessus_id" + } + ] + }, + { + "schema": "sagacity", + "name": "ov_convert", + "primary_key": [ + "pdi_id", + "const_id", + "value" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "const_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "value", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "ov_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "ov_con_pdi_id_idx", + "type": "index", + "ref": "pdi_id" + } + ] + }, + { + "schema": "sagacity", + "name": "oval", + "primary_key": [ + "pdi_id", + "oval_id" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "oval_id", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "title", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "desc", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "platform", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "ext_def", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "ext_def_op", + "dataType": "varchar(10)", + "type": 253, + "length": 10, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "oval_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "oval_pdi_id_idx", + "type": "index", + "ref": "pdi_id" + } + ] + }, + { + "schema": "sagacity", + "name": "oval_ref", + "primary_key": [ + "oval_id", + "source" + ], + "fields": [ + { + "name": "oval_id", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "source", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "url", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "ref_id", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "sagacity", + "name": "stigs", + "primary_key": [ + "pdi_id", + "stig_id" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "stig_id", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "description", + "dataType": "varchar(1000)", + "type": 253, + "length": 1000, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "tweak_data", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "stigs_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "stigs_pdi_id_idx", + "type": "index", + "ref": "pdi_id" + } + ] + }, + { + "schema": "sagacity", + "name": "sv_rule", + "primary_key": [ + "pdi_id", + "sv_rule" + ], + "fields": [ + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "sv_rule", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "sv_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "sv_pdi_id_idx", + "type": "index", + "ref": "pdi_id" + } + ] + }, + { + "schema": "sagacity", + "name": "people", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "org", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "name", + "dataType": "varchar(60)", + "type": 253, + "length": 60, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "phone", + "dataType": "varchar(15)", + "type": 253, + "length": 15, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "sagacity", + "name": "ste", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "system_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "site_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "eval_start", + "dataType": "datetime", + "type": 12, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": "" + }, + { + "name": "eval_end", + "dataType": "datetime", + "type": 12, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": "" + }, + { + "name": "multiple", + "dataType": "tinyint(1)", + "type": 1, + "length": 1, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "primary", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "scope", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "ao", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "assumptions", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "constraints", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "recommendations", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "residual_risk", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "risk_status", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "very low", + "low", + "medium", + "high", + "very high" + ], + "ai": false, + "nn": false, + "default": "medium" + }, + { + "name": "deviations", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "conclusion", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "ste_sys_id", + "local": "system_id", + "schema": "sagacity", + "table": "system", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "ste_site_id", + "local": "site_id", + "schema": "sagacity", + "table": "sites", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "ste_sys_id_idx", + "type": "index", + "ref": "system_id" + }, + { + "id": "ste_site_id_idx", + "type": "index", + "ref": "site_id" + } + ] + }, + { + "schema": "sagacity", + "name": "ste_team", + "primary_key": [ + "people_id", + "ste_id" + ], + "fields": [ + { + "name": "people_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "ste_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "pos", + "dataType": "varchar(60)", + "type": 253, + "length": 60, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "ste_team_people_id", + "local": "people_id", + "schema": "sagacity", + "table": "people", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "ste_team_ste_id", + "local": "ste_id", + "schema": "sagacity", + "table": "ste", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "ste_cat", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "ste_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "analysts", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "ste_cat_ste_id", + "local": "ste_id", + "schema": "sagacity", + "table": "ste", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "ste_cat_ste_id_idx", + "type": "index", + "ref": "ste_id" + } + ] + }, + { + "schema": "sagacity", + "name": "ste_cat_sources", + "primary_key": [ + "cat_id", + "src_id" + ], + "fields": [ + { + "name": "cat_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "src_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "ste_cat_cat_id", + "local": "cat_id", + "schema": "sagacity", + "table": "ste_cat", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "ste_cat_src_id", + "local": "src_id", + "schema": "sagacity", + "table": "sources", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "interview_questions", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "cat", + "dataType": "varchar(64)", + "type": 253, + "length": 64, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "key", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "question", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ] + }, + { + "schema": "sagacity", + "name": "category_interview", + "primary_key": [ + "cat_id", + "ques_id" + ], + "fields": [ + { + "name": "cat_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "ques_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "answer", + "dataType": "tinyint(1)", + "type": 1, + "length": 1, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "cat_int_cat_id", + "local": "cat_id", + "schema": "sagacity", + "table": "ste_cat", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "cat_int_ques_id", + "local": "ques_id", + "schema": "sagacity", + "table": "interview_questions", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "cat_int_ques_id_idx", + "type": "index", + "ref": "ques_id" + } + ] + }, + { + "schema": "sagacity", + "name": "scans", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "src_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "ste_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "pid", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "itr", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "file_name", + "dataType": "varchar(150)", + "type": 253, + "length": 150, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "file_date", + "dataType": "date", + "type": 14, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "start_time", + "dataType": "datetime", + "type": 12, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": "" + }, + { + "name": "last_update", + "dataType": "datetime", + "type": 12, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": "" + }, + { + "name": "status", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "IN QUEUE", + "RUNNING", + "COMPLETE", + "ERROR", + "TERMINATED" + ], + "ai": false, + "nn": true, + "default": "IN QUEUE" + }, + { + "name": "perc_comp", + "dataType": "decimal(5,2)", + "type": 0, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "last_host", + "dataType": "varchar(64)", + "type": 253, + "length": 64, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "hosts_comp", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "host_count", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "notes", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "location", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "scan_src_id", + "local": "src_id", + "schema": "sagacity", + "table": "sources", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "scan_ste_id", + "local": "ste_id", + "schema": "sagacity", + "table": "ste", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "scan_src_id_idx", + "type": "index", + "ref": "src_id" + }, + { + "id": "scan_ste_id_idx", + "type": "index", + "ref": "ste_id" + } + ] + }, + { + "schema": "sagacity", + "name": "target", + "primary_key": [ + "ste_id", + "name" + ], + "unique": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": false, + "default": "" + }, + { + "name": "cat_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "os_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "ste_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "auto_status_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "man_status_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "data_status_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "fp_cat1_status_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "name", + "dataType": "varchar(64)", + "type": 253, + "length": 64, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "location", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "source", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "cat_1", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "cat_2", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "cat_3", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "closed", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "not_applicable", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "not_reviewed", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": 0 + }, + { + "name": "compliance", + "dataType": "tinyint(3)", + "type": 1, + "length": 3, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "assessed", + "dataType": "tinyint(3)", + "type": 1, + "length": 3, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "notes", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "missing_patches", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "os_string", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "pp_flag", + "dataType": "tinyint(1)", + "type": 1, + "length": 1, + "values": [], + "ai": false, + "nn": false, + "default": "1" + }, + { + "name": "pp_off", + "dataType": "tinyint(1)", + "type": 1, + "length": 1, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "class", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "U", + "FOUO", + "S" + ], + "ai": false, + "nn": false, + "default": "U" + } + ], + "constraints": [ + { + "id": "t_cat_id", + "local": "cat_id", + "schema": "sagacity", + "table": "ste_cat", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "t_os_id", + "local": "os_id", + "schema": "sagacity", + "table": "software", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "t_ste_id", + "local": "ste_id", + "schema": "sagacity", + "table": "ste", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "t_auto_id", + "local": "auto_status_id", + "schema": "sagacity", + "table": "task_status", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "t_man_id", + "local": "man_status_id", + "schema": "sagacity", + "table": "task_status", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "t_data_id", + "local": "data_status_id", + "schema": "sagacity", + "table": "task_status", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "t_fp_cat1_id", + "local": "fp_cat1_status_id", + "schema": "sagacity", + "table": "task_status", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ], + "index": [ + { + "id": "t_id_idx", + "type": "index", + "ref": "id" + }, + { + "id": "t_name_idx", + "type": "index", + "ref": "name" + }, + { + "id": "t_cat_id_idx", + "type": "index", + "ref": "cat_id" + }, + { + "id": "t_os_id_idx", + "type": "index", + "ref": "os_id" + }, + { + "id": "t_ste_id_idx", + "type": "index", + "ref": "ste_id" + }, + { + "id": "t_auto_id_idx", + "type": "index", + "ref": "auto_status_id" + }, + { + "id": "t_man_id_idx", + "type": "index", + "ref": "man_status_id" + }, + { + "id": "t_data_status_id_idx", + "type": "index", + "ref": "data_status_id" + }, + { + "id": "t_fp_cat1_id_idx", + "type": "index", + "ref": "fp_cat1_status_id" + } + ], + "triggers": [ + "DROP TRIGGER IF EXISTS `sagacity`.`target_BEFORE_INSERT`", + "CREATE DEFINER=`web`@`{host}` TRIGGER `sagacity`.`target_BEFORE_INSERT` BEFORE INSERT ON `target` FOR EACH ROW", + "BEGIN", + "SELECT MAX(`id`) INTO @newid", + "FROM `sagacity`.`target`;", + "SET NEW.`id` = COALESCE(@newid + 1, 1);", + "END" + ] + }, + { + "schema": "sagacity", + "name": "target_net_meta", + "primary_key": [ + "tgt_id" + ], + "fields": [ + { + "name": "tgt_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "netstat_connections", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "shares", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "routes", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "firewall_config", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "tnm_tgt_id", + "local": "tgt_id", + "schema": "sagacity", + "table": "target", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "target_user_meta", + "primary_key": [ + "tgt_id" + ], + "fields": [ + { + "name": "tgt_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "login", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "user_list", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "last_login", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "disabled_accts", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "stag_pwds", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "never_logged_in", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "pwd_never_expires", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "tum_tgt_id", + "local": "tgt_id", + "schema": "sagacity", + "table": "target", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "target_sys_meta", + "primary_key": [ + "tgt_id" + ], + "fields": [ + { + "name": "tgt_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "mounted", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "process_list", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "autorun", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "services", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "last_boot", + "dataType": "datetime", + "type": 12, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": "" + }, + { + "name": "remote_registry", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "copyrighted", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "is_vm", + "dataType": "tinyint(1)", + "type": 1, + "length": 1, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "system", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "bios", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "wmi_listening_pid", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": "0" + } + ], + "constraints": [ + { + "id": "tsm_tgt_id", + "local": "tgt_id", + "schema": "sagacity", + "table": "target", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "interfaces", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "tgt_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "ipv4", + "dataType": "varchar(150)", + "type": 253, + "length": 150, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "ipv6", + "dataType": "varchar(400)", + "type": 253, + "length": 400, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "hostname", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "mac", + "dataType": "varchar(40)", + "type": 253, + "length": 40, + "values": [], + "ai": false, + "nn": false, + "default": "" + }, + { + "name": "fqdn", + "dataType": "varchar(100)", + "type": 253, + "length": 100, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "description", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "dns", + "dataType": "varchar(60)", + "type": 253, + "length": 60, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "int_tgt_id", + "local": "tgt_id", + "schema": "sagacity", + "table": "target", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "target_checklist", + "primary_key": [ + "tgt_id", + "chk_id" + ], + "fields": [ + { + "name": "tgt_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "chk_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "class", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "U", + "FOUO", + "S", + "TS", + "SCI" + ], + "ai": false, + "nn": false, + "default": "U" + } + ], + "constraints": [ + { + "id": "chk_tgt_chk_id", + "local": "chk_id", + "schema": "sagacity", + "table": "checklist", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "tgt_tgt_chk_id", + "local": "tgt_id", + "schema": "sagacity", + "table": "target", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "target_software", + "primary_key": [ + "tgt_id", + "sft_id" + ], + "fields": [ + { + "name": "tgt_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "sft_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "sw_string", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "sft_tgt_sft_id", + "local": "sft_id", + "schema": "sagacity", + "table": "software", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "tgt_tgt_sft_id", + "local": "tgt_id", + "schema": "sagacity", + "table": "target", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "host_list", + "primary_key": [ + "scan_id", + "tgt_id" + ], + "fields": [ + { + "name": "scan_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "tgt_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "finding_count", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "scanner_error", + "dataType": "tinyint(1)", + "type": 1, + "length": 1, + "values": [], + "ai": false, + "nn": false, + "default": "0" + }, + { + "name": "notes", + "dataType": "text", + "type": 252, + "length": "", + "values": [], + "ai": false, + "nn": false, + "default": "" + } + ], + "constraints": [ + { + "id": "host_scan_id", + "local": "scan_id", + "schema": "sagacity", + "table": "scans", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "host_tgt_id", + "local": "tgt_id", + "schema": "sagacity", + "table": "target", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "pps_list", + "primary_key": [ + "int_id", + "pps_id" + ], + "fields": [ + { + "name": "int_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "pps_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(255)", + "type": 253, + "length": 255, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "banner", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "notes", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "listening", + "dataType": "tinyint(1)", + "type": 1, + "length": 1, + "values": [], + "ai": false, + "nn": false, + "default": "0" + } + ], + "constraints": [ + { + "id": "pps_int_id", + "local": "int_id", + "schema": "sagacity", + "table": "interfaces", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "pps_pps_id", + "local": "pps_id", + "schema": "sagacity", + "table": "ports_proto_services", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "findings", + "primary_key": [ + "tgt_id", "pdi_id" + ], + "fields": [ + { + "name": "tgt_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "scan_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "findings_status_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "cat", + "dataType": "int(1)", + "type": 3, + "length": 1, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "change_id", + "dataType": "tinyint(2)", + "type": 1, + "length": 2, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "orig_src", + "dataType": "varchar(10)", + "type": 253, + "length": 10, + "values": [], + "ai": false, + "nn": false, + "default": null + }, + { + "name": "finding_itr", + "dataType": "int(5)", + "type": 3, + "length": 5, + "values": [], + "ai": false, + "nn": false, + "default": "1" + }, + { + "name": "notes", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ], + "constraints": [ + { + "id": "find_pdi_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "pdi_catalog", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "find_tgt_id", + "local": "tgt_id", + "schema": "sagacity", + "table": "target", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "find_scan_id", + "local": "scan_id", + "schema": "sagacity", + "table": "scans", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "find_status_id", + "local": "findings_status_id", + "schema": "sagacity", + "table": "findings_status", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "finding_controls", + "primary_key": [ + "tgt_id", + "pdi_id", + "ia_control" + ], + "fields": [ + { + "name": "tgt_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "ia_control", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ], + "constraints": [ + { + "id": "find_tgt_ctrl_id", + "local": "tgt_id", + "schema": "sagacity", + "table": "findings", + "field": "tgt_id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "find_pdi_ctrl_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "findings", + "field": "pdi_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "scan_notes", + "primary_key": [ + "tgt_id", + "pdi_id" + ], + "fields": [ + { + "name": "tgt_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "scan_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "note", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": "" + } + ], + "constraints": [ + { + "id": "scan_find_tgt_notes_id", + "local": "tgt_id", + "schema": "sagacity", + "table": "findings", + "field": "tgt_id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "scan_find_pdi_notes_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "findings", + "field": "pdi_id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "scan_find_scan_notes_id", + "local": "scan_id", + "schema": "sagacity", + "table": "scans", + "field": "id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "analyst_notes", + "primary_key": [ + "tgt_id", + "pdi_id" + ], + "fields": [ + { + "name": "tgt_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "pdi_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "note", + "dataType": "mediumtext", + "type": 250, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": "" + } + ], + "constraints": [ + { + "id": "analyst_find_tgt_notes_id", + "local": "tgt_id", + "schema": "sagacity", + "table": "findings", + "field": "tgt_id", + "update": "CASCADE", + "delete": "CASCADE" + }, + { + "id": "analyst_find_pdi_notes_id", + "local": "pdi_id", + "schema": "sagacity", + "table": "findings", + "field": "pdi_id", + "update": "CASCADE", + "delete": "CASCADE" + } + ] + }, + { + "schema": "sagacity", + "name": "search_filters", + "primary_key": [ + "id" + ], + "fields": [ + { + "name": "id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": true, + "nn": true, + "default": "" + }, + { + "name": "name", + "dataType": "varchar(45)", + "type": 253, + "length": 45, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "type", + "dataType": "enum", + "type": 247, + "length": null, + "values": [ + "target", + "scan", + "finding", + "reference" + ], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "criteria", + "dataType": "text", + "type": 252, + "length": null, + "values": [], + "ai": false, + "nn": false, + "default": null + } + ] + }, + { + "schema": "sagacity", + "name": "cve_sw_lookup", + "primary_key": [ + "cve_id", + "sw_id" + ], + "fields": [ + { + "name": "cve_id", + "dataType": "varchar(20)", + "type": 253, + "length": 20, + "values": [], + "ai": false, + "nn": true, + "default": "" + }, + { + "name": "sw_id", + "dataType": "int(11)", + "type": 3, + "length": 11, + "values": [], + "ai": false, + "nn": true, + "default": "" + } + ] + } + ] } \ No newline at end of file diff --git a/exec/Target Host Tools/Windows/Windows Data Collection/windows-data-collection.bat b/exec/Target Host Tools/Windows/Windows Data Collection/windows-data-collection.bat index 4efd8a1..4851494 100644 --- a/exec/Target Host Tools/Windows/Windows Data Collection/windows-data-collection.bat +++ b/exec/Target Host Tools/Windows/Windows Data Collection/windows-data-collection.bat @@ -112,10 +112,10 @@ echo -- wmic /output:hotfixes.txt qfe list | tee.cmd %SUMMARYFILE% wmic qfe list > %OUTDIR%\hotfixes.txt echo. -echo * 2.021, Software Certificate Installation Files | tee.cmd %OUTDIR%\hotfixes.txt +echo * 2.021, Software Certificate Installation Files | tee.cmd %OUTDIR%\certificates.txt echo -- dir /s /b *.p12 *.pfs (C:\) | tee.cmd %SUMMARYFILE% cd C:\ -dir /s /b *.p12 *.pfs > %OUTDIR%\hotfixes.txt +dir /s /b *.p12 *.pfs > %OUTDIR%\certificates.txt cd %originaldir% echo. @@ -233,8 +233,8 @@ fciv.exe -both "%OUTFILE%" >> %CHECKSUMS% echo * Installed Software | tee.cmd %SUMMARYFILE% set OUTFILE=%OUTDIR%\installed-software.csv -echo -- wmic product /format:csv get name,version | tee.cmd %SUMMARYFILE% -wmic product get /format:csv name,version > %OUTFILE% +echo -- wmic product get name,version /format:csv | tee.cmd %SUMMARYFILE% +wmic product get name,version /format:csv > %OUTFILE% echo * Query the registry for values | tee.cmd %SUMMARYFILE% for /F "eol=; tokens=1,2 delims=," %%i in (reg-values-to-check.txt) do ( diff --git a/exec/background_results.php b/exec/background_results.php index 292602c..92722dd 100644 --- a/exec/background_results.php +++ b/exec/background_results.php @@ -237,7 +237,7 @@ do { } while ($dbh->get_Running_Script_Count($conf['ste'])); -if (!$debug) { +if (!$debug && file_exists(DOC_ROOT . "/exec/parse_config.ini")) { unlink(DOC_ROOT . "/exec/parse_config.ini"); } diff --git a/exec/export-ckl.php b/exec/export-ckl.php index 7022b80..6c6e4f9 100644 --- a/exec/export-ckl.php +++ b/exec/export-ckl.php @@ -59,6 +59,16 @@ else { print "Destination: $dest" . PHP_EOL; +$status_map = [ + 'Not Reviewed' => 'Not_Reviewed', + 'Not a Finding' => 'NotAFinding', + 'Open' => 'Open', + 'Not Applicable' => 'Not_Applicable', + 'No Data' => 'Not_Reviewed', + 'Exception' => 'Open', + 'False Positive' => 'NotAFinding' +]; + $xml = new Array2XML(); $xml->standalone = true; $xml->formatOutput = true; @@ -110,12 +120,13 @@ if ($tgt_count = count($tgts)) { } $arr = [ + '@comment' => "CyberPerspectives Sagacity v" . VER, 'ASSET' => [ - 'ASSET_TYPE' => 'Computing', + 'ROLE' => 'None', + 'ASSET_TYPE' => 'Computing', 'HOST_NAME' => $tgt->get_Name(), 'HOST_IP' => $host_ip, 'HOST_MAC' => $host_mac, - 'HOST_GUID' => '', 'HOST_FQDN' => $host_fqdn, 'TECH_AREA' => '', 'TARGET_KEY' => '', @@ -182,10 +193,11 @@ if ($tgt_count = count($tgts)) { $total_stigs += $pdi_count = (is_array($pdis) ? count($pdis) : 0); $count = 0; + $findings = $db->get_Finding($tgt); + foreach ($pdis as $pdi) { - $find = $db->get_Finding($tgt, new stig($pdi['pdi_id'], $pdi['STIG_ID'], null)); - if (is_array($find) && count($find) && isset($find[0]) && is_a($find[0], 'finding')) { - $find = $find[0]; + if (isset($findings[$pdi['pdi_id']])) { + $find = $findings[$pdi['pdi_id']]; } $sev = 'low'; @@ -306,20 +318,11 @@ if ($tgt_count = count($tgts)) { ] ], $cci_list); - $status = "Not_Reviewed"; + $status = 'Not_Reviewed'; $notes = ''; if (is_a($find, 'finding')) { - $status = $find->get_Finding_Status_String(); - if ($status == 'Not a Finding' || $status == 'False Positive') { - $status = "NotAFinding"; - } - elseif($status == 'Exception') { - $status = 'Open'; - } - else { - $status = str_replace(" ", "_", $status); - } + $status = $status_map[$find->get_Finding_Status_String()]; $notes = $find->get_Notes(); } @@ -355,7 +358,8 @@ Total STIGs: $total_stigs EOO; /** - * + * Function to retrieve all the PDIs for a specified target and checklist + * * @global db $db * * @param target $tgt @@ -387,7 +391,8 @@ function get_checklist_data($tgt, $chk) { "JOIN sagacity.pdi_checklist_lookup pcl ON pcl.pdi_id = pdi.pdi_id", "JOIN sagacity.target_checklist tc ON tc.chk_id = pcl.checklist_id", "JOIN sagacity.stigs s ON s.pdi_id = pdi.pdi_id" - ] + ], + 'group' => 'STIG_ID' ]); $pdis = $db->help->execute(); diff --git a/exec/installer.php b/exec/installer.php index 5075dca..bbf905d 100644 --- a/exec/installer.php +++ b/exec/installer.php @@ -41,7 +41,7 @@ $db_step = [ 'cpe' => ['filter' => FILTER_VALIDATE_BOOLEAN], 'cve' => ['filter' => FILTER_VALIDATE_BOOLEAN], 'stig' => ['filter' => FILTER_VALIDATE_BOOLEAN], - 'update-freq' => ['filter' => FILTER_VALIDATE_INT, 'flag' => FILTER_NULL_ON_FAILURE] + 'update-freq' => ['filter' => FILTER_VALIDATE_FLOAT, 'flag' => FILTER_NULL_ON_FAILURE] ]; $company_step = [ 'company' => $params, @@ -181,7 +181,9 @@ function save_Database($params) * CREATE DB PASSWORD FILE * --------------------------------- */ $enc_pwd = my_encrypt($params['web-pwd']); - file_put_contents(DOC_ROOT . "/" . PWD_FILE, $enc_pwd); + if(!file_put_contents(DOC_ROOT . "/" . PWD_FILE, $enc_pwd)) { + die(json_encode(['error' => "Could not create the password file"])); + } if (isset($params['conf-root-pwd']) && $params['conf-root-pwd'] == $params['root-pwd']) { $db = new mysqli(DB_SERVER, $params['root-uname'], '', 'mysql'); @@ -194,7 +196,6 @@ function save_Database($params) unset($db); } - $successful = true; $zip = new ZipArchive(); $db = new mysqli(DB_SERVER, $params['root-uname'], $params['root-pwd'], 'mysql'); if ($db->connect_errno && $db->connect_errno == 1045) { @@ -361,7 +362,6 @@ EOO; if (preg_grep("/Access Denied/i", $output)) { $errors[] = $output; - $successful = false; } else { unlink($file); diff --git a/exec/parse_excel_echecklist.php b/exec/parse_excel_echecklist.php index 452335f..1c4731f 100644 --- a/exec/parse_excel_echecklist.php +++ b/exec/parse_excel_echecklist.php @@ -25,6 +25,8 @@ * - Aug 28, 2017 - Fixed couple minor bugs * - Jan 15, 2018 - Formatting, reorganized use statements, and cleaned up * - May 24, 2018 - Attempt to fix bug #413 + * - Nov 6, 2018 - performance improvements, ensure duplicate findings are not created, make eChecklist true status, update for removing findings.id + * - Nov 8, 2018 - added functionality to assign OS and checklists based on worksheet contents */ $cmd = getopt("f:", ['debug::', 'help::']); set_time_limit(0); @@ -111,6 +113,7 @@ else { $scan->set_ID($scan_id); } +/** @var software $gen_os */ $gen_os = $db->get_Software("cpe:/o:generic:generic:-", true); if (is_array($gen_os) && count($gen_os) && isset($gen_os[0]) && is_a($gen_os[0], 'software')) { $gen_os = $gen_os[0]; @@ -124,9 +127,12 @@ foreach ($objSS->getWorksheetIterator() as $wksht) { elseif (isset($conf['ignore']) && $wksht->getSheetState() == Worksheet::SHEETSTATE_HIDDEN) { $log->info("Skipping hidden worksheet {$wksht->getTitle()}"); continue; + } elseif ($wksht->getTitle() == 'Orphan') { + $log->info("Skipping Orphan worksheet because it creates problems right now"); + continue; } -$scan->isTerminated(); + $scan->isTerminated(); $log->notice("Reading from {$wksht->getTitle()}"); @@ -138,6 +144,11 @@ $scan->isTerminated(); $log->warning("Invalid headers in {$wksht->getTitle()}"); continue; } + + $chk_arr = explode(', ', $wksht->getCell("B9")->getValue()); + $checklists = $db->get_Checklist_By_Name($chk_arr); + $os_str = $wksht->getCell("G4")->getValue(); + $os = $db->get_Software_By_String($os_str); $idx = [ 'stig_id' => 1, @@ -155,6 +166,7 @@ $scan->isTerminated(); $short_title_col = Coordinate::stringFromColumnIndex($idx['short_title']); $row_count = $highestRow = $wksht->getHighestDataRow() - 10; $highestCol = $wksht->getHighestDataColumn(10); + $tgt_findings = []; for ($col = 'F' ; $col != $highestCol ; $col++) { $cell = $wksht->getCell($col . '10'); @@ -171,22 +183,59 @@ $scan->isTerminated(); if ($tgt_id = $db->check_Target($conf['ste'], $cell->getValue())) { $log->debug("Found host for {$cell->getValue()}"); + /** @var target $tgt */ $tgt = $db->get_Target_Details($conf['ste'], $tgt_id); if (is_array($tgt) && count($tgt) && isset($tgt[0]) && is_a($tgt[0], 'target')) { $tgt = $tgt[0]; + if($tgt->get_OS_ID() == $gen_os->get_ID() && is_a($os, 'software')) { + $log->debug("Assigning operating system to {$tgt->get_Name()}", [$os]); + $tgt->set_OS_ID($os->get_ID()); + $tgt->set_OS_String($os->get_Shortened_SW_String()); + } } else { $log->error("Could not find host {$cell->getValue()}"); } + + if(is_a($checklists, 'checklist')) { + if(!isset($tgt->checklists[$checklists->get_ID()])) { + $log->debug("Assigning checklists to {$tgt->get_Name()}", [$checklists]); + $tgt->checklists[$checklists->get_ID()] = $checklists; + } + } elseif(is_array($checklists) && count($checklists)) { + $log->debug("Assigning checklists to {$tgt->get_Name()}", $checklists); + foreach($checklists as $c) { + /** @var checklist $c */ + if(!isset($tgt->checklists[$c->get_ID()])) { + $tgt->checklists[$c->get_ID()] = $c; + } + } + } + + $db->save_Target($tgt); } else { $log->debug("Creating new target {$cell->getValue()}"); $tgt = new target($cell->getValue()); - $tgt->set_OS_ID($gen_os->get_ID()); + $tgt->set_OS_ID((is_a($os, 'software') ? $os->get_ID() : $gen_os->get_ID())); + $tgt->set_OS_String((is_a($os, 'software') ? $os->get_Shortened_SW_String() : $gen_os->get_Shortened_SW_String())); $tgt->set_STE_ID($conf['ste']); $tgt->set_Location($conf['location']); $tgt->set_Notes('New Target'); - + + if(is_a($checklists, 'checklist')) { + if(!isset($tgt->checklists[$checklists->get_ID()])) { + $tgt->checklists[$checklists->get_ID()] = $checklists; + } + } elseif(is_array($checklists) && count($checklists)) { + foreach($checklists as $c) { + /** @var checklist $c */ + if(!isset($tgt->checklists[$c->get_ID()])) { + $tgt->checklists[$c->get_ID()] = $c; + } + } + } + if (preg_match('/((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(\.|$)){4}/', $cell->getValue())) { $ip = $cell->getValue(); $int = new interfaces(null, null, null, $ip, null, null, null, null); @@ -199,31 +248,50 @@ $scan->isTerminated(); $tgts[] = $tgt; $log->debug("Adding new target to host list", ['row_count' => $row_count, 'tgt_id' => $tgt->get_ID(), 'tgt_name' => $tgt->get_Name()]); - $hl = new host_list(); - $hl->setFindingCount($row_count); - $hl->setTargetId($tgt->get_ID()); - $hl->setTargetName($tgt->get_Name()); - if ($ip) { - $hl->setTargetIp($ip); - } - elseif (is_array($tgt->interfaces) && count($tgt->interfaces)) { - foreach ($tgt->interfaces as $int) { - if (!in_array($int->get_IPv4(), ['0.0.0.0', '127.0.0.1'])) { - $ip = $int->get_IPv4(); - break; + if(!isset($scan->get_Host_List()[$tgt->get_ID()])) { + $hl = new host_list(); + $hl->setFindingCount($row_count); + $hl->setTargetId($tgt->get_ID()); + $hl->setTargetName($tgt->get_Name()); + if ($ip) { + $hl->setTargetIp($ip); + } elseif (is_array($tgt->interfaces) && count($tgt->interfaces)) { + foreach ($tgt->interfaces as $int) { + if (!in_array($int->get_IPv4(), ['0.0.0.0', '127.0.0.1'])) { + $ip = $int->get_IPv4(); + break; + } } + $hl->setTargetIp($ip); } - $hl->setTargetIp($ip); + + $scan->add_Target_to_Host_List($hl); + } else { + $hl = $scan->get_Host_List()[$tgt->get_ID()]; + + $hl->addFindingCount($row_count); + + $scan->add_Target_to_Host_List($hl); } - - $scan->add_Target_to_Host_List($hl); } - if (preg_match('/Overall/i', $cell->getValue())) { + $db->update_Scan_Host_List($scan); + $tgt_findings[$tgt->get_ID()] = $db->get_Finding($tgt); + + if (preg_match('/overall/i', $cell->getValue())) { $log->debug("Found overall: {$cell->getColumn()}"); break; } } + + if(count($tgts) > 100) { + $db->update_Running_Scan($base_name, ['name' => 'status', 'value' => 'ERROR']); + $db->update_Running_Scan($base_name, ['name' => 'notes', 'value' => "Too many targets in worksheet {$wksht->getTitle()}"]); + $log->error("Too many targets in worksheet {$wksht->getTitle()}"); + unset($objSS); + rename($cmd['f'], TMP . "/terminated/$base_name"); + die(); + } $db->update_Running_Scan($base_name, ['name' => 'host_count', 'value' => count($tgts)]); @@ -234,8 +302,7 @@ $scan->isTerminated(); $idx['consistent'] += $increase; $idx['notes'] += $increase; $idx['check_contents'] += $increase; - } - elseif (empty($tgts)) { + } elseif (empty($tgts)) { $log->warning("Failed to identify targets in worksheet {$wksht->getTitle()}"); continue; } @@ -276,8 +343,7 @@ $scan->isTerminated(); if (is_array($stig) && count($stig) && isset($stig[0]) && is_a($stig[0], 'stig')) { $stig = $stig[0]; - } - else { + } else { $pdi = new pdi(null, $cat_lvl, $dt->format("Y-m-d")); $pdi->set_Short_Title($short_title); $pdi->set_Group_Title($short_title); @@ -293,41 +359,36 @@ $scan->isTerminated(); foreach ($tgts as $tgt) { $status = $wksht->getCell(Coordinate::stringFromColumnIndex($idx['target'] + $x) . $row->getRowIndex()) ->getValue(); + if(!in_array(strtolower($status), ['not reviewed', 'not a finding', 'open', 'not applicable', 'no data', 'exception', 'false positive'])) { + if(stripos($notes, "Formula found in status column") === false) { + $notes .= "Formula found in status column"; + } + $status = "Not Reviewed"; + $scan->set_Host_Error($tgt->get_ID(), true, "Formula found in the status column"); + } - $log->debug("{$tgt->get_Name()} {$stig->get_ID()} ($status)"); - - $finding = $db->get_Finding($tgt, $stig); - - if (is_array($finding) && count($finding) && isset($finding[0]) && is_a($finding[0], 'finding')) { + $findings = $tgt_findings[$tgt->get_ID()]; + if (is_array($findings) && count($findings) && isset($findings[$stig->get_PDI_ID()]) && is_a($findings[$stig->get_PDI_ID()], 'finding')) { /** @var finding $tmp */ - $tmp = $finding[0]; - - if(preg_match("/Not a Finding|Not Applicable/i", $status)) { - $ds = $tmp->get_Deconflicted_Status($status); - $tmp->set_Finding_Status_By_String($ds); - } - else { - $tmp->set_Finding_Status_By_String($status); - } + $tmp = $findings[$stig->get_PDI_ID()]; + $tmp->set_Finding_Status_By_String($status); $tmp->set_Notes($notes); $tmp->set_Category($cat_lvl); + $tmp->set_Scan_ID($scan->get_ID()); $updated_findings[] = $tmp; - } - else { - $tmp = new finding(null, $tgt->get_ID(), $stig->get_PDI_ID(), $scan->get_ID(), $status, $notes, null, null, null); + } else { + $tmp = new finding($tgt->get_ID(), $stig->get_PDI_ID(), $scan->get_ID(), $status, $notes, null, null, null); $tmp->set_Category($cat_lvl); $new_findings[] = $tmp; } - + $log->debug("{$tgt->get_Name()} {$stig->get_ID()} ({$tmp->get_Finding_Status_String()})"); $x++; } - - $row_count++; - - if($row_count % 100 == 0) { + + if(count($updated_findings) + count($new_findings) >= 1000) { if(!$db->add_Findings_By_Target($updated_findings, $new_findings)) { die(print_r(debug_backtrace(), true)); } else { @@ -335,12 +396,14 @@ $scan->isTerminated(); $new_findings = []; } } - + $db->update_Running_Scan($base_name, ['name' => 'perc_comp', 'value' => (($row->getRowIndex() - 10) / $highestRow) * 100]); if (PHP_SAPI == 'cli') { print "\r" . sprintf("%.2f%%", (($row->getRowIndex() - 10) / $highestRow) * 100); } } + + $db->update_Scan_Host_List($scan); if (!$db->add_Findings_By_Target($updated_findings, $new_findings)) { print "Error adding finding" . PHP_EOL; @@ -348,7 +411,6 @@ $scan->isTerminated(); } unset($objSS); -$db->update_Scan_Host_List($scan, $host_list); if (!isset($cmd['debug'])) { rename($cmd['f'], TMP . "/echecklist/$base_name"); } diff --git a/exec/parse_host_data_collection.php b/exec/parse_host_data_collection.php index b71a7ae..ae3eb53 100644 --- a/exec/parse_host_data_collection.php +++ b/exec/parse_host_data_collection.php @@ -112,10 +112,8 @@ foreach ($files as $file) { $scan_id = 0; -foreach ($findings as $key => $find) { - if (false) { - $find = new finding(); - } +/** @var finding $find */ +foreach ($findings as $find) { $ret = array(); if ($find->get_Scan_ID()) { $scan_id = $find->get_Scan_ID(); diff --git a/exec/parse_mssql.php b/exec/parse_mssql.php index 83e8b3d..bdfac63 100644 --- a/exec/parse_mssql.php +++ b/exec/parse_mssql.php @@ -181,10 +181,8 @@ class mssql_parser extends scan_xml_parser { // check for finding $finding = $this->db->get_Finding($this->tgt, $this->stig); if (is_array($finding) && count($finding)) { + /** @var finding $finding */ $finding = $finding[0]; - if (false) { - $finding = new finding(); - } $finding->prepend_Notes("(MSSQL) " . $this->notes); if ($finding->get_Finding_Status_String() != "Not Reviewed" && $finding->get_Finding_Status_String() != $this->status) { @@ -199,7 +197,7 @@ class mssql_parser extends scan_xml_parser { $this->updated_findings[$finding->get_PDI_ID()] = $finding; } else { - $finding = new finding(null, $this->tgt->get_ID(), $this->stig->get_PDI_ID(), $this->scan->get - ID(), $this->status, $this->notes, finding::NC, "MSSQL", 1); + $finding = new finding($this->tgt->get_ID(), $this->stig->get_PDI_ID(), $this->scan->get - ID(), $this->status, $this->notes, finding::NC, "MSSQL", 1); $this->new_findings[$this->stig->get_PDI_ID()] = $finding; } diff --git a/exec/parse_nessus.php b/exec/parse_nessus.php index 545ed4f..cf3fd0e 100644 --- a/exec/parse_nessus.php +++ b/exec/parse_nessus.php @@ -1142,7 +1142,7 @@ class nessus_parser extends scan_xml_parser } } else { - $tmp = new finding(null, $this->tgt->get_ID(), $this->plugin->result->stig->get_PDI_ID(), $this->scan->get_ID(), $this->plugin->result->status, "[{$this->tgt->get_Name()}]: {$note}", finding::NC, "Nessus", 1); + $tmp = new finding($this->tgt->get_ID(), $this->plugin->result->stig->get_PDI_ID(), $this->scan->get_ID(), $this->plugin->result->status, "[{$this->tgt->get_Name()}]: {$note}", finding::NC, "Nessus", 1); if (!is_null($pdi)) { $tmp->set_Category($pdi->get_Category_Level()); } @@ -1178,7 +1178,7 @@ class nessus_parser extends scan_xml_parser $stig = new stig($pdi_id, $this->plugin->result->stig, $this->plugin->desc); $this->db->add_Stig($stig); - $tmp = new finding(null, $this->tgt->get_ID(), $pdi->get_ID(), $this->scan->get_ID(), $this->plugin->result->status, "[" . $this->tgt->get_Name() . "]: " . $note, finding::NC, "Nessus", 1); + $tmp = new finding($this->tgt->get_ID(), $pdi->get_ID(), $this->scan->get_ID(), $this->plugin->result->status, "[" . $this->tgt->get_Name() . "]: " . $note, finding::NC, "Nessus", 1); $tmp->set_Category($this->plugin->result->cat); if (isset($this->new_findings[$tmp->get_PDI_ID()])) { @@ -1211,14 +1211,12 @@ class nessus_parser extends scan_xml_parser $finding = $this->db->get_Finding($this->tgt, $this->plugin->db_plugin); if (is_array($finding) && count($finding)) { - $finding = $finding[0]; + $finding = current($finding[0]); } if (is_a($finding, 'finding')) { + /** @var finding $finding */ $this->log->script_log("Updating finding"); - if (false) { - $finding = new finding(); - } if ($this->debug) { $this->log->script_log("Finding exists: " . print_r($finding, true), E_DEBUG); } @@ -1265,7 +1263,7 @@ class nessus_parser extends scan_xml_parser } else { $this->log->script_log("Adding new finding"); - $tmp = new finding(null, $this->tgt->get_ID(), $this->plugin->db_plugin->get_PDI_ID(), $this->scan->get_ID(), $this->plugin->result->status, $note, finding::NC, "Nessus", 1); + $tmp = new finding($this->tgt->get_ID(), $this->plugin->db_plugin->get_PDI_ID(), $this->scan->get_ID(), $this->plugin->result->status, $note, finding::NC, "Nessus", 1); $tmp->set_Category($this->plugin->result->cat); $this->new_findings[$tmp->get_PDI_ID()] = $tmp; diff --git a/exec/parse_nvd_json_cve.php b/exec/parse_nvd_json_cve.php index 4d8d06f..9eba7dd 100644 --- a/exec/parse_nvd_json_cve.php +++ b/exec/parse_nvd_json_cve.php @@ -49,7 +49,7 @@ $log = new Logger("nvd_cve"); $log->pushHandler(new StreamHandler(LOG_PATH . "/nvd_cve.log", $log_level)); $db = new db(); -$json = json_decode(file_get_contents($cmd['f'])); +$json = json_decode(file_get_contents($cmd['f']), true); $existing_cves = []; $db->help->select("cve_db", ['cve_id']); @@ -60,19 +60,21 @@ if (is_array($cves) && count($cves)) { } } -print "Currently " . count($existing_cves) . " in DB" . PHP_EOL . "Parsing: " . count($json->CVE_Items) . " items" . PHP_EOL; +print "Currently " . count($existing_cves) . " in DB" . PHP_EOL . "Parsing: " . count($json['CVE_Items']) . " items" . PHP_EOL; $db_cpes = []; +$db_cpes23 = []; $new_cves = []; $new_cve_refs = []; $sw_rows = []; $new = 0; $existing = 0; -$db->help->select("software", ['id', 'cpe']); +$db->help->select("software", ['id', 'cpe', 'cpe23']); $rows = $db->help->execute(); foreach ($rows as $row) { $db_cpes["{$row['cpe']}"] = $row['id']; + $db_cpes23["{$row['cpe23']}"] = $row['id']; } $cve_fields = [ @@ -82,24 +84,22 @@ $ref_fields = [ 'cve_seq', 'source', 'url', 'val' ]; -foreach ($json->CVE_Items as $cve) { - if (!isset($existing_cves["{$cve->cve->CVE_data_meta->ID}"])) { - $log->debug("Adding {$cve->cve->CVE_data_meta->ID}"); +foreach ($json['CVE_Items'] as $cve) { + if (!isset($existing_cves["{$cve['cve']['CVE_data_meta']['ID']}"])) { + $log->debug("Adding {$cve['cve']['CVE_data_meta']['ID']}"); $new++; $desc = []; $status = null; $phase = null; $cpes = []; - $name = $cve->cve->CVE_data_meta->ID; - $type = $cve->cve->data_type; - $seq = $cve->cve->CVE_data_meta->ID; - $pd = new DateTime($cve->publishedDate); - $lmd = new DateTime($cve->lastModifiedDate); + $name = $cve['cve']['CVE_data_meta']['ID']; + $seq = $cve['cve']['CVE_data_meta']['ID']; + $pd = new DateTime($cve['publishedDate']); - if (is_array($cve->cve->description->description_data) && count($cve->cve->description->description_data)) { - foreach ($cve->cve->description->description_data as $d) { - $desc[] = $d->value; + if (is_array($cve['cve']['description']['description_data']) && count($cve['cve']['description']['description_data'])) { + foreach ($cve['cve']['description']['description_data'] as $d) { + $desc[] = $d['value']; } } @@ -107,24 +107,21 @@ foreach ($json->CVE_Items as $cve) { $name, $seq, $status, $phase, $pd, implode(PHP_EOL, $desc) ]; - if (is_array($cve->cve->references->reference_data) && count($cve->cve->references->reference_data)) { - foreach ($cve->cve->references->reference_data as $ref) { - $log->debug("Adding reference {$ref->url}"); + if (is_array($cve['cve']['references']['reference_data']) && count($cve['cve']['references']['reference_data'])) { + foreach ($cve['cve']['references']['reference_data'] as $ref) { + $log->debug("Adding reference {$ref['url']}"); $new_cve_refs[] = [ - $name, null, $ref->url, null + $name, null, $ref['url'], null ]; } } - if (is_array($cve->configurations->nodes) && count($cve->configurations->nodes)) { - foreach ($cve->configurations->nodes as $n) { - if (isset($n->cpe) && is_array($n->cpe) && count($n->cpe)) { - foreach ($n->cpe as $cpe) { - if (isset($cpe->cpe22Uri)) { - $cpes[] = $cpe->cpe22Uri; - } - elseif (isset($cpe->cpeMatchString)) { - $cpes[] = $cpe->cpeMatchString; + if(is_array($cve['configurations']['nodes']) && count($cve['configurations']['nodes'])) { + foreach($cve['configurations']['nodes'] as $n) { + if(isset($n['cpe_match']) && is_array($n['cpe_match']) && count($n['cpe_match'])) { + foreach($n['cpe_match'] as $c) { + if($c['vulnerable'] && $c['cpe23Uri']) { + $cpes[] = $c['cpe23Uri']; } } } @@ -135,6 +132,8 @@ foreach ($json->CVE_Items as $cve) { foreach ($cpes as $cpe) { if (isset($db_cpes["{$cpe}"])) { $sw_rows[] = [$name, $db_cpes["{$cpe}"]]; + } elseif (isset($db_cpes23["{$cpe}"])) { + $sw_rows[] = [$name, $db_cpes23["{$cpe}"]]; } } } @@ -185,7 +184,7 @@ if (count($sw_rows)) { $db->help->execute(); } -unlink($cmd['f']); +//unlink($cmd['f']); print PHP_EOL; diff --git a/exec/parse_scc_xccdf.php b/exec/parse_scc_xccdf.php index 004ed73..09b44c5 100644 --- a/exec/parse_scc_xccdf.php +++ b/exec/parse_scc_xccdf.php @@ -24,643 +24,697 @@ * - May 13, 2017 - Fixed error when trying to delete a USGCB scan file (not supported) * - Oct 23, 2017 - Fixed error of finding statuses being overwritten */ -$cmd = getopt("f:", ['debug::', 'help::']); +$cmd = getopt("f:", [ + 'debug::', + 'help::' +]); -if (!isset($cmd['f']) || isset($cmd['help'])) { - die(usage()); +if (! isset($cmd['f']) || isset($cmd['help'])) { + die(usage()); } $conf = parse_ini_file("parse_config.ini"); -if (!$conf) { - die("Could not find parse_config.ini configuration file"); +if (! $conf) { + die("Could not find parse_config.ini configuration file"); } chdir($conf['doc_root']); set_time_limit(0); +require_once 'vendor/autoload.php'; include_once 'config.inc'; include_once 'xml_parser.inc'; include_once 'database.inc'; include_once 'helper.inc'; +use Monolog\Logger; +use Monolog\Handler\StreamHandler; + chdir(TMP); $db = new db(); +$log_level = convert_log_level(); + $base_name = basename($cmd['f']); -$host_list = array(); -$err = new Sagacity_Error($cmd['f']); +$log = new Logger("scc-import"); +$log->pushHandler(new StreamHandler(logify($cmd['f']), $log_level)); -if (!file_exists($cmd['f'])) { - $db->update_Running_Scan($base_name, ['name' => 'status', 'value' => 'ERROR']); - $err->script_log("File not found", E_ERROR); -} -elseif (preg_match('/.*Results\_iavm\_(2009|2010)|Results\_USGCB/i', $cmd['f'])) { - $scan = $db->get_ScanData($conf['ste'], $cmd['f']); - if (is_array($scan) && count($scan) && isset($scan[0]) && is_a($scan[0], 'scan')) { - $db->delete_Scan($scan[0]->get_ID(), false); - } - $err->script_log("Cannot parse these types of files", E_ERROR); +if (! file_exists($cmd['f'])) { + $db->update_Running_Scan($base_name, [ + 'name' => 'status', + 'value' => 'ERROR' + ]); + $log->error("File not found"); + die(); +} elseif (preg_match('/.*Results\_iavm\_(2009|2010)|Results\_USGCB/i', $cmd['f'])) { + $scan = $db->get_ScanData($conf['ste'], $cmd['f']); + if (is_array($scan) && count($scan) && isset($scan[0]) && is_a($scan[0], 'scan')) { + $db->delete_Scan($scan[0]->get_ID(), false); + } + $log->error("Cannot parse these types of files"); + die(); } -class scc_parser extends scan_xml_parser { +class scc_parser extends scan_xml_parser +{ - var $values; - var $value_id; - var $getvalue = false; - var $groups; - var $group_id; - var $vms_id; - var $vms = null; - var $sv_rule; - var $tgt; - var $tag; - var $int_count = 0; - var $found_rule = false; + var $values; - /** - * Constructor - * - * @param int $ste_id_in - * @param string $fname_in - */ - public function __construct($ste_id_in, $fname_in) { - $this->values = array(); - $this->groups = array(); - $this->tag = array(); - parent::__construct($this, $ste_id_in, $fname_in); - $this->db->update_Running_Scan($this->scan->get_File_Name(), ['name' => 'pid', 'value' => getmypid()]); - } + var $value_id; - /** - * Function to parse \cdf:Benchmark\cdf:Value tag - * - * @param array $attrs - */ - public function cdf_Benchmark_cdf_Value($attrs) { - $this->values[$attrs['id']] = null; - $this->value_id = $attrs['id']; - } + var $getvalue = false; - /** - * Function to parse \cdf:Benchmark\cdf:Value\cdf:value tag - * - * @param array $attrs - */ - public function cdf_Benchmark_cdf_Value_cdf_value($attrs) { - if (!isset($attrs['selector'])) { - $this->getvalue = true; + var $groups; + + var $group_id; + + var $vms_id; + + var $vms = null; + + var $sv_rule; + + var $tgt; + + var $tag; + + var $int_count = 0; + + var $found_rule = false; + + /** + * Constructor + * + * @global Monolog\Logger $log + * + * @param int $ste_id_in + * @param string $fname_in + */ + public function __construct($ste_id_in, $fname_in) + { + $this->values = []; + $this->groups = []; + $this->tag = []; + parent::__construct($this, $ste_id_in, $fname_in); } - else { - $this->getvalue = false; - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:value\cdf:value character data - * - * @param string $data - */ - public function cdf_Benchmark_cdf_Value_cdf_value_data($data) { - if ($this->getvalue) { - $this->values[$this->value_id] = $data; - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:Group tag - * - * @param array $attrs - */ - public function cdf_Benchmark_cdf_Group($attrs) { - $this->vms = $this->db->get_GoldDisk($attrs['id']); - - if (is_array($this->vms) && count($this->vms) && isset($this->vms[0]) && is_a($this->vms[0], 'golddisk')) { - $this->group_id = $this->vms[0]->get_PDI_ID(); - } - else { - $this->group_id = $attrs['id']; - $this->vms = null; + + /** + * Function to parse \cdf:Benchmark + * + * @param array $attrs + */ + public function cdf_Benchmark($attrs) + { + $this->scan->set_Start_Time(new DateTime("now", new DateTimeZone("UTC"))); } - $this->vms_id = $attrs['id']; - $this->groups[$this->group_id] = array(); - $this->found_rule = false; - } - - /** - * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule tag - * - * @param array $attrs - */ - public function cdf_Benchmark_cdf_Group_cdf_Rule($attrs) { - $sv_rule = $this->db->get_SV_Rule(null, $attrs['id']); - - if (is_array($sv_rule) && count($sv_rule) && isset($sv_rule[0]) && is_a($sv_rule[0], 'sv_rule')) { - $this->found_rule = true; - $this->sv_rule = $sv_rule[0]; - - unset($this->groups[$this->group_id]); - $this->group_id = $this->sv_rule->get_PDI_ID(); - - $this->groups[$this->group_id] = [ - 'sv_rule' => $this->sv_rule, - 'stig' => null, - 'version' => null, - 'title' => null, - 'vms_id' => $this->vms_id, - 'oval_id' => null, - 'val_id' => null, - 'value' => null, - 'cce' => null, - 'fix' => null, - 'desc' => null, - 'status' => "Not Reviewed", - 'cat' => 2 - ]; - } - else { - return; + /** + * Function to parse \cdf:Benchmark\cdf:Value tag + * + * @param array $attrs + */ + public function cdf_Benchmark_cdf_Value($attrs) + { + $this->values[$attrs['id']] = null; + $this->value_id = $attrs['id']; } - $stig = $this->db->get_STIG_By_PDI($this->sv_rule->get_PDI_ID()); - - if (is_a($stig, 'stig')) { - $this->groups[$this->group_id]['stig'] = $stig; - $this->groups[$this->group_id]['version'] = $stig->get_ID(); - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:version character data (STIG id) - * - * @param string $data - */ - public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_version_data($data) { - $stig = $this->db->get_Stig($data); - if (is_array($stig) && count($stig) && isset($stig[0]) && is_a($stig[0], 'stig')) { - $this->found_rule = true; - $stig = $stig[0]; - - unset($this->groups[$this->group_id]); - $this->group_id = $stig->get_PDI_ID(); - - $this->groups[$this->group_id] = [ - 'sv_rule' => (is_a($this->sv_rule, 'sv_rule') ? $this->sv_rule : null), - 'stig' => $stig, - 'version' => $stig->get_ID(), - 'title' => null, - 'vms_id' => $this->vms_id, - 'oval_id' => null, - 'val_id' => null, - 'value' => null, - 'cce' => null, - 'fix' => null, - 'desc' => null, - 'status' => "Not Reviewed", - 'cat' => 2 - ]; - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:title character data (short title) - * - * @param string $data - */ - public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_title_data($data) { - if (empty($this->groups[$this->group_id]['title'])) { - $this->groups[$this->group_id]['title'] = $data; - } - else { - //error_log(print_r($this->group_id, true)); - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:description character data (description) - * - * @param string $data - */ - public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_description_data($data) { - if (!isset($this->groups[$this->group_id])) { - $this->groups[$this->group_id] = array(); + /** + * Function to parse \cdf:Benchmark\cdf:Value\cdf:value tag + * + * @param array $attrs + */ + public function cdf_Benchmark_cdf_Value_cdf_value($attrs) + { + $this->getvalue = false; + if (! isset($attrs['selector'])) { + $this->getvalue = true; + } } - if (isset($this->groups[$this->group_id]['desc'])) { - $this->groups[$this->group_id]['desc'] .= $data; - } - else { - $this->groups[$this->group_id]['desc'] = $data; - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:ident character data (CCI,CCE,etc) - * - * @param string $data - */ - public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_ident_data($data) { - if (empty($this->groups[$this->group_id]['cce']) && preg_match("/CCE/", $data)) { - $this->groups[$this->group_id]['cce'] = $data; - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:fixtext character data - * - * @param string $data - */ - public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_fixtext_data($data) { - if (empty($this->groups[$this->group_id]['fix'])) { - $this->groups[$this->group_id]['fix'] = htmlentities($data); - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:check\cdf:check-export tag - * - * @param array $attrs - */ - public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_check_cdf_check_export($attrs) { - if (empty($this->groups[$this->group_id]['val_id'])) { - $this->groups[$this->group_id]['val_id'] = $attrs['value-id']; - $this->groups[$this->group_id]['value'] = $this->values[$attrs['value-id']]; - - $this->groups[$this->group_id]['oval_id'] = $attrs['export-name']; - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:Group end tag and store content parsed from previous functions - */ - public function cdf_Benchmark_cdf_Group_end() { - if (!$this->found_rule) { - $this->log->script_log("Rule tag was not present for " . $this->group_id); - unset($this->groups[$this->group_id]); - return; + /** + * Function to parse \cdf:Benchmark\cdf:value\cdf:value character data + * + * @param string $data + */ + public function cdf_Benchmark_cdf_Value_cdf_value_data($data) + { + if ($this->getvalue) { + $this->values[$this->value_id] = $data; + } } - if (empty($this->groups[$this->group_id]['stig'])) { - $ia_controls = array(); - $this->log->script_log("STIG ID " . $this->groups[$this->group_id]['version'] . " is not in the database, adding", E_WARNING); - $pdi = new pdi(null, '', 'NOW'); - $pdi->set_Short_Title($this->groups[$this->group_id]['title']); - $pdi->set_Group_Title($this->groups[$this->group_id]['title']); - $pdi->set_Description($this->groups[$this->group_id]['desc']); - $pdi_id = $this->db->save_PDI($pdi); - $stig = new stig($pdi_id, $this->groups[$this->group_id]['version'], $this->groups[$this->group_id]['title']); - $this->db->add_Stig($stig); - $this->groups[$this->group_id]['stig'] = $stig; + /** + * Function to parse \cdf:Benchmark\cdf:Group tag + * + * @param array $attrs + */ + public function cdf_Benchmark_cdf_Group($attrs) + { + $this->found_rule = false; + $match = []; + $this->vms_id = null; + $this->vms = null; - if (!empty($this->groups[$this->group_id]['desc'])) { - $match = array(); - if (preg_match("/\(.*)\<\/IAControls\>/", $this->groups[$this->group_id]['desc'], $match)) { - $ias = explode(", ", $match[1]); - if (is_array($ias) && count($ias)) { - foreach ($ias as $ia) { - $ia_controls[] = new ia_control($pdi_id, substr($ia, 0, 4), substr($ia, -1)); + if(preg_match("/(V\-[\d]+)/", $attrs['id'], $match)) { + $this->vms_id = $match[1]; + $this->group_id = $this->vms_id; + } + else { + return; + } + $this->vms = $this->db->get_GoldDisk($this->vms_id); + + if (is_array($this->vms) && count($this->vms) && isset($this->vms[0]) && is_a($this->vms[0], 'golddisk')) { + $this->vms = $this->vms[0]; + $this->group_id = $this->vms->get_PDI_ID(); + } + + $this->groups[$this->group_id] = []; + } + + /** + * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule tag + * + * @param array $attrs + */ + public function cdf_Benchmark_cdf_Group_cdf_Rule($attrs) + { + $sv_rule = $this->db->get_SV_Rule(null, $attrs['id']); + + if (is_array($sv_rule) && count($sv_rule) && isset($sv_rule[0]) && is_a($sv_rule[0], 'sv_rule')) { + $this->found_rule = true; + $this->sv_rule = $sv_rule[0]; + + unset($this->groups[$this->group_id]); + $this->group_id = $this->sv_rule->get_PDI_ID(); + + $this->groups[$this->group_id] = [ + 'sv_rule' => $this->sv_rule, + 'stig' => null, + 'version' => null, + 'title' => null, + 'vms_id' => $this->vms_id, + 'oval_id' => null, + 'val_id' => null, + 'value' => null, + 'cce' => null, + 'fix' => null, + 'desc' => null, + 'status' => "Not Reviewed", + 'cat' => 2 + ]; + } else { + return; + } + + $stig = $this->db->get_STIG_By_PDI($this->sv_rule->get_PDI_ID()); + + if (is_a($stig, 'stig')) { + $this->groups[$this->group_id]['stig'] = $stig; + $this->groups[$this->group_id]['version'] = $stig->get_ID(); + } + } + + /** + * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:version character data (STIG id) + * + * @param string $data + */ + public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_version_data($data) + { + $stig = $this->db->get_Stig($data); + if (is_array($stig) && count($stig) && isset($stig[0]) && is_a($stig[0], 'stig')) { + $this->found_rule = true; + $stig = $stig[0]; + + unset($this->groups[$this->group_id]); + $this->group_id = $stig->get_PDI_ID(); + + $this->groups[$this->group_id] = [ + 'sv_rule' => (is_a($this->sv_rule, 'sv_rule') ? $this->sv_rule : null), + 'stig' => $stig, + 'version' => $stig->get_ID(), + 'title' => null, + 'vms_id' => $this->vms_id, + 'oval_id' => null, + 'val_id' => null, + 'value' => null, + 'cce' => null, + 'fix' => null, + 'desc' => null, + 'status' => "Not Reviewed", + 'cat' => 2 + ]; + } + } + + /** + * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:title character data (short title) + * + * @param string $data + */ + public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_title_data($data) + { + if (empty($this->groups[$this->group_id]['title'])) { + $this->groups[$this->group_id]['title'] = $data; + } else { + // error_log(print_r($this->group_id, true)); + } + } + + /** + * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:description character data (description) + * + * @param string $data + */ + public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_description_data($data) + { + if (! isset($this->groups[$this->group_id])) { + $this->groups[$this->group_id] = []; + } + + if (isset($this->groups[$this->group_id]['desc'])) { + $this->groups[$this->group_id]['desc'] .= $data; + } else { + $this->groups[$this->group_id]['desc'] = $data; + } + } + + /** + * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:ident character data (CCI,CCE,etc) + * + * @param string $data + */ + public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_ident_data($data) + { + if (empty($this->groups[$this->group_id]['cce']) && preg_match("/CCE/", $data)) { + $this->groups[$this->group_id]['cce'] = $data; + } + } + + /** + * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:fixtext character data + * + * @param string $data + */ + public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_fixtext_data($data) + { + if (empty($this->groups[$this->group_id]['fix'])) { + $this->groups[$this->group_id]['fix'] = htmlentities($data); + } + } + + /** + * Function to parse \cdf:Benchmark\cdf:Group\cdf:Rule\cdf:check\cdf:check-export tag + * + * @param array $attrs + */ + public function cdf_Benchmark_cdf_Group_cdf_Rule_cdf_check_cdf_check_export($attrs) + { + if (empty($this->groups[$this->group_id]['val_id'])) { + $this->groups[$this->group_id]['val_id'] = $attrs['value-id']; + $this->groups[$this->group_id]['value'] = $this->values[$attrs['value-id']]; + + $this->groups[$this->group_id]['oval_id'] = $attrs['export-name']; + } + } + + /** + * Function to parse \cdf:Benchmark\cdf:Group end tag and store content parsed from previous functions + */ + public function cdf_Benchmark_cdf_Group_end() + { + if (! $this->found_rule) { + $this->log->script_log("Rule tag was not present for " . $this->group_id); + unset($this->groups[$this->group_id]); + return; + } + + if (empty($this->groups[$this->group_id]['stig'])) { + $ia_controls = []; + $this->log->script_log("STIG ID " . $this->groups[$this->group_id]['version'] . " is not in the database, adding", E_WARNING); + $pdi = new pdi(null, '', 'NOW'); + $pdi->set_Short_Title($this->groups[$this->group_id]['title']); + $pdi->set_Group_Title($this->groups[$this->group_id]['title']); + $pdi->set_Description($this->groups[$this->group_id]['desc']); + $pdi_id = $this->db->save_PDI($pdi); + $stig = new stig($pdi_id, $this->groups[$this->group_id]['version'], $this->groups[$this->group_id]['title']); + $this->db->add_Stig($stig); + $this->groups[$this->group_id]['stig'] = $stig; + + if (! empty($this->groups[$this->group_id]['desc'])) { + $match = array(); + if (preg_match("/\(.*)\<\/IAControls\>/", $this->groups[$this->group_id]['desc'], $match)) { + $ias = explode(", ", $match[1]); + if (is_array($ias) && count($ias)) { + foreach ($ias as $ia) { + $ia_controls[] = new ia_control($pdi_id, substr($ia, 0, 4), substr($ia, - 1)); + } + } else { + $ia_controls[] = new ia_control($pdi_id, "ECSC", 1); + } + } + } else { + $ia_controls[] = new ia_control($pdi_id, 'ECSC', 1); } - } - else { - $ia_controls[] = new ia_control($pdi_id, "ECSC", 1); - } - } - } - else { - $ia_controls[] = new ia_control($pdi_id, 'ECSC', 1); - } - $this->db->save_IA_Control($ia_controls); - } - - if (empty($this->vms)) { - $this->vms = new golddisk($this->groups[$this->group_id]['stig']->get_PDI_ID(), $this->vms_id, $this->groups[$this->group_id]['title']); - $this->db->save_GoldDisk($this->vms); - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:target-facts\cdf:fact tag - * - * @param array $attrs - */ - public function cdf_Benchmark_cdf_TestResult_cdf_target_facts_cdf_fact($attrs) { - $tmp = explode(":", $attrs['name']); - $this->tag_id = end($tmp); - if (isset($this->tag[$this->tag_id])) { - if ($this->tag_id == 'interface_name') { - $this->int_count++; - } - $this->tag_id .= $this->int_count; - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:target-facts\cdf:fact character data - * - * @param string $data - */ - public function cdf_Benchmark_cdf_TestResult_cdf_target_facts_cdf_fact_data($data) { - $this->tag[$this->tag_id] = str_replace("\n", "", $data); - } - - /** - * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:target-facts end tag and store results - */ - public function cdf_Benchmark_cdf_TestResult_cdf_target_facts_end() { - //error_log(print_r($this->tag, true)); - $host_name = $this->tag['host_name']; - if (preg_match("/\./", $host_name)) { - $host_name = preg_replace("/^([^\.]+)\./i", "$1", $host_name); - } - - if (!($tgt_id = $this->db->check_Target($this->ste_id, $host_name))) { - $this->log->script_log("Creating new target with hostname $host_name", E_DEBUG); - $os = array(); - if (isset($this->tag['os_name']) && isset($this->tag['os_version']) && is_numeric($this->tag['os_version'])) { - $this->tag['os_name'] .= " {$this->tag['os_version']}"; - } - - if (isset($this->tag['os_name'])) { - $os_regex = $this->db->get_Regex_Array("os"); - $os = software::identify_Software($os_regex, $this->tag['os_name']); - $os = $this->db->get_Software($os); - } - - $this->log->script_log("Identified OS " . print_r($os, true), E_DEBUG); - - if (is_array($os) && count($os) && isset($os[0]) && is_a($os[0], 'software')) { - $os = $os[0]; - } - else { - $os = $this->db->get_Software("cpe:/o:generic:generic:-")[0]; - } - - if (!is_a($os, 'software')) { - $this->log->script_log("Failed to identify the OS", E_ERROR); - } - - $tgt = new target($host_name); - $tgt->set_STE_ID($this->ste_id); - $tgt->set_Notes("New target found by SCC"); - - if (is_a($os, "software")) { - $this->log->script_log("Assigning OS {$os->get_CPE()}", E_DEBUG); - - $tgt->set_OS_ID($os->get_ID()); - $tgt->set_OS_String($os->get_Shortened_SW_String()); - } - - $tgt_id = $this->db->save_Target($tgt); - } - - $this->tgt = $this->db->get_Target_Details($this->ste_id, $tgt_id)[0]; - - $int_keys = preg_grep("/interface_name/", array_keys($this->tag)); - $match = array(); - foreach ($int_keys as $key) { - $idx = ''; - if (preg_match("/interface_name(\d+)/", $key, $match)) { - $idx = $match[1]; - } - - if (isset($this->tag["ipv4$idx"])) { - $ip = explode(",", $this->tag["ipv4$idx"]); - - $ipv4 = null; - $ipv6 = null; - - if (is_array($ip) && count($ip) == 1) { - if (preg_match("/\d+\./", $ip[0])) { - $ipv4 = $ip[0]; - } - elseif (preg_match("/[a-f0-9]+/", $ip[0])) { - $ipv6 = $ip[0]; - } - } - elseif (is_array($ip) && count($ip) == 2) { - $ipv4 = $ip[0]; - $ipv6 = $ip[1]; + $this->db->save_IA_Control($ia_controls); } - if ($ipv4) { - $int = new interfaces(null, $tgt_id, $this->tag["interface_name$idx"], $ipv4, null, (isset($this->tag['host_name']) ? $this->tag['host_name'] : ""), (isset($this->tag['fqdn']) ? $this->tag['fqdn'] : ""), null); - if (isset($this->tag["mac$idx"])) { - $int->set_MAC($this->tag["mac$idx"]); - } - $this->db->save_Interface($int); + if (empty($this->vms)) { + $this->vms = new golddisk($this->groups[$this->group_id]['stig']->get_PDI_ID(), $this->vms_id, $this->groups[$this->group_id]['title']); + $this->db->save_GoldDisk($this->vms); + } + } + + /** + * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:target-facts\cdf:fact tag + * + * @param array $attrs + */ + public function cdf_Benchmark_cdf_TestResult_cdf_target_facts_cdf_fact($attrs) + { + $tmp = explode(":", $attrs['name']); + $this->tag_id = end($tmp); + if (isset($this->tag[$this->tag_id])) { + if ($this->tag_id == 'interface_name') { + $this->int_count ++; + } + $this->tag_id .= $this->int_count; + } + } + + /** + * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:target-facts\cdf:fact character data + * + * @param string $data + */ + public function cdf_Benchmark_cdf_TestResult_cdf_target_facts_cdf_fact_data($data) + { + $this->tag[$this->tag_id] = str_replace("\n", "", $data); + } + + /** + * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:target-facts end tag and store results + */ + public function cdf_Benchmark_cdf_TestResult_cdf_target_facts_end() + { + // error_log(print_r($this->tag, true)); + $host_name = $this->tag['host_name']; + if (preg_match("/\./", $host_name)) { + $host_name = preg_replace("/^([^.]+).*/i", "$1", $host_name); } - if ($ipv6) { - $int = new interfaces(null, $tgt_id, $this->tag["interface_name$idx"], null, $ipv6, (isset($this->tag['host_name']) ? $this->tag['host_name'] : ""), (isset($this->tag['fqdn']) ? $this->tag['fqdn'] : ""), null); - if (isset($this->tag["mac$idx"])) { - $int->set_MAC($this->tag["mac$idx"]); - } - $this->db->save_Interface($int); - } - } - } - } + if (! ($tgt_id = $this->db->check_Target($this->ste_id, $host_name))) { + $this->log->script_log("Creating new target with hostname $host_name", E_DEBUG); + $os = array(); + if (isset($this->tag['os_name']) && isset($this->tag['os_version']) && is_numeric($this->tag['os_version'])) { + $this->tag['os_name'] .= " {$this->tag['os_version']}"; + } - /** - * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:platform tag (stores CPE) - * - * @param array $attrs - */ - public function cdf_Benchmark_cdf_TestResult_cdf_platform($attrs) { - if (isset($attrs['idref']) && substr($attrs['idref'], 0, 3) == 'cpe') { - $cpe = $attrs['idref']; + if (isset($this->tag['os_name'])) { + $os_regex = $this->db->get_Regex_Array("os"); + $os = software::identify_Software($os_regex, $this->tag['os_name']); + $os = $this->db->get_Software($os); + } - $sw = $this->db->get_Software($cpe); + $this->log->script_log("Identified OS " . print_r($os, true), E_DEBUG); - if (is_array($sw) && count($sw) && is_a($this->tgt, 'target')) { - $sw = $sw[0]; - if ($sw->is_OS() && $this->tgt->get_OS_ID() != $sw->get_ID()) { - $this->log->script_log("Update OS " . $sw->get_CPE()); - $this->tgt->set_OS_ID($sw->get_ID()); - $this->tgt->set_OS_String($sw->get_Shortened_SW_String()); - } - elseif (!$sw->is_OS() && !in_array($sw, $this->tgt->software)) { - $this->log->script_log("Assigning software " . $sw->get_CPE()); - $this->tgt->software[] = $sw; - } - } + if (is_array($os) && count($os) && isset($os[0]) && is_a($os[0], 'software')) { + $os = $os[0]; + } else { + $os = $this->db->get_Software("cpe:/o:generic:generic:-")[0]; + } - $this->db->save_Target($this->tgt); - } - } + if (! is_a($os, 'software')) { + $this->log->script_log("Failed to identify the OS", E_ERROR); + } - /** - * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:rule-result tag - * - * @param array $attrs - */ - public function cdf_Benchmark_cdf_TestResult_cdf_rule_result($attrs) { - $stig = $this->db->get_Stig($attrs['version']); - $sv_rule = $this->db->get_SV_Rule(null, $attrs['idref']); + $tgt = new target($host_name); + $tgt->set_STE_ID($this->ste_id); + $tgt->set_Notes("New target found by SCC"); - $this->log->script_log("Version: {$attrs['version']}", E_DEBUG); - $this->log->script_log("STIG data: " . print_r($stig, true), E_DEBUG); + if (is_a($os, "software")) { + $this->log->script_log("Assigning OS {$os->get_CPE()}", E_DEBUG); - if (is_array($stig) && count($stig) && isset($stig[0]) && is_a($stig[0], 'stig')) { - $stig = $stig[0]; - $this->group_id = $stig->get_PDI_ID(); - } - elseif (is_array($sv_rule) && count($sv_rule) && isset($sv_rule[0]) && is_a($sv_rule[0], 'sv_rule') && !$this->group_id) { - $sv_rule = $sv_rule[0]; - $this->group_id = $sv_rule->get_PDI_ID(); - } - else { - $this->log->script_log("Cannot find PDI ID (" . $attrs['version'] . "/" . $attrs['idref'] . ") CREATING", E_WARNING); + $tgt->set_OS_ID($os->get_ID()); + $tgt->set_OS_String($os->get_Shortened_SW_String()); + } - $this->group_id = null; - - return; - /* - $level = 1; - if ($attrs['severity'] == 'medium') { - $level = 2; - } - elseif ($attrs['severity'] == 'low') { - $level = 3; - } - $pdi = new pdi(null, $level, new DateTime); - $pdi_id = $this->db->save_PDI($pdi); - - $this->group_id = $pdi_id; - - if (!empty($attrs['version'])) { - $stig = new stig($pdi_id, $attrs['version'], null, null); - $this->db->add_Stig($stig); + $tgt_id = $this->db->save_Target($tgt); } - if (!empty($attrs['idref'])) { - $sv_rule = new sv_rule($pdi_id, $attrs['idref']); - $this->db->save_SV_Rule($sv_rule); + $this->tgt = $this->db->get_Target_Details($this->ste_id, $tgt_id)[0]; + + $int_keys = preg_grep("/interface_name/", array_keys($this->tag)); + $match = []; + foreach ($int_keys as $key) { + $idx = ''; + if (preg_match("/interface_name(\d+)/", $key, $match)) { + $idx = $match[1]; + } + + if (isset($this->tag["ipv4$idx"])) { + $ip = explode(",", $this->tag["ipv4$idx"]); + + $ipv4 = null; + $ipv6 = null; + + if (is_array($ip) && count($ip) == 1) { + if (preg_match("/\d+\./", $ip[0])) { + $ipv4 = $ip[0]; + } elseif (preg_match("/[a-f0-9]+/", $ip[0])) { + $ipv6 = $ip[0]; + } + } elseif (is_array($ip) && count($ip) == 2) { + $ipv4 = $ip[0]; + $ipv6 = $ip[1]; + } + + if ($ipv4) { + $int = new interfaces(null, $tgt_id, $this->tag["interface_name$idx"], $ipv4, null, (isset($this->tag['host_name']) ? $this->tag['host_name'] : ""), (isset($this->tag['fqdn']) ? $this->tag['fqdn'] : ""), null); + if (isset($this->tag["mac$idx"])) { + $int->set_MAC($this->tag["mac$idx"]); + } + $this->db->save_Interface($int); + } + + if ($ipv6) { + $int = new interfaces(null, $tgt_id, $this->tag["interface_name$idx"], null, $ipv6, (isset($this->tag['host_name']) ? $this->tag['host_name'] : ""), (isset($this->tag['fqdn']) ? $this->tag['fqdn'] : ""), null); + if (isset($this->tag["mac$idx"])) { + $int->set_MAC($this->tag["mac$idx"]); + } + $this->db->save_Interface($int); + } + } + } + } + + /** + * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:platform tag (stores CPE) + * + * @param array $attrs + */ + public function cdf_Benchmark_cdf_TestResult_cdf_platform($attrs) + { + if (isset($attrs['idref']) && substr($attrs['idref'], 0, 3) == 'cpe') { + $cpe = $attrs['idref']; + + $sw = $this->db->get_Software($cpe); + + if (is_array($sw) && count($sw) && is_a($this->tgt, 'target')) { + $sw = $sw[0]; + if ($sw->is_OS() && $this->tgt->get_OS_ID() != $sw->get_ID()) { + $this->log->script_log("Update OS " . $sw->get_CPE()); + $this->tgt->set_OS_ID($sw->get_ID()); + $this->tgt->set_OS_String($sw->get_Shortened_SW_String()); + } elseif (! $sw->is_OS() && ! in_array($sw, $this->tgt->software)) { + $this->log->script_log("Assigning software " . $sw->get_CPE()); + $this->tgt->software[] = $sw; + } + } + + $this->db->save_Target($this->tgt); + } + } + + /** + * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:rule-result tag + * + * @param array $attrs + */ + public function cdf_Benchmark_cdf_TestResult_cdf_rule_result($attrs) + { + $stig = $this->db->get_Stig($attrs['version']); + $sv_rule = $this->db->get_SV_Rule(null, $attrs['idref']); + + $this->log->script_log("Version: {$attrs['version']}", E_DEBUG); + $this->log->script_log("STIG data: " . print_r($stig, true), E_DEBUG); + + if (is_array($stig) && count($stig) && isset($stig[0]) && is_a($stig[0], 'stig')) { + $stig = $stig[0]; + $this->group_id = $stig->get_PDI_ID(); + } elseif (is_array($sv_rule) && count($sv_rule) && isset($sv_rule[0]) && is_a($sv_rule[0], 'sv_rule') && ! $this->group_id) { + $sv_rule = $sv_rule[0]; + $this->group_id = $sv_rule->get_PDI_ID(); + } else { + $this->log->script_log("Cannot find PDI ID (" . $attrs['version'] . "/" . $attrs['idref'] . ") CREATING", E_WARNING); + + $this->group_id = null; + + return; + /* + * $level = 1; + * if ($attrs['severity'] == 'medium') { + * $level = 2; + * } + * elseif ($attrs['severity'] == 'low') { + * $level = 3; + * } + * $pdi = new pdi(null, $level, new DateTime); + * $pdi_id = $this->db->save_PDI($pdi); + * + * $this->group_id = $pdi_id; + * + * if (!empty($attrs['version'])) { + * $stig = new stig($pdi_id, $attrs['version'], null, null); + * $this->db->add_Stig($stig); + * } + * + * if (!empty($attrs['idref'])) { + * $sv_rule = new sv_rule($pdi_id, $attrs['idref']); + * $this->db->save_SV_Rule($sv_rule); + * } + * + * return; + */ } - return; - */ - } - - if (empty($this->groups[$this->group_id]['sv_rule']) && is_a($sv_rule, "sv_rule")) { - $this->groups[$this->group_id]['sv_rule'] = $sv_rule; - } - - if (empty($this->groups[$this->group_id]['stig']) && is_a($stig, "stig")) { - $this->groups[$this->group_id]['stig'] = $stig; - } - - if (isset($attrs['severity'])) { - switch ($attrs['severity']) { - case 'low': - $this->groups[$this->group_id]['cat'] = 3; - break; - case 'high': - $this->groups[$this->group_id]['cat'] = 1; - break; - } - } - } - - /** - * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:rule-result\cdf:result character data - * - * @param string $data - */ - public function cdf_Benchmark_cdf_TestResult_cdf_rule_result_cdf_result_data($data) { - if (preg_match("/pass|true/i", $data)) { - $this->groups[$this->group_id]['status'] = "Not a Finding"; - } - elseif (preg_match("/fail|false/i", $data)) { - $this->groups[$this->group_id]['status'] = "Open"; - } - - $this->log->script_log("{$this->group_id} {$this->groups[$this->group_id]['status']}", E_DEBUG); - } - - /** - * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:rule-result\cdf:ident character data - * - * @param string $data - */ - public function cdf_Benchmark_cdf_TestResult_cdf_rule_result_cdf_ident_data($data) { - - } - - /** - * Function to parse \cdf:Benchmark\cdf:TestResult end tag and store all results - */ - public function cdf_Benchmark_cdf_TestResult_end() { - $new_findings = []; - $update_findings = []; - foreach ($this->groups as $pdi_id => $group) { - if (!empty($group['val_id'])) { - $note = "(SCC) " . $group['val_id'] . "\nRequired: " . $group['value'] . "\nActual: " . $this->values[$group['val_id']]; - } - else { - $note = "(SCC) "; - } - - if (isset($group['stig']) && is_a($group['stig'], 'stig')) { - $ref = $group['stig']; - } - elseif (!empty($group['vms_id'])) { - $vms = $this->db->get_GoldDisk($group['vms_id']); - if (is_array($vms) && count($vms) && isset($vms[0]) && is_a($vms[0], 'golddisk')) { - $ref = $vms[0]; + if (empty($this->groups[$this->group_id]['sv_rule']) && is_a($sv_rule, "sv_rule")) { + $this->groups[$this->group_id]['sv_rule'] = $sv_rule; } - } - elseif (isset($group['sv_rule']) && is_a($group['sv_rule'], 'sv_rule')) { - $ref = $group['sv_rule']; - } - else { - $this->log->script_log("Error finding reference to search for PDI $pdi_id\n" . print_r($group, true), E_WARNING); - continue; - } - $existing_finding = $this->db->get_Finding($this->tgt, $ref); - if (is_array($existing_finding) && count($existing_finding) && isset($existing_finding[0])) { - $finding = $existing_finding[0]; + if (empty($this->groups[$this->group_id]['stig']) && is_a($stig, "stig")) { + $this->groups[$this->group_id]['stig'] = $stig; + } - $finding->set_Finding_Status_By_String( - $finding->get_Deconflicted_Status($group['status']) - ); - $finding->prepend_Notes($note); - - $update_findings[$finding->get_PDI_ID()] = $finding; - } - else { - $new_findings[$pdi_id] = new finding(null, $this->tgt->get_ID(), $pdi_id, $this->scan->get_ID(), $group['status'], $note, finding::NC, null, 1); - } + if (isset($attrs['severity'])) { + switch ($attrs['severity']) { + case 'low': + $this->groups[$this->group_id]['cat'] = 3; + break; + case 'high': + $this->groups[$this->group_id]['cat'] = 1; + break; + } + } } - $this->db->add_Findings_By_Target($update_findings, $new_findings); + /** + * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:rule-result\cdf:result character data + * + * @param string $data + */ + public function cdf_Benchmark_cdf_TestResult_cdf_rule_result_cdf_result_data($data) + { + if (preg_match("/pass|true/i", $data)) { + $this->groups[$this->group_id]['status'] = "Not a Finding"; + } elseif (preg_match("/fail|false/i", $data)) { + $this->groups[$this->group_id]['status'] = "Open"; + } - $hl = new host_list(); - $hl->setTargetId($this->tgt->get_ID()); - $hl->setTargetName($this->tgt->get_Name()); - $hl->setFindingCount(count($new_findings) + count($update_findings)); - $hl->setScanError(false); + $this->log->script_log("{$this->group_id} {$this->groups[$this->group_id]['status']}", E_DEBUG); + } - $this->scan->add_Target_to_Host_List($hl); - } + /** + * Function to parse \cdf:Benchmark\cdf:TestResult\cdf:rule-result\cdf:ident character data + * + * @param string $data + */ + public function cdf_Benchmark_cdf_TestResult_cdf_rule_result_cdf_ident_data($data) + {} + /** + * Function to parse \cdf:Benchmark\cdf:TestResult end tag and store all results + */ + public function cdf_Benchmark_cdf_TestResult_end() + { + $new_findings = []; + $update_findings = []; + $existing_findings = $this->db->get_Finding($this->tgt); + foreach ($this->groups as $pdi_id => $group) { + if (! empty($group['val_id'])) { + $note = "(SCC) " . $group['val_id'] . "\nRequired: " . $group['value'] . "\nActual: " . $this->values[$group['val_id']]; + } else { + $note = "(SCC) "; + } + + /* + if (isset($group['stig']) && is_a($group['stig'], 'stig')) { + $ref = $group['stig']; + } elseif (! empty($group['vms_id'])) { + $vms = $this->db->get_GoldDisk($group['vms_id']); + if (is_array($vms) && count($vms) && isset($vms[0]) && is_a($vms[0], 'golddisk')) { + $ref = $vms[0]; + } + } elseif (isset($group['sv_rule']) && is_a($group['sv_rule'], 'sv_rule')) { + $ref = $group['sv_rule']; + } else { + $this->log->script_log("Error finding reference to search for PDI $pdi_id\n" . print_r($group, true), E_WARNING); + continue; + } + */ + + if (is_array($existing_findings) && count($existing_findings) && isset($existing_findings[$pdi_id])) { + /** @var finding $finding */ + $finding = $existing_findings[$pdi_id]; + + $finding->set_Finding_Status_By_String($finding->get_Deconflicted_Status($group['status'])); + if(preg_match("/" . preg_quote($note, "/") . "/", $finding->get_Notes())) { + $finding->set_Notes($note); + } else { + $finding->prepend_Notes($note); + } + + $update_findings[$pdi_id] = $finding; + } else { + $new_findings[$pdi_id] = new finding($this->tgt->get_ID(), $pdi_id, $this->scan->get_ID(), $group['status'], $note, finding::NC, null, 1); + } + } + + $this->db->add_Findings_By_Target($update_findings, $new_findings); + + $hl = new host_list(); + $hl->setTargetId($this->tgt->get_ID()); + $hl->setTargetName($this->tgt->get_Name()); + $hl->setFindingCount(count($new_findings) + count($update_findings)); + + $this->db->update_Target_Counts($this->tgt->get_ID()); + + $this->scan->add_Target_to_Host_List($hl); + $this->db->update_Scan_Host_List($this->scan); + } } $xml = new scc_parser($conf['ste'], $cmd['f']); $xml->debug = (isset($cmd['debug']) ? true : false); $xml->parse(); -if (!$xml->debug) { - rename($cmd['f'], TMP . "/scc/" . $base_name); +if (! $xml->debug) { + rename($cmd['f'], TMP . "/scc/" . $base_name); } -$db->update_Running_Scan($base_name, ["name" => "perc_comp", "value" => 100, "complete" => 1]); +$db->update_Running_Scan($base_name, [ + "name" => "perc_comp", + "value" => 100, + "complete" => 1 +]); -function usage() { - print <<update_Target_Counts($tgt->get_ID()); + unset($xml); if (!isset($cmd['debug'])) { rename($cmd['f'], TMP . "/stig_viewer/$base_name"); diff --git a/exec/update_db.php b/exec/update_db.php index e722171..0d7f329 100644 --- a/exec/update_db.php +++ b/exec/update_db.php @@ -461,6 +461,7 @@ if (isset($cmd['nasl'])) { 'nasl-count' => 0 ]); $count = 0; + check_path(TMP . "/nessus_plugins"); // Capture start time for performance monitoring $diff->resetClock(); @@ -602,7 +603,9 @@ if (isset($cmd['stig'])) { 'stig-count' => 0 ]); $path = TMP . "/stigs"; - check_path($path); + check_path(TMP . "/stigs"); + check_path(TMP . "/stigs/zip"); + $sunset_array = []; $diff->resetClock(); print "Started STIG ingestion ({$diff->getStartClockTime()})" . PHP_EOL; @@ -624,6 +627,132 @@ if (isset($cmd['stig'])) { $prev_mon = '07'; } + $current_url = "https://iasecontent.disa.mil/stigs/zip/Compilations/U_SRG-STIG_Library_{$year}_{$mon}.zip"; + $current_v2_url = "https://iasecontent.disa.mil/stigs/zip/Compilations/U_SRG-STIG_Library_{$year}_{$mon}_v2.zip"; + $sunset_url = "https://iase.disa.mil/stigs/Lists/Sunset%20Master%20List/FinalView.aspx"; + $stig_fname = "{$path}/stig_library-{$year}_{$mon}.zip"; + + if (!file_exists($stig_fname) && ping("disa.mil") && !isset($cmd['po'])) { + if (isset($cmd['u'])) { + $url = $cmd['u']; + $log->debug("Checking for $url"); + + if (url_exists($url)) { + download_file($url, $stig_fname, $db->help, 'stig-dl-progress'); + } + } + else { + $log->debug("Checking for $current_url"); + + if ($found = url_exists($current_url)) { + download_file($current_url, $stig_fname, $db->help, 'stig-dl-progress'); + } + if (!$found) { + $log->debug("Checking for $current_v2_url"); + + if ($found = url_exists($current_v2_url)) { + download_file($current_v2_url, $stig_fname, $db->help, 'stig-dl-progress'); + } + } + if ($mon == '01') { + $year--; + } + + $prev_url = "https://iasecontent.disa.mil/stigs/zip/Compilations/U_SRG-STIG_Library_{$year}_{$prev_mon}.zip"; + $prev_v2_url = "https://iasecontent.disa.mil/stigs/zip/Compilations/U_SRG-STIG_Library_{$year}_{$prev_mon}_v2.zip"; + + if (!$found) { + $log->debug("Checking for $prev_url"); + if ($found = url_exists($prev_url)) { + download_file($prev_url, $stig_fname, $db->help, 'stig-dl-progress'); + } + } + if (!$found) { + $log->debug("Checking for $prev_v2_url"); + if (url_exists($prev_v2_url)) { + download_file($prev_v2_url, $stig_fname, $db->help, 'stig-dl-progress'); + } + } + } + } + + if(ping("disa.mil") && !isset($cmd['po'])) { + $log->debug("Checking for $sunset_url"); + + if(url_exists($sunset_url)) { + $log->debug("Downloading sunset STIGs"); + $contents = file_get_contents($sunset_url); + preg_match_all("/a href=\"([^ ]+STIG\.zip)/", $contents, $sunset_array); + + if(is_array($sunset_array) && isset($sunset_array[1]) && count($sunset_array[1])) { + foreach($sunset_array[1] as $url) { + $sunset_fname = basename($url); + download_file($url, TMP . "/stigs/zip/{$sunset_fname}"); + } + } + } + } + + if (!isset($cmd['do']) || isset($cmd['po'])) { + $stig_files = array_merge( + glob("{$path}/*.zip"), glob("{$path}/*.xml"), glob(TMP . "/*.zip"), glob(TMP . "/*.xml"), glob(TMP . "/stigs/xml/*.xml") + ); + if (!count($stig_files)) { + die("Could not locate any XCCDF STIG libraries " . realpath(TMP)); + } + + $script = realpath(defined('PHP_BIN') ? PHP_BIN : PHP) . + " -c " . realpath(PHP_CONF) . + " -f " . realpath(DOC_ROOT . "/exec/background_stigs.php") . " --" . + (isset($cmd['exclude']) && $cmd['exclude'] ? " --exclude=\"{$cmd['exclude']}\"" : "") . + " --delete"; + + $log->debug("Script to run $script"); + passthru($script); + } + + $db->help->select_count("sagacity.stigs"); + $stig_count = $db->help->execute(); + + $db->set_Setting("stig-count", $stig_count); + + $diff->stopClock(); + + print PHP_EOL . "Finished at {$diff->getEndClockTime()}" . PHP_EOL . + "Total Time: {$diff->getDiffString()}" . PHP_EOL; + + sleep(3); +} + +if (is_a($diff->getTotalDiff(), 'DateInterval')) { + print "Total Script Time: {$diff->getTotalDiffString()}" . PHP_EOL; +} + +/** + * Function to download the latest STIG compilation library zip file for extraction and updating + */ +function getStigLibrary() +{ + global $current_date, $cmd, $log, $db; + $path = TMP; + + $mon = '01'; + $prev_mon = '10'; + $year = (int) $current_date->format("Y"); + + if (between($current_date->format("n"), 4, 6)) { + $mon = '04'; + $prev_mon = '01'; + } + elseif (between($current_date->format("n"), 7, 9)) { + $mon = '07'; + $prev_mon = '04'; + } + elseif (between($current_date->format("n"), 10, 12)) { + $mon = '10'; + $prev_mon = '07'; + } + $current_url = "http://iasecontent.disa.mil/stigs/zip/Compilations/U_SRG-STIG_Library_{$year}_{$mon}.zip"; $current_v2_url = "http://iasecontent.disa.mil/stigs/zip/Compilations/U_SRG-STIG_Library_{$year}_{$mon}_v2.zip"; @@ -671,109 +800,6 @@ if (isset($cmd['stig'])) { } } } - - if (!isset($cmd['do']) || isset($cmd['po'])) { - $stig_files = array_merge( - glob("{$path}/*.zip"), glob("{$path}/*.xml"), glob(TMP . "/*.zip"), glob(TMP . "/*.xml"), glob(TMP . "/stigs/xml/*.xml") - ); - if (!file_exists($stig_fname) && !count($stig_files)) { - die("Could not locate $stig_fname or find any other zip files in " . realpath(TMP)); - } - - $script = realpath(defined('PHP_BIN') ? PHP_BIN : PHP) . - " -c " . realpath(PHP_CONF) . - " -f " . realpath(DOC_ROOT . "/exec/background_stigs.php") . " --" . - (isset($cmd['exclude']) && $cmd['exclude'] ? " --exclude=\"{$cmd['exclude']}\"" : "") . - " --delete"; - - $log->debug("Script to run $script"); - passthru($script); - } - - $db->help->select_count("sagacity.stigs"); - $stig_count = $db->help->execute(); - - $db->set_Setting("stig-count", $stig_count); - - $diff->stopClock(); - - print PHP_EOL . "Finished at {$diff->getEndClockTime()}" . PHP_EOL . - "Total Time: {$diff->getDiffString()}" . PHP_EOL; - - sleep(3); -} - -/** - * Update Sunset STIG library from DISA content - */ -if (isset($cmd['sunset'])) { - $db->set_Setting_Array([ - 'stig-dl-progress' => 0, - 'stig-progress' => 0, - 'stig-count' => 0 - ]); - $path = TMP . "/stigs/zip"; - check_path($path); - $sunset_array = []; - - $diff->resetClock(); - print "Started Sunset STIG ingestion ({$diff->getStartClockTime()})" . PHP_EOL; - - $sunset_url="https://iase.disa.mil/stigs/Lists/Sunset%20Master%20List/FinalView.aspx"; - - if (ping("disa.mil") && !isset($cmd['po'])) { - $log->debug("Checking for $sunset_url"); - if ($found = url_exists($sunset_url)) { - $contents=file_get_contents($sunset_url); - } - - if (!$found) { - $log->debug("Unable to download $sunset_url, aborting Sunset"); - die("Unable to open $sunset_url, aborting Sunset"); - } - - preg_match_all("/a href=\"([^ ]+zip\/U_[^ ]+STIG\.zip)/", $contents, $sunset_array); - - foreach($sunset_array[1] as $url) { - $sunset_fname = basename($url); - download_file($url, "{$path}/$sunset_fname"); - } - } - - if (!isset($cmd['do']) || isset($cmd['po'])) { - $stig_files = array_merge( - glob("{$path}/*.zip"), glob("{$path}/*.xml"), - glob(TMP . "/*.zip"), glob(TMP . "/*.xml"), glob(TMP . "/stigs/xml/*.xml") - ); - if (!count($stig_files)) { - die("Could not find any other zip files in " . realpath(TMP)); - } - - $script = realpath(defined('PHP_BIN') ? PHP_BIN : PHP) . - " -c " . realpath(PHP_CONF) . - " -f " . realpath(DOC_ROOT . "/exec/background_stigs.php") . " --" . - (isset($cmd['exclude']) && $cmd['exclude'] ? " --exclude=\"{$cmd['exclude']}\"" : "") . - " --delete"; - - $log->debug("Script to run $script"); - passthru($script); - } - - $db->help->select_count("sagacity.stigs"); - $stig_count = $db->help->execute(); - - $db->set_Setting("stig-count", $stig_count); - - $diff->stopClock(); - - print PHP_EOL . "Finished at {$diff->getEndClockTime()}" . PHP_EOL . - "Total Time: {$diff->getDiffString()}" . PHP_EOL; - - sleep(3); -} - -if (is_a($diff->getTotalDiff(), 'DateInterval')) { - print "Total Script Time: {$diff->getTotalDiffString()}" . PHP_EOL; } /** @@ -793,7 +819,6 @@ Usage: php update_db.php [--cpe] [--cve] [--nvd] [--nasl] [--stig] [-u={URL}] [- --nasl To download OpenVAS NVT library and update NASL files You can also extract *.nasl files from the Nessus library to $tmp/nessus_plugins and it will include these in the update --stig To download and update the STIG library - --sunset To download and update the STIG library with the STIGs DISA has archived --do To download the files only...do not call the parsers will overwrite any existing files --po To parse the downloaded files only, do not download diff --git a/img/scan_types/echecklist-failed.png b/img/scan_types/echecklist-failed.png new file mode 100644 index 0000000..c9aca0b Binary files /dev/null and b/img/scan_types/echecklist-failed.png differ diff --git a/import.php b/import.php index d6d6ed0..849c8a2 100644 --- a/import.php +++ b/import.php @@ -15,6 +15,8 @@ * - Apr 29, 2018 - Changed default message and formatting */ +$files = glob(TMP . "/*.*"); + ?>
@@ -112,6 +114,12 @@
+ NOTE: There are still files in the " . realpath(TMP) . " directory (mouse over to see)
"; + } + ?>

diff --git a/inc/array2xml.inc b/inc/array2xml.inc index 8a96a9e..b7797de 100644 --- a/inc/array2xml.inc +++ b/inc/array2xml.inc @@ -103,6 +103,10 @@ class Array2XML { //return from recursion, as a note with cdata cannot have child nodes. return $node; } + elseif(isset($arr['@comment']) && is_string($arr['@comment'])) { + $node->appendChild($xml->createComment(self::bool2str($arr['@comment']))); + unset($arr['@comment']); + } } //create subnodes using recursion diff --git a/inc/composer.json b/inc/composer.json index d474567..12393d7 100644 --- a/inc/composer.json +++ b/inc/composer.json @@ -4,7 +4,8 @@ "cocur/background-process" : "~0.7", "tecnickcom/tcpdf" : "~6.2", "pacificsec/cpe" : "1.0.1", - "monolog/monolog" : "~1.23" + "monolog/monolog" : "~1.23", + "openlss/lib-array2xml" : "~0.5" }, "require-dev" : { "phpunit/phpunit" : "~7.3" diff --git a/inc/composer.lock b/inc/composer.lock index 9bad4ec..63558d3 100644 --- a/inc/composer.lock +++ b/inc/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8bf5f4a76098ff9277648c58793a04b5", + "content-hash": "0cb5c8b41ce699cfddd3ad1295045652", "packages": [ { "name": "cocur/background-process", @@ -46,16 +46,16 @@ }, { "name": "markbaker/complex", - "version": "1.4.6", + "version": "1.4.7", "source": { "type": "git", "url": "https://github.com/MarkBaker/PHPComplex.git", - "reference": "a78d82ae4e682c3809fc3023d1b0ce654f6ab12b" + "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/a78d82ae4e682c3809fc3023d1b0ce654f6ab12b", - "reference": "a78d82ae4e682c3809fc3023d1b0ce654f6ab12b", + "url": "https://api.github.com/repos/MarkBaker/PHPComplex/zipball/1ea674a8308baf547cbcbd30c5fcd6d301b7c000", + "reference": "1ea674a8308baf547cbcbd30c5fcd6d301b7c000", "shasum": "" }, "require": { @@ -137,7 +137,7 @@ "complex", "mathematics" ], - "time": "2018-07-31T08:38:40+00:00" + "time": "2018-10-13T23:28:42+00:00" }, { "name": "monolog/monolog", @@ -217,6 +217,55 @@ ], "time": "2017-06-19T01:22:40+00:00" }, + { + "name": "openlss/lib-array2xml", + "version": "0.5.1", + "source": { + "type": "git", + "url": "https://github.com/nullivex/lib-array2xml.git", + "reference": "c8b5998a342d7861f2e921403f44e0a2f3ef2be0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nullivex/lib-array2xml/zipball/c8b5998a342d7861f2e921403f44e0a2f3ef2be0", + "reference": "c8b5998a342d7861f2e921403f44e0a2f3ef2be0", + "shasum": "" + }, + "require": { + "php": ">=5.3.2" + }, + "type": "library", + "autoload": { + "psr-0": { + "LSS": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Bryan Tong", + "email": "contact@nullivex.com", + "homepage": "http://bryantong.com" + }, + { + "name": "Tony Butler", + "email": "spudz76@gmail.com", + "homepage": "http://openlss.org" + } + ], + "description": "Array2XML conversion library credit to lalit.org", + "homepage": "http://openlss.org", + "keywords": [ + "array", + "array conversion", + "xml", + "xml conversion" + ], + "time": "2016-11-10T19:10:18+00:00" + }, { "name": "pacificsec/cpe", "version": "1.0.1", @@ -262,16 +311,16 @@ }, { "name": "phpoffice/phpspreadsheet", - "version": "1.4.0", + "version": "1.4.1", "source": { "type": "git", "url": "https://github.com/PHPOffice/PhpSpreadsheet.git", - "reference": "125f462a718956f37d81305ca0df4f17cef0f3b9" + "reference": "57404f43742a8164b5eac3ab03b962d8740885c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/125f462a718956f37d81305ca0df4f17cef0f3b9", - "reference": "125f462a718956f37d81305ca0df4f17cef0f3b9", + "url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/57404f43742a8164b5eac3ab03b962d8740885c1", + "reference": "57404f43742a8164b5eac3ab03b962d8740885c1", "shasum": "" }, "require": { @@ -304,7 +353,7 @@ "dompdf/dompdf": "Option for rendering PDF with PDF Writer", "jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers", "mpdf/mpdf": "Option for rendering PDF with PDF Writer", - "tecnick.com/tcpdf": "Option for rendering PDF with PDF Writer" + "tecnickcom/tcpdf": "Option for rendering PDF with PDF Writer" }, "type": "library", "autoload": { @@ -345,7 +394,7 @@ "xls", "xlsx" ], - "time": "2018-08-06T02:58:06+00:00" + "time": "2018-09-30T03:57:24+00:00" }, { "name": "psr/log", @@ -444,16 +493,16 @@ }, { "name": "tecnickcom/tcpdf", - "version": "6.2.22", + "version": "6.2.26", "source": { "type": "git", "url": "https://github.com/tecnickcom/TCPDF.git", - "reference": "ac6e92fccc7d9383dfd787056831349621b1aca2" + "reference": "367241059ca166e3a76490f4448c284e0a161f15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/ac6e92fccc7d9383dfd787056831349621b1aca2", - "reference": "ac6e92fccc7d9383dfd787056831349621b1aca2", + "url": "https://api.github.com/repos/tecnickcom/TCPDF/zipball/367241059ca166e3a76490f4448c284e0a161f15", + "reference": "367241059ca166e3a76490f4448c284e0a161f15", "shasum": "" }, "require": { @@ -502,7 +551,7 @@ "pdf417", "qrcode" ], - "time": "2018-09-14T15:26:29+00:00" + "time": "2018-10-16T17:24:05+00:00" } ], "packages-dev": [ @@ -927,16 +976,16 @@ }, { "name": "phpunit/php-code-coverage", - "version": "6.0.7", + "version": "6.1.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a" + "reference": "0685fb6a43aed1b2e09804d1aaf17144c82861f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/865662550c384bc1db7e51d29aeda1c2c161d69a", - "reference": "865662550c384bc1db7e51d29aeda1c2c161d69a", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/0685fb6a43aed1b2e09804d1aaf17144c82861f8", + "reference": "0685fb6a43aed1b2e09804d1aaf17144c82861f8", "shasum": "" }, "require": { @@ -960,7 +1009,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "6.0-dev" + "dev-master": "6.1-dev" } }, "autoload": { @@ -986,7 +1035,7 @@ "testing", "xunit" ], - "time": "2018-06-01T07:51:50+00:00" + "time": "2018-10-16T05:37:37+00:00" }, { "name": "phpunit/php-file-iterator", @@ -1179,16 +1228,16 @@ }, { "name": "phpunit/phpunit", - "version": "7.3.5", + "version": "7.4.0", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "7b331efabbb628c518c408fdfcaf571156775de2" + "reference": "f3837fa1e07758057ae06e8ddec6d06ba183f126" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/7b331efabbb628c518c408fdfcaf571156775de2", - "reference": "7b331efabbb628c518c408fdfcaf571156775de2", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3837fa1e07758057ae06e8ddec6d06ba183f126", + "reference": "f3837fa1e07758057ae06e8ddec6d06ba183f126", "shasum": "" }, "require": { @@ -1213,7 +1262,7 @@ "sebastian/exporter": "^3.1", "sebastian/global-state": "^2.0", "sebastian/object-enumerator": "^3.0.3", - "sebastian/resource-operations": "^1.0", + "sebastian/resource-operations": "^2.0", "sebastian/version": "^2.0.1" }, "conflict": { @@ -1233,7 +1282,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-master": "7.3-dev" + "dev-master": "7.4-dev" } }, "autoload": { @@ -1259,7 +1308,7 @@ "testing", "xunit" ], - "time": "2018-09-08T15:14:29+00:00" + "time": "2018-10-05T04:05:24+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", @@ -1741,25 +1790,25 @@ }, { "name": "sebastian/resource-operations", - "version": "1.0.0", + "version": "2.0.1", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/4d7a795d35b889bf80a0cc04e08d77cedfa917a9", + "reference": "4d7a795d35b889bf80a0cc04e08d77cedfa917a9", "shasum": "" }, "require": { - "php": ">=5.6.0" + "php": "^7.1" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.0.x-dev" + "dev-master": "2.0-dev" } }, "autoload": { @@ -1779,7 +1828,7 @@ ], "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28T20:34:47+00:00" + "time": "2018-10-04T04:07:39+00:00" }, { "name": "sebastian/version", diff --git a/inc/database.inc b/inc/database.inc index 790d5b7..531638e 100644 --- a/inc/database.inc +++ b/inc/database.inc @@ -66,7 +66,7 @@ * - Jan 10, 2018 - Added a couple functions and formatting * - Jan 15, 2018 - Fixed bug in get_Category_Findings * - Jan 16, 2018 - Added include for host_list.inc, updated to use host_list class, fixed bug in delete_Scan method - Moved scan deletion here + Moved scan deletion here * - Jan 20, 2018 - Fixed typo in save_STE method * - May 24, 2018 - Added defaulting where clause operator to '=' * - May 26, 2018 - Updated autocategorization to removed any extranious spaces before or after the string @@ -74,6 +74,8 @@ * - Jun 2, 2018 - Formatting and added set_Setting_Array method * - Jun 5, 2018 - Changed set_Setting_Array method to use SQL update instead of replace * - Sep 5, 2018 - Fix for #8 + * - Nov 3, 2018 - Fix for fix #62, commented out last INSERT in post_Processing, jao + * - Nov 8, 2018 - Added a couple methods to support changes for #25 */ include_once 'base.inc'; include_once 'software.inc'; @@ -112,7 +114,7 @@ include_once 'nasl.inc'; include_once 'uuid.inc'; include_once 'host_list.inc'; -// @TODO - Make sure all save functions accept a class object or array of that class that is being saved. Otherwise, only primative types will be passed in. +// @TODO - Make sure all save functions accept a class object or array of that class that is being saved. Otherwise, only primative types will be passed in. /** * Constant to decide if the database queries will run automatically after creating them * @@ -121,49 +123,56 @@ include_once 'host_list.inc'; define('AUTORUN', false); /** - * Global to represent an IN statement (e.g. WHERE field IN (1,2)) + * Global to represent an IN statement (e.g. + * WHERE field IN (1,2)) * * @var int */ define('IN', 1); /** - * Global to represent a NOT IN statement (e.g. WHERE field NOT IN (1,2)) + * Global to represent a NOT IN statement (e.g. + * WHERE field NOT IN (1,2)) * * @var int */ define('NOT_IN', 64); /** - * Global to represent a BETWEEN statement (e.g. WHERE field BETWEEN 1 and 2) + * Global to represent a BETWEEN statement (e.g. + * WHERE field BETWEEN 1 and 2) * * @var int */ define('BETWEEN', 2); /** - * Global to represent a LIKE statement (e.g. WHERE field LIKE '%value%') + * Global to represent a LIKE statement (e.g. + * WHERE field LIKE '%value%') * * @var int */ define('LIKE', 4); /** - * Global to represent an IS NOT statement (e.g. WHERE field IS NOT NULL) + * Global to represent an IS NOT statement (e.g. + * WHERE field IS NOT NULL) * * @var int */ define('IS_NOT', 8); /** - * Global to represent an IS statement (e.g. WHERE field IS NULL) + * Global to represent an IS statement (e.g. + * WHERE field IS NULL) * * @var int */ define('IS', 16); /** - * Global to represent an NOT LIKE statement (e.g. WHERE field NOT LIKE '%value%' + * Global to represent an NOT LIKE statement (e.g. + * WHERE field NOT LIKE '%value%' * * @var int */ @@ -177,19 +186,31 @@ define('NOT_LIKE', 32); class db_helper { - const SELECT = 1; - const SELECT_COUNT = 2; - const CREATE_TABLE = 3; - const DROP = 4; - const DELETE = 5; - const INSERT = 6; - const REPLACE = 7; - const UPDATE = 8; - const EXTENDED_INSERT = 9; + const SELECT = 1; + + const SELECT_COUNT = 2; + + const CREATE_TABLE = 3; + + const DROP = 4; + + const DELETE = 5; + + const INSERT = 6; + + const REPLACE = 7; + + const UPDATE = 8; + + const EXTENDED_INSERT = 9; + const EXTENDED_REPLACE = 10; - const EXTENDED_UPDATE = 11; - const ALTER_TABLE = 12; - const TRUNCATE = 13; + + const EXTENDED_UPDATE = 11; + + const ALTER_TABLE = 12; + + const TRUNCATE = 13; /** * The mysqli connection @@ -222,16 +243,16 @@ class db_helper /** * Constructor * - * @param mysqli $dbh [by ref] - * mysqli object to perform queries. + * @param mysqli $dbh + * [by ref] + * mysqli object to perform queries. */ public function __construct(&$dbh) { - if (!is_null($dbh) && is_a($dbh, "mysqli")) { + if (! is_null($dbh) && is_a($dbh, "mysqli")) { $this->c = $dbh; - } - else { - throw(new Exception("Could not create database helper class", E_ERROR)); + } else { + throw (new Exception("Could not create database helper class", E_ERROR)); } $this->c->real_query("SET time_zone='+00:00'"); @@ -241,43 +262,45 @@ class db_helper /** * Function to execute the statement * - * @param mixed $return [optional] - * MYSQLI constant to control what is returned from the mysqli_result object - * @param string $sql [optional] - * Optional SQL query + * @param mixed $return + * [optional] + * MYSQLI constant to control what is returned from the mysqli_result object + * @param string $sql + * [optional] + * Optional SQL query * * @return mixed */ public function execute($return = MYSQLI_ASSOC, $sql = null) { - if (!is_null($sql)) { + if (! is_null($sql)) { $this->sql = $sql; } if (is_a($this->c, 'mysqli')) { - if (!$this->c->ping()) { + if (! $this->c->ping()) { $this->c = null; $this->c = new mysqli(DB_SERVER, 'web', db::decrypt_pwd(), 'sagacity'); } - } - else { - throw(new Exception('Database was not connected', E_ERROR)); + } else { + throw (new Exception('Database was not connected', E_ERROR)); } try { - if (in_array($this->query_type, [self::SELECT, self::SELECT_COUNT])) { + if (in_array($this->query_type, [ + self::SELECT, + self::SELECT_COUNT + ])) { $this->result = $this->c->query($this->sql); if ($this->c->error) { $this->debug(E_ERROR); } - } - elseif ($this->query_type == self::DELETE) { + } elseif ($this->query_type == self::DELETE) { $this->c->real_query($this->sql); if ($this->c->error) { return 0; } - } - else { + } else { $this->c->real_query($this->sql); if ($this->c->error) { $this->debug(E_ERROR, $this->c->error); @@ -285,8 +308,7 @@ class db_helper } $this->result = $this->check_results($return); - } - catch (Exception $e) { + } catch (Exception $e) { die($e->getTraceAsString()); } @@ -296,8 +318,9 @@ class db_helper /** * Function to check the results and return what is expected * - * @param mixed $return_type [optional] - * Optional return mysqli_result return type + * @param mixed $return_type + * [optional] + * Optional return mysqli_result return type * * @return mixed */ @@ -307,21 +330,19 @@ class db_helper if ($this->c->error) { $this->debug(E_ERROR); - } - elseif (LOG_LEVEL == E_DEBUG) { + } elseif (LOG_LEVEL == E_DEBUG) { $this->debug(E_DEBUG); } switch ($this->query_type) { case self::SELECT_COUNT: - if (!is_a($this->result, 'mysqli_result')) { + if (! is_a($this->result, 'mysqli_result')) { $this->debug(E_ERROR); } if ($this->result->num_rows == 1) { $res = $this->result->fetch_assoc()['count']; - } - elseif ($this->result->num_rows > 1) { + } elseif ($this->result->num_rows > 1) { $res = $this->result->num_rows; } @@ -329,14 +350,13 @@ class db_helper return $res; case self::SELECT: - if (!is_a($this->result, 'mysqli_result')) { + if (! is_a($this->result, 'mysqli_result')) { $this->debug(E_ERROR); } if ($this->result->num_rows == 1) { $res = $this->result->fetch_array($return_type); - } - elseif ($this->result->num_rows > 1) { + } elseif ($this->result->num_rows > 1) { $res = $this->fetch_all($return_type); } @@ -351,8 +371,7 @@ class db_helper if ($this->c->insert_id) { return $this->c->insert_id; - } - elseif ($this->c->affected_rows) { + } elseif ($this->c->affected_rows) { return $this->c->affected_rows; } @@ -366,15 +385,12 @@ class db_helper case self::ALTER_TABLE: if ($this->c->error && $this->c->errno == 1060) { return ($this->c->affected_rows ? $this->c->affected_rows : true); - } - elseif ($this->c->error) { + } elseif ($this->c->error) { $this->debug(E_ERROR); return false; - } - elseif ($this->c->affected_rows) { + } elseif ($this->c->affected_rows) { return $this->c->affected_rows; - } - else { + } else { return true; } @@ -389,8 +405,9 @@ class db_helper /** * Function to pass through calling the query function (used for backwards compatibility and for more complex queries that aren't currently supported) * - * @param string $sql [optional] - * Optional query to pass in and execute + * @param string $sql + * [optional] + * Optional query to pass in and execute * * @return mysqli_result */ @@ -398,8 +415,7 @@ class db_helper { if (is_null($sql)) { return $this->c->query($this->sql); - } - else { + } else { return $this->c->query($sql); } } @@ -408,13 +424,16 @@ class db_helper * A function to build a select query * * @param string $table_name - * The table to query - * @param array $fields [optional] - * Optional array of fields to return (defaults to '*') - * @param array $where [optional] - * Optional 2-dimensional array to build where clause from - * @param array $flags [optional] - * Optional 2-dimensional array to allow other flags + * The table to query + * @param array $fields + * [optional] + * Optional array of fields to return (defaults to '*') + * @param array $where + * [optional] + * Optional 2-dimensional array to build where clause from + * @param array $flags + * [optional] + * Optional 2-dimensional array to allow other flags * * @see db_helper::where() * @see db_helper::flags() @@ -423,13 +442,12 @@ class db_helper */ public function select($table_name, $fields = null, $where = null, $flags = null) { - $this->sql = null; + $this->sql = null; $this->query_type = self::SELECT; - if (!is_null($table_name) && is_string($table_name)) { + if (! is_null($table_name) && is_string($table_name)) { $this->sql = "SELECT " . $this->fields($fields) . " FROM $table_name"; - } - else { + } else { return null; } @@ -437,11 +455,11 @@ class db_helper $this->sql .= " " . implode(" ", $flags['table_joins']); } - if (!is_null($where) && is_array($where) && count($where)) { + if (! is_null($where) && is_array($where) && count($where)) { $this->sql .= $this->where($where); } - if (!is_null($flags) && is_array($flags) && count($flags)) { + if (! is_null($flags) && is_array($flags) && count($flags)) { $this->sql .= $this->flags($flags); } @@ -456,11 +474,13 @@ class db_helper * Function to build a query to check the number of rows in a table * * @param string $table_name - * The table to query - * @param array $where [optional] - * Optional 2-dimensional array to build where clause - * @param array $flags [optional] - * Optional 2-dimensional array to add flags + * The table to query + * @param array $where + * [optional] + * Optional 2-dimensional array to build where clause + * @param array $flags + * [optional] + * Optional 2-dimensional array to add flags * * @see db_helper::where() * @see db_helper::flags() @@ -469,13 +489,12 @@ class db_helper */ public function select_count($table_name, $where = null, $flags = null) { - $this->sql = null; + $this->sql = null; $this->query_type = self::SELECT_COUNT; - if (!is_null($table_name) && is_string($table_name)) { + if (! is_null($table_name) && is_string($table_name)) { $this->sql = "SELECT COUNT(1) AS 'count' FROM $table_name"; - } - else { + } else { return null; } @@ -483,11 +502,11 @@ class db_helper $this->sql .= " " . implode(" ", $flags['table_joins']); } - if (!is_null($where) && is_array($where) && count($where)) { + if (! is_null($where) && is_array($where) && count($where)) { $this->sql .= $this->where($where); } - if (!is_null($flags) && is_array($flags) && count($flags)) { + if (! is_null($flags) && is_array($flags) && count($flags)) { $this->sql .= $this->flags($flags); } @@ -502,25 +521,28 @@ class db_helper * Function to build an insert query statement * * @param string $table_name - * Table name to query + * Table name to query * @param array $params - * Name/value pair to insert into the table - * @param boolean $to_ignore [optional] - * Optional boolean to decide if the "IGNORE" will be added + * Name/value pair to insert into the table + * @param boolean $to_ignore + * [optional] + * Optional boolean to decide if the "IGNORE" will be added * * @return string|NULL */ public function insert($table_name, $params, $to_ignore = false) { - $this->sql = null; + $this->sql = null; $this->query_type = self::INSERT; - if (!is_null($table_name) && is_string($table_name)) { - $this->sql = "INSERT " . ($to_ignore ? "IGNORE " : "") . "INTO $table_name " . - "(`" . implode("`,`", array_keys($params)) . "`)"; + if (! is_null($table_name) && is_string($table_name)) { + $this->sql = "INSERT " . ($to_ignore ? "IGNORE " : "") . "INTO $table_name " . "(`" . implode("`,`", array_keys($params)) . "`)"; } - $this->sql .= " VALUES (" . implode(",", array_map([$this, '_escape'], array_values($params))) . ")"; + $this->sql .= " VALUES (" . implode(",", array_map([ + $this, + '_escape' + ], array_values($params))) . ")"; if (AUTORUN) { return $this->execute(MYSQLI_BOTH); @@ -533,49 +555,51 @@ class db_helper * Function to create an extended insert query statement * * @param string $table_name - * The table name that the data is going to be inserted on + * The table name that the data is going to be inserted on * @param array $fields - * An array of field names that each value represents + * An array of field names that each value represents * @param array $params - * An array of array of values - * @param boolean $to_ignore [optional] - * Boolean to decide if we need to use the INSERT IGNORE INTO syntax + * An array of array of values + * @param boolean $to_ignore + * [optional] + * Boolean to decide if we need to use the INSERT IGNORE INTO syntax * - * @return NULL|string - * Returns the SQL if AUTORUN is set to false, else it returns the output from running. + * @return NULL|string Returns the SQL if AUTORUN is set to false, else it returns the output from running. */ public function extended_insert($table_name, $fields, $params, $to_ignore = false) { - $this->sql = null; + $this->sql = null; $this->query_type = self::EXTENDED_INSERT; - if (!is_null($table_name) && is_string($table_name)) { - $this->sql = "INSERT " . ($to_ignore ? "IGNORE " : "") . "INTO $table_name " . - "(`" . implode("`,`", $fields) . "`)"; - } - else { - throw(new Exception("Missing table name in extended_insert", E_ERROR)); + if (! is_null($table_name) && is_string($table_name)) { + $this->sql = "INSERT " . ($to_ignore ? "IGNORE " : "") . "INTO $table_name " . "(`" . implode("`,`", $fields) . "`)"; + } else { + throw (new Exception("Missing table name in extended_insert", E_ERROR)); } if (is_array($params) && count($params)) { $this->sql .= " VALUES "; if (isset($params[0]) && is_array($params[0])) { foreach ($params as $p) { - $this->sql .= "(" . implode(",", array_map([$this, '_escape'], array_values($p))) . "),"; + $this->sql .= "(" . implode(",", array_map([ + $this, + '_escape' + ], array_values($p))) . "),"; } - } - else { + } else { if (count($params) != count($fields)) { - throw(new Exception("Inconsistent number of fields in fields and values")); + throw (new Exception("Inconsistent number of fields in fields and values")); } - $this->sql .= "(" . implode("),(", array_map([$this, '_escape'], array_values($params))) . "),"; + $this->sql .= "(" . implode("),(", array_map([ + $this, + '_escape' + ], array_values($params))) . "),"; } - } - else { + } else { throw new \InvalidArgumentException("Expected array parameters"); } - $this->sql = substr($this->sql, 0, -1); + $this->sql = substr($this->sql, 0, - 1); if (AUTORUN) { return $this->execute(MYSQLI_BOTH); @@ -588,13 +612,15 @@ class db_helper * Build a statement to update a table * * @param string $table_name - * The table name to update + * The table name to update * @param array $params - * Name/value pairs of the field name and value - * @param array $where [optional] - * Two-dimensional array to create where clause - * @param array $flags [optional] - * Two-dimensional array to create other flag options (table_joins, order, and group) + * Name/value pairs of the field name and value + * @param array $where + * [optional] + * Two-dimensional array to create where clause + * @param array $flags + * [optional] + * Two-dimensional array to create other flag options (table_joins, order, and group) * * @see db_helper::where() * @see db_helper::flags() @@ -603,10 +629,10 @@ class db_helper */ public function update($table_name, $params, $where = null, $flags = null) { - $this->sql = "UPDATE "; + $this->sql = "UPDATE "; $this->query_type = self::UPDATE; - if (!is_null($table_name) && is_string($table_name)) { + if (! is_null($table_name) && is_string($table_name)) { $this->sql .= $table_name; if (isset($flags['table_joins'])) { @@ -618,28 +644,24 @@ class db_helper } foreach ($params as $f => $p) { - if ((strpos($f, "`") === false) && - (strpos($f, ".") === false) && - (strpos($f, "*") === false) && - (stripos($f, " as ") === false)) { + if ((strpos($f, "`") === false) && (strpos($f, ".") === false) && (strpos($f, "*") === false) && (stripos($f, " as ") === false)) { $f = "`{$f}`"; } - if (!is_null($p)) { + if (! is_null($p)) { $this->sql .= "$f={$this->_escape($p)},"; - } - else { + } else { $this->sql .= "$f=NULL,"; } } - $this->sql = substr($this->sql, 0, -1); + $this->sql = substr($this->sql, 0, - 1); - if (!is_null($where) && is_array($where) && count($where)) { + if (! is_null($where) && is_array($where) && count($where)) { $this->sql .= $this->where($where); } - if (!is_null($flags) && is_array($flags) && count($flags)) { + if (! is_null($flags) && is_array($flags) && count($flags)) { $this->sql .= $this->flags($flags); } @@ -654,23 +676,23 @@ class db_helper * Function to offer an extended updated functionality by using two different tables. * * @param string $to_be_updated - * The table that you want to update (alias 'tbu' is automatically added) + * The table that you want to update (alias 'tbu' is automatically added) * @param string $original - * The table with the data you want to overwrite to_be_updated table (alias 'o' is automatically added) + * The table with the data you want to overwrite to_be_updated table (alias 'o' is automatically added) * @param string $using - * The common index value between them that will join the fields + * The common index value between them that will join the fields * @param array|string $params - * If string only a single field is updated (tbu.$params = o.$params) - * If array each element in the array is a field to be updated (tbu.$param = o.$param) + * If string only a single field is updated (tbu.$params = o.$params) + * If array each element in the array is a field to be updated (tbu.$param = o.$param) * * @return mixed */ public function extended_update($to_be_updated, $original, $using, $params) { - $this->sql = "UPDATE "; + $this->sql = "UPDATE "; $this->query_type = self::EXTENDED_UPDATE; - if (!is_null($to_be_updated) && !is_null($original) && !is_null($using)) { + if (! is_null($to_be_updated) && ! is_null($original) && ! is_null($using)) { $this->sql .= "$to_be_updated tbu INNER JOIN $original o USING ($using) SET "; } @@ -678,13 +700,11 @@ class db_helper foreach ($params as $param) { $this->sql .= "tbu.$param = o.$param,"; } - $this->sql = substr($this->sql, 0, -1); - } - elseif (is_string($params)) { + $this->sql = substr($this->sql, 0, - 1); + } elseif (is_string($params)) { $this->sql .= "tbu.$params = o.$params"; - } - else { - throw(new Exception("Do not understand datatype of \$params", E_ERROR)); + } else { + throw (new Exception("Do not understand datatype of \$params", E_ERROR)); } if (AUTORUN) { @@ -698,23 +718,25 @@ class db_helper * Function to build a replace query * * @param string $table_name - * The table to update + * The table to update * @param array $params - * Name/value pair to insert + * Name/value pair to insert * * @return NULL|string */ public function replace($table_name, $params) { - $this->sql = null; + $this->sql = null; $this->query_type = self::REPLACE; - if (!is_null($table_name) && is_string($table_name)) { - $this->sql = "REPLACE INTO $table_name " . - "(`" . implode("`,`", array_keys($params)) . "`)"; + if (! is_null($table_name) && is_string($table_name)) { + $this->sql = "REPLACE INTO $table_name " . "(`" . implode("`,`", array_keys($params)) . "`)"; } - $this->sql .= " VALUES (" . implode(",", array_map(array($this, '_escape'), array_values($params))) . ")"; + $this->sql .= " VALUES (" . implode(",", array_map(array( + $this, + '_escape' + ), array_values($params))) . ")"; if (AUTORUN) { return $this->execute(MYSQLI_BOTH); @@ -727,35 +749,36 @@ class db_helper * Function to build an extended replace statement * * @param string $table_name - * Table name to update + * Table name to update * @param array $fields - * Array of fields + * Array of fields * @param array $params - * Two-dimensional array of values + * Two-dimensional array of values * * @return NULL|string */ public function extended_replace($table_name, $fields, $params) { - $this->sql = null; + $this->sql = null; $this->query_type = self::EXTENDED_REPLACE; - if (!is_null($table_name) && is_string($table_name)) { - $this->sql = "REPLACE INTO $table_name " . - "(`" . implode("`,`", $fields) . "`)"; - } - else { + if (! is_null($table_name) && is_string($table_name)) { + $this->sql = "REPLACE INTO $table_name " . "(`" . implode("`,`", $fields) . "`)"; + } else { return null; } if (is_array($params) && count($params)) { $this->sql .= " VALUES "; foreach ($params as $p) { - $this->sql .= "(" . implode(",", array_map(array($this, '_escape'), array_values($p))) . "),"; + $this->sql .= "(" . implode(",", array_map(array( + $this, + '_escape' + ), array_values($p))) . "),"; } } - $this->sql = substr($this->sql, 0, -1); + $this->sql = substr($this->sql, 0, - 1); if (AUTORUN) { return $this->execute(MYSQLI_BOTH); @@ -768,13 +791,16 @@ class db_helper * Function to build a delete statement * * @param string $table_name - * Table name to act on - * @param array $fields [optional] - * Optional list of fields to delete (used when including multiple tables) - * @param array $where [optional] - * Optional 2-dimensional array to build where clause from - * @param array $table_joins [optional] - * Optional 2-dimensional array to add other flags + * Table name to act on + * @param array $fields + * [optional] + * Optional list of fields to delete (used when including multiple tables) + * @param array $where + * [optional] + * Optional 2-dimensional array to build where clause from + * @param array $table_joins + * [optional] + * Optional 2-dimensional array to add other flags * * @see db_helper::where() * @see db_helper::flags() @@ -783,25 +809,24 @@ class db_helper */ public function delete($table_name, $fields = null, $where = null, $table_joins = null) { - $this->sql = "DELETE"; + $this->sql = "DELETE"; $this->query_type = self::DELETE; - if (!is_null($fields) && is_array($fields)) { + if (! is_null($fields) && is_array($fields)) { $this->sql .= " " . implode(",", $fields); } - if (!is_null($table_name) && is_string($table_name)) { + if (! is_null($table_name) && is_string($table_name)) { $this->sql .= " FROM $table_name"; - } - else { - throw(new Exception("Failed to create delete query, no table name")); + } else { + throw (new Exception("Failed to create delete query, no table name")); } - if (!is_null($table_joins) && is_array($table_joins) && count($table_joins)) { + if (! is_null($table_joins) && is_array($table_joins) && count($table_joins)) { $this->sql .= " " . implode(" ", $table_joins); } - if (!is_null($where) && is_array($where) && count($where)) { + if (! is_null($where) && is_array($where) && count($where)) { $this->sql .= $this->where($where); } @@ -816,20 +841,21 @@ class db_helper * Function to build a drop table statement (automatically executes) * * @param string $schema - * Schema the table resides in + * Schema the table resides in * @param string $table_name - * Table to drop - * @param boolean $is_tmp [optional] - * Optional boolean if this is a temporary table + * Table to drop + * @param boolean $is_tmp + * [optional] + * Optional boolean if this is a temporary table * * @return string|NULL */ public function drop($schema, $table_name, $is_tmp = false) { - $this->sql = null; + $this->sql = null; $this->query_type = self::DROP; - if (!is_null($table_name) && is_string($table_name)) { + if (! is_null($table_name) && is_string($table_name)) { $this->sql = "DROP " . ($is_tmp ? "TEMPORARY " : "") . "TABLE IF EXISTS `$schema`.`$table_name`"; } @@ -840,16 +866,16 @@ class db_helper * Function to build a truncate table statement (automatically executes) * * @param string $table_name - * Table to truncate + * Table to truncate * * @return string|NULL */ public function truncate($table_name) { - $this->sql = null; + $this->sql = null; $this->query_type = self::TRUNCATE; - if (!is_null($table_name) && is_string($table_name)) { + if (! is_null($table_name) && is_string($table_name)) { $this->sql = "TRUNCATE TABLE $table_name"; } @@ -860,13 +886,15 @@ class db_helper * Function to build a create temporary table statement * * @param string $table_name - * Name to give the table when creating - * @param boolean $is_tmp [optional] - * Optional boolean to make the table a temporary table - * @param mixed $select [optional] - * Optional parameter if null uses last built statement - * If string, will be made the SQL statement executed to create the table - * If array, 2-dimensional array with "field", "datatype" values to build table fields + * Name to give the table when creating + * @param boolean $is_tmp + * [optional] + * Optional boolean to make the table a temporary table + * @param mixed $select + * [optional] + * Optional parameter if null uses last built statement + * If string, will be made the SQL statement executed to create the table + * If array, 2-dimensional array with "field", "datatype" values to build table fields * * @return NULL|string */ @@ -874,20 +902,17 @@ class db_helper { $this->query_type = self::CREATE_TABLE; - if (is_null($select) && !is_null($this->sql) && substr($this->sql, 0, 6) == 'SELECT') { + if (is_null($select) && ! is_null($this->sql) && substr($this->sql, 0, 6) == 'SELECT') { $this->sql = "CREATE " . ($is_tmp ? "TEMPORARY" : "") . " TABLE IF NOT EXISTS $table_name AS ($this->sql)"; } - if (!is_null($table_name) && is_string($table_name) && is_string($select)) { + if (! is_null($table_name) && is_string($table_name) && is_string($select)) { $this->sql = "CREATE " . ($is_tmp ? "TEMPORARY" : "") . " TABLE IF NOT EXISTS $table_name AS ($select)"; - } - elseif (!is_null($table_name) && is_string($table_name) && is_array($select)) { + } elseif (! is_null($table_name) && is_string($table_name) && is_array($select)) { $this->sql = "CREATE " . ($is_tmp ? "TEMPORARY" : "") . " TABLE IF NOT EXISTS $table_name ("; foreach ($select as $field) { - $this->sql .= "{$field['field']} {$field['datatype']}" . - (isset($field['default']) ? " {$field['default']}" : '') . - (isset($field['option']) ? " {$field['option']}" : '') . ","; + $this->sql .= "{$field['field']} {$field['datatype']}" . (isset($field['default']) ? " {$field['default']}" : '') . (isset($field['option']) ? " {$field['option']}" : '') . ","; } - $this->sql = substr($this->sql, 0, -1) . ")"; + $this->sql = substr($this->sql, 0, - 1) . ")"; } if (AUTORUN) { @@ -921,12 +946,10 @@ class db_helper if ($field->nn) { $this->sql .= " NOT NULL"; - } - else { + } else { if ($field->default === null) { $this->sql .= " DEFAULT NULL"; - } - elseif (strlen($field->default)) { + } elseif (strlen($field->default)) { $this->sql .= " DEFAULT '{$field->default}'"; } } @@ -944,11 +967,11 @@ class db_helper if (isset($json->constraints) && is_array($json->constraints) && count($json->constraints)) { foreach ($json->constraints as $con) { - $this->sql .= ", CONSTRAINT `{$con->id}` " . - "FOREIGN KEY (`{$con->local}`) " . - "REFERENCES `{$con->schema}`.`{$con->table}` (`{$con->field}`) " . - "ON DELETE " . (is_null($con->delete) ? "NO ACTION" : strtoupper($con->delete)) . " " . - "ON UPDATE " . (is_null($con->update) ? "NO ACTION" : strtoupper($con->update)); + $this->sql .= ", CONSTRAINT `{$con->id}` " . + "FOREIGN KEY (`{$con->local}`) " . + "REFERENCES `{$con->schema}`.`{$con->table}` (`{$con->field}`) " . + "ON DELETE " . (!isset($con->delete) || is_null($con->delete) ? "NO ACTION" : strtoupper($con->delete)) . " " . + "ON UPDATE " . (!isset($con->update) || is_null($con->update) ? "NO ACTION" : strtoupper($con->update)); } } @@ -958,9 +981,8 @@ class db_helper if (isset($json->primary_key) && is_array($json->primary_key) && count($json->primary_key)) { $this->sql .= ", PRIMARY KEY(`" . implode("`,`", $json->primary_key) . "`))"; - } - else { - $this->sql = substr($this->sql, 0, -1) . ")"; + } else { + $this->sql = substr($this->sql, 0, - 1) . ")"; } $this->execute(); @@ -970,40 +992,35 @@ class db_helper * Function to alter a existing table * * @param string $table_name - * Table to alter + * Table to alter * @param string $action - * What action should be taken ('add-column', 'drop-column', 'modify-column') - * @param array $params [optional] - * Optional 2-dimensional array of parameters to act on. $action will dictate what parameters need to be present + * What action should be taken ('add-column', 'drop-column', 'modify-column') + * @param array $params + * [optional] + * Optional 2-dimensional array of parameters to act on. $action will dictate what parameters need to be present * * @return mixed */ public function alter_table($table_name, $action, $params) { $this->query_type = self::ALTER_TABLE; - $this->sql = "ALTER TABLE $table_name "; + $this->sql = "ALTER TABLE $table_name "; if ($action == 'add-column') { - $nn = ($params->nn ? " NOT NULL" : ""); + $nn = ($params->nn ? " NOT NULL" : ""); $default = null; if ($params->default === null) { $default = " DEFAULT NULL"; - } - elseif (strlen($params->default)) { + } elseif (strlen($params->default)) { $default = " DEFAULT '{$params->default}'"; } - $this->sql .= "ADD COLUMN {$params->name} {$params->dataType}" . - $nn . $default; - } - elseif ($action == 'drop-column') { + $this->sql .= "ADD COLUMN {$params->name} {$params->dataType}" . $nn . $default; + } elseif ($action == 'drop-column') { $this->sql .= "DROP COLUMN "; foreach ($params as $col) { $this->sql .= "{$col['name']},"; } - $this->sql = substr($this->sql, 0, -1); - } - elseif ($action == 'modify-column') { - - } + $this->sql = substr($this->sql, 0, - 1); + } elseif ($action == 'modify-column') {} $this->debug(E_DEBUG); @@ -1014,14 +1031,13 @@ class db_helper * Check to see if a field in a table exists * * @param string $schema - * Schema that contains tables + * Schema that contains tables * @param string $table_name - * Table to check + * Table to check * @param string $field_name - * Field name to find + * Field name to find * - * @return boolean - * Returns TRUE if field is found in that schema and table, otherwise FALSE + * @return boolean Returns TRUE if field is found in that schema and table, otherwise FALSE */ public function field_exists($schema, $table_name, $field_name) { @@ -1042,11 +1058,12 @@ class db_helper * Function to get the column data (datatype, flags, defaults, etc) * * @param string $schema - * Schema to search for table in + * Schema to search for table in * @param string $table_name - * Table to query - * @param mixed $field [optional] - * Optional field to retrieve data (if null, returns data from all fields) + * Table to query + * @param mixed $field + * [optional] + * Optional field to retrieve data (if null, returns data from all fields) * * @return array */ @@ -1056,14 +1073,11 @@ class db_helper if (is_null($field)) { $res = $this->c->query("SELECT * FROM $table_name LIMIT 1"); - } - elseif (is_array($field)) { + } elseif (is_array($field)) { $res = $this->c->query("SELECT `" . implode("`,`", $field) . "` FROM $table_name LIMIT 1"); - } - elseif (is_string($field)) { + } elseif (is_string($field)) { $res = $this->c->query("SELECT $field FROM $table_name LIMIT 1"); - } - else { + } else { return null; } @@ -1092,44 +1106,36 @@ class db_helper public function field_check($field_data, $check, $pks, $index) { $default = null; - $ret = null; + $ret = null; $nn = ($check->nn ? " NOT NULL" : null); if ($check->default === null) { $default = " DEFAULT NULL"; - } - elseif (strlen($check->default)) { + } elseif (strlen($check->default)) { $default = " DEFAULT '{$check->default}'"; } if ($field_data->type != $check->type && $check->type != MYSQLI_TYPE_ENUM) { $this->debug("{$field_data->name} wrong datatype, changing to {$check->dataType}"); - $ret = " CHANGE COLUMN `{$field_data->name}` `{$check->name}` {$check->dataType}" . - "{$nn}{$default}"; - } - elseif (!is_null($check->length) && $field_data->length != $check->length) { + $ret = " CHANGE COLUMN `{$field_data->name}` `{$check->name}` {$check->dataType}" . "{$nn}{$default}"; + } elseif (! is_null($check->length) && $field_data->length != $check->length) { $this->debug("{$field_data->name} incorrect size ({$field_data->length} != {$check->length})"); - $ret = " CHANGE COLUMN `{$field_data->name}` `{$check->name}` {$check->dataType}" . - "{$nn}{$default}"; - } - elseif ($check->type == MYSQLI_TYPE_ENUM && !($field_data->flags & MYSQLI_ENUM_FLAG)) { - $ret = " CHANGE COLUMN `{$field_data->name}` `{$check->name}` {$check->dataType}('" . implode("','", $check->values) . "')" . - "{$nn}{$default}"; + $ret = " CHANGE COLUMN `{$field_data->name}` `{$check->name}` {$check->dataType}" . "{$nn}{$default}"; + } elseif ($check->type == MYSQLI_TYPE_ENUM && ! ($field_data->flags & MYSQLI_ENUM_FLAG)) { + $ret = " CHANGE COLUMN `{$field_data->name}` `{$check->name}` {$check->dataType}('" . implode("','", $check->values) . "')" . "{$nn}{$default}"; } - if (!is_null($index) && is_array($index) && count($index)) { + if (! is_null($index) && is_array($index) && count($index)) { foreach ($index as $ind) { - if ($check->name == $ind->ref && !($field_data->flags & MYSQLI_MULTIPLE_KEY_FLAG)) { + if ($check->name == $ind->ref && ! ($field_data->flags & MYSQLI_MULTIPLE_KEY_FLAG)) { $this->debug("{$field_data->name} is not an index"); - $ret .= ($ret ? "," : "") . - " ADD INDEX `{$ind->id}` (`{$ind->ref}` ASC)"; + $ret .= ($ret ? "," : "") . " ADD INDEX `{$ind->id}` (`{$ind->ref}` ASC)"; } } } - if (in_array($check->name, $pks) && !($field_data->flags & MYSQLI_PRI_KEY_FLAG)) { - $ret .= ($ret ? "," : "") . - " DROP PRIMARY KEY, ADD PRIMARY KEY(`" . implode("`,`", $pks) . "`)"; + if (in_array($check->name, $pks) && ! ($field_data->flags & MYSQLI_PRI_KEY_FLAG)) { + $ret .= ($ret ? "," : "") . " DROP PRIMARY KEY, ADD PRIMARY KEY(`" . implode("`,`", $pks) . "`)"; } return $ret; @@ -1139,12 +1145,11 @@ class db_helper * Function to check for the existence of a table within a schema * * @param string $schema - * Schema to search for table + * Schema to search for table * @param string $table_name - * Table to search for + * Table to search for * - * @return boolean - * Returns TRUE if table is found in that schema, otherwise FALSE + * @return boolean Returns TRUE if table is found in that schema, otherwise FALSE */ public function table_exists($schema, $table_name) { @@ -1174,42 +1179,34 @@ class db_helper * Function to escape SQL characters to prevent SQL injection * * @param mixed $val - * Value to escape + * Value to escape * - * @return string - * Escaped value + * @return string Escaped value */ public function _escape($val) { if (is_null($val)) { return 'NULL'; - } - elseif (is_numeric($val) || is_string($val)) { + } elseif (is_numeric($val) || is_string($val)) { if ($this->isJson($val)) { return "'{$this->c->real_escape_string($val)}'"; - } - elseif (strtolower($val) == 'now()') { + } elseif (strtolower($val) == 'now()') { return $val; - } - elseif (preg_match("/\.`\w+`/", $val)) { + } elseif (preg_match("/\.`\w+`/", $val)) { return $val; } return "'{$this->c->real_escape_string($val)}'"; - } - elseif (is_a($val, 'DateTime')) { + } elseif (is_a($val, 'DateTime')) { return "'{$val->format(MYSQL_DT_FORMAT)}'"; - } - elseif (is_bool($val)) { + } elseif (is_bool($val)) { return $val ? "'1'" : "'0'"; - } - elseif (gettype($val) == 'object') { + } elseif (gettype($val) == 'object') { $this->debug(E_ERROR, "Unknown object to escape " . get_class($val) . " in SQL string {$this->sql}"); - } - else { + } else { $this->debug(E_ERROR, "Unknown datatype to escape in SQL string {$this->sql} " . gettype($val)); } - throw(new Exception("Unknown datatype to escape in SQL string {$this->sql} " . gettype($val), E_ERROR)); + throw (new Exception("Unknown datatype to escape in SQL string {$this->sql} " . gettype($val), E_ERROR)); } /** @@ -1222,10 +1219,9 @@ class db_helper public function fetch_all($resulttype = MYSQLI_ASSOC) { $res = []; - if (method_exists('mysqli_result', 'fetch_all')) { # Compatibility layer with PHP < 5.3 + if (method_exists('mysqli_result', 'fetch_all')) { // Compatibility layer with PHP < 5.3 $res = $this->result->fetch_all($resulttype); - } - else { + } else { while ($tmp = $this->result->fetch_array($resulttype)) { $res[] = $tmp; } @@ -1266,17 +1262,12 @@ class db_helper $errmsg = $this->sql; } - file_put_contents(realpath(LOG_PATH . '/db.log'), "{$dt->format(DATE_ISO8601)}\t" . - "$err_lvl\t" . - "Executing: $this->query_type\t" . - "SQL: {$errmsg}" . PHP_EOL, FILE_APPEND); + file_put_contents(realpath(LOG_PATH . '/db.log'), "{$dt->format(DATE_ISO8601)}\t" . "$err_lvl\t" . "Executing: $this->query_type\t" . "SQL: {$errmsg}" . PHP_EOL, FILE_APPEND); if ($errno == E_DEBUG && $this->result && LOG_LEVEL == E_DEBUG && is_a($this->result, 'mysqli_result')) { file_put_contents(realpath(LOG_PATH . '/db.debug'), print_r($this->result, true), FILE_APPEND); - } - elseif ($errno == E_ERROR && $this->c->error) { - file_put_contents(realpath(LOG_PATH . '/db.err'), "{$dt->format(DATE_ISO8601)}\t" . - "{$this->c->error}" . PHP_EOL, FILE_APPEND); + } elseif ($errno == E_ERROR && $this->c->error) { + file_put_contents(realpath(LOG_PATH . '/db.err'), "{$dt->format(DATE_ISO8601)}\t" . "{$this->c->error}" . PHP_EOL, FILE_APPEND); error_log($this->c->error); die($this->c->error); } @@ -1285,8 +1276,9 @@ class db_helper /** * Function to populate the fields for the SQL * - * @param array $fields [optional] - * Optional array of fields to string together to create a field list + * @param array $fields + * [optional] + * Optional array of fields to string together to create a field list * * @return string */ @@ -1296,19 +1288,14 @@ class db_helper if (is_array($fields) && count($fields)) { foreach ($fields as $field) { - if ((strpos($field, '`') === false) && - (strpos($field, '.') === false) && - (strpos($field, '*') === false) && - (stripos($field, ' as ') === false)) { + if ((strpos($field, '`') === false) && (strpos($field, '.') === false) && (strpos($field, '*') === false) && (stripos($field, ' as ') === false)) { $str_fields .= "`$field`,"; - } - else { + } else { $str_fields .= "$field,"; } } - $str_fields = substr($str_fields, 0, -1); - } - elseif (is_null($fields)) { + $str_fields = substr($str_fields, 0, - 1); + } elseif (is_null($fields)) { $str_fields = "*"; } @@ -1319,27 +1306,27 @@ class db_helper * Function to create the where statement for the SQL * * @param array $where - * Two-dimensional array to use to build the where clause + * Two-dimensional array to use to build the where clause * - * - * array(
- *   array(
- *     'field' => 'field_name',
- *     'op' => '=', // (common operations or IN, BETWEEN, LIKE, NOT_LIKE, IS, & IS_NOT constants)
- *     'value' => 'field_value',
- *     'sql_op' => 'AND', // NOT required for first element (common SQL operators AND, OR, NOR)
- *     'open-paren' => true, // optional to add a paren '(' BEFORE clause
- *     'close-paren' => true, // optional to add a paren ')' AFTER clause
- *     'low' => '1', // LOW value only used in BETWEEN clause
- *     'high' => '100', // HIGH value only used in BETWEEN clause
- *     'case_insensitive' => true // optional boolean to set the parameters to LOWER to do case insenstive comparison - *   ),
- *   array(
- *     ...
- *   ),
- *   ...
- * ) - *
+ * + * array(
+ *   array(
+ *     'field' => 'field_name',
+ *     'op' => '=', // (common operations or IN, BETWEEN, LIKE, NOT_LIKE, IS, & IS_NOT constants)
+ *     'value' => 'field_value',
+ *     'sql_op' => 'AND', // NOT required for first element (common SQL operators AND, OR, NOR)
+ *     'open-paren' => true, // optional to add a paren '(' BEFORE clause
+ *     'close-paren' => true, // optional to add a paren ')' AFTER clause
+ *     'low' => '1', // LOW value only used in BETWEEN clause
+ *     'high' => '100', // HIGH value only used in BETWEEN clause
+ *     'case_insensitive' => true // optional boolean to set the parameters to LOWER to do case insenstive comparison + *   ),
+ *   array(
+ *     ...
+ *   ),
+ *   ...
+ * ) + *
* * @return string */ @@ -1348,11 +1335,10 @@ class db_helper $ret = " WHERE"; foreach ($where as $x => $w) { - if (!isset($w['field']) && isset($w['close-paren']) && $w['close-paren']) { + if (! isset($w['field']) && isset($w['close-paren']) && $w['close-paren']) { $ret .= ")"; continue; - } - elseif (!isset($w['field']) || ($x > 0 && !isset($w['sql_op']))) { + } elseif (! isset($w['field']) || ($x > 0 && ! isset($w['sql_op']))) { continue; } @@ -1364,51 +1350,47 @@ class db_helper $ret .= " ("; } - if ((strpos($w['field'], '`') === false) && - (strpos($w['field'], '.') === false) && - (strpos($w['field'], '*') === false) && - (stripos($w['field'], ' as ') === false)) { + if ((strpos($w['field'], '`') === false) && (strpos($w['field'], '.') === false) && (strpos($w['field'], '*') === false) && (stripos($w['field'], ' as ') === false)) { $field = "`{$w['field']}`"; - } - else { + } else { $field = $w['field']; } $not = null; - if (isset($w['op']) && in_array($w['op'], array(IS_NOT, NOT_LIKE, NOT_IN))) { + if (isset($w['op']) && in_array($w['op'], array( + IS_NOT, + NOT_LIKE, + NOT_IN + ))) { $not = ' NOT'; } if (isset($w['op']) && ($w['op'] == LIKE || $w['op'] == NOT_LIKE)) { $ret .= " {$field}{$not} LIKE {$w['value']}"; - } - elseif (isset($w['op']) && ($w['op'] == IN || $w['op'] == NOT_IN) && is_string($w['value'])) { + } elseif (isset($w['op']) && ($w['op'] == IN || $w['op'] == NOT_IN) && is_string($w['value'])) { $ret .= " {$field}{$not} IN " . (strpos($w['value'], '(') !== false ? $w['value'] : "({$w['value']})"); - } - elseif (isset($w['op']) && ($w['op'] == IN || $w['op'] == NOT_IN) && is_array($w['value'])) { - $ret .= " {$field}{$not} IN (" . implode(",", array_map(array($this, '_escape'), $w['value'])) . ")"; - } - elseif (isset($w['op']) && $w['op'] == BETWEEN) { - if (!isset($w['low']) && !isset($w['high'])) { + } elseif (isset($w['op']) && ($w['op'] == IN || $w['op'] == NOT_IN) && is_array($w['value'])) { + $ret .= " {$field}{$not} IN (" . implode(",", array_map(array( + $this, + '_escape' + ), $w['value'])) . ")"; + } elseif (isset($w['op']) && $w['op'] == BETWEEN) { + if (! isset($w['low']) && ! isset($w['high'])) { continue; } $ret .= " {$field} BETWEEN {$this->_escape($w['low'])} AND {$this->_escape($w['high'])}"; - } - elseif (isset($w['op']) && ($w['op'] == IS || $w['op'] == IS_NOT)) { + } elseif (isset($w['op']) && ($w['op'] == IS || $w['op'] == IS_NOT)) { $ret .= " {$field} IS{$not} {$this->_escape($w['value'])}"; - } - else { + } else { $op = "="; if (isset($w['op'])) { $op = $w['op']; } if (isset($w['case_insensitive']) && $w['case_insensitive']) { $ret .= " LOWER({$field}) {$op} LOWER({$this->_escape($w['value'])})"; - } - elseif (preg_match("/\(SELECT/", $w['value'])) { + } elseif (preg_match("/\(SELECT/", $w['value'])) { $ret .= " {$field} {$op} {$w['value']}"; - } - else { + } else { $ret .= " {$field} {$op} {$this->_escape($w['value'])}"; } } @@ -1427,20 +1409,20 @@ class db_helper * Function to parse the flags * * @param array $flags - * Two-dimensional array to added flags + * Two-dimensional array to added flags * - * - * array( - *   'table_joins' => array( - *     "JOIN table2 t2 ON t2.id=t1.id" - *   ), - *   'group' => 'field', - *   'having' => 'field', - *   'order' => 'field', - *   'start' => 0, - *   'limit' => 0 - * ) - * + * + * array( + *   'table_joins' => array( + *     "JOIN table2 t2 ON t2.id=t1.id" + *   ), + *   'group' => 'field', + *   'having' => 'field', + *   'order' => 'field', + *   'start' => 0, + *   'limit' => 0 + * ) + * * * @see db_helper::groups() * @see db_helper::having() @@ -1491,8 +1473,7 @@ class db_helper foreach ($groups as $grp) { $ret .= " $grp"; } - } - elseif (is_string($groups)) { + } elseif (is_string($groups)) { $ret .= " GROUP BY {$groups}"; } @@ -1503,15 +1484,14 @@ class db_helper * Function to parse SQL HAVING statements * * @param mixed $having - * - * return string + * return string */ private function having($having) { $ret = " HAVING"; - $x = 0; + $x = 0; foreach ($having as $h) { - if (!isset($h['field']) || ($x > 0 && !isset($h['sql_op']))) { + if (! isset($h['field']) || ($x > 0 && ! isset($h['sql_op']))) { continue; } @@ -1521,27 +1501,21 @@ class db_helper if ($h['op'] == LIKE) { $ret .= " {$h['field']} LIKE {$h['value']}"; - } - elseif ($h['op'] == IN && is_string($h['value'])) { + } elseif ($h['op'] == IN && is_string($h['value'])) { $ret .= " {$h['field']} IN {$h['value']}"; - } - elseif ($h['op'] == IN && is_array($h['value'])) { + } elseif ($h['op'] == IN && is_array($h['value'])) { $ret .= " {$h['field']} IN ('" . implode("', '", $h['value']) . "')"; - } - elseif ($h['op'] == BETWEEN) { + } elseif ($h['op'] == BETWEEN) { $ret .= " {$h['field']} BETWEEN {$this->_escape($h['low'])} AND {$this->_escape($h['high'])}"; - } - elseif ($h['op'] == IS) { + } elseif ($h['op'] == IS) { $ret .= " {$h['field']} IS {$this->_escape($h['value'])}"; - } - elseif ($h['op'] == IS_NOT) { + } elseif ($h['op'] == IS_NOT) { $ret .= " {$h['field']} IS NOT {$this->_escape($h['value'])}"; - } - else { + } else { $ret .= " {$h['field']} {$h['op']} {$this->_escape($h['value'])}"; } - $x++; + $x ++; } return $ret; @@ -1564,9 +1538,8 @@ class db_helper $ret .= " {$ord['field']} {$ord['sort']},"; } - $ret = substr($ret, 0, -1); - } - elseif (is_string($order)) { + $ret = substr($ret, 0, - 1); + } elseif (is_string($order)) { $ret .= " ORDER BY {$order}"; } @@ -1586,17 +1559,15 @@ class db_helper return; } - if (!is_a($args[0], "mysqli")) { + if (! is_a($args[0], "mysqli")) { return; - } - else { + } else { $conn = $args[0]; } - if (!is_string($args[1])) { + if (! is_string($args[1])) { return; - } - else { + } else { $sql = $args[1]; } @@ -1607,12 +1578,12 @@ class db_helper } } - if (!$stmt = $conn->prepare($sql)) { + if (! $stmt = $conn->prepare($sql)) { print $conn->error . PHP_EOL; return; } - if (!$stmt->execute()) { + if (! $stmt->execute()) { print "Execution of prepared statement failed: (" . $stmt->errno . ") " . $stmt->error . PHP_EOL; return false; } @@ -1629,23 +1600,21 @@ class db_helper { $args = func_get_args(); $conn = null; - $ret = []; + $ret = []; if (is_array($args) && count($args) < 2) { return; } - if (!is_a($args[0], "mysqli")) { + if (! is_a($args[0], "mysqli")) { return; - } - else { + } else { $conn = $args[0]; } - if (!is_string($args[1])) { + if (! is_string($args[1])) { return; - } - else { + } else { $sql = $args[1]; } @@ -1656,40 +1625,42 @@ class db_helper } } - if (!$stmt = $conn->prepare($sql)) { + if (! $stmt = $conn->prepare($sql)) { print $conn->error . PHP_EOL; return; } - if (!$stmt->execute()) { + if (! $stmt->execute()) { print "Execution of prepared statement failed: (" . $stmt->errno . ") " . $stmt->error . PHP_EOL; return; } - $meta = $stmt->result_metadata(); - $fields = $fieldNames = []; + $meta = $stmt->result_metadata(); + $fields = $fieldNames = []; while ($field = $meta->fetch_field()) { - $fieldNames[] = $var = $field->name; - $$var = null; + $fieldNames[] = $var = $field->name; + $$var = null; $fields[$var] = &$$var; } $fieldCount = (is_array($fieldNames) ? count($fieldNames) : 0); - call_user_func_array(array($stmt, "bind_result"), $fields); + call_user_func_array(array( + $stmt, + "bind_result" + ), $fields); $i = 0; while ($stmt->fetch()) { - for ($r = 0; $r < $fieldCount; $r++) { + for ($r = 0; $r < $fieldCount; $r ++) { $ret[$i][$fieldNames[$r]] = $fields[$fieldNames[$r]]; } } if (is_array($ret) && count($ret) == 1) { return $ret[0]; - } - else { + } else { return $ret; } } @@ -1702,23 +1673,21 @@ class db_helper { $args = func_get_args(); $conn = null; - $sql = ''; + $sql = ''; if (is_array($args) && count($args) < 3) { return; } - if (!is_a($args[0], "mysqli")) { + if (! is_a($args[0], "mysqli")) { return; - } - else { + } else { $conn = $args[0]; } - if (!is_string($args[1])) { + if (! is_string($args[1])) { return; - } - else { + } else { $sql = $args[1]; } @@ -1757,26 +1726,106 @@ class db * Array of words to be removed */ private $DISALLOWED = array( - 'the', 'be', 'to', 'of', 'and', - 'a', 'in', 'that', 'have', 'I', - 'it', 'for', 'not', 'on', 'with', - 'he', 'as', 'you', 'do', 'at', - 'this', 'but', 'his', 'by', 'from', - 'they', 'we', 'say', 'her', 'she', - 'or', 'an', 'will', 'my', 'one', - 'all', 'would', 'there', 'their', 'what', - 'so', 'up', 'out', 'if', 'about', - 'who', 'get', 'which', 'go', 'me', - 'when', 'make', 'can', 'like', 'time', - 'no', 'just', 'him', 'know', 'take', - 'people', 'into', 'year', 'your', 'good', - 'some', 'could', 'them', 'see', 'other', - 'than', 'then', 'now', 'look', 'only', - 'come', 'its', 'over', 'think', 'also', - 'back', 'after', 'use', 'two', 'how', - 'our', 'work', 'first', 'well', 'way', - 'even', 'new', 'want', 'because', 'any', - 'these', 'give', 'day', 'most', 'us' + 'the', + 'be', + 'to', + 'of', + 'and', + 'a', + 'in', + 'that', + 'have', + 'I', + 'it', + 'for', + 'not', + 'on', + 'with', + 'he', + 'as', + 'you', + 'do', + 'at', + 'this', + 'but', + 'his', + 'by', + 'from', + 'they', + 'we', + 'say', + 'her', + 'she', + 'or', + 'an', + 'will', + 'my', + 'one', + 'all', + 'would', + 'there', + 'their', + 'what', + 'so', + 'up', + 'out', + 'if', + 'about', + 'who', + 'get', + 'which', + 'go', + 'me', + 'when', + 'make', + 'can', + 'like', + 'time', + 'no', + 'just', + 'him', + 'know', + 'take', + 'people', + 'into', + 'year', + 'your', + 'good', + 'some', + 'could', + 'them', + 'see', + 'other', + 'than', + 'then', + 'now', + 'look', + 'only', + 'come', + 'its', + 'over', + 'think', + 'also', + 'back', + 'after', + 'use', + 'two', + 'how', + 'our', + 'work', + 'first', + 'well', + 'way', + 'even', + 'new', + 'want', + 'because', + 'any', + 'these', + 'give', + 'day', + 'most', + 'us' ); /** @@ -1805,24 +1854,23 @@ class db /** * Constructor function to instantiate a new DB object and connection * - * @param bool $persistent [optional] + * @param bool $persistent + * [optional] */ public function __construct($persistent = false) { // attempt to create a new database connection $host = ($persistent ? "p:" : "") . DB_SERVER; if (class_exists('mysqli')) { - $pwd = self::decrypt_pwd(); + $pwd = self::decrypt_pwd(); $this->conn = new mysqli($host, 'web', $pwd, 'sagacity'); - } - else { + } else { die("Could not find the mysqli class"); } // if there is a problem output that if ($this->conn->connect_errno && $this->conn->connect_errno == 1045) { die("Invalid database username and/or password"); - } - elseif ($this->conn->connect_errno) { + } elseif ($this->conn->connect_errno) { error_log("Error connecting to " . DB_SERVER . " " . $this->conn->connect_error); die("Error connecting to " . DB_SERVER); } @@ -1841,12 +1889,12 @@ class db */ public static function decrypt_pwd() { - if (!file_exists(DOC_ROOT . "/" . PWD_FILE)) { + if (! file_exists(DOC_ROOT . "/" . PWD_FILE)) { die("Cannot connect to the database because the password file does not exist"); } $enc_pwd = file_get_contents(DOC_ROOT . "/" . PWD_FILE); - $pwd = my_decrypt($enc_pwd); + $pwd = my_decrypt($enc_pwd); return $pwd; } @@ -1854,8 +1902,7 @@ class db /** * Get the ID of the last command that was executed * - * @return integer - * The integer of the last primary key id inserted into whatever table + * @return integer The integer of the last primary key id inserted into whatever table */ public function get_Last_Insert_ID() { @@ -1866,26 +1913,25 @@ class db /** * Function to get an advisory from the database * - * @param string $advisory_id [optional] - * String with advisory ID to specifically find + * @param string $advisory_id + * [optional] + * String with advisory ID to specifically find * - * @return array:advisory|NULL - * Returns array of advisory objects or NULL if nothing is found in the database + * @return array:advisory|NULL Returns array of advisory objects or NULL if nothing is found in the database */ public function get_Advisory($advisory_id = null) { $ret = []; - if (!is_null($advisory_id)) { + if (! is_null($advisory_id)) { $this->help->select("sagacity.advisories", null, array( array( 'field' => 'advisory_id', - 'op' => '=', + 'op' => '=', 'value' => $advisory_id ) )); - } - else { + } else { $this->help->select("sagacity.advisories", null, []); } @@ -1894,8 +1940,7 @@ class db $ret[] = new advisory($row['pdi_id'], $row['advisory_id'], $row['reference'], $row['type'], $row['url']); } return $ret; - } - else { + } else { Sagacity_Error::sql_handler($this->help->sql); $this->help->debug(E_ERROR); } @@ -1906,10 +1951,9 @@ class db * Update or insert an advisory * * @param array:advisory $advisories - * Array of advisory class objects to save/update to database + * Array of advisory class objects to save/update to database * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function save_Advisory($advisories) { @@ -1937,7 +1981,7 @@ class db $this->help->extended_replace("sagacity.advisories", $fields, $values); - if (!$this->help->execute()) { + if (! $this->help->execute()) { Sagacity_Error::sql_handler($this->help->sql); $this->help->debug(E_ERROR); @@ -1952,21 +1996,21 @@ class db /** * Get ST&E category data * - * @param integer $int_Cat_ID [optional] - * Grab specific ste_cat from database (default NULL) + * @param integer $int_Cat_ID + * [optional] + * Grab specific ste_cat from database (default NULL) * - * @return array:ste_cat|NULL - * Returns an array of categories that are applicable to the specific ST&E or a specifically requested category + * @return array:ste_cat|NULL Returns an array of categories that are applicable to the specific ST&E or a specifically requested category */ public function get_Category($int_Cat_ID = null) { $where = []; - $ret = []; + $ret = []; if ($int_Cat_ID != null) { $where[] = [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $int_Cat_ID ]; } @@ -1975,23 +2019,29 @@ class db $cats = $this->help->execute(); if (is_array($cats) && count($cats) && isset($cats['id'])) { - $cats = [0 => $cats]; + $cats = [ + 0 => $cats + ]; } if (is_array($cats) && count($cats)) { foreach ($cats as $cat) { $tmp = new ste_cat($cat['id'], $cat['ste_id'], $cat['name'], $cat['analysts']); - $this->help->select("ste_cat_sources", ['src_id'], [ + $this->help->select("ste_cat_sources", [ + 'src_id' + ], [ [ 'field' => 'cat_id', - 'op' => '=', + 'op' => '=', 'value' => $cat['id'] ] ]); $srcs = $this->help->execute(); if (is_array($srcs) && count($srcs) && isset($srcs['src_id'])) { - $srcs = [0 => $srcs]; + $srcs = [ + 0 => $srcs + ]; } if (is_array($srcs) && count($srcs)) { @@ -2011,30 +2061,33 @@ class db /** * Function to automatically put targets in categories by operating systems
- * Skips generic OS's and targets that already assigned + * Skips generic OS's and targets that already assigned * * @param int $ste_id */ public function auto_Catorgize_Targets($ste_id) { - $this->help->select("sagacity.target t", ['t.id', 't.os_string'], [ + $this->help->select("sagacity.target t", [ + 't.id', + 't.os_string' + ], [ [ 'field' => 't.ste_id', 'value' => $ste_id ], [ - 'field' => 't.cat_id', - 'op' => IS, - 'value' => null, + 'field' => 't.cat_id', + 'op' => IS, + 'value' => null, 'sql_op' => 'AND' ], [ - 'field' => 's.cpe', - 'op' => '!=', - 'value' => 'cpe:/o:generic:generic:-', + 'field' => 's.cpe', + 'op' => '!=', + 'value' => 'cpe:/o:generic:generic:-', 'sql_op' => 'AND' ] - ], [ + ], [ 'table_joins' => [ 'JOIN sagacity.software s ON t.os_id=s.id' ] @@ -2042,20 +2095,24 @@ class db $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { foreach ($rows as $row) { $id = 0; - $this->help->select("sagacity.ste_cat", ['id'], [ + $this->help->select("sagacity.ste_cat", [ + 'id' + ], [ [ 'field' => 'ste_id', 'value' => $ste_id ], [ - 'field' => 'name', - 'value' => trim($row['os_string']), + 'field' => 'name', + 'value' => trim($row['os_string']), 'sql_op' => 'AND' ] ]); @@ -2063,17 +2120,18 @@ class db $tmp = $this->help->execute(); if (is_array($tmp) && count($tmp) && isset($tmp['id'])) { $id = $tmp['id']; - } - else { + } else { $this->help->insert("sagacity.ste_cat", [ 'ste_id' => $ste_id, - 'name' => trim($row['os_string']) - ], true); + 'name' => trim($row['os_string']) + ], true); $id = $this->help->execute(); } if ($id) { - $this->help->update("sagacity.target", ['cat_id' => $id], [ + $this->help->update("sagacity.target", [ + 'cat_id' => $id + ], [ [ 'field' => 'id', 'value' => $row['id'] @@ -2090,38 +2148,36 @@ class db * * @param ste_cat $ste_cat_in * - * @return mixed - * Returns FALSE if failed, otherwise the ID of the newly inserted category + * @return mixed Returns FALSE if failed, otherwise the ID of the newly inserted category */ public function save_Category($ste_cat_in) { if (is_null($ste_cat_in->get_ID())) { $this->help->insert("sagacity.ste_cat", array( - 'ste_id' => $ste_cat_in->get_STE_ID(), - 'name' => $ste_cat_in->get_Name(), + 'ste_id' => $ste_cat_in->get_STE_ID(), + 'name' => $ste_cat_in->get_Name(), 'analysts' => $ste_cat_in->get_Analyst() )); - if (!($cat_id = $this->help->execute())) { + if (! ($cat_id = $this->help->execute())) { $this->help->debug(E_ERROR); return false; } $ste_cat_in->set_ID($cat_id); - } - else { + } else { $this->help->update("sagacity.ste_cat", array( - 'name' => $ste_cat_in->get_Name(), + 'name' => $ste_cat_in->get_Name(), 'analysts' => $ste_cat_in->get_Analyst() - ), array( + ), array( array( 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $ste_cat_in->get_ID() ) )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -2131,7 +2187,7 @@ class db $this->help->delete("ste_cat_sources", null, [ [ 'field' => 'cat_id', - 'op' => '=', + 'op' => '=', 'value' => $ste_cat_in->get_ID() ] ]); @@ -2139,9 +2195,15 @@ class db $srcs = []; foreach ($ste_cat_in->get_Sources() as $src) { - $srcs[] = [$ste_cat_in->get_ID(), $src->get_ID()]; + $srcs[] = [ + $ste_cat_in->get_ID(), + $src->get_ID() + ]; } - $this->help->extended_insert("ste_cat_sources", ['cat_id', 'src_id'], $srcs); + $this->help->extended_insert("ste_cat_sources", [ + 'cat_id', + 'src_id' + ], $srcs); $this->help->execute(); } @@ -2152,24 +2214,25 @@ class db * This function renames a category * * @param integer $intOldCat - * Category ID of the category to rename + * Category ID of the category to rename * @param string $strNewCatName - * New name for the category + * New name for the category * - * @return boolean - * Return TRUE if successful, otherwise FALSE + * @return boolean Return TRUE if successful, otherwise FALSE */ public function rename_Cat($intOldCat, $strNewCatName) { - $this->help->update("sagacity.ste_cat", array('name' => $strNewCatName), array( + $this->help->update("sagacity.ste_cat", array( + 'name' => $strNewCatName + ), array( array( 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $intOldCat ) )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -2181,22 +2244,23 @@ class db * This function deletes a category and assigns the targets to "Unassigned" * * @param integer $intCat - * ID of the category to delete + * ID of the category to delete * - * @return boolean - * Return TRUE if successful, otherwise FALSE + * @return boolean Return TRUE if successful, otherwise FALSE */ public function delete_Cat($intCat) { - $this->help->update("sagacity.target", array('cat_id' => null), array( + $this->help->update("sagacity.target", array( + 'cat_id' => null + ), array( array( 'field' => 'cat_id', - 'op' => '=', + 'op' => '=', 'value' => $intCat ) )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -2204,12 +2268,12 @@ class db $this->help->delete("sagacity.ste_cat_sources", null, array( array( 'field' => 'cat_id', - 'op' => '=', + 'op' => '=', 'value' => $intCat ) )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -2217,12 +2281,12 @@ class db $this->help->delete("sagacity.category_interview", null, array( array( 'field' => 'cat_id', - 'op' => '=', + 'op' => '=', 'value' => $intCat ) )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -2230,12 +2294,12 @@ class db $this->help->delete("sagacity.ste_cat", null, array( array( 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $intCat ) )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -2247,24 +2311,25 @@ class db * This function sets the analyst that is in charge of this category * * @param integer $intCat - * Category ID to update + * Category ID to update * @param string $strAnalyst - * Name of the analyst + * Name of the analyst * - * @return boolean - * Return TRUE if successful, otherwise FALSE + * @return boolean Return TRUE if successful, otherwise FALSE */ public function assign_Analyst_To_Category($intCat, $strAnalyst) { $analysts = strtolower($strAnalyst) == 'none' ? null : $strAnalyst; - $this->help->update("sagacity.ste_cat", array('analysts' => $analysts), array( + $this->help->update("sagacity.ste_cat", array( + 'analysts' => $analysts + ), array( array( 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $intCat ) )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -2276,24 +2341,25 @@ class db * This function does the move of a tgt to a new category * * @param array:integer $arrTgts - * Array of integer ID for each target to move + * Array of integer ID for each target to move * @param integer $intCat - * Category ID to reassign them to + * Category ID to reassign them to * - * @return boolean - * Return TRUE if successful, otherwise FALSE + * @return boolean Return TRUE if successful, otherwise FALSE */ public function move_Tgt_To_Cat($arrTgts, $intCat) { - $this->help->update("sagacity.target", array('cat_id' => $intCat), array( + $this->help->update("sagacity.target", array( + 'cat_id' => $intCat + ), array( array( 'field' => 'id', - 'op' => IN, + 'op' => IN, 'value' => $arrTgts ) )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -2307,28 +2373,33 @@ class db * Getter function for CCE * * @param string $cce_id - * CCE ID to query for + * CCE ID to query for * * @return array:cce */ public function get_CCE($cce_id = null) { - $ret = []; + $ret = []; $where = []; - if (!is_null($cce_id)) { + if (! is_null($cce_id)) { $where[] = array( 'field' => 'cce_id', - 'op' => '=', + 'op' => '=', 'value' => $cce_id ); } - $this->help->select("sagacity.cce", array('pdi_id', 'cce_id'), $where); + $this->help->select("sagacity.cce", array( + 'pdi_id', + 'cce_id' + ), $where); $cces = $this->help->execute(); if (is_array($cces) && count($cces) && isset($cces['pdi_id'])) { - $cces = array(0 => $cces); + $cces = array( + 0 => $cces + ); } if (is_array($cces) && count($cces) && isset($cces[0])) { @@ -2344,36 +2415,40 @@ class db * Function to save CCE's to database * * @param array:cce|cce $cces - * An array of CCE's that need to be saved + * An array of CCE's that need to be saved * - * @return boolean - * Returns TRUE if save was successful, otherwise FALSE + * @return boolean Returns TRUE if save was successful, otherwise FALSE */ public function save_CCE($cces) { - $ret = true; - $fields = array('pdi_id', 'cce_id'); + $ret = true; + $fields = array( + 'pdi_id', + 'cce_id' + ); $params = []; if (is_array($cces)) { foreach ($cces as $cce) { - $params[] = [$cce->get_PDI_ID(), $cce->get_CCE_ID()]; + $params[] = [ + $cce->get_PDI_ID(), + $cce->get_CCE_ID() + ]; } $this->help->extended_replace("sagacity.cce", $fields, $params); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); $ret = false; } - } - else { + } else { $this->help->replace("sagacity.cce", array( 'pdi_id' => $cces->get_PDI_ID(), 'cce_id' => $cces->get_CCE_ID() )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); $ret = false; } @@ -2390,11 +2465,11 @@ class db $this->help->select("sagacity.cci"); - if (!is_null($cci_id)) { + if (! is_null($cci_id)) { $this->help->select("sagacity.cci", null, array( array( 'field' => 'cci_id', - 'op' => '=', + 'op' => '=', 'value' => $cci_id ) )); @@ -2404,28 +2479,28 @@ class db if (is_array($ccis) && count($ccis)) { foreach ($ccis as $cci_data) { - $cci = new cci(); - $cci->cci_id = $cci_data['cci_id']; + $cci = new cci(); + $cci->cci_id = $cci_data['cci_id']; $cci->definition = $cci_data['definition']; - $cci->type = $cci_data['type']; - $cci->param = $cci_data['param']; - $cci->note = $cci_data['note']; + $cci->type = $cci_data['type']; + $cci->param = $cci_data['param']; + $cci->note = $cci_data['note']; $this->help->select("sagacity.cci_refs", null, array( array( 'field' => 'cci_id', - 'op' => '=', + 'op' => '=', 'value' => $cci_data['cci_id'] ) )); $refs = $this->help->execute(); if (is_array($refs) && count($refs)) { foreach ($refs as $ref_data) { - $ref = new cci_reference(); + $ref = new cci_reference(); $ref->index = $ref_data['index']; - $ref->url = $ref_data['url']; + $ref->url = $ref_data['url']; $ref->title = $ref_data['title']; - $ref->ver = $ref_data['ver']; + $ref->ver = $ref_data['ver']; $cci->refs[] = $ref; } @@ -2433,8 +2508,7 @@ class db $ret[] = $cci; } - } - else { + } else { $this->help->debug(E_ERROR); } @@ -2443,10 +2517,10 @@ class db /** * Get eMASS CCI Map + * * @author Matt Shuter * - * @return array - * Array of CCI-eMASS control mappings + * @return array Array of CCI-eMASS control mappings */ public function get_EMASS_CCIs() { @@ -2478,22 +2552,26 @@ class db ]; } $this->help->extended_insert('rmf.cci', array( - 'id', 'control_id', 'enh_id', 'def', 'guidance', 'procedure' - ), $ccis, true); - } - else { + 'id', + 'control_id', + 'enh_id', + 'def', + 'guidance', + 'procedure' + ), $ccis, true); + } else { $cci_id = preg_replace("/CCI\-[0]+/", "CCI-", $cci_in->cci_id); $this->help->insert('rmf.cci', array( - 'cci_id' => $cci_id, + 'cci_id' => $cci_id, 'control_id' => $cci_in->control_id, - 'enh_id' => $cci_in->enh_id, - 'def' => $cci_in->definition, - 'guidance' => $cci_in->guidance, - 'procedure' => $cci_in->procedure - ), true); + 'enh_id' => $cci_in->enh_id, + 'def' => $cci_in->definition, + 'guidance' => $cci_in->guidance, + 'procedure' => $cci_in->procedure + ), true); } - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -2510,14 +2588,16 @@ class db */ public function save_EMASS_CCIs($ccis_in) { - $ret = false; - $columns = array('id', 'control'); + $ret = false; + $columns = array( + 'id', + 'control' + ); $this->help->extended_insert('rmf.emass_cci', $columns, $ccis_in, true); if ($this->help->execute()) { $ret = true; - } - else { + } else { $this->help->debug(E_ERROR); } @@ -2529,13 +2609,14 @@ class db /** * Get a checklist * - * @param mixed $Checklist_ID [optional] - * Checklist ID to query for (default NULL) - * @param boolean $ord_desc [optional] - * Decide if you want to order to return from newest release + * @param mixed $Checklist_ID + * [optional] + * Checklist ID to query for (default NULL) + * @param boolean $ord_desc + * [optional] + * Decide if you want to order to return from newest release * - * @return array:checklist - * Returns an array of checklists, or an empty array if none found + * @return array:checklist Returns an array of checklists, or an empty array if none found */ public function get_Checklist($Checklist_ID = null, $ord_desc = false) { @@ -2554,60 +2635,57 @@ class db 'type', 'icon' ]); - } - else { + } else { $this->help->select("sagacity.checklist", null); } $where = []; - if (!is_null($Checklist_ID)) { + if (! is_null($Checklist_ID)) { if (is_numeric($Checklist_ID)) { $where[] = [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $Checklist_ID ]; - } - elseif (is_array($Checklist_ID)) { + } elseif (is_array($Checklist_ID)) { if (isset($Checklist_ID['checklist_id'])) { $where[] = [ 'field' => 'checklist_id', - 'op' => '=', + 'op' => '=', 'value' => $Checklist_ID['checklist_id'] ]; } if (isset($Checklist_ID['type'])) { $where[] = [ - 'field' => 'type', - 'op' => '=', - 'value' => $Checklist_ID['type'], + 'field' => 'type', + 'op' => '=', + 'value' => $Checklist_ID['type'], 'sql_op' => 'AND' ]; } if (isset($Checklist_ID['version'])) { $where[] = [ - 'field' => 'ver', - 'op' => '=', - 'value' => $Checklist_ID['version'], + 'field' => 'ver', + 'op' => '=', + 'value' => $Checklist_ID['version'], 'sql_op' => 'AND' ]; } if (isset($Checklist_ID['release'])) { $where[] = [ - 'field' => 'release', - 'op' => '=', - 'value' => $Checklist_ID['release'], + 'field' => 'release', + 'op' => '=', + 'value' => $Checklist_ID['release'], 'sql_op' => 'AND' ]; } - } - else { + } else { $where[] = [ 'field' => 'checklist_id', - 'op' => '=', + 'op' => '=', 'value' => $Checklist_ID ]; } @@ -2622,20 +2700,43 @@ class db $flags = [ 'group' => 'type', 'order' => [ - ['field' => 'name', 'sort' => 'asc'], - ['field' => 'type', 'sort' => 'asc'], - ['field' => 'ver', 'sort' => 'desc'], - ['field' => 'LPAD(`release`,2,0)', 'sort' => 'desc'] + [ + 'field' => 'name', + 'sort' => 'asc' + ], + [ + 'field' => 'type', + 'sort' => 'asc' + ], + [ + 'field' => 'ver', + 'sort' => 'desc' + ], + [ + 'field' => 'LPAD(`release`,2,0)', + 'sort' => 'desc' + ] ] ]; - } - else { + } else { $flags = [ 'order' => [ - ['field' => 'name', 'sort' => 'asc'], - ['field' => 'type', 'sort' => 'asc'], - ['field' => 'ver', 'sort' => 'asc'], - ['field' => 'LPAD(`release`,2,0)', 'sort' => 'asc'] + [ + 'field' => 'name', + 'sort' => 'asc' + ], + [ + 'field' => 'type', + 'sort' => 'asc' + ], + [ + 'field' => 'ver', + 'sort' => 'asc' + ], + [ + 'field' => 'LPAD(`release`,2,0)', + 'sort' => 'asc' + ] ] ]; } @@ -2646,32 +2747,32 @@ class db $rows = $this->help->execute(); if (isset($rows['id'])) { - $rows = array(0 => $rows); + $rows = array( + 0 => $rows + ); } if (is_array($rows) && count($rows)) { foreach ($rows as $row) { - $chk = new checklist( - $row['id'], $row['checklist_id'], $row['name'], $row['description'], $row['date'], $row['file_name'], $row['ver'], $row['release'], $row['type'], $row['icon'] - ); + $chk = new checklist($row['id'], $row['checklist_id'], $row['name'], $row['description'], $row['date'], $row['file_name'], $row['ver'], $row['release'], $row['type'], $row['icon']); /* - $this->help->select("sagacity.checklist_software_lookup", array('sw_id'), array( - array( - 'field' => 'chk_id', - 'op' => '=', - 'value' => $row['id'] - ) - )); - $sw_rows = $this->help->execute(); - if (count($sw_rows)) { - if (isset($sw_rows['sw_id'])) { - $sw_rows = array(0 => $sw_rows); - } - - foreach ($sw_rows as $row2) { - $chk->add_SW($this->get_Software($row2['sw_id'])); - } - } + * $this->help->select("sagacity.checklist_software_lookup", array('sw_id'), array( + * array( + * 'field' => 'chk_id', + * 'op' => '=', + * 'value' => $row['id'] + * ) + * )); + * $sw_rows = $this->help->execute(); + * if (count($sw_rows)) { + * if (isset($sw_rows['sw_id'])) { + * $sw_rows = array(0 => $sw_rows); + * } + * + * foreach ($sw_rows as $row2) { + * $chk->add_SW($this->get_Software($row2['sw_id'])); + * } + * } */ $ret[] = $chk; } @@ -2679,6 +2780,36 @@ class db return $ret; } + + /** + * Function to get the checklists by the checklist name in an eChecklist file + * + * @param array:string $chk_arr + * + * @return array:checklist + */ + public function get_Checklist_By_Name($chk_arr) + { + $ret = []; + $this->help->select("checklist", null, [ + [ + 'field' => "CONCAT(`name`, ' V', `ver`, 'R', `release`, ' (', `type`, ')')", + 'op' => IN, + 'value' => $chk_arr, + 'backticks' => false + ] + ]); + $rows = $this->help->execute(); + if(is_array($rows) && count($rows) && isset($rows[0])) { + foreach($rows as $row) { + $ret[] = new checklist($row['id'], $row['checklist_id'], $row['name'], $row['description'], new DateTime($row['date']), $row['file_name'], $row['ver'], $row['release'], $row['type'], $row['icon']); + } + } elseif(is_array($rows) && count($rows) && isset($rows['id'])) { + $ret = new checklist($rows['id'], $rows['checklist_id'], $rows['name'], $rows['description'], new DateTime($rows['date']), $rows['file_name'], $rows['ver'], $rows['release'], $rows['type'], $rows['icon']); + } + + return $ret; + } /** * Function to get the checklist based on the checklist filename @@ -2699,23 +2830,29 @@ class db $rows = $this->help->execute(); if (isset($rows['id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { foreach ($rows as $row) { - $chk = new checklist($row['id'], $row['checklist_id'], $row['name'], $row['description'], $row['date'], $row['file_name'], $row['ver'], $row['release'], $row['type'], $row['icon']); - /**/ - $this->help->select("sagacity.checklist_software_lookup", ['sw_id'], [ + $chk = new checklist($row['id'], $row['checklist_id'], $row['name'], $row['description'], $row['date'], $row['file_name'], $row['ver'], $row['release'], $row['type'], $row['icon']); + /* */ + $this->help->select("sagacity.checklist_software_lookup", [ + 'sw_id' + ], [ [ 'field' => 'chk_id', 'value' => $row['id'] ] ]); $sw_rows = $this->help->execute(); - if (count($sw_rows)) { + if (is_array($sw_rows) && count($sw_rows)) { if (isset($sw_rows['sw_id'])) { - $sw_rows = [0 => $sw_rows]; + $sw_rows = [ + 0 => $sw_rows + ]; } foreach ($sw_rows as $row2) { @@ -2734,38 +2871,41 @@ class db * Function to retrieve the most current checklist for a given software package * * @param software $software - * Software of which to look for checklists + * Software of which to look for checklists * - * @return array:checklist - * Returns an array of checklists that this software ties to. Otherwise, an empty array + * @return array:checklist Returns an array of checklists that this software ties to. Otherwise, an empty array */ public function get_Latest_Checklist_By_Software($software) { $ret = []; $this->help->create_table("c", true, $this->help->select("sagacity.checklist", null, [], array( - 'order' => '`ver` DESC, CONVERT(`release`, DECIMAL(4,2)) DESC' + 'order' => '`ver` DESC, CONVERT(`release`, DECIMAL(4,2)) DESC' ))); - if (!$this->help->execute()) { + if (! $this->help->execute()) { return $ret; } - $this->help->select("c", array('c.id'), array( + $this->help->select("c", array( + 'c.id' + ), array( array( 'field' => 'csl.sw_id', - 'op' => '=', + 'op' => '=', 'value' => $software->get_ID() ) - ), array( + ), array( 'table_joins' => array( "JOIN sagacity.checklist_software_lookup csl ON csl.chk_id=c.id" ), - 'group' => 'c.name,c.type', - 'order' => 'c.name' + 'group' => 'c.name,c.type', + 'order' => 'c.name' )); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['id'])) { - $rows = array(0 => $rows); + $rows = array( + 0 => $rows + ); } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -2784,19 +2924,20 @@ class db * Get a summary of checklist stats * * @param integer $cat_id - * Integer category ID to get the summary on + * Integer category ID to get the summary on * - * @return NULL|array:targets,checklist,string - * Returns an associative array of target (id & name), checklists, and a summary that joins the two + * @return NULL|array:targets,checklist,string Returns an associative array of target (id & name), checklists, and a summary that joins the two */ public function get_Checklist_Summary($cat_id) { - $where = array(array( + $where = array( + array( 'field' => 't.cat_id', - 'op' => (is_null($cat_id) ? IS : '='), + 'op' => (is_null($cat_id) ? IS : '='), 'value' => $cat_id - )); - $tgts = []; + ) + ); + $tgts = []; $chklsts = []; $summary = []; @@ -2804,59 +2945,73 @@ class db 'table_joins' => array( "LEFT JOIN sagacity.target t ON t.id=tc.tgt_id" ), - 'group' => 't.id' + 'group' => 't.id' )); $tgt_rows = $this->help->execute(); if (is_array($tgt_rows) && count($tgt_rows) && isset($tgt_rows['name'])) { - $tgt_rows = array(0 => $tgt_rows); + $tgt_rows = array( + 0 => $tgt_rows + ); } if (is_array($tgt_rows) && count($tgt_rows) && isset($tgt_rows[0])) { foreach ($tgt_rows as $row) { $tgts[$row['id']] = $row['name']; } - } - else { + } else { $this->help->debug(E_ERROR); } - $this->help->select("sagacity.target_checklist tc", array('c.id', 'c.name', 'c.type', 'c.ver', 'c.`release`'), $where, array( + $this->help->select("sagacity.target_checklist tc", array( + 'c.id', + 'c.name', + 'c.type', + 'c.ver', + 'c.`release`' + ), $where, array( 'table_joins' => array( "LEFT JOIN sagacity.checklist c ON tc.chk_id=c.id", "LEFT JOIN sagacity.target t ON tc.tgt_id=t.id" ), - 'group' => 'c.id', - 'order' => 'c.name' + 'group' => 'c.id', + 'order' => 'c.name' )); $chk_rows = $this->help->execute(); if (is_array($chk_rows) && count($chk_rows) && isset($chk_rows['id'])) { - $chk_rows = array(0 => $chk_rows); + $chk_rows = array( + 0 => $chk_rows + ); } if (is_array($chk_rows) && count($chk_rows) && isset($chk_rows[0])) { foreach ($chk_rows as $row) { $chklsts[$row['id']] = "{$row['name']} V{$row['ver']}R{$row['release']} (" . ($row['type'] == 'iavm' ? 'IAVM' : ucfirst($row['type'])) . ")"; } - } - else { + } else { $this->help->debug(E_ERROR); } - $this->help->select("sagacity.findings f", array("COUNT(1) as 'cnt'", 'c.id', 'c.name', 'c.ver', 'c.`release`'), array( + $this->help->select("sagacity.findings f", array( + "COUNT(1) as 'cnt'", + 'c.id', + 'c.name', + 'c.ver', + 'c.`release`' + ), array( array( 'field' => 't.cat_id', - 'op' => (is_null($cat_id) ? IS : '='), + 'op' => (is_null($cat_id) ? IS : '='), 'value' => $cat_id ), array( - 'field' => 'c.name', - 'op' => '=', - 'value' => 'Orphan', + 'field' => 'c.name', + 'op' => '=', + 'value' => 'Orphan', 'sql_op' => 'AND' ) - ), array( + ), array( 'table_joins' => array( "LEFT JOIN sagacity.target t ON t.id=f.tgt_id", "LEFT JOIN sagacity.pdi_checklist_lookup pcl ON pcl.pdi_id=f.pdi_id", @@ -2876,31 +3031,32 @@ class db $this->help->select_count("sagacity.target_checklist tc", [ [ 'field' => 'tc.tgt_id', - 'op' => '=', + 'op' => '=', 'value' => $host_key ], [ - 'field' => 'tc.chk_id', - 'op' => '=', - 'value' => $chk_key, + 'field' => 'tc.chk_id', + 'op' => '=', + 'value' => $chk_key, 'sql_op' => 'AND' ] ]); - } - else { - $this->help->select("sagacity.findings f", ["IF(COUNT(1) > 0, '1', '0')"], [ + } else { + $this->help->select("sagacity.findings f", [ + "IF(COUNT(1) > 0, '1', '0')" + ], [ [ 'field' => 'f.tgt_id', - 'op' => '=', + 'op' => '=', 'value' => $host_key ], [ - 'field' => 'c.name', - 'op' => '=', - 'value' => 'Orphan', + 'field' => 'c.name', + 'op' => '=', + 'value' => 'Orphan', 'sql_op' => 'AND' ] - ], [ + ], [ 'table_joins' => [ "LEFT JOIN sagacity.pdi_checklist_lookup pcl ON pcl.pdi_id=f.pdi_id", "LEFT JOIN sagacity.checklist c ON c.id=pcl.checklist_id" @@ -2912,14 +3068,18 @@ class db } } - return ['tgts' => $tgts, 'checklists' => $chklsts, 'summary' => $summary]; + return [ + 'tgts' => $tgts, + 'checklists' => $chklsts, + 'summary' => $summary + ]; } /** * Get all checklist & targets in a category * * @param integer $cat_id - * Category ID to pull the checklists from + * Category ID to pull the checklists from * * @return NULL|array:string checklist */ @@ -2927,23 +3087,28 @@ class db { $chklsts = []; - $this->help->select("sagacity.target_checklist tc", array('tc.tgt_id', 'tc.chk_id'), array( + $this->help->select("sagacity.target_checklist tc", array( + 'tc.tgt_id', + 'tc.chk_id' + ), array( array( 'field' => 't.cat_id', - 'op' => '=', + 'op' => '=', 'value' => $cat_id ) - ), array( + ), array( 'table_joins' => array( "LEFT JOIN sagacity.target t ON tc.tgt_id = t.id", "LEFT JOIN sagacity.checklist c ON tc.chk_id = c.id" ), - 'order' => 'c.name' + 'order' => 'c.name' )); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['tgt_id'])) { - $rows = array(0 => $rows); + $rows = array( + 0 => $rows + ); } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -2951,14 +3116,13 @@ class db $chk = $this->get_Checklist($row['chk_id']); if (is_array($chk) && count($chk) && isset($chk[0]) && is_a($chk[0], 'checklist')) { $chk = $chk[0]; - } - else { + } else { continue; } - $tgts = isset($chklsts[$chk->get_ID()]['tgts']) ? $chklsts[$chk->get_ID()]['tgts'] : null; + $tgts = isset($chklsts[$chk->get_ID()]['tgts']) ? $chklsts[$chk->get_ID()]['tgts'] : null; $chklsts[$chk->get_ID()] = array( - 'tgts' => $tgts . $row['tgt_id'] . ",", + 'tgts' => $tgts . $row['tgt_id'] . ",", 'checklist' => $chk ); } @@ -2967,16 +3131,16 @@ class db $this->help->select_count("sagacity.target t", array( array( 'field' => 't.cat_id', - 'op' => '=', + 'op' => '=', 'value' => $cat_id ), array( - 'field' => 'pcl.checklist_id', - 'op' => '=', - 'value' => "(SELECT c.id FROM sagacity.checklist c WHERE c.name='Orphan')", + 'field' => 'pcl.checklist_id', + 'op' => '=', + 'value' => "(SELECT c.id FROM sagacity.checklist c WHERE c.name='Orphan')", 'sql_op' => 'AND' ) - ), array( + ), array( 'table_joins' => array( "LEFT JOIN sagacity.findings f ON t.id=f.tgt_id", "LEFT JOIN sagacity.pdi_checklist_lookup pcl ON pcl.pdi_id=f.pdi_id" @@ -2985,29 +3149,34 @@ class db $count = $this->help->execute(); if ($count) { - $this->help->select("sagacity.target t", array("t.id AS 'tgt_id'", "pcl.checklist_id AS 'chk_id'"), array( + $this->help->select("sagacity.target t", array( + "t.id AS 'tgt_id'", + "pcl.checklist_id AS 'chk_id'" + ), array( array( 'field' => 't.cat_id', - 'op' => '=', + 'op' => '=', 'value' => $cat_id ), array( - 'field' => 'pcl.checklist_id', - 'op' => '=', - 'value' => "(SELECT c.id FROM sagacity.checklist c WHERE c.name='Orphan')", + 'field' => 'pcl.checklist_id', + 'op' => '=', + 'value' => "(SELECT c.id FROM sagacity.checklist c WHERE c.name='Orphan')", 'sql_op' => 'AND' ) - ), array( + ), array( 'table_joins' => array( "LEFT JOIN sagacity.findings f ON t.id=f.tgt_id", "LEFT JOIN sagacity.pdi_checklist_lookup pcl ON pcl.pdi_id=f.pdi_id" ), - 'group' => 't.id,pcl.checklist_id' + 'group' => 't.id,pcl.checklist_id' )); $rows2 = $this->help->execute(); if (is_array($rows2) && count($rows2) && isset($rows2['tgt_id'])) { - $rows2 = array(0 => $rows2); + $rows2 = array( + 0 => $rows2 + ); } if (is_array($rows2) && count($rows2) && isset($rows2[0])) { @@ -3015,14 +3184,13 @@ class db $chk = $this->get_Checklist($row2['chk_id']); if (is_array($chk) && count($chk) && isset($chk[0]) && is_a($chk[0], 'checklist')) { $chk = $chk[0]; - } - else { + } else { continue; } - $tgts = isset($chklsts[$chk->get_ID()]['tgts']) ? $chklsts[$chk->get_ID()]['tgts'] : ""; + $tgts = isset($chklsts[$chk->get_ID()]['tgts']) ? $chklsts[$chk->get_ID()]['tgts'] : ""; $chklsts[$chk->get_ID()] = array( - 'tgts' => $tgts . $row2['tgt_id'] . ",", + 'tgts' => $tgts . $row2['tgt_id'] . ",", 'checklist' => $chk ); } @@ -3036,46 +3204,54 @@ class db * Get array of checklists for a target * * @param integer $tgt_id - * The target ID of the target we want checklists from + * The target ID of the target we want checklists from * * @return array:checklist |NULL - * Returns an array of checklists that are assigned to the requested target + * Returns an array of checklists that are assigned to the requested target */ public function get_Target_Checklists($tgt_id) { - $this->help->select("sagacity.target_checklist tc", ['c.id', 'tc.class'], [ + $this->help->select("sagacity.target_checklist tc", [ + 'c.id', + 'tc.class' + ], [ [ 'field' => 'tc.tgt_id', - 'op' => '=', + 'op' => '=', 'value' => $tgt_id ] - ], [ + ], [ 'table_joins' => [ "LEFT JOIN sagacity.checklist c ON c.id=tc.chk_id" ], - 'order' => 'c.name' + 'order' => 'c.name' ]); - $chk = []; + $chk = []; $chks = $this->help->execute(); if (isset($chks['id'])) { - $chks = [0 => $chks]; + $chks = [ + 0 => $chks + ]; } if (is_array($chks) && count($chks) && isset($chks[0])) { foreach ($chks as $row) { + /** @var checklist $checklist */ $checklist = $this->get_Checklist($row['id'])[0]; $checklist->set_Classification($row['class']); - $chk[] = $checklist; + $chk[$checklist->get_ID()] = $checklist; } } // get the orphan checklist ID - $this->help->select("sagacity.checklist", ['id'], [ + $this->help->select("sagacity.checklist", [ + 'id' + ], [ [ 'field' => 'name', - 'op' => '=', + 'op' => '=', 'value' => 'Orphan' ] ]); @@ -3085,16 +3261,16 @@ class db $this->help->select_count("sagacity.pdi_checklist_lookup pcl", [ [ 'field' => 'pcl.checklist_id', - 'op' => '=', + 'op' => '=', 'value' => $orphan['id'] ], [ - 'field' => 'f.tgt_id', - 'op' => '=', - 'value' => $tgt_id, + 'field' => 'f.tgt_id', + 'op' => '=', + 'value' => $tgt_id, 'sql_op' => 'AND' ] - ], [ + ], [ 'table_joins' => [ "RIGHT JOIN sagacity.findings f ON pcl.pdi_id=f.pdi_id" ] @@ -3121,46 +3297,45 @@ class db */ public function get_Category_Findings($cat_id, $chk_host_list = [], $status = null, $category = null) { - $ret = []; - $stigs = []; + $ret = []; + $stigs = []; $tgt_ids = []; $where = [ [ 'field' => 'gcf.cat_id', - 'op' => (is_null($cat_id) ? IS : '='), + 'op' => (is_null($cat_id) ? IS : '='), 'value' => $cat_id ] ]; - if (!is_null($status)) { + if (! is_null($status)) { $where[] = [ - 'field' => 'gcf.status', - 'op' => '=', - 'value' => $status, - 'sql_op' => 'AND', + 'field' => 'gcf.status', + 'op' => '=', + 'value' => $status, + 'sql_op' => 'AND', 'open-paren' => true ]; if ($status == 'Not Reviewed') { $where[] = [ - 'field' => 'gcf.status', - 'op' => IS, - 'value' => null, - 'sql_op' => 'OR', + 'field' => 'gcf.status', + 'op' => IS, + 'value' => null, + 'sql_op' => 'OR', 'close-paren' => true ]; - } - else { + } else { unset($where[1]['open-paren']); } } - if (!is_null($category)) { + if (! is_null($category)) { $where[] = [ - 'field' => 'gcf.cat', - 'op' => '=', - 'value' => $category, + 'field' => 'gcf.cat', + 'op' => '=', + 'value' => $category, 'sql_op' => 'AND' ]; } @@ -3168,50 +3343,57 @@ class db $this->help->select("sagacity.get_cat_findings gcf", null, $where); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['tgt_id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { foreach ($rows as $row) { if (is_null($row['chk_icon']) || $row['chk_icon'] == '') { $worksheet_name = '(Unknown)'; - } - else { - $worksheet_name = substr($row['chk_icon'], 0, -4); + } else { + $worksheet_name = substr($row['chk_icon'], 0, - 4); } - if (!isset($ret[$worksheet_name])) { - $ret[$worksheet_name] = ['target_list' => [], 'checklists' => [], 'stigs' => []]; - $where2 = [ + if (! isset($ret[$worksheet_name])) { + $ret[$worksheet_name] = [ + 'target_list' => [], + 'checklists' => [], + 'stigs' => [] + ]; + $where2 = [ [ 'field' => 't.cat_id', - 'op' => '=', + 'op' => '=', 'value' => $cat_id ], [ - 'field' => 'c.icon', - 'op' => LIKE, - 'value' => "'$worksheet_name%'", + 'field' => 'c.icon', + 'op' => LIKE, + 'value' => "'$worksheet_name%'", 'sql_op' => 'AND' ] ]; if (is_array($tgt_ids) && count($tgt_ids)) { $where2[] = [ - 'field' => 't.id', - 'op' => IN, - 'value' => $tgt_ids, + 'field' => 't.id', + 'op' => IN, + 'value' => $tgt_ids, 'sql_op' => 'AND' ]; } - $this->help->select("target t", ['t.class'], $where2, [ + $this->help->select("target t", [ + 't.class' + ], $where2, [ 'table_joins' => [ "LEFT JOIN target_checklist tc ON tc.tgt_id = t.id", "LEFT JOIN checklist c ON c.id=tc.chk_id" ], - 'group' => 't.class', - 'order' => "FIELD(t.class, 'S', 'FOUO', 'U')" + 'group' => 't.class', + 'order' => "FIELD(t.class, 'S', 'FOUO', 'U')" ]); $rows2 = $this->help->execute(); if (is_array($rows2) && count($rows2) && isset($rows2['class'])) { @@ -3219,35 +3401,35 @@ class db } } - if (!in_array($row['chk_id'], $ret[$worksheet_name]['checklists'])) { + if (! in_array($row['chk_id'], $ret[$worksheet_name]['checklists'])) { $ret[$worksheet_name]['checklists'][] = $row['chk_id']; } - if (!isset($ret[$worksheet_name]['target_list'][$row['tgt_name']])) { + if (! isset($ret[$worksheet_name]['target_list'][$row['tgt_name']])) { $ret[$worksheet_name]['target_list']["{$row['tgt_name']}"] = count($ret[$worksheet_name]['target_list']) + 6; } - if (!isset($ret[$worksheet_name]['stigs'][$row['stig_id']])) { - if (!empty($row['finding_ia_controls'])) { + if (! isset($ret[$worksheet_name]['stigs'][$row['stig_id']])) { + if (! empty($row['finding_ia_controls'])) { $ia = explode(' ', $row['finding_ia_controls']); - } - else { + } else { $ia = explode(' ', $row['ia_controls']); } - $echk = new echecklist($row['stig_id'], $row['vms_id'], (empty($row['finding_cat']) ? $row['cat'] : $row['finding_cat']), $ia, $row['short_title'], null, $row['notes'], $row['check_contents'], null); + $echk = new echecklist($row['stig_id'], $row['vms_id'], (empty($row['finding_cat']) ? $row['cat'] : $row['finding_cat']), $ia, $row['short_title'], null, $row['notes'], $row['check_contents'], null); $echk->set_PDI_ID($row['pdi_id']); $ret[$worksheet_name]['stigs'][$row['stig_id']] = [ - 'echecklist' => $echk, + 'echecklist' => $echk, "{$row['tgt_name']}" => $row['finding_status'], - 'chk_id' => $row['chk_id'] + 'chk_id' => $row['chk_id'] ]; - if (!in_array($row['stig_id'], $stigs)) { + if (! in_array($row['stig_id'], $stigs)) { $stigs[] = $row['stig_id']; } - } - else { + } else { $ret[$worksheet_name]['stigs'][$row['stig_id']][$row['tgt_name']] = $row['finding_status']; - $ret[$worksheet_name]['stigs'][$row['stig_id']]['echecklist']->append_Notes($row['notes'] . PHP_EOL); + if(stripos($ret[$worksheet_name]['stigs'][$row['stig_id']]['echecklist']->get_Notes(), $row['notes']) === false) { + $ret[$worksheet_name]['stigs'][$row['stig_id']]['echecklist']->append_Notes($row['notes'] . PHP_EOL); + } } if ($row['chk_type'] == 'manual') { @@ -3256,51 +3438,51 @@ class db } } + /* $where = [ [ 'field' => 'gof.cat_id', - 'op' => (is_null($cat_id) ? IS : '='), + 'op' => (is_null($cat_id) ? IS : '='), 'value' => $cat_id ] ]; if (is_array($stigs) && count($stigs) && isset($stigs[0]) && is_a($stigs[0], 'stig')) { $where[] = [ - 'field' => 'gof.stig_id', - 'op' => NOT_IN, - 'value' => $stigs, + 'field' => 'gof.stig_id', + 'op' => NOT_IN, + 'value' => $stigs, 'sql_op' => 'AND' ]; } - if (!is_null($status)) { + if (! is_null($status)) { $where[] = [ - 'field' => 'gof.status', - 'op' => '=', - 'value' => $status, - 'sql_op' => 'AND', + 'field' => 'gof.status', + 'op' => '=', + 'value' => $status, + 'sql_op' => 'AND', 'open-paren' => true ]; if ($status == 'Not Reviewed') { $where[] = [ - 'field' => 'gof.status', - 'op' => IS, - 'value' => null, - 'sql_op' => 'OR', + 'field' => 'gof.status', + 'op' => IS, + 'value' => null, + 'sql_op' => 'OR', 'close-paren' => true ]; - } - else { + } else { unset($where[2]['open-paren']); } } - if (!is_null($category)) { + if (! is_null($category)) { $where[] = [ - 'field' => 'gof.cat', - 'op' => '=', - 'value' => $category, + 'field' => 'gof.cat', + 'op' => '=', + 'value' => $category, 'sql_op' => 'AND' ]; } @@ -3308,27 +3490,36 @@ class db $this->help->select("sagacity.get_orphan_findings gof", null, $where); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['tgt_id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { $worksheet_name = "Orphan"; - $class = ['U' => 1, 'FOUO' => 2, 'S' => 3]; + $class = [ + 'U' => 1, + 'FOUO' => 2, + 'S' => 3 + ]; foreach ($rows as $row) { - if (!isset($ret[$worksheet_name])) { - $ret[$worksheet_name] = ['target_list' => [], 'checklists' => [], 'stigs' => [], 'highest_class' => 'U']; + if (! isset($ret[$worksheet_name])) { + $ret[$worksheet_name] = [ + 'target_list' => [], + 'checklists' => [], + 'stigs' => [], + 'highest_class' => 'U' + ]; } - if (!in_array($row['chk_id'], $ret[$worksheet_name]['checklists'])) { + if (! in_array($row['chk_id'], $ret[$worksheet_name]['checklists'])) { $ret[$worksheet_name]['checklists'][] = $row['chk_id']; } - if (!isset($ret[$worksheet_name]['target_list'][$row['tgt_name']])) { + if (! isset($ret[$worksheet_name]['target_list'][$row['tgt_name']])) { $ret[$worksheet_name]['target_list'][$row['tgt_name']] = (is_array($ret[$worksheet_name]['target_list']) ? count($ret[$worksheet_name]['target_list']) + 6 : 7); - $sql2 = "SELECT t.`class` " . - "FROM `sagacity`.`target` t " . - "WHERE t.`name` = '" . $this->conn->real_escape_string($row['tgt_name']) . "'"; + $sql2 = "SELECT t.`class` " . "FROM `sagacity`.`target` t " . "WHERE t.`name` = '" . $this->conn->real_escape_string($row['tgt_name']) . "'"; if ($res2 = $this->conn->query($sql2)) { $row2 = $res2->fetch_assoc(); if (isset($class[$row2['class']]) && isset($class[$ret[$worksheet_name]['highest_class']])) { @@ -3339,27 +3530,26 @@ class db } } - if (!isset($ret[$worksheet_name]['stigs'][$row['stig_id']])) { - if (!empty($row['finding_ia_controls'])) { + if (! isset($ret[$worksheet_name]['stigs'][$row['stig_id']])) { + if (! empty($row['finding_ia_controls'])) { $ia = explode(" ", $row['finding_ia_controls']); - } - else { + } else { $ia = explode(" ", $row['ia_controls']); } - $echk = new echecklist($row['stig_id'], $row['vms_id'], (empty($row['finding_cat']) ? $row['cat'] : $row['finding_cat']), $ia, $row['short_title'], null, $row['notes'], $row['check_contents'], null); + $echk = new echecklist($row['stig_id'], $row['vms_id'], (empty($row['finding_cat']) ? $row['cat'] : $row['finding_cat']), $ia, $row['short_title'], null, $row['notes'], $row['check_contents'], null); $echk->set_PDI_ID($row['pdi_id']); $ret[$worksheet_name]['stigs'][$row['stig_id']] = [ - 'echecklist' => $echk, + 'echecklist' => $echk, $row['tgt_name'] => $row['finding_status'], - 'chk_id' => $row['chk_id'] + 'chk_id' => $row['chk_id'] ]; - } - else { + } else { $ret[$worksheet_name]['stigs'][$row['stig_id']][$row['tgt_name']] = $row['finding_status']; $ret[$worksheet_name]['stigs'][$row['stig_id']]['echecklist']->append_Notes($row['notes'] . "\r"); } } } + */ return $ret; } @@ -3368,78 +3558,79 @@ class db * Add a checklist to database * * @param checklist $checklist_in - * The checklist that we want to add to the database + * The checklist that we want to add to the database * - * @return integer - * Returns the id of the checklist inserted, or 0 if failed + * @return integer Returns the id of the checklist inserted, or 0 if failed */ public function save_Checklist($checklist_in) { if (empty($checklist_in->id)) { $this->help->insert("sagacity.checklist", array( 'checklist_id' => $checklist_in->checklist_id, - 'name' => $checklist_in->name, - 'description' => $checklist_in->description, - 'date' => $checklist_in->date, - 'file_name' => $checklist_in->file_name, - 'release' => $checklist_in->release, - 'ver' => $checklist_in->ver, - 'type' => $checklist_in->type, - 'icon' => $checklist_in->icon - ), true); + 'name' => $checklist_in->name, + 'description' => $checklist_in->description, + 'date' => $checklist_in->date, + 'file_name' => $checklist_in->file_name, + 'release' => $checklist_in->release, + 'ver' => $checklist_in->ver, + 'type' => $checklist_in->type, + 'icon' => $checklist_in->icon + ), true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { Sagacity_Error::sql_handler($this->help->sql); $this->help->debug(E_ERROR); - } - else { + } else { $chk_id = $this->conn->insert_id; } if (is_array($checklist_in->sw) && count($checklist_in->sw)) { $fields = [ - 'chk_id', 'sw_id' + 'chk_id', + 'sw_id' ]; $params = []; foreach ($checklist_in->sw as $sw) { if (is_a($sw, 'software') && $sw->get_ID()) { - $params[] = [$chk_id, $sw->get_ID()]; + $params[] = [ + $chk_id, + $sw->get_ID() + ]; } } if (count($params)) { $this->help->extended_insert('checklist_software_lookup', $fields, $params, true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { Sagacity_Error::sql_handler($this->help->sql); $this->help->debug(E_ERROR); } } } - } - else { + } else { $this->help->update('checklist', [ 'checklist_id' => $checklist_in->checklist_id, - 'name' => $checklist_in->name, - 'description' => $checklist_in->description, - 'date' => $checklist_in->date, - 'file_name' => $checklist_in->file_name, - 'release' => $checklist_in->release, - 'ver' => $checklist_in->ver, - 'type' => $checklist_in->type, - 'icon' => $checklist_in->icon - ], [ + 'name' => $checklist_in->name, + 'description' => $checklist_in->description, + 'date' => $checklist_in->date, + 'file_name' => $checklist_in->file_name, + 'release' => $checklist_in->release, + 'ver' => $checklist_in->ver, + 'type' => $checklist_in->type, + 'icon' => $checklist_in->icon + ], [ [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $checklist_in->id ] ]); $chk_id = $checklist_in->id; - if (!$this->help->execute()) { + if (! $this->help->execute()) { Sagacity_Error::sql_handler($this->help->sql); $this->help->debug(E_ERROR); } @@ -3448,24 +3639,30 @@ class db $this->help->delete("checklist_software_lookup", [ [ 'field' => 'chk_id', - 'op' => '=', + 'op' => '=', 'value' => $checklist_in->id ] ]); $this->help->execute(); - $field = ['chk_id', 'sw_id']; + $field = [ + 'chk_id', + 'sw_id' + ]; $params = []; foreach ($checklist_in->sw as $sw) { if ($sw->get_ID()) { - $params[] = [$chk_id, $sw->get_ID()]; + $params[] = [ + $chk_id, + $sw->get_ID() + ]; } } if (is_array($params) && count($params)) { $this->help->extended_insert("checklist_software_lookup", $field, $params, true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { Sagacity_Error::sql_handler($this->help->sql); $this->help->debug(E_ERROR); } @@ -3482,25 +3679,29 @@ class db * Function to retrieve CVE object * * @param string $cve_id - * CVE to query from the database + * CVE to query from the database * - * @return cve|NULL - * Returns CVE and associated references or null is nothing found + * @return cve|NULL Returns CVE and associated references or null is nothing found */ public function get_CVE($cve_id) { $cve = null; $this->help->select("sagacity.cve_db", array( - "cve_db.cve_id", "cve.pdi_id", "cve_db.seq", "cve_db.status", - "cve_db.phase", "cve_db.phase_date", "cve_db.desc" - ), array( + "cve_db.cve_id", + "cve.pdi_id", + "cve_db.seq", + "cve_db.status", + "cve_db.phase", + "cve_db.phase_date", + "cve_db.desc" + ), array( array( 'field' => 'cve_db.cve_id', - 'op' => '=', + 'op' => '=', 'value' => $cve_id ) - ), array( + ), array( 'table_joins' => array( "LEFT JOIN sagacity.cve ON cve.cve_id=cve_db.cve_id" ) @@ -3518,17 +3719,21 @@ class db $cve->set_Phase_Date($row['phase_date']); $cve->set_Description($row['desc']); - $this->help->select("sagacity.iavm_to_cve itc", array("itc.noticeId"), array( + $this->help->select("sagacity.iavm_to_cve itc", array( + "itc.noticeId" + ), array( array( 'field' => "itc.cve_id", - 'op' => '=', + 'op' => '=', 'value' => $cve_id ) )); $iavm_rows = $this->help->execute(); if (is_array($iavm_rows) && count($iavm_rows) && isset($iavm_rows['noticeId'])) { - $iavm_rows = array(0 => $iavm_rows); + $iavm_rows = array( + 0 => $iavm_rows + ); } if (is_array($iavm_rows) && count($iavm_rows) && isset($iavm_rows[0])) { @@ -3537,17 +3742,24 @@ class db } } - $this->help->select("sagacity.cve_references", array('id', 'source', 'url', 'val'), array( + $this->help->select("sagacity.cve_references", array( + 'id', + 'source', + 'url', + 'val' + ), array( array( 'field' => 'cve_seq', - 'op' => '=', + 'op' => '=', 'value' => $cve_id ) )); $ref_rows = $this->help->execute(); if (is_array($ref_rows) && count($ref_rows) && isset($ref_rows['id'])) { - $ref_rows = array(0 => $ref_rows); + $ref_rows = array( + 0 => $ref_rows + ); } if (is_array($ref_rows) && count($ref_rows) && isset($ref_rows[0])) { @@ -3564,23 +3776,17 @@ class db * Getter function to retrieve CVE's by their link to a PDI * * @param integer $pdi_id - * PDI ID that we want to find CVE's for + * PDI ID that we want to find CVE's for * - * @return NULL|array:cve - * Returns an array of CVEs for each one found that links to a PDI or NULL if none found + * @return NULL|array:cve Returns an array of CVEs for each one found that links to a PDI or NULL if none found */ public function get_CVEs_By_PDI($pdi_id) { $ret = []; - $sql = "SELECT " . - "cve_db.`cve_id`,cve.`pdi_id`,cve_db.`seq`,cve_db.`status`," . - "cve_db.`phase`,cve_db.`phase_date`,cve_db.`desc` " . - "FROM `sagacity`.`cve_db` " . - "LEFT JOIN `sagacity`.`cve` ON cve.`cve_id` = cve_db.`cve_id` " . - "WHERE cve.`pdi_id` = " . $this->conn->real_escape_string($pdi_id); + $sql = "SELECT " . "cve_db.`cve_id`,cve.`pdi_id`,cve_db.`seq`,cve_db.`status`," . "cve_db.`phase`,cve_db.`phase_date`,cve_db.`desc` " . "FROM `sagacity`.`cve_db` " . "LEFT JOIN `sagacity`.`cve` ON cve.`cve_id` = cve_db.`cve_id` " . "WHERE cve.`pdi_id` = " . $this->conn->real_escape_string($pdi_id); if ($res = $this->conn->query($sql)) { - if (!$res->num_rows) { + if (! $res->num_rows) { return null; } while ($row = $res->fetch_assoc()) { @@ -3594,9 +3800,7 @@ class db $cve->set_Phase_Date($row['phase_date']); $cve->set_Description($row['desc']); - $sql = "SELECT itc.`noticeId` " . - "FROM `sagacity`.`iavm_to_cve` itc " . - "WHERE itc.`cve_id`='" . $this->conn->real_escape_string($cve_id) . "'"; + $sql = "SELECT itc.`noticeId` " . "FROM `sagacity`.`iavm_to_cve` itc " . "WHERE itc.`cve_id`='" . $this->conn->real_escape_string($cve_id) . "'"; if ($res2 = $this->conn->query($sql)) { if ($res2->num_rows) { @@ -3606,9 +3810,7 @@ class db } } - $sql = "SELECT `id`,`source`,`url`,`val` " . - "FROM `sagacity`.`cve_references` " . - "WHERE `cve_seq`='" . $this->conn->real_escape_string($cve_id) . "'"; + $sql = "SELECT `id`,`source`,`url`,`val` " . "FROM `sagacity`.`cve_references` " . "WHERE `cve_seq`='" . $this->conn->real_escape_string($cve_id) . "'"; if ($res2 = $this->conn->query($sql)) { while ($row2 = $res2->fetch_assoc()) { @@ -3616,16 +3818,14 @@ class db } $ret[] = $cve; - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } } return $ret; - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } @@ -3637,19 +3837,13 @@ class db * Get a CVE from a external reference * * @param string $ext - * String of the external reference we are looking for + * String of the external reference we are looking for * - * @return cve|NULL - * Returns the CVE that references that external data point or NULL if none found + * @return cve|NULL Returns the CVE that references that external data point or NULL if none found */ public function get_CVE_From_External($ext) { - $sql = "SELECT `cve_seq` " . - "FROM `sagacity`.`cve_references` " . - "WHERE `url` LIKE '%" . $this->conn->real_escape_string($ext) . "%' OR " . - "`val` LIKE '%" . $this->conn->real_escape_string($ext) . "%' " . - "GROUP BY `cve_seq` " . - "ORDER BY `cve_seq` DESC"; + $sql = "SELECT `cve_seq` " . "FROM `sagacity`.`cve_references` " . "WHERE `url` LIKE '%" . $this->conn->real_escape_string($ext) . "%' OR " . "`val` LIKE '%" . $this->conn->real_escape_string($ext) . "%' " . "GROUP BY `cve_seq` " . "ORDER BY `cve_seq` DESC"; if ($res = $this->conn->query($sql)) { if ($res->num_rows) { @@ -3666,10 +3860,9 @@ class db * Update or insert a CVE * * @param array:cve $cves - * Array of CVEs to save to database + * Array of CVEs to save to database * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function save_CVE($cves) { @@ -3677,32 +3870,32 @@ class db foreach ($cves as $cve) { $db_cve = $this->get_CVE($cve->get_CVE()); - if (!is_null($db_cve) && is_a($db_cve, 'cve')) { + if (! is_null($db_cve) && is_a($db_cve, 'cve')) { $this->help->update("sagacity.cve_db", array( - 'status' => $cve->get_Status(), - 'phase' => $cve->get_Phase(), + 'status' => $cve->get_Status(), + 'phase' => $cve->get_Phase(), 'phase_date' => $cve->get_Phase_Date(), - 'desc' => $cve->get_Description() - ), array( + 'desc' => $cve->get_Description() + ), array( array( 'field' => 'cve_id', - 'op' => '=', + 'op' => '=', 'value' => $cve->get_CVE() ) )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_WARNING); return false; } - if (!$db_cve->get_PDI_ID() && $cve->get_PDI_ID()) { + if (! $db_cve->get_PDI_ID() && $cve->get_PDI_ID()) { $this->help->insert("sagacity.cve", array( 'pdi_id' => $cve->get_PDI_ID(), 'cve_id' => $cve->get_CVE() )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_WARNING); return false; } @@ -3710,7 +3903,7 @@ class db $vals = []; foreach ($cve->get_References() as $ref) { - if (!$db_cve->ref_Exists($ref->get_Value())) { + if (! $db_cve->ref_Exists($ref->get_Value())) { $vals[] = [ $cve->get_CVE(), $ref->get_Source(), @@ -3721,24 +3914,28 @@ class db } if (is_array($vals) && count($vals)) { - $this->help->extended_insert("cve_references", ['cve_seq', 'source', 'url', 'val'], $vals, true); - if (!$this->help->execute()) { + $this->help->extended_insert("cve_references", [ + 'cve_seq', + 'source', + 'url', + 'val' + ], $vals, true); + if (! $this->help->execute()) { $this->help->debug(E_WARNING); return false; } } - } - else { + } else { $this->help->insert("cve_db", [ - 'cve_id' => $cve->get_CVE(), - 'seq' => $cve->get_Sequence(), - 'status' => $cve->get_Status(), - 'phase' => $cve->get_Phase(), + 'cve_id' => $cve->get_CVE(), + 'seq' => $cve->get_Sequence(), + 'status' => $cve->get_Status(), + 'phase' => $cve->get_Phase(), 'phase_date' => $cve->get_Phase_Date(), - 'desc' => $cve->get_Description() - ], true); + 'desc' => $cve->get_Description() + ], true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_WARNING); return false; } @@ -3747,9 +3944,9 @@ class db $this->help->insert("sagacity.cve", [ 'pdi_id' => $cve->get_PDI_ID(), 'cve_id' => $cve->get_CVE() - ], true); + ], true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_WARNING); return false; } @@ -3767,8 +3964,13 @@ class db } if (is_array($ref_vals) && count($ref_vals)) { - $this->help->extended_insert("cve_references", ['cve_seq', 'source', 'url', 'val'], $ref_vals, true); - if (!$this->help->execute()) { + $this->help->extended_insert("cve_references", [ + 'cve_seq', + 'source', + 'url', + 'val' + ], $ref_vals, true); + if (! $this->help->execute()) { $this->help->debug(E_WARNING); return false; } @@ -3778,8 +3980,8 @@ class db if ($cve->get_XML()) { $this->help->insert("cve_web", [ 'cve_id' => $cve->get_CVE(), - 'xml' => $cve->get_XML() - ], true); + 'xml' => $cve->get_XML() + ], true); $this->help->execute(); } @@ -3796,39 +3998,35 @@ class db * Get an eChecklist for a checklist and list of targets * * @param mixed $ref - * The reference to search for (can consist of any data that is referenced in an eChecklist line + * The reference to search for (can consist of any data that is referenced in an eChecklist line * @param integer $chk_id * - * @return NULL|echecklist - * Returns eChecklist for associated checklists and reference + * @return NULL|echecklist Returns eChecklist for associated checklists and reference */ public function get_eChecklist($ref, $chk_id) { - $ret = null; + $ret = null; $where = []; if (is_a($ref, "stig")) { $where[] = [ 'field' => 's.stig_id', - 'op' => '=', + 'op' => '=', 'value' => $ref->get_ID() ]; - } - elseif (is_a($ref, "golddisk")) { + } elseif (is_a($ref, "golddisk")) { $where[] = [ 'field' => 'v.vms_id', - 'op' => '=', + 'op' => '=', 'value' => $ref->get_ID() ]; - } - elseif (is_a($ref, "pdi")) { + } elseif (is_a($ref, "pdi")) { $where[] = [ 'field' => 'pdi.id', - 'op' => '=', + 'op' => '=', 'value' => $ref->get_ID() ]; - } - else { + } else { error_log("No reference to search for"); return $ret; } @@ -3839,17 +4037,19 @@ class db "v.vms_id", "pdi.short_title", "IF(pdi.cat=1,'I',IF(pdi.cat=2,'II',IF(pdi.cat=3,'III',''))) as 'cat'" - ], $where, [ + ], $where, [ 'table_joins' => [ "LEFT JOIN stigs s ON s.pdi_id = pdi.id", "LEFT JOIN golddisk v ON v.pdi_id = pdi.id" ], - 'group' => 's.stig_id' + 'group' => 's.stig_id' ]); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['pdi_id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -3857,23 +4057,25 @@ class db $ret = new echecklist($row['stig_id'], $row['vms_id'], $row['cat'], null, $row['short_title'], null, null, null, null); $ret->set_PDI_ID($row['pdi_id']); - $this->help->select("pdi_checklist_lookup pcl", ['pcl.check_contents'], [ + $this->help->select("pdi_checklist_lookup pcl", [ + 'pcl.check_contents' + ], [ [ 'field' => 'pcl.checklist_id', - 'op' => IN, + 'op' => IN, 'value' => (is_array($chk_id) ? implode(",", $chk_id) : $chk_id) ], [ - 'field' => 'pcl.pdi_id', - 'op' => '=', - 'value' => $row['pdi_id'], + 'field' => 'pcl.pdi_id', + 'op' => '=', + 'value' => $row['pdi_id'], 'sql_op' => 'AND' ] - ], [ + ], [ 'table_joins' => [ "JOIN sagacity.checklist c ON c.id = pcl.checklist_id" ], - 'order' => "FIELD(c.`type`, 'manual', 'iavm', 'policy', 'benchmark')" + 'order' => "FIELD(c.`type`, 'manual', 'iavm', 'policy', 'benchmark')" ]); $row2 = $this->help->execute(); @@ -3898,26 +4100,23 @@ class db public function get_Filters($type, $name = null) { $ret = []; - $sql = "SELECT `type`, `name`, `criteria` " . - "FROM `sagacity`.`search_filters` " . - "WHERE `type` = '" . $this->conn->real_escape_string($type) . "'"; + $sql = "SELECT `type`, `name`, `criteria` " . "FROM `sagacity`.`search_filters` " . "WHERE `type` = '" . $this->conn->real_escape_string($type) . "'"; - if (!is_null($name)) { + if (! is_null($name)) { $sql .= " AND `name` = '" . $this->conn->real_escape_string($name) . "'"; } if ($res = $this->conn->query($sql)) { while ($row = $res->fetch_assoc()) { $ret[] = array( - 'type' => $row['type'], - 'name' => $row['name'], + 'type' => $row['type'], + 'name' => $row['name'], 'criteria' => $row['criteria'] ); } return $ret; - } - else { + } else { error_log($this->conn->error); Sagacity_Error::sql_handler($sql); } @@ -3937,12 +4136,12 @@ class db public function save_Filter($type, $name, $criteria) { $this->help->insert("sagacity.search_filters", [ - 'name' => $name, - 'type' => $type, + 'name' => $name, + 'type' => $type, 'criteria' => $criteria ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_WARNING); return false; } @@ -3956,89 +4155,92 @@ class db * Get finding(s) for a specific target from the database * * @param target $tgt - * The target that we want findings for - * @param stig|golddisk|iavm|nessus $ref [optional] - * Get a finding associated with a specific PDI (default null) - * @param scan $scan [optional] - * Get findings associated with a specific scan (default null) - * @param boolean $orphan_only [optional] - * Only retrieve orphaned findings (default false) - * @param string $status [optional] - * Limit the retrieval to findings with this status (default null) + * The target that we want findings for + * @param stig|golddisk|iavm|nessus $ref + * [optional] + * Get a finding associated with a specific PDI (default null) + * @param scan $scan + * [optional] + * Get findings associated with a specific scan (default null) + * @param boolean $orphan_only + * [optional] + * Only retrieve orphaned findings (default false) + * @param string $status + * [optional] + * Limit the retrieval to findings with this status (default null) * - * @return array:finding|NULL - * Returns array of findings + * @return array:finding|NULL Returns array of findings */ public function get_Finding($tgt, $ref = null, $scan = null, $orphan_only = false, $status = null) { - $ret = null; + $ret = null; $where = [ [ 'field' => 'tgt_id', - 'op' => '=', + 'op' => '=', 'value' => $tgt->get_ID() ] ]; - if (!is_null($scan)) { + if (! is_null($scan)) { $where[] = [ - 'field' => 'scan_id', - 'op' => '=', - 'value' => $scan->get_ID(), + 'field' => 'scan_id', + 'op' => '=', + 'value' => $scan->get_ID(), 'sql_op' => 'AND' ]; } - if (!is_null($ref) && method_exists($ref, 'get_PDI_ID')) { + if (! is_null($ref) && method_exists($ref, 'get_PDI_ID')) { $where[] = [ - 'field' => 'pdi_id', - 'op' => '=', - 'value' => $ref->get_PDI_ID(), + 'field' => 'pdi_id', + 'op' => '=', + 'value' => $ref->get_PDI_ID(), 'sql_op' => 'AND' ]; } $this->help->select("sagacity.findings", null, $where); - if (!is_null($status)) { + if (! is_null($status)) { $this->help->sql = "SELECT " . - "f.`id`, {$tgt->get_ID()} as 'tgt_id', pdi.`id` as 'pdi_id', f.`scan_id`, " . - "f.`notes`, f.`change_id`, f.`orig_src`, f.`finding_itr`, f.`cat`, " . - "IF(f.`findings_status_id` IS NOT NULL, " . - "f.`findings_status_id`, " . - "(SELECT fs.`id` " . - "FROM `sagacity`.`findings_status` fs " . - "WHERE fs.`status` = '{$this->conn->real_escape_string($status)}')" . - ") as 'findings_status' " . - "FROM `sagacity`.`pdi_catalog` pdi " . - "LEFT JOIN `sagacity`.`pdi_checklist_lookup` lookup ON lookup.`pdi_id` = pdi.`id` " . - "LEFT JOIN `sagacity`.`target_checklist` tc ON tc.`chk_id` = lookup.`checklist_id` " . - "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pdi.`id` AND " . - "f.`tgt_id` = {$this->conn->real_escape_string($tgt->get_ID())} " . - "WHERE tc.`tgt_id` = {$tgt->get_ID()} AND " . - "(f.`findings_status_id` = (" . - "SELECT fs.`id` " . - "FROM `sagacity`.`findings_status` fs " . - "WHERE fs.`status` = '{$this->conn->real_escape_string($status)}'" . - ") OR " . - "f.`findings_status_id` IS NULL) " . - "GROUP BY pdi.id"; + "f.`id`, {$tgt->get_ID()} as 'tgt_id', pdi.`id` as 'pdi_id', f.`scan_id`, " . + "f.`notes`, f.`change_id`, f.`orig_src`, f.`finding_itr`, f.`cat`, " . + "IF(f.`findings_status_id` IS NOT NULL, " . + "f.`findings_status_id`, " . + "(SELECT fs.`id` " . + "FROM `sagacity`.`findings_status` fs " . + "WHERE fs.`status` = '{$this->conn->real_escape_string($status)}')" . + ") as 'findings_status' " . + "FROM `sagacity`.`pdi_catalog` pdi " . + "LEFT JOIN `sagacity`.`pdi_checklist_lookup` lookup ON lookup.`pdi_id` = pdi.`id` " . + "LEFT JOIN `sagacity`.`target_checklist` tc ON tc.`chk_id` = lookup.`checklist_id` " . + "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pdi.`id` AND f.`tgt_id` = {$tgt->get_ID()} " . + "WHERE tc.`tgt_id` = {$tgt->get_ID()} AND " . + "(f.`findings_status_id` = (" . + "SELECT fs.`id` " . + "FROM `sagacity`.`findings_status` fs " . + "WHERE fs.`status` = '{$this->conn->real_escape_string($status)}'" . ") OR " . + "f.`findings_status_id` IS NULL) " . + "GROUP BY pdi.id"; } if ($orphan_only) { - $this->help->select("sagacity.findings f", ['f.*'], [ + $this->help->select("sagacity.findings f", [ + 'f.*' + ], [ [ 'field' => 'f.tgt_id', - 'op' => '=', + 'op' => '=', 'value' => $tgt->get_ID() ], [ - 'field' => 'c.name', - 'op' => '=', - 'value' => 'Orphan', + 'field' => 'c.name', + 'op' => '=', + 'value' => 'Orphan', 'sql_op' => 'AND' ] - ], [ + ], [ 'table_joins' => [ "LEFT JOIN pdi_checklist_lookup pcl ON f.pdi_id=pcl.pdi_id", "LEFT JOIN target_checklist tc ON tc.chk_id=pcl.checklist_id", @@ -4049,42 +4251,58 @@ class db $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['pdi_id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { foreach ($rows as $row) { - $find = new finding($row['id'], $row['tgt_id'], $row['pdi_id'], $row['scan_id'], $row['findings_status_id'], $row['notes'], $row['change_id'], $row['orig_src'], $row['finding_itr']); + $find = new finding($row['tgt_id'], $row['pdi_id'], $row['scan_id'], $row['findings_status_id'], $row['notes'], $row['change_id'], $row['orig_src'], $row['finding_itr']); $find->set_Category($row['cat']); + $this->get_Finding_Notes($find); - $this->help->select("finding_controls", ['ia_control'], [ + $this->help->select("finding_controls", [ + 'ia_control' + ], [ [ - 'field' => 'finding_id', - 'op' => '=', - 'value' => $row['id'] + 'field' => 'tgt_id', + 'op' => '=', + 'value' => $row['tgt_id'] + ], + [ + 'field' => 'pdi_id', + 'op' => '=', + 'value' => $row['pdi_id'], + 'sql_op' => 'AND' ] ]); $rows2 = $this->help->execute(); if (is_array($rows2) && count($rows2) && isset($rows2['ia_control'])) { - $rows2 = [0 => $rows2]; + $rows2 = [ + 0 => $rows2 + ]; } if (is_array($rows2) && count($rows2) && isset($rows2[0])) { foreach ($rows2 as $row2) { $find->add_IA_Control($row2['ia_control']); } - } - else { - $this->help->select("ia_controls", ["CONCAT(`type`, '-', `type_id`) AS 'ia_control'"], [ + } else { + $this->help->select("ia_controls", [ + "CONCAT(`type`, '-', `type_id`) AS 'ia_control'" + ], [ [ 'field' => 'pdi_id', - 'op' => '=', + 'op' => '=', 'value' => $row['pdi_id'] ] ]); $rows2 = $this->help->execute(); if (is_array($rows2) && count($rows2) && isset($rows2['ia_control'])) { - $rows2 = [0 => $rows2]; + $rows2 = [ + 0 => $rows2 + ]; } if (is_array($rows2) && count($rows2) && isset($rows2[0])) { foreach ($rows2 as $row2) { @@ -4093,7 +4311,7 @@ class db } } - $ret[] = $find; + $ret[$find->get_PDI_ID()] = $find; } } @@ -4110,45 +4328,46 @@ class db */ public function get_Findings_by_Control($ste, $ia_ctrl, $status = null) { - if (!is_null($status)) { + if (! is_null($status)) { if ($status == "Open") { $status = " AND (fs.`status` = 'Open' OR fs.`status` = 'Exception')"; - } - else { + } else { $status = " AND fs.`status` = '" . $this->conn->real_escape_string($status) . "'"; } } - $sql = "SELECT " . - "f.`id`, f.`tgt_id`, f.`pdi_id`, f.`scan_id`, f.`findings_status_id` as 'findings_status', " . - "f.`notes`, f.`change_id`, f.`orig_src`, f.`finding_itr`, f.`cat` " . - "FROM `sagacity`.`findings` f " . - "JOIN `sagacity`.`findings_status` fs ON f.`findings_status_id` = fs.`id` " . - "JOIN `sagacity`.`stigs` s ON s.`pdi_id` = f.`pdi_id` " . - "JOIN `sagacity`.`target` t ON t.`id` = f.`tgt_id` " . - "JOIN `sagacity`.`finding_controls` fc ON fc.`finding_id` = f.`id` " . - "WHERE t.`ste_id` = " . $ste->get_ID() . " AND " . - "fc.`ia_control` = '" . $this->conn->real_escape_string($ia_ctrl->get_Control_ID()) . "'" . - (!is_null($status) ? $status : "") . " " . - "GROUP BY f.`pdi_id` " . - "ORDER BY f.`cat`, s.`stig_id`" - ; + $sql = <<get_ID()} AND + fc.`ia_control` = '{$this->conn->real_escape_string($ia_ctrl->get_Control_ID())}' + $status +GROUP BY f.`pdi_id` +ORDER BY f.`cat`, s.`stig_id` + +EOQ; if ($res = $this->conn->query($sql)) { $ret = []; while ($row = $res->fetch_assoc()) { - $find = new finding($row['id'], $row['tgt_id'], $row['pdi_id'], $row['scan_id'], $row['findings_status'], $row['notes'], $row['change_id'], $row['orig_src'], $row['finding_itr']); + $find = new finding($row['tgt_id'], $row['pdi_id'], $row['scan_id'], $row['findings_status'], $row['notes'], $row['change_id'], $row['orig_src'], $row['finding_itr']); $find->set_Category($row['cat']); - $sql2 = "SELECT `ia_control` FROM `sagacity`.`finding_controls` WHERE `finding_id` = " . $row['id']; + $sql2 = "SELECT `ia_control` FROM `sagacity`.`finding_controls` WHERE `tgt_id` = {$row['tgt_id']} AND `pdi_id` = {$row['pdi_id']}"; if ($res2 = $this->conn->query($sql2)) { if ($res2->num_rows) { while ($row2 = $res2->fetch_assoc()) { $find->add_IA_Control($row2['ia_control']); } - } - else { + } else { $sql2 = "SELECT CONCAT(`type`, '-', `type_id`) AS 'ia_control' FROM `sagacity`.`ia_controls` WHERE `pdi_id` = " . $row['pdi_id']; if ($res2 = $this->conn->query($sql2)) { while ($row2 = $res2->fetch_assoc()) { @@ -4162,8 +4381,7 @@ class db } return $ret; - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } @@ -4180,12 +4398,16 @@ class db */ public function get_Affected_Hosts_by_PDI($ste, $pdi) { - $sql = "SELECT (SELECT GROUP_CONCAT(DISTINCT t.`name` SEPARATOR ', ')) AS 'name' " . - "FROM `sagacity`.`findings` f " . - "JOIN `sagacity`.`target` t ON f.`tgt_id` = t.`id` " . - "WHERE t.`ste_id` = " . $ste->get_ID() . " AND " . - "f.`pdi_id` = " . $pdi->get_ID() - ; + $sql = <<get_ID()} AND + f.`pdi_id` = {$pdi->get_ID()} + +EOQ; if ($res = $this->conn->query($sql)) { return $res->fetch_assoc()['name']; @@ -4206,23 +4428,22 @@ class db $ret = []; $this->help->create_table("unaccounted_for_findings", [ [ - 'field' => 'pdi_id', + 'field' => 'pdi_id', 'datatype' => 'int(11)', - 'option' => 'UNIQUE NOT NULL' + 'option' => 'UNIQUE NOT NULL' ] ]); $this->help->execute(); $sql = "INSERT IGNORE INTO `unaccounted_for_findings` (`pdi_id`) SELECT DISTINCT(f.`pdi_id`) " . "FROM `findings` f JOIN `target` t ON t.`id` = f.`tgt_id` " . - "WHERE t.`ste_id` = " . $ste->get_ID(); + "WHERE t.`ste_id` = {$ste->get_ID()}"; $this->conn->real_query($sql); $class = 'cl'; if ($ste->get_System()->get_Classification() == 'Public') { $class = 'pub'; - } - elseif ($ste->get_System()->get_Classification() == 'Sensitive') { + } elseif ($ste->get_System()->get_Classification() == 'Sensitive') { $class = 'sen'; } @@ -4230,8 +4451,8 @@ class db "FROM `proc_level_type` plt " . "JOIN `ia_controls` ia ON CONCAT(ia.`type`, '-', ia.`type_id`) = plt.`proc_control` " . "WHERE " . - "plt.`level` = " . $ste->get_System()->get_MAC() . " AND " . - "plt.`class` = '$class')"; + "plt.`level` = {$ste->get_System()->get_MAC()} AND " . + "plt.`class` = '$class')"; $this->conn->real_query($sql); $sql = "SELECT s.`stig_id` FROM `unaccounted_for_findings` uaf JOIN `stigs` s ON s.`pdi_id` = uaf.`pdi_id`"; @@ -4242,7 +4463,7 @@ class db if (is_array($stig) && count($stig) && isset($stig[0]) && is_a($stig[0], 'stig')) { $stig = $stig[0]; } - if (!preg_match("/^\d{5}$/", $stig->get_ID())) { + if (! preg_match("/^\d{5}$/", $stig->get_ID())) { $ret[] = $stig; } } @@ -4255,27 +4476,28 @@ class db * Get count of all findings with the status passed in * * @param integer $cat_id - * The category we are searching + * The category we are searching * @param string $status - * The status to look for - * @param integer $cat [optional] - * The CAT/severity level - * @param proc_ia_controls $ctrl [optional] - * A IA control to filter for + * The status to look for + * @param integer $cat + * [optional] + * The CAT/severity level + * @param proc_ia_controls $ctrl + * [optional] + * A IA control to filter for * - * @return integer - * Returns the number of findings in the category that have the passed in status, severity, and control + * @return integer Returns the number of findings in the category that have the passed in status, severity, and control */ public function get_Finding_Count_By_Status($cat_id, $status, $cat = null, $ctrl = null) { $joins = [ - "LEFT JOIN sagacity.target_checklist tc ON t.id=tc.tgt_id", - "LEFT JOIN sagacity.pdi_checklist_lookup pcl ON pcl.checklist_id=tc.chk_id", - "LEFT JOIN sagacity.findings f ON f.pdi_id=pcl.pdi_id AND t.id=f.tgt_id", - "LEFT JOIN sagacity.findings_status fs ON fs.id=f.findings_status_id" + "JOIN target_checklist tc ON t.id = tc.tgt_id", + "JOIN pdi_checklist_lookup pcl ON pcl.checklist_id = tc.chk_id", + "LEFT JOIN findings f ON f.pdi_id = pcl.pdi_id AND t.id = f.tgt_id", + "LEFT JOIN findings_status fs ON fs.id = f.findings_status_id" ]; - if (!is_null($ctrl)) { - $joins[] = "JOIN `sagacity`.`finding_controls` fc ON fc.`finding_id`=f.`id`"; + if (! is_null($ctrl)) { + $joins[] = "JOIN finding_controls fc ON fc.tgt_id = f.tgt_id AND fc.pdi_id = f.pdi_id"; } $where = [ @@ -4284,59 +4506,60 @@ class db 'value' => $cat_id ], [ - 'field' => 'fs.status', - 'value' => $status, - 'sql_op' => 'AND', + 'field' => 'fs.status', + 'value' => $status, + 'sql_op' => 'AND', 'open-paren' => true ] ]; if ($status == 'Not Reviewed') { $where[] = [ - 'field' => 'fs.status', - 'op' => IS, - 'value' => null, - 'sql_op' => 'OR', + 'field' => 'fs.status', + 'op' => IS, + 'value' => null, + 'sql_op' => 'OR', 'close-paren' => true ]; - } - else { + } else { $where[] = [ 'close-paren' => true ]; } - if (!is_null($cat) && is_numeric($cat)) { + if (! is_null($cat) && is_numeric($cat)) { $where[] = [ - 'field' => 'f.cat', - 'value' => $cat, + 'field' => 'f.cat', + 'value' => $cat, 'sql_op' => 'AND' ]; } - if (!is_null($ctrl) && is_a($ctrl, 'proc_ia_controls')) { + if (! is_null($ctrl) && is_a($ctrl, 'proc_ia_controls')) { $where[] = [ - 'field' => 'fc.ia_control', - 'value' => $ctrl->get_Control_ID(), + 'field' => 'fc.ia_control', + 'value' => $ctrl->get_Control_ID(), 'sql_op' => 'AND' ]; } - $field = ($status == 'Not Reviewed' ? "COUNT(DISTINCT(pcl.pdi_id)) AS 'count'" : "COUNT(DISTINCT(f.id)) AS 'count'"); - $this->help->select_count("sagacity.target t", $where, ['table_joins' => $joins]); + $field = ($status == 'Not Reviewed' ? "COUNT(DISTINCT(pcl.pdi_id)) AS 'count'" : "COUNT(DISTINCT(f.id)) AS 'count'"); + $this->help->select_count("target t", $where, [ + 'table_joins' => $joins + ]); $this->help->sql = str_replace("COUNT(1) AS 'count'", $field, $this->help->sql); $cnt = $this->help->execute(); $joins = [ - "LEFT JOIN sagacity.pdi_checklist_lookup pcl ON pcl.checklist_id=c.id", - "LEFT JOIN sagacity.findings f ON f.pdi_id=pcl.pdi_id", - "LEFT JOIN sagacity.findings_status fs ON f.findings_status_id=fs.id", - "JOIN sagacity.target t ON t.id=f.tgt_id" + "JOIN pdi_checklist_lookup pcl ON pcl.checklist_id = c.id", + "JOIN findings f ON f.pdi_id = pcl.pdi_id", + "LEFT JOIN findings_status fs ON f.findings_status_id = fs.id", + "JOIN target t ON t.id = f.tgt_id" ]; - if (!is_null($ctrl) && is_a($ctrl, 'proc_ia_controls')) { - $joins[] = "JOIN sagacity.finding_controls fc ON fc.finding_id=f.id"; + if (! is_null($ctrl) && is_a($ctrl, 'proc_ia_controls')) { + $joins[] = "JOIN finding_controls fc ON fc.tgt_id = f.tgt_id AND fc.pdi_id = f.pdi_id"; } $where = [ @@ -4345,50 +4568,51 @@ class db 'value' => $cat_id ], [ - 'field' => 'c.name', - 'value' => 'Orphan', + 'field' => 'c.name', + 'value' => 'Orphan', 'sql_op' => 'AND' ], [ - 'field' => 'fs.status', - 'value' => $status, - 'sql_op' => 'AND', + 'field' => 'fs.status', + 'value' => $status, + 'sql_op' => 'AND', 'open-paren' => true ] ]; if ($status == 'Not Reviewed') { $where[] = [ - 'field' => 'fs.status', - 'op' => IS, - 'value' => null, - 'sql_op' => 'OR', + 'field' => 'fs.status', + 'op' => IS, + 'value' => null, + 'sql_op' => 'OR', 'close-paren' => true ]; - } - else { - $where[] =[ + } else { + $where[] = [ 'close-paren' => true ]; } - if (!is_null($cat) && is_numeric($cat)) { + if (! is_null($cat) && is_numeric($cat)) { $where[] = [ - 'field' => 'f.cat', - 'value' => $cat, + 'field' => 'f.cat', + 'value' => $cat, 'sql_op' => 'AND' ]; } - if (!is_null($ctrl) && is_a($ctrl, 'proc_ia_controls')) { + if (! is_null($ctrl) && is_a($ctrl, 'proc_ia_controls')) { $where[] = [ - 'field' => 'fc.ia_control', - 'value' => $ctrl->get_Control_ID(), + 'field' => 'fc.ia_control', + 'value' => $ctrl->get_Control_ID(), 'sql_op' => 'AND' ]; } - $this->help->select_count("sagacity.checklist c", $where, array('table_joins' => $joins)); + $this->help->select_count("checklist c", $where, array( + 'table_joins' => $joins + )); $this->help->sql = str_replace("COUNT(1) AS 'count'", $field, $this->help->sql); $cnt += $this->help->execute(); @@ -4400,55 +4624,66 @@ class db * Get count of all findings with the status passed in * * @param ste $ste - * The category we are searching + * The category we are searching * @param string $status - * The status to look for + * The status to look for * @param integer $cat - * The CAT/severity level + * The CAT/severity level * @param proc_ia_controls $ctrl - * A IA control to filter for + * A IA control to filter for * - * @return integer - * Returns the number of findings with status + * @return integer Returns the number of findings with status */ public function get_STE_Finding_Count_By_Status($ste, $status, $cat = null, $ctrl = null) { - $sql = "SELECT " . - ($status == 'Not Reviewed' ? "(SELECT COUNT(DISTINCT(pcl.`pdi_id`))" : "(SELECT COUNT(DISTINCT(f.`id`))") . - "FROM `sagacity`.`target` t " . - "LEFT JOIN `sagacity`.`target_checklist` tc ON t.`id` = tc.`tgt_id` " . - "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = tc.`chk_id` " . - "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` AND t.`id` = f.`tgt_id` " . - "LEFT JOIN `sagacity`.`findings_status` fs ON fs.`id` = f.`findings_status_id` " . - (!is_null($ctrl) ? "JOIN `sagacity`.`finding_controls` fc ON fc.`finding_id` = f.`id` " : "") . - "WHERE t.`ste_id` = " . $this->conn->real_escape_string($ste->get_ID()) . " AND " . - "(fs.`status` = '" . $this->conn->real_escape_string($status) . "' " . - ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : "") . - ") " . - (!is_null($cat) ? "AND f.`cat` = $cat " : "") . - (!is_null($ctrl) ? "AND fc.`ia_control` = '" . $ctrl->get_Control_ID() . "' " : "") . - ")" . - " + " . - ($status == 'Not Reviewed' ? "(SELECT COUNT(DISTINCT(pcl.`pdi_id`))" : "(SELECT COUNT(DISTINCT(f.`id`))") . - "FROM `sagacity`.`checklist` c " . - "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = c.`id` " . - "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` " . - "LEFT JOIN `sagacity`.`findings_status` fs ON f.`findings_status_id` = fs.`id` " . - "JOIN `sagacity`.`target` t ON t.`id` = f.`tgt_id` " . - (!is_null($ctrl) ? "JOIN `sagacity`.`finding_controls` fc ON fc.`finding_id` = f.`id` " : "") . - "WHERE t.`ste_id` = " . $this->conn->real_escape_string($ste->get_ID()) . " AND " . - "c.`name` = 'Orphan' AND " . - "(fs.`status` = '" . $this->conn->real_escape_string($status) . "' " . - ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : "") . - ") " . - (!is_null($cat) ? "AND f.`cat` = $cat " : "") . - (!is_null($ctrl) ? "AND fc.`ia_control` = '" . $ctrl->get_Control_ID() . "' " : "") . - ") AS 'sum_count'"; + $field = ($status == 'Not Reviewed' ? "SELECT COUNT(DISTINCT(pcl.`pdi_id`))" : "SELECT COUNT(DISTINCT(f.`id`))"); + $ctrl_join = (! is_null($ctrl) ? "JOIN `sagacity`.`finding_controls` fc ON fc.`tgt_id` = f.`tgt_id` AND fc.`pdi_id` = f.`pdi_id` " : ""); + $status_clause = ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : ""); + $cat_clause = (! is_null($cat) ? "AND f.`cat` = $cat " : ""); + $ctrl_clause = (! is_null($ctrl) ? "AND fc.`ia_control` = '{$ctrl->get_Control_ID()}' " : ""); + $sql = <<conn->real_escape_string($ste->get_ID())} AND + ( + fs.`status` = '{$this->conn->real_escape_string($status)}' + $status_clause + ) + $cat_clause + $ctrl_clause +) + + +( + $field + FROM `sagacity`.`checklist` c + LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = c.`id` + LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` + LEFT JOIN `sagacity`.`findings_status` fs ON f.`findings_status_id` = fs.`id` + JOIN `sagacity`.`target` t ON t.`id` = f.`tgt_id` + $ctrl_join + WHERE + t.`ste_id` = {$this->conn->real_escape_string($ste->get_ID())} AND + c.`name` = 'Orphan' AND + ( + fs.`status` = '{$this->conn->real_escape_string($status)}' + $status_clause + ) + $cat_clause + $ctrl_clause +) AS 'sum_count' + +EOQ; if ($res = $this->conn->query($sql)) { return $res->fetch_assoc()['sum_count']; - } - else { + } else { return 0; } } @@ -4457,61 +4692,60 @@ class db * Get count of all findings with the status passed in * * @param target $tgt - * The target we are searching + * The target we are searching * @param string $status - * The status to look for - * @param integer $cat [optional] - * The CAT/severity level - * @param proc_ia_controls $ctrl [optional] - * A IA control to filter for - * @param array $chk_ids [optional] - * @param boolean $is_orphan [optional] + * The status to look for + * @param integer $cat + * [optional] + * The CAT/severity level + * @param proc_ia_controls $ctrl + * [optional] + * A IA control to filter for + * @param array $chk_ids + * [optional] + * @param boolean $is_orphan + * [optional] * - * @return integer - * Returns the number of findings with status 'False Positives' + * @return integer Returns the number of findings with status 'False Positives' */ public function get_Host_Finding_Count_By_Status($tgt, $status, $cat = null, $ctrl = null, $chk_ids = null, $is_orphan = false) { - if (!$is_orphan) { + if (! $is_orphan) { $sql = "SELECT (SELECT COUNT(DISTINCT(pcl.`pdi_id`)) " . - "FROM `sagacity`.`target` t " . - "LEFT JOIN `sagacity`.`target_checklist` tc ON t.`id` = tc.`tgt_id` " . - "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = tc.`chk_id` " . - "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` AND t.`id` = f.`tgt_id` " . - "LEFT JOIN `sagacity`.`findings_status` fs ON fs.`id` = f.`findings_status_id` " . - (!is_null($ctrl) ? "JOIN `sagacity`.`finding_controls` fc ON fc.`finding_id` = f.`id` " : "") . - "WHERE t.`id` = " . $this->conn->real_escape_string($tgt->get_ID()) . " AND " . - "(fs.`status` = '" . $this->conn->real_escape_string($status) . "' " . - ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : "") . - ") " . - (!is_null($cat) ? "AND f.`cat` = $cat " : "") . - (!is_null($ctrl) ? "AND fc.`ia_control` = '" . $ctrl->get_Control_ID() . "' " : "") . - (!is_null($chk_ids) ? "AND pcl.`checklist_id` IN (" . implode(", ", $chk_ids) . ") " : "") . - ")"; - } - else { + "FROM `sagacity`.`target` t " . + "LEFT JOIN `sagacity`.`target_checklist` tc ON t.`id` = tc.`tgt_id` " . + "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = tc.`chk_id` " . + "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` AND t.`id` = f.`tgt_id` " . + "LEFT JOIN `sagacity`.`findings_status` fs ON fs.`id` = f.`findings_status_id` " . + (! is_null($ctrl) ? "JOIN `sagacity`.`finding_controls` fc ON fc.`tgt_id` = f.`tgt_id` AND fc.`pdi_id` = f.`pdi_id` " : "") . + "WHERE t.`id` = {$this->conn->real_escape_string($tgt->get_ID())} AND " . + "(fs.`status` = '{$this->conn->real_escape_string($status)}' " . + ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : "") . ") " . + (! is_null($cat) ? "AND f.`cat` = $cat " : "") . + (! is_null($ctrl) ? "AND fc.`ia_control` = '{$ctrl->get_Control_ID()}' " : "") . + (! is_null($chk_ids) ? "AND pcl.`checklist_id` IN (" . implode(", ", $chk_ids) . ") " : "") . + ")"; + } else { $sql = "SELECT (SELECT COUNT(DISTINCT(pcl.`pdi_id`)) " . - "FROM `sagacity`.`checklist` c " . - "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = c.`id` " . - "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` " . - "LEFT JOIN `sagacity`.`findings_status` fs ON f.`findings_status_id` = fs.`id` " . - "JOIN `sagacity`.`target` t ON t.`id` = f.`tgt_id` " . - (!is_null($ctrl) ? "JOIN `sagacity`.`finding_controls` fc ON fc.`finding_id` = f.`id` " : "") . - "WHERE t.`id` = " . $this->conn->real_escape_string($tgt->get_ID()) . " AND " . - "c.`name` = 'Orphan' AND " . - "(fs.`status` = '" . $this->conn->real_escape_string($status) . "' " . - ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : "") . - ") " . - (!is_null($cat) ? "AND f.`cat` = $cat " : "") . - (!is_null($ctrl) ? "AND fc.`ia_control` = '" . $ctrl->get_Control_ID() . "' " : "") . - ")"; + "FROM `sagacity`.`checklist` c " . + "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = c.`id` " . + "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` " . + "LEFT JOIN `sagacity`.`findings_status` fs ON f.`findings_status_id` = fs.`id` " . + "JOIN `sagacity`.`target` t ON t.`id` = f.`tgt_id` " . + (! is_null($ctrl) ? "JOIN `sagacity`.`finding_controls` fc ON fc.`tgt_id` = f.`tgt_id` AND fc.`pdi_id` = f.`pdi_id` " : "") . + "WHERE t.`id` = {$this->conn->real_escape_string($tgt->get_ID())} AND " . + "c.`name` = 'Orphan' AND " . + "(fs.`status` = '{$this->conn->real_escape_string($status)}' " . + ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : "") . ") " . + (! is_null($cat) ? "AND f.`cat` = $cat " : "") . + (! is_null($ctrl) ? "AND fc.`ia_control` = '{$ctrl->get_Control_ID()}' " : "") . + ")"; } $sql .= " AS 'sum_count'"; if ($res = $this->conn->query($sql)) { return $res->fetch_assoc()['sum_count']; - } - else { + } else { return 0; } } @@ -4528,129 +4762,122 @@ class db public function get_Control_Finding_Count($ctrl, $ste, $status, $cat = null) { $sql = "SELECT " . - "IFNULL((SELECT COUNT(1) " . - "FROM `target` t " . - "LEFT JOIN `target_checklist` tc ON t.`id` = tc.`tgt_id` " . - "LEFT JOIN `pdi_checklist_lookup` pcl ON pcl.`checklist_id` = tc.`chk_id` " . - "LEFT JOIN `findings` f ON f.`pdi_id` = pcl.`pdi_id` AND t.`id` = f.`tgt_id` " . - "LEFT JOIN `findings_status` fs ON fs.`id` = f.`findings_status_id` " . - "LEFT JOIN `finding_controls` fc ON fc.`finding_id` = f.`id` " . - "WHERE " . - "(fs.`status` = '$status' " . - ($status == 'Open' ? " OR fs.`status` = 'Exception'" : "") . - ($status == 'Not a Finding' ? " OR fs.`status` = 'Not Applicable'" : "") . - ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : "") . - ") AND " . - (!is_null($cat) ? "f.`cat` = $cat AND " : "") . - (!is_null($ctrl) ? "fc.`ia_control` = '" . $ctrl->get_Control_ID() . "' AND " : "") . - "t.`ste_id` = $ste " . - "GROUP BY f.`pdi_id`" . - "), 0)" . - " + " . - "IFNULL((SELECT COUNT(1) " . - "FROM `checklist` c " . - "LEFT JOIN `pdi_checklist_lookup` pcl ON pcl.`checklist_id` = c.`id` " . - "LEFT JOIN `findings` f ON f.`pdi_id` = pcl.`pdi_id` " . - "LEFT JOIN `findings_status` fs ON f.`findings_status_id` = fs.`id` " . - "LEFT JOIN `target` t ON t.`id` = f.`tgt_id` " . - "LEFT JOIN `finding_controls` fc ON fc.`finding_id` = f.`id` " . - "WHERE " . - "c.`name` = 'Orphan' AND " . - "(fs.`status` = '$status' " . - ($status == 'Open' ? " OR fs.`status` = 'Exception'" : "") . - ($status == 'Not a Finding' ? " OR fs.`status` = 'Not Applicable'" : "") . - ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : "") . - ") AND " . - (!is_null($cat) ? "f.`cat` = $cat AND " : "") . - (!is_null($ctrl) ? "fc.`ia_control` = '" . $ctrl->get_Control_ID() . "' AND " : "") . - "t.`ste_id` = $ste " . - "GROUP BY f.`pdi_id`" . - "), 0) AS 'sum_count'"; - /* - $sql = "SELECT ". - "(SELECT COUNT(DISTINCT(f.`tgt_id`))". - "FROM `targets`.`target` t ". - "LEFT JOIN `targets`.`target_checklist` tc ON t.`id` = tc.`tgt_id` ". - "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = tc.`chk_id` ". - "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` AND t.`id` = f.`tgt_id` ". - "LEFT JOIN `sagacity`.`findings_status` fs ON fs.`id` = f.`findings_status_id` ". - (!is_null($ctrl) ? "JOIN `sagacity`.`finding_controls` fc ON fc.`finding_id` = f.`id` " : ""). - "WHERE t.`ste_id` = ".$this->conn->real_escape_string($ste->get_ID())." AND ". - "(fs.`status` = '".$this->conn->real_escape_string($status)."' ". - ($status == 'Open' ? " OR fs.`status` = 'Exception'" : ""). - ($status == 'Not a Finding' ? " OR fs.`status` = 'Not Applicable'" : ""). - ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : ""). - ") ". - (!is_null($ctrl) ? "AND fc.`ia_control` = '".$ctrl->get_Control_ID()."' " : ""). - ")". - - " + ". - - "(SELECT COUNT(DISTINCT(f.`tgt_id`))". - "FROM `sagacity`.`checklist` c ". - "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = c.`id` ". - "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` ". - "LEFT JOIN `sagacity`.`findings_status` fs ON f.`findings_status_id` = fs.`id` ". - "JOIN `targets`.`target` t ON t.`id` = f.`tgt_id` ". - (!is_null($ctrl) ? "JOIN `sagacity`.`finding_controls` fc ON fc.`finding_id` = f.`id` " : ""). - "WHERE t.`ste_id` = ".$this->conn->real_escape_string($ste->get_ID())." AND ". - "c.`name` = 'Orphan' AND ". - "(fs.`status` = '".$this->conn->real_escape_string($status)."' ". - ($status == 'Open' ? " OR fs.`status` = 'Exception'" : ""). - ($status == 'Not a Finding' ? " OR fs.`status` = 'Not Applicable'" : ""). - ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : ""). - ") ". - (!is_null($ctrl) ? "AND fc.`ia_control` = '".$ctrl->get_Control_ID()."' " : ""). - ") AS 'sum_count'"; - */ + "IFNULL((SELECT COUNT(1) " . + "FROM `target` t " . + "LEFT JOIN `target_checklist` tc ON t.`id` = tc.`tgt_id` " . + "LEFT JOIN `pdi_checklist_lookup` pcl ON pcl.`checklist_id` = tc.`chk_id` " . + "LEFT JOIN `findings` f ON f.`pdi_id` = pcl.`pdi_id` AND t.`id` = f.`tgt_id` " . + "LEFT JOIN `findings_status` fs ON fs.`id` = f.`findings_status_id` " . + "LEFT JOIN `finding_controls` fc ON fc.`tgt_id` = f.`tgt_id` AND fc.`pdi_id` = f.`pdi_id` " . + "WHERE " . + "(fs.`status` = '$status' " . + ($status == 'Open' ? " OR fs.`status` = 'Exception'" : "") . + ($status == 'Not a Finding' ? " OR fs.`status` = 'Not Applicable'" : "") . + ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : "") . + ") AND " . + (! is_null($cat) ? "f.`cat` = $cat AND " : "") . + (! is_null($ctrl) ? "fc.`ia_control` = '{$ctrl->get_Control_ID()}' AND " : "") . + "t.`ste_id` = $ste " . + "GROUP BY f.`pdi_id`" . "), 0)" . + " + " . + "IFNULL((SELECT COUNT(1) " . + "FROM `checklist` c " . + "LEFT JOIN `pdi_checklist_lookup` pcl ON pcl.`checklist_id` = c.`id` " . + "LEFT JOIN `findings` f ON f.`pdi_id` = pcl.`pdi_id` " . + "LEFT JOIN `findings_status` fs ON f.`findings_status_id` = fs.`id` " . + "LEFT JOIN `target` t ON t.`id` = f.`tgt_id` " . + "LEFT JOIN `finding_controls` fc ON fc.`tgt_id` = f.`tgt_id` AND fc.`pdi_id` = f.`pdi_id` " . + "WHERE " . + "c.`name` = 'Orphan' AND " . + "(fs.`status` = '$status' " . + ($status == 'Open' ? " OR fs.`status` = 'Exception'" : "") . + ($status == 'Not a Finding' ? " OR fs.`status` = 'Not Applicable'" : "") . + ($status == 'Not Reviewed' ? " OR fs.`status` IS NULL" : "") . ") AND " . + (! is_null($cat) ? "f.`cat` = $cat AND " : "") . + (! is_null($ctrl) ? "fc.`ia_control` = '{$ctrl->get_Control_ID()}' AND " : "") . + "t.`ste_id` = $ste " . + "GROUP BY f.`pdi_id`" . "), 0) AS 'sum_count'"; if ($res = $this->conn->query($sql)) { return $res->fetch_assoc()['sum_count']; - } - else { + } else { return 0; } } - + /** - * Function for retrieving the notes from a particular finding + * Getter method to get finding notes * - * @param integer $pdi_id - * @param integer $tgt_id - * - * @return string|NULL + * @param finding $find */ - public function get_Finding_Notes($pdi_id, $tgt_id) + public function get_Finding_Notes(finding &$find) { - $sql = "SELECT f.`notes` FROM `sagacity`.`findings` f " . - "WHERE f.`pdi_id` = " . $this->conn->real_escape_string($pdi_id) . - " AND f.`tgt_id` = " . $this->conn->real_escape_string($tgt_id); - - if ($res = $this->conn->query($sql)) { - if ($res->num_rows) { - $row = $res->fetch_assoc(); - return $row['notes']; + $this->help->select("analyst_notes", ['note'], [ + [ + 'field' => 'tgt_id', + 'op' => '=', + 'value' => $find->get_Tgt_ID() + ], + [ + 'field' => 'pdi_id', + 'op' => '=', + 'value' => $find->get_PDI_ID(), + 'sql_op' => 'AND' + ] + ]); + $row = $this->help->execute(); + if(isset($row['note'])) { + $find->set_Analyst_Notes($row['note']); + } + + $this->help->select("scan_notes sn", ['sn.note', 'src.name'], [ + [ + 'field' => 'tgt_id', + 'op' => '=', + 'value' => $find->get_Tgt_ID() + ], + [ + 'field' => 'pdi_id', + 'op' => '=', + 'value' => $find->get_PDI_ID(), + 'sql_op' => 'AND' + ], + [ + 'field' => 'scan_id', + 'op' => '=', + 'value' => $find->get_Scan_ID(), + 'sql_op' => 'AND' + ] + ], [ + 'table_joins' => [ + "JOIN scans s ON sn.scan_id = s.id", + "JOIN sources src ON src.id = s.src_id" + ] + ]); + $rows = $this->help->execute(); + if(is_array($rows) && count($rows) && isset($rows[0])) { + $notes = $find->get_Scanner_Notes(); + foreach($rows as $row) { + $notes .= $row['name'] . ":\r" . $row['note']; } + $find->set_Scanner_Notes($notes); + } elseif(isset($rows['note'])) { + $notes = $find->get_Scanner_Notes(); + $notes .= $rows['name'] . ":\r" . $rows['note']; + $find->set_Scanner_Notes($notes); } - else { - error_log($this->conn->error); - Sagacity_Error::sql_handler($sql); - } - - return null; } /** * Function to determine how pervasive a finding is across all targets * - * @TODO - FINISH + * @todo - FINISH * * @param ste $ste * @param proc_ia_controls $ia_ctrl * @param string $status */ public function get_Finding_Pervasivity_by_Control($ste, $ia_ctrl, $status = null) - { - } + {} /** * Function to return all the possible finding statuses @@ -4659,22 +4886,24 @@ class db */ public function get_Finding_Statuses() { - $sql = "SELECT `id`, `status` " . - "FROM `sagacity`.`findings_status`"; + $this->help->select("sagacity.findings_status", null); + $rows = $this->help->execute(); $ret = []; - if ($res = $this->conn->query($sql)) { - while ($row = $res->fetch_assoc()) { - $status = new finding_status(); - $status->id = $row['id']; - $status->status = $row['status']; + if(is_array($rows) && count($rows) && isset($rows[0])) { + foreach($rows as $row) { + $s = new finding_status(); + $s->id = $row['id']; + $s->status = $row['status']; - $ret[] = $status; + $ret[] = $s; } - } - else { - error_log($this->conn->error); - Sagacity_Error::sql_handler($sql); + } elseif(is_array($rows) && count($rows) && isset($rows['id'])) { + $s = new finding_status(); + $s->id = $rows['id']; + $s->status = $rows['status']; + + $ret[] = $s; } return $ret; @@ -4690,60 +4919,60 @@ class db */ public function get_Finding_Comparrison($left_tgt, $right_tgt) { - $ret = []; - $left_sql = "SELECT " . - "s.`stig_id`, pcl.`check_contents`, " . - "tgt.`id` AS 'tgt_id', tgt.`name` AS 'tgt_name', " . - "IF(f.`cat` IS NULL, pdi.`cat`, f.`cat`) AS 'cat', f.`notes`, " . - "IF(f.`findings_status_id` IS NULL, 'Not Reviewed', fs.`status`) AS 'finding_status', " . - "(SELECT GROUP_CONCAT(fc.`ia_control` SEPARATOR ' ') " . - "FROM `sagacity`.`finding_controls` fc " . - "WHERE fc.`finding_id` = f.`id`) AS 'finding_ia_controls', " . - "(SELECT GROUP_CONCAT(DISTINCT CONCAT(ia.`type`, '-', ia.`type_id`) SEPARATOR ' ') " . - "FROM `sagacity`.`ia_controls` ia " . - "WHERE ia.`pdi_id` = pcl.`pdi_id`) AS 'ia_controls' " . - "FROM `sagacity`.`checklist` chk " . - "JOIN `sagacity`.`target_checklist` tc ON tc.`chk_id` = chk.`id` " . - "JOIN `sagacity`.`target` tgt ON tgt.`id` = tc.`tgt_id` " . - "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = chk.`id` " . - "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` AND f.`tgt_id` = tgt.`id` " . - "LEFT JOIN `sagacity`.`findings_status` fs ON fs.`id` = f.`findings_status_id` " . - "LEFT JOIN `sagacity`.`stigs` s ON s.`pdi_id` = pcl.`pdi_id` " . - "LEFT JOIN `sagacity`.`pdi_catalog` pdi ON pdi.`id` = pcl.`pdi_id` " . - "WHERE tgt.`id` = " . $left_tgt->get_ID() . " " . - "GROUP BY s.`stig_id`, tgt.`name` " . - "ORDER BY s.`stig_id`, FIELD(chk.`type`, 'manual', 'iavm', 'policy', 'benchmark')"; + $ret = []; + $left_sql = "SELECT " . + "s.`stig_id`, pcl.`check_contents`, " . + "tgt.`id` AS 'tgt_id', tgt.`name` AS 'tgt_name', " . + "IF(f.`cat` IS NULL, pdi.`cat`, f.`cat`) AS 'cat', f.`notes`, " . + "IF(f.`findings_status_id` IS NULL, 'Not Reviewed', fs.`status`) AS 'finding_status', " . + "(SELECT GROUP_CONCAT(fc.`ia_control` SEPARATOR ' ') " . + "FROM `sagacity`.`finding_controls` fc " . + "WHERE fc.`tgt_id` = f.`tgt_id` AND fc.`pdi_id` = f.`pdi_id`) AS 'finding_ia_controls', " . + "(SELECT GROUP_CONCAT(DISTINCT CONCAT(ia.`type`, '-', ia.`type_id`) SEPARATOR ' ') " . + "FROM `sagacity`.`ia_controls` ia " . + "WHERE ia.`pdi_id` = pcl.`pdi_id`) AS 'ia_controls' " . + "FROM `sagacity`.`checklist` chk " . + "JOIN `sagacity`.`target_checklist` tc ON tc.`chk_id` = chk.`id` " . + "JOIN `sagacity`.`target` tgt ON tgt.`id` = tc.`tgt_id` " . + "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = chk.`id` " . + "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` AND f.`tgt_id` = tgt.`id` " . + "LEFT JOIN `sagacity`.`findings_status` fs ON fs.`id` = f.`findings_status_id` " . + "LEFT JOIN `sagacity`.`stigs` s ON s.`pdi_id` = pcl.`pdi_id` " . + "LEFT JOIN `sagacity`.`pdi_catalog` pdi ON pdi.`id` = pcl.`pdi_id` " . + "WHERE tgt.`id` = {$left_tgt->get_ID()} " . + "GROUP BY s.`stig_id`, tgt.`name` " . + "ORDER BY s.`stig_id`, FIELD(chk.`type`, 'manual', 'iavm', 'policy', 'benchmark')"; $right_sql = "SELECT " . - "s.`stig_id`, pcl.`check_contents`, " . - "tgt.`id` AS 'tgt_id', tgt.`name` AS 'tgt_name', " . - "IF(f.`cat` IS NULL, pdi.`cat`, f.`cat`) AS 'cat', f.`notes`, " . - "IF(f.`findings_status_id` IS NULL, 'Not Reviewed', fs.`status`) AS 'finding_status', " . - "(SELECT GROUP_CONCAT(fc.`ia_control` SEPARATOR ' ') " . - "FROM `sagacity`.`finding_controls` fc " . - "WHERE fc.`finding_id` = f.`id`) AS 'finding_ia_controls', " . - "(SELECT GROUP_CONCAT(DISTINCT CONCAT(ia.`type`, '-', ia.`type_id`) SEPARATOR ' ') " . - "FROM `sagacity`.`ia_controls` ia " . - "WHERE ia.`pdi_id` = pcl.`pdi_id`) AS 'ia_controls' " . - "FROM `sagacity`.`checklist` chk " . - "JOIN `sagacity`.`target_checklist` tc ON tc.`chk_id` = chk.`id` " . - "JOIN `sagacity`.`target` tgt ON tgt.`id` = tc.`tgt_id` " . - "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = chk.`id` " . - "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` AND f.`tgt_id` = tgt.`id` " . - "LEFT JOIN `sagacity`.`findings_status` fs ON fs.`id` = f.`findings_status_id` " . - "LEFT JOIN `sagacity`.`stigs` s ON s.`pdi_id` = pcl.`pdi_id` " . - "LEFT JOIN `sagacity`.`pdi_catalog` pdi ON pdi.`id` = pcl.`pdi_id` " . - "WHERE tgt.`id` = " . $right_tgt->get_ID() . " " . - "GROUP BY s.`stig_id`, tgt.`name` " . - "ORDER BY s.`stig_id`, FIELD(chk.`type`, 'manual', 'iavm', 'policy', 'benchmark')"; + "s.`stig_id`, pcl.`check_contents`, " . + "tgt.`id` AS 'tgt_id', tgt.`name` AS 'tgt_name', " . + "IF(f.`cat` IS NULL, pdi.`cat`, f.`cat`) AS 'cat', f.`notes`, " . + "IF(f.`findings_status_id` IS NULL, 'Not Reviewed', fs.`status`) AS 'finding_status', " . + "(SELECT GROUP_CONCAT(fc.`ia_control` SEPARATOR ' ') " . + "FROM `sagacity`.`finding_controls` fc " . + "WHERE fc.`tgt_id` = f.`tgt_id` AND fc.`pdi_id` = f.`pdi_id`) AS 'finding_ia_controls', " . + "(SELECT GROUP_CONCAT(DISTINCT CONCAT(ia.`type`, '-', ia.`type_id`) SEPARATOR ' ') " . + "FROM `sagacity`.`ia_controls` ia " . + "WHERE ia.`pdi_id` = pcl.`pdi_id`) AS 'ia_controls' " . + "FROM `sagacity`.`checklist` chk " . + "JOIN `sagacity`.`target_checklist` tc ON tc.`chk_id` = chk.`id` " . + "JOIN `sagacity`.`target` tgt ON tgt.`id` = tc.`tgt_id` " . + "LEFT JOIN `sagacity`.`pdi_checklist_lookup` pcl ON pcl.`checklist_id` = chk.`id` " . + "LEFT JOIN `sagacity`.`findings` f ON f.`pdi_id` = pcl.`pdi_id` AND f.`tgt_id` = tgt.`id` " . + "LEFT JOIN `sagacity`.`findings_status` fs ON fs.`id` = f.`findings_status_id` " . + "LEFT JOIN `sagacity`.`stigs` s ON s.`pdi_id` = pcl.`pdi_id` " . + "LEFT JOIN `sagacity`.`pdi_catalog` pdi ON pdi.`id` = pcl.`pdi_id` " . + "WHERE tgt.`id` = {$right_tgt->get_ID()} " . + "GROUP BY s.`stig_id`, tgt.`name` " . + "ORDER BY s.`stig_id`, FIELD(chk.`type`, 'manual', 'iavm', 'policy', 'benchmark')"; if ($res = $this->conn->query($left_sql)) { while ($row = $res->fetch_assoc()) { $ret['left'][$row['stig_id']] = array( - 'stig_id' => $row['stig_id'], - 'cat' => $row['cat'], - 'ia_controls' => (!empty($row['finding_ia_controls']) ? $row['finding_ia_controls'] : $row['ia_controls']), - 'status' => $row['finding_status'], - 'notes' => $row['notes'] + 'stig_id' => $row['stig_id'], + 'cat' => $row['cat'], + 'ia_controls' => (! empty($row['finding_ia_controls']) ? $row['finding_ia_controls'] : $row['ia_controls']), + 'status' => $row['finding_status'], + 'notes' => $row['notes'] ); } } @@ -4751,14 +4980,14 @@ class db if ($res = $this->conn->query($right_sql)) { while ($row = $res->fetch_assoc()) { $ret['right'][$row['stig_id']] = array( - 'stig_id' => $row['stig_id'], - 'cat' => $row['cat'], - 'ia_controls' => (!empty($row['finding_ia_controls']) ? $row['finding_ia_controls'] : $row['ia_controls']), - 'status' => $row['finding_status'], - 'notes' => $row['notes'] + 'stig_id' => $row['stig_id'], + 'cat' => $row['cat'], + 'ia_controls' => (! empty($row['finding_ia_controls']) ? $row['finding_ia_controls'] : $row['ia_controls']), + 'status' => $row['finding_status'], + 'notes' => $row['notes'] ); - if (!isset($ret['left'][$row['stig_id']])) { + if (! isset($ret['left'][$row['stig_id']])) { $ret['left'][$row['stig_id']] = null; } } @@ -4772,53 +5001,54 @@ class db * Add a finding * * @param scan $scan - * Scan that found this item + * Scan that found this item * @param array:target|target $tgts - * Array of targets or a single target that have this finding + * Array of targets or a single target that have this finding * @param array|finding $finding_data - * Array of data associated with the finding
- * [0] => 'stig id'
- * [1] => 'vms id'
- * [2] => 'category level (I, II, III)'
- * [3] => 'ia controls (space delimited)'
- * [4] => 'short title'
- * [5...n] => 'target status'
- * [n+1] => 'notes'
- * [n+2] => 'check contents'
- * [n+3] => 'missing pdi' + * Array of data associated with the finding
+ * [0] => 'stig id'
+ * [1] => 'vms id'
+ * [2] => 'category level (I, II, III)'
+ * [3] => 'ia controls (space delimited)'
+ * [4] => 'short title'
+ * [5...n] => 'target status'
+ * [n+1] => 'notes'
+ * [n+2] => 'check contents'
+ * [n+3] => 'missing pdi' */ public function add_Finding($scan, $tgts, $finding_data) { global $cmd; set_time_limit(0); $host_count = 0; - $ref = null; + $ref = null; if (is_array($tgts)) { $host_count = count($tgts); - } - else { - $host_count++; + } else { + $host_count ++; } if (preg_match('/\d\.\d+/', $finding_data[0])) { $finding_data[0] = str_pad($finding_data[0], 5, "0"); } - $stig_id = $finding_data[0]; - $vms_id = preg_replace("/V0+/i", "V-", $finding_data[1]); - $cat_lvl = substr_count($finding_data[2], 'I'); + $stig_id = $finding_data[0]; + $vms_id = preg_replace("/V0+/i", "V-", $finding_data[1]); + $cat_lvl = substr_count($finding_data[2], 'I'); $ia_controls = $finding_data[3]; $short_title = $finding_data[4]; - $notes = $finding_data[self::FIRST_ECHECKLIST_HOST_COL + $host_count]; + $notes = $finding_data[self::FIRST_ECHECKLIST_HOST_COL + $host_count]; if (preg_match('/SV\-.*_rule/', $stig_id)) { $ref = $this->get_SV_Rule(null, $stig_id); - } - elseif (preg_match('/CVE\-\d{4}\-\d+/', $stig_id)) { - $ref = [0 => $this->get_CVE($stig_id)]; - } - elseif (preg_match('/\d{4}\-[ABT]\-\d+/', $stig_id)) { - $ref = [0 => $this->get_IAVM($stig_id)]; + } elseif (preg_match('/CVE\-\d{4}\-\d+/', $stig_id)) { + $ref = [ + 0 => $this->get_CVE($stig_id) + ]; + } elseif (preg_match('/\d{4}\-[ABT]\-\d+/', $stig_id)) { + $ref = [ + 0 => $this->get_IAVM($stig_id) + ]; } if (is_null($ref) && $stig_id != 'No Reference') { @@ -4831,14 +5061,13 @@ class db if (is_array($ref) && count($ref) && isset($ref[0])) { $ref = $ref[0]; - } - else { + } else { // add a new checklist entry - $pdi = new pdi(null, $cat_lvl, 'NOW', $short_title, $short_title); + $pdi = new pdi(null, $cat_lvl, 'NOW', $short_title, $short_title); $pdi_id = $this->save_PDI($pdi); $stig = new stig($pdi_id, $stig_id, $short_title); - $ref = $stig; + $ref = $stig; $this->add_Stig($stig); $golddisk = new golddisk($pdi_id, $vms_id, $short_title); @@ -4849,8 +5078,8 @@ class db if (is_array($tgts)) { $updated_finding = []; - $new_finding = []; - $x = 0; + $new_finding = []; + $x = 0; foreach ($tgts as $tgt) { switch (strtolower(str_replace('_', ' ', $finding_data[self::FIRST_ECHECKLIST_HOST_COL + $x]))) { case 'not reviewed': @@ -4875,61 +5104,55 @@ class db if ($current_finding != null) { $current_status = $current_finding->get_Finding_Status_String(); - //$current_source = $current_finding->get(); + // $current_source = $current_finding->get(); if ($current_status != $status) { $current_notes = $current_finding->get_Notes(); - if (!$current_notes) { + if (! $current_notes) { $current_finding->set_Notes($notes); - } - else { + } else { if ($notes && stristr($current_notes, $notes) === false) { $current_finding->prepend_Notes($current_notes); } } - if (($current_status == 'Open' || $status == 'Open') && - ($current_status == 'Not Applicable' || $current_status == 'Not a Finding' || - $status == 'Not Applicable' || $status == 'Not a Finding')) { + if (($current_status == 'Open' || $status == 'Open') && ($current_status == 'Not Applicable' || $current_status == 'Not a Finding' || $status == 'Not Applicable' || $status == 'Not a Finding')) { $current_finding->set_Notes("OPEN CONFLICT: $current_status/$status\n$notes"); $current_finding->set_Change_ID(finding::TO_OPEN); - } - elseif (($current_status == 'Not a Finding' || $current_status == 'Not Applicable') && - ($status == 'Not a Finding' || $status == 'Not Applicable')) { + } elseif (($current_status == 'Not a Finding' || $current_status == 'Not Applicable') && ($status == 'Not a Finding' || $status == 'Not Applicable')) { $current_finding->set_Notes("NF/NA CONFLICT: $current_status/$status\n$notes"); $current_finding->set_Change_ID(finding::TO_NF); - } - else { + } else { $current_finding->set_Change_ID(finding::NC); } - $new_status = $current_finding->get_Deconflicted_Status($status); + $new_status = $current_finding->get_Deconflicted_Status($status); $new_status_id = $current_finding->get_Finding_Status_ID($new_status); $current_finding->set_Finding_Status($new_status_id); - $current_finding->set_Original_Source($scan->get_Source()->get_Name()); + $current_finding->set_Original_Source($scan->get_Source() + ->get_Name()); $current_finding->set_Finding_Iteration($current_finding->get_Finding_Iteration() + 1); $current_finding->set_Scan_ID($scan->get_ID()); $current_finding->set_Category($cat_lvl); $current_finding->set_IA_Controls($ia_controls); $updated_finding[] = $current_finding; - } - else { + } else { $current_notes = $current_finding->get_Notes(); - if (!$current_notes) { + if (! $current_notes) { $current_finding->set_Notes($notes); - } - else { + } else { if ($notes && stristr($current_notes, $notes) === false) { $current_finding->set_Notes($current_notes . PHP_EOL . $notes); } } $current_finding->set_Change_ID(finding::NC); - $current_finding->set_Original_Source($scan->get_Source()->get_Name()); + $current_finding->set_Original_Source($scan->get_Source() + ->get_Name()); $current_finding->set_Finding_Iteration($current_finding->get_Finding_Iteration() + 1); $current_finding->set_Scan_ID($scan->get_ID()); $current_finding->set_Category($cat_lvl); @@ -4937,9 +5160,8 @@ class db $updated_finding[] = $current_finding; } - } - else { - $new = new finding(null, $tgt->get_ID(), $ref->get_PDI_ID(), $scan->get_ID(), $status, $notes, 0, null, 1); + } else { + $new = new finding($tgt->get_ID(), $ref->get_PDI_ID(), $scan->get_ID(), $status, $notes, 0, null, 1); $new->set_Category($cat_lvl); $new->set_IA_Controls($ia_controls); @@ -4950,13 +5172,10 @@ class db $match = []; if (preg_match("/\(FP\-([a-zA-Z \-]+)\)/i", $notes, $match)) { $src = $match[1]; - //$src = str_replace("_", " ", $match[1]); - $sql = "REPLACE INTO `false_positives` (`pdi_id`, `src_id`, `notes`) VALUES (" . - $this->conn->real_escape_string($ref->get_PDI_ID()) . ", " . - "(SELECT `id` FROM `sources` WHERE `name` = '" . $this->conn->real_escape_string($src) . "'), " . - "'Common FP for $src')"; + // $src = str_replace("_", " ", $match[1]); + $sql = "REPLACE INTO `false_positives` (`pdi_id`, `src_id`, `notes`) VALUES (" . $this->conn->real_escape_string($ref->get_PDI_ID()) . ", " . "(SELECT `id` FROM `sources` WHERE `name` = '" . $this->conn->real_escape_string($src) . "'), " . "'Common FP for $src')"; - if (!$this->conn->real_query($sql)) { + if (! $this->conn->real_query($sql)) { error_log($this->conn->error); Sagacity_Error::sql_handler($sql); } @@ -4970,12 +5189,10 @@ class db if ($status == 'Exception') { $ste = $this->get_STE($tgt->get_STE_ID())[0]; - $sql = "REPLACE INTO `exceptions` (`pdi_id`, `sys_id`, `notes`) VALUES (" . - $this->conn->real_escape_string($ref->get_PDI_ID()) . ", " . - $this->conn->real_escape_string($ste->get_System()->get_ID()) . ", " . - "'')"; + $sql = "REPLACE INTO `exceptions` (`pdi_id`, `sys_id`, `notes`) VALUES (" . $this->conn->real_escape_string($ref->get_PDI_ID()) . ", " . $this->conn->real_escape_string($ste->get_System() + ->get_ID()) . ", " . "'')"; - if (!$this->conn->real_query($sql)) { + if (! $this->conn->real_query($sql)) { error_log($this->conn->error); Sagacity_Error::sql_handler($sql); } @@ -4985,84 +5202,106 @@ class db } } - $x++; + $x ++; } $notes = (isset($current_finding) && is_array($current_finding) && count($current_finding) ? $current_finding->get_Notes() . " " . $notes : $notes); if (isset($updated_finding) && is_array($updated_finding) && count($updated_finding) > 0) { + /** @var finding $finding */ foreach ($updated_finding as $finding) { - $update_sql = "UPDATE `findings` SET " . - "`scan_id` = " . $this->conn->real_escape_string($finding->get_Scan_ID()) . ", " . - "`findings_status_id` = " . $this->conn->real_escape_string($finding->get_Finding_Status()) . ", " . - "`notes` = '" . $this->conn->real_escape_string($finding->get_Notes()) . "', " . - "`change_id` = " . $this->conn->real_escape_string($finding->get_Change_ID()) . ", " . - "`orig_src` = '" . $this->conn->real_escape_string($finding->get_Original_Source()) . "', " . - "`finding_itr` = " . $this->conn->real_escape_string($finding->get_Finding_Iteration()) . ", " . - "`cat` = " . $this->conn->real_escape_string($finding->get_Category()) . - " WHERE `id` = " . $this->conn->real_escape_string($finding->get_ID()); + $this->help->update('findings', [ + 'scan_id' => $finding->get_Scan_ID(), + 'findings_status_id' => $finding->get_Finding_Status(), + 'notes' => $finding->get_Notes(), + 'change_id' => $finding->get_Change_ID(), + 'orig_src' => $finding->get_Original_Source(), + 'finding_itr' => $finding->get_Finding_Iteration(), + 'cat' => $finding->get_Category() + ], [ + [ + 'field' => 'tgt_id', + 'op' => '=', + 'value' => $finding->get_Tgt_ID() + ], + [ + 'field' => 'pdi_id', + 'op' => '=', + 'value' => $finding->get_PDI_ID(), + 'sql_op' => 'AND' + ] + ]); - $this->conn->ping(); - - if (!$this->conn->real_query($update_sql)) { - Sagacity_Error::sql_handler($update_sql); - error_log($this->conn->error); + if (! $this->help->execute()) { + $this->help->debug(E_ERROR); return false; } - $this->conn->real_query("DELETE FROM `finding_controls` WHERE `finding_id` = " . $finding->get_ID()); + $this->help->delete("finding_controls", null, [ + [ + 'field' => 'tgt_id', + 'op' => '=', + 'value' => $finding->get_Tgt_ID() + ], + [ + 'field' => 'pdi_id', + 'op' => '=', + 'value' => $finding->get_PDI_ID(), + 'sql_op' => 'AND' + ] + ]); + $this->help->execute(); - $sql2 = "INSERT INTO `finding_controls` (`finding_id`, `ia_control`) VALUES "; + $params = []; foreach ($finding->get_IA_Controls() as $ia) { - $sql2 .= "({$this->conn->real_escape_string($finding->get_ID())}, " . - "'{$this->conn->real_escape_string($ia)}'),"; - } - $sql2 = substr($sql2, 0, -1); - if (strlen($sql2) > 74) { - $this->conn->real_query($sql2); + $params[] = [ + $finding->get_Tgt_ID(), + $finding->get_PDI_ID(), + $ia + ]; } + $this->help->extended_insert('finding_controls', ['tgt_id', 'pdi_id', 'ia_control'], $params, true); + $this->help->execute(); } } if (isset($new_finding) && count($new_finding) > 0) { + $finding_params = []; + $finding_control_params = []; foreach ($new_finding as $finding) { - $insert_sql = "INSERT INTO `findings` (`tgt_id`, `pdi_id`, `scan_id`, `findings_status_id`, `cat`, `notes`) VALUES " . - "(" . $this->conn->real_escape_string($finding->get_Tgt_ID()) . ", " . - $this->conn->real_escape_string($finding->get_PDI_ID()) . ", " . - $this->conn->real_escape_string($finding->get_Scan_ID()) . ", " . - $this->conn->real_escape_string($finding->get_Finding_Status()) . ", " . - $this->conn->real_escape_string($finding->get_Category()) . ", " . - "'" . $this->conn->real_escape_string($finding->get_Notes()) . "')"; + /** @var finding $finding */ + $finding_params[] = [ + $finding->get_Tgt_ID(), + $finding->get_PDI_ID(), + $finding->get_Scan_ID(), + $finding->get_Finding_Status(), + $finding->get_Category(), + $finding->get_Notes() + ]; - $this->conn->ping(); - - if (strlen($insert_sql) > 103) { - if (!$this->conn->real_query($insert_sql)) { - Sagacity_Error::sql_handler($insert_sql); - error_log($this->conn->error); - return false; - } - } - - $find_id = $this->conn->insert_id; - - $sql2 = "INSERT INTO `finding_controls` (`finding_id`, `ia_control`) VALUES "; foreach ($finding->get_IA_Controls() as $ia) { - $sql2 .= "({$this->conn->real_escape_string($find_id)}, " . - "'{$this->conn->real_escape_string($ia)}'),"; + $finding_control_params[] = [ + $finding->get_Tgt_ID(), + $finding->get_PDI_ID(), + $ia + ]; } - $sql2 = substr($sql2, 0, -1); - if (strlen($sql2) > 74) { - $this->conn->real_query($sql2); + } + + if(is_array($finding_params) && count($finding_params)) { + $this->extended_insert('findings', ['tgt_id', 'pdi_id', 'scan_id', 'findings_status_id', 'cat', 'notes'], $finding_params, true); + + if($this->help->execute()) { + $this->help->extended_insert('finding_controls', ['tgt_id', 'pdi_id', 'ia_control'], $finding_control_params, true); + $this->help->execute(); } } } return true; - } - else { + } else { $updated_finding = null; - $new_finding = null; + $new_finding = null; switch (strtolower(str_replace('_', ' ', $finding_data[self::FIRST_ECHECKLIST_HOST_COL]))) { case 'not reviewed': case 'not a finding': @@ -5079,74 +5318,66 @@ class db $current_finding = $this->get_Finding($tgts, $ref); if (is_array($current_finding) && count($current_finding) > 0) { - $current_finding = $current_finding[0]; + $current_finding = current($current_finding); } $current_status = ''; - if (is_array($current_finding) && count($current_finding)) { + if (is_a($current_finding, 'finding')) { $current_status = $current_finding->get_Finding_Status_String(); - //$current_source = $current_finding->get(); if ($current_status != $status) { $current_notes = $current_finding->get_Notes(); - if (!$current_notes) { + if (! $current_notes) { $current_finding->set_Notes($notes); - } - else { + } else { if ($notes && stristr($current_notes, $notes) === false) { $current_finding->set_Notes($current_notes . PHP_EOL . $notes); } } - if (($current_status == 'Open' || $status == 'Open') && - ($current_status == 'Not Applicable' || $current_status == 'Not a Finding' || - $status == 'Not Applicable' || $status == 'Not a Finding')) { + if (($current_status == 'Open' || $status == 'Open') && ($current_status == 'Not Applicable' || $current_status == 'Not a Finding' || $status == 'Not Applicable' || $status == 'Not a Finding')) { $current_finding->set_Notes("OPEN CONFLICT: $current_status/$status\n$notes"); $current_finding->set_Change_ID(finding::TO_OPEN); - } - elseif (($current_status == 'Not a Finding' || $current_status == 'Not Applicable') && - ($status == 'Not a Finding' || $status == 'Not Applicable')) { + } elseif (($current_status == 'Not a Finding' || $current_status == 'Not Applicable') && ($status == 'Not a Finding' || $status == 'Not Applicable')) { $current_finding->set_Notes("NF/NA CONFLICT: $current_status/$status\n$notes"); $current_finding->set_Change_ID(finding::TO_NF); - } - else { + } else { $current_finding->set_Change_ID(finding::NC); } - $new_status = $current_finding->get_Deconflicted_Status($status); + $new_status = $current_finding->get_Deconflicted_Status($status); $new_status_id = $current_finding->get_Finding_Status_ID($new_status); $current_finding->set_Finding_Status($new_status_id); - $current_finding->set_Original_Source($scan->get_Source()->get_Name()); + $current_finding->set_Original_Source($scan->get_Source() + ->get_Name()); $current_finding->set_Finding_Iteration($current_finding->get_Finding_Iteration() + 1); $current_finding->set_Scan_ID($scan->get_ID()); $updated_finding = $current_finding; - } - else { + } else { $current_notes = $current_finding->get_Notes(); - if (!$current_notes) { + if (! $current_notes) { $current_finding->set_Notes($notes); - } - else { + } else { if ($notes && stristr($current_notes, $notes) === false) { $current_finding->set_Notes($current_notes . PHP_EOL . $notes); } } $current_finding->set_Change_ID(finding::NC); - $current_finding->set_Original_Source($scan->get_Source()->get_Name()); + $current_finding->set_Original_Source($scan->get_Source() + ->get_Name()); $current_finding->set_Finding_Iteration($current_finding->get_Finding_Iteration() + 1); $current_finding->set_Scan_ID($scan->get_ID()); $updated_finding = $current_finding; } - } - else { - $new_finding = new finding(null, $tgts->get_ID(), $ref->get_PDI_ID(), $scan->get_ID(), $status, $notes, 0, null, 1); + } else { + $new_finding = new finding($tgts->get_ID(), $ref->get_PDI_ID(), $scan->get_ID(), $status, $notes, 0, null, 1); $new_finding->set_Category($cat_lvl); $new_finding->set_IA_Controls($ia_controls); @@ -5154,71 +5385,86 @@ class db $notes = (isset($current_finding) && is_array($current_finding) && count($current_finding) ? $current_finding->get_Notes() . " " . $notes : $notes); - if (isset($updated_finding) && !is_null($updated_finding)) { - $update_sql = "UPDATE `findings` SET " . - "`scan_id` = " . $this->conn->real_escape_string($updated_finding->get_Scan_ID()) . ", " . - "`findings_status_id` = " . $this->conn->real_escape_string($updated_finding->get_Finding_Status()) . ", " . - "`notes` = '" . $this->conn->real_escape_string($updated_finding->get_Notes()) . "', " . - "`change_id` = " . $this->conn->real_escape_string($updated_finding->get_Change_ID()) . ", " . - "`orig_src` = '" . $this->conn->real_escape_string($updated_finding->get_Original_Source()) . "', " . - "`finding_itr` = " . $this->conn->real_escape_string($updated_finding->get_Finding_Iteration()) . ", " . - "`cat` = " . $this->conn->real_escape_string($updated_finding->get_Category()) . - " WHERE `id` = " . $this->conn->real_escape_string($updated_finding->get_ID()); + if (isset($updated_finding) && ! is_null($updated_finding)) { + $this->help->update("findings", [ + 'scan_id' => $updated_finding->get_Scan_ID(), + 'findings_status_id' => $updated_finding->get_Finding_status(), + 'notes' => $updated_finding->get_Notes(), + 'change_id' => $updated_finding->get_Change_ID(), + 'orig_src' => $updated_finding->get_Original_Source(), + 'finding_itr' => $updated_finding->get_Finding_Iteration(), + 'cat' => $updated_finding->get_Category() + ], [ + [ + 'field' => 'tgt_id', + 'op' => '=', + 'value' => $updated_finding->get_Tgt_ID() + ], + [ + 'field' => 'pdi_id', + 'op' => '=', + 'value' => $updated_finding->get_PDI_ID(), + 'sql_op' => 'AND' + ] + ]); - $this->conn->ping(); - - if (!$this->conn->real_query($update_sql)) { - Sagacity_Error::sql_handler($update_sql); - error_log($this->conn->error); + if (! $this->help->execute()) { + $this->help->debug(E_ERROR); return false; } - $this->conn->real_query("DELETE FROM `sagacity`.`finding_controls` WHERE `finding_id` = " . $updated_finding->get_ID()); - - $sql2 = "INSERT INTO `sagacity`.`finding_controls` (`finding_id`, `ia_control`) VALUES "; + $this->help->delete("finding_controls", null, [ + [ + 'field' => 'tgt_id', + 'op' => '=', + 'value' => $updated_finding->get_Tgt_ID() + ], + [ + 'field' => 'pdi_id', + 'op' => '=', + 'value' => $updated_finding->get_PDI_ID(), + 'sql_op' => 'AND' + ] + ]); + $this->help->execute(); + $params = []; foreach ($updated_finding->get_IA_Controls() as $ia) { - $sql2 .= "(" . - $this->conn->real_escape_string($updated_finding->get_ID()) . ", " . - "'" . $this->conn->real_escape_string($ia) . "'), "; + $params[] = [ + $updated_finding->get_Tgt_ID(), + $updated_finding->get_PDI_ID(), + $ia + ]; } - - $sql2 = substr($sql2, 0, -1); - - $this->conn->real_query($sql2); + $this->help->extended_insert("finding_controls", ['tgt_id', 'pdi_id', 'ia_control'], $params, true); + $this->help->execute(); } - if (isset($new_finding) && !is_null($new_finding)) { - $insert_sql = "INSERT INTO `sagacity`.`findings` (`tgt_id`, `pdi_id`, `scan_id`, `findings_status_id`, `notes`, `cat`) VALUES " . - "(" . $this->conn->real_escape_string($new_finding->get_Tgt_ID()) . ", " . - $this->conn->real_escape_string($new_finding->get_PDI_ID()) . ", " . - $this->conn->real_escape_string($new_finding->get_Scan_ID()) . ", " . - $this->conn->real_escape_string($new_finding->get_Finding_Status()) . ", " . - "'" . $this->conn->real_escape_string($new_finding->get_Notes()) . "', " . - $this->conn->real_escape_string($new_finding->get_Category()) . ")"; + if (isset($new_finding) && ! is_null($new_finding)) { + $this->help->insert("findings", [ + 'tgt_id' => $new_finding->get_Tgt_ID(), + 'pdi_id' => $new_finding->get_PDI_ID(), + 'scan_id' => $new_finding->get_Scan_ID(), + 'findings_status_id' => $new_finding->get_Finding_Status(), + 'notes' => $new_finding->get_Notes(), + 'cat' => $new_finding->get_Category() + ], true); - $this->conn->ping(); - - if (strlen($insert_sql) > 97) { - if (!$this->conn->real_query($insert_sql)) { - Sagacity_Error::sql_handler($insert_sql); - error_log($this->conn->error); - return false; - } + if(!$this->help->execute()) { + $this->help->debug(E_ERROR); + return false; } - $find_id = $this->conn->insert_id; - - $sql2 = "INSERT INTO `sagacity`.`finding_controls` (`finding_id`, `ia_control`) VALUES "; + $params = []; foreach ($new_finding->get_IA_Controls() as $ia) { - $sql2 .= "(" . - $this->conn->real_escape_string($find_id) . ", " . - "'" . $this->conn->real_escape_string($ia) . "'), "; + $params[] = [ + $new_finding->get_Tgt_ID(), + $new_finding->get_PDI_ID(), + $ia + ]; } - - $sql2 = substr($sql2, 0, -1); - - $this->conn->real_query($sql2); + $this->help->extended_insert('finding_controls', ['tgt_id', 'pdi_id', 'ia_control'], $params, true); + $this->help->execute(); } return true; @@ -5229,22 +5475,29 @@ class db * Function to add findings to the database * * @param array:finding $updated_findings - * Array of findings to update + * Array of findings to update * @param array:finding $added_findings - * Array of findings to add to database + * Array of findings to add to database * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function add_Findings_By_Target($updated_findings, $added_findings) { - $fields = ['pdi_id', 'tgt_id', 'scan_id', 'findings_status_id', 'notes', 'cat']; + $fields = [ + 'pdi_id', + 'tgt_id', + 'scan_id', + 'findings_status_id', + 'notes', + 'cat' + ]; $ins_arr = []; if (is_array($added_findings) && count($added_findings) && is_a(current($added_findings), 'finding')) { $scan_id = current($added_findings)->get_Scan_ID(); foreach ($added_findings as $finding) { + /** @var finding $finding */ $ins_arr[] = [ $finding->get_PDI_ID(), $finding->get_Tgt_ID(), @@ -5258,41 +5511,40 @@ class db if (is_array($ins_arr) && count($ins_arr)) { $this->help->extended_insert('findings', $fields, $ins_arr, true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); } } - $this->help->sql = "INSERT IGNORE INTO `finding_controls` (`finding_id`, `ia_control`) " . - "(SELECT f.`id`, " . - "(SELECT CONCAT(ia.`type`, '-', ia.`type_id`) " . - "FROM `ia_controls` ia " . - "WHERE ia.`pdi_id` = f.`pdi_id`) " . - "FROM `findings` f " . - "WHERE f.`scan_id` = $scan_id)" - ; + $this->help->sql = "INSERT IGNORE INTO `finding_controls` (`tgt_id`, `pdi_id`, `ia_control`) " . + "(SELECT f.`tgt_id`, f.`pdi_id`, " . + "(SELECT CONCAT(ia.`type`, '-', ia.`type_id`) " . + "FROM `ia_controls` ia " . + "WHERE ia.`pdi_id` = f.`pdi_id`) " . + "FROM `findings` f " . + "WHERE f.`scan_id` = $scan_id)"; $this->help->query_type = db_helper::INSERT; - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_WARNING); } $this->help->delete("finding_controls", null, [ [ 'field' => 'ia_control', - 'op' => '=', + 'op' => '=', 'value' => '' ], [ - 'field' => 'ia_control', - 'op' => '=', - 'value' => '-', + 'field' => 'ia_control', + 'op' => '=', + 'value' => '-', 'sql_op' => 'OR' ], [ - 'field' => 'ia_control', - 'op' => IS, - 'value' => null, + 'field' => 'ia_control', + 'op' => IS, + 'value' => null, 'sql_op' => 'OR' ] ]); @@ -5302,52 +5554,58 @@ class db if (is_array($updated_findings) && count($updated_findings) && is_a(current($updated_findings), 'finding')) { $this->help->create_table("tmp_findings", true, [ [ - 'field' => 'id', + 'field' => 'tgt_id', 'datatype' => 'int(11)' ], [ - 'field' => 'tgt_id', + 'field' => 'pdi_id', 'datatype' => 'int(11)' ], [ - 'field' => 'pdi_id', + 'field' => 'scan_id', 'datatype' => 'int(11)' ], [ - 'field' => 'scan_id', + 'field' => 'findings_status_id', 'datatype' => 'int(11)' ], [ - 'field' => 'findings_status_id', + 'field' => 'change_id', 'datatype' => 'int(11)' ], [ - 'field' => 'change_id', - 'datatype' => 'int(11)' - ], - [ - 'field' => 'finding_itr', + 'field' => 'finding_itr', 'datatype' => 'int(5)' ], [ - 'field' => 'cat', + 'field' => 'cat', 'datatype' => 'int(1)' ], [ - 'field' => 'notes', + 'field' => 'notes', 'datatype' => 'text' ], [ - 'field' => 'orig_src', + 'field' => 'orig_src', 'datatype' => 'varchar(10)' ] ]); $this->help->execute(); - $upd_arr = []; - $update_fields = ['id', 'tgt_id', 'pdi_id', 'scan_id', 'findings_status_id', 'change_id', 'finding_itr', 'cat', 'notes', 'orig_src']; + $upd_arr = []; + $update_fields = [ + 'tgt_id', + 'pdi_id', + 'scan_id', + 'findings_status_id', + 'change_id', + 'finding_itr', + 'cat', + 'notes', + 'orig_src' + ]; foreach ($updated_findings as $finding) { + /** @var finding $finding */ $upd_arr[] = [ - $finding->get_ID(), $finding->get_Tgt_ID(), $finding->get_PDI_ID(), $finding->get_Scan_ID(), @@ -5364,10 +5622,11 @@ class db $this->help->extended_insert("tmp_findings", $update_fields, $upd_arr, true); $this->help->execute(); - $this->help->extended_update('findings', 'tmp_findings', 'id', $update_fields); + $this->help->extended_update('findings', 'tmp_findings', '`tgt_id`,`pdi_id`', $update_fields); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); + return false; } } } @@ -5379,96 +5638,101 @@ class db * Function to update a finding status and notes * * @param finding $find - * The finding to update + * The finding to update * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function update_Finding($find) { - if ($find->get_ID()) { - $this->help->update("sagacity.findings", array( - 'findings_status_id' => $find->get_Finding_Status(), - 'notes' => $find->get_Notes(), - 'cat' => $find->get_Category() - ), array( - array( - 'field' => 'id', - 'op' => '=', - 'value' => $find->get_ID() - ) - )); - return $this->help->execute(); - } - else { - $this->help->insert("sagacity.findings", array( - 'tgt_id' => $find->get_Tgt_ID(), - 'pdi_id' => $find->get_PDI_ID(), - 'scan_id' => $find->get_Scan_ID(), - 'findings_status_id' => $find->get_Finding_Status(), - 'notes' => $find->get_Notes(), - 'cat' => $find->get_Category() - ), true); - if (!$find_id = $this->help->execute()) { - $this->help->debug(E_ERROR); - return false; - } + $this->help->replace("sagacity.findings", [ + 'tgt_id' => $find->get_Tgt_ID(), + 'pdi_id' => $find->get_PDI_ID(), + 'scan_id' => $find->get_Scan_ID(), + 'findings_status_id' => $find->get_Finding_Status(), + 'notes' => $find->get_Notes(), + 'cat' => $find->get_Category() + ]); + + if ($this->help->execute()) { + $this->help->delete("sagacity.finding_controls", null, [ + [ + 'field' => 'tgt_id', + 'op' => '=', + 'value' => $find->get_Tgt_ID() + ], + [ + 'field' => 'pdi_id', + 'op' => '=', + 'value' => $find->get_PDI_ID(), + 'sql_op' => 'AND' + ] + ]); $ia_arr = []; foreach ($find->get_IA_Controls() as $ia) { - $ia_arr[] = array( - $find_id, + $ia_arr[] = [ + $find->get_Tgt_ID(), + $find->get_PDI_ID(), $ia - ); + ]; } - $this->help->extended_insert("sagacity.finding_controls", array('finding_id', 'control_id'), $ia_arr, true); - if (!$this->help->execute()) { - $this->help->debug(E_ERROR); + if (is_array($ia_arr) && count($ia_arr) && isset($ia_arr[0])) { + $this->help->extended_insert("sagacity.finding_controls", [ + 'tgt_id', + 'pdi_id', + 'control_id' + ], $ia_arr, true); + if (! $this->help->execute()) { + $this->help->debug(E_ERROR); + return false; + } } - - return true; + } else { + $this->help->debug(E_ERROR); + return false; } + + return true; } /** * Get count of open category I findings for a target * * @param integer $checklist_id - * Checklist ID to query for quantity + * Checklist ID to query for quantity * @param target $tgt - * Target to query + * Target to query * - * @return integer - * Returns the number of findings that are Cat I and with a status of 'Open' for a specific host + * @return integer Returns the number of findings that are Cat I and with a status of 'Open' for a specific host */ public function get_Host_Open_Cat_1($checklist_id, $tgt) { $this->help->select_count("sagacity.pdi_catalog pdi", array( array( 'field' => 'lu.checklist_id', - 'op' => '=', + 'op' => '=', 'value' => $checklist_id ), array( - 'field' => 'f.tgt_id', - 'op' => '=', - 'value' => $tgt->get_ID(), + 'field' => 'f.tgt_id', + 'op' => '=', + 'value' => $tgt->get_ID(), 'sql_op' => 'AND' ), array( - 'field' => 'fs.status', - 'op' => '=', - 'value' => 'Open', + 'field' => 'fs.status', + 'op' => '=', + 'value' => 'Open', 'sql_op' => 'AND' ), array( - 'field' => 'pdi.cat', - 'op' => '=', - 'value' => 1, + 'field' => 'pdi.cat', + 'op' => '=', + 'value' => 1, 'sql_op' => 'AND' ) - ), array( + ), array( 'table_joins' => array( "JOIN sagacity.pdi_checklist_lookup lu ON lu.pdi_id=pdi.id", "JOIN sagacity.findings f ON f.pdi_id=pdi.id", @@ -5484,34 +5748,33 @@ class db * Get count of not reviewed findings for a target * * @param integer $checklist_id - * Checklist ID to query for quantity + * Checklist ID to query for quantity * @param target $tgt - * Target to query + * Target to query * - * @return integer - * Returns the number of findings with a status of 'Not Reviewed' for a specific host + * @return integer Returns the number of findings with a status of 'Not Reviewed' for a specific host */ public function get_Host_Not_Reviewed($checklist_id, $tgt) { $this->help->select_count("sagacity.pdi_catalog pdi", array( array( 'field' => 'lu.checklist_id', - 'op' => '=', + 'op' => '=', 'value' => $checklist_id ), array( - 'field' => 'f.tgt_id', - 'op' => '=', - 'value' => $tgt->get_ID(), + 'field' => 'f.tgt_id', + 'op' => '=', + 'value' => $tgt->get_ID(), 'sql_op' => 'AND' ), array( - 'field' => 'fs.status', - 'op' => '=', - 'value' => 'Not Reviewed', + 'field' => 'fs.status', + 'op' => '=', + 'value' => 'Not Reviewed', 'sql_op' => 'AND' ) - ), array( + ), array( 'table_joins' => array( "JOIN sagacity.pdi_checklist_lookup lu ON lu.pdi_id=pdi.id", "JOIN sagacity.findings f ON f.pdi_id=pdi.id", @@ -5528,21 +5791,22 @@ class db /** * Get GoldDisk data * - * @param string $str_VMS_ID [optional] - * The VMS id of the golddisk object (default null) + * @param string $str_VMS_ID + * [optional] + * The VMS id of the golddisk object (default null) * * @return array:golddisk |NULL - * Returns an array of golddisk objects, or null if none found + * Returns an array of golddisk objects, or null if none found */ public function get_GoldDisk($str_VMS_ID = null) { - $ret = []; + $ret = []; $where = []; if ($str_VMS_ID != null) { $where[] = array( 'field' => 'vms_id', - 'op' => '=', + 'op' => '=', 'value' => $str_VMS_ID ); } @@ -5551,7 +5815,9 @@ class db $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['pdi_id'])) { - $rows = array(0 => $rows); + $rows = array( + 0 => $rows + ); } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -5567,10 +5833,10 @@ class db * Function for retrieving a VMS using the PDI * * @param integer $pdi_id - * The PDI ID of the golddisk to grab + * The PDI ID of the golddisk to grab * * @return array:golddisk |NULL - * Returns an array of golddisk, or null if none found + * Returns an array of golddisk, or null if none found */ public function get_GoldDisk_By_PDI($pdi_id) { @@ -5578,22 +5844,23 @@ class db $this->help->select("golddisk", null, [ [ 'field' => 'pdi_id', - 'op' => '=', + 'op' => '=', 'value' => $pdi_id ] ]); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['pdi_id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { foreach ($rows as $row) { $ret[] = new golddisk($row['pdi_id'], $row['vms_id'], $row['short_title']); } - } - else { + } else { $this->help->debug(E_ERROR); } @@ -5604,20 +5871,19 @@ class db * Function to add GoldDisk to database * * @param golddisk $new_GoldDisk - * The golddisk object to add to database + * The golddisk object to add to database * - * @return boolean - * Returns TRUE if successful, otherwise false + * @return boolean Returns TRUE if successful, otherwise false */ public function save_GoldDisk($new_GoldDisk) { $this->help->insert("sagacity.golddisk", array( - 'pdi_id' => $new_GoldDisk->get_PDI_ID(), - 'vms_id' => $new_GoldDisk->get_ID(), + 'pdi_id' => $new_GoldDisk->get_PDI_ID(), + 'vms_id' => $new_GoldDisk->get_ID(), 'short_title' => $new_GoldDisk->get_Short_Title() - ), true); + ), true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -5630,19 +5896,13 @@ class db * Function to get IA control from DB * * @param ia_control $ia - * IA Control to retrieve from the database + * IA Control to retrieve from the database * - * @return ia_control|NULL - * Returns IA_Control object, or null if none found + * @return ia_control|NULL Returns IA_Control object, or null if none found */ public function get_IA_Controls($ia) { - $sql = "SELECT `pdi_id`, `type`, `type_id` " . - "FROM `sagacity`.`ia_controls` " . - "WHERE " . - "`pdi_id` = " . $this->conn->real_escape_string($ia->get_PDI_ID()) . " AND " . - "`type` = '" . $this->conn->real_escape_string($ia->get_Type()) . "' AND " . - "`type_id` = " . $this->conn->real_escape_string($ia->get_Type_ID()); + $sql = "SELECT `pdi_id`, `type`, `type_id` " . "FROM `sagacity`.`ia_controls` " . "WHERE " . "`pdi_id` = " . $this->conn->real_escape_string($ia->get_PDI_ID()) . " AND " . "`type` = '" . $this->conn->real_escape_string($ia->get_Type()) . "' AND " . "`type_id` = " . $this->conn->real_escape_string($ia->get_Type_ID()); $res = $this->conn->query($sql); @@ -5667,23 +5927,17 @@ class db $class = 'cl'; if ($sys->get_Classification() == 'Public') { $class = 'pub'; - } - elseif ($sys->get_Classification() == 'Sensitive') { + } elseif ($sys->get_Classification() == 'Sensitive') { $class = 'sen'; } $ret = []; - $sql = "SELECT `proc_control` " . - "FROM `sagacity`.`proc_level_type` " . - "WHERE " . - "`level` = " . $sys->get_MAC() . " AND " . - "`class` = '$class'"; + $sql = "SELECT `proc_control` " . "FROM `sagacity`.`proc_level_type` " . "WHERE " . "`level` = " . $sys->get_MAC() . " AND " . "`class` = '$class'"; if ($res = $this->conn->query($sql)) { while ($row = $res->fetch_assoc()) { $ret[] = new ia_control(null, explode('-', $row['proc_control'])[0], explode('-', $row['proc_control'])[1]); } - } - else { + } else { error_log($this->conn->error); Sagacity_Error::sql_handler($sql); } @@ -5695,17 +5949,14 @@ class db * Function for retrieving IA Controls by PDI * * @param integer $pdi_id - * PDI ID used to query + * PDI ID used to query * * @return array:ia_control |NULL - * Returns array of ia_controls associated with a specific PDI, or null if none found + * Returns array of ia_controls associated with a specific PDI, or null if none found */ public function get_IA_Controls_By_PDI($pdi_id) { - $sql = "SELECT " . - "`pdi_id`, `type`, `type_id` " . - "FROM `sagacity`.`ia_controls` " . - "WHERE `pdi_id` = " . $this->conn->real_escape_string($pdi_id); + $sql = "SELECT " . "`pdi_id`, `type`, `type_id` " . "FROM `sagacity`.`ia_controls` " . "WHERE `pdi_id` = " . $this->conn->real_escape_string($pdi_id); if ($res = $this->conn->query($sql)) { $ret = []; @@ -5715,8 +5966,7 @@ class db } return $ret; - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } @@ -5734,7 +5984,7 @@ class db */ public function get_IA_Control_Icon($ste, $ctrl) { - $cats = $this->get_STE_Cat_List($ste->get_ID()); + $cats = $this->get_STE_Cat_List($ste->get_ID()); $total = 0; foreach ($cats as $cat) { @@ -5751,8 +6001,7 @@ class db } if (empty($ctrl->finding->vul_desc)) { return "exclamation.png"; - } - elseif (empty($ctrl->finding->mitigations)) { + } elseif (empty($ctrl->finding->mitigations)) { return "exclamation.png"; } @@ -5763,10 +6012,9 @@ class db * Update an IA control * * @param ia_control|array:ia_control $ia_Controls - * Array of IA Controls to update + * Array of IA Controls to update * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function save_IA_Control($ia_Controls) { @@ -5780,21 +6028,23 @@ class db $ia->get_Type_ID() ); } - } - elseif (is_a($ia_Controls, 'ia_control')) { + } elseif (is_a($ia_Controls, 'ia_control')) { $params[] = array( $ia_Controls->get_PDI_ID(), $ia_Controls->get_Type(), $ia_Controls->get_Type_ID() ); - } - else { + } else { return false; } - $this->help->extended_replace("sagacity.ia_controls", array('pdi_id', 'type', 'type_id'), $params); + $this->help->extended_replace("sagacity.ia_controls", array( + 'pdi_id', + 'type', + 'type_id' + ), $params); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -5808,33 +6058,26 @@ class db * Function for retrieving an IAVM * * @param integer|string $iavm_ID - * The IAVM ID to look for + * The IAVM ID to look for * - * @return iavm|NULL - * Returns IAVM object, otherwise null if none found + * @return iavm|NULL Returns IAVM object, otherwise null if none found */ public function get_IAVM($iavm_ID) { - $sql = "SELECT " . - "iavm.`noticeId`, iavm.`pdi_id`, iavm.`xmlUrl`, iavm.`htmlUrl`, iavm.`iavmNoticeNumber`, iavm.`title`, " . - "iavm.`type`, iavm.`state`, iavm.`lastUpdated`, iavm.`releaseDate`, iavm.`supersedes`, " . - "iavm.`executiveSummary`, iavm.`fixAction`, iavm.`note`, iavm.`vulnAppsSysAndCntrmsrs`, " . - "iavm.`stigFindingSeverity`, iavm.`knownExploits`, iavm.`file_name` " . - "FROM `sagacity`.`iavm_notices` iavm"; + $sql = "SELECT " . "iavm.`noticeId`, iavm.`pdi_id`, iavm.`xmlUrl`, iavm.`htmlUrl`, iavm.`iavmNoticeNumber`, iavm.`title`, " . "iavm.`type`, iavm.`state`, iavm.`lastUpdated`, iavm.`releaseDate`, iavm.`supersedes`, " . "iavm.`executiveSummary`, iavm.`fixAction`, iavm.`note`, iavm.`vulnAppsSysAndCntrmsrs`, " . "iavm.`stigFindingSeverity`, iavm.`knownExploits`, iavm.`file_name` " . "FROM `sagacity`.`iavm_notices` iavm"; if (is_numeric($iavm_ID)) { $sql .= " WHERE iavm.`noticeId` = " . $this->conn->real_escape_string($iavm_ID); - } - else { + } else { $sql .= " WHERE iavm.`iavmNoticeNumber` = '" . $this->conn->real_escape_string($iavm_ID) . "'"; } if ($res = $this->conn->query($sql)) { - if (!$res->num_rows) { + if (! $res->num_rows) { return null; } $notice_row = $res->fetch_assoc(); - $noticeId = $notice_row['noticeId']; + $noticeId = $notice_row['noticeId']; $iavm = new iavm($notice_row['noticeId'], $notice_row['pdi_id'], $notice_row['xmlUrl'], $notice_row['htmlUrl'], $notice_row['iavmNoticeNumber'], $notice_row['title'], $notice_row['type'], $notice_row['state'], $notice_row['lastUpdated'], $notice_row['releaseDate'], $notice_row['supersedes'], $notice_row['executiveSummary'], $notice_row['fixAction'], $notice_row['note'], $notice_row['vulnAppsSysAndCntrmsrs'], $notice_row['stigFindingSeverity'], $notice_row['knownExploits']); @@ -5848,8 +6091,7 @@ class db } } - $sql = "SELECT `id`, `title`, `url` FROM `sagacity`.`iavm_references` " . - "WHERE `iavm_notice_id` = " . $this->conn->real_escape_string($noticeId); + $sql = "SELECT `id`, `title`, `url` FROM `sagacity`.`iavm_references` " . "WHERE `iavm_notice_id` = " . $this->conn->real_escape_string($noticeId); if ($res2 = $this->conn->query($sql)) { if ($res2->num_rows) { @@ -5857,29 +6099,25 @@ class db $iavm->add_Reference(new iavm_reference($ref_row['id'], $ref_row['title'], $ref_row['url'])); } } - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } - $sql = "SELECT `id`, `details` FROM `sagacity`.`iavm_tech_overview` " . - "WHERE `iavm_notice_id` = " . $this->conn->real_escape_string($noticeId); + $sql = "SELECT `id`, `details` FROM `sagacity`.`iavm_tech_overview` " . "WHERE `iavm_notice_id` = " . $this->conn->real_escape_string($noticeId); if ($res2 = $this->conn->query($sql)) { if ($res2->num_rows) { $to_row = $res2->fetch_assoc(); - $to = new iavm_tech_overview($to_row['id'], $to_row['details']); + $to = new iavm_tech_overview($to_row['id'], $to_row['details']); $iavm->set_Tech_Overview($to); } - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } - $sql = "SELECT `id`, `type`, `title`, `url` FROM sagacity.iavm_patches " . - "WHERE `iavm_notice_id` = " . $this->conn->real_escape_string($noticeId); + $sql = "SELECT `id`, `type`, `title`, `url` FROM sagacity.iavm_patches " . "WHERE `iavm_notice_id` = " . $this->conn->real_escape_string($noticeId); if ($res2 = $this->conn->query($sql)) { if ($res2->num_rows) { @@ -5887,14 +6125,12 @@ class db $iavm->add_Patch(new iavm_patch($patch_row['id'], $patch_row['type'], $patch_row['title'], $patch_row['url'])); } } - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } - $sql = "SELECT `header`, `body` FROM `sagacity`.`iavm_mitigations` " . - "WHERE `iavm_notice_id` = " . $this->conn->real_escape_string($noticeId); + $sql = "SELECT `header`, `body` FROM `sagacity`.`iavm_mitigations` " . "WHERE `iavm_notice_id` = " . $this->conn->real_escape_string($noticeId); if ($res2 = $this->conn->query($sql)) { if ($res2->num_rows) { @@ -5902,14 +6138,12 @@ class db $iavm->set_Mitigation(new iavm_mitigation($mit_row['header'], $mit_row['body'])); } - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } - $sql = "SELECT `bid` FROM `sagacity`.`iavm_bids` " . - "WHERE `iavm_notice_id` = " . $this->conn->real_escape_string($noticeId); + $sql = "SELECT `bid` FROM `sagacity`.`iavm_bids` " . "WHERE `iavm_notice_id` = " . $this->conn->real_escape_string($noticeId); if ($res2 = $this->conn->query($sql)) { if ($res2->num_rows) { @@ -5920,8 +6154,7 @@ class db } return $iavm; - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } @@ -5933,44 +6166,33 @@ class db * Get IAVM from external data (reference or patch) * * @param string $ext - * The external data to search for + * The external data to search for * - * @return iavm|NULL - * Returns an iavm object if any are found, otherwise NULL + * @return iavm|NULL Returns an iavm object if any are found, otherwise NULL */ public function get_IAVM_From_External($ext) { - $sql = "SELECT `iavm_notice_id` FROM `sagacity`.`iavm_references` " . - "WHERE `title` LIKE '%" . $this->conn->real_escape_string($ext) . "%' OR " . - "`url` LIKE '%" . $this->conn->real_escape_string($ext) . "%' " . - "GROUP BY `iavm_notice_id` " . - "ORDER BY `iavm_notice_id` DESC"; + $sql = "SELECT `iavm_notice_id` FROM `sagacity`.`iavm_references` " . "WHERE `title` LIKE '%" . $this->conn->real_escape_string($ext) . "%' OR " . "`url` LIKE '%" . $this->conn->real_escape_string($ext) . "%' " . "GROUP BY `iavm_notice_id` " . "ORDER BY `iavm_notice_id` DESC"; if ($res = $this->conn->query($sql)) { if ($res->num_rows) { - $row = $res->fetch_assoc(); + $row = $res->fetch_assoc(); $iavm = $this->get_IAVM($row['iavm_notice_id']); return $iavm; } - } - else { + } else { Sagacity_Error::sql_handler($sql); } - $sql = "SELECT `iavm_notice_id` FROM `sagacity`.`iavm_patches` " . - "WHERE `title` LIKE '%" . $this->conn->real_escape_string($ext) . "%' OR " . - "`url` LIKE '%" . $this->conn->real_escape_string($ext) . "%' " . - "GROUP BY `iavm_notice_id` " . - "ORDER BY `iavm_notice_id` DESC"; + $sql = "SELECT `iavm_notice_id` FROM `sagacity`.`iavm_patches` " . "WHERE `title` LIKE '%" . $this->conn->real_escape_string($ext) . "%' OR " . "`url` LIKE '%" . $this->conn->real_escape_string($ext) . "%' " . "GROUP BY `iavm_notice_id` " . "ORDER BY `iavm_notice_id` DESC"; if ($res = $this->conn->query($sql)) { if ($res->num_rows) { - $row = $res->fetch_assoc(); + $row = $res->fetch_assoc(); $iavm = $this->get_IAVM($row['iavm_notice_id']); return $iavm; } - } - else { + } else { Sagacity_Error::sql_handler($sql); } @@ -5979,6 +6201,7 @@ class db /** * Method to save IAVM BIDs + * * @param iavm $iavm */ public function save_Iavm_Bids($iavm) @@ -5986,12 +6209,18 @@ class db $params = []; if (is_array($iavm->get_Bids()) && count($iavm->get_Bids())) { foreach ($iavm->get_Bids() as $bid) { - $params[] = [$iavm->get_Notice_ID(), $bid]; + $params[] = [ + $iavm->get_Notice_ID(), + $bid + ]; } } if (count($params)) { - $this->help->extended_replace('iavm_bids', ['iavm_notice_id', 'bid'], $params); + $this->help->extended_replace('iavm_bids', [ + 'iavm_notice_id', + 'bid' + ], $params); $this->help->execute(); } } @@ -6006,8 +6235,10 @@ class db if ($iavm->get_Mitigation()) { $this->help->replace("iavm_mitiagations", [ 'iavm_notice_id' => $iavm->get_Notice_ID(), - 'header' => $iavm->get_Mitigation()->get_Header(), - 'body' => $iavm->get_Mitigation()->get_Text() + 'header' => $iavm->get_Mitigation() + ->get_Header(), + 'body' => $iavm->get_Mitigation() + ->get_Text() ]); $this->help->execute(); @@ -6024,12 +6255,22 @@ class db $params = []; if (is_array($iavm->get_Patches()) && count($iavm->get_Patches())) { foreach ($iavm->get_Patches() as $patch) { - $params[] = [$iavm->get_Notice_ID(), $patch->get_Type(), $patch->get_Title(), $patch->get_URL()]; + $params[] = [ + $iavm->get_Notice_ID(), + $patch->get_Type(), + $patch->get_Title(), + $patch->get_URL() + ]; } } if (count($params)) { - $this->help->extended_replace("iavm_patches", ['iavm_notice_id', 'type', 'title', 'url'], $params); + $this->help->extended_replace("iavm_patches", [ + 'iavm_notice_id', + 'type', + 'title', + 'url' + ], $params); $this->help->execute(); } @@ -6045,12 +6286,20 @@ class db $params = []; if (is_array($iavm->get_References()) && count($iavm->get_References())) { foreach ($iavm->get_References() as $ref) { - $params[] = [$iavm->get_Notice_ID(), $ref->get_Title(), $ref->get_URL()]; + $params[] = [ + $iavm->get_Notice_ID(), + $ref->get_Title(), + $ref->get_URL() + ]; } } if (count($params)) { - $this->help->extended_replace("iavm_references", ['iavm_notice_id', 'title', 'url'], $params); + $this->help->extended_replace("iavm_references", [ + 'iavm_notice_id', + 'title', + 'url' + ], $params); $this->help->execute(); } @@ -6066,7 +6315,8 @@ class db if ($iavm->get_Tech_Overview()) { $this->help->replace("iavm_tech_overview", [ 'iavm_notice_id' => $iavm->get_Notice_ID(), - 'details' => $iavm->get_Tech_Overview()->get_Details() + 'details' => $iavm->get_Tech_Overview() + ->get_Details() ]); $this->help->execute(); @@ -6083,12 +6333,18 @@ class db $params = []; if (is_array($iavm->get_CVE()) && count($iavm->get_CVE())) { foreach ($iavm->get_CVE() as $cve) { - $params[] = [$iavm->get_Notice_ID(), $cve]; + $params[] = [ + $iavm->get_Notice_ID(), + $cve + ]; } } if (count($params)) { - $this->help->extended_replace("iavm_to_cve", ['noticeId', 'cve_id'], $params); + $this->help->extended_replace("iavm_to_cve", [ + 'noticeId', + 'cve_id' + ], $params); $this->help->execute(); } } @@ -6097,10 +6353,9 @@ class db * Function to save IAVMs * * @param iavm $iavm_in - * The IAVM to save + * The IAVM to save * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function save_IAVM($iavm_in) { @@ -6109,40 +6364,39 @@ class db if (is_null($db_iavm)) { $this->help->insert('iavm_notices', [ - 'noticeId' => $iavm_in->get_Notice_ID(), - 'pdi_id' => $iavm_in->get_PDI_ID(), - 'xmlUrl' => $iavm_in->get_XML_URL(), - 'htmlUrl' => $iavm_in->get_HTML_URL(), - 'iavmNoticeNumber' => $iavm_in->get_Notice_Number(), - 'title' => $iavm_in->get_Title(), - 'type' => $iavm_in->get_Type(), - 'state' => $iavm_in->get_State(), - 'lastUpdate' => $iavm_in->get_Last_Updated_Date(), - 'releaseDate' => $iavm_in->get_Release_Date_Date(), - 'supersedes' => $iavm_in->get_Supersedes(), - 'executiveSummary' => $iavm_in->get_Executive_Summary(), - 'fixAction' => $iavm_in->get_Fix_Action(), - 'note' => $iavm_in->get_Notes(), + 'noticeId' => $iavm_in->get_Notice_ID(), + 'pdi_id' => $iavm_in->get_PDI_ID(), + 'xmlUrl' => $iavm_in->get_XML_URL(), + 'htmlUrl' => $iavm_in->get_HTML_URL(), + 'iavmNoticeNumber' => $iavm_in->get_Notice_Number(), + 'title' => $iavm_in->get_Title(), + 'type' => $iavm_in->get_Type(), + 'state' => $iavm_in->get_State(), + 'lastUpdate' => $iavm_in->get_Last_Updated_Date(), + 'releaseDate' => $iavm_in->get_Release_Date_Date(), + 'supersedes' => $iavm_in->get_Supersedes(), + 'executiveSummary' => $iavm_in->get_Executive_Summary(), + 'fixAction' => $iavm_in->get_Fix_Action(), + 'note' => $iavm_in->get_Notes(), 'vulnAppsSysAndCntrmsrs' => $iavm_in->get_Vuln_Apps(), - 'stigFindingSeverity' => $iavm_in->get_Stig_Severity(), - 'knownExploits' => $iavm_in->get_Known_Exploits() + 'stigFindingSeverity' => $iavm_in->get_Stig_Severity(), + 'knownExploits' => $iavm_in->get_Known_Exploits() ]); - } - else { + } else { $this->help->update("iavm_notices", [ - 'type' => $iavm_in->get_Type(), - 'state' => $iavm_in->get_State(), - 'lastUpdated' => $iavm_in->get_Last_Updated_Date(), - 'supersedes' => $iavm_in->get_Supersedes(), - 'executiveSummary' => $iavm_in->get_Executive_Summary(), - 'fixAction' => $iavm_in->get_Fix_Action(), - 'knownExploits' => $iavm_in->get_Known_Exploits(), - 'note' => $iavm_in->get_Notes(), + 'type' => $iavm_in->get_Type(), + 'state' => $iavm_in->get_State(), + 'lastUpdated' => $iavm_in->get_Last_Updated_Date(), + 'supersedes' => $iavm_in->get_Supersedes(), + 'executiveSummary' => $iavm_in->get_Executive_Summary(), + 'fixAction' => $iavm_in->get_Fix_Action(), + 'knownExploits' => $iavm_in->get_Known_Exploits(), + 'note' => $iavm_in->get_Notes(), 'vulnAppsSysAndCntrmsrs' => $iavm_in->get_Vuln_Apps() - ], [ + ], [ [ 'field' => 'noticeId', - 'op' => '=', + 'op' => '=', 'value' => $iavm_in->get_Notice_ID() ] ]); @@ -6164,41 +6418,42 @@ class db * Get all interfaces for a target * * @param integer $tgtID - * Target ID to get interface information for + * Target ID to get interface information for * - * @return array:interfaces|NULL - * Returns array of interfaces (with ports), or NULL if none found + * @return array:interfaces|NULL Returns array of interfaces (with ports), or NULL if none found */ public function get_Interfaces($tgtID) { $ret = []; - if (!$tgtID) { + if (! $tgtID) { return []; } $this->help->select("sagacity.interfaces", null, [ [ 'field' => 'tgt_id', - 'op' => '=', + 'op' => '=', 'value' => $tgtID ], [ - 'field' => 'ipv4', - 'op' => '!=', - 'value' => '', + 'field' => 'ipv4', + 'op' => '!=', + 'value' => '', 'sql_op' => 'AND' ], [ - 'field' => 'ipv4', - 'op' => IS_NOT, - 'value' => null, + 'field' => 'ipv4', + 'op' => IS_NOT, + 'value' => null, 'sql_op' => 'AND' ] ]); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -6209,14 +6464,16 @@ class db $this->help->select("sagacity.get_ports", null, [ [ 'field' => 'int_id', - 'op' => '=', + 'op' => '=', 'value' => $row['id'] ] ]); $rows2 = $this->help->execute(); if (is_array($rows2) && count($rows2) && isset($rows2['id'])) { - $rows2 = [0 => $rows2]; + $rows2 = [ + 0 => $rows2 + ]; } if (is_array($rows2) && count($rows2) && isset($rows2[0])) { @@ -6224,8 +6481,7 @@ class db if ($p['proto'] == 'tcp') { $port = new tcp_ports($p['id'], $p['port'], $p['name'], $p['banner'], $p['notes']); $int->add_TCP_Ports($port); - } - else { + } else { $port = new udp_ports($p['id'], $p['port'], $p['name'], $p['banner'], $p['notes']); $int->add_UDP_Ports($port); } @@ -6234,8 +6490,7 @@ class db if ($row['ipv6']) { $ret[$row['ipv6']] = $int; - } - else { + } else { $ret[$row['ipv4']] = $int; } } @@ -6257,21 +6512,21 @@ class db $this->help->select("sagacity.interfaces", null, array( array( 'field' => 'tgt_id', - 'op' => '=', + 'op' => '=', 'value' => $tgt_id ), array( - 'field' => 'ipv4', - 'op' => '=', - 'value' => $ip, - 'sql_op' => 'AND', + 'field' => 'ipv4', + 'op' => '=', + 'value' => $ip, + 'sql_op' => 'AND', 'open-paren' => true ), array( - 'field' => 'ipv6', - 'op' => '=', - 'value' => $ip, - 'sql_op' => 'OR', + 'field' => 'ipv6', + 'op' => '=', + 'value' => $ip, + 'sql_op' => 'OR', 'close-paren' => true ) )); @@ -6282,23 +6537,26 @@ class db } $int = new interfaces($row['id'], $row['tgt_id'], $row['name'], $row['ipv4'], $row['ipv6'], $row['hostname'], $row['fqdn'], $row['description']); - $this->help->select("sagacity.ports_proto_services pps", array('pps.id', 'pps.port', 'pps.proto', + $this->help->select("sagacity.ports_proto_services pps", array( + 'pps.id', + 'pps.port', + 'pps.proto', "IF(ppsl.name != pps.IANA_Name, ppsl.name, pps.IANA_Name) AS 'name'", "IF(ppsl.banner != pps.banner, ppsl.banner, pps.banner) AS 'banner'", "IF(ppsl.notes != pps.notes, ppsl.notes, pps.notes) AS 'notes'" - ), array( + ), array( array( 'field' => 'ppsl.int_id', - 'op' => '=', + 'op' => '=', 'value' => $row['id'] ), array( - 'field' => 'pps.id', - 'op' => IN, - 'value' => "(SELECT pps_id FROM sagacity.pps_list WHERE int_id={$row['id']})", + 'field' => 'pps.id', + 'op' => IN, + 'value' => "(SELECT pps_id FROM sagacity.pps_list WHERE int_id={$row['id']})", 'sql_op' => 'AND' ) - ), array( + ), array( 'table_joins' => array( "LEFT JOIN sagacity.pps_list ppsl ON ppsl.pps_id=pps.id" ) @@ -6306,14 +6564,16 @@ class db $rows2 = $this->help->execute(); if (is_array($rows2) && count($rows2) && isset($rows2['id'])) { - $rows2 = array(0 => $rows2); + $rows2 = array( + 0 => $rows2 + ); } if (is_array($rows2) && count($rows2) && isset($rows2[0])) { foreach ($rows2 as $port) { - $class = "{$port['proto']}_ports"; + $class = "{$port['proto']}_ports"; $method = "add_" . strtoupper($port['proto']) . "_Ports"; - $port = new $class($port['id'], $port['port'], $port['name'], $port['banner'], $port['notes']); + $port = new $class($port['id'], $port['port'], $port['name'], $port['banner'], $port['notes']); $int->$method($port); } } @@ -6324,12 +6584,13 @@ class db /** * Return the last ID of the last interface in the database * - * @return integer - * Returns the ID of the last interface that was inserted + * @return integer Returns the ID of the last interface that was inserted */ public function get_Last_Interface_ID() { - $this->help->select("sagacity.interfaces", array('id'), [], array( + $this->help->select("sagacity.interfaces", array( + 'id' + ), [], array( 'order' => 'id DESC', 'limit' => 1 )); @@ -6345,36 +6606,37 @@ class db * Save an interface * * @param array|interfaces $req - * Associative array of data to insert into database - * @param string $action [optional] - * String representing the action to be taken ('insert','update', defaulted to 'insert') - * @param integer $tgt_id [optional] - * Integer that the interface info is going to be save to (defaulted to 0) + * Associative array of data to insert into database + * @param string $action + * [optional] + * String representing the action to be taken ('insert','update', defaulted to 'insert') + * @param integer $tgt_id + * [optional] + * Integer that the interface info is going to be save to (defaulted to 0) * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function save_Interface($req, $action = 'insert') { if ($action == 'insert') { if (is_array($req)) { $first = array_shift($req); - if (!is_a($first, 'interfaces')) { + if (! is_a($first, 'interfaces')) { return false; } $req[$first->get_IPv4()] = $first; foreach ($req as $int) { $this->help->insert("sagacity.interfaces", array( - 'tgt_id' => $int->get_TGT_ID(), - 'ipv4' => $int->get_IPv4(), - 'ipv6' => $int->get_IPv6(), - 'hostname' => $int->get_Hostname(), - 'fqdn' => $int->get_FQDN(), + 'tgt_id' => $int->get_TGT_ID(), + 'ipv4' => $int->get_IPv4(), + 'ipv6' => $int->get_IPv6(), + 'hostname' => $int->get_Hostname(), + 'fqdn' => $int->get_FQDN(), 'description' => $int->get_Description(), - 'mac' => $int->get_MAC() - ), true); + 'mac' => $int->get_MAC() + ), true); - if (!($int_id = $this->help->execute())) { + if (! ($int_id = $this->help->execute())) { $this->help->debug(E_ERROR); return false; } @@ -6405,25 +6667,29 @@ class db } if (count($ports)) { - $this->help->extended_insert("pps_list", array('int_id', 'pps_id', 'banner', 'notes'), $ports, true); - if (!$this->help->execute()) { + $this->help->extended_insert("pps_list", array( + 'int_id', + 'pps_id', + 'banner', + 'notes' + ), $ports, true); + if (! $this->help->execute()) { $this->help->debug(E_WARNING); } } } - } - elseif (is_a($req, 'interfaces')) { + } elseif (is_a($req, 'interfaces')) { $this->help->insert("interfaces", array( - 'tgt_id' => $req->get_TGT_ID(), - 'ipv4' => $req->get_IPv4(), - 'ipv6' => $req->get_IPv6(), - 'hostname' => $req->get_Hostname(), - 'fqdn' => $req->get_FQDN(), + 'tgt_id' => $req->get_TGT_ID(), + 'ipv4' => $req->get_IPv4(), + 'ipv6' => $req->get_IPv6(), + 'hostname' => $req->get_Hostname(), + 'fqdn' => $req->get_FQDN(), 'description' => $req->get_Description(), - 'mac' => $req->get_MAC() - ), true); + 'mac' => $req->get_MAC() + ), true); - if (!($int_id = $this->help->execute())) { + if (! ($int_id = $this->help->execute())) { $this->help->debug(E_ERROR); return false; } @@ -6454,55 +6720,57 @@ class db } if (count($ports)) { - $this->help->extended_insert("sagacity.pps_list", array('int_id', 'pps_id', 'banner', 'notes'), $ports, true); - if (!$this->help->execute()) { + $this->help->extended_insert("sagacity.pps_list", array( + 'int_id', + 'pps_id', + 'banner', + 'notes' + ), $ports, true); + if (! $this->help->execute()) { $this->help->debug(E_WARNING); } } - } - else { + } else { $this->help->insert("interfaces", array( - 'tgt_id' => $req['tgt_id'], - 'ipv4' => $req['ipv4'], + 'tgt_id' => $req['tgt_id'], + 'ipv4' => $req['ipv4'], 'hostname' => (isset($req['hostname']) ? $req['hostname'] : $req['ipv4']), - 'fadn' => (isset($req['fqdn']) ? $req['fqdn'] : $req['fqdn']) - ), true); + 'fadn' => (isset($req['fqdn']) ? $req['fqdn'] : $req['fqdn']) + ), true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } } - } - else { + } else { if (isset($req['ip']) && $req['ip'] != null) { foreach ($req['ip'] as $int_id => $val) { if (isset($req['new'][$int_id])) { $this->help->insert("sagacity.interfaces", [ - 'tgt_id' => $req['tgt'], - 'ipv4' => $req['ip'][$int_id], - 'hostname' => $req['hostname'][$int_id], - 'fqdn' => $req['fqdn'][$int_id], - 'name' => $req['name'][$int_id], - 'description' => $req['description'][$int_id], - ], true); + 'tgt_id' => $req['tgt'], + 'ipv4' => $req['ip'][$int_id], + 'hostname' => $req['hostname'][$int_id], + 'fqdn' => $req['fqdn'][$int_id], + 'name' => $req['name'][$int_id], + 'description' => $req['description'][$int_id] + ], true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } - } - elseif ($val != 'DELETE') { + } elseif ($val != 'DELETE') { $this->help->update("sagacity.interfaces", [ - 'name' => $req['name'][$int_id], - 'ipv4' => $val, - 'hostname' => $req['hostname'][$int_id], - 'fqdn' => $req['fqdn'][$int_id], + 'name' => $req['name'][$int_id], + 'ipv4' => $val, + 'hostname' => $req['hostname'][$int_id], + 'fqdn' => $req['fqdn'][$int_id], 'description' => $req['description'][$int_id] - ], [ + ], [ [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $int_id ] ]); @@ -6538,22 +6806,26 @@ class db } if (count($ports)) { - $this->help->extended_insert("pps_list", ['int_id', 'pps_id', 'name', 'banner', 'notes'], $ports, true); - if (!$this->help->execute()) { + $this->help->extended_insert("pps_list", [ + 'int_id', + 'pps_id', + 'name', + 'banner', + 'notes' + ], $ports, true); + if (! $this->help->execute()) { $this->help->debug(E_WARNING); } } - } - else { + } else { $this->help->debug(E_ERROR); return false; } - } - else { + } else { $this->help->delete("sagacity.pps_list", null, array( array( 'field' => 'int_id', - 'op' => '=', + 'op' => '=', 'value' => $int_id ) )); @@ -6561,7 +6833,7 @@ class db $this->help->delete("sagacity.interfaces", null, array( array( 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $int_id ) )); @@ -6577,10 +6849,9 @@ class db * Function to delete an target interface from the database * * @param int $id - * The ID of the interface to be deleted + * The ID of the interface to be deleted * - * @return boolean - * Returns TRUE if interface successfully deleted, otherwise FALSE + * @return boolean Returns TRUE if interface successfully deleted, otherwise FALSE */ public function delete_Interface($id) { @@ -6588,11 +6859,11 @@ class db $this->help->delete("sagacity.pps_list", null, [ [ 'field' => 'int_id', - 'op' => '=', + 'op' => '=', 'value' => $id ] ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_WARNING); return false; } @@ -6601,11 +6872,11 @@ class db $this->help->delete("sagacity.interfaces", null, [ [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $id ] ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_WARNING); return false; } @@ -6618,43 +6889,34 @@ class db * Save the port to the database * * @param interfaces $int - * Interface to tie the ports to + * Interface to tie the ports to * @param array:tcp_ports|array:udp_ports $ports - * Array of tcp and udp ports that are to be saved - * @param string $action [optional] - * Whether or not the ports are to be updated or inserted (defaulted 'insert') + * Array of tcp and udp ports that are to be saved + * @param string $action + * [optional] + * Whether or not the ports are to be updated or inserted (defaulted 'insert') * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function save_Ports($int, $ports, $action = 'insert') { - $ret = true; + $ret = true; $ins_sql = 'REPLACE INTO `sagacity`.`pps_list` (`int_id`,`pps_id`,`name`,`banner`,`notes`) VALUES '; if ($action == 'insert') { foreach ($ports as $port) { - $ins_sql .= "(" . $int->get_ID() . ", " . - "(SELECT `id` FROM `sagacity`.`ports_proto_services` WHERE `port` = '" . $port->get_Port() . "'" . - " AND `proto` = '" . (is_a($port, 'tcp_ports') ? 'tcp' : 'udp') . "' " . - " AND `notes` NOT LIKE '%historic%' LIMIT 1), " . - "'" . $this->conn->real_escape_string($port->get_IANA_Name()) . "', " . - "'" . $this->conn->real_escape_string($port->get_Banner()) . "', " . - "'" . $this->conn->real_escape_string($port->get_Notes()) . "'), "; + $ins_sql .= "(" . $int->get_ID() . ", " . "(SELECT `id` FROM `sagacity`.`ports_proto_services` WHERE `port` = '" . $port->get_Port() . "'" . " AND `proto` = '" . (is_a($port, 'tcp_ports') ? 'tcp' : 'udp') . "' " . " AND `notes` NOT LIKE '%historic%' LIMIT 1), " . "'" . $this->conn->real_escape_string($port->get_IANA_Name()) . "', " . "'" . $this->conn->real_escape_string($port->get_Banner()) . "', " . "'" . $this->conn->real_escape_string($port->get_Notes()) . "'), "; } - $ins_sql = substr($ins_sql, 0, -1); + $ins_sql = substr($ins_sql, 0, - 1); if (strlen($ins_sql) > 84) { - if (!$this->conn->real_query($ins_sql)) { + if (! $this->conn->real_query($ins_sql)) { Sagacity_Error::sql_handler($ins_sql); error_log($this->conn->error); $ret = false; } } - } - else { - - } + } else {} return $ret; } @@ -6664,37 +6926,45 @@ class db /** * Get TCP port data * - * @param integer $port_number [optional] - * Port number to retrieve from database + * @param integer $port_number + * [optional] + * Port number to retrieve from database * - * @return array:tcp_ports|NULL - * Returns array of tcp ports, or null if none found + * @return array:tcp_ports|NULL Returns array of tcp ports, or null if none found */ public function get_TCP_Ports($port_number = null) { - $ret = []; + $ret = []; $where = [ [ 'field' => 'proto', - 'op' => '=', + 'op' => '=', 'value' => 'tcp' ] ]; - if (!is_null($port_number)) { + if (! is_null($port_number)) { $where[] = [ - 'field' => 'port', - 'op' => '=', - 'value' => $port_number, + 'field' => 'port', + 'op' => '=', + 'value' => $port_number, 'sql_op' => 'AND' ]; } - $this->help->select("ports_proto_services", ['id', 'port', 'iana_Name', 'banner', 'notes'], $where); + $this->help->select("ports_proto_services", [ + 'id', + 'port', + 'iana_Name', + 'banner', + 'notes' + ], $where); $rows = $this->help->execute(); if (isset($rows['id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -6713,36 +6983,43 @@ class db * Get UDP port data * * @param integer $port_number - * Port number to retrieve from database + * Port number to retrieve from database * - * @return array:udp_ports|NULL - * Returns array of udp ports, or null if none found + * @return array:udp_ports|NULL Returns array of udp ports, or null if none found */ public function get_UDP_Ports($port_number = null) { - $ret = []; + $ret = []; $where = [ [ 'field' => 'proto', - 'op' => '=', + 'op' => '=', 'value' => 'udp' ] ]; - if (!is_null($port_number)) { + if (! is_null($port_number)) { $where[] = [ - 'field' => 'port', - 'op' => '=', - 'value' => $port_number, + 'field' => 'port', + 'op' => '=', + 'value' => $port_number, 'sql_op' => 'AND' ]; } - $this->help->select("ports_proto_services", ['id', 'port', 'iana_Name', 'banner', 'notes'], $where); + $this->help->select("ports_proto_services", [ + 'id', + 'port', + 'iana_Name', + 'banner', + 'notes' + ], $where); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -6761,20 +7038,19 @@ class db * Function to retrieve a nessus object * * @param string $nessus_id - * Nessus ID of the object you want + * Nessus ID of the object you want * - * @return nessus|NULL - * Returns nessus object and associated references, or null if none found + * @return nessus|NULL Returns nessus object and associated references, or null if none found */ public function get_Nessus($nessus_id) { $this->help->select("nessus_plugins np", null, [ [ 'field' => 'np.plugin_id', - 'op' => '=', + 'op' => '=', 'value' => $nessus_id ] - ], [ + ], [ 'table_joins' => [ "LEFT JOIN sagacity.nessus n ON n.nessus_id = np.plugin_id" ] @@ -6794,7 +7070,7 @@ class db $this->help->select("sagacity.nessus_meta", null, [ [ 'field' => 'plugin_id', - 'op' => '=', + 'op' => '=', 'value' => $row['plugin_id'] ] ]); @@ -6817,53 +7093,68 @@ class db * Update Nessus data * * @param array:nessus|nessus $nessus - * Nessus object to update + * Nessus object to update * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function save_Nessus($nessus) { - $nessus_arr = []; - $meta_arr = []; + $nessus_arr = []; + $meta_arr = []; $plugins_arr = []; - $update_arr = []; + $update_arr = []; - $nessus_fields = array('pdi_id', 'nessus_id'); - $meta_fields = array('plugin_id', 'type', 'val'); - $plugins_fields = array('plugin_id', 'name', 'copyright', 'version', 'file_name', 'file_date'); + $nessus_fields = array( + 'pdi_id', + 'nessus_id' + ); + $meta_fields = array( + 'plugin_id', + 'type', + 'val' + ); + $plugins_fields = array( + 'plugin_id', + 'name', + 'copyright', + 'version', + 'file_name', + 'file_date' + ); $this->help->create_table("tmp_nessus", true, array( array( - 'field' => 'plugin_id', + 'field' => 'plugin_id', 'datatype' => 'int(11)', - 'options' => 'primary key' + 'options' => 'primary key' ), array( - 'field' => 'name', + 'field' => 'name', 'datatype' => 'varchar(255)' ), array( - 'field' => 'copyright', + 'field' => 'copyright', 'datatype' => 'varchar(255)' ), array( - 'field' => 'version', + 'field' => 'version', 'datatype' => 'varchar(45)' ), array( - 'field' => 'file_name', + 'field' => 'file_name', 'datatype' => 'varchar(100)' ), array( - 'field' => 'file_date', + 'field' => 'file_date', 'datatype' => 'int(11)' ) )); $this->help->execute(); if (is_a($nessus, 'nessus')) { - $nessus = array(0 => $nessus); + $nessus = array( + 0 => $nessus + ); } if (is_array($nessus)) { @@ -6872,7 +7163,7 @@ class db $db_nessus = $this->get_Nessus($plug->get_Nessus_ID()); if (is_null($db_nessus)) { - if (!$plug->get_PDI_ID()) { + if (! $plug->get_PDI_ID()) { $pdi = new pdi(null, $plug->get_Category(), $plug->get_FileDate_Date()); $pdi->set_Short_Title($plug->get_Name()); $pdi->set_Group_Title($plug->get_Name()); @@ -6894,8 +7185,7 @@ class db ]; $refs = $plug->get_Reference(); - } - else { + } else { $update_arr[] = [ $plug->get_Nessus_ID(), $plug->get_Name(), @@ -6908,12 +7198,19 @@ class db $refs = $plug->compare_References($db_nessus); } - $nessus_arr[] = [$plug->get_PDI_ID(), $plug->get_Nessus_ID()]; + $nessus_arr[] = [ + $plug->get_PDI_ID(), + $plug->get_Nessus_ID() + ]; if (is_array($refs) && count($refs)) { foreach ($refs as $type => $ref) { foreach ($ref as $val) { - $meta_arr[] = array($plug->get_Nessus_ID(), $type, $val); + $meta_arr[] = array( + $plug->get_Nessus_ID(), + $type, + $val + ); } } } @@ -6921,38 +7218,37 @@ class db if (is_array($plugins_arr) && count($plugins_arr)) { $this->help->extended_insert("nessus_plugins", $plugins_fields, $plugins_arr, true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); } } if (is_array($update_arr) && count($update_arr)) { $this->help->extended_insert("tmp_nessus", $plugins_fields, $update_arr, true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); } $this->help->extended_update("nessus_plugins", "tmp_nessus", "plugin_id", $plugins_fields); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); } } if (is_array($nessus_arr) && count($nessus_arr)) { $this->help->extended_insert("nessus", $nessus_fields, $nessus_arr, true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); } } if (is_array($meta_arr) && count($meta_arr)) { $this->help->extended_insert("nessus_meta", $meta_fields, $meta_arr, true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); } } - } - else { + } else { return false; } @@ -6965,28 +7261,21 @@ class db * Getter function for oval * * @param string $oval_id - * Oval ID to retrieve from database + * Oval ID to retrieve from database * - * @return oval|NULL - * Returns oval object, or null if none found + * @return oval|NULL Returns oval object, or null if none found */ public function get_Oval($oval_id) { $oval = null; - $sql = "SELECT " . - "`pdi_id`, `oval_id`, `title`, `desc`, `platform`, `ext_def`, `ext_def_op` " . - "FROM sagacity.oval " . - "WHERE `oval_id` = '" . $this->conn->real_escape_string($oval_id) . "'"; + $sql = "SELECT " . "`pdi_id`, `oval_id`, `title`, `desc`, `platform`, `ext_def`, `ext_def_op` " . "FROM sagacity.oval " . "WHERE `oval_id` = '" . $this->conn->real_escape_string($oval_id) . "'"; if ($res = $this->conn->query($sql)) { $row = $res->fetch_assoc(); $oval = new oval($row['pdi_id'], $row['oval_id'], $row['title'], $row['desc'], $row['platform'], $row['ext_def'], $row['ext_def_op']); - $sql = "SELECT" . - "`oval_id`, `source`, `url`, `ref_id` " . - "FROM sagacity.oval_ref " . - "WHERE `oval_id` = '" . $this->conn->real_escape_string($row['oval_id']) . "'"; + $sql = "SELECT" . "`oval_id`, `source`, `url`, `ref_id` " . "FROM sagacity.oval_ref " . "WHERE `oval_id` = '" . $this->conn->real_escape_string($row['oval_id']) . "'"; if ($res2 = $this->conn->query($sql)) { while ($row2 = $res2->fetch_assoc()) { @@ -6994,15 +7283,13 @@ class db $oval->add_Reference($ref); } - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } return $oval; - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } @@ -7014,84 +7301,49 @@ class db * Function to create a OVAL xml file to import into SCC * * @param string $os - * Operating system version to query + * Operating system version to query * - * @return string - * Returns string representing XML + * @return string Returns string representing XML */ public function get_OS_Oval($os) { - $xmlns = "xmlns = 'http://oval.mitre.org/XMLSchema/oval-definitions-5#windows'"; + $xmlns = "xmlns = 'http://oval.mitre.org/XMLSchema/oval-definitions-5#windows'"; // ------------------------------ Start ----------------------------- // create temporary db table to combine all OVAL checks marked 'M' and not 'M' - $tmp_sql = "CREATE TEMPORARY TABLE `tmp_oval` SELECT " . - "pdi.`id`, o.`oval_id`, s.`stig_id`, vms.`vms_id`, pdi.`check_contents`, pdi.`short_title` " . - "FROM `pdi_catalog` AS pdi " . - "LEFT JOIN `oval` AS o ON pdi.`id` = o.`pdi_id` " . - "LEFT JOIN `stigs` AS s ON pdi.`id` = s.`pdi_id` " . - "LEFT JOIN `golddisk` AS vms ON pdi.`id` = vms.`pdi_id` " . - "LEFT JOIN `pdi_checklist_lookup` AS lookup ON pdi.`id` = lookup.`pdi_id` " . - "LEFT JOIN `checklist` AS c ON lookup.`checklist_id` = c.`id` " . - "LEFT JOIN `software` AS sft ON sft.`id` = c.`sw_id` " . - "WHERE " . - "o.`oval_id` = 'M' AND " . - "pdi.`check_contents` LIKE '%Registry Hive%' AND " . - "sft.`man` = 'MS' AND " . - "sft.`name` = 'Windows' AND " . - "sft.`ver` = '$os' " . - "GROUP BY `stig_id`"; + $tmp_sql = "CREATE TEMPORARY TABLE `tmp_oval` SELECT " . "pdi.`id`, o.`oval_id`, s.`stig_id`, vms.`vms_id`, pdi.`check_contents`, pdi.`short_title` " . "FROM `pdi_catalog` AS pdi " . "LEFT JOIN `oval` AS o ON pdi.`id` = o.`pdi_id` " . "LEFT JOIN `stigs` AS s ON pdi.`id` = s.`pdi_id` " . "LEFT JOIN `golddisk` AS vms ON pdi.`id` = vms.`pdi_id` " . "LEFT JOIN `pdi_checklist_lookup` AS lookup ON pdi.`id` = lookup.`pdi_id` " . "LEFT JOIN `checklist` AS c ON lookup.`checklist_id` = c.`id` " . "LEFT JOIN `software` AS sft ON sft.`id` = c.`sw_id` " . "WHERE " . "o.`oval_id` = 'M' AND " . "pdi.`check_contents` LIKE '%Registry Hive%' AND " . "sft.`man` = 'MS' AND " . "sft.`name` = 'Windows' AND " . "sft.`ver` = '$os' " . "GROUP BY `stig_id`"; $this->conn->real_query($tmp_sql); // delete rows in temporary table from other checklist that cannot designated as manual - $del_sql = "DELETE FROM tmp_oval " . - "WHERE `id` IN (" . - "SELECT pdi.`id` " . - "FROM `pdi_catalog` AS pdi " . - "LEFT JOIN `oval` AS o ON pdi.`id` = o.`pdi_id` " . - "LEFT JOIN `stigs` AS s ON pdi.`id` = s.`pdi_id` " . - "LEFT JOIN `golddisk` AS vms ON pdi.`id` = vms.`pdi_id` " . - "LEFT JOIN `pdi_checklist_lookup` AS lookup ON pdi.`id` = lookup.`pdi_id` " . - "LEFT JOIN `checklist` AS c ON lookup.`checklist_id` = c.`id` " . - "LEFT JOIN `software` AS sft ON sft.`id` = c.`sw_id` " . - "WHERE " . - "o.`oval_id` != 'M' AND " . - "pdi.`check_contents` REGEXP 'Registry Hive' AND " . - "sft.`man` = 'MS' AND " . - "sft.`name` = 'Windows' AND " . - "sft.`ver` = '$os' " . - "GROUP BY pdi.`id`)"; + $del_sql = "DELETE FROM tmp_oval " . "WHERE `id` IN (" . "SELECT pdi.`id` " . "FROM `pdi_catalog` AS pdi " . "LEFT JOIN `oval` AS o ON pdi.`id` = o.`pdi_id` " . "LEFT JOIN `stigs` AS s ON pdi.`id` = s.`pdi_id` " . "LEFT JOIN `golddisk` AS vms ON pdi.`id` = vms.`pdi_id` " . "LEFT JOIN `pdi_checklist_lookup` AS lookup ON pdi.`id` = lookup.`pdi_id` " . "LEFT JOIN `checklist` AS c ON lookup.`checklist_id` = c.`id` " . "LEFT JOIN `software` AS sft ON sft.`id` = c.`sw_id` " . "WHERE " . "o.`oval_id` != 'M' AND " . "pdi.`check_contents` REGEXP 'Registry Hive' AND " . "sft.`man` = 'MS' AND " . "sft.`name` = 'Windows' AND " . "sft.`ver` = '$os' " . "GROUP BY pdi.`id`)"; $this->conn->real_query($del_sql); - $sql = "SELECT " . - "`id`, `oval_id`, `stig_id`, `vms_id`, `check_contents`, `short_title` " . - "FROM `tmp_oval`"; + $sql = "SELECT " . "`id`, `oval_id`, `stig_id`, `vms_id`, `check_contents`, `short_title` " . "FROM `tmp_oval`"; if ($sth = $this->conn->prepare($sql)) { if ($sth->execute()) { - $pdi_id = 0; - $oval_id = ''; - $stig_id = ''; - $vms_id = ''; + $pdi_id = 0; + $oval_id = ''; + $stig_id = ''; + $vms_id = ''; $check_contents = ''; - $short_title = ''; - $x = 0; + $short_title = ''; + $x = 0; $sth->bind_result($pdi_id, $oval_id, $stig_id, $vms_id, $check_contents, $short_title); // oval_file xml validation check - $root = ''; -// declaring string variables and setting values to empty - $def = ''; - $tst = ''; - $obj = ''; - $ste = ''; -// generator node in xml format - $date = new DateTime(); // insert date and time when file completed - $gen = "DISA FSO5.3" . - $date->format(DATE_W3C) . ""; + $root = ''; + // declaring string variables and setting values to empty + $def = ''; + $tst = ''; + $obj = ''; + $ste = ''; + // generator node in xml format + $date = new DateTime(); // insert date and time when file completed + $gen = "DISA FSO5.3" . $date->format(DATE_W3C) . ""; while ($sth->fetch()) { - $x++; + $x ++; $match = []; preg_match('/Registry Hive: +(\S*)/', $check_contents, $match); $hive = $match[1]; @@ -7104,7 +7356,7 @@ class db if (is_array($match) && count($match) == 2) { $c_operator = 'AND'; - $c_count = 1; + $c_count = 1; } preg_match('/Type: +(\S*)/', $check_contents, $match); @@ -7114,109 +7366,62 @@ class db $value = is_array($match) && count($match) > 0 ? $match[1] : "PDI ID: $pdi_id" . PHP_EOL; if (strpos($type, "PDI ID: " . $pdi_id) !== false) { -// print "$pdi_id, $vms_id this VMS item cannot be automated".PHP_EOL.PHP_EOL; + // print "$pdi_id, $vms_id this VMS item cannot be automated".PHP_EOL.PHP_EOL; continue; } -// variables set for various xml nodes - $def_id = 'oval:smc.gpea.windows:def:' . $pdi_id; - $tst_id = 'oval:smc.gpea.windows:tst:' . $pdi_id . "00"; - $ste_id = 'oval:smc.gpea.windows:ste:' . $pdi_id . "00"; - $obj_id = 'oval:smc.gpea.windows:obj:' . $pdi_id . "00"; - $var_id = 'oval:smc.gpea.windows:var:' . $pdi_id . "00"; - $def_class = 'compliance'; - $m_family = 'windows'; - $aft_platform = 'Microsoft Windows ' . $os; + // variables set for various xml nodes + $def_id = 'oval:smc.gpea.windows:def:' . $pdi_id; + $tst_id = 'oval:smc.gpea.windows:tst:' . $pdi_id . "00"; + $ste_id = 'oval:smc.gpea.windows:ste:' . $pdi_id . "00"; + $obj_id = 'oval:smc.gpea.windows:obj:' . $pdi_id . "00"; + $var_id = 'oval:smc.gpea.windows:var:' . $pdi_id . "00"; + $def_class = 'compliance'; + $m_family = 'windows'; + $aft_platform = 'Microsoft Windows ' . $os; $tst_chk_existence = ($c_count == 1 ? "all_exist" : ''); -// definitions node in xml format - $def .= "" . "" . - "$short_title" . "" . - "$aft_platform" . "" . - "" . - "$short_title" . "" . - ""; + // definitions node in xml format + $def .= "" . "" . "$short_title" . "" . "$aft_platform" . "" . "" . "$short_title" . "" . ""; if ($c_count == 1) { - $def .= "" . PHP_EOL; + $def .= "" . PHP_EOL; } $def .= ""; - $tst .= "" . - "" . "" . - ""; + $tst .= "" . "" . "" . ""; - if (substr($path, -1) != "\\") { + if (substr($path, - 1) != "\\") { $path .= "\\"; } - $obj .= "" . - "" . strtoupper($hive) . "" . - "$path" . "$name" . - ""; + $obj .= "" . "" . strtoupper($hive) . "" . "$path" . "$name" . ""; - $ste .= "" . "" . - strtolower($type) . "" . "$value" . ""; + $ste .= "" . "" . strtolower($type) . "" . "$value" . ""; } $sth->close(); } } -// ------------------------------ End ----------------------------- -// ------------------------------ Start ----------------------------- - $tmp_sql = "CREATE TEMPORARY TABLE `tmp_oval` SELECT " . - "pdi.`id`,o.`oval_id`,s.`stig_id`,vms.`vms_id`,pdi.`check_contents`,pdi.`short_title` " . - "FROM `sagacity`.`pdi_catalog` AS pdi " . - "LEFT JOIN `sagacity`.`oval` AS o ON pdi.`id`=o.`pdi_id` " . - "LEFT JOIN `sagacity`.`stigs` AS s ON pdi.`id`=s.`pdi_id` " . - "LEFT JOIN `sagacity`.`golddisk` AS vms ON pdi.`id`=vms.`pdi_id` " . - "LEFT JOIN `sagacity`.`pdi_checklist_lookup` AS lookup ON pdi.`id`=lookup.`pdi_id` " . - "LEFT JOIN `sagacity`.`checklist` AS c ON lookup.`checklist_id`=c.`id` " . - "LEFT JOIN `sagacity`.`software` AS sft ON sft.`id`=c.`sw_id` " . - "WHERE " . - "o.`oval_id`='M' AND " . - "pdi.`check_contents` LIKE '%AuditPol%' AND " . - "sft.`man`='MS' AND " . - "sft.`name`='Windows' AND " . - "sft.`ver`='$os' " . - "GROUP BY `stig_id`"; + // ------------------------------ End ----------------------------- + // ------------------------------ Start ----------------------------- + $tmp_sql = "CREATE TEMPORARY TABLE `tmp_oval` SELECT " . "pdi.`id`,o.`oval_id`,s.`stig_id`,vms.`vms_id`,pdi.`check_contents`,pdi.`short_title` " . "FROM `sagacity`.`pdi_catalog` AS pdi " . "LEFT JOIN `sagacity`.`oval` AS o ON pdi.`id`=o.`pdi_id` " . "LEFT JOIN `sagacity`.`stigs` AS s ON pdi.`id`=s.`pdi_id` " . "LEFT JOIN `sagacity`.`golddisk` AS vms ON pdi.`id`=vms.`pdi_id` " . "LEFT JOIN `sagacity`.`pdi_checklist_lookup` AS lookup ON pdi.`id`=lookup.`pdi_id` " . "LEFT JOIN `sagacity`.`checklist` AS c ON lookup.`checklist_id`=c.`id` " . "LEFT JOIN `sagacity`.`software` AS sft ON sft.`id`=c.`sw_id` " . "WHERE " . "o.`oval_id`='M' AND " . "pdi.`check_contents` LIKE '%AuditPol%' AND " . "sft.`man`='MS' AND " . "sft.`name`='Windows' AND " . "sft.`ver`='$os' " . "GROUP BY `stig_id`"; $this->conn->real_query($tmp_sql); - $del_sql = "DELETE FROM tmp_oval " . - "WHERE `id` IN (" . - "SELECT pdi.`id` " . - "FROM `sagacity`.`pdi_catalog` AS pdi " . - "LEFT JOIN `sagacity`.`oval` AS o ON pdi.`id`=o.`pdi_id` " . - "LEFT JOIN `sagacity`.`stigs` AS s ON pdi.`id`=s.`pdi_id` " . - "LEFT JOIN `sagacity`.`golddisk` AS vms ON pdi.`id`=vms.`pdi_id` " . - "LEFT JOIN `sagacity`.`pdi_checklist_lookup` AS lookup ON pdi.`id`=lookup.`pdi_id` " . - "LEFT JOIN `sagacity`.`checklist` AS c ON lookup.`checklist_id`=c.`id` " . - "LEFT JOIN `sagacity`.`software` AS sft ON sft.`id`=c.`sw_id` " . - "WHERE " . - "o.`oval_id`!='M' AND " . - "pdi.`check_contents` REGEXP 'AuditPol' AND " . - "sft.`man`='MS' AND " . - "sft.`name`='Windows' AND " . - "sft.`ver`='$os' " . - "GROUP BY pdi.`id`)"; + $del_sql = "DELETE FROM tmp_oval " . "WHERE `id` IN (" . "SELECT pdi.`id` " . "FROM `sagacity`.`pdi_catalog` AS pdi " . "LEFT JOIN `sagacity`.`oval` AS o ON pdi.`id`=o.`pdi_id` " . "LEFT JOIN `sagacity`.`stigs` AS s ON pdi.`id`=s.`pdi_id` " . "LEFT JOIN `sagacity`.`golddisk` AS vms ON pdi.`id`=vms.`pdi_id` " . "LEFT JOIN `sagacity`.`pdi_checklist_lookup` AS lookup ON pdi.`id`=lookup.`pdi_id` " . "LEFT JOIN `sagacity`.`checklist` AS c ON lookup.`checklist_id`=c.`id` " . "LEFT JOIN `sagacity`.`software` AS sft ON sft.`id`=c.`sw_id` " . "WHERE " . "o.`oval_id`!='M' AND " . "pdi.`check_contents` REGEXP 'AuditPol' AND " . "sft.`man`='MS' AND " . "sft.`name`='Windows' AND " . "sft.`ver`='$os' " . "GROUP BY pdi.`id`)"; $this->conn->real_query($del_sql); - $sql = "SELECT " . - "`id`,`oval_id`,`stig_id`,`vms_id`,`check_contents`,`short_title` " . - "FROM `tmp_oval`"; + $sql = "SELECT " . "`id`,`oval_id`,`stig_id`,`vms_id`,`check_contents`,`short_title` " . "FROM `tmp_oval`"; if ($sth = $this->conn->prepare($sql)) { if ($sth->execute()) { - $pdi_id = 0; - $oval_id = ''; - $stig_id = ''; - $vms_id = ''; + $pdi_id = 0; + $oval_id = ''; + $stig_id = ''; + $vms_id = ''; $check_contents = ''; - $short_title = ''; - $x = 0; + $short_title = ''; + $x = 0; $sth->bind_result($pdi_id, $oval_id, $stig_id, $vms_id, $check_contents, $short_title); $sth->store_result(); @@ -7230,37 +7435,29 @@ class db $ste_id = "oval:smc.gpea.windows:ste:" . $pdi_id . "00"; $arrow_idx = strpos($check_contents, '->') + 3; - $dash_idx = strpos($check_contents, ' - '); + $dash_idx = strpos($check_contents, ' - '); $subcat = substr($check_contents, $arrow_idx, $dash_idx - $arrow_idx); - $tag = str_replace(' ', '_', strtolower($subcat)); + $tag = str_replace(' ', '_', strtolower($subcat)); $audit = substr($check_contents, $dash_idx + 3); - $ste .= "" . - "<$tag datatype='string'>" . - ($audit == 'Failure' ? 'AUDIT_FAILURE' : 'AUDIT_SUCCESS') . "" . - ""; + $ste .= "" . "<$tag datatype='string'>" . ($audit == 'Failure' ? 'AUDIT_FAILURE' : 'AUDIT_SUCCESS') . "" . ""; - $tst .= "" . - "" . - "" . ""; + $tst .= "" . "" . "" . ""; } - } - else { + } else { error_log($sth->error); } - } - else { + } else { error_log($this->conn->error); } -// ------------------------------ End ----------------------------- -// ------------------------------ Start ----------------------------- -// ------------------------------ End ----------------------------- + // ------------------------------ End ----------------------------- + // ------------------------------ Start ----------------------------- + // ------------------------------ End ----------------------------- - $xml_string = $root . - "$gen$def$tst$obj$ste"; + $xml_string = $root . "$gen$def$tst$obj$ste"; return $xml_string; } @@ -7269,10 +7466,9 @@ class db * Function to get oval constant data from database * * @param string $oval_id - * Oval ID to get constant data for + * Oval ID to get constant data for * - * @return array - * Returns array of constant ID and value + * @return array Returns array of constant ID and value */ public function get_Oval_Const($oval_id) { @@ -7280,16 +7476,15 @@ class db if ($res = $this->conn->query($sql)) { $vals = []; - while ($row = $res->fetch_assoc()) { + while ($row = $res->fetch_assoc()) { $vals[] = $row['value']; } return array( 'const_id' => $row['const_id'], - 'values' => $vals + 'values' => $vals ); - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); return null; @@ -7300,24 +7495,23 @@ class db * Function to add an Oval * * @param oval $oval - * Oval to add to database + * Oval to add to database * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function add_Oval($oval) { $this->help->insert("sagacity.oval", array( - 'pdi_id' => $oval->get_PDI_ID(), - 'oval_id' => $oval->get_Oval_ID(), - 'title' => $oval->get_Title(), - 'desc' => $oval->get_Description(), - 'platform' => $oval->get_Platform(), - 'ext_def' => $oval->get_External_Definition(), + 'pdi_id' => $oval->get_PDI_ID(), + 'oval_id' => $oval->get_Oval_ID(), + 'title' => $oval->get_Title(), + 'desc' => $oval->get_Description(), + 'platform' => $oval->get_Platform(), + 'ext_def' => $oval->get_External_Definition(), 'ext_def_op' => $oval->get_External_Definition_Operator() - ), true); + ), true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -7329,24 +7523,23 @@ class db * Function to save oval data * * @param oval $oval_in - * Oval to update database + * Oval to update database * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function save_Oval($oval_in) { $this->help->replace("sagacity.oval", array( - 'pdi_id' => $oval_in->get_PDI_ID(), - 'oval_id' => $oval_in->get_Oval_ID(), - 'title' => $oval_in->get_Title(), - 'desc' => $oval_in->get_Description(), - 'platform' => $oval_in->get_Platform(), - 'ext_def' => $oval_in->get_External_Definition(), + 'pdi_id' => $oval_in->get_PDI_ID(), + 'oval_id' => $oval_in->get_Oval_ID(), + 'title' => $oval_in->get_Title(), + 'desc' => $oval_in->get_Description(), + 'platform' => $oval_in->get_Platform(), + 'ext_def' => $oval_in->get_External_Definition(), 'ext_def_op' => $oval_in->get_External_Definition_Operator() )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -7360,12 +7553,11 @@ class db * Function to retrieve a PDI from the database * * @param integer $pdi_id - * PDI ID to get from database + * PDI ID to get from database * @param integer $chk_id - * Checklist ID to filter on + * Checklist ID to filter on * - * @return pdi|NULL - * Returns PDI object, or null if none found + * @return pdi|NULL Returns PDI object, or null if none found */ public function get_PDI($pdi_id, $chk_id = null) { @@ -7373,7 +7565,7 @@ class db $this->help->select("sagacity.pdi_catalog p", null, [ [ 'field' => 'p.id', - 'op' => '=', + 'op' => '=', 'value' => $pdi_id ] ]); @@ -7385,17 +7577,17 @@ class db $pdi->set_Short_Title($row['short_title']); $pdi->set_Check_Contents($row['check_contents']); - if (!is_null($chk_id)) { + if (! is_null($chk_id)) { $this->help->select("sagacity.pdi_checklist_lookup", null, [ [ 'field' => 'pdi_id', - 'op' => '=', + 'op' => '=', 'value' => $pdi_id ], [ - 'field' => 'checklist_id', - 'op' => '=', - 'value' => $chk_id, + 'field' => 'checklist_id', + 'op' => '=', + 'value' => $chk_id, 'sql_op' => 'AND' ] ]); @@ -7417,17 +7609,16 @@ class db * Function to get pdi catalog item from database * * @param integer $pdi_id - * Get PDI Catalog entry from database using this ID + * Get PDI Catalog entry from database using this ID * - * @return array|NULL - * Returns associative array with record, or null if none found + * @return array|NULL Returns associative array with record, or null if none found */ public function get_PDI_Catalog($pdi_id) { $this->help->select("sagacity.pdi", null, array( array( 'field' => 'pdi_id', - 'op' => '=', + 'op' => '=', 'value' => $pdi_id ) )); @@ -7439,67 +7630,65 @@ class db * Function to attempt to match text * * @param pdi $pdi - * PDI to match in database + * PDI to match in database * @param nessus $nessus - * Nessus to match in database + * Nessus to match in database * @param cve $cve - * CVE to match in database + * CVE to match in database * @param iavm $iavm - * IAVM to match in database + * IAVM to match in database * - * @return array|NULL - * Returns array of possible matches, or null if none found + * @return array|NULL Returns array of possible matches, or null if none found */ public function get_Matching_PDIs($pdi, $nessus, $cve, $iavm) { /* - $string = ''; - - if (!is_null($nessus)) { - $string = $nessus->get_Name() . ' ' . $nessus->get_Description() . ' ' . $nessus->get_Summary(); - } - elseif (!is_null($cve)) { - $string = $cve->get_Description(); - } - elseif (!is_null($iavm)) { - $string = $iavm->get_Title() . ' ' . $iavm->get_Executive_Summary(); - } - - foreach ($this->DISALLOWED as $word) { - $string = preg_replace("/\s" . $word . "\s/i", " ", $string); - } - - $sql = "SELECT " . - "MATCH(pdi.`short_title`,pdi.`description`,pdi.`check_content`) " . - "AGAINST('" . $this->conn->real_escape_string($string) . "' IN NATURAL LANGUAGE MODE) AS 'score'," . - "pdi.`id`,pdi.`short_title`,pdi.`description`,pdi.`check_content` " . - "FROM `sagacity`.`pdi_catalog` pdi " . - "GROUP BY pdi.`id`,`score` " . - "HAVING `score` > 10 " . - "ORDER BY `score` DESC " . - "LIMIT 0, 5"; - - $ret = []; - - if ($res = $this->conn->query($sql)) { - while ($row = $res->fetch_assoc()) { - $ret[] = array( - 'score' => number_format($row['score'], 3), - 'pdi_id' => $row['id'], - 'title' => $row['short_title'], - 'check_content' => $row['check_content'], - 'desc' => $row['description'] - ); - } - - return $ret; - } - else { - Sagacity_Error::sql_handler($sql); - error_log($this->conn->error); - } + * $string = ''; + * + * if (!is_null($nessus)) { + * $string = $nessus->get_Name() . ' ' . $nessus->get_Description() . ' ' . $nessus->get_Summary(); + * } + * elseif (!is_null($cve)) { + * $string = $cve->get_Description(); + * } + * elseif (!is_null($iavm)) { + * $string = $iavm->get_Title() . ' ' . $iavm->get_Executive_Summary(); + * } + * + * foreach ($this->DISALLOWED as $word) { + * $string = preg_replace("/\s" . $word . "\s/i", " ", $string); + * } + * + * $sql = "SELECT " . + * "MATCH(pdi.`short_title`,pdi.`description`,pdi.`check_content`) " . + * "AGAINST('" . $this->conn->real_escape_string($string) . "' IN NATURAL LANGUAGE MODE) AS 'score'," . + * "pdi.`id`,pdi.`short_title`,pdi.`description`,pdi.`check_content` " . + * "FROM `sagacity`.`pdi_catalog` pdi " . + * "GROUP BY pdi.`id`,`score` " . + * "HAVING `score` > 10 " . + * "ORDER BY `score` DESC " . + * "LIMIT 0, 5"; + * + * $ret = []; + * + * if ($res = $this->conn->query($sql)) { + * while ($row = $res->fetch_assoc()) { + * $ret[] = array( + * 'score' => number_format($row['score'], 3), + * 'pdi_id' => $row['id'], + * 'title' => $row['short_title'], + * 'check_content' => $row['check_content'], + * 'desc' => $row['description'] + * ); + * } + * + * return $ret; + * } + * else { + * Sagacity_Error::sql_handler($sql); + * error_log($this->conn->error); + * } */ - return null; } @@ -7507,10 +7696,9 @@ class db * Function to try and find a PDI * * @param array $data_in - * An array of a type and value to search for. This will primarily be intended for types that don't have a readily available link to a PDI (nessus, retina, CVE, IAVM, etc). + * An array of a type and value to search for. This will primarily be intended for types that don't have a readily available link to a PDI (nessus, retina, CVE, IAVM, etc). * - * @return integer - * Returns the PDI id of the matching entry, or 0 if none found + * @return integer Returns the PDI id of the matching entry, or 0 if none found */ public function find_PDI($data_in) { @@ -7523,8 +7711,7 @@ class db if ($nessus->get_PDI_ID()) { return $nessus->get_PDI_ID(); - } - else { + } else { $cves = $nessus->get_Reference_By_Type('cve'); foreach ($cves as $cve_num) { $cve = $this->get_CVE($cve_num); @@ -7537,12 +7724,11 @@ class db while ($row = $res->fetch_assoc()) { $iavm = $this->get_IAVM($row['noticeId']); - if (!is_null($iavm)) { + if (! is_null($iavm)) { return $iavm->get_PDI_ID(); } } - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } @@ -7550,14 +7736,7 @@ class db $bids = $nessus->get_Reference_By_Type('bid'); foreach ($bids as $bid_num) { - $sql = "SELECT iavm.`pdi_id` " . - "FROM `sagacity`.`nessus_refs` nr " . - "JOIN `sagacity`.`iavm_bids` ib ON ib.`bid`=nr.`val` " . - "JOIN `sagacity`.`iavm_notices` iavm ON iavm.`noticeId`=ib.`iavm_notice_id` " . - "WHERE " . - "nr.`type`='bid' AND " . - "nr.`val`=" . $this->conn->real_escape_string($bid_num) . " AND " . - "nr.`plugin_id`=" . $this->conn->real_escape_string($nessus->get_Nessus_ID()); + $sql = "SELECT iavm.`pdi_id` " . "FROM `sagacity`.`nessus_refs` nr " . "JOIN `sagacity`.`iavm_bids` ib ON ib.`bid`=nr.`val` " . "JOIN `sagacity`.`iavm_notices` iavm ON iavm.`noticeId`=ib.`iavm_notice_id` " . "WHERE " . "nr.`type`='bid' AND " . "nr.`val`=" . $this->conn->real_escape_string($bid_num) . " AND " . "nr.`plugin_id`=" . $this->conn->real_escape_string($nessus->get_Nessus_ID()); if ($res = $this->conn->query($sql)) { while ($row = $res->fetch_assoc()) { return $row['pdi_id']; @@ -7573,12 +7752,12 @@ class db * Function to save an existing PDI * * @param pdi $pdi_in - * The PDI to save or update - * @param checklist $checklist [optional] - * The checklist to link new PDIs to (if null links to Orphan checklist) + * The PDI to save or update + * @param checklist $checklist + * [optional] + * The checklist to link new PDIs to (if null links to Orphan checklist) * - * @return boolean|int - * Returns ID of PDI or FALSE if failed to save. + * @return boolean|int Returns ID of PDI or FALSE if failed to save. */ public function save_PDI($pdi_in, $checklist = null) { @@ -7586,34 +7765,33 @@ class db if ($pdi_in->get_ID()) { $this->help->update('sagacity.pdi_catalog', [ - 'cat' => $pdi_in->get_Category_Level(), - 'update' => $pdi_in->get_Last_Update(), - 'short_title' => $pdi_in->get_Short_Title(), + 'cat' => $pdi_in->get_Category_Level(), + 'update' => $pdi_in->get_Last_Update(), + 'short_title' => $pdi_in->get_Short_Title(), 'check_contents' => $pdi_in->get_Check_Contents() - ], [ + ], [ [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $pdi_in->get_ID() ] ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } $pdi_id = $pdi_in->get_ID(); - } - else { + } else { $this->help->insert("sagacity.pdi_catalog", [ - "cat" => $pdi_in->get_Category_Level(), - 'update' => $pdi_in->get_Last_Update(), - 'short_title' => $pdi_in->get_Short_Title(), + "cat" => $pdi_in->get_Category_Level(), + 'update' => $pdi_in->get_Last_Update(), + 'short_title' => $pdi_in->get_Short_Title(), 'check_contents' => $pdi_in->get_Check_Contents() ]); - if (!($pdi_id = $this->help->execute())) { + if (! ($pdi_id = $this->help->execute())) { $this->help->debug(E_ERROR); return false; } @@ -7627,35 +7805,33 @@ class db if (is_array($checklist) && isset($checklist[0]) && is_a($checklist[0], 'checklist')) { $this->help->insert('sagacity.pdi_checklist_lookup', [ - 'pdi_id' => $pdi_id, - 'checklist_id' => $checklist[0]->get_ID(), + 'pdi_id' => $pdi_id, + 'checklist_id' => $checklist[0]->get_ID(), 'check_contents' => $pdi_in->get_Check_Contents(), - 'group_title' => $pdi_in->get_Group_Title(), - 'short_title' => $pdi_in->get_Short_Title(), - 'fix_text' => $pdi_in->get_Fix_Text() - ], true); + 'group_title' => $pdi_in->get_Group_Title(), + 'short_title' => $pdi_in->get_Short_Title(), + 'fix_text' => $pdi_in->get_Fix_Text() + ], true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } - } - elseif (is_a($checklist, 'checklist')) { + } elseif (is_a($checklist, 'checklist')) { $this->help->insert("sagacity.pdi_checklist_lookup", array( - 'pdi_id' => $pdi_id, - 'checklist_id' => $checklist->get_ID(), + 'pdi_id' => $pdi_id, + 'checklist_id' => $checklist->get_ID(), 'check_contents' => $pdi_in->get_Check_Contents(), - 'group_title' => $pdi_in->get_Group_Title(), - 'short_title' => $pdi_in->get_Short_Title(), - 'fix_text' => $pdi_in->get_Fix_Text() - ), true); + 'group_title' => $pdi_in->get_Group_Title(), + 'short_title' => $pdi_in->get_Short_Title(), + 'fix_text' => $pdi_in->get_Fix_Text() + ), true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } - } - else { + } else { Sagacity_Error::err_handler("Cannon link PDI ID $pdi_id with a checklist", E_WARNING); } @@ -7666,51 +7842,53 @@ class db * Function to save the check contents to a specific PDI and checklist * * @param pdi $pdi_in - * The PDI (containing the check contents) + * The PDI (containing the check contents) * @param checklist $checklist_in - * The checklist - * @param string $check_contents_in [optional] - * The check contents to save (will use check contents in $pdi_in if this is null) - * @param string $fix_text_in [optional] - * The fix text to save + * The checklist + * @param string $check_contents_in + * [optional] + * The check contents to save (will use check contents in $pdi_in if this is null) + * @param string $fix_text_in + * [optional] + * The fix text to save * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function save_Check_Contents($pdi_in, $checklist_in, $check_contents_in = null, $fix_text_in = null) { $this->help->replace("sagacity.pdi_checklist_lookup", array( - 'pdi_id' => $pdi_in->get_ID(), - 'checklist_id' => $checklist_in->get_ID(), - 'group_title' => $pdi_in->get_Group_Title(), - 'short_title' => $pdi_in->get_Short_Title(), - 'check_contents' => (!is_null($check_contents_in) ? $check_contents_in : $pdi_in->get_Check_Contents()), - 'fix_text' => (!is_null($fix_text_in) ? $fix_text_in : $pdi_in->get_Fix_Text()) + 'pdi_id' => $pdi_in->get_ID(), + 'checklist_id' => $checklist_in->get_ID(), + 'group_title' => $pdi_in->get_Group_Title(), + 'short_title' => $pdi_in->get_Short_Title(), + 'check_contents' => (! is_null($check_contents_in) ? $check_contents_in : $pdi_in->get_Check_Contents()), + 'fix_text' => (! is_null($fix_text_in) ? $fix_text_in : $pdi_in->get_Fix_Text()) )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { return false; } return true; } -// }}} -// {{{ PROC_IA_CONTROLS CLASS FUNCTIONS + // }}} + // {{{ PROC_IA_CONTROLS CLASS FUNCTIONS /** * Function to get all procedural IA controls for specified system * * @param ste $ste_in - * ST&E to query the database for - * @param string $control_id [optional] - * Control ID to query (default null) + * ST&E to query the database for + * @param string $control_id + * [optional] + * Control ID to query (default null) * - * @return array:proc_ia_controls - * Return array of proc_ia_controls and associated sub controls, or empty array if none found + * @return array:proc_ia_controls Return array of proc_ia_controls and associated sub controls, or empty array if none found */ public function get_Proc_IA_Controls($ste_in, $control_id = null) { $ret = []; - $sys = $this->get_System($ste_in->get_System()->get_ID())[0]; + $sys = $this->get_System($ste_in->get_System() + ->get_ID())[0]; switch ($sys->get_Classification()) { case 'Public': $class = 'pub'; @@ -7725,16 +7903,9 @@ class db $class = ''; } - $sql = "SELECT " . - "pia.`control_id`,pia.`name`,pia.`subject_area`,pia.`description`," . - "pia.`threat_vul_cm`,pia.`gen_imp_guide`,pia.`guide_resource`,pia.`impact` " . - "FROM `sagacity`.`proc_ia_controls` pia " . - "LEFT JOIN `sagacity`.`proc_level_type` plt ON plt.`proc_control`=pia.`control_id` " . - "WHERE plt.`type`='diacap' AND " . - "plt.`level`=" . $sys->get_MAC() . " AND " . - "plt.`class`='$class'"; + $sql = "SELECT " . "pia.`control_id`,pia.`name`,pia.`subject_area`,pia.`description`," . "pia.`threat_vul_cm`,pia.`gen_imp_guide`,pia.`guide_resource`,pia.`impact` " . "FROM `sagacity`.`proc_ia_controls` pia " . "LEFT JOIN `sagacity`.`proc_level_type` plt ON plt.`proc_control`=pia.`control_id` " . "WHERE plt.`type`='diacap' AND " . "plt.`level`=" . $sys->get_MAC() . " AND " . "plt.`class`='$class'"; - if (!is_null($control_id)) { + if (! is_null($control_id)) { $sql .= " AND pia.`control_id`='" . $this->conn->real_escape_string($control_id) . "'"; } @@ -7742,56 +7913,43 @@ class db while ($row = $res->fetch_assoc()) { $ia = new proc_ia_controls($row['control_id'], $row['name'], $row['subject_area'], $row['description'], $row['threat_vul_cm'], $row['gen_imp_guide'], $row['guide_resource'], $row['impact']); - $sql2 = "SELECT `ste_id`,`control_id`,`vul_desc`,`mitigations`,`references`,`risk_analysis`,`notes`,`done` " . - "FROM `sagacity`.`control_findings` " . - "WHERE `ste_id`=" . $ste_in->get_ID() . " AND " . - "`control_id`='" . $row['control_id'] . "'"; + $sql2 = "SELECT `ste_id`,`control_id`,`vul_desc`,`mitigations`,`references`,`risk_analysis`,`notes`,`done` " . "FROM `sagacity`.`control_findings` " . "WHERE `ste_id`=" . $ste_in->get_ID() . " AND " . "`control_id`='" . $row['control_id'] . "'"; if ($res2 = $this->conn->query($sql2)) { if ($res2->num_rows > 0) { $row2 = $res2->fetch_assoc(); - $ia->finding->control_id = $row2['control_id']; - $ia->finding->ste_id = $row2['ste_id']; - $ia->finding->vul_desc = $row2['vul_desc']; - $ia->finding->mitigations = $row2['mitigations']; - $ia->finding->reference = $row2['references']; - $ia->finding->notes = $row2['notes']; + $ia->finding->control_id = $row2['control_id']; + $ia->finding->ste_id = $row2['ste_id']; + $ia->finding->vul_desc = $row2['vul_desc']; + $ia->finding->mitigations = $row2['mitigations']; + $ia->finding->reference = $row2['references']; + $ia->finding->notes = $row2['notes']; $ia->finding->risk_analysis = $row2['risk_analysis']; - $ia->finding->done = $row2['done']; + $ia->finding->done = $row2['done']; } } - $sql2 = "SELECT " . - "`sub_control_id`,`name`,`objective`," . - "`prep`,`script`,`exp_result` " . - "FROM `sagacity`.`proc_ia_sub_controls` " . - "WHERE `parent_control_id`='" . $row['control_id'] . "'"; + $sql2 = "SELECT " . "`sub_control_id`,`name`,`objective`," . "`prep`,`script`,`exp_result` " . "FROM `sagacity`.`proc_ia_sub_controls` " . "WHERE `parent_control_id`='" . $row['control_id'] . "'"; if ($res2 = $this->conn->query($sql2)) { while ($row2 = $res2->fetch_assoc()) { $ia_sub = new proc_sub_ia_controls($row2['sub_control_id'], $row2['name'], $row2['objective'], $row2['prep'], $row2['script'], $row2['exp_result']); - $sql3 = "SELECT " . - "`ste_id`,`proc_id`,`status`,`test_results`," . - "`mitigations`,`milestones`,`ref`,`notes` " . - "FROM `sagacity`.`proc_findings` " . - "WHERE `ste_id`=" . $ste_in->get_ID() . " AND " . - "`proc_id`='" . $row2['sub_control_id'] . "'"; + $sql3 = "SELECT " . "`ste_id`,`proc_id`,`status`,`test_results`," . "`mitigations`,`milestones`,`ref`,`notes` " . "FROM `sagacity`.`proc_findings` " . "WHERE `ste_id`=" . $ste_in->get_ID() . " AND " . "`proc_id`='" . $row2['sub_control_id'] . "'"; if ($res3 = $this->conn->query($sql3)) { if ($res3->num_rows > 0) { $row3 = $res3->fetch_assoc(); - $ia_sub->finding->control_id = $row3['proc_id']; - $ia_sub->finding->ste_id = $row3['ste_id']; + $ia_sub->finding->control_id = $row3['proc_id']; + $ia_sub->finding->ste_id = $row3['ste_id']; $ia_sub->finding->test_result = $row3['test_results']; - $ia_sub->finding->mitigation = $row3['mitigations']; - $ia_sub->finding->milestone = $row3['milestones']; - $ia_sub->finding->reference = $row3['ref']; - $ia_sub->finding->notes = $row3['notes']; - $ia_sub->finding->status = $row3['status']; - } - else { + $ia_sub->finding->mitigation = $row3['mitigations']; + $ia_sub->finding->milestone = $row3['milestones']; + $ia_sub->finding->reference = $row3['ref']; + $ia_sub->finding->notes = $row3['notes']; + $ia_sub->finding->status = $row3['status']; + } else { $ia_sub->finding->status = 'Not Reviewed'; } } @@ -7802,8 +7960,7 @@ class db $ret[] = $ia; } - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } @@ -7811,8 +7968,8 @@ class db return $ret; } -// }}} -// {{{ INTERVIEW QUESTION CLASS FUNCTIONS + // }}} + // {{{ INTERVIEW QUESTION CLASS FUNCTIONS /** * Function to return the categories * @@ -7820,8 +7977,12 @@ class db */ public function get_Question_Categories() { - $ret = []; - $this->help->select("interview_questions", ['cat'], [], ['group' => 'cat']); + $ret = []; + $this->help->select("interview_questions", [ + 'cat' + ], [], [ + 'group' => 'cat' + ]); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -7842,27 +8003,20 @@ class db public function get_Questions($cat_in, $type_in = null) { $ret = []; - $sql = "SELECT " . - "iq.`id`,iq.`key`,iq.`cat`,iq.`question`," . - "(SELECT ci.`answer` " . - "FROM `category_interview` ci " . - "WHERE ci.`ques_id`=iq.`id` AND ci.`cat_id`=" . $this->conn->real_escape_string($cat_in) . ") AS 'answer' " . - "FROM `interview_questions` iq " . - "WHERE iq.`cat`='" . $this->conn->real_escape_string($type_in) . "'"; + $sql = "SELECT " . "iq.`id`,iq.`key`,iq.`cat`,iq.`question`," . "(SELECT ci.`answer` " . "FROM `category_interview` ci " . "WHERE ci.`ques_id`=iq.`id` AND ci.`cat_id`=" . $this->conn->real_escape_string($cat_in) . ") AS 'answer' " . "FROM `interview_questions` iq " . "WHERE iq.`cat`='" . $this->conn->real_escape_string($type_in) . "'"; if ($res = $this->conn->query($sql)) { while ($row = $res->fetch_assoc()) { - $ques = new question(); - $ques->id = $row['id']; - $ques->cat = $row['cat']; - $ques->key = $row['key']; + $ques = new question(); + $ques->id = $row['id']; + $ques->cat = $row['cat']; + $ques->key = $row['key']; $ques->question = $row['question']; - $ques->answer = $row['answer']; + $ques->answer = $row['answer']; $ret[] = $ques; } - } - else { + } else { print $sql . "
"; print $this->conn->error; Sagacity_Error::sql_handler($sql); @@ -7881,30 +8035,37 @@ class db */ public function get_Interview_Answers($cat_id_in) { - $ret = []; - $this->help->select("interview_questions iq", ['iq.id', 'iq.key', 'iq.question', 'ci.answer'], [ + $ret = []; + $this->help->select("interview_questions iq", [ + 'iq.id', + 'iq.key', + 'iq.question', + 'ci.answer' + ], [ [ 'field' => 'ci.cat_id', - 'op' => '=', + 'op' => '=', 'value' => $cat_id_in ] - ], [ + ], [ 'table_joins' => "LEFT JOIN category_interview ci ON iq.id = ci.ques_id" ]); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { foreach ($rows as $row) { $ques = new question(); - $ques->id = $row['id']; - $ques->key = $row['key']; + $ques->id = $row['id']; + $ques->key = $row['key']; $ques->question = $row['question']; - $ques->answer = ($row['answer'] ? true : false); + $ques->answer = ($row['answer'] ? true : false); $ret[] = $ques; } @@ -7924,19 +8085,16 @@ class db $this->help->delete("category_interview", null, [ [ 'field' => 'cat_id', - 'op' => '=', + 'op' => '=', 'value' => $cat_in ] ]); $this->help->execute(); - $this->help->sql = "INSERT IGNORE INTO `category_interview` (`cat_id`,`ques_id`)" . - " SELECT " . $this->conn->real_escape_string($cat_in) . ",`id`" . - " FROM `interview_questions`" . - " WHERE `cat`='" . $this->conn->real_escape_string($type_in) . "'"; + $this->help->sql = "INSERT IGNORE INTO `category_interview` (`cat_id`,`ques_id`)" . " SELECT " . $this->conn->real_escape_string($cat_in) . ",`id`" . " FROM `interview_questions`" . " WHERE `cat`='" . $this->conn->real_escape_string($type_in) . "'"; $this->help->query_type = db_helper::INSERT; - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -7953,21 +8111,23 @@ class db */ public function set_QA($cat_id_in, $question) { - $this->help->update("category_interview", ['answer' => ($question->answer)], [ + $this->help->update("category_interview", [ + 'answer' => ($question->answer) + ], [ [ 'field' => 'ques_id', - 'op' => '=', + 'op' => '=', 'value' => $question->id ], [ - 'field' => 'cat_id', - 'op' => '=', - 'value' => $cat_id_in, + 'field' => 'cat_id', + 'op' => '=', + 'value' => $cat_id_in, 'sql_op' => 'AND' ] ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -7975,24 +8135,21 @@ class db return true; } -// }}} -// {{{ RETINA CLASS FUNCTIONS + // }}} + // {{{ RETINA CLASS FUNCTIONS /** * Update retina data * * @param retina $retina_In - * Retina object to save to database + * Retina object to save to database * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function save_Retina($retina_In) { - $sql = "REPLACE INTO `sagacity`.`retina` (`pdi_id`,`retina_id`) VALUES (" . - $this->conn->real_escape_string($retina_In->get_PDI_ID()) . "," . - $this->conn->real_escape_string($retina_In->get_Retina_ID()) . ")"; + $sql = "REPLACE INTO `sagacity`.`retina` (`pdi_id`,`retina_id`) VALUES (" . $this->conn->real_escape_string($retina_In->get_PDI_ID()) . "," . $this->conn->real_escape_string($retina_In->get_Retina_ID()) . ")"; - if (!$this->conn->real_query($sql)) { + if (! $this->conn->real_query($sql)) { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); return false; @@ -8001,11 +8158,11 @@ class db return true; } -// }}} -// {{{ RMF_CONTROL CLASS FUNCTIONS + // }}} + // {{{ RMF_CONTROL CLASS FUNCTIONS /** * Function to get all the RMF controls that apply to a certain baseline impact
- * Used for tailoring later + * Used for tailoring later * * @param string $baseline * @@ -8014,19 +8171,15 @@ class db public function get_RMF_Control_By_Baseline($baseline) { $ret = []; - if (!in_array($baseline, array("low", "moderate", "high"))) { + if (! in_array($baseline, array( + "low", + "moderate", + "high" + ))) { return []; } - $sql = "SELECT " . - "f.`abbr`,f.`name` AS 'family_name' " . - "c.`control_id`,c.`name` AS 'control_name',c.`pri`,c.`statement`,c.`guidance` " . - "cb.`impact_level` " . - "FROM `rmf`.`controls` c " . - "JOIN `rmf`.`control_baseline` cb ON cb.`control_id`=c.`control_id` " . - "JOIN `rmf`.`family` f ON f.`abbr`=c.`family_id` " . - "WHERE cb.`impact_level`='" . $this->conn->real_escape_string($baseline) . "'" - ; + $sql = "SELECT " . "f.`abbr`,f.`name` AS 'family_name' " . "c.`control_id`,c.`name` AS 'control_name',c.`pri`,c.`statement`,c.`guidance` " . "cb.`impact_level` " . "FROM `rmf`.`controls` c " . "JOIN `rmf`.`control_baseline` cb ON cb.`control_id`=c.`control_id` " . "JOIN `rmf`.`family` f ON f.`abbr`=c.`family_id` " . "WHERE cb.`impact_level`='" . $this->conn->real_escape_string($baseline) . "'"; if ($res = $this->conn->query($sql)) { while ($row = $res->fetch_assoc()) { @@ -8034,7 +8187,7 @@ class db $family->set_Abbr($row['abbr']); $family->set_Name($row['family_name']); - $rmf = new rmf_control(); + $rmf = new rmf_control(); $rmf->family = $family; $rmf->set_Control_ID($row['control_id']); $rmf->set_Name($row['control_name']); @@ -8048,8 +8201,7 @@ class db $ret[] = $rmf; } - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } @@ -8064,17 +8216,13 @@ class db */ public function get_RMF_Related_Controls(rmf_control &$rmf) { - $sql = "SELECT rc.`related_control_id` " . - "FROM `rmf`.`related_controls rc " . - "WHERE rc.`control_id`='" . $this->conn->real_escape_string($rmf->get_Control_ID()) . "'" - ; + $sql = "SELECT rc.`related_control_id` " . "FROM `rmf`.`related_controls rc " . "WHERE rc.`control_id`='" . $this->conn->real_escape_string($rmf->get_Control_ID()) . "'"; if ($res = $this->conn->query($sql)) { while ($row = $res->fetch_assoc()) { $rmf->add_Related_Control($row['related_control_id']); } - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } @@ -8088,14 +8236,7 @@ class db */ public function get_RMF_Enhanced_Controls(rmf_control &$rmf, $baseline = null) { - $sql = "SELECT " . - "ce.`enh_id`,ce.`name`,ce.`desc`,ce.`guidance` " . - "FROM `rmf`.`control_enh` ce " . - "JOIN `rmf`.`enhancement_baseline eb ON eb.`control_id`=ce.`control_id` AND " . - "eb.`enh_id`=ce.`enh_id` " . - "WHERE ce.`control_id`='" . $this->conn->real_escape_string($rmf->get_Control_ID()) . "' AND " . - "eb.`impact`='" . (is_null($baseline) ? $rmf->get_Worst_Baseline() : $baseline) . "'" - ; + $sql = "SELECT " . "ce.`enh_id`,ce.`name`,ce.`desc`,ce.`guidance` " . "FROM `rmf`.`control_enh` ce " . "JOIN `rmf`.`enhancement_baseline eb ON eb.`control_id`=ce.`control_id` AND " . "eb.`enh_id`=ce.`enh_id` " . "WHERE ce.`control_id`='" . $this->conn->real_escape_string($rmf->get_Control_ID()) . "' AND " . "eb.`impact`='" . (is_null($baseline) ? $rmf->get_Worst_Baseline() : $baseline) . "'"; if ($res = $this->conn->query($sql)) { while ($row = $res->fetch_assoc()) { @@ -8107,29 +8248,28 @@ class db $rmf->add_Enhanced_Control($enh); } - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } } -// }}} -// {{{ SCAN CLASS FUNCTIONS + // }}} + // {{{ SCAN CLASS FUNCTIONS /** * Get ScanData for Results page * * @param integer $intSTE - * ST&E ID to grab scans for - * @param integer|string $Scan_ID [optional] - * Scan ID or file name to grab (defaulted null) + * ST&E ID to grab scans for + * @param integer|string $Scan_ID + * [optional] + * Scan ID or file name to grab (defaulted null) * - * @return array:scan|NULL - * Returns array of scans associated with the ST&E, or null if none found + * @return array:scan|NULL Returns array of scans associated with the ST&E, or null if none found */ public function get_ScanData($intSTE, $Scan_ID = null, $status_in = null, $type_in = null) { - $ret = []; + $ret = []; $where = [ [ 'field' => 's.ste_id', @@ -8137,65 +8277,66 @@ class db ] ]; - if (!is_null($Scan_ID)) { + if (! is_null($Scan_ID)) { if (is_numeric($Scan_ID)) { $where[] = [ - 'field' => 's.id', - 'value' => $Scan_ID, + 'field' => 's.id', + 'value' => $Scan_ID, 'sql_op' => 'AND' ]; - } - else { + } else { $where[] = [ - 'field' => 's.file_name', - 'value' => $Scan_ID, + 'field' => 's.file_name', + 'value' => $Scan_ID, 'sql_op' => 'AND' ]; } } - if (!is_null($status_in)) { + if (! is_null($status_in)) { $where[] = [ - 'field' => 's.status', - 'value' => $status_in, + 'field' => 's.status', + 'value' => $status_in, 'sql_op' => 'AND' ]; } - if (!is_null($type_in)) { + if (! is_null($type_in)) { $where[] = [ - 'field' => 'src.name', - 'value' => $type_in, + 'field' => 'src.name', + 'value' => $type_in, 'sql_op' => 'AND' ]; } - $this->help->select("scans s", ['s.*'], $where, [ + $this->help->select("scans s", [ + 's.*' + ], $where, [ 'table_joins' => [ "JOIN sources src ON src.id=s.src_id" ], - 'order' => 's.file_name' + 'order' => 's.file_name' ]); $scan_rows = $this->help->execute(); if (isset($scan_rows['id'])) { - $scan_rows = [0 => $scan_rows]; + $scan_rows = [ + 0 => $scan_rows + ]; } if (is_array($scan_rows) && count($scan_rows)) { foreach ($scan_rows as $row) { $src = $this->get_Sources($row['src_id']); if (is_array($src) && count($src) && isset($src[0]) && is_a($src[0], 'source')) { $src = $src[0]; - } - else { + } else { continue; } $ste = $this->get_STE($intSTE); if (is_array($ste) && count($ste) && isset($ste[0]) && is_a($ste[0], 'ste')) { $ste = $ste[0]; - } - else { + } else { continue; } @@ -8209,23 +8350,31 @@ class db $scan->set_Last_Host($row['last_host']); $scan->set_Total_Host_Count($row['host_count']); - $this->help->select("host_list hl", ['hl.tgt_id', 't.name', 'hl.finding_count', 'hl.scanner_error', 'hl.notes'], [ + $this->help->select("host_list hl", [ + 'hl.tgt_id', + 't.name', + 'hl.finding_count', + 'hl.scanner_error', + 'hl.notes' + ], [ [ 'field' => 'hl.scan_id', 'value' => $row['id'] ] - ], [ + ], [ 'table_joins' => [ "LEFT JOIN target t ON t.id=hl.tgt_id" ] ]); $hl_rows = $this->help->execute(); if (is_array($hl_rows) && count($hl_rows) && isset($hl_rows['tgt_id'])) { - $hl_rows = [0 => $hl_rows]; + $hl_rows = [ + 0 => $hl_rows + ]; } if (is_array($hl_rows) && count($hl_rows) && isset($hl_rows[0])) { foreach ($hl_rows as $row) { - $tgt = new target($row['name']); + $tgt = new target($row['name']); $tgt->set_ID($row['tgt_id']); $tgt->set_STE_ID($intSTE); $tgt->interfaces = $this->get_Interfaces($tgt->get_ID()); @@ -8256,71 +8405,68 @@ class db * Save scan data * * @param scan $new_Scan - * New scan to save to database + * New scan to save to database * - * @return integer - * Returns ID of new scan, or 0 if fail + * @return integer Returns ID of new scan, or 0 if fail */ public function save_Scan($new_Scan) { - if (!is_a($new_Scan, "scan")) { + if (! is_a($new_Scan, "scan")) { return; } - if (!is_a($new_Scan->get_Source(), 'source')) { - throw(new Exception("Wrong source type " . print_r($new_Scan->get_Source(), true))); + if (! is_a($new_Scan->get_Source(), 'source')) { + throw (new Exception("Wrong source type " . print_r($new_Scan->get_Source(), true))); } if ($new_Scan->get_ID()) { $this->help->update("scans", [ - 'src_id' => $new_Scan->get_Source()->get_ID(), - 'itr' => $new_Scan->get_Itr(), - 'file_date' => $new_Scan->get_File_DateTime(), - 'pid' => $new_Scan->get_PID(), - 'start_time' => $new_Scan->get_Start_Time(), + 'src_id' => $new_Scan->get_Source()->get_ID(), + 'itr' => $new_Scan->get_Itr(), + 'file_date' => $new_Scan->get_File_DateTime(), + 'pid' => $new_Scan->get_PID(), + 'start_time' => $new_Scan->get_Start_Time(), 'last_update' => $new_Scan->get_Last_Update(), - 'status' => $new_Scan->get_Status(), - 'perc_comp' => $new_Scan->get_Percentage_Complete(), - 'last_host' => $new_Scan->get_Last_Host(), - 'host_count' => $new_Scan->get_Total_Host_Count(), - 'notes' => $new_Scan->get_Notes() - ], [ + 'status' => $new_Scan->get_Status(), + 'perc_comp' => $new_Scan->get_Percentage_Complete(), + 'last_host' => $new_Scan->get_Last_Host(), + 'host_count' => $new_Scan->get_Total_Host_Count(), + 'notes' => $new_Scan->get_Notes() + ], [ [ 'field' => 'id', 'value' => $new_Scan->get_ID() ] ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); } - - $this->update_Scan_Host_List($new_Scan, $new_Scan->get_Host_List()); - } - else { + } else { $this->help->insert("scans", [ - 'src_id' => $new_Scan->get_Source()->get_ID(), - 'ste_id' => $new_Scan->get_STE()->get_ID(), - 'itr' => $new_Scan->get_Itr(), - 'file_name' => $new_Scan->get_File_Name(), - 'file_date' => $new_Scan->get_File_DateTime(), - 'pid' => $new_Scan->get_PID(), - 'start_time' => $new_Scan->get_Start_Time(), + 'src_id' => $new_Scan->get_Source()->get_ID(), + 'ste_id' => $new_Scan->get_STE()->get_ID(), + 'itr' => $new_Scan->get_Itr(), + 'file_name' => $new_Scan->get_File_Name(), + 'file_date' => $new_Scan->get_File_DateTime(), + 'pid' => $new_Scan->get_PID(), + 'start_time' => $new_Scan->get_Start_Time(), 'last_update' => $new_Scan->get_Last_Update(), - 'status' => $new_Scan->get_Status(), - 'perc_comp' => $new_Scan->get_Percentage_Complete(), - 'last_host' => $new_Scan->get_Last_Host(), - 'host_count' => $new_Scan->get_Total_Host_Count(), - 'notes' => $new_Scan->get_Notes() + 'status' => $new_Scan->get_Status(), + 'perc_comp' => $new_Scan->get_Percentage_Complete(), + 'last_host' => $new_Scan->get_Last_Host(), + 'host_count' => $new_Scan->get_Total_Host_Count(), + 'notes' => $new_Scan->get_Notes() ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return 0; } $new_Scan->set_ID($this->conn->insert_id); - - $this->update_Scan_Host_List($new_Scan, $new_Scan->get_Host_List()); } + + $this->update_Scan_Host_List($new_Scan, $new_Scan->get_Host_List()); + return $new_Scan->get_ID(); } @@ -8328,14 +8474,13 @@ class db * Delete a scan (associated finding data and optionally targets) * * @param integer $ste_id - * ST&E ID where the scan exists + * ST&E ID where the scan exists * @param integer $scan_id - * Scan to delete from database + * Scan to delete from database * @param boolean $del_tgts - * Boolean to decide if we are deleting targets as well + * Boolean to decide if we are deleting targets as well * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function delete_Scan($ste_id, $scan_id, $del_tgts = false) { @@ -8343,23 +8488,24 @@ class db if (is_array($scan) && count($scan) && isset($scan[0]) && is_a($scan[0], 'scan')) { $scan = $scan[0]; - } - elseif (!is_a($scan, 'scan')) { + } elseif (! is_a($scan, 'scan')) { Sagacity_Error::err_handler("Failed to find Scan ($scan_id)", E_ERROR); return false; } - $this->help->delete("finding_controls fc", ['fc.*'], [ + $this->help->delete("finding_controls fc", [ + 'fc.*' + ], [ [ 'field' => 'f.scan_id', - 'op' => '=', + 'op' => '=', 'value' => $scan_id ] - ], [ - "JOIN findings f ON f.id=fc.finding_id" + ], [ + "JOIN findings f ON f.tgt_id = fc.tgt_id AND f.pdi_id = fc.pdi_id" ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -8367,12 +8513,12 @@ class db $this->help->delete("findings", null, [ [ 'field' => 'scan_id', - 'op' => '=', + 'op' => '=', 'value' => $scan_id ] ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -8380,12 +8526,12 @@ class db $this->help->delete("host_list", null, [ [ 'field' => 'scan_id', - 'op' => '=', + 'op' => '=', 'value' => $scan_id ] ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -8393,19 +8539,23 @@ class db $this->help->delete("scans", null, [ [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $scan_id ] ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } if ($del_tgts) { + /** + * + * @var host_list $host + */ foreach ($scan->get_Host_List() as $host) { - $this->delete_Target($host->targetId); + $this->delete_Target($host->getTargetId()); } } @@ -8416,12 +8566,12 @@ class db * Updates the host_list field for a particular scan * * @param scan $scan - * Scan to update - * @param array $host_list [optional] - * Formatted host list to update (default null) + * Scan to update + * @param array $host_list + * [optional] + * Formatted host list to update (default null) * - * @return boolean - * Returns TRUE if successful, otherwise FALSEs + * @return boolean Returns TRUE if successful, otherwise FALSEs */ public function update_Scan_Host_List($scan, $host_list = null) { @@ -8431,7 +8581,7 @@ class db 'value' => $scan->get_ID() ] ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -8446,11 +8596,12 @@ class db $host->getScanError(), $host->getScanNotes() ]; + + $this->update_Target_Counts($host->getTargetId()); } - } - else { + } else { foreach ($host_list as $host) { - if (!is_a($host, 'host_list')) { + if (! is_a($host, 'host_list')) { break; } $params[] = [ @@ -8460,12 +8611,20 @@ class db $host->getScanError(), $host->getScanNotes() ]; + + $this->update_Target_Counts($host->getTargetId()); } } if (count($params)) { - $this->help->extended_insert("host_list", ['scan_id', 'tgt_id', 'finding_count', 'scanner_error', 'notes'], $params); - if (!$this->help->execute()) { + $this->help->extended_insert("host_list", [ + 'scan_id', + 'tgt_id', + 'finding_count', + 'scanner_error', + 'notes' + ], $params); + if (! $this->help->execute()) { $this->help->debug(E_WARNING); } } @@ -8477,39 +8636,41 @@ class db * Get the scan source data * * @param integer|string $srcID - * Source ID or name to grab from database + * Source ID or name to grab from database * - * @return source|NULL - * Returns source, or null if none found + * @return source|NULL Returns source, or null if none found */ public function get_Sources($srcID = null) { $where = []; - $ret = null; + $ret = null; - if (!is_null($srcID)) { + if (! is_null($srcID)) { if (is_numeric($srcID)) { $where[] = [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $srcID ]; - } - else { + } else { $where[] = [ - 'field' => 'name', - 'op' => '=', - 'value' => $srcID, + 'field' => 'name', + 'op' => '=', + 'value' => $srcID, 'case_insensitive' => true ]; } } - $this->help->select("sagacity.sources", null, $where, ['order' => 'name']); + $this->help->select("sagacity.sources", null, $where, [ + 'order' => 'name' + ]); $src_rows = $this->help->execute(); if (is_array($src_rows) && isset($src_rows['id'])) { - $src_rows = [0 => $src_rows]; + $src_rows = [ + 0 => $src_rows + ]; } if (is_array($src_rows) && count($src_rows) && isset($src_rows[0])) { @@ -8536,17 +8697,21 @@ class db if (is_array($cat) && count($cat)) { $cat = $cat[0]; } - if (!is_a($cat, "ste_cat")) { + if (! is_a($cat, "ste_cat")) { return []; } $ret = []; - $this->help->select("sagacity.sources s", ['s.id', 's.name', 's.icon'], [ + $this->help->select("sagacity.sources s", [ + 's.id', + 's.name', + 's.icon' + ], [ [ 'field' => 'cat.id', - 'op' => '=', + 'op' => '=', 'value' => $cat->get_ID() ] - ], [ + ], [ 'table_joins' => [ "JOIN sagacity.ste_cat_sources src ON s.id=src.src_id", "JOIN sagacity.ste_cat cat ON cat.id=src.cat_id" @@ -8555,15 +8720,20 @@ class db $src_arr = $this->help->execute(); if (is_array($src_arr) && count($src_arr) && isset($src_arr['id'])) { - $src_arr = [0 => $src_arr]; + $src_arr = [ + 0 => $src_arr + ]; } if (is_array($src_arr) && count($src_arr) && isset($src_arr[0])) { foreach ($src_arr as $row) { - $src = new source($row['id'], $row['name']); + $src = new source($row['id'], $row['name']); $icon = null; - if ($row['icon']) { - $icon = str_replace(" ", "-", substr($row['icon'], 0, -4)) . "-missing.png"; + $missing_fname = str_replace(" ", "-", substr($row['icon'], 0, - 4)) . "-missing.png"; + if ($row['icon'] && file_exists(DOC_ROOT . "/img/scan_types/{$missing_fname}")) { + $icon = $missing_fname; + } else { + $icon = $row['icon']; } $src->set_Icon($icon); $ret[$src->get_ID()]['src'] = $src; @@ -8583,103 +8753,100 @@ class db */ public function get_Target_Scan_Sources($tgt, &$exp_scan_srcs = null) { - $ret = []; - $this->help->select("sources src", ["src.id", "src.name", "src.icon", "SUM(hl.finding_count) AS 'finding_count'", "hl.scanner_error", "hl.notes"], [ + $ret = (!is_null($exp_scan_srcs) ? $exp_scan_srcs : []); + $this->help->select("sources src", [ + "src.id", + "src.name", + "src.icon", + "hl.scanner_error", + "hl.notes", + "hl.finding_count", + "s.file_name" + ], [ [ 'field' => 'hl.tgt_id', 'value' => $tgt->get_ID() ] - ], [ + ], [ 'table_joins' => [ "LEFT JOIN scans s ON s.src_id=src.id", "LEFT JOIN host_list hl ON hl.scan_id=s.id" - ], - 'group' => 'src.name,src.id' + ] ]); - $rows = $this->help->execute(); - + if (is_array($rows) && count($rows) && isset($rows['id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { - if (is_null($exp_scan_srcs)) { - foreach ($rows as $row) { - $ret[$row['id']]['src'] = new source($row['id'], $row['name']); - $ret[$row['id']]['src']->set_Icon($row['icon']); - $ret[$row['id']]['count'] = $row['finding_count']; - $ret[$row['id']]['scan_error'] = (boolean) $row['scanner_error']; - $ret[$row['id']]['notes'] = $row['notes']; - } - } - else { - foreach ($rows as $row) { - if (isset($exp_scan_srcs[$row['id']])) { - $exp_scan_srcs[$row['id']]['src']->set_Icon($row['icon']); - $exp_scan_srcs[$row['id']]['count'] = $row['finding_count']; - $exp_scan_srcs[$row['id']]['scan_error'] = (boolean) $row['scanner_error']; - $exp_scan_srcs[$row['id']]['notes'] = $row['notes']; - } - else { - $exp_scan_srcs[$row['id']]['src'] = new source($row['id'], $row['name']); - $exp_scan_srcs[$row['id']]['src']->set_Icon($row['icon']); - $exp_scan_srcs[$row['id']]['count'] = $row['finding_count']; - $exp_scan_srcs[$row['id']]['scan_error'] = (boolean) $row['scanner_error']; - $exp_scan_srcs[$row['id']]['notes'] = $row['notes']; - } - } - - return $exp_scan_srcs; + foreach($rows as $row) { + $src = new source($row['id'], $row['name']); + $src->set_Icon($row['icon']); + + $ret[$src->get_ID()]['src'] = $src; + $ret[$src->get_ID()]['count'] = $row['finding_count']; + $ret[$src->get_ID()]['notes'] = $row['notes']; + $ret[$src->get_ID()]['scan_error'] = $row['scanner_error']; + $ret[$src->get_ID()]['file_name'] = $row['file_name']; } } return $ret; } -// }}} -// {{{ SCRIPT FUNCTIONS + // }}} + // {{{ SCRIPT FUNCTIONS /** * Function to get a catalog script * - * @param string $file_name_in [optional] - * Look for a specific catalog/STIG file that is processing + * @param string $file_name_in + * [optional] + * Look for a specific catalog/STIG file that is processing * * @return array:catalog_script|NULL */ public function get_Catalog_Script($file_name_in = null) { - $ret = []; + $ret = []; $where = []; - if (!is_null($file_name_in)) { + if (! is_null($file_name_in)) { $where[] = [ 'field' => 'file_name', - 'op' => '=', + 'op' => '=', 'value' => $file_name_in ]; } - $this->help->select("sagacity.catalog_scripts", null, $where, [ + $this->help->select("sagacity.catalog_scripts cs", ['c.id', 'cs.*'], $where, [ + 'table_joins' => [ + "LEFT JOIN sagacity.checklist c ON c.file_name = cs.file_name" + ], 'order' => "FIELD(`status`, 'ERROR','RUNNING','IN QUEUE','COMPLETE'),`file_name`" ]); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['file_name'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows)) { foreach ($rows as $row) { $script = new catalog_script(); - $script->file_name = $row['file_name']; - $script->pid = $row['pid']; - $script->start_time = new DateTime($row['start_time']); + $script->{'id'} = $row['id']; + $script->file_name = $row['file_name']; + $script->pid = $row['pid']; + $script->start_time = new DateTime($row['start_time']); $script->last_update = new DateTime($row['last_update']); - $script->status = $row['status']; - $script->perc_comp = $row['perc_comp']; - $script->stig_count = $row['stig_count']; + $script->status = $row['status']; + $script->perc_comp = $row['perc_comp']; + $script->stig_count = $row['stig_count']; $ret[] = $script; } @@ -8691,35 +8858,35 @@ class db /** * Function to get script count * - * @param string $status [optional] - * Return only the count for a script that is in a certain status (defaulted null) + * @param string $status + * [optional] + * Return only the count for a script that is in a certain status (defaulted null) * - * @return integer - * Returns the number of script that are in the database or count in a specific status + * @return integer Returns the number of script that are in the database or count in a specific status */ public function get_Catalog_Script_Count($status = null) { $where = []; - if (!is_null($status)) { + if (! is_null($status)) { $where[] = [ 'field' => 'status', - 'op' => '=', + 'op' => '=', 'value' => $status ]; if ($status == 'RUNNING') { $where[] = [ - 'field' => 'perc_comp', - 'op' => '<', - 'value' => 100, - 'sql_op' => 'AND', + 'field' => 'perc_comp', + 'op' => '<', + 'value' => 100, + 'sql_op' => 'AND', 'open-paren' => true ]; $where[] = [ - 'field' => 'perc_comp', - 'op' => IS, - 'value' => null, - 'sql_op' => 'OR', + 'field' => 'perc_comp', + 'op' => IS, + 'value' => null, + 'sql_op' => 'OR', 'close-paren' => true ]; } @@ -8738,16 +8905,17 @@ class db * Function to add new catalog parsing script * * @param string $file_name_in - * The catalog/STIG file that is processing + * The catalog/STIG file that is processing * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function add_Catalog_Script($file_name_in) { - $this->help->insert("sagacity.catalog_scripts", ['file_name' => $file_name_in], true); + $this->help->insert("sagacity.catalog_scripts", [ + 'file_name' => $file_name_in + ], true); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -8759,21 +8927,20 @@ class db * Function to update catalog script execution * * @param string $file - * Script to update + * Script to update * @param array $field - * Array with the name and value of the column to update - * 'name' => 'pid', - * 'value' => 1234 + * Array with the name and value of the column to update + * 'name' => 'pid', + * 'value' => 1234 * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function update_Catalog_Script($file, $field) { $where = array( array( 'field' => 'file_name', - 'op' => '=', + 'op' => '=', 'value' => $file ) ); @@ -8781,26 +8948,24 @@ class db if ($field['name'] == 'perc_comp' && $field['value'] == 100 && isset($field['complete'])) { $this->help->update("sagacity.catalog_scripts", array( $field['name'] => $field['value'], - 'status' => 'COMPLETE', - 'last_update' => 'NOW()' - ), $where); - } - elseif ($field['name'] == 'pid') { + 'status' => 'COMPLETE', + 'last_update' => 'NOW()' + ), $where); + } elseif ($field['name'] == 'pid') { $this->help->update("sagacity.catalog_scripts", array( $field['name'] => $field['value'], - 'status' => 'RUNNING', - 'start_time' => 'NOW()', - 'last_update' => 'NOW()' - ), $where); - } - else { + 'status' => 'RUNNING', + 'start_time' => 'NOW()', + 'last_update' => 'NOW()' + ), $where); + } else { $this->help->update('sagacity.catalog_scripts', array( $field['name'] => $field['value'], - 'last_update' => 'NOW()' - ), $where); + 'last_update' => 'NOW()' + ), $where); } - if (!$this->help->execute()) { + if (! $this->help->execute()) { return false; } @@ -8811,23 +8976,22 @@ class db * Function to get the number of scripts that are currently running * * @param integer $ste - * ST&E to evaluate + * ST&E to evaluate * - * @return integer - * Returns the count of scripts that are running + * @return integer Returns the count of scripts that are running */ public function get_Running_Script_Count($ste) { $this->help->select_count("scans", [ [ 'field' => 'status', - 'op' => '=', + 'op' => '=', 'value' => 'RUNNING' ], [ - 'field' => 'ste_id', - 'op' => '=', - 'value' => $ste, + 'field' => 'ste_id', + 'op' => '=', + 'value' => $ste, 'sql_op' => 'AND' ] ]); @@ -8845,16 +9009,19 @@ class db */ public function get_Running_Script_Status($ste_id, $file) { - $this->help->select("sagacity.scans", ['status', 'perc_comp'], [ + $this->help->select("sagacity.scans", [ + 'status', + 'perc_comp' + ], [ [ 'field' => 'ste_id', - 'op' => '=', + 'op' => '=', 'value' => $ste_id ], [ - 'field' => 'file_name', - 'op' => '=', - 'value' => $file, + 'field' => 'file_name', + 'op' => '=', + 'value' => $file, 'sql_op' => 'AND' ] ]); @@ -8866,14 +9033,13 @@ class db * Add a new script to the database * * @param string $file - * Result file name + * Result file name * @param integer $ste_id - * The STE ID that the script is being added to + * The STE ID that the script is being added to * @param string $type - * The result type + * The result type * - * @return boolean - * Return TRUE if successful, otherwise FALSE + * @return boolean Return TRUE if successful, otherwise FALSE */ public function add_Running_Script($file, $ste_id, $type, $location) { @@ -8883,44 +9049,42 @@ class db $scan = $existing_scan[0]; $this->help->update("scans", [ - 'start_time' => 'NOW()', + 'start_time' => 'NOW()', 'last_update' => 'NOW()', - 'perc_comp' => 0.0 - ], [ + 'perc_comp' => 0.0 + ], [ [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $scan->get_ID() ] ]); - } - else { + } else { $type = str_replace("_", " ", $type); - $src = $this->get_Sources($type); + $src = $this->get_Sources($type); if (is_array($src) && count($src) && is_a($src[0], 'source')) { $src = $src[0]; - } - else { + } else { return false; } $fd = date("Y-m-d", filemtime(TMP . "/" . $file)); $this->help->insert("sagacity.scans", [ - 'ste_id' => $ste_id, - 'src_id' => $src->get_ID(), - 'file_name' => $file, - 'file_date' => $fd, - 'start_time' => 'NOW()', + 'ste_id' => $ste_id, + 'src_id' => $src->get_ID(), + 'file_name' => $file, + 'file_date' => $fd, + 'start_time' => 'NOW()', 'last_update' => 'NOW()', - 'status' => 'IN QUEUE', - 'perc_comp' => 0.0, - 'location' => $location - ], true); + 'status' => 'IN QUEUE', + 'perc_comp' => 0.0, + 'location' => $location + ], true); } - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } @@ -8932,19 +9096,18 @@ class db * Function to update a running script entry to add the process ID * * @param string $file - * The result file to update + * The result file to update * @param array $field - * Associative array (name,value) to know what field to update + * Associative array (name,value) to know what field to update * - * @return boolean - * Returns TRUE if successful, otherwise FALSE + * @return boolean Returns TRUE if successful, otherwise FALSE */ public function update_Running_Scan($file, $field) { $where = [ [ 'field' => 'file_name', - 'op' => '=', + 'op' => '=', 'value' => $file ] ]; @@ -8952,79 +9115,79 @@ class db if ($field['name'] == 'perc_comp' && $field['value'] == 100 && isset($field['complete'])) { $this->help->update("sagacity.scans", [ $field['name'] => $field['value'], - 'status' => 'COMPLETE', - 'last_update' => 'NOW()' - ], $where); - } - elseif ($field['name'] == 'pid') { + 'status' => 'COMPLETE', + 'last_update' => 'NOW()' + ], $where); + } elseif ($field['name'] == 'pid') { $this->help->update("sagacity.scans", [ $field['name'] => $field['value'], - 'status' => 'RUNNING', - 'start_time' => 'NOW()', - 'last_update' => 'NOW()', - 'host_count' => 0 - ], $where); - } - elseif ($field['name'] == 'last_host') { + 'status' => 'RUNNING', + 'start_time' => 'NOW()', + 'last_update' => 'NOW()', + 'host_count' => 0 + ], $where); + } elseif ($field['name'] == 'last_host') { $this->help->update("sagacity.scans s", [ "s.{$field['name']}" => $field['value'], - 's.last_update' => 'NOW()', - 's.hosts_comp' => "s.`hosts_comp`+1" - ], $where); - } - else { + 's.last_update' => 'NOW()', + 's.hosts_comp' => "s.`hosts_comp`+1" + ], $where); + } else { $this->help->update("sagacity.scans", [ $field['name'] => $field['value'], - 'last_update' => 'NOW()' - ], $where); + 'last_update' => 'NOW()' + ], $where); } - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_WARNING); return false; } return true; } -// }}} -// {{{ SITE CLASS FUNCTIONS + // }}} + // {{{ SITE CLASS FUNCTIONS /** * Get site data * - * @param integer $siteID [optional] - * Site ID to get from database + * @param integer $siteID + * [optional] + * Site ID to get from database * - * @return array:site - * Returns array of sites, or empty array if none found + * @return array:site Returns array of sites, or empty array if none found */ public function get_Site($siteID = null) { $where = []; $sites = []; - if (!is_null($siteID)) { + if (! is_null($siteID)) { if (is_numeric($siteID)) { $where[] = [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $siteID ]; - } - else { + } else { $where = [ 'field' => 'name', - 'op' => '=', + 'op' => '=', 'value' => $siteID ]; } } - $this->help->select("sites", null, $where, ['order' => 'name']); + $this->help->select("sites", null, $where, [ + 'order' => 'name' + ]); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -9040,20 +9203,21 @@ class db * Get a site for an ST&E * * @param integer $intSTE - * ID of the STE to isolate + * ID of the STE to isolate * - * @return site|NULL - * Returns array of sites associated with a specific ST&E, or null if none found + * @return site|NULL Returns array of sites associated with a specific ST&E, or null if none found */ public function get_Site_By_STE_ID($intSTE) { - $this->help->select("sites s", ['s.*'], [ + $this->help->select("sites s", [ + 's.*' + ], [ [ 'field' => 'ste.id', - 'op' => '=', + 'op' => '=', 'value' => $intSTE ] - ], [ + ], [ 'table_joins' => [ "LEFT JOIN ste ON ste.site_id = s.id" ] @@ -9073,53 +9237,51 @@ class db * Update or insert a site * * @param site $site_In - * Site to save to the database + * Site to save to the database * - * @return boolean|NULL - * Returns TRUE if successful, otherwise FALSE + * @return boolean|NULL Returns TRUE if successful, otherwise FALSE */ public function save_Site(site $site_In) { if ($site_In->get_Id()) { $this->help->update("sites", [ - 'name' => $site_In->get_Name(), - 'address' => $site_In->get_Address(), - 'city' => $site_In->get_City(), - 'state' => $site_In->get_State(), - 'zip' => $site_In->get_Zip(), - 'country' => $site_In->get_Country(), - 'poc_name' => $site_In->get_POC_Name(), + 'name' => $site_In->get_Name(), + 'address' => $site_In->get_Address(), + 'city' => $site_In->get_City(), + 'state' => $site_In->get_State(), + 'zip' => $site_In->get_Zip(), + 'country' => $site_In->get_Country(), + 'poc_name' => $site_In->get_POC_Name(), 'poc_email' => $site_In->get_POC_Email(), 'poc_phone' => $site_In->get_POC_Phone() - ], [ + ], [ [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $site_In->get_Id() ] ]); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_ERROR); return false; } return $site_In->get_Id(); - } - else { + } else { $this->help->insert("sites", [ - 'name' => $site_In->get_Name(), - 'address' => $site_In->get_Address(), - 'city' => $site_In->get_City(), - 'state' => $site_In->get_State(), - 'zip' => $site_In->get_Zip(), - 'country' => $site_In->get_Country(), - 'poc_name' => $site_In->get_POC_Name(), + 'name' => $site_In->get_Name(), + 'address' => $site_In->get_Address(), + 'city' => $site_In->get_City(), + 'state' => $site_In->get_State(), + 'zip' => $site_In->get_Zip(), + 'country' => $site_In->get_Country(), + 'poc_name' => $site_In->get_POC_Name(), 'poc_email' => $site_In->get_POC_Email(), 'poc_phone' => $site_In->get_POC_Phone() - ], true); + ], true); - if (!($site_id = $this->help->execute())) { + if (! ($site_id = $this->help->execute())) { $this->help->debug(E_ERROR); return false; } @@ -9130,65 +9292,66 @@ class db return true; } -// }}} -// {{{ SOFTWARE CLASS FUNCTIONS + // }}} + // {{{ SOFTWARE CLASS FUNCTIONS /** * Get software data * * @param integer|string|software $software_In - * Specific ID, array of software objects, or associative array to use (default null) - * @param boolean $exact_match [optional] - * Perform an exact match on a CPE (default false) + * Specific ID, array of software objects, or associative array to use (default null) + * @param boolean $exact_match + * [optional] + * Perform an exact match on a CPE (default false) * - * @return array:software - * Returns array of matching software, or empty array if none found + * @return array:software Returns array of matching software, or empty array if none found */ public function get_Software($software_In, $exact_match = false) { - $ret = []; - $cpe = null; - $sw = null; + $ret = []; + $cpe = null; + $sw = null; $query = false; if (is_array($software_In)) { if (isset($software_In[0]) && is_a($software_In[0], 'software')) { $cpe = $software_In[0]->get_CPE(); - } - elseif (isset($software_In[0]) && isset($software_In[0]['man'])) { + } elseif (isset($software_In[0]) && isset($software_In[0]['man'])) { $software_In = $software_In[0]; $type = (isset($software_In['type']) && $software_In['type'] ? "o" : "a"); - $ver = (isset($software_In['ver']) && $software_In['ver'] ? $software_In['ver'] : "-"); - $cpe = strtolower( - str_replace( - array(" ", "(", ")"), array("_", "%28", "%29"), "cpe:/{$type}:{$software_In['man']}:{$software_In['name']}:{$ver}" - ) - ); + $ver = (isset($software_In['ver']) && $software_In['ver'] ? $software_In['ver'] : "-"); + $cpe = strtolower(str_replace(array( + " ", + "(", + ")" + ), array( + "_", + "%28", + "%29" + ), "cpe:/{$type}:{$software_In['man']}:{$software_In['name']}:{$ver}")); } if ($cpe) { $this->help->select("sagacity.software", null, array( array( 'field' => 'cpe', - 'op' => LIKE, + 'op' => LIKE, 'value' => "'%$cpe%'" ) )); $query = true; } - } - elseif (is_numeric($software_In)) { + } elseif (is_numeric($software_In)) { $this->help->select("sagacity.software", null, array( array( 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $software_In ) )); $query = true; - } - elseif (is_string($software_In)) { - $op = $exact_match ? '=' : LIKE; + } elseif (is_string($software_In)) { + $op = $exact_match ? '=' : LIKE; $field = 'cpe'; if (strpos($software_In, "cpe:2.3") !== false) { $field = 'cpe23'; @@ -9196,11 +9359,11 @@ class db $exclude_r2 = null; if (preg_match("/windows_server_20[\d]+/", $software_In)) { - if (!preg_match("/r2/", $software_In)) { + if (! preg_match("/r2/", $software_In)) { $exclude_r2 = array( - 'field' => $field, - 'op' => NOT_LIKE, - 'value' => "'%r2%'", + 'field' => $field, + 'op' => NOT_LIKE, + 'value' => "'%r2%'", 'sql_op' => 'AND' ); } @@ -9209,22 +9372,24 @@ class db $this->help->select("software", null, [ [ 'field' => $field, - 'op' => $op, + 'op' => $op, 'value' => ($op == LIKE ? "'$software_In%'" : $software_In) - ], $exclude_r2], ['order' => 'cpe'] - ); + ], + $exclude_r2 + ], [ + 'order' => 'cpe' + ]); $query = true; - } - elseif (is_a($software_In, 'software')) { - $os = ($software_In->is_OS() ? "/o" : "/a"); - $man = str_replace(" ", "_", strtolower($software_In->get_Man())); - $name = str_replace(" ", "_", strtolower($software_In->get_Name())); - $ver = str_replace(" ", "_", strtolower($software_In->get_Version())); + } elseif (is_a($software_In, 'software')) { + $os = ($software_In->is_OS() ? "/o" : "/a"); + $man = str_replace(" ", "_", strtolower($software_In->get_Man())); + $name = str_replace(" ", "_", strtolower($software_In->get_Name())); + $ver = str_replace(" ", "_", strtolower($software_In->get_Version())); $value = "'cpe:{$os}:{$man}:{$name}:{$ver}:%'"; $field = 'cpe'; - if (!is_null($software_In->get_CPE23())) { - $os = substr($os, 1); + if (! is_null($software_In->get_CPE23())) { + $os = substr($os, 1); $value = "'cpe:2.3:{$os}:{$man}:{$name}:{$ver}:%'"; $field = 'cpe23'; } @@ -9232,18 +9397,21 @@ class db $this->help->select("software", null, [ [ 'field' => $field, - 'op' => LIKE, + 'op' => LIKE, 'value' => $value ] - ], ['order' => 'cpe'] - ); + ], [ + 'order' => 'cpe' + ]); $query = true; } if ($query) { $rows = $this->help->execute(); if (isset($rows['cpe'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -9260,15 +9428,45 @@ class db return $ret; } + + /** + * Function to retrieve a software item by using the software string + * + * @param string $sw_string + * + * @return software|NULL + */ + public function get_Software_By_String($sw_string) + { + $ret = null; + $this->help->select("software", null, [ + [ + 'field' => 'sw_string', + 'op' => '=', + 'value' => $sw_string + ] + ], [ + 'limit' => 1 + ]); + $row = $this->help->execute(); + + if(is_array($row) && count($row) && isset($row['id'])) { + $ret = new software($row['cpe'], $row['cpe23']); + $ret->set_ID($row['id']); + $ret->set_SW_String($row['sw_string']); + $ret->set_Shortened_SW_String($row['short_sw_string']); + } + + return $ret; + } /** * Function to retrieve a software item by using the CPE or CPE v2.3 * * @param string $cpe_in - * CPE to search for + * CPE to search for * - * @return software|NULL - * Returns software object if found, otherwise null + * @return software|NULL Returns software object if found, otherwise null */ public function get_Software_By_CPE($cpe_in) { @@ -9280,14 +9478,16 @@ class db $this->help->select("software", null, [ [ 'field' => $field, - 'op' => '=', + 'op' => '=', 'value' => $cpe_in ] ]); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -9310,18 +9510,22 @@ class db */ public function get_Software_Ids(array $cpes = []) { - $ret = []; - $this->help->select("software", ['id'], [ + $ret = []; + $this->help->select("software", [ + 'id' + ], [ [ 'field' => 'cpe', - 'op' => IN, + 'op' => IN, 'value' => $cpes ] ]); $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -9333,36 +9537,32 @@ class db return $ret; } -// @TODO - Finish + // @TODO - Finish /** * Get a list of all software items * * @param boolean $isOS - * Boolean to isolate the operating systems + * Boolean to isolate the operating systems * @param integer $os_ID - * ID of a specific software, used to select an element in the drop-down + * ID of a specific software, used to select an element in the drop-down * - * @return string - * Returns a string with the drop-down option tags + * @return string Returns a string with the drop-down option tags */ public function get_Software_List($isOS, $os_ID = null) { $ret = ''; - $sql = "SELECT `id`,`cpe`,`cpe23`,`sw_string` " . - "FROM `sagacity`.`software`"; + $sql = "SELECT `id`,`cpe`,`cpe23`,`sw_string` " . "FROM `sagacity`.`software`"; - if (!is_null($os_ID)) { + if (! is_null($os_ID)) { $sql .= " WHERE `id`=" . $os_ID; - } - elseif ($isOS) { + } elseif ($isOS) { $sql .= " WHERE `cpe23` LIKE '%:o:%'"; - } - elseif (!$isOS) { + } elseif (! $isOS) { $sql .= " WHERE `cpe23` LIKE '%:a:%'"; } -// set up query to split cpe string then group by man and name -//$sql .= " GROUP BY "; + // set up query to split cpe string then group by man and name + // $sql .= " GROUP BY "; if ($res = $this->conn->query($sql)) { while ($row = $res->fetch_assoc()) { @@ -9372,10 +9572,9 @@ class db if ($os_ID == $row['id']) { $ret .= " selected "; } - $ret .= ">" . $sw->man . " " . $sw->name . " " . $sw->ver . (!empty($sw->sp) ? "(" . $sw->sp . ")" : "") . ""; + $ret .= ">" . $sw->man . " " . $sw->name . " " . $sw->ver . (! empty($sw->sp) ? "(" . $sw->sp . ")" : "") . ""; } - } - else { + } else { Sagacity_Error::sql_handler($sql); error_log($this->conn->error); } @@ -9387,31 +9586,34 @@ class db * Get array of software that a target has installed * * @param integer $tgt_id - * Target ID to query for + * Target ID to query for * - * @return array:software|NULL - * Returns array of software that are assigned to associated target, or null if none found + * @return array:software|NULL Returns array of software that are assigned to associated target, or null if none found */ public function get_Target_Software($tgt_id) { - $this->help->select("software s", ['s.*'], [ + $this->help->select("software s", [ + 's.*' + ], [ [ 'field' => 'ts.tgt_id', - 'op' => '=', + 'op' => '=', 'value' => $tgt_id ] - ], [ + ], [ 'table_joins' => [ "LEFT JOIN sagacity.target_software ts ON ts.sft_id=s.id" ] ]); $sw_arr = $this->help->execute(); - $sft = []; + $sft = []; if (is_array($sw_arr) && count($sw_arr)) { if (isset($sw_arr['cpe'])) { - $sw_arr = [0 => $sw_arr]; + $sw_arr = [ + 0 => $sw_arr + ]; } foreach ($sw_arr as $row) { @@ -9431,43 +9633,41 @@ class db * Update existing software or add new * * @param software $sw_in - * The software to save + * The software to save * - * @return integer - * Returns the ID of the software that was just inserted or updated if successful, otherwise it returns 0 + * @return integer Returns the ID of the software that was just inserted or updated if successful, otherwise it returns 0 */ public function save_Software($sw_in) { - if (!is_null($sw_in->get_ID())) { + if (! is_null($sw_in->get_ID())) { $this->help->update("sagacity.software", array( - 'cpe' => $sw_in->get_CPE(), - 'cpe23' => $sw_in->get_CPE23(), - 'sw_string' => $sw_in->get_SW_String(), + 'cpe' => $sw_in->get_CPE(), + 'cpe23' => $sw_in->get_CPE23(), + 'sw_string' => $sw_in->get_SW_String(), 'short_sw_string' => $sw_in->get_Shortened_SW_String() - ), array( + ), array( array( 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $sw_in->get_ID() ) )); - if (!$this->help->execute()) { + if (! $this->help->execute()) { $this->help->debug(E_WARNING); return 0; } return $sw_in->get_ID(); - } - else { + } else { $this->help->insert("sagacity.software", array( - 'cpe' => $sw_in->get_CPE(), - 'cpe23' => $sw_in->get_CPE23(), - 'sw_string' => $sw_in->get_SW_String(), + 'cpe' => $sw_in->get_CPE(), + 'cpe23' => $sw_in->get_CPE23(), + 'sw_string' => $sw_in->get_SW_String(), 'short_sw_string' => $sw_in->get_Shortened_SW_String() - ), true); + ), true); - if (!($sw_id = $this->help->execute())) { + if (! ($sw_id = $this->help->execute())) { $this->help->debug(E_WARNING); return 0; } @@ -9487,26 +9687,25 @@ class db */ public function get_Regex_Array($type) { - $ret = []; + $ret = []; $where = []; if ($type != 'os') { $where[] = [ 'field' => 'type', - 'op' => '=', + 'op' => '=', 'value' => $type ]; $where[] = [ - 'field' => 'type', - 'op' => '=', - 'value' => 'multiple', + 'field' => 'type', + 'op' => '=', + 'value' => 'multiple', 'sql_op' => 'OR' ]; - } - else { + } else { $where[] = [ 'field' => 'type', - 'op' => LIKE, + 'op' => LIKE, 'value' => "'%os'" ]; } @@ -9515,43 +9714,47 @@ class db $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['id'])) { - $rows = [0 => $rows]; + $rows = [ + 0 => $rows + ]; } if (is_array($rows) && count($rows) && isset($rows[0])) { foreach ($rows as $row) { $tmp = [ - 'id' => $row['id'], - 'man' => $row['man'], - 'rgx' => $row['rgx'], + 'id' => $row['id'], + 'man' => $row['man'], + 'rgx' => $row['rgx'], 'name' => [] ]; $this->help->select("sagacity.sw_name_match", null, [ [ 'field' => 'man_id', - 'op' => '=', + 'op' => '=', 'value' => $row['id'] ] ]); $name_rows = $this->help->execute(); if (is_array($name_rows) && count($name_rows) && isset($name_rows['id'])) { - $name_rows = [0 => $name_rows]; + $name_rows = [ + 0 => $name_rows + ]; } if (is_array($name_rows) && count($name_rows) && isset($name_rows[0])) { foreach ($name_rows as $row2) { $tmp['name'][$row2['id']] = array( - 'name' => $row2['name'], + 'name' => $row2['name'], 'man_override' => $row2['man_override'], - 'rgx' => $row2['rgx'], - 'name_match' => $row2['name_match'], - 'ver_match' => $row2['ver_match'], - 'ver' => $row2['ver'], + 'rgx' => $row2['rgx'], + 'name_match' => $row2['name_match'], + 'ver_match' => $row2['ver_match'], + 'ver' => $row2['ver'], 'update_match' => $row2['update_match'], - 'is_os' => ($row2['is_os'] ? true : false), - 'multiple' => ($row2['multiple'] ? true : false) + 'is_os' => ($row2['is_os'] ? true : false), + 'multiple' => ($row2['multiple'] ? true : false) ); } } @@ -9563,42 +9766,44 @@ class db return $ret; } -// }}} -// {{{ STE CLASS FUNCTIONS + // }}} + // {{{ STE CLASS FUNCTIONS /** * Get ST&E data * * @param integer $steID - * ST&E ID to isolate + * ST&E ID to isolate * - * @return array:ste|NULL - * Returns array of ste objects, or null if none found + * @return array:ste|NULL Returns array of ste objects, or null if none found */ public function get_STE($steID = null) { $where = []; - $ret = null; + $ret = null; if ($steID != null) { $where[] = [ 'field' => 'id', - 'op' => '=', + 'op' => '=', 'value' => $steID ]; - } - else { + } else { $where[] = [ 'field' => 'primary', - 'op' => '=', + 'op' => '=', 'value' => 0 ]; } - $this->help->select("ste", null, $where, ['order' => 'eval_start DESC']); + $this->help->select("ste", null, $where, [ + 'order' => 'eval_start DESC' + ]); $ste_rows = $this->help->execute(); if (isset($ste_rows['id'])) { - $ste_rows = [0 => $ste_rows]; + $ste_rows = [ + 0 => $ste_rows + ]; } if (is_array($ste_rows) && count($ste_rows) && isset($ste_rows[0])) { @@ -9606,16 +9811,15 @@ class db $sys = $this->get_System($row['system_id']); if (is_array($sys) && count($sys) && isset($sys[0]) && is_a($sys[0], 'system')) { $sys = $sys[0]; - } - else { + } else { Sagacity_Error::err_handler("Unable to find system for ST&E ID {$row['id']}", E_ERROR); } $site = $this->get_Site($row['site_id']); if (is_array($site) && count($site) && isset($site[0]) && is_a($site[0], 'site')) { $site = $site[0]; - } - else { - Sagacity_Error:err_handler("Unable to find site for ST&E ID {$row['id']}", E_ERROR); + } else { + Sagacity_Error: + err_handler("Unable to find site for ST&E ID {$row['id']}", E_ERROR); } $ste = new ste($row['id'], $sys, $site, $row['eval_start'], $row['eval_end'], $row['multiple'], $row['primary']); @@ -9629,29 +9833,34 @@ class db $ste->set_Status($row['risk_status']); $ste->set_AO($row['ao']); - $this->help->select("people p", ['st.pos', 'p.*'], [ + $this->help->select("people p", [ + 'st.pos', + 'p.*' + ], [ [ 'field' => 'st.ste_id', - 'op' => '=', + 'op' => '=', 'value' => $ste->get_ID() ] - ], [ + ], [ 'table_joins' => [ "JOIN ste_team st ON st.people_id=p.id" ] ]); $people_rows = $this->help->execute(); if (is_array($people_rows) && isset($people_rows['id'])) { - $people_rows = [0 => $people_rows]; + $people_rows = [ + 0 => $people_rows + ]; } if (is_array($people_rows) && count($people_rows) && isset($people_rows[0])) { foreach ($people_rows as $row2) { - $people = new people(); - $people->id = $row2['id']; - $people->org = $row2['org']; - $people->name = $row2['name']; - $people->phone = $row2['phone']; + $people = new people(); + $people->id = $row2['id']; + $people->org = $row2['org']; + $people->name = $row2['name']; + $people->phone = $row2['phone']; $people->position = $row2['pos']; $ste->add_STE_Team_Member($people); @@ -9669,17 +9878,16 @@ class db * Get the subsystems for a particular site * * @param ste $ste_in - * ST&E to get subsystems for + * ST&E to get subsystems for * - * @return array:ste - * Returns the subsystem ST&E, or empty array if none found + * @return array:ste Returns the subsystem ST&E, or empty array if none found */ public function get_Subsystems($ste_in) { $this->help->select("sagacity.ste", null, array( array( 'field' => 'primary', - 'op' => '=', + 'op' => '=', 'value' => $ste_in->get_ID() ) )); @@ -9687,7 +9895,9 @@ class db $rows = $this->help->execute(); if (is_array($rows) && count($rows) && isset($rows['id'])) { - $rows = array(0 => $rows); + $rows = array( + 0 => $rows + ); } if (is_array($rows) && count($rows) && isset($rows[0])) { @@ -9701,21 +9911,23 @@ class db /** * This function returns ST&E list and creates options for a select box - * Will organize into optgroup tags if subsystems are found + * Will organize into optgroup tags if subsystems are found * - * @param boolean $select_first [optional] - * Force the selection of the first element in the drop-down + * @param boolean $select_first + * [optional] + * Force the selection of the first element in the drop-down * - * @return string|NULL - * Returns a string of option tag elements, or null if none found + * @return string|NULL Returns a string of option tag elements, or null if none found */ public function get_STE_List($select_first = false) { - $ret = ''; + $ret = ''; $stes = $this->get_STE(); if (is_array($stes) && count($stes) && isset($stes['id'])) { - $stes = [0 => $stes]; + $stes = [ + 0 => $stes + ]; } if (is_array($stes) && count($stes) && isset($stes[0])) { @@ -9725,11 +9937,10 @@ class db $subs = $this->get_Subsystems($ste); if (is_array($subs) && count($subs) > 0) { - $ret .= "" . - ""; - } - else { + } else { $ret .= "