Skip to content

Commit 35de0c2

Browse files
authored
Merge pull request #201 from sbs2001/jsonfield_qualifiers
Use JSONField instead of CharField to store a Package's qualifers
2 parents 952e33f + c6e9566 commit 35de0c2

5 files changed

Lines changed: 33 additions & 4 deletions

File tree

vulnerabilities/import_runner.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ def _get_or_create_package(p: PackageURL) -> Tuple[models.Package, bool]:
172172
query_kwargs['namespace'] = packageurl.normalize_namespace(p.namespace, p.type, encode=True)
173173

174174
if p.qualifiers:
175-
query_kwargs['qualifiers'] = packageurl.normalize_qualifiers(p.qualifiers, encode=True)
175+
query_kwargs['qualifiers'] = packageurl.normalize_qualifiers(p.qualifiers, encode=False)
176176

177177
if p.subpath:
178178
query_kwargs['subpath'] = packageurl.normalize_subpath(p.subpath, encode=True)

vulnerabilities/migrations/0001_initial.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ class Migration(migrations.Migration):
3838
('namespace', models.CharField(blank=True, help_text='Package name prefix, such as Maven groupid, Docker image owner, GitHub user or organization, etc.', max_length=255, null=True)),
3939
('name', models.CharField(blank=True, help_text='Name of the package.', max_length=100, null=True)),
4040
('version', models.CharField(blank=True, help_text='Version of the package.', max_length=100, null=True)),
41-
('qualifiers', models.CharField(blank=True, help_text='Extra qualifying data for a package such as the name of an OS, architecture, distro, etc.', max_length=1024, null=True)),
41+
('qualifiers', django.contrib.postgres.fields.jsonb.JSONField(default=dict, null=True, help_text='Extra qualifying data for a package such as the name of an OS, architecture, distro, etc.')),
4242
('subpath', models.CharField(blank=True, help_text='Extra subpath within a package, relative to the package root.', max_length=200, null=True)),
4343
],
4444
options={

vulnerabilities/models.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@
2626

2727
from django.db import models
2828
import django.contrib.postgres.fields as pgfields
29+
from django.utils.translation import ugettext_lazy as _
2930

3031
from packageurl.contrib.django_models import PackageURLMixin
32+
from packageurl import PackageURL
3133

3234
from vulnerabilities.data_source import DataSource
3335

@@ -77,6 +79,33 @@ class Package(PackageURLMixin):
7779

7880
class Meta:
7981
unique_together = ('name', 'namespace', 'type', 'version', 'qualifiers', 'subpath')
82+
# Remove the `qualifers` and `set_package_url` overrides after
83+
# https://github.com/package-url/packageurl-python/pull/35 gets merged
84+
qualifiers = pgfields.JSONField(
85+
default=dict,
86+
help_text=_(
87+
'Extra qualifying data for a package such as the name of an OS, '
88+
'architecture, distro, etc.'
89+
),
90+
null=True
91+
)
92+
93+
def set_package_url(self, package_url):
94+
"""
95+
Set each field values to the values of the provided `package_url` string
96+
or PackageURL object. Existing values are overwritten including setting
97+
values to None for provided empty values.
98+
"""
99+
if not isinstance(package_url, PackageURL):
100+
package_url = PackageURL.from_string(package_url)
101+
102+
for field_name, value in package_url.to_dict().items():
103+
model_field = self._meta.get_field(field_name)
104+
105+
if value and len(value) > model_field.max_length:
106+
raise ValidationError(_('Value too long for field "{}".'.format(field_name)))
107+
108+
setattr(self, field_name, value or None)
80109

81110
def __str__(self):
82111
return self.package_url

vulnerabilities/tests/test_alpine.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ def assert_for_package(self, name, version, cve_ids=None, vuln_ref=None, arch=No
9898
assert qs
9999

100100
if arch:
101-
pkg = qs.get(qualifiers__contains=arch)
101+
pkg = qs.get(qualifiers__arch=arch)
102102
else:
103103
pkg = qs[0]
104104

vulnerabilities/tests/test_debian.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ def assert_for_package(self, name, version, release, cve_ids=None):
8484
type='deb',
8585
namespace='debian',
8686
)
87-
qs = qs.filter(qualifiers__contains=release)
87+
qs = qs.filter(qualifiers__distro=release)
8888
assert qs
8989

9090
if cve_ids:

0 commit comments

Comments
 (0)