dolibarr  17.0.4
filefunc.inc.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (C) 2002-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
3  * Copyright (C) 2003 Xavier Dutoit <doli@sydesy.com>
4  * Copyright (C) 2004-2017 Laurent Destailleur <eldy@users.sourceforge.net>
5  * Copyright (C) 2004 Sebastien Di Cintio <sdicintio@ressource-toi.org>
6  * Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
7  * Copyright (C) 2005-2011 Regis Houssin <regis.houssin@inodbox.com>
8  * Copyright (C) 2005 Simon Tosser <simon@kornog-computing.com>
9  * Copyright (C) 2006 Andre Cianfarani <andre.cianfarani@acdeveloppement.net>
10  * Copyright (C) 2010 Juanjo Menent <jmenent@2byte.es>
11  * Copyright (C) 2015 Bahfir Abbes <bafbes@gmail.com>
12  *
13  * This program is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 3 of the License, or
16  * (at your option) any later version.
17  *
18  * This program is distributed in the hope that it will be useful,
19  * but WITHOUT ANY WARRANTY; without even the implied warranty of
20  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21  * GNU General Public License for more details.
22  *
23  * You should have received a copy of the GNU General Public License
24  * along with this program. If not, see <https://www.gnu.org/licenses/>.
25  */
26 
33 if (!defined('DOL_APPLICATION_TITLE')) {
34  define('DOL_APPLICATION_TITLE', 'Dolibarr');
35 }
36 if (!defined('DOL_VERSION')) {
37  define('DOL_VERSION', '17.0.4'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c
38 }
39 
40 if (!defined('EURO')) {
41  define('EURO', chr(128));
42 }
43 
44 // Define syslog constants
45 if (!defined('LOG_DEBUG')) {
46  if (!function_exists("syslog")) {
47  // For PHP versions without syslog (like running on Windows OS)
48  define('LOG_EMERG', 0);
49  define('LOG_ALERT', 1);
50  define('LOG_CRIT', 2);
51  define('LOG_ERR', 3);
52  define('LOG_WARNING', 4);
53  define('LOG_NOTICE', 5);
54  define('LOG_INFO', 6);
55  define('LOG_DEBUG', 7);
56  }
57 }
58 
59 // End of common declaration part
60 if (defined('DOL_INC_FOR_VERSION_ERROR')) {
61  return;
62 }
63 
64 
65 // Define vars
66 $conffiletoshowshort = "conf.php";
67 // Define localization of conf file
68 // --- Start of part replaced by Dolibarr packager makepack-dolibarr
69 $conffile = "conf/conf.php";
70 $conffiletoshow = "htdocs/conf/conf.php";
71 // For debian/redhat like systems
72 //$conffile = "/etc/dolibarr/conf.php";
73 //$conffiletoshow = "/etc/dolibarr/conf.php";
74 
75 
76 // Include configuration
77 // --- End of part replaced by Dolibarr packager makepack-dolibarr
78 
79 
80 // Include configuration
81 $result = @include_once $conffile; // Keep @ because with some error reporting this break the redirect done when file not found
82 
83 if (!$result && !empty($_SERVER["GATEWAY_INTERFACE"])) { // If install not done and we are in a web session
84  if (!empty($_SERVER["CONTEXT_PREFIX"])) { // CONTEXT_PREFIX and CONTEXT_DOCUMENT_ROOT are not defined on all apache versions
85  $path = $_SERVER["CONTEXT_PREFIX"]; // example '/dolibarr/' when using an apache alias.
86  if (!preg_match('/\/$/', $path)) {
87  $path .= '/';
88  }
89  } elseif (preg_match('/index\.php/', $_SERVER['PHP_SELF'])) {
90  // When we ask index.php, we MUST BE SURE that $path is '' at the end. This is required to make install process
91  // when using apache alias like '/dolibarr/' that point to htdocs.
92  // Note: If calling page was an index.php not into htdocs (ie comm/index.php, ...), then this redirect will fails,
93  // but we don't want to change this because when URL is correct, we must be sure the redirect to install/index.php will be correct.
94  $path = '';
95  } else {
96  // If what we look is not index.php, we can try to guess location of root. May not work all the time.
97  // There is no real solution, because the only way to know the apache url relative path is to have it into conf file.
98  // If it fails to find correct $path, then only solution is to ask user to enter the correct URL to index.php or install/index.php
99  $TDir = explode('/', $_SERVER['PHP_SELF']);
100  $path = '';
101  $i = count($TDir);
102  while ($i--) {
103  if (empty($TDir[$i]) || $TDir[$i] == 'htdocs') {
104  break;
105  }
106  if ($TDir[$i] == 'dolibarr') {
107  break;
108  }
109  if (substr($TDir[$i], -4, 4) == '.php') {
110  continue;
111  }
112 
113  $path .= '../';
114  }
115  }
116 
117  header("Location: ".$path."install/index.php");
118 
119  /*
120  print '<br><center>';
121  print 'The conf/conf.php file was not found or is not readable by the web server. If this is your first access, <a href="'.$path.'install/index.php">click here to start the Dolibarr installation process</a> to create it...';
122  print '</center><br>';
123  */
124 
125  exit;
126 }
127 
128 // Force PHP error_reporting setup (Dolibarr may report warning without this)
129 if (!empty($dolibarr_strict_mode)) {
130  error_reporting(E_ALL | E_STRICT);
131 } else {
132  error_reporting(E_ALL & ~(E_STRICT | E_NOTICE | E_DEPRECATED));
133 }
134 
135 // Disable php display errors
136 if (!empty($dolibarr_main_prod)) {
137  ini_set('display_errors', 'Off');
138 }
139 
140 // Clean parameters
141 $dolibarr_main_data_root = trim($dolibarr_main_data_root);
142 $dolibarr_main_url_root = trim(preg_replace('/\/+$/', '', $dolibarr_main_url_root));
143 $dolibarr_main_url_root_alt = (empty($dolibarr_main_url_root_alt) ? '' : trim($dolibarr_main_url_root_alt));
144 $dolibarr_main_document_root = trim($dolibarr_main_document_root);
145 $dolibarr_main_document_root_alt = (empty($dolibarr_main_document_root_alt) ? '' : trim($dolibarr_main_document_root_alt));
146 
147 if (empty($dolibarr_main_db_port)) {
148  $dolibarr_main_db_port = 3306; // For compatibility with old configs, if not defined, we take 'mysql' type
149 }
150 if (empty($dolibarr_main_db_type)) {
151  $dolibarr_main_db_type = 'mysqli'; // For compatibility with old configs, if not defined, we take 'mysql' type
152 }
153 
154 // Mysql driver support has been removed in favor of mysqli
155 if ($dolibarr_main_db_type == 'mysql') {
156  $dolibarr_main_db_type = 'mysqli';
157 }
158 if (empty($dolibarr_main_db_prefix)) {
159  $dolibarr_main_db_prefix = 'llx_';
160 }
161 if (empty($dolibarr_main_db_character_set)) {
162  $dolibarr_main_db_character_set = ($dolibarr_main_db_type == 'mysqli' ? 'utf8' : ''); // Old installation
163 }
164 if (empty($dolibarr_main_db_collation)) {
165  $dolibarr_main_db_collation = ($dolibarr_main_db_type == 'mysqli' ? 'utf8_unicode_ci' : ''); // Old installation
166 }
167 if (empty($dolibarr_main_db_encryption)) {
168  $dolibarr_main_db_encryption = 0;
169 }
170 if (empty($dolibarr_main_db_cryptkey)) {
171  $dolibarr_main_db_cryptkey = '';
172 }
173 if (empty($dolibarr_main_limit_users)) {
174  $dolibarr_main_limit_users = 0;
175 }
176 if (empty($dolibarr_mailing_limit_sendbyweb)) {
177  $dolibarr_mailing_limit_sendbyweb = 0;
178 }
179 if (empty($dolibarr_mailing_limit_sendbycli)) {
180  $dolibarr_mailing_limit_sendbycli = 0;
181 }
182 if (empty($dolibarr_mailing_limit_sendbyday)) {
183  $dolibarr_mailing_limit_sendbyday = 0;
184 }
185 if (empty($dolibarr_strict_mode)) {
186  $dolibarr_strict_mode = 0; // For debug in php strict mode
187 }
188 
189 define('DOL_DOCUMENT_ROOT', $dolibarr_main_document_root); // Filesystem core php (htdocs)
190 
191 if (!file_exists(DOL_DOCUMENT_ROOT."/core/lib/functions.lib.php")) {
192  print "Error: Dolibarr config file content seems to be not correctly defined.<br>\n";
193  print "Please run dolibarr setup by calling page <b>/install</b>.<br>\n";
194  exit;
195 }
196 
197 
198 // Included by default (must be before the CSRF check so wa can use the dol_syslog)
199 include_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php';
200 include_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php';
201 //print memory_get_usage();
202 
203 
204 // Security: CSRF protection
205 // This test check if referrer ($_SERVER['HTTP_REFERER']) is same web site than Dolibarr ($_SERVER['HTTP_HOST'])
206 // when we post forms (we allow GET and HEAD to accept direct link from a particular page).
207 // Note about $_SERVER[HTTP_HOST/SERVER_NAME]: http://shiflett.org/blog/2006/mar/server-name-versus-http-host
208 // See also CSRF protections done into main.inc.php
209 if (!defined('NOCSRFCHECK') && isset($dolibarr_nocsrfcheck) && $dolibarr_nocsrfcheck == 1) { // If $dolibarr_nocsrfcheck is 0, there is a strict CSRF test with token in main
210  if (!empty($_SERVER['REQUEST_METHOD']) && !in_array($_SERVER['REQUEST_METHOD'], array('GET', 'HEAD')) && !empty($_SERVER['HTTP_HOST'])) {
211  $csrfattack = false;
212  if (empty($_SERVER['HTTP_REFERER'])) {
213  $csrfattack = true; // An evil browser was used
214  } else {
215  $tmpa = parse_url($_SERVER['HTTP_HOST']);
216  $tmpb = parse_url($_SERVER['HTTP_REFERER']);
217  if ((empty($tmpa['host']) ? $tmpa['path'] : $tmpa['host']) != (empty($tmpb['host']) ? $tmpb['path'] : $tmpb['host'])) {
218  $csrfattack = true;
219  }
220  }
221  if ($csrfattack) {
222  //print 'NOCSRFCHECK='.defined('NOCSRFCHECK').' REQUEST_METHOD='.$_SERVER['REQUEST_METHOD'].' HTTP_HOST='.$_SERVER['HTTP_HOST'].' HTTP_REFERER='.$_SERVER['HTTP_REFERER'];
223  // Note: We can't use dol_escape_htmltag here to escape output because lib functions.lib.ph is not yet loaded.
224  dol_syslog("--- Access to ".(empty($_SERVER["REQUEST_METHOD"])?'':$_SERVER["REQUEST_METHOD"].' ').$_SERVER["PHP_SELF"]." refused by CSRF protection (Bad referer).", LOG_WARNING);
225  print "Access refused by CSRF protection in main.inc.php. Referer of form (".htmlentities($_SERVER['HTTP_REFERER'], ENT_COMPAT, 'UTF-8').") is outside the server that serve this page (with method = ".htmlentities($_SERVER['REQUEST_METHOD'], ENT_COMPAT, 'UTF-8').").\n";
226  print "If you access your server behind a proxy using url rewriting, you might check that all HTTP headers are propagated (or add the line \$dolibarr_nocsrfcheck=1 into your conf.php file to remove this security check).\n";
227  die;
228  }
229  }
230  // Another test is done later on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on.
231 }
232 if (empty($dolibarr_main_db_host) && !defined('NOREQUIREDB')) {
233  print '<div class="center">Dolibarr setup is not yet complete.<br><br>'."\n";
234  print '<a href="install/index.php">Click here to finish Dolibarr install process</a> ...</div>'."\n";
235  die;
236 }
237 if (empty($dolibarr_main_url_root) && !defined('NOREQUIREVIRTUALURL')) {
238  print 'Value for parameter \'dolibarr_main_url_root\' is not defined in your \'htdocs\conf\conf.php\' file.<br>'."\n";
239  print 'You must add this parameter with your full Dolibarr root Url (Example: http://myvirtualdomain/ or http://mydomain/mydolibarrurl/)'."\n";
240  die;
241 }
242 
243 if (empty($dolibarr_main_document_root_alt)) {
244  $dolibarr_main_document_root_alt = $dolibarr_main_document_root.'/custom';
245 }
246 
247 if (empty($dolibarr_main_data_root)) {
248  // If directory not defined, we use the default hardcoded value
249  $dolibarr_main_data_root = str_replace("/htdocs", "", $dolibarr_main_document_root);
250  $dolibarr_main_data_root .= "/documents";
251 }
252 
253 // Define some constants
254 define('DOL_CLASS_PATH', 'class/'); // Filesystem path to class dir (defined only for some code that want to be compatible with old versions without this parameter)
255 define('DOL_DATA_ROOT', $dolibarr_main_data_root); // Filesystem data (documents)
256 // Try to autodetect DOL_MAIN_URL_ROOT and DOL_URL_ROOT when root is not directly the main domain.
257 // Note: autodetect works only in case 1, 2, 3 and 4 of phpunit test CoreTest.php. For case 5, 6, only setting value into conf.php will works.
258 $tmp = '';
259 $found = 0;
260 $real_dolibarr_main_document_root = str_replace('\\', '/', realpath($dolibarr_main_document_root)); // A) Value found into config file, to say where are store htdocs files. Ex: C:/xxx/dolibarr, C:/xxx/dolibarr/htdocs
261 if (!empty($_SERVER["DOCUMENT_ROOT"])) {
262  $pathroot = $_SERVER["DOCUMENT_ROOT"]; // B) Value reported by web server setup (not defined on CLI mode), to say where is root of web server instance. Ex: C:/xxx/dolibarr, C:/xxx/dolibarr/htdocs
263 } else {
264  $pathroot = 'NOTDEFINED';
265 }
266 $paths = explode('/', str_replace('\\', '/', $_SERVER["SCRIPT_NAME"])); // C) Value reported by web server, to say full path on filesystem of a file. Ex: /dolibarr/htdocs/admin/system/phpinfo.php
267 // Try to detect if $_SERVER["DOCUMENT_ROOT"]+start of $_SERVER["SCRIPT_NAME"] is $dolibarr_main_document_root. If yes, relative url to add before dol files is this start part.
268 $concatpath = '';
269 foreach ($paths as $tmppath) { // We check to find (B+start of C)=A
270  if (empty($tmppath)) {
271  continue;
272  }
273  $concatpath .= '/'.$tmppath;
274  //if ($tmppath) $concatpath.='/'.$tmppath;
275  //print $_SERVER["SCRIPT_NAME"].'-'.$pathroot.'-'.$concatpath.'-'.$real_dolibarr_main_document_root.'-'.realpath($pathroot.$concatpath).'<br>';
276  if ($real_dolibarr_main_document_root == @realpath($pathroot.$concatpath)) { // @ avoid warning when safe_mode is on.
277  //print "Found relative url = ".$concatpath;
278  $tmp3 = $concatpath;
279  $found = 1;
280  break;
281  }
282  //else print "Not found yet for concatpath=".$concatpath."<br>\n";
283 }
284 //print "found=".$found." dolibarr_main_url_root=".$dolibarr_main_url_root."\n";
285 if (!$found) {
286  // There is no subdir that compose the main url root or autodetect fails (Ie: when using apache alias that point outside default DOCUMENT_ROOT).
287  $tmp = $dolibarr_main_url_root;
288 } else {
289  $tmp = 'http'.(((empty($_SERVER["HTTPS"]) || $_SERVER["HTTPS"] != 'on') && (empty($_SERVER["SERVER_PORT"]) || $_SERVER["SERVER_PORT"] != 443)) ? '' : 's').'://'.$_SERVER["SERVER_NAME"].((empty($_SERVER["SERVER_PORT"]) || $_SERVER["SERVER_PORT"] == 80 || $_SERVER["SERVER_PORT"] == 443) ? '' : ':'.$_SERVER["SERVER_PORT"]).($tmp3 ? (preg_match('/^\//', $tmp3) ? '' : '/').$tmp3 : '');
290 }
291 //print "tmp1=".$tmp1." tmp2=".$tmp2." tmp3=".$tmp3." tmp=".$tmp."\n";
292 if (!empty($dolibarr_main_force_https)) {
293  $tmp = preg_replace('/^http:/i', 'https:', $tmp);
294 }
295 define('DOL_MAIN_URL_ROOT', $tmp); // URL absolute root (https://sss/dolibarr, ...)
296 $uri = preg_replace('/^http(s?):\/\//i', '', constant('DOL_MAIN_URL_ROOT')); // $uri contains url without http*
297 $suburi = strstr($uri, '/'); // $suburi contains url without domain:port
298 if ($suburi == '/') {
299  $suburi = ''; // If $suburi is /, it is now ''
300 }
301 if (!defined('DOL_URL_ROOT')) {
302  define('DOL_URL_ROOT', $suburi); // URL relative root ('', '/dolibarr', ...)
303 }
304 //print DOL_MAIN_URL_ROOT.'-'.DOL_URL_ROOT."\n";
305 
306 // Define prefix MAIN_DB_PREFIX
307 define('MAIN_DB_PREFIX', $dolibarr_main_db_prefix);
308 
309 
310 /*
311  * Define PATH to external libraries
312  * To use other version than embeded libraries, define here constant to path. Use '' to use include class path autodetect.
313  */
314 // Path to root libraries
315 if (!defined('TCPDF_PATH')) {
316  define('TCPDF_PATH', (empty($dolibarr_lib_TCPDF_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/tecnickcom/tcpdf/' : $dolibarr_lib_TCPDF_PATH.'/');
317 }
318 if (!defined('TCPDI_PATH')) {
319  define('TCPDI_PATH', (empty($dolibarr_lib_TCPDI_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/tcpdi/' : $dolibarr_lib_TCPDI_PATH.'/');
320 }
321 if (!defined('NUSOAP_PATH')) {
322  define('NUSOAP_PATH', (!isset($dolibarr_lib_NUSOAP_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/nusoap/lib/' : (empty($dolibarr_lib_NUSOAP_PATH) ? '' : $dolibarr_lib_NUSOAP_PATH.'/'));
323 }
324 if (!defined('PHPEXCELNEW_PATH')) {
325  define('PHPEXCELNEW_PATH', (!isset($dolibarr_lib_PHPEXCELNEW_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/phpoffice/phpspreadsheet/src/PhpSpreadsheet/' : (empty($dolibarr_lib_PHPEXCELNEW_PATH) ? '' : $dolibarr_lib_PHPEXCELNEW_PATH.'/'));
326 }
327 if (!defined('ODTPHP_PATH')) {
328  define('ODTPHP_PATH', (!isset($dolibarr_lib_ODTPHP_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/odtphp/' : (empty($dolibarr_lib_ODTPHP_PATH) ? '' : $dolibarr_lib_ODTPHP_PATH.'/'));
329 }
330 if (!defined('ODTPHP_PATHTOPCLZIP')) {
331  define('ODTPHP_PATHTOPCLZIP', (!isset($dolibarr_lib_ODTPHP_PATHTOPCLZIP)) ?DOL_DOCUMENT_ROOT.'/includes/odtphp/zip/pclzip/' : (empty($dolibarr_lib_ODTPHP_PATHTOPCLZIP) ? '' : $dolibarr_lib_ODTPHP_PATHTOPCLZIP.'/'));
332 }
333 if (!defined('JS_CKEDITOR')) {
334  define('JS_CKEDITOR', (!isset($dolibarr_js_CKEDITOR)) ? '' : (empty($dolibarr_js_CKEDITOR) ? '' : $dolibarr_js_CKEDITOR.'/'));
335 }
336 if (!defined('JS_JQUERY')) {
337  define('JS_JQUERY', (!isset($dolibarr_js_JQUERY)) ? '' : (empty($dolibarr_js_JQUERY) ? '' : $dolibarr_js_JQUERY.'/'));
338 }
339 if (!defined('JS_JQUERY_UI')) {
340  define('JS_JQUERY_UI', (!isset($dolibarr_js_JQUERY_UI)) ? '' : (empty($dolibarr_js_JQUERY_UI) ? '' : $dolibarr_js_JQUERY_UI.'/'));
341 }
342 // Other required path
343 if (!defined('DOL_DEFAULT_TTF')) {
344  define('DOL_DEFAULT_TTF', (!isset($dolibarr_font_DOL_DEFAULT_TTF)) ?DOL_DOCUMENT_ROOT.'/includes/fonts/Aerial.ttf' : (empty($dolibarr_font_DOL_DEFAULT_TTF) ? '' : $dolibarr_font_DOL_DEFAULT_TTF));
345 }
346 if (!defined('DOL_DEFAULT_TTF_BOLD')) {
347  define('DOL_DEFAULT_TTF_BOLD', (!isset($dolibarr_font_DOL_DEFAULT_TTF_BOLD)) ?DOL_DOCUMENT_ROOT.'/includes/fonts/AerialBd.ttf' : (empty($dolibarr_font_DOL_DEFAULT_TTF_BOLD) ? '' : $dolibarr_font_DOL_DEFAULT_TTF_BOLD));
348 }
349 
350 
351 /*
352  * Include functions
353  */
354 
355 // If password is encoded, we decode it. Note: When page is called for install, $dolibarr_main_db_pass may not be defined yet.
356 if ((!empty($dolibarr_main_db_pass) && preg_match('/crypted:/i', $dolibarr_main_db_pass)) || !empty($dolibarr_main_db_encrypted_pass)) {
357  if (!empty($dolibarr_main_db_pass) && preg_match('/crypted:/i', $dolibarr_main_db_pass)) {
358  $dolibarr_main_db_pass = preg_replace('/crypted:/i', '', $dolibarr_main_db_pass);
359  $dolibarr_main_db_pass = dol_decode($dolibarr_main_db_pass);
360  $dolibarr_main_db_encrypted_pass = $dolibarr_main_db_pass; // We need to set this so we can use it later to know the password was initially crypted
361  } else {
362  $dolibarr_main_db_pass = dol_decode($dolibarr_main_db_encrypted_pass);
363  }
364 }
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
dol_decode($chain, $key='1')
Decode a base 64 encoded + specific delta change.