Skip to content

Commit bc7ea06

Browse files
committed
Merge branch 'dev' of https://github.com/MaibornWolff/SecObserve into stackable
2 parents dda0dc2 + baaff24 commit bc7ea06

86 files changed

Lines changed: 1289 additions & 1127 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/publish_docs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ jobs:
2020
- uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6.2.0
2121
with:
2222
python-version: 3.x
23-
- uses: actions/cache@cdf6c1fa76f9f475f3d7449005a359c84ca0f306 # v5.0.3
23+
- uses: actions/cache@668228422ae6a00e4ad889ee87cd7109ec5666a7 # v5.0.4
2424
with:
2525
key: ${{ github.ref }}
2626
path: .cache

.github/workflows/scorecard.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,6 @@ jobs:
6464

6565
# Upload the results to GitHub's code scanning dashboard.
6666
- name: "Upload to code-scanning"
67-
uses: github/codeql-action/upload-sarif@0d579ffd059c29b07949a3cce3983f0780820c98 # v4.32.6
67+
uses: github/codeql-action/upload-sarif@38697555549f1db7851b81482ff19f1fa5c4fedc # v4.34.1
6868
with:
6969
sarif_file: results.sarif

backend/application/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
__version__ = "1.49.0"
1+
__version__ = "1.50.0"
22

33
import pymysql
44

backend/application/core/api/filters.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,7 @@ class Meta: # pylint: disable=duplicate-code
289289
"title",
290290
"current_severity",
291291
"current_status",
292+
"current_priority",
292293
"parser",
293294
"scanner",
294295
"upload_filename",

backend/application/core/api/serializers_product.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ def to_internal_value(self, data: dict) -> dict:
135135
statuses = validated_data["observation_notification_status_list"]
136136
if isinstance(statuses, list):
137137
validated_data["observation_notification_statuses"] = ",".join(statuses)
138+
validated_data.pop("observation_notification_status_list")
138139

139140
return validated_data
140141

@@ -277,6 +278,7 @@ class ProductSerializer(ProductListSerializer): # pylint: disable=too-many-publ
277278
has_api_configurations = SerializerMethodField()
278279
has_branch_osv_linux_distribution = SerializerMethodField()
279280
has_concluded_comments = SerializerMethodField()
281+
has_priorities = SerializerMethodField()
280282

281283
class Meta:
282284
model = Product
@@ -360,6 +362,9 @@ def get_has_branch_osv_linux_distribution(self, obj: Product) -> bool:
360362
def get_has_concluded_comments(self, obj: Product) -> bool:
361363
return License_Component.objects.filter(product=obj).exclude(manual_concluded_comment="").exists()
362364

