|
23 | 23 | import importlib |
24 | 24 | from datetime import datetime |
25 | 25 | from time import sleep |
| 26 | +import urlpy |
26 | 27 |
|
27 | 28 | from django.db import models |
28 | 29 | from django.db import IntegrityError |
@@ -110,6 +111,38 @@ class VulnerabilityReference(models.Model): |
110 | 111 | def scores(self): |
111 | 112 | return VulnerabilitySeverity.objects.filter(reference=self.id) |
112 | 113 |
|
| 114 | + def save(self, *args, **kwargs): |
| 115 | + if self.id: |
| 116 | + super(VulnerabilityReference, self).save(*args, **kwargs) |
| 117 | + else: |
| 118 | + url_parsed = urlpy.parse(self.url) |
| 119 | + self.url = str(url_parsed.canonical()) |
| 120 | + url_scheme = url_parsed.scheme |
| 121 | + scheme_independent_url = self.url[len(url_scheme) :] |
| 122 | + if url_scheme == "http": |
| 123 | + similar_instance = VulnerabilityReference.objects.filter( |
| 124 | + vulnerability=self.vulnerability, |
| 125 | + source=self.source, |
| 126 | + reference_id=self.reference_id, |
| 127 | + url="https" + scheme_independent_url, |
| 128 | + ).first() |
| 129 | + if not similar_instance: |
| 130 | + super(VulnerabilityReference, self).save(*args, **kwargs) |
| 131 | + elif url_scheme == "https": |
| 132 | + similar_instance = VulnerabilityReference.objects.filter( |
| 133 | + vulnerability=self.vulnerability, |
| 134 | + source=self.source, |
| 135 | + reference_id=self.reference_id, |
| 136 | + url="http" + scheme_independent_url, |
| 137 | + ).first() |
| 138 | + if similar_instance: |
| 139 | + similar_instance.url = self.url |
| 140 | + similar_instance.save() |
| 141 | + else: |
| 142 | + super(VulnerabilityReference, self).save(*args, **kwargs) |
| 143 | + else: |
| 144 | + super(VulnerabilityReference, self).save(*args, **kwargs) |
| 145 | + |
113 | 146 | class Meta: |
114 | 147 | unique_together = ("vulnerability", "source", "reference_id", "url") |
115 | 148 |
|
|
0 commit comments