File tree Expand file tree Collapse file tree 3 files changed +33
-2
lines changed Expand file tree Collapse file tree 3 files changed +33
-2
lines changed Original file line number Diff line number Diff line change
1
+ Do not expose private metadata via relationfield serializer.
2
+ [maethu]
Original file line number Diff line number Diff line change
1
+ from plone import api
1
2
from plone .dexterity .interfaces import IDexterityContent
2
3
from plone .restapi .interfaces import IFieldSerializer
3
4
from plone .restapi .interfaces import IJsonCompatible
17
18
@adapter (IRelationValue )
18
19
@implementer (IJsonCompatible )
19
20
def relationvalue_converter (value ):
20
- if value .to_object :
21
+ mtool = api .portal .get_tool ('portal_membership' )
22
+ if value .to_object and mtool .checkPermission ('View' , value .to_object ):
21
23
request = getRequest ()
22
24
request .form ["metadata_fields" ] = ["UID" ]
23
25
summary = getMultiAdapter ((value .to_object , request ), ISerializeToJsonSummary )()
@@ -33,4 +35,9 @@ class RelationChoiceFieldSerializer(DefaultFieldSerializer):
33
35
@adapter (IRelationList , IDexterityContent , Interface )
34
36
@implementer (IFieldSerializer )
35
37
class RelationListFieldSerializer (DefaultFieldSerializer ):
36
- pass
38
+ def __call__ (self ):
39
+ value = self .get_value ()
40
+ if value :
41
+ return [item for item in json_compatible (value ) if item ]
42
+ else :
43
+ return super ().__call__ ()
Original file line number Diff line number Diff line change @@ -137,6 +137,28 @@ def test_get_content_includes_related_items(self):
137
137
response .json ()["relatedItems" ],
138
138
)
139
139
140
+ def test_get_content_includes_related_items_filtered_by_view_permission (self ):
141
+ intids = getUtility (IIntIds )
142
+ self .portal .folder1 .doc1 .relatedItems = [
143
+ RelationValue (intids .getId (self .portal .folder1 .folder2 .doc2 )),
144
+ ]
145
+
146
+ # Remove view permission
147
+ self .portal .folder1 .folder2 .doc2 .manage_permission (
148
+ "View" , roles = [], acquire = False )
149
+ self .portal .folder1 .folder2 .doc2 .reindexObjectSecurity ()
150
+ transaction .commit ()
151
+
152
+ response = requests .get (
153
+ self .portal .folder1 .doc1 .absolute_url (),
154
+ headers = {"Accept" : "application/json" },
155
+ auth = (SITE_OWNER_NAME , SITE_OWNER_PASSWORD ),
156
+ )
157
+ self .assertEqual (response .status_code , 200 )
158
+ self .assertEqual (0 , len (response .json ()["relatedItems" ]))
159
+ self .assertEqual ([], response .json ()["relatedItems" ],
160
+ )
161
+
140
162
def test_get_content_related_items_without_workflow (self ):
141
163
intids = getUtility (IIntIds )
142
164
You can’t perform that action at this time.
0 commit comments