bb4dcfa64cfdfe8fb15f538ff87deff4b14c122c
[moodle.git] / rss / file.php
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/>.
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   moodlecore
25  * @copyright 1999 onwards Martin Dougiamas  http://moodle.com
26  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
27  */
30 // Disable moodle specific debug messages and any errors in output
31 define('NO_DEBUG_DISPLAY', true);//comment this out to see any error messages during RSS generation
33 // Sessions not used here, we recreate $USER every time we are called
34 define('NO_MOODLE_COOKIES', true);
36 require_once('../config.php');
37 require_once($CFG->libdir.'/filelib.php');
38 require_once($CFG->libdir.'/rsslib.php');
40 // RSS feeds must be enabled site-wide
41 if (empty($CFG->enablerssfeeds)) {
42     debugging('DISABLED (admin variables)');
43     rss_error();
44 }
47 // All the arguments are in the path
48 $relativepath = get_file_argument();
49 if (!$relativepath) {
50     rss_error();
51 }
54 // Extract relative path components into variables
55 $args = explode('/', trim($relativepath, '/'));
56 if (count($args) < 5) {
57     rss_error();
58 }
60 $contextid   = (int)$args[0];
61 $token  = clean_param($args[1], PARAM_ALPHANUM);
62 $componentname = clean_param($args[2], PARAM_FILE);
65 // Authenticate the user from the token
66 $userid = rss_get_userid_from_token($token);
67 if (!$userid) {
68     rss_error('rsserrorauth');
69 }
71 $user = get_complete_user_data('id', $userid);
72 session_set_user($user); //for login and capability checks
74 // Check the context actually exists
75 list($context, $course, $cm) = get_context_info_array($contextid);
77 if (!$context) {
78     rss_error();
79 }
80 $PAGE->set_context($context);
82 try {
83     $autologinguest = true;
84     $setwantsurltome = true;
85     $preventredirect = true;
86     require_login($course, $autologinguest, $cm, $setwantsurltome, $preventredirect);
87 } catch (Exception $e) {
88     rss_error('rsserrorauth');
89 }
91 // Work out which component in Moodle we want (from the frankenstyle name)
92 $componentdir = get_component_directory($componentname);
93 list($type, $plugin) = normalize_component($componentname);
96 // Call the component to check/update the feed and tell us the path to the cached file
97 $pathname = null;
99 if (file_exists($componentdir)) {
100     require_once("$componentdir/rsslib.php");
101     $functionname = $plugin.'_rss_get_feed';
103     if (function_exists($functionname)) {
104         // $pathname will be null if there was a problem (eg user doesn't have the necessary capabilities)
105         // NOTE:the component providing the feed must do its own capability checks and security
106         $pathname = $functionname($context, $args);
107     }
111 // Check that file exists
112 if (empty($pathname) || !file_exists($pathname)) {
113     rss_error();
116 // Send the RSS file to the user!
117 send_file($pathname, 'rss.xml', 3600);   // Cached by browsers for 1 hour
120 /*
121  * Sends an error formatted as an rss file and then dies
122  */
123 function rss_error($error='rsserror', $filename='rss.xml', $lifetime=0) {
124     send_file(rss_geterrorxmlfile($error), $filename, $lifetime, false, true);
125     exit;