diff --git a/cds/modules/records/serializers/json.py b/cds/modules/records/serializers/json.py index 24b4b6bc4..f7290f85e 100644 --- a/cds/modules/records/serializers/json.py +++ b/cds/modules/records/serializers/json.py @@ -21,18 +21,18 @@ # or submit itself to any jurisdiction. """CDS JSON Serializer.""" - from flask import has_request_context from flask_security import current_user from invenio_records_rest.serializers.json import JSONSerializer +from marshmallow_utils.html import ALLOWED_CSS_STYLES, ALLOWED_HTML_ATTRS, sanitize_html from ..api import CDSRecord from ..permissions import ( has_read_record_eos_path_permission, has_read_record_permission, + has_update_permission, ) from ..utils import HTMLTagRemover, parse_video_chapters -from marshmallow_utils.html import sanitize_html, ALLOWED_HTML_ATTRS, ALLOWED_CSS_STYLES CUSTOM_ALLOWED_ATTRS = { **ALLOWED_HTML_ATTRS, @@ -89,6 +89,14 @@ def _sanitize_metadata(self, metadata): return metadata + def _remove_internal_fields(self, record, metadata): + """Remove _access from the metadata if the user doesn't have update permissions on the record.""" + if not has_update_permission(current_user, record): + metadata.pop("_access", None) + metadata.pop("_buckets", None) + metadata.pop("_cds", None) + return metadata + def preprocess_record(self, pid, record, links_factory=None): """Include ``_eos_library_path`` for single record retrievals.""" result = super(CDSJSONSerializer, self).preprocess_record( @@ -106,6 +114,7 @@ def preprocess_record(self, pid, record, links_factory=None): # sanitize title by unescaping and stripping html tags try: metadata = self._sanitize_metadata(metadata) + metadata = self._remove_internal_fields(record, metadata) if has_request_context(): metadata["videos"] = [ video @@ -134,5 +143,8 @@ def preprocess_search_hit(self, pid, record_hit, links_factory=None): if "metadata" in result: metadata = result["metadata"] result["metadata"] = self._sanitize_metadata(result["metadata"]) + result["metadata"] = self._remove_internal_fields( + record_hit, result["metadata"] + ) return result diff --git a/docker-services.yml b/docker-services.yml index ede4327bc..c25fd57a8 100644 --- a/docker-services.yml +++ b/docker-services.yml @@ -112,8 +112,6 @@ services: image: opensearchproject/opensearch-dashboards:2 ports: - "${DOCKER_SERVICES_IP_BIND:-127.0.0.1}:5601:5601" - expose: - - "${DOCKER_SERVICES_IP_BIND:-127.0.0.1}:5601" environment: # settings only for development. DO NOT use in production! - 'OPENSEARCH_HOSTS=["http://search:9200"]' diff --git a/tests/unit/test_serializer.py b/tests/unit/test_serializer.py index ee9278a50..1ef52556e 100644 --- a/tests/unit/test_serializer.py +++ b/tests/unit/test_serializer.py @@ -173,6 +173,16 @@ def test_cds_json_serializer_sanitization(video_record_metadata): 'title': {'title': ' Titre'} } ] + + record["_access"] = { + "key": "value" + } + record["_buckets"] = { + "key":"value" + } + record["_cds"] = { + "key":"value" + } # Test the serializer serializer = CDSJSONSerializer() @@ -201,3 +211,7 @@ def test_cds_json_serializer_sanitization(video_record_metadata): translations = result['metadata']['translations'] for tr in translations: assert '