step1.php 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962
  1. <?php
  2. /* Copyright (C) 2004-2007 Rodolphe Quiedeville <rodolphe@quiedeville.org>
  3. * Copyright (C) 2004-2012 Laurent Destailleur <eldy@users.sourceforge.net>
  4. * Copyright (C) 2004 Benoit Mortier <benoit.mortier@opensides.be>
  5. * Copyright (C) 2004 Sebastien Di Cintio <sdicintio@ressource-toi.org>
  6. * Copyright (C) 2005-2011 Regis Houssin <regis.houssin@capnetworks.com>
  7. * Copyright (C) 2015 Raphaël Doursenaud <rdoursenaud@gpcsolutions.fr>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License as published by
  11. * the Free Software Foundation; either version 3 of the License, or
  12. * (at your option) any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  21. */
  22. /**
  23. * \file htdocs/install/step1.php
  24. * \ingroup install
  25. * \brief Build conf file on disk
  26. */
  27. define('DONOTLOADCONF',1); // To avoid loading conf by file inc.php
  28. include 'inc.php';
  29. $action=GETPOST('action','alpha');
  30. $setuplang=(GETPOST('selectlang','',3)?GETPOST('selectlang','',3):'auto');
  31. $langs->setDefaultLang($setuplang);
  32. $langs->load("admin");
  33. $langs->load("install");
  34. $langs->load("errors");
  35. // Recuparation des information de connexion
  36. $userroot=GETPOST('db_user_root');
  37. $passroot=GETPOST('db_pass_root');
  38. // Repertoire des pages dolibarr
  39. $main_dir=GETPOST('main_dir');
  40. $main_url=GETPOST('main_url');
  41. // Database server
  42. $db_type=GETPOST('db_type','alpha');
  43. $db_host=GETPOST('db_host','alpha');
  44. $db_name=GETPOST('db_name','alpha');
  45. $db_user=GETPOST('db_user','alpha');
  46. $db_pass=GETPOST('db_pass');
  47. $db_port=GETPOST('db_port','int');
  48. $db_prefix=GETPOST('db_prefix','alpha');
  49. session_start(); // To be able to keep info into session (used for not loosing pass during navigation. pass must not transit throug parmaeters)
  50. // Save a flag to tell to restore input value if we do back
  51. $_SESSION['dol_save_pass']=$db_pass;
  52. //$_SESSION['dol_save_passroot']=$passroot;
  53. // Now we load forced value from install.forced.php file.
  54. $useforcedwizard=false;
  55. $forcedfile="./install.forced.php";
  56. if ($conffile == "/etc/dolibarr/conf.php") $forcedfile="/etc/dolibarr/install.forced.php";
  57. if (@file_exists($forcedfile)) { $useforcedwizard=true; include_once $forcedfile; }
  58. dolibarr_install_syslog("--- step1: entering step1.php page");
  59. $error = 0;
  60. /*
  61. * View
  62. */
  63. pHeader($langs->trans("ConfigurationFile"),"step2");
  64. // Test if we can run a first install process
  65. if (! is_writable($conffile))
  66. {
  67. print $langs->trans("ConfFileIsNotWritable",$conffiletoshow);
  68. pFooter(1,$setuplang,'jscheckparam');
  69. exit;
  70. }
  71. // Check parameters
  72. $is_sqlite = false;
  73. if (empty($db_type))
  74. {
  75. print '<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("DatabaseType")).'</div>';
  76. $error++;
  77. } else {
  78. $is_sqlite = ($db_type === 'sqlite' || $db_type === 'sqlite3' );
  79. }
  80. if (empty($db_host) && ! $is_sqlite)
  81. {
  82. print '<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Server")).'</div>';
  83. $error++;
  84. }
  85. if (empty($db_name))
  86. {
  87. print '<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("DatabaseName")).'</div>';
  88. $error++;
  89. }
  90. if (empty($db_user) && ! $is_sqlite)
  91. {
  92. print '<div class="error">'.$langs->trans("ErrorFieldRequired",$langs->transnoentities("Login")).'</div>';
  93. $error++;
  94. }
  95. if (! empty($db_port) && ! is_numeric($db_port))
  96. {
  97. print '<div class="error">'.$langs->trans("ErrorBadValueForParameter",$db_port,$langs->transnoentities("Port")).'</div>';
  98. $error++;
  99. }
  100. if (! empty($db_prefix) && ! preg_match('/^[a-z0-9]+_$/i', $db_prefix))
  101. {
  102. print '<div class="error">'.$langs->trans("ErrorBadValueForParameter",$db_prefix,$langs->transnoentities("DatabasePrefix")).'</div>';
  103. $error++;
  104. }
  105. // Remove last / into dans main_dir
  106. if (substr($main_dir, dol_strlen($main_dir) -1) == "/")
  107. {
  108. $main_dir = substr($main_dir, 0, dol_strlen($main_dir)-1);
  109. }
  110. // Remove last / into dans main_url
  111. if (! empty($main_url) && substr($main_url, dol_strlen($main_url) -1) == "/")
  112. {
  113. $main_url = substr($main_url, 0, dol_strlen($main_url)-1);
  114. }
  115. // Directory for generated documents (invoices, orders, ecm, etc...)
  116. $main_data_dir=isset($_POST["main_data_dir"])?$_POST["main_data_dir"]:'';
  117. if (! $main_data_dir) { $main_data_dir="$main_dir/documents"; }
  118. // Test database connexion
  119. if (! $error)
  120. {
  121. $result=@include_once $main_dir."/core/db/".$db_type.'.class.php';
  122. if ($result)
  123. {
  124. // If we ask database or user creation we need to connect as root, so we need root login
  125. if (! empty($_POST["db_create_database"]) && ! $userroot)
  126. {
  127. print '<div class="error">'.$langs->trans("YouAskDatabaseCreationSoDolibarrNeedToConnect",$db_name).'</div>';
  128. print '<br>';
  129. print $langs->trans("BecauseConnectionFailedParametersMayBeWrong").'<br><br>';
  130. print $langs->trans("ErrorGoBackAndCorrectParameters");
  131. $error++;
  132. }
  133. if (! empty($_POST["db_create_user"]) && ! $userroot)
  134. {
  135. print '<div class="error">'.$langs->trans("YouAskLoginCreationSoDolibarrNeedToConnect",$db_user).'</div>';
  136. print '<br>';
  137. print $langs->trans("BecauseConnectionFailedParametersMayBeWrong").'<br><br>';
  138. print $langs->trans("ErrorGoBackAndCorrectParameters");
  139. $error++;
  140. }
  141. // If we need root access
  142. if (! $error && (! empty($_POST["db_create_database"]) || ! empty($_POST["db_create_user"])))
  143. {
  144. $databasefortest=$db_name;
  145. if (! empty($_POST["db_create_database"]))
  146. {
  147. if ($db_type == 'mysql' || $db_type == 'mysqli')
  148. {
  149. $databasefortest='mysql';
  150. }
  151. elseif ($db_type == 'pgsql')
  152. {
  153. $databasefortest='postgres';
  154. }
  155. else
  156. {
  157. $databasefortest='master';
  158. }
  159. }
  160. //print $_POST["db_type"].",".$_POST["db_host"].",$userroot,$passroot,$databasefortest,".$_POST["db_port"];
  161. $db=getDoliDBInstance($db_type, $db_host, $userroot, $passroot, $databasefortest, $db_port);
  162. dol_syslog("databasefortest=" . $databasefortest . " connected=" . $db->connected . " database_selected=" . $db->database_selected, LOG_DEBUG);
  163. //print "databasefortest=".$databasefortest." connected=".$db->connected." database_selected=".$db->database_selected;
  164. if (empty($_POST["db_create_database"]) && $db->connected && ! $db->database_selected)
  165. {
  166. print '<div class="error">'.$langs->trans("ErrorConnectedButDatabaseNotFound",$db_name).'</div>';
  167. print '<br>';
  168. if (! $db->connected) print $langs->trans("IfDatabaseNotExistsGoBackAndUncheckCreate").'<br><br>';
  169. print $langs->trans("ErrorGoBackAndCorrectParameters");
  170. $error++;
  171. }
  172. elseif ($db->error && ! (! empty($_POST["db_create_database"]) && $db->connected))
  173. {
  174. // Note: you may experience error here with message "No such file or directory" when mysql was installed for the first time but not yet launched.
  175. if ($db->error == "No such file or directory") print '<div class="error">'.$langs->trans("ErrorToConnectToMysqlCheckInstance").'</div>';
  176. else print '<div class="error">'.$db->error.'</div>';
  177. if (! $db->connected) print $langs->trans("BecauseConnectionFailedParametersMayBeWrong").'<br><br>';
  178. //print '<a href="#" onClick="javascript: history.back();">';
  179. print $langs->trans("ErrorGoBackAndCorrectParameters");
  180. //print '</a>';
  181. $error++;
  182. }
  183. }
  184. // If we need simple access
  185. if (! $error && (empty($_POST["db_create_database"]) && empty($_POST["db_create_user"])))
  186. {
  187. $db=getDoliDBInstance($db_type, $db_host, $db_user, $db_pass, $db_name, $db_port);
  188. if ($db->error)
  189. {
  190. print '<div class="error">'.$db->error.'</div>';
  191. if (! $db->connected) print $langs->trans("BecauseConnectionFailedParametersMayBeWrong").'<br><br>';
  192. //print '<a href="#" onClick="javascript: history.back();">';
  193. print $langs->trans("ErrorGoBackAndCorrectParameters");
  194. //print '</a>';
  195. $error++;
  196. }
  197. }
  198. }
  199. else
  200. {
  201. print "<br>\nFailed to include_once(\"".$main_dir."/core/db/".$db_type.".class.php\")<br>\n";
  202. print '<div class="error">'.$langs->trans("ErrorWrongValueForParameter",$langs->transnoentities("WebPagesDirectory")).'</div>';
  203. //print '<a href="#" onClick="javascript: history.back();">';
  204. print $langs->trans("ErrorGoBackAndCorrectParameters");
  205. //print '</a>';
  206. $error++;
  207. }
  208. }
  209. else
  210. {
  211. if (isset($db)) print $db->lasterror();
  212. if (isset($db) && ! $db->connected) print '<br>'.$langs->trans("BecauseConnectionFailedParametersMayBeWrong").'<br><br>';
  213. print $langs->trans("ErrorGoBackAndCorrectParameters");
  214. $error++;
  215. }
  216. if (! $error && $db->connected)
  217. {
  218. if (! empty($_POST["db_create_database"]))
  219. {
  220. $result=$db->select_db($db_name);
  221. if ($result)
  222. {
  223. print '<div class="error">'.$langs->trans("ErrorDatabaseAlreadyExists", $db_name).'</div>';
  224. print $langs->trans("IfDatabaseExistsGoBackAndCheckCreate").'<br><br>';
  225. print $langs->trans("ErrorGoBackAndCorrectParameters");
  226. $error++;
  227. }
  228. }
  229. }
  230. // Define $defaultCharacterSet and $defaultDBSortingCollation
  231. if (! $error && $db->connected)
  232. {
  233. if (! empty($_POST["db_create_database"])) // If we create database, we force default value
  234. {
  235. $defaultCharacterSet=$db->forcecharset;
  236. $defaultDBSortingCollation=$db->forcecollate;
  237. }
  238. else // If already created, we take current value
  239. {
  240. $defaultCharacterSet=$db->getDefaultCharacterSetDatabase();
  241. $defaultDBSortingCollation=$db->getDefaultCollationDatabase();
  242. }
  243. print '<input type="hidden" name="dolibarr_main_db_character_set" value="'.$defaultCharacterSet.'">';
  244. print '<input type="hidden" name="dolibarr_main_db_collation" value="'.$defaultDBSortingCollation.'">';
  245. $db_character_set=$defaultCharacterSet;
  246. $db_collation=$defaultDBSortingCollation;
  247. dolibarr_install_syslog("step1: db_character_set=" . $db_character_set . " db_collation=" . $db_collation);
  248. }
  249. // Create config file
  250. if (! $error && $db->connected && $action == "set")
  251. {
  252. umask(0);
  253. foreach($_POST as $key => $value)
  254. {
  255. if (! preg_match('/^db_pass/i', $key)) {
  256. dolibarr_install_syslog("step1: choice for " . $key . " = " . $value);
  257. }
  258. }
  259. // Show title of step
  260. print '<h3>'.$langs->trans("ConfigurationFile").'</h3>';
  261. print '<table cellspacing="0" width="100%" cellpadding="1" border="0">';
  262. // Check parameter main_dir
  263. if (! $error)
  264. {
  265. if (! is_dir($main_dir))
  266. {
  267. dolibarr_install_syslog("step1: directory '" . $main_dir . "' is unavailable or can't be accessed");
  268. print "<tr><td>";
  269. print $langs->trans("ErrorDirDoesNotExists",$main_dir).'<br>';
  270. print $langs->trans("ErrorWrongValueForParameter",$langs->trans("WebPagesDirectory")).'<br>';
  271. print $langs->trans("ErrorGoBackAndCorrectParameters").'<br><br>';
  272. print '</td><td>';
  273. print $langs->trans("Error");
  274. print "</td></tr>";
  275. $error++;
  276. }
  277. }
  278. if (! $error)
  279. {
  280. dolibarr_install_syslog("step1: directory '" . $main_dir . "' exists");
  281. }
  282. // Create subdirectory main_data_dir
  283. if (! $error)
  284. {
  285. // Create directory for documents
  286. if (! is_dir($main_data_dir))
  287. {
  288. dol_mkdir($main_data_dir);
  289. }
  290. if (! is_dir($main_data_dir))
  291. {
  292. print "<tr><td>".$langs->trans("ErrorDirDoesNotExists",$main_data_dir);
  293. print ' '.$langs->trans("YouMustCreateItAndAllowServerToWrite");
  294. print '</td><td>';
  295. print '<font class="error">'.$langs->trans("Error").'</font>';
  296. print "</td></tr>";
  297. print '<tr><td colspan="2"><br>'.$langs->trans("CorrectProblemAndReloadPage",$_SERVER['PHP_SELF'].'?testget=ok').'</td></tr>';
  298. $error++;
  299. }
  300. else
  301. {
  302. // Create .htaccess file in document directory
  303. $pathhtaccess=$main_data_dir.'/.htaccess';
  304. if (! file_exists($pathhtaccess))
  305. {
  306. dolibarr_install_syslog("step1: .htaccess file did not exist, we created it in '" . $main_data_dir . "'");
  307. $handlehtaccess=@fopen($pathhtaccess,'w');
  308. if ($handlehtaccess)
  309. {
  310. fwrite($handlehtaccess,'Order allow,deny'."\n");
  311. fwrite($handlehtaccess,'Deny from all'."\n");
  312. fclose($handlehtaccess);
  313. dolibarr_install_syslog("step1: .htaccess file created");
  314. }
  315. }
  316. // Les documents sont en dehors de htdocs car ne doivent pas pouvoir etre telecharges en passant outre l'authentification
  317. $dir[0] = $main_data_dir."/mycompany";
  318. $dir[1] = $main_data_dir."/users";
  319. $dir[2] = $main_data_dir."/custom";
  320. $dir[3] = $main_data_dir."/facture";
  321. $dir[4] = $main_data_dir."/propale";
  322. $dir[5] = $main_data_dir."/ficheinter";
  323. $dir[6] = $main_data_dir."/produit";
  324. $dir[7] = $main_data_dir."/doctemplates";
  325. $dir[7] = $main_data_dir."/extensions";
  326. // Boucle sur chaque repertoire de dir[] pour les creer s'ils nexistent pas
  327. $num=count($dir);
  328. for ($i = 0; $i < $num; $i++)
  329. {
  330. if (is_dir($dir[$i]))
  331. {
  332. dolibarr_install_syslog("step1: directory '" . $dir[$i] . "' exists");
  333. }
  334. else
  335. {
  336. if (dol_mkdir($dir[$i]) < 0)
  337. {
  338. print "<tr><td>";
  339. print "Failed to create directory: ".$dir[$i];
  340. print '</td><td>';
  341. print $langs->trans("Error");
  342. print "</td></tr>";
  343. $error++;
  344. }
  345. else
  346. {
  347. dolibarr_install_syslog("step1: directory '" . $dir[$i] . "' created");
  348. }
  349. }
  350. }
  351. if ($error)
  352. {
  353. print "<tr><td>".$langs->trans("ErrorDirDoesNotExists",$main_data_dir);
  354. print ' '.$langs->trans("YouMustCreateItAndAllowServerToWrite");
  355. print '</td><td>';
  356. print '<font class="error">'.$langs->trans("Error").'</font>';
  357. print "</td></tr>";
  358. print '<tr><td colspan="2"><br>'.$langs->trans("CorrectProblemAndReloadPage",$_SERVER['PHP_SELF'].'?testget=ok').'</td></tr>';
  359. }
  360. else
  361. {
  362. //ODT templates
  363. require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php';
  364. $srcroot=$main_dir.'/install/doctemplates';
  365. $destroot=$main_data_dir.'/doctemplates';
  366. $docs=array('thirdparties' => 'thirdparty', 'proposals' => 'proposal', 'orders' => 'order', 'invoices' => 'invoice', 'projects' => 'project', 'tasks' => 'task_summary');
  367. foreach($docs as $cursordir => $cursorfile)
  368. {
  369. $src=$srcroot.'/'.$cursordir.'/template_'.$cursorfile.'.odt';
  370. $dirodt=$destroot.'/'.$cursordir;
  371. $dest=$dirodt.'/template_'.$cursorfile.'.odt';
  372. dol_mkdir($dirodt);
  373. $result=dol_copy($src,$dest,0,0);
  374. if ($result < 0)
  375. {
  376. print '<tr><td colspan="2"><br>'.$langs->trans('ErrorFailToCopyFile',$src,$dest).'</td></tr>';
  377. }
  378. }
  379. }
  380. }
  381. }
  382. // Table prefix
  383. $main_db_prefix = (! empty($db_prefix) ? $db_prefix : 'llx_');
  384. // Force https
  385. $main_force_https = ((GETPOST("main_force_https") && (GETPOST("main_force_https") == "on" || GETPOST("main_force_https") == '1')) ? '1' : '0');
  386. // Use alternative directory
  387. $main_use_alt_dir = ((GETPOST("main_use_alt_dir") && (GETPOST("main_use_alt_dir") == "off" || GETPOST("main_use_alt_dir") == '0')) ? '//' : '');
  388. // Alternative root directory name
  389. $main_alt_dir_name = ((GETPOST("main_alt_dir_name") && GETPOST("main_alt_dir_name") != '') ? GETPOST("main_alt_dir_name") : 'custom');
  390. // Write conf file on disk
  391. if (! $error)
  392. {
  393. // Save old conf file on disk
  394. if (file_exists("$conffile"))
  395. {
  396. // We must ignore errors as an existing old file may already exists and not be replacable or
  397. // the installer (like for ubuntu) may not have permission to create another file than conf.php.
  398. // Also no other process must be able to read file or we expose the new file, so content with password.
  399. @dol_copy($conffile, $conffile.'.old', '0400');
  400. }
  401. $error+=write_conf_file($conffile);
  402. }
  403. // Write main.inc.php and master.inc.php into documents/custom dir
  404. //$error+=write_main_file($main_data_dir.'/custom/main.inc.php',$main_dir);
  405. //$error+=write_master_file($main_data_dir.'/custom/master.inc.php',$main_dir);
  406. // Create database and admin user database
  407. if (! $error)
  408. {
  409. // We reload configuration file
  410. conf($dolibarr_main_document_root);
  411. print '<tr><td>';
  412. print $langs->trans("ConfFileReload");
  413. print '</td>';
  414. print '<td><img src="../theme/eldy/img/tick.png" alt="Ok"></td></tr>';
  415. $userroot=isset($_POST["db_user_root"])?$_POST["db_user_root"]:"";
  416. $passroot=isset($_POST["db_pass_root"])?$_POST["db_pass_root"]:"";
  417. // Si creation utilisateur admin demandee, on le cree
  418. if (isset($_POST["db_create_user"]) && $_POST["db_create_user"] == "on")
  419. {
  420. dolibarr_install_syslog("step1: create database user: " . $dolibarr_main_db_user);
  421. //print $conf->db->host." , ".$conf->db->name." , ".$conf->db->user." , ".$conf->db->port;
  422. $databasefortest=$conf->db->name;
  423. if ($conf->db->type == 'mysql' || $conf->db->type == 'mysqli')
  424. {
  425. $databasefortest='mysql';
  426. }
  427. else if ($conf->db->type == 'pgsql')
  428. {
  429. $databasefortest='postgres';
  430. }
  431. else if ($conf->db->type == 'mssql')
  432. {
  433. $databasefortest='master';
  434. }
  435. // Creation handler de base, verification du support et connexion
  436. $db=getDoliDBInstance($conf->db->type,$conf->db->host,$userroot,$passroot,$databasefortest,$conf->db->port);
  437. if ($db->error)
  438. {
  439. print '<div class="error">'.$db->error.'</div>';
  440. $error++;
  441. }
  442. if (! $error)
  443. {
  444. if ($db->connected)
  445. {
  446. $result=$db->DDLCreateUser($dolibarr_main_db_host,$dolibarr_main_db_user,$dolibarr_main_db_pass,$dolibarr_main_db_name);
  447. if ($result > 0)
  448. {
  449. print '<tr><td>';
  450. print $langs->trans("UserCreation").' : ';
  451. print $dolibarr_main_db_user;
  452. print '</td>';
  453. print '<td><img src="../theme/eldy/img/tick.png" alt="Ok"></td></tr>';
  454. }
  455. else
  456. {
  457. if ($db->errno() == 'DB_ERROR_RECORD_ALREADY_EXISTS'
  458. || $db->errno() == 'DB_ERROR_KEY_NAME_ALREADY_EXISTS'
  459. || $db->errno() == 'DB_ERROR_USER_ALREADY_EXISTS')
  460. {
  461. dolibarr_install_syslog("step1: user already exists");
  462. print '<tr><td>';
  463. print $langs->trans("UserCreation").' : ';
  464. print $dolibarr_main_db_user;
  465. print '</td>';
  466. print '<td>'.$langs->trans("LoginAlreadyExists").'</td></tr>';
  467. }
  468. else
  469. {
  470. dolibarr_install_syslog("step1: failed to create user", LOG_ERR);
  471. print '<tr><td>';
  472. print $langs->trans("UserCreation").' : ';
  473. print $dolibarr_main_db_user;
  474. print '</td>';
  475. print '<td>'.$langs->trans("Error").': '.$db->errno().' '.$db->error()."</td></tr>";
  476. }
  477. }
  478. $db->close();
  479. }
  480. else
  481. {
  482. print '<tr><td>';
  483. print $langs->trans("UserCreation").' : ';
  484. print $dolibarr_main_db_user;
  485. print '</td>';
  486. print '<td><img src="../theme/eldy/img/error.png" alt="Error"></td>';
  487. print '</tr>';
  488. // Affiche aide diagnostique
  489. print '<tr><td colspan="2"><br>';
  490. print $langs->trans("YouAskDatabaseCreationSoDolibarrNeedToConnect",$dolibarr_main_db_user,$dolibarr_main_db_host,$userroot);
  491. print '<br>';
  492. print $langs->trans("BecauseConnectionFailedParametersMayBeWrong").'<br><br>';
  493. print $langs->trans("ErrorGoBackAndCorrectParameters").'<br><br>';
  494. print '</td></tr>';
  495. $error++;
  496. }
  497. }
  498. } // Fin si "creation utilisateur"
  499. // If database creation is asked, we create it
  500. if (! $error && (isset($_POST["db_create_database"]) && $_POST["db_create_database"] == "on"))
  501. {
  502. dolibarr_install_syslog("step1: create database: " . $dolibarr_main_db_name . " " . $dolibarr_main_db_character_set . " " . $dolibarr_main_db_collation . " " . $dolibarr_main_db_user);
  503. $newdb=getDoliDBInstance($conf->db->type,$conf->db->host,$userroot,$passroot,'',$conf->db->port);
  504. //print 'eee'.$conf->db->type." ".$conf->db->host." ".$userroot." ".$passroot." ".$conf->db->port." ".$newdb->connected." ".$newdb->forcecharset;exit;
  505. if ($newdb->connected)
  506. {
  507. $result=$newdb->DDLCreateDb($dolibarr_main_db_name, $dolibarr_main_db_character_set, $dolibarr_main_db_collation, $dolibarr_main_db_user);
  508. if ($result)
  509. {
  510. print '<tr><td>';
  511. print $langs->trans("DatabaseCreation")." (".$langs->trans("User")." ".$userroot.") : ";
  512. print $dolibarr_main_db_name;
  513. print '</td>';
  514. print '<td><img src="../theme/eldy/img/tick.png" alt="Ok"></td></tr>';
  515. $check1=$newdb->getDefaultCharacterSetDatabase();
  516. $check2=$newdb->getDefaultCollationDatabase();
  517. dolibarr_install_syslog('step1: note that default server was charset=' . $check1 . ' collation=' . $check2);
  518. // If values differs, we save conf file again
  519. //if ($check1 != $dolibarr_main_db_character_set) dolibarr_install_syslog('step1: value for character_set is not the one asked for database creation', LOG_WARNING);
  520. //if ($check2 != $dolibarr_main_db_collation) dolibarr_install_syslog('step1: value for collation is not the one asked for database creation', LOG_WARNING);
  521. }
  522. else
  523. {
  524. // Affiche aide diagnostique
  525. print '<tr><td colspan="2"><br>';
  526. print $langs->trans("ErrorFailedToCreateDatabase",$dolibarr_main_db_name).'<br>';
  527. print $newdb->lasterror().'<br>';
  528. print $langs->trans("IfDatabaseExistsGoBackAndCheckCreate");
  529. print '<br>';
  530. print '</td></tr>';
  531. dolibarr_install_syslog('step1: failed to create database ' . $dolibarr_main_db_name . ' ' . $newdb->lasterrno() . ' ' . $newdb->lasterror(), LOG_ERR);
  532. $error++;
  533. }
  534. $newdb->close();
  535. }
  536. else {
  537. print '<tr><td>';
  538. print $langs->trans("DatabaseCreation")." (".$langs->trans("User")." ".$userroot.") : ";
  539. print $dolibarr_main_db_name;
  540. print '</td>';
  541. print '<td><img src="../theme/eldy/img/error.png" alt="Error"></td>';
  542. print '</tr>';
  543. // Affiche aide diagnostique
  544. print '<tr><td colspan="2"><br>';
  545. print $langs->trans("YouAskDatabaseCreationSoDolibarrNeedToConnect",$dolibarr_main_db_user,$dolibarr_main_db_host,$userroot);
  546. print '<br>';
  547. print $langs->trans("BecauseConnectionFailedParametersMayBeWrong").'<br><br>';
  548. print $langs->trans("ErrorGoBackAndCorrectParameters").'<br><br>';
  549. print '</td></tr>';
  550. $error++;
  551. }
  552. } // Fin si "creation database"
  553. // We test access with dolibarr database user (not admin)
  554. if (! $error)
  555. {
  556. dolibarr_install_syslog("step1: connection type=" . $conf->db->type . " on host=" . $conf->db->host . " port=" . $conf->db->port . " user=" . $conf->db->user . " name=" . $conf->db->name);
  557. //print "connexion de type=".$conf->db->type." sur host=".$conf->db->host." port=".$conf->db->port." user=".$conf->db->user." name=".$conf->db->name;
  558. $db=getDoliDBInstance($conf->db->type,$conf->db->host,$conf->db->user,$conf->db->pass,$conf->db->name,$conf->db->port);
  559. if ($db->connected)
  560. {
  561. dolibarr_install_syslog("step1: connection to server by user " . $conf->db->user . " ok");
  562. print "<tr><td>";
  563. print $langs->trans("ServerConnection")." (".$langs->trans("User")." ".$conf->db->user.") : ";
  564. print $dolibarr_main_db_host;
  565. print "</td><td>";
  566. print '<img src="../theme/eldy/img/tick.png" alt="Ok">';
  567. print "</td></tr>";
  568. // si acces serveur ok et acces base ok, tout est ok, on ne va pas plus loin, on a meme pas utilise le compte root.
  569. if ($db->database_selected)
  570. {
  571. dolibarr_install_syslog("step1: connection to database " . $conf->db->name . " by user " . $conf->db->user . " ok");
  572. print "<tr><td>";
  573. print $langs->trans("DatabaseConnection")." (".$langs->trans("User")." ".$conf->db->user.") : ";
  574. print $dolibarr_main_db_name;
  575. print "</td><td>";
  576. print '<img src="../theme/eldy/img/tick.png" alt="Ok">';
  577. print "</td></tr>";
  578. $error = 0;
  579. }
  580. else
  581. {
  582. dolibarr_install_syslog("step1: connection to database " . $conf->db->name . " by user " . $conf->db->user . " failed", LOG_ERR);
  583. print "<tr><td>";
  584. print $langs->trans("DatabaseConnection")." (".$langs->trans("User")." ".$conf->db->user.") : ";
  585. print $dolibarr_main_db_name;
  586. print '</td><td>';
  587. print '<img src="../theme/eldy/img/error.png" alt="Error">';
  588. print "</td></tr>";
  589. // Affiche aide diagnostique
  590. print '<tr><td colspan="2"><br>';
  591. print $langs->trans('CheckThatDatabasenameIsCorrect',$dolibarr_main_db_name).'<br>';
  592. print $langs->trans('IfAlreadyExistsCheckOption').'<br>';
  593. print $langs->trans("ErrorGoBackAndCorrectParameters").'<br><br>';
  594. print '</td></tr>';
  595. $error++;
  596. }
  597. }
  598. else
  599. {
  600. dolibarr_install_syslog("step1: connection to server by user " . $conf->db->user . " failed", LOG_ERR);
  601. print "<tr><td>";
  602. print $langs->trans("ServerConnection")." (".$langs->trans("User")." ".$conf->db->user.") : ";
  603. print $dolibarr_main_db_host;
  604. print '</td><td>';
  605. print '<img src="../theme/eldy/img/error.png" alt="Error">';
  606. print "</td></tr>";
  607. // Affiche aide diagnostique
  608. print '<tr><td colspan="2"><br>';
  609. print $langs->trans("ErrorConnection",$conf->db->host,$conf->db->name,$conf->db->user);
  610. print $langs->trans('IfLoginDoesNotExistsCheckCreateUser').'<br>';
  611. print $langs->trans("ErrorGoBackAndCorrectParameters").'<br><br>';
  612. print '</td></tr>';
  613. $error++;
  614. }
  615. }
  616. }
  617. print '</table>';
  618. }
  619. ?>
  620. <script type="text/javascript">
  621. function jsinfo()
  622. {
  623. ok=true;
  624. //alert('<?php echo dol_escape_js($langs->transnoentities("NextStepMightLastALongTime")); ?>');
  625. document.getElementById('nextbutton').style.visibility="hidden";
  626. document.getElementById('pleasewait').style.visibility="visible";
  627. return ok;
  628. }
  629. </script>
  630. <?php
  631. dolibarr_install_syslog("--- step1: end");
  632. pFooter($error?1:0,$setuplang,'jsinfo',1);
  633. /**
  634. * Create main file. No particular permissions are set by installer.
  635. *
  636. * @param string $mainfile Full path name of main file to generate/update
  637. * @param string $main_dir Full path name to main.inc.php file
  638. * @return void
  639. */
  640. function write_main_file($mainfile,$main_dir)
  641. {
  642. $fp = @fopen("$mainfile", "w");
  643. if($fp)
  644. {
  645. clearstatcache();
  646. fputs($fp, '<?php'."\n");
  647. fputs($fp, "// Wrapper to include main into htdocs\n");
  648. fputs($fp, "include_once '".$main_dir."/main.inc.php';\n");
  649. fclose($fp);
  650. }
  651. }
  652. /**
  653. * Create master file. No particular permissions are set by installer.
  654. *
  655. * @param string $masterfile Full path name of master file to generate/update
  656. * @param string $main_dir Full path name to master.inc.php file
  657. * @return void
  658. */
  659. function write_master_file($masterfile,$main_dir)
  660. {
  661. $fp = @fopen("$masterfile", "w");
  662. if($fp)
  663. {
  664. clearstatcache();
  665. fputs($fp, '<?php'."\n");
  666. fputs($fp, "// Wrapper to include master into htdocs\n");
  667. fputs($fp, "include_once '".$main_dir."/master.inc.php';\n");
  668. fclose($fp);
  669. }
  670. }
  671. /**
  672. * Save configuration file. No particular permissions are set by installer.
  673. *
  674. * @param string $conffile Path to conf file to generate/update
  675. * @return integer
  676. */
  677. function write_conf_file($conffile)
  678. {
  679. global $conf,$langs;
  680. global $main_url,$main_dir,$main_data_dir,$main_force_https,$main_use_alt_dir,$main_alt_dir_name,$main_db_prefix;
  681. global $dolibarr_main_url_root,$dolibarr_main_document_root,$dolibarr_main_data_root,$dolibarr_main_db_host;
  682. global $dolibarr_main_db_port,$dolibarr_main_db_name,$dolibarr_main_db_user,$dolibarr_main_db_pass;
  683. global $dolibarr_main_db_type,$dolibarr_main_db_character_set,$dolibarr_main_db_collation,$dolibarr_main_authentication;
  684. global $db_host,$db_port,$db_name,$db_user,$db_pass,$db_type,$db_character_set,$db_collation;
  685. global $conffile,$conffiletoshow,$conffiletoshowshort;
  686. global $force_dolibarr_lib_ADODB_PATH, $force_dolibarr_lib_NUSOAP_PATH;
  687. global $force_dolibarr_lib_TCPDF_PATH, $force_dolibarr_lib_FPDI_PATH;
  688. global $force_dolibarr_lib_PHPEXCEL_PATH, $force_dolibarr_lib_GEOIP_PATH;
  689. global $force_dolibarr_lib_ODTPHP_PATH, $force_dolibarr_lib_ODTPHP_PATHTOPCLZIP;
  690. global $force_dolibarr_js_CKEDITOR, $force_dolibarr_js_JQUERY, $force_dolibarr_js_JQUERY_UI, $force_dolibarr_js_JQUERY_FLOT;
  691. global $force_dolibarr_font_DOL_DEFAULT_TTF, $force_dolibarr_font_DOL_DEFAULT_TTF_BOLD;
  692. $error=0;
  693. $key = md5(uniqid(mt_rand(),TRUE)); // Generate random hash
  694. $fp = fopen("$conffile", "w");
  695. if($fp)
  696. {
  697. clearstatcache();
  698. fputs($fp,'<?php'."\n");
  699. fputs($fp,'//'."\n");
  700. fputs($fp,'// File generated by Dolibarr installer '.DOL_VERSION.' on '.dol_print_date(dol_now(),'')."\n");
  701. fputs($fp,'//'."\n");
  702. fputs($fp,'// Take a look at conf.php.example file for an example of '.$conffiletoshowshort.' file'."\n");
  703. fputs($fp,'// and explanations for all possibles parameters.'."\n");
  704. fputs($fp,'//'."\n");
  705. fputs($fp, '$dolibarr_main_url_root=\''.str_replace("'","\'",($main_url)).'\';');
  706. fputs($fp,"\n");
  707. fputs($fp, '$dolibarr_main_document_root=\''.str_replace("'","\'",($main_dir)).'\';');
  708. fputs($fp,"\n");
  709. fputs($fp, $main_use_alt_dir.'$dolibarr_main_url_root_alt=\''.str_replace("'","\'",("/".$main_alt_dir_name)).'\';');
  710. fputs($fp,"\n");
  711. fputs($fp, $main_use_alt_dir.'$dolibarr_main_document_root_alt=\''.str_replace("'","\'",($main_dir."/".$main_alt_dir_name)).'\';');
  712. fputs($fp,"\n");
  713. fputs($fp, '$dolibarr_main_data_root=\''.str_replace("'","\'",($main_data_dir)).'\';');
  714. fputs($fp,"\n");
  715. fputs($fp, '$dolibarr_main_db_host=\''.str_replace("'","\'",($db_host)).'\';');
  716. fputs($fp,"\n");
  717. fputs($fp, '$dolibarr_main_db_port=\''.str_replace("'","\'",($db_port)).'\';');
  718. fputs($fp,"\n");
  719. fputs($fp, '$dolibarr_main_db_name=\''.str_replace("'","\'",($db_name)).'\';');
  720. fputs($fp,"\n");
  721. fputs($fp, '$dolibarr_main_db_prefix=\''.str_replace("'","\'",($main_db_prefix)).'\';');
  722. fputs($fp,"\n");
  723. fputs($fp, '$dolibarr_main_db_user=\''.str_replace("'","\'",($db_user)).'\';');
  724. fputs($fp,"\n");
  725. fputs($fp, '$dolibarr_main_db_pass=\''.str_replace("'","\'",($db_pass)).'\';');
  726. fputs($fp,"\n");
  727. fputs($fp, '$dolibarr_main_db_type=\''.str_replace("'","\'",($db_type)).'\';');
  728. fputs($fp,"\n");
  729. fputs($fp, '$dolibarr_main_db_character_set=\''.str_replace("'","\'",($db_character_set)).'\';');
  730. fputs($fp,"\n");
  731. fputs($fp, '$dolibarr_main_db_collation=\''.str_replace("'","\'",($db_collation)).'\';');
  732. fputs($fp,"\n");
  733. /* Authentication */
  734. fputs($fp, '// Authentication settings');
  735. fputs($fp,"\n");
  736. fputs($fp, '$dolibarr_main_authentication=\'dolibarr\';');
  737. fputs($fp,"\n\n");
  738. fputs($fp, '//$dolibarr_main_demo=\'autologin,autopass\';');
  739. fputs($fp,"\n");
  740. fputs($fp, '// Security settings');
  741. fputs($fp,"\n");
  742. fputs($fp, '$dolibarr_main_prod=\'0\';');
  743. fputs($fp,"\n");
  744. fputs($fp, '$dolibarr_main_force_https=\''.$main_force_https.'\';');
  745. fputs($fp,"\n");
  746. fputs($fp, '$dolibarr_main_restrict_os_commands=\'mysqldump, mysql, pg_dump, pgrestore\';');
  747. fputs($fp,"\n");
  748. fputs($fp, '$dolibarr_nocsrfcheck=\'0\';');
  749. fputs($fp,"\n");
  750. fputs($fp, '$dolibarr_main_cookie_cryptkey=\''.$key.'\';');
  751. fputs($fp,"\n");
  752. fputs($fp, '$dolibarr_mailing_limit_sendbyweb=\'0\';');
  753. fputs($fp,"\n");
  754. // Write params to overwrites default lib path
  755. fputs($fp,"\n");
  756. if (empty($force_dolibarr_lib_FPDF_PATH)) { fputs($fp, '//'); $force_dolibarr_lib_FPDF_PATH=''; }
  757. fputs($fp, '$dolibarr_lib_FPDF_PATH=\''.$force_dolibarr_lib_FPDF_PATH.'\';');
  758. fputs($fp,"\n");
  759. if (empty($force_dolibarr_lib_TCPDF_PATH)) { fputs($fp, '//'); $force_dolibarr_lib_TCPDF_PATH=''; }
  760. fputs($fp, '$dolibarr_lib_TCPDF_PATH=\''.$force_dolibarr_lib_TCPDF_PATH.'\';');
  761. fputs($fp,"\n");
  762. if (empty($force_dolibarr_lib_FPDI_PATH)) { fputs($fp, '//'); $force_dolibarr_lib_FPDI_PATH=''; }
  763. fputs($fp, '$dolibarr_lib_FPDI_PATH=\''.$force_dolibarr_lib_FPDI_PATH.'\';');
  764. fputs($fp,"\n");
  765. if (empty($force_dolibarr_lib_TCPDI_PATH)) { fputs($fp, '//'); $force_dolibarr_lib_TCPDI_PATH=''; }
  766. fputs($fp, '$dolibarr_lib_TCPDI_PATH=\''.$force_dolibarr_lib_TCPDI_PATH.'\';');
  767. fputs($fp,"\n");
  768. if (empty($force_dolibarr_lib_ADODB_PATH)) { fputs($fp, '//'); $force_dolibarr_lib_ADODB_PATH=''; }
  769. fputs($fp, '$dolibarr_lib_ADODB_PATH=\''.$force_dolibarr_lib_ADODB_PATH.'\';');
  770. fputs($fp,"\n");
  771. if (empty($force_dolibarr_lib_GEOIP_PATH)) { fputs($fp, '//'); $force_dolibarr_lib_GEOIP_PATH=''; }
  772. fputs($fp, '$dolibarr_lib_GEOIP_PATH=\''.$force_dolibarr_lib_GEOIP_PATH.'\';');
  773. fputs($fp,"\n");
  774. if (empty($force_dolibarr_lib_NUSOAP_PATH)) { fputs($fp, '//'); $force_dolibarr_lib_NUSOAP_PATH=''; }
  775. fputs($fp, '$dolibarr_lib_NUSOAP_PATH=\''.$force_dolibarr_lib_NUSOAP_PATH.'\';');
  776. fputs($fp,"\n");
  777. if (empty($force_dolibarr_lib_PHPEXCEL_PATH)) { fputs($fp, '//'); $force_dolibarr_lib_PHPEXCEL_PATH=''; }
  778. fputs($fp, '$dolibarr_lib_PHPEXCEL_PATH=\''.$force_dolibarr_lib_PHPEXCEL_PATH.'\';');
  779. fputs($fp,"\n");
  780. if (empty($force_dolibarr_lib_ODTPHP_PATH)) { fputs($fp, '//'); $force_dolibarr_lib_ODTPHP_PATH=''; }
  781. fputs($fp, '$dolibarr_lib_ODTPHP_PATH=\''.$force_dolibarr_lib_ODTPHP_PATH.'\';');
  782. fputs($fp,"\n");
  783. if (empty($force_dolibarr_lib_ODTPHP_PATHTOPCLZIP)) { fputs($fp, '//'); $force_dolibarr_lib_ODTPHP_PATHTOPCLZIP=''; }
  784. fputs($fp, '$dolibarr_lib_ODTPHP_PATHTOPCLZIP=\''.$force_dolibarr_lib_ODTPHP_PATHTOPCLZIP.'\';');
  785. fputs($fp,"\n");
  786. if (empty($force_dolibarr_js_CKEDITOR)) { fputs($fp, '//'); $force_dolibarr_js_CKEDITOR=''; }
  787. fputs($fp, '$dolibarr_js_CKEDITOR=\''.$force_dolibarr_js_CKEDITOR.'\';');
  788. fputs($fp,"\n");
  789. if (empty($force_dolibarr_js_JQUERY)) { fputs($fp, '//'); $force_dolibarr_js_JQUERY=''; }
  790. fputs($fp, '$dolibarr_js_JQUERY=\''.$force_dolibarr_js_JQUERY.'\';');
  791. fputs($fp,"\n");
  792. if (empty($force_dolibarr_js_JQUERY_UI)) { fputs($fp, '//'); $force_dolibarr_js_JQUERY_UI=''; }
  793. fputs($fp, '$dolibarr_js_JQUERY_UI=\''.$force_dolibarr_js_JQUERY_UI.'\';');
  794. fputs($fp,"\n");
  795. if (empty($force_dolibarr_js_JQUERY_FLOT)) { fputs($fp, '//'); $force_dolibarr_js_JQUERY_FLOT=''; }
  796. fputs($fp, '$dolibarr_js_JQUERY_FLOT=\''.$force_dolibarr_js_JQUERY_FLOT.'\';');
  797. fputs($fp,"\n");
  798. // Write params to overwrites default font path
  799. fputs($fp,"\n");
  800. if (empty($force_dolibarr_font_DOL_DEFAULT_TTF)) { fputs($fp, '//'); $force_dolibarr_font_DOL_DEFAULT_TTF=''; }
  801. fputs($fp, '$dolibarr_font_DOL_DEFAULT_TTF=\''.$force_dolibarr_font_DOL_DEFAULT_TTF.'\';');
  802. fputs($fp,"\n");
  803. if (empty($force_dolibarr_font_DOL_DEFAULT_TTF_BOLD)) { fputs($fp, '//'); $force_dolibarr_font_DOL_DEFAULT_TTF_BOLD=''; }
  804. fputs($fp, '$dolibarr_font_DOL_DEFAULT_TTF_BOLD=\''.$force_dolibarr_font_DOL_DEFAULT_TTF_BOLD.'\';');
  805. fputs($fp,"\n");
  806. fclose($fp);
  807. if (file_exists("$conffile"))
  808. {
  809. include $conffile; // On force rechargement. Ne pas mettre include_once !
  810. conf($dolibarr_main_document_root);
  811. print "<tr><td>";
  812. print $langs->trans("SaveConfigurationFile");
  813. print ' <strong>'.$conffile.'</strong>';
  814. print "</td><td>";
  815. print '<img src="../theme/eldy/img/tick.png" alt="Ok">';
  816. print "</td></tr>";
  817. }
  818. else
  819. {
  820. $error++;
  821. }
  822. }
  823. return $error;
  824. }