alxarafe /
alixar
| 1 | <?php |
||
| 2 | |||
| 3 | /* Copyright (C) 2004 Rodolphe Quiedeville <[email protected]> |
||
| 4 | * Copyright (C) 2004 Benoit Mortier <[email protected]> |
||
| 5 | * Copyright (C) 2004 Sebastien DiCintio <[email protected]> |
||
| 6 | * Copyright (C) 2007-2012 Laurent Destailleur <[email protected]> |
||
| 7 | * Copyright (C) 2012 Marcos García <[email protected]> |
||
| 8 | * Copyright (C) 2016 Raphaël Doursenaud <[email protected]> |
||
| 9 | * Copyright (C) 2021 Charlene Benke <[email protected]> |
||
| 10 | * Copyright (C) 2023 Alexandre Janniaux <[email protected]> |
||
| 11 | * Copyright (C) 2024 MDW <[email protected]> |
||
| 12 | * Copyright (C) 2024 Rafael San José <[email protected]> |
||
| 13 | * |
||
| 14 | * This program is free software; you can redistribute it and/or modify |
||
| 15 | * it under the terms of the GNU General Public License as published by |
||
| 16 | * the Free Software Foundation; either version 3 of the License, or |
||
| 17 | * (at your option) any later version. |
||
| 18 | * |
||
| 19 | * This program is distributed in the hope that it will be useful, |
||
| 20 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
||
| 21 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||
| 22 | * GNU General Public License for more details. |
||
| 23 | * |
||
| 24 | * You should have received a copy of the GNU General Public License |
||
| 25 | * along with this program. If not, see <https://www.gnu.org/licenses/>. |
||
| 26 | */ |
||
| 27 | |||
| 28 | use Dolibarr\Code\Core\Classes\Conf; |
||
| 29 | use Dolibarr\Code\Core\Classes\Translate; |
||
| 30 | |||
| 31 | /** |
||
| 32 | * \file htdocs/install/inc.php |
||
| 33 | * \ingroup core |
||
| 34 | * \brief File that define environment for support pages |
||
| 35 | */ |
||
| 36 | |||
| 37 | // Just to define version DOL_VERSION |
||
| 38 | if (!defined('DOL_INC_FOR_VERSION_ERROR')) { |
||
| 39 | define('DOL_INC_FOR_VERSION_ERROR', '1'); |
||
| 40 | } |
||
| 41 | require_once constant('DOL_DOCUMENT_ROOT') . '/filefunc.inc.php'; |
||
| 42 | require_once constant('DOL_DOCUMENT_ROOT') . '/core/lib/functions.lib.php'; |
||
| 43 | require_once constant('DOL_DOCUMENT_ROOT') . '/core/lib/admin.lib.php'; |
||
| 44 | require_once constant('DOL_DOCUMENT_ROOT') . '/core/lib/files.lib.php'; |
||
| 45 | |||
| 46 | $conf = new Conf(); |
||
| 47 | |||
| 48 | // Force $_REQUEST["logtohtml"] |
||
| 49 | $_REQUEST["logtohtml"] = 1; |
||
| 50 | |||
| 51 | // Correction PHP_SELF (ex pour apache via caudium) car PHP_SELF doit valoir URL relative |
||
| 52 | // et non path absolu. |
||
| 53 | if (isset($_SERVER["DOCUMENT_URI"]) && $_SERVER["DOCUMENT_URI"]) { |
||
| 54 | $_SERVER["PHP_SELF"] = $_SERVER["DOCUMENT_URI"]; |
||
| 55 | } |
||
| 56 | |||
| 57 | |||
| 58 | $includeconferror = ''; |
||
| 59 | |||
| 60 | |||
| 61 | // Define vars |
||
| 62 | $conffiletoshowshort = "conf.php"; |
||
| 63 | // Define localization of conf file |
||
| 64 | $conffile = constant('DOL_DOCUMENT_ROOT') . '/conf/conf.php'; |
||
| 65 | $conffiletoshow = "conf/conf.php"; |
||
| 66 | // For debian/redhat like systems |
||
| 67 | //$conffile = "/etc/dolibarr/conf.php"; |
||
| 68 | //$conffiletoshow = "/etc/dolibarr/conf.php"; |
||
| 69 | |||
| 70 | $short_options = "c:h"; |
||
| 71 | $long_options = array( |
||
| 72 | "config:", |
||
| 73 | "help", |
||
| 74 | ); |
||
| 75 | |||
| 76 | /** |
||
| 77 | * Print the usage when executing scripts from install/. |
||
| 78 | * |
||
| 79 | * Print the help text exposing the available options when executing |
||
| 80 | * update or install script (ie. from htdocs/install/) from CLI with |
||
| 81 | * the `php` executable. This function does not `exit` the program and |
||
| 82 | * the caller should then call `exit` themselves since they should |
||
| 83 | * determine whether it was an error or not. |
||
| 84 | * |
||
| 85 | * @param string $program the script that was originally run |
||
| 86 | * @param string $header the message to signal to the user |
||
| 87 | * @return void |
||
| 88 | */ |
||
| 89 | function usage($program, $header) |
||
| 90 | { |
||
| 91 | echo $header . "\n"; |
||
| 92 | echo " php " . $program . " [options] [script options]\n"; |
||
| 93 | echo "\n"; |
||
| 94 | echo "Script syntax when using step2.php:\n"; |
||
| 95 | echo " php " . $program . " [options] [action] [selectlang]\n"; |
||
| 96 | echo "\n"; |
||
| 97 | echo " action:\n"; |
||
| 98 | echo " Specify the action to execute for the file among the following ones.\n"; |
||
| 99 | echo " - set: Create tables, keys, functions and data for the instance.\n"; |
||
| 100 | echo "\n"; |
||
| 101 | echo " selectlang:\n"; |
||
| 102 | echo " Setup the default lang to use, default to 'auto'.\n"; |
||
| 103 | echo "\n"; |
||
| 104 | echo "Script syntax when using upgrade.php:\n"; |
||
| 105 | echo " php " . $program . " [options] previous_version new_version [script options]\n"; |
||
| 106 | echo "\n"; |
||
| 107 | echo " dirmodule:\n"; |
||
| 108 | echo " Specify dirmodule to provide a path for an external module\n"; |
||
| 109 | echo " so the migration is done using a script from a module.\n"; |
||
| 110 | echo "\n"; |
||
| 111 | echo " ignoredbversion:\n"; |
||
| 112 | echo " Allow to run migration even if database version does\n"; |
||
| 113 | echo " not match start version of migration.\n"; |
||
| 114 | echo "\n"; |
||
| 115 | echo "Script syntax when using upgrade2.php:\n"; |
||
| 116 | echo " php " . $program . " [options] previous_version new_version [module list]\n"; |
||
| 117 | echo "\n"; |
||
| 118 | echo " MAIN_MODULE_NAME1,MAIN_MODULE_NAME2:\n"; |
||
| 119 | echo " Specify a list of module-name to enable, in upper case, with MAIN_MODULE_ prefix, joined by comma.\n"; |
||
| 120 | echo "\n"; |
||
| 121 | echo "Options:\n"; |
||
| 122 | echo " -c, --config <filename>:\n"; |
||
| 123 | echo " Provide a different conf.php file to use.\n"; |
||
| 124 | echo "\n"; |
||
| 125 | echo " -h, --help:\n"; |
||
| 126 | echo " Display this help message.\n"; |
||
| 127 | } |
||
| 128 | |||
| 129 | if (php_sapi_name() === "cli" && (float)PHP_VERSION > 7.0) { |
||
| 130 | $rest_index = 0; |
||
| 131 | $opts = getopt($short_options, $long_options, $rest_index); |
||
| 132 | |||
| 133 | foreach ($opts as $opt => $arg) { |
||
| 134 | switch ($opt) { |
||
| 135 | case 'c': |
||
| 136 | case 'config': |
||
| 137 | $conffile = $arg; |
||
| 138 | $conffiletoshow = $arg; |
||
| 139 | break; |
||
| 140 | case 'h': |
||
| 141 | case 'help': |
||
| 142 | usage($argv[0], "Usage:"); |
||
| 143 | exit(0); |
||
| 144 | } |
||
| 145 | } |
||
| 146 | |||
| 147 | // Parse the arguments to find the options. |
||
| 148 | $args_options = array_filter( |
||
| 149 | array_slice($argv, 0, $rest_index), |
||
| 150 | /** |
||
| 151 | * @param string $arg |
||
| 152 | * @return bool |
||
| 153 | */ |
||
| 154 | static function ($arg) { |
||
| 155 | return strlen($arg) >= 2 && $arg[0] == '-'; |
||
| 156 | } |
||
| 157 | ); |
||
| 158 | $parsed_options = array_map( |
||
| 159 | /** |
||
| 160 | * Previx option with '-' for single characters and -- for more than single characters |
||
| 161 | * @param string $arg |
||
| 162 | * @return string |
||
| 163 | */ |
||
| 164 | static function ($arg) { |
||
| 165 | if (strlen($arg) > 1) { |
||
| 166 | return "--" . $arg; |
||
| 167 | } |
||
| 168 | return "-" . $arg; |
||
| 169 | }, |
||
| 170 | array_keys($opts) |
||
| 171 | ); |
||
| 172 | |||
| 173 | // Find options (dash-prefixed) that were not parsed. |
||
| 174 | $unknown_options = array_diff($args_options, $parsed_options); |
||
| 175 | |||
| 176 | // In the following test, only dash-prefixed arguments will trigger an |
||
| 177 | // error, given that scripts options can allow a variable number of |
||
| 178 | // additional non-prefixed argument and we mostly want to check for |
||
| 179 | // typo right now. |
||
| 180 | if (count($unknown_options) > 0) { |
||
| 181 | echo "Unknown option: " . array_values($unknown_options)[0] . "\n"; |
||
| 182 | usage($argv[0], "Usage:"); |
||
| 183 | exit(1); |
||
| 184 | } |
||
| 185 | |||
| 186 | // Tricky argument list hack, should be removed someday. |
||
| 187 | // Reset argv to remove the argument that were parsed. This is needed |
||
| 188 | // currently because some install code, like in upgrade.php, are using |
||
| 189 | // $argv[] directly with fixed index to fetch some arguments. |
||
| 190 | $argv = array_merge(array($argv[0]), array_slice($argv, $rest_index)); |
||
| 191 | $argc = count($argv); |
||
| 192 | } |
||
| 193 | |||
| 194 | // Load conf file if it is already defined |
||
| 195 | if (!defined('DONOTLOADCONF') && file_exists($conffile) && filesize($conffile) > 8) { // Test on filesize is to ensure that conf file is more that an empty template with just <?php in first line |
||
| 196 | $result = include_once $conffile; // Load conf file |
||
| 197 | if ($result) { |
||
| 198 | if (empty($dolibarr_main_db_type)) { |
||
| 199 | $dolibarr_main_db_type = 'mysqli'; // For backward compatibility |
||
| 200 | } |
||
| 201 | |||
| 202 | //Mysql driver support has been removed in favor of mysqli |
||
| 203 | if ($dolibarr_main_db_type == 'mysql') { |
||
| 204 | $dolibarr_main_db_type = 'mysqli'; |
||
| 205 | } |
||
| 206 | |||
| 207 | if (!isset($dolibarr_main_db_port) && ($dolibarr_main_db_type == 'mysqli')) { |
||
| 208 | $dolibarr_main_db_port = '3306'; // For backward compatibility |
||
| 209 | } |
||
| 210 | |||
| 211 | // Clean parameters |
||
| 212 | $dolibarr_main_data_root = isset($dolibarr_main_data_root) ? trim($dolibarr_main_data_root) : DOL_DOCUMENT_ROOT . '/../documents'; |
||
| 213 | $dolibarr_main_url_root = isset($dolibarr_main_url_root) ? trim($dolibarr_main_url_root) : ''; |
||
| 214 | $dolibarr_main_url_root_alt = isset($dolibarr_main_url_root_alt) ? trim($dolibarr_main_url_root_alt) : ''; |
||
| 215 | $dolibarr_main_document_root = isset($dolibarr_main_document_root) ? trim($dolibarr_main_document_root) : ''; |
||
| 216 | $dolibarr_main_document_root_alt = isset($dolibarr_main_document_root_alt) ? trim($dolibarr_main_document_root_alt) : ''; |
||
| 217 | |||
| 218 | // Remove last / or \ on directories or url value |
||
| 219 | if (!empty($dolibarr_main_document_root) && !preg_match('/^[\\/]+$/', $dolibarr_main_document_root)) { |
||
| 220 | $dolibarr_main_document_root = preg_replace('/[\\/]+$/', '', $dolibarr_main_document_root); |
||
| 221 | } |
||
| 222 | if (!empty($dolibarr_main_url_root) && !preg_match('/^[\\/]+$/', $dolibarr_main_url_root)) { |
||
| 223 | $dolibarr_main_url_root = preg_replace('/[\\/]+$/', '', $dolibarr_main_url_root); |
||
| 224 | } |
||
| 225 | if (!empty($dolibarr_main_data_root) && !preg_match('/^[\\/]+$/', $dolibarr_main_data_root)) { |
||
| 226 | $dolibarr_main_data_root = preg_replace('/[\\/]+$/', '', $dolibarr_main_data_root); |
||
| 227 | } |
||
| 228 | if (!empty($dolibarr_main_document_root_alt) && !preg_match('/^[\\/]+$/', $dolibarr_main_document_root_alt)) { |
||
| 229 | $dolibarr_main_document_root_alt = preg_replace('/[\\/]+$/', '', $dolibarr_main_document_root_alt); |
||
| 230 | } |
||
| 231 | if (!empty($dolibarr_main_url_root_alt) && !preg_match('/^[\\/]+$/', $dolibarr_main_url_root_alt)) { |
||
| 232 | $dolibarr_main_url_root_alt = preg_replace('/[\\/]+$/', '', $dolibarr_main_url_root_alt); |
||
| 233 | } |
||
| 234 | |||
| 235 | // Create conf object |
||
| 236 | if (!empty($dolibarr_main_document_root)) { |
||
| 237 | $result = conf($dolibarr_main_document_root); |
||
| 238 | } |
||
| 239 | // Load database driver |
||
| 240 | if ($result) { |
||
| 241 | if (!empty($dolibarr_main_document_root) && !empty($dolibarr_main_db_type)) { |
||
| 242 | $result = include_once $dolibarr_main_document_root . "/core/db/" . $dolibarr_main_db_type . '.class.php'; |
||
| 243 | if (!$result) { |
||
| 244 | $includeconferror = 'ErrorBadValueForDolibarrMainDBType'; |
||
| 245 | } |
||
| 246 | } |
||
| 247 | } else { |
||
| 248 | $includeconferror = 'ErrorBadValueForDolibarrMainDocumentRoot'; |
||
| 249 | } |
||
| 250 | } else { |
||
| 251 | $includeconferror = 'ErrorBadFormatForConfFile'; |
||
| 252 | } |
||
| 253 | } |
||
| 254 | |||
| 255 | $conf->global->MAIN_ENABLE_LOG_TO_HTML = 1; |
||
| 256 | |||
| 257 | // Define prefix |
||
| 258 | if (!isset($dolibarr_main_db_prefix) || !$dolibarr_main_db_prefix) { |
||
| 259 | $dolibarr_main_db_prefix = constant('DEFAULT_DB_PREFIX'); |
||
| 260 | } |
||
| 261 | define('MAIN_DB_PREFIX', (isset($dolibarr_main_db_prefix) ? $dolibarr_main_db_prefix : '')); |
||
| 262 | |||
| 263 | define('DOL_CLASS_PATH', 'class/'); // Filesystem path to class dir |
||
| 264 | define('DOL_DATA_ROOT', (isset($dolibarr_main_data_root) ? $dolibarr_main_data_root : DOL_DOCUMENT_ROOT . '/../documents')); |
||
| 265 | define('DOL_MAIN_URL_ROOT', (isset($dolibarr_main_url_root) ? $dolibarr_main_url_root : '')); // URL relative root |
||
| 266 | |||
| 267 | if (empty($conf->file->character_set_client)) { |
||
| 268 | $conf->file->character_set_client = "utf-8"; |
||
| 269 | } |
||
| 270 | if (empty($conf->db->character_set)) { |
||
| 271 | $conf->db->character_set = 'utf8'; |
||
| 272 | } |
||
| 273 | if (empty($conf->db->dolibarr_main_db_collation)) { |
||
| 274 | $conf->db->dolibarr_main_db_collation = 'utf8_unicode_ci'; |
||
| 275 | } |
||
| 276 | if (empty($conf->db->dolibarr_main_db_encryption)) { |
||
| 277 | $conf->db->dolibarr_main_db_encryption = 0; |
||
| 278 | } |
||
| 279 | if (empty($conf->db->dolibarr_main_db_cryptkey)) { |
||
| 280 | $conf->db->dolibarr_main_db_cryptkey = ''; |
||
| 281 | } |
||
| 282 | if (empty($conf->db->user)) { |
||
| 283 | $conf->db->user = ''; |
||
| 284 | } |
||
| 285 | |||
| 286 | // Define array of document root directories |
||
| 287 | $conf->file->dol_document_root = array(DOL_DOCUMENT_ROOT); |
||
| 288 | if (!empty($dolibarr_main_document_root_alt)) { |
||
| 289 | // dolibarr_main_document_root_alt contains several directories |
||
| 290 | $values = preg_split('/[;,]/', $dolibarr_main_document_root_alt); |
||
| 291 | foreach ($values as $value) { |
||
| 292 | $conf->file->dol_document_root[] = $value; |
||
| 293 | } |
||
| 294 | } |
||
| 295 | |||
| 296 | |||
| 297 | // Check install.lock (for both install and upgrade) |
||
| 298 | |||
| 299 | $lockfile = DOL_DATA_ROOT . '/install.lock'; // To lock all /install pages |
||
| 300 | $lockfile2 = DOL_DOCUMENT_ROOT . '/install.lock'; // To lock all /install pages (recommended) |
||
| 301 | $upgradeunlockfile = DOL_DATA_ROOT . '/upgrade.unlock'; // To unlock upgrade process |
||
| 302 | $upgradeunlockfile2 = DOL_DOCUMENT_ROOT . '/upgrade.unlock'; // To unlock upgrade process |
||
| 303 | if (constant('DOL_DATA_ROOT') === null) { |
||
| 304 | // We don't have a configuration file yet |
||
| 305 | // Try to detect any lockfile in the default documents path |
||
| 306 | $lockfile = '../../documents/install.lock'; |
||
| 307 | $upgradeunlockfile = '../../documents/upgrade.unlock'; |
||
| 308 | } |
||
| 309 | $islocked = false; |
||
| 310 | if (@file_exists($lockfile) || @file_exists($lockfile2)) { |
||
| 311 | if (!defined('ALLOWED_IF_UPGRADE_UNLOCK_FOUND') || (!@file_exists($upgradeunlockfile) && !@file_exists($upgradeunlockfile2))) { |
||
| 312 | // If this is a dangerous install page (ALLOWED_IF_UPGRADE_UNLOCK_FOUND not defined) or |
||
| 313 | // if there is no upgrade unlock files, we lock the pages. |
||
| 314 | $islocked = true; |
||
| 315 | } |
||
| 316 | } |
||
| 317 | if ($islocked) { // Pages are locked |
||
| 318 | if (!isset($langs) || !is_object($langs)) { |
||
| 319 | $langs = new Translate('..', $conf); |
||
| 320 | $langs->setDefaultLang('auto'); |
||
| 321 | } |
||
| 322 | $langs->load("install"); |
||
| 323 | |||
| 324 | header("X-Content-Type-Options: nosniff"); |
||
| 325 | header("X-Frame-Options: SAMEORIGIN"); // Frames allowed only if on same domain (stop some XSS attacks) |
||
| 326 | |||
| 327 | if (GETPOST('action') != 'upgrade') { |
||
| 328 | print $langs->trans("YouTryInstallDisabledByFileLock") . '<br>'; |
||
| 329 | } else { |
||
| 330 | print $langs->trans("YouTryUpgradeDisabledByMissingFileUnLock") . '<br>'; |
||
| 331 | } |
||
| 332 | if (!empty($dolibarr_main_url_root)) { |
||
| 333 | if (GETPOST('action') != 'upgrade' && (!file_exists($conffile) || !isset($dolibarr_main_url_root))) { |
||
| 334 | print $langs->trans("ClickOnLinkOrRemoveManualy") . '<br>'; |
||
| 335 | } else { |
||
| 336 | print $langs->trans("ClickOnLinkOrCreateUnlockFileManualy") . '<br>'; |
||
| 337 | } |
||
| 338 | print '<a href="' . $dolibarr_main_url_root . '/admin/index.php?mainmenu=home&leftmenu=setup' . (GETPOSTISSET("login") ? '&username=' . urlencode(GETPOST("login")) : '') . '">'; |
||
| 339 | print $langs->trans("ClickHereToGoToApp"); |
||
| 340 | print '</a>'; |
||
| 341 | } else { |
||
| 342 | print 'If you always reach this page, you must remove the install.lock file manually.<br>'; |
||
| 343 | } |
||
| 344 | exit; |
||
| 345 | } |
||
| 346 | |||
| 347 | |||
| 348 | // Force usage of log file for install and upgrades |
||
| 349 | $conf->modules['syslog'] = 'syslog'; |
||
| 350 | $conf->global->SYSLOG_LEVEL = constant('LOG_DEBUG'); |
||
| 351 | if (!defined('SYSLOG_HANDLERS')) { |
||
| 352 | define('SYSLOG_HANDLERS', '["mod_syslog_file"]'); |
||
| 353 | } |
||
| 354 | if (!defined('SYSLOG_FILE')) { // To avoid warning on systems with constant already defined |
||
| 355 | if (@is_writable('/tmp')) { |
||
| 356 | define('SYSLOG_FILE', '/tmp/dolibarr_install.log'); |
||
| 357 | } elseif (!empty($_ENV["TMP"]) && @is_writable($_ENV["TMP"])) { |
||
| 358 | define('SYSLOG_FILE', $_ENV["TMP"] . '/dolibarr_install.log'); |
||
| 359 | } elseif (!empty($_ENV["TEMP"]) && @is_writable($_ENV["TEMP"])) { |
||
| 360 | define('SYSLOG_FILE', $_ENV["TEMP"] . '/dolibarr_install.log'); |
||
| 361 | } elseif (@is_writable('../../../../') && @file_exists('../../../../startdoliwamp.bat')) { |
||
| 362 | define('SYSLOG_FILE', '../../../../dolibarr_install.log'); // For DoliWamp |
||
| 363 | } elseif (@is_writable('../../')) { |
||
| 364 | define('SYSLOG_FILE', '../../dolibarr_install.log'); // For others |
||
| 365 | } |
||
| 366 | //print 'SYSLOG_FILE='.SYSLOG_FILE;exit; |
||
| 367 | } |
||
| 368 | if (defined('SYSLOG_FILE')) { |
||
| 369 | $conf->global->SYSLOG_FILE = constant('SYSLOG_FILE'); |
||
| 370 | } |
||
| 371 | if (!defined('SYSLOG_FILE_NO_ERROR')) { |
||
| 372 | define('SYSLOG_FILE_NO_ERROR', 1); |
||
| 373 | } |
||
| 374 | // We init log handler for install |
||
| 375 | $handlers = array('mod_syslog_file'); |
||
| 376 | foreach ($handlers as $handler) { |
||
| 377 | $file = DOL_DOCUMENT_ROOT . '/core/modules/syslog/' . $handler . '.php'; |
||
| 378 | if (!file_exists($file)) { |
||
| 379 | throw new Exception('Missing log handler file ' . $handler . '.php'); |
||
| 380 | } |
||
| 381 | |||
| 382 | require_once $file; |
||
| 383 | $loghandlerinstance = new $handler(); |
||
| 384 | if (!$loghandlerinstance instanceof LogHandler) { |
||
| 385 | throw new Exception('Log handler does not extend LogHandler'); |
||
| 386 | } |
||
| 387 | |||
| 388 | if (empty($conf->loghandlers[$handler])) { |
||
| 389 | $conf->loghandlers[$handler] = $loghandlerinstance; |
||
| 390 | } |
||
| 391 | } |
||
| 392 | |||
| 393 | // Define object $langs |
||
| 394 | $langs = new Translate('..', $conf); |
||
| 395 | if (GETPOST('lang', 'aZ09')) { |
||
| 396 | $langs->setDefaultLang(GETPOST('lang', 'aZ09')); |
||
| 397 | } else { |
||
| 398 | $langs->setDefaultLang('auto'); |
||
| 399 | } |
||
| 400 | |||
| 401 | |||
| 402 | /** |
||
| 403 | * Load conf file (file must exists) |
||
| 404 | * |
||
| 405 | * @param string $dolibarr_main_document_root Root directory of Dolibarr bin files |
||
| 406 | * @return int Return integer <0 if KO, >0 if OK |
||
| 407 | */ |
||
| 408 | function conf($dolibarr_main_document_root) |
||
| 409 | { |
||
| 410 | global $conf; |
||
| 411 | global $dolibarr_main_db_type; |
||
| 412 | global $dolibarr_main_db_host; |
||
| 413 | global $dolibarr_main_db_port; |
||
| 414 | global $dolibarr_main_db_name; |
||
| 415 | global $dolibarr_main_db_user; |
||
| 416 | global $dolibarr_main_db_pass; |
||
| 417 | global $dolibarr_main_db_collation; |
||
| 418 | global $dolibarr_main_db_character_set; |
||
| 419 | global $character_set_client; |
||
| 420 | global $dolibarr_main_instance_unique_id; |
||
| 421 | global $dolibarr_main_cookie_cryptkey; |
||
| 422 | |||
| 423 | $conf = new Conf(); |
||
| 424 | $conf->db->type = trim($dolibarr_main_db_type); |
||
| 425 | $conf->db->host = trim($dolibarr_main_db_host); |
||
| 426 | $conf->db->port = trim($dolibarr_main_db_port); |
||
| 427 | $conf->db->name = trim($dolibarr_main_db_name); |
||
| 428 | $conf->db->user = trim($dolibarr_main_db_user); |
||
| 429 | $conf->db->pass = (empty($dolibarr_main_db_pass) ? '' : trim($dolibarr_main_db_pass)); |
||
| 430 | |||
| 431 | // Mysql driver support has been removed in favor of mysqli |
||
| 432 | if ($conf->db->type == 'mysql') { |
||
| 433 | $conf->db->type = 'mysqli'; |
||
| 434 | } |
||
| 435 | if (empty($character_set_client)) { |
||
| 436 | $character_set_client = "UTF-8"; |
||
| 437 | } |
||
| 438 | $conf->file->character_set_client = strtoupper($character_set_client); |
||
| 439 | // Unique id of instance |
||
| 440 | $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; |
||
| 441 | if (empty($dolibarr_main_db_character_set)) { |
||
| 442 | $dolibarr_main_db_character_set = ($conf->db->type == 'mysqli' ? 'utf8' : ''); |
||
| 443 | } |
||
| 444 | $conf->db->character_set = $dolibarr_main_db_character_set; |
||
| 445 | if (empty($dolibarr_main_db_collation)) { |
||
| 446 | $dolibarr_main_db_collation = ($conf->db->type == 'mysqli' ? 'utf8_unicode_ci' : ''); |
||
| 447 | } |
||
| 448 | $conf->db->dolibarr_main_db_collation = $dolibarr_main_db_collation; |
||
| 449 | if (empty($dolibarr_main_db_encryption)) { |
||
|
0 ignored issues
–
show
Comprehensibility
Best Practice
introduced
by
Loading history...
|
|||
| 450 | $dolibarr_main_db_encryption = 0; |
||
| 451 | } |
||
| 452 | $conf->db->dolibarr_main_db_encryption = $dolibarr_main_db_encryption; |
||
| 453 | if (empty($dolibarr_main_db_cryptkey)) { |
||
|
0 ignored issues
–
show
Comprehensibility
Best Practice
introduced
by
|
|||
| 454 | $dolibarr_main_db_cryptkey = ''; |
||
| 455 | } |
||
| 456 | $conf->db->dolibarr_main_db_cryptkey = $dolibarr_main_db_cryptkey; |
||
| 457 | |||
| 458 | // Force usage of log file for install and upgrades |
||
| 459 | $conf->modules['syslog'] = 'syslog'; |
||
| 460 | $conf->global->SYSLOG_LEVEL = constant('LOG_DEBUG'); |
||
| 461 | if (!defined('SYSLOG_HANDLERS')) { |
||
| 462 | define('SYSLOG_HANDLERS', '["mod_syslog_file"]'); |
||
| 463 | } |
||
| 464 | if (!defined('SYSLOG_FILE')) { // To avoid warning on systems with constant already defined |
||
| 465 | if (@is_writable('/tmp')) { |
||
| 466 | define('SYSLOG_FILE', '/tmp/dolibarr_install.log'); |
||
| 467 | } elseif (!empty($_ENV["TMP"]) && @is_writable($_ENV["TMP"])) { |
||
| 468 | define('SYSLOG_FILE', $_ENV["TMP"] . '/dolibarr_install.log'); |
||
| 469 | } elseif (!empty($_ENV["TEMP"]) && @is_writable($_ENV["TEMP"])) { |
||
| 470 | define('SYSLOG_FILE', $_ENV["TEMP"] . '/dolibarr_install.log'); |
||
| 471 | } elseif (@is_writable('../../../../') && @file_exists('../../../../startdoliwamp.bat')) { |
||
| 472 | define('SYSLOG_FILE', '../../../../dolibarr_install.log'); // For DoliWamp |
||
| 473 | } elseif (@is_writable('../../')) { |
||
| 474 | define('SYSLOG_FILE', '../../dolibarr_install.log'); // For others |
||
| 475 | } |
||
| 476 | //print 'SYSLOG_FILE='.SYSLOG_FILE;exit; |
||
| 477 | } |
||
| 478 | if (defined('SYSLOG_FILE')) { |
||
| 479 | $conf->global->SYSLOG_FILE = constant('SYSLOG_FILE'); |
||
| 480 | } |
||
| 481 | if (!defined('SYSLOG_FILE_NO_ERROR')) { |
||
| 482 | define('SYSLOG_FILE_NO_ERROR', 1); |
||
| 483 | } |
||
| 484 | // We init log handler for install |
||
| 485 | $handlers = array('mod_syslog_file'); |
||
| 486 | foreach ($handlers as $handler) { |
||
| 487 | $file = DOL_DOCUMENT_ROOT . '/core/modules/syslog/' . $handler . '.php'; |
||
| 488 | if (!file_exists($file)) { |
||
| 489 | throw new Exception('Missing log handler file ' . $handler . '.php'); |
||
| 490 | } |
||
| 491 | |||
| 492 | require_once $file; |
||
| 493 | $loghandlerinstance = new $handler(); |
||
| 494 | if (!$loghandlerinstance instanceof LogHandler) { |
||
| 495 | throw new Exception('Log handler does not extend LogHandler'); |
||
| 496 | } |
||
| 497 | |||
| 498 | if (empty($conf->loghandlers[$handler])) { |
||
| 499 | $conf->loghandlers[$handler] = $loghandlerinstance; |
||
| 500 | } |
||
| 501 | } |
||
| 502 | |||
| 503 | return 1; |
||
| 504 | } |
||
| 505 | |||
| 506 | |||
| 507 | /** |
||
| 508 | * Show HTML header of install pages |
||
| 509 | * |
||
| 510 | * @param string $subtitle Title |
||
| 511 | * @param string $next Next |
||
| 512 | * @param string $action Action code ('set' or 'upgrade') |
||
| 513 | * @param string $param Param |
||
| 514 | * @param string $forcejqueryurl Set jquery relative URL (must end with / if defined) |
||
| 515 | * @param string $csstable Css for table |
||
| 516 | * @return void |
||
| 517 | */ |
||
| 518 | function pHeader($subtitle, $next, $action = 'set', $param = '', $forcejqueryurl = '', $csstable = 'main-inside') |
||
| 519 | { |
||
| 520 | global $conf; |
||
| 521 | global $langs; |
||
| 522 | $langs->load("main"); |
||
| 523 | $langs->load("admin"); |
||
| 524 | $langs->load("install"); |
||
| 525 | |||
| 526 | $jquerytheme = 'base'; |
||
| 527 | |||
| 528 | if ($forcejqueryurl) { |
||
| 529 | $jQueryCustomPath = $forcejqueryurl; |
||
| 530 | $jQueryUiCustomPath = $forcejqueryurl; |
||
| 531 | } else { |
||
| 532 | $jQueryCustomPath = (defined('JS_JQUERY') && constant('JS_JQUERY')) ? JS_JQUERY : false; |
||
| 533 | $jQueryUiCustomPath = (defined('JS_JQUERY_UI') && constant('JS_JQUERY_UI')) ? JS_JQUERY_UI : false; |
||
| 534 | } |
||
| 535 | |||
| 536 | // We force the content charset |
||
| 537 | header("Content-type: text/html; charset=" . $conf->file->character_set_client); |
||
| 538 | header("X-Content-Type-Options: nosniff"); |
||
| 539 | header("X-Frame-Options: SAMEORIGIN"); // Frames allowed only if on same domain (stop some XSS attacks) |
||
| 540 | |||
| 541 | $defaultcss = constant('DOL_URL_ROOT') . '/install/default.css'; |
||
| 542 | $logo = constant('DOL_URL_ROOT') . '/theme/alixar_rectangular_logo.svg'; |
||
| 543 | |||
| 544 | print '<!DOCTYPE HTML>' . "\n"; |
||
| 545 | print '<html>' . "\n"; |
||
| 546 | print '<head>' . "\n"; |
||
| 547 | print '<meta charset="' . $conf->file->character_set_client . '">' . "\n"; |
||
| 548 | print '<meta name="viewport" content="width=device-width, initial-scale=1.0">' . "\n"; |
||
| 549 | print '<meta name="generator" content="Dolibarr installer">' . "\n"; |
||
| 550 | print '<link rel="stylesheet" type="text/css" href="' . $defaultcss . '">' . "\n"; |
||
| 551 | |||
| 552 | print '<!-- Includes CSS for JQuery -->' . "\n"; |
||
| 553 | if ($jQueryUiCustomPath) { |
||
| 554 | print '<link rel="stylesheet" type="text/css" href="' . $jQueryUiCustomPath . 'css/' . $jquerytheme . '/jquery-ui.min.css" />' . "\n"; // JQuery |
||
| 555 | } else { |
||
| 556 | print '<link rel="stylesheet" type="text/css" href="' . constant('DOL_URL_ROOT') . '/includes/jquery/css/' . $jquerytheme . '/jquery-ui.min.css" />' . "\n"; // JQuery |
||
| 557 | } |
||
| 558 | |||
| 559 | print '<!-- Includes JS for JQuery -->' . "\n"; |
||
| 560 | if ($jQueryCustomPath) { |
||
| 561 | print '<script type="text/javascript" src="' . $jQueryCustomPath . 'jquery.min.js"></script>' . "\n"; |
||
| 562 | } else { |
||
| 563 | print '<script type="text/javascript" src="' . constant('DOL_URL_ROOT') . '/includes/jquery/js/jquery.min.js"></script>' . "\n"; |
||
| 564 | } |
||
| 565 | if ($jQueryUiCustomPath) { |
||
| 566 | print '<script type="text/javascript" src="' . $jQueryUiCustomPath . 'jquery-ui.min.js"></script>' . "\n"; |
||
| 567 | } else { |
||
| 568 | print '<script type="text/javascript" src="' . constant('DOL_URL_ROOT') . '/includes/jquery/js/jquery-ui.min.js"></script>' . "\n"; |
||
| 569 | } |
||
| 570 | |||
| 571 | print '<title>' . $langs->trans("DolibarrSetup") . '</title>' . "\n"; |
||
| 572 | print '</head>' . "\n"; |
||
| 573 | |||
| 574 | print '<body>' . "\n"; |
||
| 575 | |||
| 576 | print '<div class="divlogoinstall" style="text-align:center">'; |
||
| 577 | print '<img class="imglogoinstall" src="' . $logo . '" alt="Dolibarr logo" width="300px"><br>'; |
||
| 578 | print DOL_VERSION; |
||
| 579 | print '</div><br>'; |
||
| 580 | |||
| 581 | print '<span class="titre">' . $langs->trans("DolibarrSetup"); |
||
| 582 | if ($subtitle) { |
||
| 583 | print ' - ' . $subtitle; |
||
| 584 | } |
||
| 585 | print '</span>' . "\n"; |
||
| 586 | |||
| 587 | print '<form name="forminstall" id="forminstall" class="centpercent" action="' . $next . '.php' . ($param ? '?' . $param : '') . '" method="POST"'; |
||
| 588 | if ($next == 'step5') { |
||
| 589 | print ' autocomplete="off"'; |
||
| 590 | } |
||
| 591 | print '>' . "\n"; |
||
| 592 | print '<input type="hidden" name="testpost" value="ok">' . "\n"; |
||
| 593 | print '<input type="hidden" name="action" value="' . $action . '">' . "\n"; |
||
| 594 | |||
| 595 | print '<div id="divinstall">'; |
||
| 596 | |||
| 597 | print '<table class="main centpercent"><tr><td>' . "\n"; |
||
| 598 | |||
| 599 | print '<table class="' . $csstable . ' centpercent"><tr><td>' . "\n"; |
||
| 600 | } |
||
| 601 | |||
| 602 | /** |
||
| 603 | * Print HTML footer of install pages |
||
| 604 | * |
||
| 605 | * @param integer $nonext 1=No button "Next step", 2=Show button but disabled with a link to enable |
||
| 606 | * @param string $setuplang Language code |
||
| 607 | * @param string $jscheckfunction Add a javascript check function |
||
| 608 | * @param integer $withpleasewait Add also please wait tags |
||
| 609 | * @param string $morehtml Add more HTML content |
||
| 610 | * @return void |
||
| 611 | */ |
||
| 612 | function pFooter($nonext = 0, $setuplang = '', $jscheckfunction = '', $withpleasewait = 0, $morehtml = '') |
||
| 613 | { |
||
| 614 | global $conf, $langs; |
||
| 615 | |||
| 616 | $langs->loadLangs(array("main", "other", "admin")); |
||
| 617 | |||
| 618 | print '</td></tr></table>' . "\n"; |
||
| 619 | print '</td></tr></table>' . "\n"; |
||
| 620 | |||
| 621 | print '<!-- pFooter -->' . "\n"; |
||
| 622 | |||
| 623 | print $morehtml; |
||
| 624 | |||
| 625 | print '</div>'; |
||
| 626 | |||
| 627 | if (!$nonext || ($nonext == '2')) { |
||
| 628 | print '<div class="nextbutton" id="nextbutton">'; |
||
| 629 | if ($nonext == '2') { |
||
| 630 | print '<span class="warning">'; |
||
| 631 | print $langs->trans("ErrorFoundDuringMigration", isset($_SERVER["REQUEST_URI"]) ? $_SERVER["REQUEST_URI"] . '&ignoreerrors=1' : ''); |
||
| 632 | print '</span>'; |
||
| 633 | print '<br><br>'; |
||
| 634 | } |
||
| 635 | |||
| 636 | print '<input type="submit" ' . ($nonext == '2' ? 'disabled="disabled" ' : '') . 'value="' . $langs->trans("NextStep") . ' ->"'; |
||
| 637 | if ($jscheckfunction) { |
||
| 638 | print ' onClick="return ' . $jscheckfunction . '();"'; |
||
| 639 | } |
||
| 640 | print '>'; |
||
| 641 | print '</div>'; |
||
| 642 | if ($withpleasewait) { |
||
| 643 | print '<div style="visibility: hidden;" class="pleasewait" id="pleasewait"><br>' . $langs->trans("NextStepMightLastALongTime") . '<br><br><div class="blinkwait">' . $langs->trans("PleaseBePatient") . '</div></div>'; |
||
| 644 | } |
||
| 645 | } |
||
| 646 | if ($setuplang) { |
||
| 647 | print '<input type="hidden" name="selectlang" value="' . dol_escape_htmltag($setuplang) . '">'; |
||
| 648 | } |
||
| 649 | |||
| 650 | print '</form><br>' . "\n"; |
||
| 651 | |||
| 652 | // If there is some logs in buffer to show |
||
| 653 | if (isset($conf->logbuffer) && count($conf->logbuffer)) { |
||
| 654 | print "\n"; |
||
| 655 | print "<!-- Start of log output\n"; |
||
| 656 | //print '<div class="hidden">'."\n"; |
||
| 657 | foreach ($conf->logbuffer as $logline) { |
||
| 658 | print $logline . "<br>\n"; |
||
| 659 | } |
||
| 660 | //print '</div>'."\n"; |
||
| 661 | print "End of log output -->\n"; |
||
| 662 | print "\n"; |
||
| 663 | } |
||
| 664 | |||
| 665 | print '</body>' . "\n"; |
||
| 666 | print '</html>' . "\n"; |
||
| 667 | } |
||
| 668 | |||
| 669 | /** |
||
| 670 | * Log function for install pages |
||
| 671 | * |
||
| 672 | * @param string $message Message |
||
| 673 | * @param int $level Level of log |
||
| 674 | * @return void |
||
| 675 | */ |
||
| 676 | function dolibarr_install_syslog($message, $level = LOG_DEBUG) |
||
| 677 | { |
||
| 678 | if (!defined('LOG_DEBUG')) { |
||
| 679 | define('LOG_DEBUG', 6); |
||
| 680 | } |
||
| 681 | dol_syslog($message, $level); |
||
| 682 | } |
||
| 683 | |||
| 684 | /** |
||
| 685 | * Automatically detect Dolibarr's main document root |
||
| 686 | * |
||
| 687 | * @return string |
||
| 688 | */ |
||
| 689 | function detect_dolibarr_main_document_root() |
||
| 690 | { |
||
| 691 | // If PHP is in CGI mode, SCRIPT_FILENAME is PHP's path. |
||
| 692 | // Since that's not what we want, we suggest $_SERVER["DOCUMENT_ROOT"] |
||
| 693 | if ($_SERVER["SCRIPT_FILENAME"] == 'php' || preg_match('/[\\/]php$/i', $_SERVER["SCRIPT_FILENAME"]) || preg_match('/php\.exe$/i', $_SERVER["SCRIPT_FILENAME"])) { |
||
| 694 | $dolibarr_main_document_root = $_SERVER["DOCUMENT_ROOT"]; |
||
| 695 | |||
| 696 | if (!preg_match('/[\\/]dolibarr[\\/]htdocs$/i', $dolibarr_main_document_root)) { |
||
| 697 | $dolibarr_main_document_root .= "/dolibarr/htdocs"; |
||
| 698 | } |
||
| 699 | } else { |
||
| 700 | // We assume /install to be under /htdocs, so we get the parent directory of the current directory |
||
| 701 | $dolibarr_main_document_root = dirname(dirname($_SERVER["SCRIPT_FILENAME"])); |
||
| 702 | } |
||
| 703 | |||
| 704 | return $dolibarr_main_document_root; |
||
| 705 | } |
||
| 706 | |||
| 707 | /** |
||
| 708 | * Automatically detect Dolibarr's main data root |
||
| 709 | * |
||
| 710 | * @param string $dolibarr_main_document_root Current main document root |
||
| 711 | * @return string |
||
| 712 | */ |
||
| 713 | function detect_dolibarr_main_data_root($dolibarr_main_document_root) |
||
| 714 | { |
||
| 715 | $dolibarr_main_data_root = preg_replace("/\/public\/htdocs$/", "", $dolibarr_main_document_root); |
||
| 716 | $dolibarr_main_data_root .= "/documents"; |
||
| 717 | return $dolibarr_main_data_root; |
||
| 718 | } |
||
| 719 | |||
| 720 | /** |
||
| 721 | * Automatically detect Dolibarr's main URL root |
||
| 722 | * |
||
| 723 | * @return string |
||
| 724 | */ |
||
| 725 | function detect_dolibarr_main_url_root() |
||
| 726 | { |
||
| 727 | // If defined (Ie: Apache with Linux) |
||
| 728 | if (isset($_SERVER["SCRIPT_URI"])) { |
||
| 729 | $dolibarr_main_url_root = $_SERVER["SCRIPT_URI"]; |
||
| 730 | } elseif (isset($_SERVER["SERVER_URL"]) && isset($_SERVER["DOCUMENT_URI"])) { |
||
| 731 | // If defined (Ie: Apache with Caudium) |
||
| 732 | $dolibarr_main_url_root = $_SERVER["SERVER_URL"] . $_SERVER["DOCUMENT_URI"]; |
||
| 733 | } else { |
||
| 734 | // If SCRIPT_URI, SERVER_URL, DOCUMENT_URI not defined (Ie: Apache 2.0.44 for Windows) |
||
| 735 | $proto = ((!empty($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == 'on') || (!empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] == 443)) ? 'https' : 'http'; |
||
| 736 | if (!empty($_SERVER["HTTP_HOST"])) { |
||
| 737 | $serverport = $_SERVER["HTTP_HOST"]; |
||
| 738 | } elseif (!empty($_SERVER["SERVER_NAME"])) { |
||
| 739 | $serverport = $_SERVER["SERVER_NAME"]; |
||
| 740 | } else { |
||
| 741 | $serverport = 'localhost'; |
||
| 742 | } |
||
| 743 | $dolibarr_main_url_root = $proto . "://" . $serverport . $_SERVER["SCRIPT_NAME"]; |
||
| 744 | } |
||
| 745 | // Clean proposed URL |
||
| 746 | // We assume /install to be under /htdocs, so we get the parent path of the current URL |
||
| 747 | $dolibarr_main_url_root = dirname(dirname($dolibarr_main_url_root)); |
||
| 748 | |||
| 749 | return $dolibarr_main_url_root; |
||
| 750 | } |
||
| 751 | |||
| 752 | /** |
||
| 753 | * Replaces automatic database login by actual value |
||
| 754 | * |
||
| 755 | * @param string $force_install_databaserootlogin Login |
||
| 756 | * @return string |
||
| 757 | */ |
||
| 758 | function parse_database_login($force_install_databaserootlogin) |
||
| 759 | { |
||
| 760 | return preg_replace('/__SUPERUSERLOGIN__/', 'root', $force_install_databaserootlogin); |
||
| 761 | } |
||
| 762 | |||
| 763 | /** |
||
| 764 | * Replaces automatic database password by actual value |
||
| 765 | * |
||
| 766 | * @param string $force_install_databaserootpass Password |
||
| 767 | * @return string |
||
| 768 | */ |
||
| 769 | function parse_database_pass($force_install_databaserootpass) |
||
| 770 | { |
||
| 771 | return preg_replace('/__SUPERUSERPASSWORD__/', '', $force_install_databaserootpass); |
||
| 772 | } |
||
| 773 |