365+
def get_has_priorities(self, obj: Product) -> bool:
366+
return Observation.objects.filter(product=obj).filter(current_priority__isnull=False).exists()
367+
363368
def validate(self, attrs: dict) -> dict: # pylint: disable=too-many-branches
364369
# There are quite a lot of branches, but at least they are not nested too much
365370
if attrs.get("issue_tracker_type") == Issue_Tracker.ISSUE_TRACKER_GITHUB:
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Generated by Django 6.0.3 on 2026-03-23 08:35
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('core', '0082_merge_20260313'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='observation',
15+
name='assessment_status',
16+
field=models.CharField(blank=True, choices=[('Open', 'Open'), ('Affected', 'Affected'), ('Resolved', 'Resolved'), ('Duplicate', 'Duplicate'), ('False positive', 'False positive'), ('In review', 'In review'), ('Not affected', 'Not affected'), ('Not security', 'Not security'), ('Risk accepted', 'Risk accepted')], max_length=16),
17+
),
18+
migrations.AlterField(
19+
model_name='observation',
20+
name='current_status',
21+
field=models.CharField(choices=[('Open', 'Open'), ('Affected', 'Affected'), ('Resolved', 'Resolved'), ('Duplicate', 'Duplicate'), ('False positive', 'False positive'), ('In review', 'In review'), ('Not affected', 'Not affected'), ('Not security', 'Not security'), ('Risk accepted', 'Risk accepted')], max_length=16),
22+
),
23+
migrations.AlterField(
24+
model_name='observation',
25+
name='parser_status',
26+
field=models.CharField(blank=True, choices=[('Open', 'Open'), ('Affected', 'Affected'), ('Resolved', 'Resolved'), ('Duplicate', 'Duplicate'), ('False positive', 'False positive'), ('In review', 'In review'), ('Not affected', 'Not affected'), ('Not security', 'Not security'), ('Risk accepted', 'Risk accepted')], max_length=16),
27+
),
28+
migrations.AlterField(
29+
model_name='observation',
30+
name='rule_status',
31+
field=models.CharField(blank=True, choices=[('Open', 'Open'), ('Affected', 'Affected'), ('Resolved', 'Resolved'), ('Duplicate', 'Duplicate'), ('False positive', 'False positive'), ('In review', 'In review'), ('Not affected', 'Not affected'), ('Not security', 'Not security'), ('Risk accepted', 'Risk accepted')], max_length=16),
32+
),
33+
migrations.AlterField(
34+
model_name='observation',
35+
name='vex_status',
36+
field=models.CharField(blank=True, choices=[('Open', 'Open'), ('Affected', 'Affected'), ('Resolved', 'Resolved'), ('Duplicate', 'Duplicate'), ('False positive', 'False positive'), ('In review', 'In review'), ('Not affected', 'Not affected'), ('Not security', 'Not security'), ('Risk accepted', 'Risk accepted')], max_length=16),
37+
),
38+
migrations.AlterField(
39+
model_name='observation_log',
40+
name='status',
41+
field=models.CharField(blank=True, choices=[('Open', 'Open'), ('Affected', 'Affected'), ('Resolved', 'Resolved'), ('Duplicate', 'Duplicate'), ('False positive', 'False positive'), ('In review', 'In review'), ('Not affected', 'Not affected'), ('Not security', 'Not security'), ('Risk accepted', 'Risk accepted')], max_length=16),
42+
),
43+
]

backend/application/core/services/assessment.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ def _get_assessments_need_approval(product: Product) -> bool:
186186

187187

188188
def remove_assessment(observation: Observation, comment: str) -> bool:
189-
if observation.assessment_severity or observation.assessment_status:
189+
if observation.assessment_severity or observation.assessment_status or observation.assessment_priority:
190190
observation.assessment_severity = ""
191191
observation.assessment_status = ""
192192
observation.assessment_priority = None

backend/application/core/services/export_observations.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ def _get_excludes() -> list[str]:
6666
"STATUS_NOT_SECURITY",
6767
"STATUS_AFFECTED",
6868
"origin_service",
69+
"observation_notified",
6970
]
7071

7172

backend/application/core/services/observation_log.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def create_observation_log( # pylint: disable=too-many-arguments
5151
if assessment_status in (
5252
Assessment_Status.ASSESSMENT_STATUS_APPROVED,
5353
Assessment_Status.ASSESSMENT_STATUS_AUTO_APPROVED,
54+
Assessment_Status.ASSESSMENT_STATUS_REMOVED,
5455
):
5556
send_observation_notification(observation)
5657
send_observation_title_notification(observation)

backend/application/notifications/services/send_notifications_observation_title.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,6 @@ def send_observation_title_notification(observation: Observation) -> None:
8989
observation_title_notified.status = observation.current_status
9090
observation_title_notified.priority = observation.current_priority
9191
observation_title_notified.save()
92-
else:
93-
try:
94-
observation_title_notified = Observation_Title_Notified.objects.get(title=observation.title)
95-
except Observation_Title_Notified.DoesNotExist:
96-
return
97-
98-
first_line = f'Observation title "{observation.title}" fell out of notifications'
99-
100-
url = get_base_url_frontend() + '#/observations?filter={"title":"' + observation.title + '"}'
101-
102-
_send_observation_title_notifications(settings, observation, first_line, url)
103-
104-
observation_title_notified.delete()
10592

10693

10794
def _send_observation_title_notifications(

0 commit comments

Comments
 (0)