dolibarr 24.0.0-beta
master.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-2012 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-2017 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) 2011 Philippe Grand <philippe.grand@atoo-net.com>
12 * Copyright (C) 2014 Teddy Andreotti <125155@supinfo.com>
13 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
14 * Copyright (C) 2025-2026 Frédéric France <frederic.france@free.fr>
15 *
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License as published by
18 * the Free Software Foundation; either version 3 of the License, or
19 * (at your option) any later version.
20 *
21 * This program is distributed in the hope that it will be useful,
22 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 * GNU General Public License for more details.
25 *
26 * You should have received a copy of the GNU General Public License
27 * along with this program. If not, see <https://www.gnu.org/licenses/>.
28 */
29
37// Include the conf.php and functions.lib.php and security.lib.php. This defined the constants like DOL_DOCUMENT_ROOT, DOL_DATA_ROOT, DOL_URL_ROOT...
38// This file may have been already required by main.inc.php. But may not by scripts. So, here the require_once must be kept.
39require_once 'filefunc.inc.php';
68'
69@phan-var-force ?string $dolibarr_main_db_prefix
70@phan-var-force ?string $dolibarr_main_db_collation
71@phan-var-force ?string $dolibarr_main_db_encryption
72@phan-var-force ?string $dolibarr_main_db_cryptkey
73@phan-var-force ?string $dolibarr_main_limit_users
74@phan-var-force ?string $dolibarr_main_url_root_alt
75';
76require_once DOL_DOCUMENT_ROOT.'/core/class/conf.class.php';
77require_once DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php';
78
79
80if (!function_exists('is_countable')) {
87 function is_countable($c)
88 {
89 return is_array($c) || $c instanceof Countable;
90 }
91}
92
93
94/*
95 * Define some constants
96 */
97
98if (!defined('EURO')) {
99 define('EURO', chr(128));
100}
101
102// Define syslog constants
103if (!defined('LOG_DEBUG')) {
104 if (!function_exists("syslog")) {
105 // For PHP versions without syslog (like running on Windows OS)
106 define('LOG_EMERG', 0);
107 define('LOG_ALERT', 1);
108 define('LOG_CRIT', 2);
109 define('LOG_ERR', 3);
110 define('LOG_WARNING', 4);
111 define('LOG_NOTICE', 5);
112 define('LOG_INFO', 6);
113 define('LOG_DEBUG', 7);
114 }
115}
116
117if (!defined('SUBTOTALS_SPECIAL_CODE')) {
118 define('SUBTOTALS_SPECIAL_CODE', 81);
119}
120
121
122/*
123 * Disable some not used PHP stream
124 */
125$listofwrappers = stream_get_wrappers();
126// We need '.phar' for geoip2. TODO Replace phar in geoip with exploded files so we can disable phar by default.
127// phar stream does not auto unserialize content (possible code execution) since PHP 8.1
128// zip stream is necessary by excel import module
129$arrayofstreamtodisable = array('compress.zlib', 'compress.bzip2', 'ftp', 'ftps', 'glob', 'data', 'expect', 'ogg', 'rar', 'zlib');
130if (!empty($dolibarr_main_stream_to_disable) && is_array($dolibarr_main_stream_to_disable)) {
131 $arrayofstreamtodisable = $dolibarr_main_stream_to_disable;
132}
133foreach ($arrayofstreamtodisable as $streamtodisable) {
134 if (!empty($listofwrappers) && in_array($streamtodisable, $listofwrappers)) {
135 /*if (!empty($dolibarr_main_stream_do_not_disable) && is_array($dolibarr_main_stream_do_not_disable) && in_array($streamtodisable, $dolibarr_main_stream_do_not_disable)) {
136 continue; // We do not disable this stream
137 }*/
138 stream_wrapper_unregister($streamtodisable);
139 }
140}
141
142
143/*
144 * Create $conf object
145 */
146
147$conf = new Conf();
148
149// Set properties specific to database
150$conf->db->host = empty($dolibarr_main_db_host) ? '' : $dolibarr_main_db_host;
151$conf->db->port = empty($dolibarr_main_db_port) ? '' : $dolibarr_main_db_port;
152$conf->db->name = empty($dolibarr_main_db_name) ? '' : $dolibarr_main_db_name;
153$conf->db->user = empty($dolibarr_main_db_user) ? '' : $dolibarr_main_db_user;
154$conf->db->pass = empty($dolibarr_main_db_pass) ? '' : $dolibarr_main_db_pass;
155$conf->db->type = empty($dolibarr_main_db_type) ? '' : $dolibarr_main_db_type;
156$conf->db->prefix = $dolibarr_main_db_prefix;
157$conf->db->character_set = $dolibarr_main_db_character_set;
158$conf->db->dolibarr_main_db_collation = $dolibarr_main_db_collation;
159$conf->db->dolibarr_main_db_encryption = $dolibarr_main_db_encryption;
160$conf->db->dolibarr_main_db_cryptkey = $dolibarr_main_db_cryptkey;
161if (defined('TEST_DB_FORCE_TYPE')) {
162 $conf->db->type = constant('TEST_DB_FORCE_TYPE'); // Force db type (for test purpose, by PHP unit for example)
163}
164
165// Set properties specific to conf file
166$conf->file->main_limit_users = $dolibarr_main_limit_users;
167$conf->file->mailing_limit_sendbyweb = empty($dolibarr_mailing_limit_sendbyweb) ? 0 : $dolibarr_mailing_limit_sendbyweb;
168$conf->file->mailing_limit_sendbycli = empty($dolibarr_mailing_limit_sendbycli) ? 0 : $dolibarr_mailing_limit_sendbycli;
169$conf->file->mailing_limit_sendbyday = empty($dolibarr_mailing_limit_sendbyday) ? 0 : $dolibarr_mailing_limit_sendbyday;
170$conf->file->main_authentication = empty($dolibarr_main_authentication) ? 'dolibarr' : $dolibarr_main_authentication; // Identification mode
171$conf->file->main_force_https = empty($dolibarr_main_force_https) ? '' : $dolibarr_main_force_https; // Force https
172$conf->file->strict_mode = empty($dolibarr_strict_mode) ? '' : $dolibarr_strict_mode; // Force php strict mode (for debug)
173$conf->file->instance_unique_id = empty($dolibarr_main_instance_unique_id) ? (empty($dolibarr_main_cookie_cryptkey) ? '' : $dolibarr_main_cookie_cryptkey) : $dolibarr_main_instance_unique_id; // Unique id of instance
174$conf->file->dol_main_url_root = $dolibarr_main_url_root; // Define url inside the config file
175$conf->file->dol_document_root = array('main' => (string) DOL_DOCUMENT_ROOT); // Define an array of document root directories ('/home/htdocs')
176$conf->file->dol_url_root = array('main' => (string) DOL_URL_ROOT); // Define an array of url root path ('' or '/dolibarr')
177if (!empty($dolibarr_main_document_root_alt)) {
178 // dolibarr_main_document_root_alt can contains several directories
179 $values = preg_split('/[;,]/', $dolibarr_main_document_root_alt);
180 $i = 0;
181 foreach ($values as $value) {
182 $conf->file->dol_document_root['alt'.($i++)] = (string) $value;
183 }
184 $values = preg_split('/[;,]/', (string) $dolibarr_main_url_root_alt);
185 $i = 0;
186 foreach ($values as $value) {
187 if (preg_match('/^http(s)?:/', $value)) {
188 // Show error message
189 $correct_value = str_replace($dolibarr_main_url_root, '', $value);
190 print '<b>Error:</b><br>'."\n";
191 print 'Wrong <b>$dolibarr_main_url_root_alt</b> value in <b>conf.php</b> file.<br>'."\n";
192 print 'We now use a relative path to $dolibarr_main_url_root to build alternate URLs.<br>'."\n";
193 print 'Value found: '.$value.'<br>'."\n";
194 print 'Should be replaced by: '.$correct_value.'<br>'."\n";
195 print "Or something like following examples:<br>\n";
196 print "\"/extensions\"<br>\n";
197 print "\"/extensions1,/extensions2,...\"<br>\n";
198 print "\"/../extensions\"<br>\n";
199 print "\"/custom\"<br>\n";
200 exit;
201 }
202 $conf->file->dol_url_root['alt'.($i++)] = (string) $value;
203 }
204}
205
206// Load the main includes of common libraries
207if (!defined('NOREQUIREUSER')) {
208 require_once DOL_DOCUMENT_ROOT.'/user/class/user.class.php'; // Need 500ko memory
209}
210if (!defined('NOREQUIRETRAN')) {
211 require_once DOL_DOCUMENT_ROOT.'/core/class/translate.class.php';
212}
213if (!defined('NOREQUIRESOC')) {
214 require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
215}
216
217
218/*
219 * Create object $langs (must be before all other code)
220 */
221$langs = null;
222if (!defined('NOREQUIRETRAN')) {
223 $langs = new Translate('', $conf); // Must be after reading conf
224}
225
226
227/*
228 * Create object $db
229 */
230$db = null;
231if (!defined('NOREQUIREDB')) {
232 $db = getDoliDBInstance($conf->db->type, $conf->db->host, $conf->db->user, $conf->db->pass, $conf->db->name, (int) $conf->db->port);
237 if ($db->error) {
238 if (is_object($langs)) {
239 $langs->setDefaultLang('auto');
240 }
241 // If we were into a website context
242 if (!defined('USEDOLIBARREDITOR') && !defined('USEDOLIBARRSERVER') && !empty($_SERVER['SCRIPT_FILENAME']) && (strpos($_SERVER['SCRIPT_FILENAME'], DOL_DATA_ROOT.'/website') === 0)) {
243 $sapi_type = php_sapi_name();
244 if (substr($sapi_type, 0, 3) != 'cgi') {
245 http_response_code(503); // To tel search engine this is a temporary error
246 }
247 print '<div class="center" style="text-align: center; margin: 100px;">';
248 if (is_object($langs)) {
249 $langs->load("website");
250 print $langs->trans("SorryWebsiteIsCurrentlyOffLine");
251 } else {
252 print "SorryWebsiteIsCurrentlyOffLine";
253 }
254 print '</div>';
255 exit(1);
256 }
257 dol_print_error($db, "host=".$conf->db->host.", port=".$conf->db->port.", user=".$conf->db->user.", databasename=".$conf->db->name.", ".$db->error);
258 exit(1);
259 }
260}
261
262// Now database connection is known, so we can forget password
263//unset($dolibarr_main_db_pass); // We comment this because this constant is used in some other pages
264unset($conf->db->pass); // This is to avoid password to be shown in memory/swap dump
265
266
267/*
268 * Create object $user
269 */
270if (!defined('NOREQUIREUSER')) {
271 $user = new User($db);
272}
273
274/*
275 * Create the global $hookmanager object
276 */
277if (!defined('NOHOOKMANAGER')) {
278 $hookmanager = new HookManager($db);
279}
280/*
281 * Create $extrafields object
282 */
283if ($db !== null) {
284 require_once DOL_DOCUMENT_ROOT . '/core/class/extrafields.class.php';
285 $extrafields = new ExtraFields($db);
286}
287
288
289/*
290 * Load object $conf
291 */
292
293// By default conf->entity is 1, but we change this if we ask another value.
294if (session_id() && !empty($_SESSION["dol_entity"])) {
295 // Entity inside an opened session
296 $conf->entity = $_SESSION["dol_entity"];
297} elseif (!empty($_ENV["dol_entity"])) {
298 // Entity inside a CLI script
299 $conf->entity = $_ENV["dol_entity"];
300} elseif (GETPOSTISSET("loginfunction") && (GETPOSTINT("entity") || GETPOSTINT("switchentity"))) {
301 // Just after a login page
302 $conf->entity = (GETPOSTISSET("entity") ? GETPOSTINT("entity") : GETPOSTINT("switchentity"));
303} elseif (defined('DOLENTITY') && is_numeric(constant('DOLENTITY'))) {
304 // For public page with MultiCompany module
305 $conf->entity = constant('DOLENTITY');
306}
307// Sanitize entity
308if (!is_numeric($conf->entity)) {
309 $conf->entity = 1;
310}
311// Here we read database (llx_const table) and define conf var $conf->global->XXX.
312//print "We work with data into entity instance number '".$conf->entity."'";
313if ($db !== null) {
314 $conf->setValues($db);
315}
316
317
318// Set default language (must be after the setValues setting global conf 'MAIN_LANG_DEFAULT'. Page main.inc.php will overwrite langs->defaultlang with user value later)
319if (!defined('NOREQUIRETRAN')) {
320 $langcode = (GETPOST('lang', 'aZ09') ? GETPOST('lang', 'aZ09', 1) : getDolGlobalString('MAIN_LANG_DEFAULT', 'auto'));
321 if (defined('MAIN_LANG_DEFAULT')) { // So a page can force the language whatever is setup and parameters in URL
322 $langcode = constant('MAIN_LANG_DEFAULT');
323 }
324 $langs->setDefaultLang($langcode);
325}
326
327
328// Create object $mysoc (A thirdparty object that contains properties of companies managed by Dolibarr.
329if (!defined('NOREQUIREDB') && !defined('NOREQUIRESOC') && $db != null) {
330 require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php';
331
332 $mysoc = new Societe($db);
333 $mysoc->setMysoc($conf);
334
335 // We set some specific default values according to country
336
337 if ($mysoc->country_code == 'DE' && !isset($conf->global->MAIN_INVERT_SENDER_RECIPIENT)) {
338 // For DE, we need to invert our address with customer address
339 $conf->global->MAIN_INVERT_SENDER_RECIPIENT = 1;
340 }
341 if ($mysoc->country_code == 'FR' && !isset($conf->global->INVOICE_CATEGORY_OF_OPERATION)) {
342 // For FR, default value of option to show category of operations is on by default. Decret n°2099-1299 2022-10-07
343 $conf->global->INVOICE_CATEGORY_OF_OPERATION = 1;
344 }
345 if ($mysoc->country_code == 'FR' && !isset($conf->global->INVOICE_DISABLE_REPLACEMENT)) {
346 // For FR, the replacement invoice type is not allowed.
347 // From an accounting point of view, this creates holes in the numbering of the invoice.
348 // This is very problematic during a fiscal control.
349 $conf->global->INVOICE_DISABLE_REPLACEMENT = 1;
350 }
351 if ($mysoc->country_code == 'GR' && !isset($conf->global->INVOICE_DISABLE_REPLACEMENT)) {
352 // The replacement invoice type is not allowed in Greece.
353 $conf->global->INVOICE_DISABLE_REPLACEMENT = 1;
354 }
355 if ($mysoc->country_code == 'GR' && !isset($conf->global->INVOICE_DISABLE_DEPOSIT)) {
356 // The deposit invoice type is not allowed in Greece.
357 $conf->global->INVOICE_DISABLE_DEPOSIT = 1;
358 }
359 if ($mysoc->country_code == 'GR' && !isset($conf->global->INVOICE_CREDIT_NOTE_STANDALONE)) {
360 // Standalone credit note is compulsory in Greece.
361 $conf->global->INVOICE_CREDIT_NOTE_STANDALONE = 1;
362 }
363 if ($mysoc->country_code == 'GR' && !isset($conf->global->INVOICE_SUBTYPE_ENABLED)) {
364 // Invoice subtype is a requirement for Greece.
365 $conf->global->INVOICE_SUBTYPE_ENABLED = 1;
366 }
367
368 if (($mysoc->localtax1_assuj || $mysoc->localtax2_assuj) && !isset($conf->global->MAIN_NO_INPUT_PRICE_WITH_TAX)) {
369 // For countries using the 2nd or 3rd tax, we disable input/edit of lines using the price including tax (because 2nb and 3rd tax not yet taken into account).
370 // Work In Progress to support all taxes into unit price entry when MAIN_UNIT_PRICE_WITH_TAX_IS_FOR_ALL_TAXES is set.
371 $conf->global->MAIN_NO_INPUT_PRICE_WITH_TAX = 1;
372 }
373}
global $dolibarr_main_url_root
$c
Definition line.php:334
Class to stock current configuration.
Class to manage standard extra fields.
Class to manage hooks.
Class to manage third parties objects (customers, suppliers, prospects...)
Class to manage translations.
Class to manage Dolibarr users.
global $mysoc
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $conf
The main.inc.php has been included so the following variable are now defined:
if(!isModEnabled('ai')||!getDolGlobalString('AI_ASSISTANT_ENABLED')) global $db
API class for accounts.
GETPOSTINT($paramname, $method=0)
Return the value of a $_GET or $_POST supervariable, converted into integer.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
getDoliDBInstance($type, $host, $user, $pass, $name, $port)
Return a DoliDB instance (database handler).