Sanity check added to make sure the file is really there
[mailer.git] / inc / wrapper-functions.php
1 <?php
2 /************************************************************************
3  * MXChange v0.2.1                                    Start: 04/04/2009 *
4  * ===============                              Last change: 04/04/2009 *
5  *                                                                      *
6  * -------------------------------------------------------------------- *
7  * File              : wrapper-functions.php                            *
8  * -------------------------------------------------------------------- *
9  * Short description : Wrapper functions                                *
10  * -------------------------------------------------------------------- *
11  * Kurzbeschreibung  : Wrapper-Funktionen                               *
12  * -------------------------------------------------------------------- *
13  * $Revision::                                                        $ *
14  * $Date::                                                            $ *
15  * $Tag:: 0.2.1-FINAL                                                 $ *
16  * $Author::                                                          $ *
17  * Needs to be in all Files and every File needs "svn propset           *
18  * svn:keywords Date Revision" (autoprobset!) at least!!!!!!            *
19  * -------------------------------------------------------------------- *
20  * Copyright (c) 2003 - 2008 by Roland Haeder                           *
21  * For more information visit: http://www.mxchange.org                  *
22  *                                                                      *
23  * This program is free software; you can redistribute it and/or modify *
24  * it under the terms of the GNU General Public License as published by *
25  * the Free Software Foundation; either version 2 of the License, or    *
26  * (at your option) any later version.                                  *
27  *                                                                      *
28  * This program is distributed in the hope that it will be useful,      *
29  * but WITHOUT ANY WARRANTY; without even the implied warranty of       *
30  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the        *
31  * GNU General Public License for more details.                         *
32  *                                                                      *
33  * You should have received a copy of the GNU General Public License    *
34  * along with this program; if not, write to the Free Software          *
35  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,               *
36  * MA  02110-1301  USA                                                  *
37  ************************************************************************/
38
39 // Some security stuff...
40 if (!defined('__SECURITY')) {
41         $INC = substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), '/inc') + 4) . '/security.php';
42         require($INC);
43 } // END - if
44
45 // Read a given file
46 function readFromFile ($FQFN, $sqlPrepare = false) {
47         // Sanity-check if file is there (should be there, but just to make it sure)
48         if (!isFileReadable($FQFN)) {
49                 // This should not happen
50                 debug_report_bug(__FUNCTION__.': File ' . basename($FQFN) . ' is not readable!');
51         } // END - if
52
53         // Load the file
54         if (function_exists('file_get_contents')) {
55                 // Use new function
56                 $content = file_get_contents($FQFN);
57         } else {
58                 // Fall-back to implode-file chain
59                 $content = implode('', file($FQFN));
60         }
61
62         // Prepare SQL queries?
63         if ($sqlPrepare === true) {
64                 // Remove some unwanted chars
65                 $content = str_replace("\r", '', $content);
66                 $content = str_replace("\n\n", "\n", $content);
67         } // END - if
68
69         // Return the content
70         return $content;
71 }
72
73 // Writes content to a file
74 function writeToFile ($FQFN, $content) {
75         // Is the file writeable?
76         if ((isFileReadable($FQFN)) && (!is_writeable($FQFN)) && (!changeMode($FQFN, 0644))) {
77                 // Not writeable!
78                 DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("File %s not writeable.", basename($FQFN)));
79
80                 // Failed! :(
81                 return false;
82         } // END - if
83
84         // By default all is failed...
85         $return = false;
86
87         // Is the function there?
88         if (function_exists('file_put_contents')) {
89                 // Write it directly
90                 $return = file_put_contents($FQFN, $content);
91         } else {
92                 // Write it with fopen
93                 $fp = fopen($FQFN, 'w') or app_die(__FUNCTION__, __LINE__, "Cannot write file ".basename($FQFN).'!');
94                 fwrite($fp, $content);
95                 fclose($fp);
96
97                 // Set CHMOD rights
98                 $return = changeMode($FQFN, 0644);
99         }
100
101         // Return status
102         return $return;
103 }
104
105 // Clears the output buffer. This function does *NOT* backup sent content.
106 function clearOutputBuffer () {
107         // Trigger an error on failure
108         if (!ob_end_clean()) {
109                 // Failed!
110                 debug_report_bug(__FUNCTION__.': Failed to clean output buffer.');
111         } // END - if
112 }
113
114 // Loads an include file and logs any missing files for debug purposes
115 function loadInclude ($INC) {
116         // Add the path. This is why we need a trailing slash in config.php
117         $FQFN = constant('PATH') . $INC;
118
119         // Is the include file there?
120         if (!isIncludeReadable($INC)) {
121                 // Not there so log it
122                 debug_report_bug(sprintf("Include file %s not found.", $INC));
123                 return false;
124         } // END - if
125
126         // Try to load it
127         require($FQFN);
128 }
129
130 // Loads an include file once
131 function loadIncludeOnce ($INC) {
132         // Is it not loaded?
133         if (!isset($GLOBALS['load_once'][$INC])) {
134                 // Mark it as loaded
135                 $GLOBALS['load_once'][$INC] = "loaded";
136
137                 // Then try to load it
138                 loadInclude($INC);
139         } // END - if
140 }
141
142 // Checks wether an include file (non-FQFN better) is readable
143 function isIncludeReadable ($INC) {
144         // Construct FQFN
145         $FQFN = constant('PATH') . $INC;
146
147         // Is it readable?
148         return isFileReadable($FQFN);
149 }
150
151 // Encode strings
152 // @TODO Implement $compress
153 function encodeString ($str, $compress = true) {
154         $str = urlencode(base64_encode(compileUriCode($str)));
155         return $str;
156 }
157
158 // Decode strings encoded with encodeString()
159 // @TODO Implement $decompress
160 function decodeString ($str, $decompress = true) {
161         $str = compileUriCode(base64_decode(urldecode(compileUriCode($str))));
162         return $str;
163 }
164
165 // Smartly adds slashes
166 function smartAddSlashes ($unquoted) {
167         $unquoted = str_replace("\\", '', $unquoted);
168         return addslashes($unquoted);
169 }
170
171 // Decode entities in a nicer way
172 function decodeEntities ($str) {
173         // Decode the entities to UTF-8 now
174         $decodedString = html_entity_decode($str, ENT_NOQUOTES, 'UTF-8');
175
176         // Return decoded string
177         return $decodedString;
178 }
179
180 // Merges an array together but only if both are arrays
181 function merge_array ($array1, $array2) {
182         // Are both an array?
183         if ((is_array($array1)) && (is_array($array2))) {
184                 // Merge all together
185                 return array_merge($array1, $array2);
186         } elseif (is_array($array1)) {
187                 // Return left array
188                 DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("array2 is not an array. array != %s", gettype($array2)));
189                 return $array1;
190         } elseif (is_array($array2)) {
191                 // Return right array
192                 DEBUG_LOG(__FUNCTION__, __LINE__, sprintf("array1 is not an array. array != %s", gettype($array1)));
193                 return $array2;
194         }
195
196         // Both are not arrays
197         debug_report_bug(__FUNCTION__.": No arrays provided!");
198 }
199
200 // Check if given FQFN is a readable file
201 function isFileReadable ($FQFN) {
202         // Check all...
203         return ((file_exists($FQFN)) && (is_file($FQFN)) && (is_readable($FQFN)));
204 }
205
206 // Checks wether the given FQFN is a directory and not .,.. or .svn
207 function isDirectory ($FQFN) {
208         // Generate baseName
209         $baseName = basename($FQFN);
210
211         // Check it
212         $isDirectory = ((is_dir($FQFN)) && ($baseName != '.') && ($baseName != '..') && ($baseName != '.svn'));
213
214         // Return the result
215         return $isDirectory;
216 }
217
218 // "Getter" for remote IP number
219 function detectRemoteAddr () {
220         // Get remote ip from environment
221         $remoteAddr = determineRealRemoteAddress();
222
223         // Is removeip installed?
224         if (EXT_IS_ACTIVE('removeip')) {
225                 // Then anonymize it
226                 $remoteAddr = GET_ANONYMOUS_REMOTE_ADDR($remoteAddr);
227         } // END - if
228
229         // Return it
230         return $remoteAddr;
231 }
232
233 // "Getter" for remote hostname
234 function detectRemoteHostname () {
235         // Get remote ip from environment
236         $remoteHost = getenv('REMOTE_HOST');
237
238         // Is removeip installed?
239         if (EXT_IS_ACTIVE('removeip')) {
240                 // Then anonymize it
241                 $remoteHost = GET_ANONYMOUS_REMOTE_HOST($remoteHost);
242         } // END - if
243
244         // Return it
245         return $remoteHost;
246 }
247
248 // "Getter" for user agent
249 function detectUserAgent () {
250         // Get remote ip from environment
251         $userAgent = getenv('HTTP_USER_AGENT');
252
253         // Is removeip installed?
254         if (EXT_IS_ACTIVE('removeip')) {
255                 // Then anonymize it
256                 $userAgent = GET_ANONYMOUS_USER_AGENT($userAgent);
257         } // END - if
258
259         // Return it
260         return $userAgent;
261 }
262
263 // "Getter" for referer
264 function detectReferer () {
265         // Get remote ip from environment
266         $referer = getenv('HTTP_REFERER');
267
268         // Is removeip installed?
269         if (EXT_IS_ACTIVE('removeip')) {
270                 // Then anonymize it
271                 $referer = GET_ANONYMOUS_REFERER($referer);
272         } // END - if
273
274         // Return it
275         return $referer;
276 }
277
278 // Check wether we are installing
279 function isInstalling () {
280         $installing = ((isset($GLOBALS['mxchange_installing'])) || (REQUEST_ISSET_GET('installing')));
281         //* DEBUG: */ var_dump($installing);
282         return $installing;
283 }
284
285 // Check wether this script is installed
286 function isInstalled () {
287         return (
288         (
289         // New config file found and loaded
290         getConfig('MXCHANGE_INSTALLED') == 'Y'
291         ) || (
292         // Fall-back!
293         isIncludeReadable('inc/config.php')
294         ) || (
295         (
296         // New config file found, but not yet read
297         isIncludeReadable('inc/cache/config-local.php')
298         ) && (
299         (
300         // Only new config file is found
301         !isIncludeReadable('inc/config.php')
302         ) || (
303         // Is installation mode
304         isInstalling()
305         )
306         )
307         )
308         );
309 }
310
311 // Check wether an admin is registered
312 function isAdminRegistered () {
313         return (getConfig('ADMIN_REGISTERED') == 'Y');
314 }
315
316 // Checks wether the reset mode is active
317 function isResetModeEnabled () {
318         // Now simply check it
319         return ((isset($GLOBALS['reset_enabled'])) && ($GLOBALS['reset_enabled'] === true));
320 }
321
322 // Checks wether the debug mode is enabled
323 function isDebugModeEnabled () {
324         // Simply check it
325         return (getConfig('DEBUG_MODE') == 'Y');
326 }
327
328 // Checks wether the cache instance is valid
329 function isCacheInstanceValid () {
330         return ((isset($GLOBALS['cache_instance'])) && (is_object($GLOBALS['cache_instance'])));
331 }
332
333 // Copies a file from source to destination and verifies if that goes fine.
334 // This function should wrap the copy() command and make a nicer debug backtrace
335 // even if there is no xdebug extension installed.
336 function copyFileVerified ($source, $dest, $chmod = '') {
337         // Failed is the default
338         $status = false;
339
340         // Is the source file there?
341         if (!isFileReadable($source)) {
342                 // Then abort here
343                 debug_report_bug('Cannot read from source file ' . basename($source) . '.');
344         } // END - if
345
346         // Is the target directory there?
347         if (!isDirectory(dirname($dest))) {
348                 // Then abort here
349                 debug_report_bug('Cannot find directory ' . str_replace(constant('PATH'), '', dirname($dest)) . '.');
350         } // END - if
351
352         // Now try to copy it
353         if (!copy($source, $dest)) {
354                 // Something went wrong
355                 debug_report_bug('copy() has failed to copy the file.');
356         } // END - if
357
358         // If there are chmod rights set, apply them
359         if (!empty($chmod)) {
360                 // Try to apply them
361                 $status = changeMode($dest, $chmod);
362         } else {
363                 // All fine
364                 $status = true;
365         }
366
367         // All fine
368         return $status;
369 }
370
371 // Wrapper function for header()
372 // Send a header but checks before if we can do so
373 function sendHeader ($header) {
374         // Is the header already sent?
375         if (headers_sent()) {
376                 // Then abort here
377                 debug_report_bug('Headers already sent!');
378         } // END - if
379
380         // Send the header
381         header($header);
382 }
383
384 // Wrapper function for chmod()
385 // @TODO Do some more sanity check here
386 function changeMode ($FQFN, $mode) {
387         // Is the file/directory there?
388         if ((!isFileReadable($FQFN)) && (!isDirectory($FQFN))) {
389                 // Neither, so abort here
390                 debug_report_bug('Cannot chmod() on ' . basename($FQFN) . '.');
391         } // END - if
392
393         // Try to set them
394         chmod($FQFN, $mode);
395 }
396
397 // Wrapper for unlink()
398 function removeFile ($FQFN) {
399         // Is the file there?
400         if (isFileReadable($FQFN)) {
401                 // Yes, so remove it
402                 return unlink($FQFN);
403         } // END - if
404
405         // All fine if no file was removed. If we change this to 'false' or rewrite
406         // above if() block it would be to restrictive.
407         return true;
408 }
409
410 // Wrapper for $_POST['sel']
411 function countPostSelection () {
412         return countSelection(REQUEST_POST('sel'));
413 }
414
415 // Checks wether the config-local.php is loaded
416 function isConfigLocalLoaded () {
417         return ((isset($GLOBALS['config_local_loaded'])) && ($GLOBALS['config_local_loaded'] === true));
418 }
419
420 // [EOF]
421 ?>