original_string: protected static function validate_attempt($params, $checkaccessrules = true, $failifoverdue = true) {
          global $USER;
  
          $attemptobj = quiz_attempt::create($params['attemptid']);
  
          $context = context_module::instance($attemptobj->get_cm()->id);
          self::validate_context($context);
  
          // Check that this attempt belongs to this user.
          if ($attemptobj->get_userid() != $USER->id) {
              throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'notyourattempt');
          }
  
          // General capabilities check.
          $ispreviewuser = $attemptobj->is_preview_user();
          if (!$ispreviewuser) {
              $attemptobj->require_capability('mod/quiz:attempt');
          }
  
          // Check the access rules.
          $accessmanager = $attemptobj->get_access_manager(time());
          $messages = array();
          if ($checkaccessrules) {
              // If the attempt is now overdue, or abandoned, deal with that.
              $attemptobj->handle_if_time_expired(time(), true);
  
              $messages = $accessmanager->prevent_access();
              if (!$ispreviewuser && $messages) {
                  throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'attempterror');
              }
          }
  
          // Attempt closed?.
          if ($attemptobj->is_finished()) {
              throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'attemptalreadyclosed');
          } else if ($failifoverdue && $attemptobj->get_state() == quiz_attempt::OVERDUE) {
              throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'stateoverdue');
          }
  
          // User submitted data (like the quiz password).
          if ($accessmanager->is_preflight_check_required($attemptobj->get_attemptid())) {
              $provideddata = array();
              foreach ($params['preflightdata'] as $data) {
                  $provideddata[$data['name']] = $data['value'];
              }
  
              $errors = $accessmanager->validate_preflight_check($provideddata, [], $params['attemptid']);
              if (!empty($errors)) {
                  throw new moodle_quiz_exception($attemptobj->get_quizobj(), array_shift($errors));
              }
              // Pre-flight check passed.
              $accessmanager->notify_preflight_check_passed($params['attemptid']);
          }
  
          if (isset($params['page'])) {
              // Check if the page is out of range.
              if ($params['page'] != $attemptobj->force_page_number_into_range($params['page'])) {
                  throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'Invalid page number');
              }
  
              // Prevent out of sequence access.
              if (!$attemptobj->check_page_access($params['page'])) {
                  throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'Out of sequence access');
              }
  
              // Check slots.
              $slots = $attemptobj->get_slots($params['page']);
  
              if (empty($slots)) {
                  throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'noquestionsfound');
              }
          }
  
          return array($attemptobj, $messages);
      }
code: protected static function validate_attempt($params, $checkaccessrules = true, $failifoverdue = true) {
          global $USER;
  
          $attemptobj = quiz_attempt::create($params['attemptid']);
  
          $context = context_module::instance($attemptobj->get_cm()->id);
          self::validate_context($context);
  
          // Check that this attempt belongs to this user.
          if ($attemptobj->get_userid() != $USER->id) {
              throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'notyourattempt');
          }
  
          // General capabilities check.
          $ispreviewuser = $attemptobj->is_preview_user();
          if (!$ispreviewuser) {
              $attemptobj->require_capability('mod/quiz:attempt');
          }
  
          // Check the access rules.
          $accessmanager = $attemptobj->get_access_manager(time());
          $messages = array();
          if ($checkaccessrules) {
              // If the attempt is now overdue, or abandoned, deal with that.
              $attemptobj->handle_if_time_expired(time(), true);
  
              $messages = $accessmanager->prevent_access();
              if (!$ispreviewuser && $messages) {
                  throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'attempterror');
              }
          }
  
          // Attempt closed?.
          if ($attemptobj->is_finished()) {
              throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'attemptalreadyclosed');
          } else if ($failifoverdue && $attemptobj->get_state() == quiz_attempt::OVERDUE) {
              throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'stateoverdue');
          }
  
          // User submitted data (like the quiz password).
          if ($accessmanager->is_preflight_check_required($attemptobj->get_attemptid())) {
              $provideddata = array();
              foreach ($params['preflightdata'] as $data) {
                  $provideddata[$data['name']] = $data['value'];
              }
  
              $errors = $accessmanager->validate_preflight_check($provideddata, [], $params['attemptid']);
              if (!empty($errors)) {
                  throw new moodle_quiz_exception($attemptobj->get_quizobj(), array_shift($errors));
              }
              // Pre-flight check passed.
              $accessmanager->notify_preflight_check_passed($params['attemptid']);
          }
  
          if (isset($params['page'])) {
              // Check if the page is out of range.
              if ($params['page'] != $attemptobj->force_page_number_into_range($params['page'])) {
                  throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'Invalid page number');
              }
  
              // Prevent out of sequence access.
              if (!$attemptobj->check_page_access($params['page'])) {
                  throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'Out of sequence access');
              }
  
              // Check slots.
              $slots = $attemptobj->get_slots($params['page']);
  
              if (empty($slots)) {
                  throw new moodle_quiz_exception($attemptobj->get_quizobj(), 'noquestionsfound');
              }
          }
  
          return array($attemptobj, $messages);
      }
