@@ -364,12 +364,6 @@ public function patch_attachment(int $id, array $body): array {
364364 * @return array
365365 */
366366 public function post (array $ body ) {
367- if (!Gdn::session ()->checkPermission ('Garden.Uploads.Add ' )) {
368- throw new ClientException ('You don \'t have permission to upload files ' , 403 );
369- }
370-
371- //$this->permission('Garden.Uploads.Add');
372-
373367 $ allowedExtensions = $ this ->config ->get ('Garden.Upload.AllowedFileExtensions ' , []);
374368 $ uploadSchema = new UploadedFileSchema ([
375369 UploadedFileSchema::OPTION_ALLOWED_EXTENSIONS => $ allowedExtensions ,
@@ -380,10 +374,69 @@ public function post(array $body) {
380374
381375 $ in = $ this ->schema ([
382376 'file ' => $ uploadSchema ,
377+ 'categoryID:i? ' => "CategoryID " ,
378+ 'discussionID:i? ' => "DiscussionID " ,
379+ 'commentID:i? ' => "CommentID " ,
380+ 'actionType:s? ' => "ActionType "
383381 ], 'in ' )->setDescription ('Add a media item. ' );
384- $ out = $ this ->schema ($ this ->fullSchema (), 'out ' );
385-
386382 $ body = $ in ->validate ($ body );
383+ $ categoryID = $ body ['categoryID ' ];
384+ $ discussionID = $ body ['discussionID ' ];
385+ $ commentID = $ body ['commentID ' ];
386+ $ actionType = $ body ['actionType ' ];
387+
388+ if (!$ categoryID && !$ discussionID && !Gdn::session ()->checkPermission ('Garden.Uploads.Add ' )) {
389+ throw new ClientException ("You don't have permission to upload files " , 403 );
390+ }
391+
392+ if (!Gdn::session ()->checkPermission ('Garden.Uploads.Add ' )) {
393+ switch ($ actionType ) {
394+ case 'NewDiscussion ' :
395+ if (!$ categoryID ) {
396+ throw new ClientException ("You don't have permission to upload files " , 403 );
397+ }
398+ $ permissionCategory = CategoryModel::permissionCategory ($ categoryID );
399+ $ discussionsUploads = CategoryModel::checkPermission ($ permissionCategory , 'Vanilla.Discussions.Uploads ' );
400+ if (!$ discussionsUploads ) {
401+ throw new ClientException ("You don't have permission to upload files " , 403 );
402+ }
403+ break ;
404+ case 'EditDiscussion ' :
405+ $ discussionModel = new DiscussionModel ();
406+ $ discussion = $ discussionModel ->getID ($ discussionID );
407+ if (!$ discussion ) {
408+ throw new NotFoundException ('Discussion ' );
409+ }
410+ $ categoryID = val ('CategoryID ' , $ discussion , false );
411+ $ permissionCategory = CategoryModel::permissionCategory ($ categoryID );
412+ $ discussionsUploads = CategoryModel::checkPermission ($ permissionCategory , 'Vanilla.Discussions.Uploads ' );
413+ if (!$ discussionsUploads ) {
414+ throw new ClientException ("You don't have permission to upload files " , 403 );
415+ }
416+ break ;
417+ case 'NewComment ' :
418+ case 'EditComment ' :
419+ $ discussionModel = new DiscussionModel ();
420+ $ discussion = $ discussionModel ->getID ($ discussionID );
421+ if (!$ discussion ) {
422+ throw new NotFoundException ('Discussion ' );
423+ }
424+
425+ $ categoryID = val ('CategoryID ' , $ discussion , false );
426+ $ permissionCategory = CategoryModel::permissionCategory ($ categoryID );
427+ $ commentsUploads = CategoryModel::checkPermission ($ permissionCategory , 'Vanilla.Comments.Uploads ' );
428+ // No permissions
429+ if (!$ commentsUploads ) {
430+ throw new ClientException ("You don't have permission to upload files " , 403 );
431+ }
432+ break ;
433+ default :
434+ throw new ClientException ("You don't have permission to upload files " , 403 );
435+ }
436+
437+ }
438+
439+ $ out = $ this ->schema ($ this ->fullSchema (), 'out ' );
387440
388441 $ imageExtensions = array_keys (ImageResizer::getExtType ());
389442 /** @var UploadedFile $file */
0 commit comments