[ Index ] |
PHP Cross Reference of Unnamed Project |
[Summary view] [Print] [Text view]
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 * jQuery serving script. 19 * 20 * Do not include jQuery scripts or CSS directly, always use 21 * $PAGE->requires->jquery() or $PAGE->requires->jquery_plugin('xx', 'yy'). 22 * 23 * @package core 24 * @copyright 2013 Petr Skoda {@link http://skodak.org} 25 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 26 */ 27 28 // Disable moodle specific debug messages and any errors in output, 29 // comment out when debugging or better look into error log! 30 define('NO_DEBUG_DISPLAY', true); 31 32 // We need just the values from config.php and minlib.php. 33 define('ABORT_AFTER_CONFIG', true); 34 require('../config.php'); // This stops immediately at the beginning of lib/setup.php. 35 36 if ($slashargument = min_get_slash_argument()) { 37 $path = ltrim($slashargument, '/'); 38 } else { 39 $path = min_optional_param('file', '', 'SAFEPATH'); 40 $path = ltrim($path, '/'); 41 } 42 43 if (strpos($path, '/') === false) { 44 jquery_file_not_found(); 45 } 46 47 list($component, $path) = explode('/', $path, 2); 48 49 if (empty($path) or empty($component)) { 50 jquery_file_not_found(); 51 } 52 53 // Find the jQuery dir for this component. 54 if ($component === 'core') { 55 $componentdir = "$CFG->dirroot/lib"; 56 57 } else if (strpos($component, 'theme_')) { 58 if (!empty($CFG->themedir)) { 59 $componentdir = "$CFG->themedir/$component"; 60 } else { 61 $componentdir = "$CFG->dirroot/theme/$component"; 62 } 63 64 } else { 65 $componentdir = core_component::get_component_directory($component); 66 } 67 68 if (!file_exists($componentdir) or !file_exists("$componentdir/jquery/plugins.php")) { 69 jquery_file_not_found(); 70 } 71 72 $file = realpath("$componentdir/jquery/$path"); 73 74 if (!$file or is_dir($file)) { 75 jquery_file_not_found(); 76 } 77 78 $etag = sha1("$component/$path"); 79 $lifetime = 60*60*24*120; // 120 days should be enough. 80 $pathinfo = pathinfo($path); 81 82 if (empty($pathinfo['extension'])) { 83 jquery_file_not_found(); 84 } 85 86 $filename = $pathinfo['filename'].'.'.$pathinfo['extension']; 87 88 switch($pathinfo['extension']) { 89 case 'gif' : $mimetype = 'image/gif'; 90 break; 91 case 'png' : $mimetype = 'image/png'; 92 break; 93 case 'jpg' : $mimetype = 'image/jpeg'; 94 break; 95 case 'jpeg' : $mimetype = 'image/jpeg'; 96 break; 97 case 'ico' : $mimetype = 'image/vnd.microsoft.icon'; 98 break; 99 case 'svg' : $mimetype = 'image/svg+xml'; 100 break; 101 case 'js' : $mimetype = 'application/javascript'; 102 break; 103 case 'css' : $mimetype = 'text/css'; 104 break; 105 case 'php' : jquery_file_not_found(); 106 break; 107 default : $mimetype = 'document/unknown'; 108 } 109 110 if (!empty($_SERVER['HTTP_IF_NONE_MATCH']) || !empty($_SERVER['HTTP_IF_MODIFIED_SINCE'])) { 111 // We do not actually need to verify the etag value because these files 112 // never change, devs need to change file names on update! 113 header('HTTP/1.1 304 Not Modified'); 114 header('Expires: '. gmdate('D, d M Y H:i:s', time() + $lifetime) .' GMT'); 115 header('Cache-Control: public, max-age='.$lifetime); 116 header('Content-Type: '.$mimetype); 117 header('Etag: "'.$etag.'"'); 118 die; 119 } 120 121 require_once("$CFG->dirroot/lib/xsendfilelib.php"); 122 123 header('Etag: "'.$etag.'"'); 124 header('Content-Disposition: inline; filename="'.$filename.'"'); 125 header('Last-Modified: '. gmdate('D, d M Y H:i:s', filemtime($file)) .' GMT'); 126 header('Expires: '. gmdate('D, d M Y H:i:s', time() + $lifetime) .' GMT'); 127 header('Pragma: '); 128 header('Cache-Control: public, max-age='.$lifetime); 129 header('Accept-Ranges: none'); 130 header('Content-Type: '.$mimetype); 131 132 if (xsendfile($file)) { 133 die; 134 } 135 136 if ($mimetype === 'text/css' or $mimetype === 'application/javascript') { 137 if (!min_enable_zlib_compression()) { 138 header('Content-Length: '.filesize($file)); 139 } 140 } else { 141 // No need to compress images. 142 header('Content-Length: '.filesize($file)); 143 } 144 145 readfile($file); 146 die; 147 148 149 150 function jquery_file_not_found() { 151 // Note: we can not disclose the exact file path here, sorry. 152 header('HTTP/1.0 404 not found'); 153 die('File was not found, sorry.'); 154 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Thu Aug 11 10:00:09 2016 | Cross-referenced by PHPXref 0.7.1 |