Beispiel #1
0
 /**
  * Performs synchronisation of member information and enrolments.
  *
  * @param stdClass $tool
  * @param ToolConsumer $consumer
  * @param User[] $members
  * @return array An array containing the number of members that were processed and the number of members that were enrolled.
  */
 protected function sync_member_information(stdClass $tool, ToolConsumer $consumer, $members)
 {
     global $DB;
     $usercount = 0;
     $enrolcount = 0;
     // Process member information.
     foreach ($members as $member) {
         $usercount++;
         // Set the user data.
         $user = new stdClass();
         $user->username = helper::create_username($consumer->getKey(), $member->ltiUserId);
         $user->firstname = core_user::clean_field($member->firstname, 'firstname');
         $user->lastname = core_user::clean_field($member->lastname, 'lastname');
         $user->email = core_user::clean_field($member->email, 'email');
         // Get the user data from the LTI consumer.
         $user = helper::assign_user_tool_data($tool, $user);
         $dbuser = core_user::get_user_by_username($user->username, 'id');
         if ($dbuser) {
             // If email is empty remove it, so we don't update the user with an empty email.
             if (empty($user->email)) {
                 unset($user->email);
             }
             $user->id = $dbuser->id;
             user_update_user($user);
             // Add the information to the necessary arrays.
             if (!in_array($user->id, $this->currentusers)) {
                 $this->currentusers[] = $user->id;
             }
             $this->userphotos[$user->id] = $member->image;
         } else {
             if ($this->should_sync_enrol($tool->membersyncmode)) {
                 // If the email was stripped/not set then fill it with a default one. This
                 // stops the user from being redirected to edit their profile page.
                 if (empty($user->email)) {
                     $user->email = $user->username . "@example.com";
                 }
                 $user->auth = 'lti';
                 $user->id = user_create_user($user);
                 // Add the information to the necessary arrays.
                 $this->currentusers[] = $user->id;
                 $this->userphotos[$user->id] = $member->image;
             }
         }
         // Sync enrolments.
         if ($this->should_sync_enrol($tool->membersyncmode)) {
             // Enrol the user in the course.
             if (helper::enrol_user($tool, $user->id) === helper::ENROLMENT_SUCCESSFUL) {
                 // Increment enrol count.
                 $enrolcount++;
             }
             // Check if this user has already been registered in the enrol_lti_users table.
             if (!$DB->record_exists('enrol_lti_users', ['toolid' => $tool->id, 'userid' => $user->id])) {
                 // Create an initial enrol_lti_user record that we can use later when syncing grades and members.
                 $userlog = new stdClass();
                 $userlog->userid = $user->id;
                 $userlog->toolid = $tool->id;
                 $userlog->consumerkey = $consumer->getKey();
                 $DB->insert_record('enrol_lti_users', $userlog);
             }
         }
     }
     return [$usercount, $enrolcount];
 }
 /**
  * Save tool consumer object.
  *
  * @param ToolConsumer $consumer Consumer object
  *
  * @return boolean True if the tool consumer object was successfully saved
  */
 public function saveToolConsumer($consumer)
 {
     $id = $consumer->getRecordId();
     $key = $consumer->getKey();
     $key256 = DataConnector::getConsumerKey($key);
     if ($key === $key256) {
         $key = null;
     }
     $protected = $consumer->protected ? 1 : 0;
     $enabled = $consumer->enabled ? 1 : 0;
     $profile = !empty($consumer->profile) ? json_encode($consumer->profile) : null;
     $settingsValue = serialize($consumer->getSettings());
     $time = time();
     $now = date("{$this->dateFormat} {$this->timeFormat}", $time);
     $from = null;
     if (!is_null($consumer->enableFrom)) {
         $from = date("{$this->dateFormat} {$this->timeFormat}", $consumer->enableFrom);
     }
     $until = null;
     if (!is_null($consumer->enableUntil)) {
         $until = date("{$this->dateFormat} {$this->timeFormat}", $consumer->enableUntil);
     }
     $last = null;
     if (!is_null($consumer->lastAccess)) {
         $last = date($this->dateFormat, $consumer->lastAccess);
     }
     if (empty($id)) {
         $sql = sprintf("INSERT INTO {$this->dbTableNamePrefix}" . DataConnector::CONSUMER_TABLE_NAME . ' (consumer_key256, consumer_key, name, ' . 'secret, lti_version, consumer_name, consumer_version, consumer_guid, profile, tool_proxy, settings, protected, enabled, ' . 'enable_from, enable_until, last_access, created, updated) ' . 'VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %d, %d, %s, %s, %s, %s, %s)', DataConnector::quoted($key256), DataConnector::quoted($key), DataConnector::quoted($consumer->name), DataConnector::quoted($consumer->secret), DataConnector::quoted($consumer->ltiVersion), DataConnector::quoted($consumer->consumerName), DataConnector::quoted($consumer->consumerVersion), DataConnector::quoted($consumer->consumerGuid), DataConnector::quoted($profile), DataConnector::quoted($consumer->toolProxy), DataConnector::quoted($settingsValue), $protected, $enabled, DataConnector::quoted($from), DataConnector::quoted($until), DataConnector::quoted($last), DataConnector::quoted($now), DataConnector::quoted($now));
     } else {
         $sql = sprintf("UPDATE {$this->dbTableNamePrefix}" . DataConnector::CONSUMER_TABLE_NAME . ' SET ' . 'consumer_key256 = %s, consumer_key = %s, ' . 'name = %s, secret= %s, lti_version = %s, consumer_name = %s, consumer_version = %s, consumer_guid = %s, ' . 'profile = %s, tool_proxy = %s, settings = %s, ' . 'protected = %d, enabled = %d, enable_from = %s, enable_until = %s, last_access = %s, updated = %s ' . 'WHERE consumer_pk = %d', DataConnector::quoted($key256), DataConnector::quoted($key), DataConnector::quoted($consumer->name), DataConnector::quoted($consumer->secret), DataConnector::quoted($consumer->ltiVersion), DataConnector::quoted($consumer->consumerName), DataConnector::quoted($consumer->consumerVersion), DataConnector::quoted($consumer->consumerGuid), DataConnector::quoted($profile), DataConnector::quoted($consumer->toolProxy), DataConnector::quoted($settingsValue), $protected, $enabled, DataConnector::quoted($from), DataConnector::quoted($until), DataConnector::quoted($last), DataConnector::quoted($now), $consumer->getRecordId());
     }
     $ok = mysql_query($sql);
     if ($ok) {
         if (empty($id)) {
             $consumer->setRecordId(mysql_insert_id());
             $consumer->created = $time;
         }
         $consumer->updated = $time;
     }
     return $ok;
 }
