This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | |||
3 | use Xmf\Request; |
||
4 | |||
5 | /* |
||
6 | * getthumb |
||
7 | * |
||
8 | * @copyright Geekwright, LLC http://geekwright.com |
||
9 | * @license GNU General Public License (GPL) |
||
10 | * @since 1.0 |
||
11 | * @author Richard Griffith [email protected] |
||
12 | * @package gwiki |
||
13 | * |
||
14 | * Manage thumbnail cache. Expects gwiki_page_images keyword as page and |
||
15 | * image_name as name, also optional maximal pixel dimension as size. |
||
16 | * |
||
17 | * Thumbnails are generated for requested size on use, and then served |
||
18 | * from cache until source image is changed. |
||
19 | * |
||
20 | * Images which are smaller than requested size, or of an unsupported |
||
21 | * format (currently only jpeg, png and gif are supported,) are served |
||
22 | * as original source. |
||
23 | * |
||
24 | */ |
||
25 | |||
26 | include __DIR__ . '/../../mainfile.php'; |
||
27 | $xoopsLogger->activated = false; |
||
28 | // provide error logging for our sanity in debugging (won't see xoops logger) |
||
29 | restore_error_handler(); |
||
30 | error_reporting(-1); |
||
31 | |||
32 | //$GLOBALS['xoopsOption']['template_main'] = 'gwiki_view.tpl'; |
||
33 | //include XOOPS_ROOT_PATH."/header.php"; |
||
34 | |||
35 | $dir = basename(__DIR__); |
||
36 | include_once XOOPS_ROOT_PATH . '/modules/' . $dir . '/class/GwikiPage.php'; |
||
37 | $wikiPage = new GwikiPage; |
||
38 | |||
39 | $default_thumb_size = $wikiPage->defaultThumbSize; |
||
40 | |||
41 | global $xoopsDB; |
||
42 | |||
43 | /** |
||
44 | * @param $msg |
||
45 | */ |
||
46 | function errorExit($msg) |
||
47 | { |
||
48 | header('Status: 500 Internal Error - ' . $msg); |
||
49 | echo $msg; |
||
50 | exit; |
||
51 | } |
||
52 | |||
53 | /** |
||
54 | * @param $string |
||
55 | * |
||
56 | * @return string |
||
57 | */ |
||
58 | View Code Duplication | function cleaner($string) |
|
59 | { |
||
60 | $string = stripcslashes($string); |
||
61 | $string = html_entity_decode($string); |
||
62 | $string = strip_tags($string); // DANGER -- kills wiki text |
||
63 | $string = trim($string); |
||
64 | $string = stripslashes($string); |
||
65 | |||
66 | return $string; |
||
67 | } |
||
68 | |||
69 | /** |
||
70 | * @param $name |
||
71 | * @param $mime |
||
72 | * @param $modtime |
||
73 | * @param bool $nocache |
||
74 | */ |
||
75 | function serveFile($name, $mime, $modtime, $nocache = false) |
||
76 | { |
||
77 | if (!$nocache && (getenv('HTTP_IF_MODIFIED_SINCE') === gmdate('D, d M Y H:i:s', $modtime) . ' GMT')) { |
||
78 | header('HTTP/1.0 304 Not Modified'); |
||
79 | exit; |
||
80 | } |
||
81 | |||
82 | $fp = fopen($name, 'rb'); |
||
83 | |||
84 | header('Content-Type: ' . $mime); |
||
85 | header('Content-Disposition: inline; filename=' . urlencode(basename($name))); |
||
86 | header('Content-Length: ' . filesize($name)); |
||
87 | |||
88 | $seconds_to_cache = 3600; |
||
89 | $ts = gmdate('D, d M Y H:i:s', time() + $seconds_to_cache) . ' GMT'; |
||
90 | header("Expires: $ts"); |
||
91 | header('Pragma: cache'); |
||
92 | header("Cache-Control: max-age=$seconds_to_cache"); |
||
93 | header('last-modified: ' . gmdate('D, d M Y H:i:s', $modtime) . ' GMT'); |
||
94 | |||
95 | fpassthru($fp); |
||
96 | fclose($fp); |
||
97 | exit; |
||
98 | } |
||
99 | |||
100 | unset($page, $name, $size); |
||
101 | $page = Request::getString('page', '', 'get'); |
||
102 | $name = Request::getString('name', '', 'get'); |
||
103 | $size = Request::getInt('size', $default_thumb_size, 'get'); |
||
104 | |||
105 | if (empty($page) || empty($name)) { |
||
106 | errorExit('parameter missing'); |
||
107 | } |
||
108 | if (empty($size) || $size === 0) { |
||
109 | $size = $default_thumb_size; |
||
110 | } |
||
111 | |||
112 | $strategy = 0; |
||
113 | $strategy_no_thumb = 1; // no thumb possible or needed - pass original image |
||
114 | $strategy_old_thumb = 2; // send existing thumbnail image |
||
115 | $strategy_new_thumb = 3; // generate and pass new thumbnail |
||
116 | |||
117 | $image = $wikiPage->getPageImage($page, $name); |
||
118 | if (!$image) { |
||
119 | errorExit('invalid parameters'); |
||
120 | } |
||
121 | |||
122 | $file = $image['image_file']; |
||
123 | $i = strrpos($file, '/'); |
||
124 | if ($i === false) { |
||
125 | errorExit('malformed path'); |
||
126 | } |
||
127 | $file_pre = substr($file, 0, $i); |
||
128 | $file_post = substr($file, $i); |
||
129 | |||
130 | $filename = XOOPS_ROOT_PATH . '/uploads/' . $dir . '/' . $file; |
||
131 | $thumbpath = XOOPS_ROOT_PATH . '/uploads/' . $dir . '/' . $file_pre . '/' . $size; |
||
132 | $thumbname = $thumbpath . $file_post; |
||
133 | //echo $filename.'<br>'.$thumbpath.'<br>'.$thumbname; |
||
134 | |||
135 | $modtime = filemtime($filename); |
||
136 | |||
137 | if (file_exists($thumbname) && (filemtime($thumbname) > $modtime)) { |
||
138 | $strategy = $strategy_old_thumb; |
||
139 | $info = getimagesize($thumbname); |
||
140 | $img_width = $info[0]; |
||
141 | $img_height = $info[1]; |
||
142 | $img_mime = $info['mime']; |
||
143 | } else { // (!file_exists($thumbname) || (file_exists($thumbname) && (filemtime($filename) > filemtime($thumbname)))) |
||
144 | $info = getimagesize($filename); |
||
145 | $img_width = $info[0]; |
||
146 | $img_height = $info[1]; |
||
147 | $img_mime = $info['mime']; |
||
148 | |||
149 | if (($size >= $img_width) && ($size >= $img_height)) { |
||
150 | $thumb_width = $img_width; |
||
151 | $thumb_height = $img_height; |
||
152 | $strategy = $strategy_no_thumb; |
||
153 | } else { |
||
154 | $ratio = max($img_width, $img_height) / $size; |
||
155 | $thumb_width = ceil($img_width / $ratio); |
||
156 | $thumb_height = ceil($img_height / $ratio); |
||
157 | $strategy = $strategy_new_thumb; |
||
158 | } |
||
159 | |||
160 | switch ($info[2]) { |
||
161 | case IMAGETYPE_JPEG: |
||
162 | $img_type = 'jpg'; |
||
163 | break; |
||
164 | case IMAGETYPE_PNG: |
||
165 | $img_type = 'png'; |
||
166 | break; |
||
167 | case IMAGETYPE_GIF: |
||
168 | $img_type = 'gif'; |
||
169 | break; |
||
170 | default: |
||
171 | $img_type = 'unsupported'; |
||
172 | $strategy = $strategy_no_thumb; |
||
173 | break; |
||
174 | } |
||
175 | /* |
||
176 | echo '<br>Image Width: '.$img_width; |
||
177 | echo '<br>Image Height: '.$img_height; |
||
178 | echo '<br>Type: '.$info[2].' '.$img_type.' '.$img_mime; |
||
179 | |||
180 | echo '<br>Thumb Width: '.$thumb_width; |
||
181 | echo '<br>Thumb Height: '.$thumb_height; |
||
182 | */ |
||
183 | } |
||
184 | |||
185 | switch ($strategy) { |
||
186 | case $strategy_new_thumb: |
||
187 | $oldUmask = umask(0); |
||
188 | @mkdir($thumbpath, 0755, true); |
||
0 ignored issues
–
show
|
|||
189 | umask($oldUmask); |
||
190 | $data = file_get_contents($filename); |
||
191 | $im = imagecreatefromstring($data); |
||
192 | unset($data); |
||
193 | $ti = imagecreatetruecolor($thumb_width, $thumb_height); |
||
194 | imagealphablending($ti, false); |
||
195 | imagesavealpha($ti, true); |
||
196 | imagecopyresampled($ti, $im, 0, 0, 0, 0, $thumb_width, $thumb_height, $img_width, $img_height); |
||
197 | imagedestroy($im); |
||
198 | if ($img_type === 'jpg') { |
||
199 | imagejpeg($ti, $thumbname, 80); |
||
200 | } |
||
201 | if ($img_type === 'png') { |
||
202 | imagepng($ti, $thumbname); |
||
203 | } |
||
204 | if ($img_type === 'git') { |
||
205 | imagegif($ti, $thumbname); |
||
206 | } |
||
207 | imagedestroy($ti); |
||
208 | serveFile($thumbname, $img_mime, $modtime, true); |
||
209 | break; |
||
210 | case $strategy_old_thumb: |
||
211 | serveFile($thumbname, $img_mime, $modtime); |
||
212 | break; |
||
213 | default: |
||
214 | serveFile($filename, $img_mime, $modtime); |
||
215 | break; |
||
216 | } |
||
217 | |||
218 | errorExit('unknown condition'); |
||
219 | //include XOOPS_ROOT_PATH."/footer.php"; |
||
220 |
If you suppress an error, we recommend checking for the error condition explicitly: