[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/rss/ -> file.php (source)

   1  <?php
   2  // This file is part of Moodle - http://moodle.org/
   3  //
   4  // Moodle is free software: you can redistribute it and/or modify
   5  // it under the terms of the GNU General Public License as published by
   6  // the Free Software Foundation, either version 3 of the License, or
   7  // (at your option) any later version.
   8  //
   9  // Moodle is distributed in the hope that it will be useful,
  10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
  11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12  // GNU General Public License for more details.
  13  //
  14  // You should have received a copy of the GNU General Public License
  15  // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
  16  
  17  /**
  18   * rss/file.php - entry point to serve rss streams
  19   *
  20   * This script simply checks the parameters to construct a $USER
  21   * then finds and calls a function in the relevant component to
  22   * actually check security and create the RSS stream
  23   *
  24   * @package    core_rss
  25   * @category   rss
  26   * @copyright  1999 onwards Martin Dougiamas {@link http://moodle.com}
  27   * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
  28   */
  29  
  30  /** NO_DEBUG_DISPLAY - bool, Disable moodle debug and error messages. Set to false to see any errors during RSS generation */
  31  define('NO_DEBUG_DISPLAY', true);
  32  
  33  /** NO_MOODLE_COOKIES - bool, Disable the use of sessions/cookies - we recreate $USER for every call. */
  34  define('NO_MOODLE_COOKIES', true);
  35  
  36  require_once('../config.php');
  37  require_once($CFG->libdir.'/filelib.php');
  38  require_once($CFG->libdir.'/rsslib.php');
  39  
  40  // RSS feeds must be enabled site-wide.
  41  if (empty($CFG->enablerssfeeds)) {
  42      rss_error();
  43  }
  44  
  45  // All the arguments are in the path.
  46  $relativepath = get_file_argument();
  47  if (!$relativepath) {
  48      rss_error();
  49  }
  50  
  51  // Extract relative path components into variables.
  52  $args = explode('/', trim($relativepath, '/'));
  53  if (count($args) < 5) {
  54      rss_error();
  55  }
  56  
  57  $contextid   = (int)$args[0];
  58  $token  = clean_param($args[1], PARAM_ALPHANUM);
  59  $componentname = clean_param($args[2], PARAM_FILE);
  60  
  61  // Check if they have requested a 1.9 RSS feed.
  62  // If token is an int it is a user id (1.9 request).
  63  // If token contains any letters it is a token (2.0 request).
  64  $inttoken = intval($token);
  65  if ($token === "$inttoken") {
  66      // They have requested a feed using a 1.9 url. redirect them to the 2.0 url using the guest account.
  67  
  68      $instanceid  = clean_param($args[3], PARAM_INT);
  69  
  70      // 1.9 URL puts course id where the context id is in 2.0 URLs.
  71      $courseid = $contextid;
  72      unset($contextid);
  73  
  74      // Find the context id.
  75      if ($course = $DB->get_record('course', array('id' => $courseid))) {
  76          $modinfo = get_fast_modinfo($course);
  77  
  78          foreach ($modinfo->get_instances_of($componentname) as $modinstanceid => $cm) {
  79              if ($modinstanceid == $instanceid) {
  80                  $context = context_module::instance($cm->id, IGNORE_MISSING);
  81                  break;
  82              }
  83          }
  84      }
  85  
  86      if (empty($context)) {
  87          // This shouldnt happen. something bad is going on.
  88          rss_error();
  89      }
  90  
  91      // Make sure that $CFG->siteguest is set.
  92      if (empty($CFG->siteguest)) {
  93          if (!$guestid = $DB->get_field('user', 'id', array('username' => 'guest', 'mnethostid' => $CFG->mnet_localhost_id))) {
  94              // Guest does not exist yet, weird.
  95              rss_error();
  96          }
  97          set_config('siteguest', $guestid);
  98      }
  99      $guesttoken = rss_get_token($CFG->siteguest);
 100  
 101      // Change forum to mod_forum (for example).
 102      $componentname = 'mod_'.$componentname;
 103  
 104      $url = $PAGE->url;
 105      $url->set_slashargument("/{$context->id}/$guesttoken/$componentname/$instanceid/rss.xml");
 106  
 107      // Redirect to the 2.0 rss URL.
 108      redirect($url);
 109  } else {
 110      // Authenticate the user from the token.
 111      $userid = rss_get_userid_from_token($token);
 112      if (!$userid) {
 113          rss_error('rsserrorauth', 'rss.xml', 0, '403 Forbidden');
 114      }
 115  }
 116  
 117  // Check the context actually exists.
 118  list($context, $course, $cm) = get_context_info_array($contextid);
 119  
 120  $PAGE->set_context($context);
 121  
 122  $user = get_complete_user_data('id', $userid);
 123  
 124  // Let enrol plugins deal with new enrolments if necessary.
 125  enrol_check_plugins($user);
 126  
 127  \core\session\manager::set_user($user); // For login and capability checks.
 128  
 129  try {
 130      $autologinguest = true;
 131      $setwantsurltome = true;
 132      $preventredirect = true;
 133      require_course_login($course, $autologinguest, $cm, $setwantsurltome, $preventredirect);
 134  } catch (Exception $e) {
 135      if (isguestuser()) {
 136          rss_error('rsserrorguest', 'rss.xml', 0, '403 Forbidden');
 137      } else {
 138          rss_error('rsserrorauth', 'rss.xml', 0, '403 Forbidden');
 139      }
 140  }
 141  
 142  // Work out which component in Moodle we want (from the frankenstyle name).
 143  $componentdir = core_component::get_component_directory($componentname);
 144  list($type, $plugin) = core_component::normalize_component($componentname);
 145  
 146  // Call the component to check/update the feed and tell us the path to the cached file.
 147  $pathname = null;
 148  
 149  if (file_exists($componentdir)) {
 150      require_once("$componentdir/rsslib.php");
 151      $functionname = $plugin.'_rss_get_feed';
 152  
 153      if (function_exists($functionname)) {
 154          // The $pathname will be null if there was a problem (eg user doesn't have the necessary capabilities).
 155          // NOTE:the component providing the feed must do its own capability checks and security.
 156          try {
 157              $pathname = $functionname($context, $args);
 158          } catch (Exception $e) {
 159              rss_error('rsserror');
 160          }
 161      }
 162  }
 163  
 164  // Check that file exists.
 165  if (empty($pathname) || !file_exists($pathname)) {
 166      rss_error();
 167  }
 168  
 169  // Send the RSS file to the user!
 170  send_file($pathname, 'rss.xml', 3600);   // Cached by browsers for 1 hour.
 171  
 172  /**
 173   * Sends an error formatted as an rss file and then exits
 174   *
 175   * @package core_rss
 176   * @category rss
 177   *
 178   * @param string $error the error type, default is rsserror
 179   * @param string $filename the name of the file to created
 180   * @param int $unused
 181   * @param string $statuscode http 1.1 statuscode indicicating the error
 182   * @uses exit
 183   */
 184  function rss_error($error='rsserror', $filename='rss.xml', $unused=0, $statuscode='404 Not Found') {
 185      header("HTTP/1.1 $statuscode");
 186      header('Content-Disposition: inline; filename="'.$filename.'"');
 187      header('Content-Type: application/xml');
 188      echo rss_geterrorxmlfile($error);
 189      exit;
 190  }


Generated: Thu Aug 11 10:00:09 2016 Cross-referenced by PHPXref 0.7.1