Skip to content

Commit b3ce36d

Browse files
committed
Update the API so it returns an empty list if no filter
Make sure to use api_v3 Fix a css width for rule_metadat and rule text Resolve merge conflict Signed-off-by: ziad hany <ziadhany2016@gmail.com>
1 parent 7792d40 commit b3ce36d

5 files changed

Lines changed: 113 additions & 39 deletions

File tree

vulnerabilities/api_v2.py

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,8 @@
2626
from rest_framework.reverse import reverse
2727
from rest_framework.throttling import AnonRateThrottle
2828

29-
from vulnerabilities.models import AdvisoryV2
3029
from vulnerabilities.models import CodeFix
3130
from vulnerabilities.models import CodeFixV2
32-
from vulnerabilities.models import DetectionRule
33-
from vulnerabilities.models import ImpactedPackage
3431
from vulnerabilities.models import Package
3532
from vulnerabilities.models import PipelineRun
3633
from vulnerabilities.models import PipelineSchedule
@@ -852,36 +849,3 @@ def get_view_name(self):
852849
if self.detail:
853850
return "Pipeline Instance"
854851
return "Pipeline Jobs"
855-
856-
857-
class DetectionRuleFilter(filters.FilterSet):
858-
advisory_avid = filters.CharFilter(field_name="related_advisories__avid", lookup_expr="exact")
859-
860-
rule_text_contains = filters.CharFilter(field_name="rule_text", lookup_expr="icontains")
861-
862-
class Meta:
863-
model = DetectionRule
864-
fields = ["rule_type"]
865-
866-
867-
class DetectionRuleSerializer(serializers.ModelSerializer):
868-
advisory_avid = serializers.SerializerMethodField()
869-
870-
class Meta:
871-
model = DetectionRule
872-
fields = ["rule_type", "source_url", "rule_metadata", "rule_text", "advisory_avid"]
873-
874-
def get_advisory_avid(self, obj):
875-
avids = set(advisory.avid for advisory in obj.related_advisories.all())
876-
return sorted(list(avids))
877-
878-
879-
class DetectionRuleViewSet(viewsets.ReadOnlyModelViewSet):
880-
advisories_prefetch = Prefetch(
881-
"related_advisories", queryset=AdvisoryV2.objects.only("id", "avid").distinct()
882-
)
883-
queryset = DetectionRule.objects.prefetch_related(advisories_prefetch)
884-
serializer_class = DetectionRuleSerializer
885-
throttle_classes = [AnonRateThrottle, PermissionBasedUserRateThrottle]
886-
filter_backends = [filters.DjangoFilterBackend]
887-
filterset_class = DetectionRuleFilter

vulnerabilities/api_v3.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
from vulnerabilities.models import AdvisorySeverity
3131
from vulnerabilities.models import AdvisoryV2
3232
from vulnerabilities.models import AdvisoryWeakness
33+
from vulnerabilities.models import DetectionRule
3334
from vulnerabilities.models import Group
3435
from vulnerabilities.models import GroupedAdvisory
3536
from vulnerabilities.models import ImpactedPackageAffecting
@@ -704,3 +705,47 @@ def get_fixing_advisories_bulk(packages):
704705
result[package.id] = grouped
705706

