Skip to content

Commit 2090ea0

Browse files
authored
fix: URL-encode programming language filter values in resource list (#2079)
Signed-off-by: uttam282005 <uttam282005@gmail.com>
1 parent d9816ab commit 2090ea0

File tree

5 files changed

+39
-4
lines changed

5 files changed

+39
-4
lines changed

scanpipe/templates/scanpipe/panels/scan_summary_panel.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757
{% for entry in scan_summary.primary_language %}
5858
{% if entry.value %}
5959
<li>
60-
<a href="{% url 'project_resources' project.slug %}?programming_language={{ entry.value }}" target="_blank">
60+
<a href="{% url 'project_resources' project.slug %}?programming_language={{ entry.value|urlencode }}" target="_blank">
6161
{{ entry.value }}
6262
{% if entry.count %}
6363
<span class="tag is-rounded">
@@ -123,7 +123,7 @@
123123
<ul>
124124
{% for entry in scan_summary.other_languages %}
125125
{% if entry.value %}
126-
<a href="{% url 'project_resources' project.slug %}?programming_language={{ entry.value }}" target="_blank">
126+
<a href="{% url 'project_resources' project.slug %}?programming_language={{ entry.value|urlencode }}" target="_blank">
127127
<li>
128128
{{ entry.value }}
129129
{% if entry.count %}

scanpipe/templates/scanpipe/project_charts.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ <h3 class="title is-4 has-text-centered mb-3">
152152
// Keep in sync with FilterSetUtilsMixin.(empty_value|other_value)
153153
if (name === "(No value detected)") name = "_EMPTY_";
154154
if (name === "Other") name = "_OTHER_";
155-
let full_url = `${base_url}?${field}=${name}`;
155+
let full_url = `${base_url}?${field}=${encodeURIComponent(name)}`;
156156
if (in_package) full_url += `&in_package=${in_package}`;
157157
if (event.ctrlKey || event.metaKey) window.open(full_url, '_blank');
158158
else window.location.href = full_url;

scanpipe/templates/scanpipe/resource_list.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454
<a href="?extension={{ resource.extension }}" class="is-black-link">{{ resource.extension }}</a>
5555
</td>
5656
<td class="break-all">
57-
<a href="?programming_language={{ resource.programming_language }}" class="is-black-link">{{ resource.programming_language }}</a>
57+
<a href="?programming_language={{ resource.programming_language|urlencode }}" class="is-black-link">{{ resource.programming_language }}</a>
5858
</td>
5959
<td class="break-all">
6060
<a href="?mime_type={{ resource.mime_type }}" class="is-black-link">{{ resource.mime_type }}</a>

scanpipe/tests/test_api.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -788,6 +788,18 @@ def test_scanpipe_api_project_action_resources_filterset(self):
788788
response = self.csrf_client.get(url + "?slug=aaa")
789789
self.assertEqual(2, response.data["count"])
790790

791+
def test_scanpipe_api_project_action_resources_filterset_special_chars(self):
792+
make_resource_file(
793+
self.project1,
794+
path="csharp_file.cs",
795+
programming_language="C#",
796+
)
797+
url = reverse("project-resources", args=[self.project1.uuid])
798+
response = self.csrf_client.get(url + "?programming_language=C%23")
799+
self.assertEqual(1, response.data["count"])
800+
self.assertEqual("csharp_file.cs", response.data["results"][0]["path"])
801+
self.assertEqual("C#", response.data["results"][0]["programming_language"])
802+
791803
def test_scanpipe_api_project_action_packages(self):
792804
url = reverse("project-packages", args=[self.project1.uuid])
793805
response = self.csrf_client.get(url)

scanpipe/tests/test_views.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -590,6 +590,18 @@ def test_scanpipe_views_project_details_scan_summary_panels(self):
590590
self.assertContains(response, expected1)
591591
self.assertContains(response, expected2)
592592

593+
def test_scanpipe_views_project_details_scan_summary_language_url_encoding(self):
594+
summary_file = self.project1.get_output_file_path("summary", "json")
595+
scan_summary_json = {
596+
"primary_language": [{"value": "C#", "count": 1}],
597+
"other_languages": [{"value": "C#", "count": 1}],
598+
}
599+
summary_file.write_text(json.dumps(scan_summary_json))
600+
url = self.project1.get_absolute_url()
601+
response = self.client.get(url)
602+
self.assertContains(response, "?programming_language=C%23")
603+
self.assertNotContains(response, "?programming_language=C#")
604+
593605
def test_scanpipe_views_project_details_get_license_clarity_data(self):
594606
get_license_clarity_data = ProjectDetailView.get_license_clarity_data
595607

@@ -1039,6 +1051,17 @@ def test_scanpipe_views_codebase_resource_list_view_bad_search_query(self):
10391051
expected_error = "The provided search value is invalid: No closing quotation"
10401052
self.assertContains(response, expected_error)
10411053

1054+
def test_scanpipe_views_codebase_resource_list_programming_language_url_encoding(
1055+
self,
1056+
):
1057+
make_resource_file(
1058+
self.project1, path="csharp_file.cs", programming_language="C#"
1059+
)
1060+
url = reverse("project_resources", args=[self.project1.slug])
1061+
response = self.client.get(url)
1062+
self.assertContains(response, "?programming_language=C%23")
1063+
self.assertNotContains(response, "?programming_language=C#")
1064+
10421065
def test_scanpipe_views_codebase_resource_details_view_tab_image(self):
10431066
resource1 = make_resource_file(self.project1, "file1.ext")
10441067
response = self.client.get(resource1.get_absolute_url())

0 commit comments

Comments
 (0)