Page Menu
Home
Software Heritage
Search
Configure Global Search
Log In
Files
F7122878
D1442.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
6 KB
Subscribers
None
D1442.diff
View Options
diff --git a/swh/web/api/apiresponse.py b/swh/web/api/apiresponse.py
--- a/swh/web/api/apiresponse.py
+++ b/swh/web/api/apiresponse.py
@@ -6,6 +6,8 @@
import json
import traceback
+from django.utils.html import escape
+
from rest_framework.response import Response
from swh.storage.exc import StorageDBError, StorageAPIError
@@ -177,6 +179,10 @@
'exception': error.__class__.__name__,
'reason': str(error),
}
+
+ if request.accepted_media_type == 'text/html':
+ error_data['reason'] = escape(error_data['reason'])
+
if get_config()['debug']:
error_data['traceback'] = traceback.format_exc()
diff --git a/swh/web/assets/src/bundles/browse/origin-search.js b/swh/web/assets/src/bundles/browse/origin-search.js
--- a/swh/web/assets/src/bundles/browse/origin-search.js
+++ b/swh/web/assets/src/bundles/browse/origin-search.js
@@ -37,7 +37,7 @@
let browseUrl = Urls.browse_origin(elem.url);
let tableRow = `<tr id="origin-${elem.id}" class="swh-search-result-entry swh-tr-hover-highlight">`;
tableRow += `<td style="width: 120px;">${elem.type}</td>`;
- tableRow += `<td style="white-space: nowrap;"><a href="${browseUrl}">${elem.url}</a></td>`;
+ tableRow += `<td style="white-space: nowrap;"><a href="${encodeURI(browseUrl)}">${encodeURI(elem.url)}</a></td>`;
tableRow += `<td id="visit-status-origin-${elem.id}"><i title="Checking visit status" class="fa fa-refresh fa-spin"></i></td>`;
tableRow += '</tr>';
table.append(tableRow);
diff --git a/swh/web/browse/utils.py b/swh/web/browse/utils.py
--- a/swh/web/browse/utils.py
+++ b/swh/web/browse/utils.py
@@ -12,6 +12,7 @@
from django.core.cache import cache
from django.utils.safestring import mark_safe
+from django.utils.html import escape
from importlib import reload
@@ -489,7 +490,8 @@
attrs += '%s="%s" ' % (k, v)
if not link_text:
link_text = url
- link = '<a%shref="%s">%s</a>' % (attrs, url, link_text)
+ link = '<a%shref="%s">%s</a>' \
+ % (attrs, escape(url), escape(link_text))
return mark_safe(link)
@@ -861,7 +863,7 @@
return origin_info
except Exception:
pass
- raise NotFoundExc('Origin with url %s not found!' % origin_url)
+ raise NotFoundExc('Origin with url %s not found!' % escape(origin_url))
def get_snapshot_context(snapshot_id=None, origin_type=None, origin_url=None,
@@ -923,7 +925,7 @@
if not snapshot_id:
raise NotFoundExc('No snapshot associated to the visit of origin '
- '%s on %s' % (origin_url, fmt_date))
+ '%s on %s' % (escape(origin_url), fmt_date))
# provided timestamp is not necessarily equals to the one
# of the retrieved visit, so get the exact one in order
diff --git a/swh/web/browse/views/utils/snapshot_context.py b/swh/web/browse/views/utils/snapshot_context.py
--- a/swh/web/browse/views/utils/snapshot_context.py
+++ b/swh/web/browse/views/utils/snapshot_context.py
@@ -10,6 +10,7 @@
from django.shortcuts import render
from django.template.defaultfilters import filesizeformat
+from django.utils.html import escape
from swh.model.identifiers import snapshot_identifier
@@ -117,7 +118,7 @@
' and url %s not found!' % (branch_type, branch, timestamp,
origin_info['type'],
origin_info['url'])
- raise NotFoundExc(msg)
+ raise NotFoundExc(escape(msg))
def _process_snapshot_request(request, snapshot_id=None, origin_type=None,
diff --git a/swh/web/common/exc.py b/swh/web/common/exc.py
--- a/swh/web/common/exc.py
+++ b/swh/web/common/exc.py
@@ -8,6 +8,7 @@
from django.http import HttpResponse
from django.shortcuts import render
from django.utils.safestring import mark_safe
+from django.utils.html import escape
from swh.web.config import get_config
@@ -68,7 +69,7 @@
"""
error_description = 'The server cannot process the request to %s due to '\
'something that is perceived to be a client error.' %\
- request.META['PATH_INFO']
+ escape(request.META['PATH_INFO'])
return _generate_error_page(request, 400, error_description)
@@ -77,7 +78,7 @@
Custom Django HTTP error 403 handler for swh-web.
"""
error_description = 'The resource %s requires an authentication.' %\
- request.META['PATH_INFO']
+ escape(request.META['PATH_INFO'])
return _generate_error_page(request, 403, error_description)
@@ -86,7 +87,7 @@
Custom Django HTTP error 404 handler for swh-web.
"""
error_description = 'The resource %s could not be found on the server.' %\
- request.META['PATH_INFO']
+ escape(request.META['PATH_INFO'])
return _generate_error_page(request, 404, error_description)
@@ -96,7 +97,7 @@
"""
error_description = 'An unexpected condition was encountered when '\
'requesting resource %s.' %\
- request.META['PATH_INFO']
+ escape(request.META['PATH_INFO'])
return _generate_error_page(request, 500, error_description)
diff --git a/swh/web/common/origin_save.py b/swh/web/common/origin_save.py
--- a/swh/web/common/origin_save.py
+++ b/swh/web/common/origin_save.py
@@ -9,6 +9,7 @@
from django.core.exceptions import ObjectDoesNotExist
from django.core.exceptions import ValidationError
from django.core.validators import URLValidator
+from django.utils.html import escape
from swh.web import config
from swh.web.common import service
@@ -127,7 +128,7 @@
_validate_url(origin_url)
except ValidationError:
raise BadInputExc('The provided origin url (%s) is not valid!' %
- origin_url)
+ escape(origin_url))
def _get_visit_info_for_save_request(save_request):
diff --git a/swh/web/templates/includes/top-navigation.html b/swh/web/templates/includes/top-navigation.html
--- a/swh/web/templates/includes/top-navigation.html
+++ b/swh/web/templates/includes/top-navigation.html
@@ -120,7 +120,7 @@
var branch = false;
{% if snapshot_context %}
snapshotContext = true;
- branch = {{ snapshot_context.branch|jsonify }};
+ branch = "{{ snapshot_context.branch|escape }}";
{% endif %}
- swh.browse.initSnapshotNavigation(snapshotContext, branch);
+ swh.browse.initSnapshotNavigation(snapshotContext, branch !== "None");
</script>
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Dec 17 2024, 9:09 AM (4 w, 3 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3220704
Attached To
D1442: swh-web: Fix XSS
Event Timeline
Log In to Comment