706707
return result
708+
709+
710+
class DetectionRuleFilter(filters.FilterSet):
711+
advisory_avid = filters.CharFilter(field_name="related_advisories__avid", lookup_expr="exact")
712+
713+
rule_text_contains = filters.CharFilter(field_name="rule_text", lookup_expr="icontains")
714+
715+
class Meta:
716+
model = DetectionRule
717+
fields = ["rule_type"]
718+
719+
720+
class DetectionRuleSerializer(serializers.ModelSerializer):
721+
advisory_avid = serializers.SerializerMethodField()
722+
723+
class Meta:
724+
model = DetectionRule
725+
fields = ["rule_type", "source_url", "rule_metadata", "rule_text", "advisory_avid"]
726+
727+
def get_advisory_avid(self, obj):
728+
avids = {advisory.avid for advisory in obj.related_advisories.all()}
729+
return sorted(avids)
730+
731+
732+
class DetectionRuleViewSet(viewsets.ReadOnlyModelViewSet):
733+
advisories_prefetch = Prefetch(
734+
"related_advisories", queryset=AdvisoryV2.objects.only("id", "avid").distinct()
735+
)
736+
queryset = DetectionRule.objects.prefetch_related(advisories_prefetch)
737+
serializer_class = DetectionRuleSerializer
738+
throttle_classes = [AnonRateThrottle, PermissionBasedUserRateThrottle]
739+
filter_backends = [filters.DjangoFilterBackend]
740+
filterset_class = DetectionRuleFilter
741+
742+
def get_queryset(self):
743+
queryset = super().get_queryset()
744+
query_params = ["advisory_avid", "rule_text_contains", "rule_type"]
745+
has_query_params = any(
746+
query_param in self.request.query_params for query_param in query_params
747+
)
748+
if not has_query_params:
749+
return queryset.none()
750+
751+
return queryset
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
# Generated by Django 5.2.11 on 2026-05-15 19:16
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
("vulnerabilities", "0129_advisorypoc"),
10+
]
11+
12+
operations = [
13+
migrations.CreateModel(
14+
name="DetectionRule",
15+
fields=[
16+
(
17+
"id",
18+
models.AutoField(
19+
auto_created=True, primary_key=True, serialize=False, verbose_name="ID"
20+
),
21+
),
22+
(
23+
"rule_type",
24+
models.CharField(
25+
choices=[
26+
("yara", "Yara"),
27+
("yara-x", "Yara-X"),
28+
("sigma", "Sigma"),
29+
("clamav", "ClamAV"),
30+
("suricata", "Suricata"),
31+
],
32+
help_text="The type of the detection rule content (e.g., YARA, Sigma).",
33+
max_length=50,
34+
),
35+
),
36+
(
37+
"source_url",
38+
models.URLField(
39+
help_text="URL to the original source or reference for this rule.",
40+
max_length=1024,
41+
),
42+
),
43+
(
44+
"rule_metadata",
45+
models.JSONField(
46+
blank=True,
47+
help_text="Additional structured data such as tags, or author information.",
48+
null=True,
49+
),
50+
),
51+
(
52+
"rule_text",
53+
models.TextField(help_text="The content of the detection signature."),
54+
),
55+
(
56+
"related_advisories",
57+
models.ManyToManyField(
58+
help_text="Advisories associated with this DetectionRule.",
59+
related_name="detection_rules",
60+
to="vulnerabilities.advisoryv2",
61+
),
62+
),
63+
],
64+
),
65+
]

vulnerabilities/templates/detection_rules.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
<thead>
3131
<tr>
3232
<th>Type</th>
33-
<th>Metadata</th>
34-
<th>Text</th>
33+
<th colspan="width: 200px;">Metadata</th>
34+
<th colspan="width: 100px;">Text</th>
3535
<th>Source URL</th>
3636
<th>Advisory IDs</th>
3737
</tr>

vulnerablecode/urls.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,12 @@
2222
from vulnerabilities.api import VulnerabilityViewSet
2323
from vulnerabilities.api_v2 import CodeFixV2ViewSet
2424
from vulnerabilities.api_v2 import CodeFixViewSet
25-
from vulnerabilities.api_v2 import DetectionRuleViewSet
2625
from vulnerabilities.api_v2 import PackageV2ViewSet
2726
from vulnerabilities.api_v2 import PipelineScheduleV2ViewSet
2827
from vulnerabilities.api_v2 import VulnerabilityV2ViewSet
2928
from vulnerabilities.api_v3 import AdvisoryV3ViewSet
3029
from vulnerabilities.api_v3 import AffectedByAdvisoriesViewSet
30+
from vulnerabilities.api_v3 import DetectionRuleViewSet
3131
from vulnerabilities.api_v3 import FixingAdvisoriesViewSet
3232
from vulnerabilities.api_v3 import PackageV3ViewSet
3333
from vulnerabilities.views import AdminLoginView

0 commit comments

Comments
 (0)