source: trunk/install.php @ 5427

Last change on this file since 5427 was 5408, checked in by plg, 15 years ago

Simplify installation message, no need to explain the following step, the
"no photo yet" feature makes the explanations useless at this point.

.infos admin block is used to display messages, I've set the background
transparent here, because it's the only message of the page. Anyway, I don't
think using .infos blocks are relevant if that's the only message on the page.

File size: 17.1 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based picture gallery                                  |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2010 Piwigo Team                  http://piwigo.org |
6// | Copyright(C) 2003-2008 PhpWebGallery Team    http://phpwebgallery.net |
7// | Copyright(C) 2002-2003 Pierrick LE GALL   http://le-gall.net/pierrick |
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                                          |
12// |                                                                       |
13// | This program is distributed in the hope that it will be useful, but   |
14// | WITHOUT ANY WARRANTY; without even the implied warranty of            |
15// | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU      |
16// | General Public License for more details.                              |
17// |                                                                       |
18// | You should have received a copy of the GNU General Public License     |
19// | along with this program; if not, write to the Free Software           |
20// | Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, |
21// | USA.                                                                  |
22// +-----------------------------------------------------------------------+
23
24//----------------------------------------------------------- include
25define('PHPWG_ROOT_PATH','./');
26
27@set_magic_quotes_runtime(0); // Disable magic_quotes_runtime
28//
29// addslashes to vars if magic_quotes_gpc is off this is a security
30// precaution to prevent someone trying to break out of a SQL statement.
31//
32if( !@get_magic_quotes_gpc() )
33{
34  if( is_array($_POST) )
35  {
36    while( list($k, $v) = each($_POST) )
37    {
38      if( is_array($_POST[$k]) )
39      {
40        while( list($k2, $v2) = each($_POST[$k]) )
41        {
42          $_POST[$k][$k2] = addslashes($v2);
43        }
44        @reset($_POST[$k]);
45      }
46      else
47      {
48        $_POST[$k] = addslashes($v);
49      }
50    }
51    @reset($_POST);
52  }
53
54  if( is_array($_GET) )
55  {
56    while( list($k, $v) = each($_GET) )
57    {
58      if( is_array($_GET[$k]) )
59      {
60        while( list($k2, $v2) = each($_GET[$k]) )
61        {
62          $_GET[$k][$k2] = addslashes($v2);
63        }
64        @reset($_GET[$k]);
65      }
66      else
67      {
68        $_GET[$k] = addslashes($v);
69      }
70    }
71    @reset($_GET);
72  }
73
74  if( is_array($_COOKIE) )
75  {
76    while( list($k, $v) = each($_COOKIE) )
77    {
78      if( is_array($_COOKIE[$k]) )
79      {
80        while( list($k2, $v2) = each($_COOKIE[$k]) )
81        {
82          $_COOKIE[$k][$k2] = addslashes($v2);
83        }
84        @reset($_COOKIE[$k]);
85      }
86      else
87      {
88        $_COOKIE[$k] = addslashes($v);
89      }
90    }
91    @reset($_COOKIE);
92  }
93}
94
95//----------------------------------------------------- variable initialization
96
97define('DEFAULT_PREFIX_TABLE', 'piwigo_');
98
99// default database engine proposed if severals are available
100// choices : sqlite, mysql, pgsql, pdo-sqlite
101// see include/dblayer/dblayers.inc.php
102define('DEFAULT_DB_ENGINE', 'mysql');
103
104// database engine default choice between sqlite (native or via pdo)
105// if the twice are available.
106define('DEFAULT_DB_SQLITE', 'native'); 
107
108if (isset($_POST['install']))
109{
110  $prefixeTable = $_POST['prefix'];
111}
112else
113{
114  $prefixeTable = DEFAULT_PREFIX_TABLE;
115}
116
117include(PHPWG_ROOT_PATH . 'include/config_default.inc.php');
118@include(PHPWG_ROOT_PATH. 'local/config/config.inc.php');
119
120// download database config file if exists
121if (!empty($_GET['dl']) && file_exists($conf['local_data_dir'].'/pwg_'.$_GET['dl']))
122{
123  $filename = $conf['local_data_dir'].'/pwg_'.$_GET['dl'];
124  header('Cache-Control: no-cache, must-revalidate');
125  header('Pragma: no-cache');
126  header('Content-Disposition: attachment; filename="database.inc.php"');
127  header('Content-Transfer-Encoding: binary');
128  header('Content-Length: '.filesize($filename));
129  echo file_get_contents($filename);
130  unlink($filename);
131  exit();
132} 
133
134// Obtain various vars
135$dbhost = (!empty($_POST['dbhost'])) ? $_POST['dbhost'] : 'localhost';
136$dbuser = (!empty($_POST['dbuser'])) ? $_POST['dbuser'] : '';
137$dbpasswd = (!empty($_POST['dbpasswd'])) ? $_POST['dbpasswd'] : '';
138$dbname = (!empty($_POST['dbname'])) ? $_POST['dbname'] : '';
139$dblayer = (!empty($_POST['dblayer'])) ? $_POST['dblayer'] : DEFAULT_DB_ENGINE;
140
141$admin_name = (!empty($_POST['admin_name'])) ? $_POST['admin_name'] : '';
142$admin_pass1 = (!empty($_POST['admin_pass1'])) ? $_POST['admin_pass1'] : '';
143$admin_pass2 = (!empty($_POST['admin_pass2'])) ? $_POST['admin_pass2'] : '';
144$admin_mail = (!empty($_POST['admin_mail'])) ? $_POST['admin_mail'] : '';
145
146$infos = array();
147$errors = array();
148
149// database config file migration : mysql.inc.php et database.inc.php
150$old_config_file = PHPWG_ROOT_PATH . 'include/mysql.inc.php';
151$config_file = PHPWG_ROOT_PATH . 'local/config/database.inc.php';
152if (!file_exists($config_file) && file_exists($old_config_file))
153{
154  $step = 3;
155  include $old_config_file;
156  $file_content = '<?php
157$conf[\'dblayer\'] = \'mysql\';
158$conf[\'db_base\'] = \''.$cfgBase.'\';
159$conf[\'db_user\'] = \''.$cfgUser.'\';
160$conf[\'db_password\'] = \''.$cfgPassword.'\';
161$conf[\'db_host\'] = \''.$cfgHote.'\';
162
163$prefixeTable = \''.$prefixeTable.'\';
164
165define(\'PHPWG_INSTALLED\', true);
166define(\'PWG_CHARSET\', \''.PWG_CHARSET.'\');
167define(\'DB_CHARSET\', \''.DB_CHARSET.'\');
168define(\'DB_COLLATE\', \''.DB_COLLATE.'\');
169
170?'.'>';
171}
172// Open config.php ... if it exists
173elseif (@file_exists($config_file))
174{
175  include($config_file);
176  // Is Piwigo already installed ?
177  if (defined("PHPWG_INSTALLED"))
178  {
179    die('Piwigo is already installed');
180  }
181}
182
183include(PHPWG_ROOT_PATH . 'include/constants.php');
184include(PHPWG_ROOT_PATH . 'include/functions.inc.php');
185include(PHPWG_ROOT_PATH . 'admin/include/functions.php');
186
187include(PHPWG_ROOT_PATH . 'admin/include/languages.class.php');
188$languages = new languages('utf-8');
189
190if (isset($_GET['language']))
191{
192  $language = strip_tags($_GET['language']);
193}
194else
195{
196  $language = 'en_UK';
197  // Try to get browser language
198  foreach ($languages->fs_languages as $language_code => $language_name)
199  {
200    if (substr($language_code,0,2) == @substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2))
201    {
202      $language = $language_code;
203      break;
204    }
205  }
206}
207
208if ('fr_FR' == $language) {
209  define('PHPWG_DOMAIN', 'fr.piwigo.org');
210}
211else if ('it_IT' == $language) {
212  define('PHPWG_DOMAIN', 'it.piwigo.org');
213}
214else if ('de_DE' == $language) {
215  define('PHPWG_DOMAIN', 'de.piwigo.org');
216}
217else if ('es_ES' == $language) {
218  define('PHPWG_DOMAIN', 'es.piwigo.org');
219}
220else if ('pl_PL' == $language) {
221  define('PHPWG_DOMAIN', 'pl.piwigo.org');
222}
223else if ('zh_CN' == $language) {
224  define('PHPWG_DOMAIN', 'cn.piwigo.org');
225}
226else if ('hu_HU_CN' == $language) {
227  define('PHPWG_DOMAIN', 'hu.piwigo.org');
228}
229else if ('ru_RU_CN' == $language) {
230  define('PHPWG_DOMAIN', 'ru.piwigo.org');
231}
232else {
233  define('PHPWG_DOMAIN', 'piwigo.org');
234}
235define('PHPWG_URL', 'http://'.PHPWG_DOMAIN);
236
237if (empty($step) || ($step != 3))
238{
239  load_language('common.lang', '', array('language' => $language, 'target_charset'=>'utf-8'));
240  load_language('admin.lang', '', array('language' => $language, 'target_charset'=>'utf-8'));
241  load_language('install.lang', '', array('language' => $language, 'target_charset'=>'utf-8'));
242}
243header('Content-Type: text/html; charset=UTF-8');
244//------------------------------------------------- check php version
245if (version_compare(PHP_VERSION, REQUIRED_PHP_VERSION, '<'))
246{
247  include(PHPWG_ROOT_PATH.'install/php5_apache_configuration.php');
248}
249
250//----------------------------------------------------- template initialization
251include( PHPWG_ROOT_PATH .'include/template.class.php');
252$template = new Template(PHPWG_ROOT_PATH.'admin/themes', 'roma');
253$template->set_filenames( array('install' => 'install.tpl') );
254if (!isset($step))
255{
256  $step = 1;
257}
258//---------------------------------------------------------------- form analyze
259include(PHPWG_ROOT_PATH .'include/dblayer/functions_'.$dblayer.'.inc.php');
260include(PHPWG_ROOT_PATH . 'admin/include/functions_install.inc.php');
261include(PHPWG_ROOT_PATH . 'admin/include/functions_upgrade.php');
262
263if ( isset( $_POST['install'] ))
264{
265  if (install_db_connect($infos, $errors))
266  {
267    $required_version = constant('REQUIRED_'.strtoupper($dblayer).'_VERSION');
268    if ( version_compare(pwg_get_db_version(), $required_version, '>=') )
269    {
270      $pwg_charset = 'utf-8';
271      $pwg_db_charset = 'utf8';
272      if ($dblayer=='mysql')
273      {
274        $install_charset_collate = "DEFAULT CHARACTER SET $pwg_db_charset";
275        pwg_query('SET NAMES "'.$pwg_db_charset.'"');
276      }
277      else 
278      {
279        $install_charset_collate = '';
280      }
281    }
282    else
283    {
284      $pwg_charset = 'iso-8859-1';
285      $pwg_db_charset = 'latin1';
286      $install_charset_collate = '';
287      if ( !array_key_exists($language, $languages->get_fs_languages($pwg_charset) ) )
288      {
289        $language='en_UK';
290      }
291    }
292  }
293
294  $webmaster = trim(preg_replace( '/\s{2,}/', ' ', $admin_name ));
295  if ( empty($webmaster))
296    array_push( $errors, l10n('enter a login for webmaster') );
297  else if ( preg_match( '/[\'"]/', $webmaster ) )
298    array_push( $errors, l10n('webmaster login can\'t contain characters \' or "') );
299  if ( $admin_pass1 != $admin_pass2 || empty($admin_pass1) )
300    array_push( $errors, l10n('please enter your password again') );
301  if ( empty($admin_mail))
302    array_push( $errors, l10n('mail address must be like xxx@yyy.eee (example : jack@altern.org)') );
303  else
304  {
305    $error_mail_address = validate_mail_address(null, $admin_mail);
306    if (!empty($error_mail_address))
307      array_push( $errors, $error_mail_address );
308  }
309
310  if ( count( $errors ) == 0 )
311  {
312    $step = 2;
313    $file_content = '<?php
314$conf[\'dblayer\'] = \''.$dblayer.'\';
315$conf[\'db_base\'] = \''.$dbname.'\';
316$conf[\'db_user\'] = \''.$dbuser.'\';
317$conf[\'db_password\'] = \''.$dbpasswd.'\';
318$conf[\'db_host\'] = \''.$dbhost.'\';
319
320$prefixeTable = \''.$prefixeTable.'\';
321
322define(\'PHPWG_INSTALLED\', true);
323define(\'PWG_CHARSET\', \''.$pwg_charset.'\');
324define(\'DB_CHARSET\', \''.$pwg_db_charset.'\');
325define(\'DB_COLLATE\', \'\');
326
327?'.'>';
328
329    @umask(0111);
330    // writing the configuration file
331    if ( !($fp = @fopen( $config_file, 'w' )))
332    {
333      $tmp_filename = md5(uniqid(time()));
334      $fh = @fopen( $conf['local_data_dir'] . '/pwg_' . $tmp_filename, 'w' );
335      @fputs($fh, $file_content, strlen($file_content));
336      @fclose($fh);
337
338      $error_copy = l10n('Creation of config file local/config/database.inc.php failed.');
339      $error_copy .= sprintf('<br><a href="install.php?dl=%s">%s</a> %s',
340                             $tmp_filename,
341                             l10n('You can download the config file'),
342                             l10n('and upload it to local/config directory of your installation.')
343        );
344
345      $error_copy .= '<br><br>';
346      $error_copy .= l10n('An alternate solution is to copy the text in the box above and paste it into the file "local/config/database.inc.php" (Warning : database.inc.php must only contain what is in the textarea, no line return or space character)');
347      $error_copy .= '<br><br>';
348      $error_copy .= '<textarea rows="15" cols="70">' . $file_content . '</textarea>';
349    }
350    @fputs($fp, $file_content, strlen($file_content));
351    @fclose($fp);
352
353    // tables creation, based on piwigo_structure.sql
354    execute_sqlfile(
355      PHPWG_ROOT_PATH.'install/piwigo_structure-'.$dblayer.'.sql',
356      DEFAULT_PREFIX_TABLE,
357      $prefixeTable
358      );
359    // We fill the tables with basic informations
360    execute_sqlfile(
361      PHPWG_ROOT_PATH.'install/config.sql',
362      DEFAULT_PREFIX_TABLE,
363      $prefixeTable
364      );
365
366    $query = '
367INSERT INTO '.$prefixeTable.'config (param,value,comment)
368   VALUES (\'secret_key\',\'md5('.pwg_db_cast_to_text(DB_RANDOM_FUNCTION.'()').')\',
369   \'a secret key specific to the gallery for internal use\');';
370    pwg_query($query);
371
372    // fill languages table
373    foreach ($languages->get_fs_languages($pwg_charset) as $language_code => $language_name)
374    {
375      $languages->perform_action('activate', $language_code);
376    }
377
378    // fill $conf global array
379    load_conf_from_db();
380
381    // PWG_CHARSET is required for building the fs_themes array in the
382    // themes class
383    define('PWG_CHARSET', $pwg_charset);
384    activate_all_themes();
385
386    $insert = array(
387      'id' => 1,
388      'galleries_url' => PHPWG_ROOT_PATH.'galleries/',
389      );
390    mass_inserts(SITES_TABLE, array_keys($insert), array($insert));
391
392    // webmaster admin user
393    $inserts = array(
394      array(
395        'id'           => 1,
396        'username'     => $admin_name,
397        'password'     => md5($admin_pass1),
398        'mail_address' => $admin_mail,
399        ),
400      array(
401        'id'           => 2,
402        'username'     => 'guest',
403        ),
404      );
405    mass_inserts(USERS_TABLE, array_keys($inserts[0]), $inserts);
406
407    create_user_infos(array(1,2), array('language' => $language));
408
409    // Available upgrades must be ignored after a fresh installation. To
410    // make PWG avoid upgrading, we must tell it upgrades have already been
411    // made.
412    list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
413    define('CURRENT_DATE', $dbnow);
414    $datas = array();
415    foreach (get_available_upgrade_ids() as $upgrade_id)
416    {
417      array_push(
418        $datas,
419        array(
420          'id'          => $upgrade_id,
421          'applied'     => CURRENT_DATE,
422          'description' => 'upgrade included in installation',
423          )
424        );
425    }
426    mass_inserts(
427      UPGRADE_TABLE,
428      array_keys($datas[0]),
429      $datas
430      );
431  }
432}
433
434//------------------------------------------------------ start template output
435if ($step == 3)
436{
437  @umask(0111);
438  // writing the new configuration file
439  if ( !($fp = @fopen( $config_file, 'w' )))
440  {
441    $html_content = htmlentities( $file_content, ENT_QUOTES );
442    $html_content = nl2br( $html_content );
443    $error_copy = l10n('Copy the text in pink between hyphens and paste it into the file "local/config/database.inc.php"(Warning : database.inc.php must only contain what is in pink, no line return or space character)');
444    $error_copy .= '<br>--------------------------------------------------------------------<br>';
445    $error_copy .= '<span class="sql_content">' . $html_content . '</span>';
446    $error_copy .= '<br>--------------------------------------------------------------------<br>';
447  } 
448  else 
449  {
450    @fputs($fp, $file_content, strlen($file_content));
451    @fclose($fp);
452
453    @unlink($old_config_file);
454    header("Location: index.php");
455    exit();
456  }
457
458  $template->assign(
459    array(
460      'T_CONTENT_ENCODING' => 'utf-8',
461      'migration' => true
462          ));
463}
464else
465{
466  $dbengines = available_engines();
467
468  foreach ($languages->fs_languages as $language_code => $language_name)
469  {
470    if ($language == $language_code)
471    {
472      $template->assign('language_selection', $language_code);
473    }
474    $languages_options[$language_code] = $language_name;
475  }
476  $template->assign('language_options', $languages_options);
477
478  $template->assign(
479    array(
480      'T_CONTENT_ENCODING' => 'utf-8',
481      'RELEASE' => PHPWG_VERSION,
482      'F_ACTION' => 'install.php?language=' . $language,
483      'F_DB_ENGINES' => $dbengines,
484      'F_DB_LAYER' => $dblayer,
485      'F_DB_HOST' => $dbhost,
486      'F_DB_USER' => $dbuser,
487      'F_DB_NAME' => $dbname,
488      'F_DB_PREFIX' => $prefixeTable,
489      'F_ADMIN' => $admin_name,
490      'F_ADMIN_EMAIL' => $admin_mail,
491      'L_INSTALL_HELP' => sprintf(l10n('Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'), PHPWG_URL.'/forum'),
492      ));
493}
494
495//------------------------------------------------------ errors & infos display
496if ($step == 1)
497{
498  $template->assign('install', true);
499}
500elseif ($step == 3)
501{
502  if (isset($error_copy))
503  {
504    array_push($errors, $error_copy);
505  }
506}
507else
508{
509  array_push(
510    $infos,
511    l10n('Congratulations, Piwigo installation is completed')
512    );
513
514  if (isset($error_copy))
515  {
516    array_push($errors, $error_copy);
517  }
518  else
519  {
520    session_set_save_handler('pwg_session_open',
521      'pwg_session_close',
522      'pwg_session_read',
523      'pwg_session_write',
524      'pwg_session_destroy',
525      'pwg_session_gc'
526    );
527    if ( function_exists('ini_set') )
528    {
529      ini_set('session.use_cookies', $conf['session_use_cookies']);
530      ini_set('session.use_only_cookies', $conf['session_use_only_cookies']);
531      ini_set('session.use_trans_sid', intval($conf['session_use_trans_sid']));
532      ini_set('session.cookie_httponly', 1);
533    }
534    session_name($conf['session_name']);
535    session_set_cookie_params(0, cookie_path());
536    $user = build_user(1, true);
537    log_user($user['id'], false);
538  }
539
540  $template->assign(
541    'SUBSCRIBE_BASE_URL',
542    get_newsletter_subscribe_base_url($language)
543    );
544}
545if (count($errors) != 0)
546{
547  $template->assign('errors', $errors);
548}
549
550if (count($infos) != 0 )
551{
552  $template->assign('infos', $infos);
553}
554
555//----------------------------------------------------------- html code display
556$template->pparse('install');
557?>
Note: See TracBrowser for help on using the repository browser.