filefunc.inc.php 17 KB

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