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
27/**
28 *	\file       htdocs/filefunc.inc.php
29 * 	\ingroup	core
30 *  \brief      File that include conf.php file and commons lib like functions.lib.php
31 */
32
33if (!defined('DOL_APPLICATION_TITLE')) define('DOL_APPLICATION_TITLE', 'Dolibarr');
34if (!defined('DOL_VERSION')) define('DOL_VERSION', '13.0.5'); // a.b.c-alpha, a.b.c-beta, a.b.c-rcX or a.b.c
35
36if (!defined('EURO')) define('EURO', chr(128));
37
38// Define syslog constants
39if (!defined('LOG_DEBUG'))
40{
41	if (!function_exists("syslog")) {
42		// For PHP versions without syslog (like running on Windows OS)
43		define('LOG_EMERG', 0);
44		define('LOG_ALERT', 1);
45		define('LOG_CRIT', 2);
46		define('LOG_ERR', 3);
47		define('LOG_WARNING', 4);
48		define('LOG_NOTICE', 5);
49		define('LOG_INFO', 6);
50		define('LOG_DEBUG', 7);
51	}
52}
53
54// End of common declaration part
55if (defined('DOL_INC_FOR_VERSION_ERROR')) return;
56
57
58// Define vars
59$conffiletoshowshort = "conf.php";
60// Define localization of conf file
61// --- Start of part replaced by Dolibarr packager makepack-dolibarr
62$conffile = "conf/conf.php";
63$conffiletoshow = "htdocs/conf/conf.php";
64// For debian/redhat like systems
65//$conffile = "/etc/dolibarr/conf.php";
66//$conffiletoshow = "/etc/dolibarr/conf.php";
67
68
69// Include configuration
70// --- End of part replaced by Dolibarr packager makepack-dolibarr
71
72
73// Include configuration
74$result = @include_once $conffile; // Keep @ because with some error reporting this break the redirect done when file not found
75
76if (!$result && !empty($_SERVER["GATEWAY_INTERFACE"]))    // If install not done and we are in a web session
77{
78	if (!empty($_SERVER["CONTEXT_PREFIX"]))    // CONTEXT_PREFIX and CONTEXT_DOCUMENT_ROOT are not defined on all apache versions
79	{
80		$path = $_SERVER["CONTEXT_PREFIX"]; // example '/dolibarr/' when using an apache alias.
81		if (!preg_match('/\/$/', $path)) $path .= '/';
82	}
83	elseif (preg_match('/index\.php/', $_SERVER['PHP_SELF']))
84	{
85		// When we ask index.php, we MUST BE SURE that $path is '' at the end. This is required to make install process
86		// when using apache alias like '/dolibarr/' that point to htdocs.
87		// Note: If calling page was an index.php not into htdocs (ie comm/index.php, ...), then this redirect will fails,
88		// 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.
89		$path = '';
90	} else {
91		// If what we look is not index.php, we can try to guess location of root. May not work all the time.
92		// There is no real solution, because the only way to know the apache url relative path is to have it into conf file.
93		// 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
94		$TDir = explode('/', $_SERVER['PHP_SELF']);
95		$path = '';
96		$i = count($TDir);
97		while ($i--)
98		{
99			if (empty($TDir[$i]) || $TDir[$i] == 'htdocs') break;
100			if ($TDir[$i] == 'dolibarr') break;
101			if (substr($TDir[$i], -4, 4) == '.php') continue;
102
103			$path .= '../';
104		}
105	}
106
107	header("Location: ".$path."install/index.php");
108	exit;
109}
110
111// Force PHP error_reporting setup (Dolibarr may report warning without this)
112if (!empty($dolibarr_strict_mode))
113{
114	error_reporting(E_ALL | E_STRICT);
115} else {
116	error_reporting(E_ALL & ~(E_STRICT | E_NOTICE | E_DEPRECATED));
117}
118
119// Disable php display errors
120if (!empty($dolibarr_main_prod)) ini_set('display_errors', 'Off');
121
122// Clean parameters
123$dolibarr_main_data_root = trim($dolibarr_main_data_root);
124$dolibarr_main_url_root = trim(preg_replace('/\/+$/', '', $dolibarr_main_url_root));
125$dolibarr_main_url_root_alt = (empty($dolibarr_main_url_root_alt) ? '' : trim($dolibarr_main_url_root_alt));
126$dolibarr_main_document_root = trim($dolibarr_main_document_root);
127$dolibarr_main_document_root_alt = (empty($dolibarr_main_document_root_alt) ? '' : trim($dolibarr_main_document_root_alt));
128
129if (empty($dolibarr_main_db_port)) $dolibarr_main_db_port = 3306; // For compatibility with old configs, if not defined, we take 'mysql' type
130if (empty($dolibarr_main_db_type)) $dolibarr_main_db_type = 'mysqli'; // For compatibility with old configs, if not defined, we take 'mysql' type
131
132// Mysql driver support has been removed in favor of mysqli
133if ($dolibarr_main_db_type == 'mysql') $dolibarr_main_db_type = 'mysqli';
134if (empty($dolibarr_main_db_prefix)) $dolibarr_main_db_prefix = 'llx_';
135if (empty($dolibarr_main_db_character_set)) $dolibarr_main_db_character_set = ($dolibarr_main_db_type == 'mysqli' ? 'utf8' : ''); // Old installation
136if (empty($dolibarr_main_db_collation)) $dolibarr_main_db_collation = ($dolibarr_main_db_type == 'mysqli' ? 'utf8_unicode_ci' : ''); // Old installation
137if (empty($dolibarr_main_db_encryption)) $dolibarr_main_db_encryption = 0;
138if (empty($dolibarr_main_db_cryptkey)) $dolibarr_main_db_cryptkey = '';
139if (empty($dolibarr_main_limit_users)) $dolibarr_main_limit_users = 0;
140if (empty($dolibarr_mailing_limit_sendbyweb)) $dolibarr_mailing_limit_sendbyweb = 0;
141if (empty($dolibarr_mailing_limit_sendbycli)) $dolibarr_mailing_limit_sendbycli = 0;
142if (empty($dolibarr_strict_mode)) $dolibarr_strict_mode = 0; // For debug in php strict mode
143
144// Security: CSRF protection
145// This test check if referrer ($_SERVER['HTTP_REFERER']) is same web site than Dolibarr ($_SERVER['HTTP_HOST'])
146// when we post forms (we allow GET to allow direct link to access a particular page).
147// Note about $_SERVER[HTTP_HOST/SERVER_NAME]: http://shiflett.org/blog/2006/mar/server-name-versus-http-host
148// See also option $conf->global->MAIN_SECURITY_CSRF_WITH_TOKEN for a stronger CSRF protection.
149if (!defined('NOCSRFCHECK') && empty($dolibarr_nocsrfcheck))
150{
151	if (!empty($_SERVER['REQUEST_METHOD']) && !in_array($_SERVER['REQUEST_METHOD'], array('GET', 'HEAD')) && !empty($_SERVER['HTTP_HOST']))
152	{
153		$csrfattack = false;
154		if (empty($_SERVER['HTTP_REFERER'])) $csrfattack = true; // An evil browser was used
155		else {
156			$tmpa = parse_url($_SERVER['HTTP_HOST']);
157			$tmpb = parse_url($_SERVER['HTTP_REFERER']);
158			if ((empty($tmpa['host']) ? $tmpa['path'] : $tmpa['host']) != (empty($tmpb['host']) ? $tmpb['path'] : $tmpb['host'])) $csrfattack = true;
159		}
160		if ($csrfattack)
161		{
162			//print 'NOCSRFCHECK='.defined('NOCSRFCHECK').' REQUEST_METHOD='.$_SERVER['REQUEST_METHOD'].' HTTP_HOST='.$_SERVER['HTTP_HOST'].' HTTP_REFERER='.$_SERVER['HTTP_REFERER'];
163			// Note: We can't use dol_escape_htmltag here to escape output because lib functions.lib.ph is not yet loaded.
164			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";
165			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";
166			die;
167		}
168	}
169	// Another test is done later on token if option MAIN_SECURITY_CSRF_WITH_TOKEN is on.
170}
171if (empty($dolibarr_main_db_host))
172{
173	print '<div class="center">Dolibarr setup is not yet complete.<br><br>'."\n";
174	print '<a href="install/index.php">Click here to finish Dolibarr install process</a> ...</div>'."\n";
175	die;
176}
177if (empty($dolibarr_main_url_root))
178{
179	print 'Value for parameter \'dolibarr_main_url_root\' is not defined in your \'htdocs\conf\conf.php\' file.<br>'."\n";
180	print 'You must add this parameter with your full Dolibarr root Url (Example: http://myvirtualdomain/ or http://mydomain/mydolibarrurl/)'."\n";
181	die;
182}
183if (empty($dolibarr_main_data_root))
184{
185	// Si repertoire documents non defini, on utilise celui par defaut
186	$dolibarr_main_data_root = str_replace("/htdocs", "", $dolibarr_main_document_root);
187	$dolibarr_main_data_root .= "/documents";
188}
189
190// Define some constants
191define('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)
192define('DOL_DATA_ROOT', $dolibarr_main_data_root); // Filesystem data (documents)
193define('DOL_DOCUMENT_ROOT', $dolibarr_main_document_root); // Filesystem core php (htdocs)
194// Try to autodetect DOL_MAIN_URL_ROOT and DOL_URL_ROOT.
195// 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.
196$tmp = '';
197$found = 0;
198$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
199if (!empty($_SERVER["DOCUMENT_ROOT"])) {
200	$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
201} else {
202	$pathroot = 'NOTDEFINED';
203}
204$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
205// 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.
206$concatpath = '';
207foreach ($paths as $tmppath)	// We check to find (B+start of C)=A
208{
209	if (empty($tmppath)) continue;
210	$concatpath .= '/'.$tmppath;
211	//if ($tmppath) $concatpath.='/'.$tmppath;
212	//print $_SERVER["SCRIPT_NAME"].'-'.$pathroot.'-'.$concatpath.'-'.$real_dolibarr_main_document_root.'-'.realpath($pathroot.$concatpath).'<br>';
213	if ($real_dolibarr_main_document_root == @realpath($pathroot.$concatpath))    // @ avoid warning when safe_mode is on.
214	{
215		//print "Found relative url = ".$concatpath;
216		$tmp3 = $concatpath;
217		$found = 1;
218		break;
219	}
220	//else print "Not found yet for concatpath=".$concatpath."<br>\n";
221}
222//print "found=".$found." dolibarr_main_url_root=".$dolibarr_main_url_root."\n";
223if (!$found) $tmp = $dolibarr_main_url_root; // If autodetect fails (Ie: when using apache alias that point outside default DOCUMENT_ROOT).
224else $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 : '');
225//print "tmp1=".$tmp1." tmp2=".$tmp2." tmp3=".$tmp3." tmp=".$tmp."\n";
226if (!empty($dolibarr_main_force_https)) $tmp = preg_replace('/^http:/i', 'https:', $tmp);
227define('DOL_MAIN_URL_ROOT', $tmp); // URL absolute root (https://sss/dolibarr, ...)
228$uri = preg_replace('/^http(s?):\/\//i', '', constant('DOL_MAIN_URL_ROOT')); // $uri contains url without http*
229$suburi = strstr($uri, '/'); // $suburi contains url without domain:port
230if ($suburi == '/') $suburi = ''; // If $suburi is /, it is now ''
231define('DOL_URL_ROOT', $suburi); // URL relative root ('', '/dolibarr', ...)
232
233//print DOL_MAIN_URL_ROOT.'-'.DOL_URL_ROOT."\n";
234
235// Define prefix MAIN_DB_PREFIX
236define('MAIN_DB_PREFIX', $dolibarr_main_db_prefix);
237
238
239/*
240 * Define PATH to external libraries
241 * To use other version than embeded libraries, define here constant to path. Use '' to use include class path autodetect.
242 */
243// Path to root libraries
244if (!defined('ADODB_PATH')) { define('ADODB_PATH', (!isset($dolibarr_lib_ADODB_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/adodbtime/' : (empty($dolibarr_lib_ADODB_PATH) ? '' : $dolibarr_lib_ADODB_PATH.'/')); }
245if (!defined('TCPDF_PATH')) { define('TCPDF_PATH', (empty($dolibarr_lib_TCPDF_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/tecnickcom/tcpdf/' : $dolibarr_lib_TCPDF_PATH.'/'); }
246if (!defined('TCPDI_PATH')) { define('TCPDI_PATH', (empty($dolibarr_lib_TCPDI_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/tcpdi/' : $dolibarr_lib_TCPDI_PATH.'/'); }
247if (!defined('NUSOAP_PATH')) { define('NUSOAP_PATH', (!isset($dolibarr_lib_NUSOAP_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/nusoap/lib/' : (empty($dolibarr_lib_NUSOAP_PATH) ? '' : $dolibarr_lib_NUSOAP_PATH.'/')); }
248if (!defined('PHPEXCELNEW_PATH')) { define('PHPEXCELNEW_PATH', (!isset($dolibarr_lib_PHPEXCELNEW_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/phpoffice/PhpSpreadsheet/' : (empty($dolibarr_lib_PHPEXCELNEW_PATH) ? '' : $dolibarr_lib_PHPEXCELNEW_PATH.'/')); }
249if (!defined('ODTPHP_PATH')) { define('ODTPHP_PATH', (!isset($dolibarr_lib_ODTPHP_PATH)) ?DOL_DOCUMENT_ROOT.'/includes/odtphp/' : (empty($dolibarr_lib_ODTPHP_PATH) ? '' : $dolibarr_lib_ODTPHP_PATH.'/')); }
250if (!defined('ODTPHP_PATHTOPCLZIP')) { define('ODTPHP_PATHTOPCLZIP', (!isset($dolibarr_lib_ODTPHP_PATHTOPCLZIP)) ?DOL_DOCUMENT_ROOT.'/includes/odtphp/zip/pclzip/' : (empty($dolibarr_lib_ODTPHP_PATHTOPCLZIP) ? '' : $dolibarr_lib_ODTPHP_PATHTOPCLZIP.'/')); }
251if (!defined('JS_CKEDITOR')) { define('JS_CKEDITOR', (!isset($dolibarr_js_CKEDITOR)) ? '' : (empty($dolibarr_js_CKEDITOR) ? '' : $dolibarr_js_CKEDITOR.'/')); }
252if (!defined('JS_JQUERY')) { define('JS_JQUERY', (!isset($dolibarr_js_JQUERY)) ? '' : (empty($dolibarr_js_JQUERY) ? '' : $dolibarr_js_JQUERY.'/')); }
253if (!defined('JS_JQUERY_UI')) { define('JS_JQUERY_UI', (!isset($dolibarr_js_JQUERY_UI)) ? '' : (empty($dolibarr_js_JQUERY_UI) ? '' : $dolibarr_js_JQUERY_UI.'/')); }
254// Other required path
255if (!defined('DOL_DEFAULT_TTF')) { 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)); }
256if (!defined('DOL_DEFAULT_TTF_BOLD')) { 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)); }
257
258
259/*
260 * Include functions
261 */
262
263if (!defined('ADODB_DATE_VERSION')) include_once ADODB_PATH.'adodb-time.inc.php';
264
265if (!file_exists(DOL_DOCUMENT_ROOT."/core/lib/functions.lib.php"))
266{
267	print "Error: Dolibarr config file content seems to be not correctly defined.<br>\n";
268	print "Please run dolibarr setup by calling page <b>/install</b>.<br>\n";
269	exit;
270}
271
272
273// Included by default
274include_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php';
275include_once DOL_DOCUMENT_ROOT.'/core/lib/security.lib.php';
276//print memory_get_usage();
277
278// If password is encoded, we decode it. Note: When page is called for install, $dolibarr_main_db_pass may not be defined yet.
279if ((!empty($dolibarr_main_db_pass) && preg_match('/crypted:/i', $dolibarr_main_db_pass)) || !empty($dolibarr_main_db_encrypted_pass)) {
280	if (!empty($dolibarr_main_db_pass) && preg_match('/crypted:/i', $dolibarr_main_db_pass)) {
281		$dolibarr_main_db_pass = preg_replace('/crypted:/i', '', $dolibarr_main_db_pass);
282		$dolibarr_main_db_pass = dol_decode($dolibarr_main_db_pass);
283		$dolibarr_main_db_encrypted_pass = $dolibarr_main_db_pass; // We need to set this as it is used to know the password was initially crypted
284	} else {
285		$dolibarr_main_db_pass = dol_decode($dolibarr_main_db_encrypted_pass);
286	}
287}
288