/** * Report user's activities to INTUITEL. * @param unknown $cmid * @param unknown $courseid * @param unknown $user_id * @param boolean $ignorelo whether to send LoId to INTUITEL (ignored in simulation mode) * @return Ambigous <string, lang_string, unknown, mixed> */ function block_intuitel_forward_learner_update_request($cmid, $courseid, $user_id, $ignorelo = false) { $debug = optional_param('debug', false, PARAM_BOOL); $debug_response = optional_param('debugresponse', null, PARAM_ALPHANUM); // this param instruct Intuitel mock objects to respond with a pre-recorded response. $mmid = Intuitel::getIDFactory()->getNewMessageUUID(); if (empty($cmid)) { $loId = Intuitel::getIDFactory()->getLoIdfromId('course', $courseid); } else { $loId = Intuitel::getIDFactory()->getLoIdfromId('module', $cmid); } // GET CURRENT USER id $userId = Intuitel::getIDFactory()->getUserId($user_id); global $CFG, $log; if ($ignorelo == true && get_config('block_intuitel', 'debug_server') == true) { $log->LogDebug("LMS send refreshing Learner message. Normal Learner procedure because in SIMULATED mode."); } if ($ignorelo == true && get_config('block_intuitel', 'debug_server') == false) { // Ignore reporting to INTUITEL. Just send a Learner message with no LoId to repeat reasoning // But simulated mode need loid to be sent $learnerUpdateMessage = '<INTUITEL>'; $learnerUpdateMessage .= ' <Learner mId="' . $mmid . '" uId="' . $userId->id . '" time="' . time() . '"/>'; $learnerUpdateMessage .= '</INTUITEL>'; $log->LogDebug("LMS send refreshing Learner message."); } else { // normal reporting of current and unreported events $log->LogDebug("LMS send normal Learner message for user {$userId->id}"); if (get_config('block_intuitel', 'report_from_logevent')) { // get events unreported since last polling $events_user = Intuitel::getAdaptorInstance()->getLearnerUpdateData(array($user_id)); $events = key_exists($userId->id, $events_user) ? $events_user[$userId->id] : null; } if (!get_config('block_intuitel', 'report_from_logevent') || !$events) { $event = new VisitEvent($userId, $loId, time()); $events = array($event); } $debug_param = get_config('block_intuitel', 'debug_server') ? 'debugcourse="' . $courseid . '"' : ''; // when using mock REST service help it with native courseid. $learnerUpdateMessage = '<INTUITEL>'; $log->LogDebug("LearnerUpdate: LMS has found " . count($events) . " events regarding user {$userId} ."); foreach ($events as $ev) { $learnerUpdateMessage .= ' <Learner mId="' . $mmid . '" uId="' . $ev->userId . '" loId="' . $ev->loId->id() . '" time="' . $ev->time . '" ' . $debug_param . '/>'; } $learnerUpdateMessage .= '</INTUITEL>'; } // disable_moodle_page_exception_handler(); $return = "No response from Intuitel"; $log->LogDebug("LMS sending: {$learnerUpdateMessage}"); try { $return = block_intuitel_submit_to_intuitel($learnerUpdateMessage, array('debugresponse' => $debug_response)); if ($debug) { debugging("<p> Response from INTUITEL was: <p><pre>{$return}</pre>", DEBUG_DEVELOPER); } $log->LogDebug("LearnerUpdate: INTUITEL response was: {$return}."); // parse and generate TUG AND LORE html and messages list($html, $intuitel_elements) = IntuitelController::ProcessUpdateLearnerRequest($return, $courseid); if (count($intuitel_elements->Learner->Tug) > 0) { $response = IntuitelXMLSerializer::getIntuitelXMLTemplate(); foreach ($intuitel_elements->Learner->Tug as $tug) { $mid = IntuitelXMLSerializer::get_required_attribute($tug, 'mId'); $text = str_replace('<![CDATA[', '', $tug->MData); $text = str_replace(']]>', '', $tug->MData); $text = strip_tags($text); Intuitel::getAdaptorInstance()->logTugView($courseid, $user_id, $mid, substr('mId=' . $mid . ' ' . $text, 0, 255)); IntuitelController::addTUGInmediateResponse($response, IntuitelXMLSerializer::get_required_attribute($tug, 'uId'), IntuitelXMLSerializer::get_required_attribute($tug, 'mId'), "OK"); } $xml = $response->asXML(); block_intuitel_submit_to_intuitel($xml); $log->LogDebug("TUG inmediate response sent: {$xml}"); } if (count($intuitel_elements->Learner->Lore) > 0) { $response = IntuitelXMLSerializer::getIntuitelXMLTemplate(); foreach ($intuitel_elements->Learner->Lore as $lore) { $mid = IntuitelXMLSerializer::get_required_attribute($lore, 'mId'); $lores = array(); foreach ($lore->LorePrio as $lorePrio) { try { $loid = IntuitelXMLSerializer::get_required_attribute($lorePrio, 'loId'); $cmid = Intuitel::getIDFactory()->getIdfromLoId(new LOId($loid)); $lo = Intuitel::getAdaptorInstance()->createLO(new LOId($loid)); $lores[] = "({$cmid})\"{$lo->loName}\""; } catch (Exception $ex) { $lores[] = $loid; } } if (count($lores)) { // log activity Intuitel::getAdaptorInstance()->logLoreView($courseid, $user_id, $mid, substr(join(',', $lores), 0, 255)); } $xml = IntuitelController::addLOREInmediateResponse($response, IntuitelXMLSerializer::get_required_attribute($lore, 'uId'), IntuitelXMLSerializer::get_required_attribute($lore, 'mId'), "OK"); } $xml = $response->asXML(); block_intuitel_submit_to_intuitel($xml); } $html = '<div>' . $html . '</div>'; } catch (ProtocolErrorException $exception) { // error $a = new stdClass(); $a->service_point = block_intuitel_get_service_endpoint(); $a->status_code = $exception->getStatusCode(); $a->message = $exception->getMessage(); $html = get_string('protocol_error_intuitel_node_malfunction', 'block_intuitel', $a); $log->LogError("INTUITEL error: {$a->message} Return value:" . $return); } return $html; }
public static function ProcessAuthRequest($xml) { global $log; $intuitel_elements = IntuitelController::getIntuitelXML($xml); $auths = IntuitelXMLSerializer::get_required_element($intuitel_elements, 'Authentication'); $response = null; $response = IntuitelXMLSerializer::getIntuitelXMLTemplate(); $global_validated = true; // As may be more than one auth request accumulate here de validation statusç $useridsvalidated = array(); foreach ($auths as $auth) { $uid = IntuitelXMLSerializer::get_required_attribute($auth, 'uId'); $mid = IntuitelXMLSerializer::get_required_attribute($auth, 'mId'); $paswd = (string) $auth->Pass; $user_id = new UserId((string) $uid); $adaptor = Intuitel::getAdaptorInstanceForCourse(); try { $user = $adaptor->getNativeUserFromUId($user_id); // Validate password $validated = $adaptor->authUser($user, $paswd); $useridsvalidated[] = $uid; $log->LogDebug("Sucessfull login request '{$mid}' for user: {$uid}"); } catch (UnknownUserException $ex) { $validated = false; $log->LogDebug("Failed login request '{$mid}' for user:{$uid}"); } catch (UnknownIDException $ex) { $validated = false; $log->LogDebug("Failed login request '{$mid}' for unknown user:{$uid}"); } if (!$validated) { $status = 'ERROR'; } else { $status = "OK"; } // OUTPUT Inmediate Response $auth_xml = $response->addChild('Authentication', null, INTUITEL_LMS_NAMESPACE_URI); $auth_xml->addAttribute('uId', $uid); $auth_xml->addAttribute('mId', $mid); $auth_xml->addAttribute('status', $status); // $response.="<Authentication uId=\"$uid\" mId=\"$mid\" status=\"$status\">"; if ($validated) { // get courses with proper capabilities $courses = $adaptor->getCoursesOwnedByUser($user_id); foreach ($courses as $course) { $loId = $course->getLoId()->id(); // $response.="<LoPerm loId=\"$loId\"/>"; $loperm_xml = $auth_xml->addChild('LoPerm', null, INTUITEL_LMS_NAMESPACE_URI); $loperm_xml->addAttribute('loId', $loId); } } // $response.="</Authentication>"; $global_validated &= $validated; } // $response.= "</INTUITEL>"; return array($global_validated, $useridsvalidated, IntuitelXMLSerializer::return_xml($response)); }