Skip to content

Commit 446088d

Browse files
authored
Merge pull request #12541 from DefectDojo/bugfix
Bugfix
2 parents 4ca3098 + 7c4bef4 commit 446088d

File tree

9 files changed

+116
-70
lines changed

9 files changed

+116
-70
lines changed

.github/workflows/release-x-manual-helm-chart.yml

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,21 @@ on:
2222
description: 'Release number'
2323
required: true
2424

25+
make_draft:
26+
type: boolean
27+
description: 'Mark as draft release?'
28+
default: true
29+
30+
make_prerelease:
31+
type: boolean
32+
description: 'Mark as pre-release?'
33+
default: false
34+
35+
make_latest:
36+
type: boolean
37+
description: 'Mark as latest?'
38+
default: false
39+
2540
jobs:
2641
release-chart:
2742
runs-on: ubuntu-latest
@@ -38,7 +53,7 @@ jobs:
3853
# id: get-upload-url
3954
# uses: pdamianik/release-tag-to-upload-url-action@v1.0.1
4055
# with:
41-
# tag: ${{ github.event.inputs.release_number }}
56+
# tag: ${{ inputs.release_number }}
4257
# token: ${{ github.token }}
4358

4459
- name: Configure git
@@ -62,24 +77,25 @@ jobs:
6277
id: pin_image
6378
run: |-
6479
yq --version
65-
yq -i '.tag="${{ github.event.inputs.release_number }}"' helm/defectdojo/values.yaml
80+
yq -i '.tag="${{ inputs.release_number }}"' helm/defectdojo/values.yaml
6681
echo "Current image tag:`yq -r '.tag' helm/defectdojo/values.yaml`"
6782
6883
- name: Package Helm chart
6984
id: package-helm-chart
7085
run: |
7186
mkdir build
7287
helm package helm/defectdojo/ --destination ./build
73-
echo "chart_version=$(ls build | cut -d '-' -f 2 | sed 's|\.tgz||')" >> $GITHUB_ENV
88+
echo "chart_version=$(ls build | cut -d '-' -f 2,3 | sed 's|\.tgz||')" >> $GITHUB_ENV
7489
75-
- name: Create release ${{ github.event.inputs.release_number }}
90+
- name: Create release ${{ inputs.release_number }}
7691
uses: softprops/action-gh-release@da05d552573ad5aba039eaac05058a918a7bf631 # v2.2.2
7792
with:
78-
name: '${{ github.event.inputs.release_number }} 🌈'
79-
tag_name: ${{ github.event.inputs.release_number }}
93+
name: '${{ inputs.release_number }} 🌈'
94+
tag_name: ${{ inputs.release_number }}
8095
body: Run the release drafter to populate the release notes.
81-
draft: true
82-
prerelease: false
96+
draft: ${{ inputs.make_draft }}
97+
prerelease: ${{ inputs.make_prerelease }}
98+
make_latest: ${{ inputs.make_latest }}
8399
files: ./build/defectdojo-${{ env.chart_version }}.tgz
84100
token: ${{ secrets.GITHUB_TOKEN }}
85101
env:
@@ -96,9 +112,9 @@ jobs:
96112
git checkout helm-charts
97113
git pull
98114
if [ ! -f ./index.yaml ]; then
99-
helm repo index ./build --url "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/releases/download/${{ github.event.inputs.release_number }}/"
115+
helm repo index ./build --url "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/releases/download/${{ inputs.release_number }}/"
100116
else
101-
helm repo index ./build --url "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/releases/download/${{ github.event.inputs.release_number }}/" --merge ./index.yaml
117+
helm repo index ./build --url "${GITHUB_SERVER_URL}/${GITHUB_REPOSITORY}/releases/download/${{ inputs.release_number }}/" --merge ./index.yaml
102118
fi
103119
cp -f ./build/index.yaml ./index.yaml
104120
git add ./index.yaml

