Description
Issue Description
Create new object fails when CLP public read/write set to false but pointer to _User (column named user) read/write set to true.
I am able to create objects when public create is set to true, however this leads to a vulnerability that a user can create an object for any user, there is no validation who is creating
Steps to reproduce
schema for the class
{
"_id": {
"$oid": "5e2895a31c9d440000ff973d"
},
"objectId": "string",
"updatedAt": "date",
"createdAt": "date",
"_metadata": {
"fields_options": {
"client": {
"required": false
},
"sku": {
"required": false
},
"note": {
"required": false
},
"currency": {
"required": false
},
"value": {
"required": false
},
"user": {
"required": true
},
"photo": {
"required": false
}
},
"indexes": {
"id": {
"_id": {
"$numberInt": "1"
}
}
},
"class_permissions": {
"get": {},
"find": {},
"count": {},
"create": {},
"update": {},
"delete": {},
"addField": {},
"readUserFields": ["user"],
"writeUserFields": ["user"]
}
},
"client": "Client",
"sku": "string",
"note": "string",
"currency": "string",
"value": "number",
"user": "_User",
"photo": "file"
}
Expected Results
When passing a valid session and the pointer to user matches that session users I expect the creation of a new object
Actual Outcome
{code: 119, error: "Permission denied for action create on class Sale."}
Environment Setup
-
Server
- parse-server version 3.10.0
- Operating System: MacOS 10.15.2
- Hardware: MacBook Pro
- Localhost or remote server? localhost
-
Database
- MongoDB version: 4.2.2
- Storage engine: WiredTiger
- Hardware: M0
- Localhost or remote server? MongoDB Atlas
Logs/Trace
error: Parse error: Permission denied for action create on class Sale. {"code":119,"stack":"Error: Permission denied for action create on class Sale.
at Function.validatePermission parse-server/lib/Controllers/SchemaController.js:1291:13)\n at SchemaController.validatePermission
parse-server/lib/Controllers/SchemaController.js:1304:29)
at validateClassName.then.then.schemaController
Which brings us here:
// No matching CLP, let's check the Pointer permissions
// And handle those later
const permissionField =
['get', 'find', 'count'].indexOf(operation) > -1
? 'readUserFields'
: 'writeUserFields';
// Reject create when write lockdown
if (permissionField == 'writeUserFields' && operation == 'create') {
throw new Parse.Error(
Parse.Error.OPERATION_FORBIDDEN,
`Permission denied for action ${operation} on class ${className}.`
);
}
as the note suggests 'handle those later' doesn't seem to get handled