/ app / Http / Livewire / Jsons / VAView.php
VAView.php
  1  <?php
  2  
  3  namespace App\Http\Livewire\Jsons;
  4  
  5  use App\Models\Json;
  6  use App\Models\JsonDraft;
  7  use Illuminate\Support\Collection;
  8  use Livewire\Component;
  9  use Livewire\WithPagination;
 10  
 11  class VAView extends BaseJsonView
 12  {
 13      public $isChanged = false;
 14      public $modal;
 15      public $vulnerabilities;
 16      public $vulnerabilityData;
 17      public string $sourceSelected;
 18  
 19      public function getVulnerabilitiesAnalysisProperty()
 20      {
 21          $vulnerabilitiesAnalysis = collect($this->json->json['vulnerabilityAnalysis']);
 22          return $this->getPaginate($vulnerabilitiesAnalysis, 'vulnerabilityAnalysis');
 23      }
 24  
 25      public function getVulnerabilities($vulnerabilityAnalysis)
 26      {
 27          $this->sourceSelected = $vulnerabilityAnalysis['source'];
 28          $this->isChanged = true;
 29          $this->vulnerabilities = collect($vulnerabilityAnalysis['vulnerabilities']);
 30          return $this->vulnerabilities;
 31      }
 32  
 33      public function showModal($vulnerability)
 34      {
 35          $this->modal = true;
 36          $this->vulnerabilityData = $this->getData($vulnerability);
 37      }
 38  
 39      public function goToBack()
 40      {
 41          $this->isChanged = false;
 42      }
 43  
 44      public function getData($vulnerability)
 45      {
 46          return $this->isDiffing ?
 47              [
 48                  'name' => $vulnerability['name'],
 49                  'description' => $vulnerability['description'],
 50                  'sfrs' => $vulnerability['sfrs'],
 51                  'factors' => $vulnerability['attackPotential']['factors'],
 52                  'results' => $vulnerability['attackPotential']['results'],
 53              ] : [
 54                  'name' => $vulnerability['name'],
 55                  'description' => $vulnerability['description'],
 56                  'sfrs' => $vulnerability['sfrs'],
 57                  'factors' => $vulnerability['attackPotential']['factors'],
 58                  'results' => $vulnerability['attackPotential']['results'],
 59              ];
 60      }
 61  
 62      public function getMethodology(Json|JsonDraft $json)
 63      {
 64          return $json->json['methodology'];
 65      }
 66  
 67      public function getSuggestions(Json|JsonDraft $json)
 68      {
 69          return $json->json['suggestions'];
 70      }
 71  
 72      public function getApproach(Json|JsonDraft $json)
 73      {
 74          return $json->json['approach'];
 75      }
 76  
 77      public function diffedVulnerabilities()
 78      {
 79          $oldsVulnerabilityAnalysis  = collect($this->oldJson->json['vulnerabilityAnalysis']);
 80          $newsVulnerabilityAnalysis = collect($this->json->json['vulnerabilityAnalysis']);
 81          $result = [];
 82          $used = [];
 83  
 84          foreach ($newsVulnerabilityAnalysis as $newVulnerabilityAnalysis) {
 85              $vulnerabilities = collect($newVulnerabilityAnalysis['vulnerabilities']);
 86              $vulnerabilityResult = [];
 87              $used[$newVulnerabilityAnalysis['source']] = [];
 88  
 89              foreach ($vulnerabilities as $key => $vulnerability) {
 90                  $used[$newVulnerabilityAnalysis['source']][] = $vulnerability['name'];
 91                  $aux = collect(
 92                      $oldsVulnerabilityAnalysis
 93                          ->where('source', $newVulnerabilityAnalysis['source'])
 94                          ->first()['vulnerabilities'] ?? []
 95                  )->values()->get($key);
 96  
 97                  $vulnerabilityResult = [
 98                      "name" => $this->applyDiff($vulnerability['name'] ?? '', $aux['name'] ?? ''),
 99                      "briefDescription" => $this->applyDiff($vulnerability['briefDescription'] ?? '', $aux['briefDescription'] ?? ''),
100                      "preconditions" => $this->applyDiff($vulnerability['preconditions'] ?? '', $aux['preconditions'] ?? ''),
101                      "category" => $this->applyDiff($vulnerability['category'] ?? '', $aux['category'] ?? ''),
102                      "evaluator" => $this->applyDiff($vulnerability['evaluator'] ?? '', $aux['evaluator'] ?? ''),
103                      'sfrs' => $this->applyDiff(implode(', ', $vulnerability['sfrs'] ?? []), implode(', ', $aux['sfrs'] ?? [])),
104                  ];
105              }
106  
107              if (!empty($vulnerabilityResult)) {
108                  $result[$newVulnerabilityAnalysis['source']][] = $vulnerabilityResult;
109              }
110          }
111  
112          foreach ($oldsVulnerabilityAnalysis->whereNotIn('source', array_keys($used)) as $oldVulnerabilityAnalysis) {
113              $vulnerabilities = collect($oldVulnerabilityAnalysis['vulnerabilities']);
114              $vulnerabilityResult = [];
115  
116              foreach ($vulnerabilities as $vulnerability) {
117                  $vulnerabilityResult = [
118                      "name" => $this->applyDiff('', $vulnerability['name'] ?? ''),
119                      "briefDescription" => $this->applyDiff('', $vulnerability['briefDescription'] ?? ''),
120                      "preconditions" => $this->applyDiff('', $vulnerability['preconditions'] ?? ''),
121                      "category" => $this->applyDiff('', $vulnerability['category'] ?? ''),
122                      "evaluator" => $this->applyDiff('', $vulnerability['evaluator'] ?? ''),
123                      'sfrs' => $this->applyDiff('', implode(', ', $vulnerability['sfrs'] ?? [])),
124                  ];
125              }
126  
127              if (!empty($vulnerabilityResult)) {
128                  $result[$oldVulnerabilityAnalysis['source']][] = $vulnerabilityResult;
129              }
130          }
131  
132          foreach ($oldsVulnerabilityAnalysis->whereIn('source', array_keys($used)) as $oldVulnerabilityAnalysis) {
133              $vulnerabilities = collect($oldVulnerabilityAnalysis['vulnerabilities']);
134              $vulnerabilityResult = [];
135  
136              foreach ($vulnerabilities->whereNotIn('name', $used[$oldVulnerabilityAnalysis['source']]) as $vulnerability) {
137                  $vulnerabilityResult = [
138                      "name" => $this->applyDiff('', $vulnerability['name'] ?? ''),
139                      "briefDescription" => $this->applyDiff('', $vulnerability['briefDescription'] ?? ''),
140                      "preconditions" => $this->applyDiff('', $vulnerability['preconditions'] ?? ''),
141                      "category" => $this->applyDiff('', $vulnerability['category'] ?? ''),
142                      "evaluator" => $this->applyDiff('', $vulnerability['evaluator'] ?? ''),
143                      'sfrs' => $this->applyDiff('', implode(', ', $vulnerability['sfrs'] ?? [])),
144                  ];
145              }
146  
147              if (!empty($vulnerabilityResult)) {
148                  $result[$oldVulnerabilityAnalysis['source']][] = $vulnerabilityResult;
149              }
150          }
151  
152          return $result;
153      }
154  
155      public function render()
156      {
157          return view('livewire.jsons.va-view')
158              ->layoutData([
159                  'title' => $this->json->schema_name,
160                  'entity' => $this->json,
161                  'breadcrumb' => 'jsons.view',
162              ]);
163      }
164  }