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 }