diff --git a/mod/forum/externallib.php b/mod/forum/externallib.php index a6745c2a6d8..12c0e1278b1 100644 --- a/mod/forum/externallib.php +++ b/mod/forum/externallib.php @@ -780,12 +780,30 @@ class mod_forum_external extends external_api { require_once($CFG->dirroot . "/mod/forum/lib.php"); $params = self::validate_parameters(self::add_discussion_post_parameters(), - array( - 'postid' => $postid, - 'subject' => $subject, - 'message' => $message, - 'options' => $options - )); + array( + 'postid' => $postid, + 'subject' => $subject, + 'message' => $message, + 'options' => $options + ) + ); + $warnings = array(); + + if (!$parent = forum_get_post_full($params['postid'])) { + throw new moodle_exception('invalidparentpostid', 'forum'); + } + + if (!$discussion = $DB->get_record("forum_discussions", array("id" => $parent->discussion))) { + throw new moodle_exception('notpartofdiscussion', 'forum'); + } + + // Request and permission validation. + $forum = $DB->get_record('forum', array('id' => $discussion->forum), '*', MUST_EXIST); + list($course, $cm) = get_course_and_cm_from_instance($forum, 'forum'); + + $context = context_module::instance($cm->id); + self::validate_context($context); + // Validate options. $options = array( 'discussionsubscribe' => true, @@ -803,6 +821,10 @@ class mod_forum_external extends external_api { break; case 'attachmentsid': $value = clean_param($option['value'], PARAM_INT); + // Ensure that the user has permissions to create attachments. + if (!has_capability('mod/forum:createattachment', $context)) { + $value = 0; + } break; default: throw new moodle_exception('errorinvalidparam', 'webservice', '', $name); @@ -810,23 +832,6 @@ class mod_forum_external extends external_api { $options[$name] = $value; } - $warnings = array(); - - if (!$parent = forum_get_post_full($params['postid'])) { - throw new moodle_exception('invalidparentpostid', 'forum'); - } - - if (!$discussion = $DB->get_record("forum_discussions", array("id" => $parent->discussion))) { - throw new moodle_exception('notpartofdiscussion', 'forum'); - } - - // Request and permission validation. - $forum = $DB->get_record('forum', array('id' => $discussion->forum), '*', MUST_EXIST); - list($course, $cm) = get_course_and_cm_from_instance($forum, 'forum'); - - $context = context_module::instance($cm->id); - self::validate_context($context); - if (!forum_user_can_post($forum, $discussion, $USER, $cm, $course, $context)) { throw new moodle_exception('nopostforum', 'forum'); } @@ -955,6 +960,16 @@ class mod_forum_external extends external_api { 'groupid' => $groupid, 'options' => $options )); + + $warnings = array(); + + // Request and permission validation. + $forum = $DB->get_record('forum', array('id' => $params['forumid']), '*', MUST_EXIST); + list($course, $cm) = get_course_and_cm_from_instance($forum, 'forum'); + + $context = context_module::instance($cm->id); + self::validate_context($context); + // Validate options. $options = array( 'discussionsubscribe' => true, @@ -976,6 +991,10 @@ class mod_forum_external extends external_api { break; case 'attachmentsid': $value = clean_param($option['value'], PARAM_INT); + // Ensure that the user has permissions to create attachments. + if (!has_capability('mod/forum:createattachment', $context)) { + $value = 0; + } break; default: throw new moodle_exception('errorinvalidparam', 'webservice', '', $name); @@ -983,15 +1002,6 @@ class mod_forum_external extends external_api { $options[$name] = $value; } - $warnings = array(); - - // Request and permission validation. - $forum = $DB->get_record('forum', array('id' => $params['forumid']), '*', MUST_EXIST); - list($course, $cm) = get_course_and_cm_from_instance($forum, 'forum'); - - $context = context_module::instance($cm->id); - self::validate_context($context); - // Normalize group. if (!groups_get_activity_groupmode($cm)) { // Groups not supported, force to -1.