/** * Test enrol_self_check_group_enrolment_key */ public function test_enrol_self_check_group_enrolment_key() { global $DB; self::resetAfterTest(true); // Test in course with groups. $course = self::getDataGenerator()->create_course(array('groupmode' => SEPARATEGROUPS, 'groupmodeforce' => 1)); $group1 = $this->getDataGenerator()->create_group(array('courseid' => $course->id)); $group2 = $this->getDataGenerator()->create_group(array('courseid' => $course->id, 'enrolmentkey' => 'thepassword')); $result = enrol_self_check_group_enrolment_key($course->id, 'invalidpassword'); $this->assertFalse($result); $result = enrol_self_check_group_enrolment_key($course->id, 'thepassword'); $this->assertTrue($result); // Test disabling group options. $course->groupmode = NOGROUPS; $course->groupmodeforce = 0; $DB->update_record('course', $course); $result = enrol_self_check_group_enrolment_key($course->id, 'invalidpassword'); $this->assertFalse($result); $result = enrol_self_check_group_enrolment_key($course->id, 'thepassword'); $this->assertTrue($result); // Test without groups. $othercourse = self::getDataGenerator()->create_course(); $result = enrol_self_check_group_enrolment_key($othercourse->id, 'thepassword'); $this->assertFalse($result); }
/** * Self enrol the current user in the given course. * * @param int $courseid id of course * @param string $password enrolment key * @param int $instanceid instance id of self enrolment plugin * @return array of warnings and status result * @since Moodle 3.0 * @throws moodle_exception */ public static function enrol_user($courseid, $password = '', $instanceid = 0) { global $CFG; require_once $CFG->libdir . '/enrollib.php'; $params = self::validate_parameters(self::enrol_user_parameters(), array('courseid' => $courseid, 'password' => $password, 'instanceid' => $instanceid)); $warnings = array(); $course = get_course($params['courseid']); $context = context_course::instance($course->id); self::validate_context(context_system::instance()); if (!$course->visible and !has_capability('moodle/course:viewhiddencourses', $context)) { throw new moodle_exception('coursehidden'); } // Retrieve the self enrolment plugin. $enrol = enrol_get_plugin('self'); if (empty($enrol)) { throw new moodle_exception('canntenrol', 'enrol_self'); } // We can expect multiple self-enrolment instances. $instances = array(); $enrolinstances = enrol_get_instances($course->id, true); foreach ($enrolinstances as $courseenrolinstance) { if ($courseenrolinstance->enrol == "self") { // Instance specified. if (!empty($params['instanceid'])) { if ($courseenrolinstance->id == $params['instanceid']) { $instances[] = $courseenrolinstance; break; } } else { $instances[] = $courseenrolinstance; } } } if (empty($instances)) { throw new moodle_exception('canntenrol', 'enrol_self'); } // Try to enrol the user in the instance/s. $enrolled = false; foreach ($instances as $instance) { $enrolstatus = $enrol->can_self_enrol($instance); if ($enrolstatus === true) { if ($instance->password and $params['password'] !== $instance->password) { // Check if we are using group enrolment keys. if ($instance->customint1) { require_once $CFG->dirroot . "/enrol/self/locallib.php"; if (!enrol_self_check_group_enrolment_key($course->id, $params['password'])) { $warnings[] = array('item' => 'instance', 'itemid' => $instance->id, 'warningcode' => '2', 'message' => get_string('passwordinvalid', 'enrol_self')); continue; } } else { if ($enrol->get_config('showhint')) { $hint = core_text::substr($instance->password, 0, 1); $warnings[] = array('item' => 'instance', 'itemid' => $instance->id, 'warningcode' => '3', 'message' => s(get_string('passwordinvalidhint', 'enrol_self', $hint))); continue; } else { $warnings[] = array('item' => 'instance', 'itemid' => $instance->id, 'warningcode' => '4', 'message' => get_string('passwordinvalid', 'enrol_self')); continue; } } } // Do the enrolment. $data = array('enrolpassword' => $params['password']); $enrol->enrol_self($instance, (object) $data); $enrolled = true; break; } else { $warnings[] = array('item' => 'instance', 'itemid' => $instance->id, 'warningcode' => '1', 'message' => $enrolstatus); } } $result = array(); $result['status'] = $enrolled; $result['warnings'] = $warnings; return $result; }
public function validation($data, $files) { global $DB, $CFG; $errors = parent::validation($data, $files); $instance = $this->instance; if ($this->toomany) { $errors['notice'] = get_string('error'); return $errors; } if ($instance->password) { if ($data['enrolpassword'] !== $instance->password) { if ($instance->customint1) { // Check group enrolment key. if (!enrol_self_check_group_enrolment_key($instance->courseid, $data['enrolpassword'])) { // We can not hint because there are probably multiple passwords. $errors['enrolpassword'] = get_string('passwordinvalid', 'enrol_self'); } } else { $plugin = enrol_get_plugin('self'); if ($plugin->get_config('showhint')) { $hint = core_text::substr($instance->password, 0, 1); $errors['enrolpassword'] = get_string('passwordinvalidhint', 'enrol_self', $hint); } else { $errors['enrolpassword'] = get_string('passwordinvalid', 'enrol_self'); } } } } return $errors; }