.github/workflows/release-x-nightly.yml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,5 +77,6 @@ jobs:
7777
uses: ./.github/workflows/release-x-manual-helm-chart.yml
7878
with:
7979
release_number: ${{ inputs.tag-to-apply }}
80+
make_draft: false
81+
make_prerelease: true
8082
secrets: inherit
81-

dojo/jira_link/helper.py

Lines changed: 35 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -667,27 +667,48 @@ def push_to_jira(obj, *args, **kwargs):
667667
raise ValueError(msg)
668668

669669
if isinstance(obj, Finding):
670-
finding = obj
671-
if finding.has_jira_issue:
672-
return update_jira_issue_for_finding(finding, *args, **kwargs)
673-
return add_jira_issue_for_finding(finding, *args, **kwargs)
674-
675-
if isinstance(obj, Engagement):
676-
engagement = obj
677-
if engagement.has_jira_issue:
678-
return update_epic(engagement, *args, **kwargs)
679-
return add_epic(engagement, *args, **kwargs)
670+
return push_finding_to_jira(obj, *args, **kwargs)
680671

681672
if isinstance(obj, Finding_Group):
682-
group = obj
683-
if group.has_jira_issue:
684-
return update_jira_issue_for_finding_group(group, *args, **kwargs)
685-
return add_jira_issue_for_finding_group(group, *args, **kwargs)
673+
return push_finding_group_to_jira(obj, *args, **kwargs)
686674

675+
if isinstance(obj, Engagement):
676+
return push_engagement_to_jira(obj, *args, **kwargs)
687677
logger.error("unsupported object passed to push_to_jira: %s %i %s", obj.__name__, obj.id, obj)
688678
return None
689679

690680

681+
# we need thre separate celery tasks due to the decorators we're using to map to/from ids
682+
@dojo_model_to_id
683+
@dojo_async_task
684+
@app.task
685+
@dojo_model_from_id
686+
def push_finding_to_jira(finding, *args, **kwargs):
687+
if finding.has_jira_issue:
688+
return update_jira_issue(finding, *args, **kwargs)
689+
return add_jira_issue(finding, *args, **kwargs)
690+
691+
692+
@dojo_model_to_id
693+
@dojo_async_task
694+
@app.task
695+
@dojo_model_from_id(model=Finding_Group)
696+
def push_finding_group_to_jira(finding_group, *args, **kwargs):
697+
if finding_group.has_jira_issue:
698+
return update_jira_issue(finding_group, *args, **kwargs)
699+
return add_jira_issue(finding_group, *args, **kwargs)
700+
701+
702+
@dojo_model_to_id
703+
@dojo_async_task
704+
@app.task
705+
@dojo_model_from_id(model=Engagement)
706+
def push_engagement_to_jira(engagement, *args, **kwargs):
707+
if engagement.has_jira_issue:
708+
return update_epic(engagement, *args, **kwargs)
709+
return add_epic(engagement, *args, **kwargs)
710+
711+
691712
def add_issues_to_epic(jira, obj, epic_id, issue_keys, *, ignore_epics=True):
692713
try:
693714
return jira.add_issues_to_epic(epic_id=epic_id, issue_keys=issue_keys, ignore_epics=ignore_epics)
@@ -713,24 +734,6 @@ def add_issues_to_epic(jira, obj, epic_id, issue_keys, *, ignore_epics=True):
713734
return False
714735

715736

