source: branches/MootoolsFileManager-Update/plugins/MootoolsFileManager/mootools-filemanager/Assets/Connector/Tooling.php @ 1302

Last change on this file since 1302 was 1302, checked in by gogo, 8 years ago

Updates to http://www.github.com/sleemanj/mootools-filemanager from GerHoblett?

http://www.github.com/GerHoblett/

Changes to said updates by gogo (sleemanj @ github)

Modifications to MootoolsFileManager? to work with those updates, some courtesy of GerHoblett?, some sleemanj

GerHoblett? provided a large diff which accomplished the goal in a quite different way. It has merit, however I have opted for a less-affecting path in so far as Xinha's "way" is concerned, namely, not splitting the config for a single plugin into several calls to backend config passing functions which seemed a little cumbersome.

Instead I take the option of using POST to send backend data around, at the minor expense of an extra round trip when displaying thumbnails (for each one). This could be reduced by checking for thumbnail existence and returning the thumbnail name directly in "onView" rather than the backend request to generate said thumbnail.

Still to do, is to make the preview pane thumbnail also work.


File size: 10.0 KB
Line 
1<?php
2/*
3 * Script: Tooling.php
4 *   MooTools FileManager - Backend for the FileManager Script - Support Code
5 *
6 * Authors:
7 *  - Christoph Pojer (http://cpojer.net) (author)
8 *  - James Ehly (http://www.devtrench.com)
9 *  - Fabian Vogelsteller (http://frozeman.de)
10 *  - Ger Hobbelt (http://hebbut.net)
11 *
12 * License:
13 *   MIT-style license.
14 *
15 * Copyright:
16 *   Copyright (c) 2011 [Christoph Pojer](http://cpojer.net)
17 */
18
19
20
21
22if (!function_exists('safe_glob'))
23{
24        /**#@+
25         * Extra GLOB constant for safe_glob()
26         */
27        if (!defined('GLOB_NODIR'))       define('GLOB_NODIR',256);
28        if (!defined('GLOB_PATH'))        define('GLOB_PATH',512);
29        if (!defined('GLOB_NODOTS'))      define('GLOB_NODOTS',1024);
30        if (!defined('GLOB_RECURSE'))     define('GLOB_RECURSE',2048);
31        /**#@-*/
32
33
34        /**
35         * A safe empowered glob().
36         *
37         * Function glob() is prohibited on some server (probably in safe mode)
38         * (Message "Warning: glob() has been disabled for security reasons in
39         * (script) on line (line)") for security reasons as stated on:
40         * http://seclists.org/fulldisclosure/2005/Sep/0001.html
41         *
42         * safe_glob() intends to replace glob() using readdir() & fnmatch() instead.
43         * Supported flags: GLOB_MARK, GLOB_NOSORT, GLOB_ONLYDIR
44         * Additional flags: GLOB_NODIR, GLOB_PATH, GLOB_NODOTS, GLOB_RECURSE
45         * (not original glob() flags)
46         *
47         * @author BigueNique AT yahoo DOT ca
48         * @updates
49         * - 080324 Added support for additional flags: GLOB_NODIR, GLOB_PATH,
50         *   GLOB_NODOTS, GLOB_RECURSE
51         */
52        function safe_glob($pattern, $flags = 0)
53        {
54                $split = explode('/', str_replace('\\', '/', $pattern));
55                $mask = array_pop($split);
56                $path = implode('/', $split);
57                if (($dir = @opendir($path)) !== false)
58                {
59                        $glob = array();
60                        while(($file = readdir($dir)) !== false)
61                        {
62                                // Recurse subdirectories (GLOB_RECURSE); speedup: no need to sort the intermediate results
63                                if (($flags & GLOB_RECURSE) && is_dir($file) && (!in_array($file, array('.', '..'))))
64                                {
65                                        $glob = array_merge($glob, array_prepend(safe_glob($path . '/' . $file . '/' . $mask, $flags | GLOB_NOSORT), ($flags & GLOB_PATH ? '' : $file . '/')));
66                                }
67                                // Match file mask
68                                if (fnmatch($mask, $file))
69                                {
70                                        if ( ( (!($flags & GLOB_ONLYDIR)) || is_dir($path . '/' . $file) )
71                                          && ( (!($flags & GLOB_NODIR)) || (!is_dir($path . '/' . $file)) )
72                                          && ( (!($flags & GLOB_NODOTS)) || (!in_array($file, array('.', '..'))) ) )
73                                        {
74                                                $glob[] = ($flags & GLOB_PATH ? $path . '/' : '') . $file . (($flags & GLOB_MARK) && is_dir($path . '/' . $file) ? '/' : '');
75                                        }
76                                }
77                        }
78                        closedir($dir);
79                        if (!($flags & GLOB_NOSORT)) sort($glob);
80                        return $glob;
81                }
82                else
83                {
84                        return false;
85                }
86        }
87}
88
89
90
91
92// derived from http://nl.php.net/manual/en/function.http-build-query.php#90438
93if (!function_exists('http_build_query_ex'))
94{
95        if (!defined('PHP_QUERY_RFC1738')) define('PHP_QUERY_RFC1738', 1); // encoding is performed per RFC 1738 and the application/x-www-form-urlencoded media type, which implies that spaces are encoded as plus (+) signs.
96        if (!defined('PHP_QUERY_RFC3986')) define('PHP_QUERY_RFC3986', 2); // encoding is performed according to » RFC 3986, and spaces will be percent encoded (%20).
97
98        function http_build_query_ex($data, $prefix = '', $sep = '', $key = '', $enc_type = PHP_QUERY_RFC1738)
99        {
100                $ret = array();
101                if (!is_array($data) && !is_object($data))
102                {
103                        if ($enc_type == PHP_QUERY_RFC1738)
104                        {
105                                $ret[] = urlencode($data);
106                        }
107                        else
108                        {
109                                $ret[] = rawurlencode($data);
110                        }
111                }
112                else
113                {
114                        if (!empty($prefix))
115                        {
116                                if ($enc_type == PHP_QUERY_RFC1738)
117                                {
118                                        $prefix = urlencode($prefix);
119                                }
120                                else
121                                {
122                                        $prefix = rawurlencode($prefix);
123                                }
124                        }
125                        foreach ($data as $k => $v)
126                        {
127                                if (is_int($k))
128                                {
129                                        $k = $prefix . $k;
130                                }
131                                else if ($enc_type == PHP_QUERY_RFC1738)
132                                {
133                                        $k = urlencode($k);
134                                }
135                                else
136                                {
137                                        $k = rawurlencode($k);
138                                }
139                                if (!empty($key) || $key === 0)
140                                {
141                                        $k = $key . '[' . $k . ']';
142                                }
143                                if (is_array($v) || is_object($v))
144                                {
145                                        $ret[] = http_build_query_ex($v, '', $sep, $k, $enc_type);
146                                }
147                                else
148                                {
149                                        if ($enc_type == PHP_QUERY_RFC1738)
150                                        {
151                                                $v = urlencode($v);
152                                        }
153                                        else
154                                        {
155                                                $v = rawurlencode($v);
156                                        }
157                                        $ret[] = $k . '=' . $v;
158                                }
159                        }
160                }
161                if (empty($sep)) $sep = ini_get('arg_separator.output');
162                return implode($sep, $ret);
163        }
164}
165
166
167
168/**
169 * Determine how the PHP interpreter was invoked: cli/cgi/fastcgi/server,
170 * where 'server' implies PHP is part of a webserver in the form of a 'module' (e.g. mod_php5) or similar.
171 *
172 * This information is used, for example, to decide the correct way to send the 'respose header code':
173 * see send_response_status_header().
174 */
175if (!function_exists('get_interpreter_invocation_mode'))
176{
177        function get_interpreter_invocation_mode()
178        {
179                global $_ENV;
180                global $_SERVER;
181
182                /*
183                 * see
184                 *
185                 * http://nl2.php.net/manual/en/function.php-sapi-name.php
186                 * http://stackoverflow.com/questions/190759/can-php-detect-if-its-run-from-a-cron-job-or-from-the-command-line
187                 */
188                $mode = "server";
189                $name = php_sapi_name();
190                if (preg_match("/fcgi/", $name) == 1)
191                {
192                        $mode = "fastcgi";
193                }
194                else if (preg_match("/cli/", $name) == 1)
195                {
196                        $mode = "cli";
197                }
198                else if (preg_match("/cgi/", $name) == 1)
199                {
200                        $mode = "cgi";
201                }
202
203                /*
204                 * check whether POSIX functions have been compiled/enabled; xampp on Win32/64 doesn't have the buggers! :-(
205                 */
206                if (function_exists('posix_isatty'))
207                {
208                        if (posix_isatty(STDOUT))
209                        {
210                                /* even when seemingly run as cgi/fastcgi, a valid stdout TTY implies an interactive commandline run */
211                                $mode = 'cli';
212                        }
213                }
214
215                if (!empty($_ENV['TERM']) && empty($_SERVER['REMOTE_ADDR']))
216                {
217                        /* even when seemingly run as cgi/fastcgi, a valid stdout TTY implies an interactive commandline run */
218                        $mode = 'cli';
219                }
220
221                return $mode;
222        }
223}
224
225
226
227
228
229
230/**
231 * Return the HTTP response code string for the given response code
232 */
233if (!function_exists('get_response_code_string'))
234{
235        function get_response_code_string($response_code)
236        {
237                $response_code = intval($response_code);
238                switch ($response_code)
239                {
240                case 100:   return "RFC2616 Section 10.1.1: Continue";
241                case 101:   return "RFC2616 Section 10.1.2: Switching Protocols";
242                case 200:   return "RFC2616 Section 10.2.1: OK";
243                case 201:   return "RFC2616 Section 10.2.2: Created";
244                case 202:   return "RFC2616 Section 10.2.3: Accepted";
245                case 203:   return "RFC2616 Section 10.2.4: Non-Authoritative Information";
246                case 204:   return "RFC2616 Section 10.2.5: No Content";
247                case 205:   return "RFC2616 Section 10.2.6: Reset Content";
248                case 206:   return "RFC2616 Section 10.2.7: Partial Content";
249                case 300:   return "RFC2616 Section 10.3.1: Multiple Choices";
250                case 301:   return "RFC2616 Section 10.3.2: Moved Permanently";
251                case 302:   return "RFC2616 Section 10.3.3: Found";
252                case 303:   return "RFC2616 Section 10.3.4: See Other";
253                case 304:   return "RFC2616 Section 10.3.5: Not Modified";
254                case 305:   return "RFC2616 Section 10.3.6: Use Proxy";
255                case 307:   return "RFC2616 Section 10.3.8: Temporary Redirect";
256                case 400:   return "RFC2616 Section 10.4.1: Bad Request";
257                case 401:   return "RFC2616 Section 10.4.2: Unauthorized";
258                case 402:   return "RFC2616 Section 10.4.3: Payment Required";
259                case 403:   return "RFC2616 Section 10.4.4: Forbidden";
260                case 404:   return "RFC2616 Section 10.4.5: Not Found";
261                case 405:   return "RFC2616 Section 10.4.6: Method Not Allowed";
262                case 406:   return "RFC2616 Section 10.4.7: Not Acceptable";
263                case 407:   return "RFC2616 Section 10.4.8: Proxy Authentication Required";
264                case 408:   return "RFC2616 Section 10.4.9: Request Time-out";
265                case 409:   return "RFC2616 Section 10.4.10: Conflict";
266                case 410:   return "RFC2616 Section 10.4.11: Gone";
267                case 411:   return "RFC2616 Section 10.4.12: Length Required";
268                case 412:   return "RFC2616 Section 10.4.13: Precondition Failed";
269                case 413:   return "RFC2616 Section 10.4.14: Request Entity Too Large";
270                case 414:   return "RFC2616 Section 10.4.15: Request-URI Too Large";
271                case 415:   return "RFC2616 Section 10.4.16: Unsupported Media Type";
272                case 416:   return "RFC2616 Section 10.4.17: Requested range not satisfiable";
273                case 417:   return "RFC2616 Section 10.4.18: Expectation Failed";
274                case 500:   return "RFC2616 Section 10.5.1: Internal Server Error";
275                case 501:   return "RFC2616 Section 10.5.2: Not Implemented";
276                case 502:   return "RFC2616 Section 10.5.3: Bad Gateway";
277                case 503:   return "RFC2616 Section 10.5.4: Service Unavailable";
278                case 504:   return "RFC2616 Section 10.5.5: Gateway Time-out";
279                case 505:   return "RFC2616 Section 10.5.6: HTTP Version not supported";
280        /*
281                case 102:   return "Processing";  // http://www.askapache.com/htaccess/apache-status-code-headers-errordocument.html#m0-askapache3
282                case 207:   return "Multi-Status";
283                case 418:   return "I'm a teapot";
284                case 419:   return "unused";
285                case 420:   return "unused";
286                case 421:   return "unused";
287                case 422:   return "Unproccessable entity";
288                case 423:   return "Locked";
289                case 424:   return "Failed Dependency";
290                case 425:   return "Node code";
291                case 426:   return "Upgrade Required";
292                case 506:   return "Variant Also Negotiates";
293                case 507:   return "Insufficient Storage";
294                case 508:   return "unused";
295                case 509:   return "unused";
296                case 510:   return "Not Extended";
297        */
298                default:   return rtrim("Unknown Response Code " . $response_code);
299                }
300        }
301}
302
303
304
305/**
306 * Performs the correct way of transmitting the response status code header: PHP header() must be invoked in different ways
307 * dependent on the way the PHP interpreter has been invoked.
308 *
309 * See also:
310 *
311 * http://nl2.php.net/manual/en/function.header.php
312 */
313if (!function_exists('send_response_status_header'))
314{
315        function send_response_status_header($response_code)
316        {
317                $mode = get_interpreter_invocation_mode();
318                switch ($mode)
319                {
320                default:
321                case 'fcgi':
322                        header('Status: ' . $response_code, true, $response_code);
323                        break;
324
325                case 'server':
326                        header('HTTP/1.0 ' . $response_code . ' ' . get_response_code_string($response_code), true, $response_code);
327                        break;
328                }
329        }
330}
331
332
333
334
335
336
337
338
Note: See TracBrowser for help on using the repository browser.