code_tokens: protected static function validate_attempt ( $ params , $ checkaccessrules = true , $ failifoverdue = true ) { global $ USER ; $ attemptobj = quiz_attempt :: create ( $ params [ 'attemptid' ] ) ; $ context = context_module :: instance ( $ attemptobj -> get_cm ( ) -> id ) ; self :: validate_context ( $ context ) ; // Check that this attempt belongs to this user. if ( $ attemptobj -> get_userid ( ) != $ USER -> id ) { throw new moodle_quiz_exception ( $ attemptobj -> get_quizobj ( ) , 'notyourattempt' ) ; } // General capabilities check. $ ispreviewuser = $ attemptobj -> is_preview_user ( ) ; if ( ! $ ispreviewuser ) { $ attemptobj -> require_capability ( 'mod/quiz:attempt' ) ; } // Check the access rules. $ accessmanager = $ attemptobj -> get_access_manager ( time ( ) ) ; $ messages = array ( ) ; if ( $ checkaccessrules ) { // If the attempt is now overdue, or abandoned, deal with that. $ attemptobj -> handle_if_time_expired ( time ( ) , true ) ; $ messages = $ accessmanager -> prevent_access ( ) ; if ( ! $ ispreviewuser && $ messages ) { throw new moodle_quiz_exception ( $ attemptobj -> get_quizobj ( ) , 'attempterror' ) ; } } // Attempt closed?. if ( $ attemptobj -> is_finished ( ) ) { throw new moodle_quiz_exception ( $ attemptobj -> get_quizobj ( ) , 'attemptalreadyclosed' ) ; } else if ( $ failifoverdue && $ attemptobj -> get_state ( ) == quiz_attempt :: OVERDUE ) { throw new moodle_quiz_exception ( $ attemptobj -> get_quizobj ( ) , 'stateoverdue' ) ; } // User submitted data (like the quiz password). if ( $ accessmanager -> is_preflight_check_required ( $ attemptobj -> get_attemptid ( ) ) ) { $ provideddata = array ( ) ; foreach ( $ params [ 'preflightdata' ] as $ data ) { $ provideddata [ $ data [ 'name' ] ] = $ data [ 'value' ] ; } $ errors = $ accessmanager -> validate_preflight_check ( $ provideddata , [ ] , $ params [ 'attemptid' ] ) ; if ( ! empty ( $ errors ) ) { throw new moodle_quiz_exception ( $ attemptobj -> get_quizobj ( ) , array_shift ( $ errors ) ) ; } // Pre-flight check passed. $ accessmanager -> notify_preflight_check_passed ( $ params [ 'attemptid' ] ) ; } if ( isset ( $ params [ 'page' ] ) ) { // Check if the page is out of range. if ( $ params [ 'page' ] != $ attemptobj -> force_page_number_into_range ( $ params [ 'page' ] ) ) { throw new moodle_quiz_exception ( $ attemptobj -> get_quizobj ( ) , 'Invalid page number' ) ; } // Prevent out of sequence access. if ( ! $ attemptobj -> check_page_access ( $ params [ 'page' ] ) ) { throw new moodle_quiz_exception ( $ attemptobj -> get_quizobj ( ) , 'Out of sequence access' ) ; } // Check slots. $ slots = $ attemptobj -> get_slots ( $ params [ 'page' ] ) ; if ( empty ( $ slots ) ) { throw new moodle_quiz_exception ( $ attemptobj -> get_quizobj ( ) , 'noquestionsfound' ) ; } } return array ( $ attemptobj , $ messages ) ; }
docstring: Utility function for validating a given attempt
  
  @param  array $params array of parameters including the attemptid and preflight data
  @param  bool $checkaccessrules whether to check the quiz access rules or not
  @param  bool $failifoverdue whether to return error if the attempt is overdue
  @return  array containing the attempt object and access messages
  @throws moodle_quiz_exception
  @since  Moodle 3.1
docstring_tokens: Utility function for validating a given attempt