716-
# we need two separate celery tasks due to the decorators we're using to map to/from ids
717-
718-
@dojo_model_to_id
719-
@dojo_async_task
720-
@app.task
721-
@dojo_model_from_id
722-
def add_jira_issue_for_finding(finding, *args, **kwargs):
723-
return add_jira_issue(finding, *args, **kwargs)
724-
725-
726-
@dojo_model_to_id
727-
@dojo_async_task
728-
@app.task
729-
@dojo_model_from_id(model=Finding_Group)
730-
def add_jira_issue_for_finding_group(finding_group, *args, **kwargs):
731-
return add_jira_issue(finding_group, *args, **kwargs)
732-
733-
734737
def prepare_jira_issue_fields(
735738
project_key,
736739
issuetype_name,
@@ -926,24 +929,6 @@ def failure_to_add_message(message: str, exception: Exception, _: Any) -> bool:
926929
return True
927930

928931

929-
# we need two separate celery tasks due to the decorators we're using to map to/from ids
930-
931-
@dojo_model_to_id
932-
@dojo_async_task
933-
@app.task
934-
@dojo_model_from_id
935-
def update_jira_issue_for_finding(finding, *args, **kwargs):
936-
return update_jira_issue(finding, *args, **kwargs)
937-
938-
939-
@dojo_model_to_id
940-
@dojo_async_task
941-
@app.task
942-
@dojo_model_from_id(model=Finding_Group)
943-
def update_jira_issue_for_finding_group(finding_group, *args, **kwargs):
944-
return update_jira_issue(finding_group, *args, **kwargs)
945-
946-
947932
def update_jira_issue(obj, *args, **kwargs):
948933
def failure_to_update_message(message: str, exception: Exception, obj: Any) -> bool:
949934
if exception:

dojo/settings/settings.dist.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1824,6 +1824,7 @@ def saml2_attrib_map_format(din):
18241824
"DLA-": "https://security-tracker.debian.org/tracker/", # e.g. https://security-tracker.debian.org/tracker/DLA-3917-1
18251825
"DSA-": "https://security-tracker.debian.org/tracker/", # e.g. https://security-tracker.debian.org/tracker/DSA-5791-1
18261826
"DTSA-": "https://security-tracker.debian.org/tracker/", # e.g. https://security-tracker.debian.org/tracker/DTSA-41-1
1827+
"ELA-": "https://www.freexian.com/lts/extended/updates/", # e.g. https://www.freexian.com/lts/extended/updates/ela-1387-1-erlang
18271828
"ELBA-": "https://linux.oracle.com/errata/&&.html", # e.g. https://linux.oracle.com/errata/ELBA-2024-7457.html
18281829
"ELSA-": "https://linux.oracle.com/errata/&&.html", # e.g. https://linux.oracle.com/errata/ELSA-2024-12714.html
18291830
"FEDORA-": "https://bodhi.fedoraproject.org/updates/", # e.g. https://bodhi.fedoraproject.org/updates/FEDORA-EPEL-2024-06aa7dc422

dojo/templates/dojo/components.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ <h3 class="has-filters">
1616
</div>
1717
</h3>
1818
</div>
19-
</div>
20-
<div id="the-filters" class="is-filters panel-body collapse {% if filter.form.has_changed %}in{% endif %}">
21-
{% include "dojo/filter_snippet.html" with form=filter.form %}
19+
<div id="the-filters" class="is-filters panel-body collapse {% if filter.form.has_changed %}in{% endif %}">
20+
{% include "dojo/filter_snippet.html" with form=filter.form %}
21+
</div>
2222
</div>
2323
<div class="clearfix">
2424
{% include "dojo/paging_snippet.html" with page=result page_size=True %}

dojo/templates/dojo/filter_js_snippet.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
{% if title_words %}
3838
var title_words = [
3939
{% for word in title_words %}
40-
"{{word}}",
40+
"{{word|escapejs}}",
4141
{% endfor %}
4242
];
4343
{% comment %}ideally we use the form.prefix but then we have the trailing dash... django templates are hard{% endcomment %}
@@ -49,7 +49,7 @@
4949
{% if component_words %}
5050
var component_words = [
5151
{% for word in component_words %}
52-
"{{word}}",
52+
"{{word|escapejs}}",
5353
{% endfor %}
5454
];
5555

dojo/templates/dojo/product_components.html

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ <h3 class="has-filters">
1414
</div>
1515
</h3>
1616
</div>
17-
</div>
18-
<div id="the-filters" class="is-filters panel-body collapse {% if filter.form.has_changed %}in{% endif %}">
19-
{% include "dojo/filter_snippet.html" with form=filter.form %}
17+
<div id="the-filters" class="is-filters panel-body collapse {% if filter.form.has_changed %}in{% endif %}">
18+
{% include "dojo/filter_snippet.html" with form=filter.form %}
19+
</div>
2020
</div>
2121
<div class="clearfix">
2222
{% include "dojo/paging_snippet.html" with page=result page_size=True %}

dojo/templatetags/display_tags.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ def vulnerability_url(vulnerability_id):
789789
return settings.VULNERABILITY_URLS[key] + str(vulnerability_id.replace("SSA:", "SSA-"))
790790
if key == "SSA-" and not re.findall(r"SSA-\d{4}-", vulnerability_id):
791791
return "https://cert-portal.siemens.com/productcert/html/" + str(vulnerability_id.lower()) + ".html"
792-
if key in {"AVD", "KHV", "C-"}:
792+
if key in {"AVD", "KHV", "C-", "ELA-"}:
793793
return settings.VULNERABILITY_URLS[key] + str(vulnerability_id.lower())
794794
if key == "SUSE-SU-":
795795
return settings.VULNERABILITY_URLS[key] + str(vulnerability_id.lower().removeprefix("suse-su-")[:4]) + "/" + vulnerability_id.replace(":", "")

tests/finding_test.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,49 @@ def test_create_finding_from_template(self):
519519
self.assertTrue(self.is_success_message_present(text="Finding from template added successfully."))
520520
self.assertTrue(self.is_text_present_on_page(text="App Vulnerable to XSS From Template"))
521521

522+
@on_exception_html_source_logger
523+
def test_create_finding_with_unqiue_characters(self):
524+
driver = self.driver
525+
# Navigate to All Finding page
526+
# goto engagemnent list (and wait for javascript to load)
527+
self.goto_all_engagements_overview(driver)
528+
529+
# Select a previously created engagement title
530+
driver.find_element(By.PARTIAL_LINK_TEXT, "Ad Hoc Engagement").click()
531+
driver.find_element(By.PARTIAL_LINK_TEXT, "Pen Test").click()
532+
533+
# Click on the 'dropdownMenu1 button'
534+
# logger.info("\nClicking on dropdown menu \n")
535+
driver.find_element(By.ID, "dropdownMenu_test_add").click()
536+
self.assertNoConsoleErrors()
537+
# Click on `Apply Template to Finding`
538+
driver.find_element(By.LINK_TEXT, "Finding From Template").click()
539+
self.assertNoConsoleErrors()
540+
# click on the template of 'App Vulnerable to XSS'
541+
logger.info("\nClicking on the template \n")
542+
driver.find_element(By.LINK_TEXT, "Use This Template").click()
543+
self.assertNoConsoleErrors()
544+
driver.find_element(By.ID, "id_title").clear()
545+
# Backslash causes error
546+
driver.find_element(By.ID, "id_title").send_keys("App Vulnerable to XSS from \\Template")
547+
self.assertNoConsoleErrors()
548+
# Click the 'finished' button to submit
549+
driver.find_element(By.ID, "id_finished").click()
550+
self.assertNoConsoleErrors()
551+
# Query the site to determine if the finding has been added
552+
# Assert to the query to determine status of failure
553+
self.assertTrue(self.is_success_message_present(text="Finding from template added successfully."))
554+
self.assertTrue(self.is_text_present_on_page(text="App Vulnerable to XSS From \\Template"))
555+
556+
# Navigate back to the finding list
557+
driver.find_element(By.LINK_TEXT, "Findings").click()
558+
self.assertNoConsoleErrors()
559+
driver.find_element(By.LINK_TEXT, "App Vulnerable to XSS from \\Template").click()
560+
self.assertNoConsoleErrors()
561+
562+
# Assert that the finding is present
563+
self.assertTrue(self.is_text_present_on_page(text="App Vulnerable to XSS from \\Template"))
564+
522565
@on_exception_html_source_logger
523566
def test_delete_finding_template(self):
524567
driver = self.driver

0 commit comments

Comments
 (0)