Beispiel #3
0
 /**
  * Save tool consumer object.
  *
  * @param ToolConsumer $consumer Consumer object
  * @return boolean True if the tool consumer object was successfully saved
  */
 public function saveToolConsumer($consumer)
 {
     global $DB;
     $key = $consumer->getKey();
     $key256 = DataConnector::getConsumerKey($key);
     if ($key === $key256) {
         $key = null;
     }
     $protected = $consumer->protected ? 1 : 0;
     $enabled = $consumer->enabled ? 1 : 0;
     $profile = !empty($consumer->profile) ? json_encode($consumer->profile) : null;
     $settingsvalue = serialize($consumer->getSettings());
     $now = time();
     $consumer->updated = $now;
     $data = ['consumerkey256' => $key256, 'consumerkey' => $key, 'name' => $consumer->name, 'secret' => $consumer->secret, 'ltiversion' => $consumer->ltiVersion, 'consumername' => $consumer->consumerName, 'consumerversion' => $consumer->consumerVersion, 'consumerguid' => $consumer->consumerGuid, 'profile' => $profile, 'toolproxy' => $consumer->toolProxy, 'settings' => $settingsvalue, 'protected' => $protected, 'enabled' => $enabled, 'enablefrom' => $consumer->enableFrom, 'enableuntil' => $consumer->enableUntil, 'lastaccess' => $consumer->lastAccess, 'updated' => $consumer->updated];
     $id = $consumer->getRecordId();
     if (empty($id)) {
         $consumer->created = $now;
         $data['created'] = $consumer->created;
         $id = $DB->insert_record($this->consumertable, (object) $data);
         if ($id) {
             $consumer->setRecordId($id);
             return true;
         }
     } else {
         $data['id'] = $id;
         return $DB->update_record($this->consumertable, (object) $data);
     }
     return false;
 }
Beispiel #4
0
 /**
  * Check if a share arrangement is in place.
  *
  * @return boolean True if no error is reported
  */
 private function checkForShare()
 {
     $ok = true;
     $doSaveResourceLink = true;
     $id = $this->resourceLink->primaryResourceLinkId;
     $shareRequest = isset($_POST['custom_share_key']) && !empty($_POST['custom_share_key']);
     if ($shareRequest) {
         if (!$this->allowSharing) {
             $ok = false;
             $this->reason = 'Your sharing request has been refused because sharing is not being permitted.';
         } else {
             // Check if this is a new share key
             $shareKey = new ResourceLinkShareKey($this->resourceLink, $_POST['custom_share_key']);
             if (!is_null($shareKey->primaryConsumerKey) && !is_null($shareKey->primaryResourceLinkId)) {
                 // Update resource link with sharing primary resource link details
                 $key = $shareKey->primaryConsumerKey;
                 $id = $shareKey->primaryResourceLinkId;
                 $ok = $key !== $this->consumer->getKey() || $id != $this->resourceLink->getId();
                 if ($ok) {
                     $this->resourceLink->primaryConsumerKey = $key;
                     $this->resourceLink->primaryResourceLinkId = $id;
                     $this->resourceLink->shareApproved = $shareKey->autoApprove;
                     $ok = $this->resourceLink->save();
                     if ($ok) {
                         $doSaveResourceLink = false;
                         $this->user->getResourceLink()->primaryConsumerKey = $key;
                         $this->user->getResourceLink()->primaryResourceLinkId = $id;
                         $this->user->getResourceLink()->shareApproved = $shareKey->autoApprove;
                         $this->user->getResourceLink()->updated = time();
                         // Remove share key
                         $shareKey->delete();
                     } else {
                         $this->reason = 'An error occurred initialising your share arrangement.';
                     }
                 } else {
                     $this->reason = 'It is not possible to share your resource link with yourself.';
                 }
             }
             if ($ok) {
                 $ok = !is_null($key);
                 if (!$ok) {
                     $this->reason = 'You have requested to share a resource link but none is available.';
                 } else {
                     $ok = !is_null($this->user->getResourceLink()->shareApproved) && $this->user->getResourceLink()->shareApproved;
                     if (!$ok) {
                         $this->reason = 'Your share request is waiting to be approved.';
                     }
                 }
             }
         }
     } else {
         // Check no share is in place
         $ok = is_null($id);
         if (!$ok) {
             $this->reason = 'You have not requested to share a resource link but an arrangement is currently in place.';
         }
     }
     // Look up primary resource link
     if ($ok && !is_null($id)) {
         $consumer = new ToolConsumer($key, $this->dataConnector);
         $ok = !is_null($consumer->created);
         if ($ok) {
             $resourceLink = ResourceLink::fromConsumer($consumer, $id);
             $ok = !is_null($resourceLink->created);
         }
         if ($ok) {
             if ($doSaveResourceLink) {
                 $this->resourceLink->save();
             }
             $this->resourceLink = $resourceLink;
         } else {
             $this->reason = 'Unable to load resource link being shared.';
         }
     }
     return $ok;
 }
 /**
  * Save tool consumer object.
  *
  * @param ToolConsumer $consumer Consumer object
  *
  * @return boolean True if the tool consumer object was successfully saved
  */
 public function saveToolConsumer($consumer)
 {
     $id = $consumer->getRecordId();
     $key = $consumer->getKey();
     $key256 = $this->getConsumerKey($key);
     if ($key === $key256) {
         $key = null;
     }
     $protected = $consumer->protected ? 1 : 0;
     $enabled = $consumer->enabled ? 1 : 0;
     $profile = !empty($consumer->profile) ? json_encode($consumer->profile) : null;
     $settingsValue = serialize($consumer->getSettings());
     $time = time();
     $now = date("{$this->dateFormat} {$this->timeFormat}", $time);
     $from = null;
     if (!is_null($consumer->enableFrom)) {
         $from = date("{$this->dateFormat} {$this->timeFormat}", $consumer->enableFrom);
     }
     $until = null;
     if (!is_null($consumer->enableUntil)) {
         $until = date("{$this->dateFormat} {$this->timeFormat}", $consumer->enableUntil);
     }
     $last = null;
     if (!is_null($consumer->lastAccess)) {
         $last = date($this->dateFormat, $consumer->lastAccess);
     }
     if (empty($id)) {
         $sql = "INSERT INTO {$this->dbTableNamePrefix}" . DataConnector::CONSUMER_TABLE_NAME . ' (consumer_key256, consumer_key, name, ' . 'secret, lti_version, consumer_name, consumer_version, consumer_guid, profile, tool_proxy, settings, protected, enabled, ' . 'enable_from, enable_until, last_access, created, updated) ' . 'VALUES (:key256, :key, :name, :secret, :lti_version, :consumer_name, :consumer_version, :consumer_guid, :profile, :tool_proxy, :settings, ' . ':protected, :enabled, :enable_from, :enable_until, :last_access, :created, :updated)';
         $query = $this->db->prepare($sql);
         $query->bindValue('key256', $key256, PDO::PARAM_STR);
         $query->bindValue('key', $key, PDO::PARAM_STR);
         $query->bindValue('name', $consumer->name, PDO::PARAM_STR);
         $query->bindValue('secret', $consumer->secret, PDO::PARAM_STR);
         $query->bindValue('lti_version', $consumer->ltiVersion, PDO::PARAM_STR);
         $query->bindValue('consumer_name', $consumer->consumerName, PDO::PARAM_STR);
         $query->bindValue('consumer_version', $consumer->consumerVersion, PDO::PARAM_STR);
         $query->bindValue('consumer_guid', $consumer->consumerGuid, PDO::PARAM_STR);
         $query->bindValue('profile', $profile, PDO::PARAM_STR);
         $query->bindValue('tool_proxy', $consumer->toolProxy, PDO::PARAM_STR);
         $query->bindValue('settings', $settingsValue, PDO::PARAM_STR);
         $query->bindValue('protected', $protected, PDO::PARAM_INT);
         $query->bindValue('enabled', $enabled, PDO::PARAM_INT);
         $query->bindValue('enable_from', $from, PDO::PARAM_STR);
         $query->bindValue('enable_until', $until, PDO::PARAM_STR);
         $query->bindValue('last_access', $last, PDO::PARAM_STR);
         $query->bindValue('created', $now, PDO::PARAM_STR);
         $query->bindValue('updated', $now, PDO::PARAM_STR);
     } else {
         $sql = 'UPDATE ' . $this->dbTableNamePrefix . DataConnector::CONSUMER_TABLE_NAME . ' ' . 'SET consumer_key256 = :key256, consumer_key = :key, name = :name, secret = :secret, lti_version = :lti_version, ' . 'consumer_name = :consumer_name, consumer_version = :consumer_version, consumer_guid = :consumer_guid, ' . 'profile = :profile, tool_proxy = :tool_proxy, settings = :settings, ' . 'protected = :protected, enabled = :enabled, enable_from = :enable_from, enable_until = :enable_until, last_access = :last_access, updated = :updated ' . 'WHERE consumer_pk = :id';
         $query = $this->db->prepare($sql);
         $query->bindValue('key256', $key256, PDO::PARAM_STR);
         $query->bindValue('key', $key, PDO::PARAM_STR);
         $query->bindValue('name', $consumer->name, PDO::PARAM_STR);
         $query->bindValue('secret', $consumer->secret, PDO::PARAM_STR);
         $query->bindValue('lti_version', $consumer->ltiVersion, PDO::PARAM_STR);
         $query->bindValue('consumer_name', $consumer->consumerName, PDO::PARAM_STR);
         $query->bindValue('consumer_version', $consumer->consumerVersion, PDO::PARAM_STR);
         $query->bindValue('consumer_guid', $consumer->consumerGuid, PDO::PARAM_STR);
         $query->bindValue('profile', $profile, PDO::PARAM_STR);
         $query->bindValue('tool_proxy', $consumer->toolProxy, PDO::PARAM_STR);
         $query->bindValue('settings', $settingsValue, PDO::PARAM_STR);
         $query->bindValue('protected', $protected, PDO::PARAM_INT);
         $query->bindValue('enabled', $enabled, PDO::PARAM_INT);
         $query->bindValue('enable_from', $from, PDO::PARAM_STR);
         $query->bindValue('enable_until', $until, PDO::PARAM_STR);
         $query->bindValue('last_access', $last, PDO::PARAM_STR);
         $query->bindValue('updated', $now, PDO::PARAM_STR);
         $query->bindValue('id', $id, PDO::PARAM_INT);
     }
     $ok = $query->execute();
     if ($ok) {
         if (empty($id)) {
             $consumer->setRecordId(intval($this->db->lastInsertId()));
             $consumer->created = $time;
         }
         $consumer->updated = $time;
     }
     return $ok;
 }