source: trunk/install.php @ 20233

Last change on this file since 20233 was 19703, checked in by plg, 12 years ago

update Piwigo headers to 2013 (the end of the world didn't occur as expected on r12922)

  • Property svn:eol-style set to LF
File size: 15.3 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based photo gallery                                    |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2013 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
99if (isset($_POST['install']))
100{
101  $prefixeTable = $_POST['prefix'];
102}
103else
104{
105  $prefixeTable = DEFAULT_PREFIX_TABLE;
106}
107
108include(PHPWG_ROOT_PATH . 'include/config_default.inc.php');
109@include(PHPWG_ROOT_PATH. 'local/config/config.inc.php');
110defined('PWG_LOCAL_DIR') or define('PWG_LOCAL_DIR', 'local/');
111
112// download database config file if exists
113if (!empty($_GET['dl']) && file_exists(PHPWG_ROOT_PATH.$conf['data_location'].'pwg_'.$_GET['dl']))
114{
115  $filename = PHPWG_ROOT_PATH.$conf['data_location'].'pwg_'.$_GET['dl'];
116  header('Cache-Control: no-cache, must-revalidate');
117  header('Pragma: no-cache');
118  header('Content-Disposition: attachment; filename="database.inc.php"');
119  header('Content-Transfer-Encoding: binary');
120  header('Content-Length: '.filesize($filename));
121  echo file_get_contents($filename);
122  unlink($filename);
123  exit();
124} 
125
126// Obtain various vars
127$dbhost = (!empty($_POST['dbhost'])) ? $_POST['dbhost'] : 'localhost';
128$dbuser = (!empty($_POST['dbuser'])) ? $_POST['dbuser'] : '';
129$dbpasswd = (!empty($_POST['dbpasswd'])) ? $_POST['dbpasswd'] : '';
130$dbname = (!empty($_POST['dbname'])) ? $_POST['dbname'] : '';
131$dblayer = 'mysql';
132
133$admin_name = (!empty($_POST['admin_name'])) ? $_POST['admin_name'] : '';
134$admin_pass1 = (!empty($_POST['admin_pass1'])) ? $_POST['admin_pass1'] : '';
135$admin_pass2 = (!empty($_POST['admin_pass2'])) ? $_POST['admin_pass2'] : '';
136$admin_mail = (!empty($_POST['admin_mail'])) ? $_POST['admin_mail'] : '';
137
138$is_newsletter_subscribe = true;
139if (isset($_POST['install']))
140{
141  $is_newsletter_subscribe = isset($_POST['newsletter_subscribe']);
142}
143
144$infos = array();
145$errors = array();
146
147$config_file = PHPWG_ROOT_PATH.PWG_LOCAL_DIR .'config/database.inc.php';
148if (@file_exists($config_file))
149{
150  include($config_file);
151  // Is Piwigo already installed ?
152  if (defined("PHPWG_INSTALLED"))
153  {
154    die('Piwigo is already installed');
155  }
156}
157
158include(PHPWG_ROOT_PATH . 'include/constants.php');
159include(PHPWG_ROOT_PATH . 'include/functions.inc.php');
160include(PHPWG_ROOT_PATH . 'admin/include/functions.php');
161
162include(PHPWG_ROOT_PATH . 'admin/include/languages.class.php');
163$languages = new languages('utf-8');
164
165if (isset($_GET['language']))
166{
167  $language = strip_tags($_GET['language']);
168 
169  if (!in_array($language, array_keys($languages->fs_languages)))
170  {
171    $language = PHPWG_DEFAULT_LANGUAGE;
172  }
173}
174else
175{
176  $language = 'en_UK';
177  // Try to get browser language
178  foreach ($languages->fs_languages as $language_code => $fs_language)
179  {
180    if (substr($language_code,0,2) == @substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2))
181    {
182      $language = $language_code;
183      break;
184    }
185  }
186}
187
188if ('fr_FR' == $language) {
189  define('PHPWG_DOMAIN', 'fr.piwigo.org');
190}
191else if ('it_IT' == $language) {
192  define('PHPWG_DOMAIN', 'it.piwigo.org');
193}
194else if ('de_DE' == $language) {
195  define('PHPWG_DOMAIN', 'de.piwigo.org');
196}
197else if ('es_ES' == $language) {
198  define('PHPWG_DOMAIN', 'es.piwigo.org');
199}
200else if ('pl_PL' == $language) {
201  define('PHPWG_DOMAIN', 'pl.piwigo.org');
202}
203else if ('zh_CN' == $language) {
204  define('PHPWG_DOMAIN', 'cn.piwigo.org');
205}
206else if ('hu_HU' == $language) {
207  define('PHPWG_DOMAIN', 'hu.piwigo.org');
208}
209else if ('ru_RU' == $language) {
210  define('PHPWG_DOMAIN', 'ru.piwigo.org');
211}
212else if ('nl_NL' == $language) {
213  define('PHPWG_DOMAIN', 'nl.piwigo.org');
214}
215else {
216  define('PHPWG_DOMAIN', 'piwigo.org');
217}
218define('PHPWG_URL', 'http://'.PHPWG_DOMAIN);
219
220load_language('common.lang', '', array('language' => $language, 'target_charset'=>'utf-8'));
221load_language('admin.lang', '', array('language' => $language, 'target_charset'=>'utf-8'));
222load_language('install.lang', '', array('language' => $language, 'target_charset'=>'utf-8'));
223
224header('Content-Type: text/html; charset=UTF-8');
225//------------------------------------------------- check php version
226if (version_compare(PHP_VERSION, REQUIRED_PHP_VERSION, '<'))
227{
228  include(PHPWG_ROOT_PATH.'install/php5_apache_configuration.php');
229}
230
231//----------------------------------------------------- template initialization
232$template = new Template(PHPWG_ROOT_PATH.'admin/themes', 'clear');
233$template->set_filenames( array('install' => 'install.tpl') );
234if (!isset($step))
235{
236  $step = 1;
237}
238//---------------------------------------------------------------- form analyze
239include(PHPWG_ROOT_PATH .'include/dblayer/functions_'.$dblayer.'.inc.php');
240include(PHPWG_ROOT_PATH . 'admin/include/functions_install.inc.php');
241include(PHPWG_ROOT_PATH . 'admin/include/functions_upgrade.php');
242
243if ( isset( $_POST['install'] ))
244{
245  install_db_connect($infos, $errors);
246  pwg_db_check_charset();
247
248  $webmaster = trim(preg_replace( '/\s{2,}/', ' ', $admin_name ));
249  if ( empty($webmaster))
250    array_push( $errors, l10n('enter a login for webmaster') );
251  else if ( preg_match( '/[\'"]/', $webmaster ) )
252    array_push( $errors, l10n('webmaster login can\'t contain characters \' or "') );
253  if ( $admin_pass1 != $admin_pass2 || empty($admin_pass1) )
254    array_push( $errors, l10n('please enter your password again') );
255  if ( empty($admin_mail))
256    array_push( $errors, l10n('mail address must be like xxx@yyy.eee (example : jack@altern.org)') );
257  else
258  {
259    $error_mail_address = validate_mail_address(null, $admin_mail);
260    if (!empty($error_mail_address))
261      array_push( $errors, $error_mail_address );
262  }
263
264  if ( count( $errors ) == 0 )
265  {
266    $step = 2;
267    $file_content = '<?php
268$conf[\'dblayer\'] = \''.$dblayer.'\';
269$conf[\'db_base\'] = \''.$dbname.'\';
270$conf[\'db_user\'] = \''.$dbuser.'\';
271$conf[\'db_password\'] = \''.$dbpasswd.'\';
272$conf[\'db_host\'] = \''.$dbhost.'\';
273
274$prefixeTable = \''.$prefixeTable.'\';
275
276define(\'PHPWG_INSTALLED\', true);
277define(\'PWG_CHARSET\', \'utf-8\');
278define(\'DB_CHARSET\', \'utf8\');
279define(\'DB_COLLATE\', \'\');
280
281?'.'>';
282
283    @umask(0111);
284    // writing the configuration file
285    if ( !($fp = @fopen( $config_file, 'w' )))
286    {
287      $tmp_filename = md5(uniqid(time()));
288      $fh = @fopen( PHPWG_ROOT_PATH.$conf['data_location'] . 'pwg_' . $tmp_filename, 'w' );
289      @fputs($fh, $file_content, strlen($file_content));
290      @fclose($fh);
291
292      $template->assign(
293        array(
294          'config_creation_failed' => true,
295          'config_url' => 'install.php?dl='.$tmp_filename,
296          'config_file_content' => $file_content,
297          )
298        );
299    }
300    @fputs($fp, $file_content, strlen($file_content));
301    @fclose($fp);
302
303    // tables creation, based on piwigo_structure.sql
304    execute_sqlfile(
305      PHPWG_ROOT_PATH.'install/piwigo_structure-'.$dblayer.'.sql',
306      DEFAULT_PREFIX_TABLE,
307      $prefixeTable,
308      $dblayer
309      );
310    // We fill the tables with basic informations
311    execute_sqlfile(
312      PHPWG_ROOT_PATH.'install/config.sql',
313      DEFAULT_PREFIX_TABLE,
314      $prefixeTable,
315      $dblayer
316      );
317
318    $query = '
319INSERT INTO '.$prefixeTable.'config (param,value,comment)
320   VALUES (\'secret_key\',md5('.pwg_db_cast_to_text(DB_RANDOM_FUNCTION.'()').'),
321   \'a secret key specific to the gallery for internal use\');';
322    pwg_query($query);
323
324    conf_update_param('piwigo_db_version', get_branch_from_version(PHPWG_VERSION));
325    conf_update_param('gallery_title', l10n('Just another Piwigo gallery'));
326    conf_update_param('page_banner', '<h1>%gallery_title%</h1>'."\n\n<p>".l10n('Welcome to my photo gallery').'</p>');
327
328    // fill languages table
329    foreach ($languages->fs_languages as $language_code => $fs_language)
330    {
331      $languages->perform_action('activate', $language_code);
332    }
333
334    // fill $conf global array
335    load_conf_from_db();
336
337    // PWG_CHARSET is required for building the fs_themes array in the
338    // themes class
339    if (!defined('PWG_CHARSET'))
340    {
341      define('PWG_CHARSET', 'utf-8');
342    }
343    activate_core_themes();
344
345    $insert = array(
346      'id' => 1,
347      'galleries_url' => PHPWG_ROOT_PATH.'galleries/',
348      );
349    mass_inserts(SITES_TABLE, array_keys($insert), array($insert));
350
351    // webmaster admin user
352    $inserts = array(
353      array(
354        'id'           => 1,
355        'username'     => $admin_name,
356        'password'     => md5($admin_pass1),
357        'mail_address' => $admin_mail,
358        ),
359      array(
360        'id'           => 2,
361        'username'     => 'guest',
362        ),
363      );
364    mass_inserts(USERS_TABLE, array_keys($inserts[0]), $inserts);
365
366    create_user_infos(array(1,2), array('language' => $language));
367
368    // Available upgrades must be ignored after a fresh installation. To
369    // make PWG avoid upgrading, we must tell it upgrades have already been
370    // made.
371    list($dbnow) = pwg_db_fetch_row(pwg_query('SELECT NOW();'));
372    define('CURRENT_DATE', $dbnow);
373    $datas = array();
374    foreach (get_available_upgrade_ids() as $upgrade_id)
375    {
376      array_push(
377        $datas,
378        array(
379          'id'          => $upgrade_id,
380          'applied'     => CURRENT_DATE,
381          'description' => 'upgrade included in installation',
382          )
383        );
384    }
385    mass_inserts(
386      UPGRADE_TABLE,
387      array_keys($datas[0]),
388      $datas
389      );
390
391    if ($is_newsletter_subscribe)
392    {
393      fetchRemote(
394        get_newsletter_subscribe_base_url($language).$admin_mail,
395        $result,
396        array(),
397        array('origin' => 'installation')
398        );
399    }
400  }
401}
402
403//------------------------------------------------------ start template output
404foreach ($languages->fs_languages as $language_code => $fs_language)
405{
406  if ($language == $language_code)
407  {
408    $template->assign('language_selection', $language_code);
409  }
410  $languages_options[$language_code] = $fs_language['name'];
411}
412$template->assign('language_options', $languages_options);
413
414$template->assign(
415  array(
416    'T_CONTENT_ENCODING' => 'utf-8',
417    'RELEASE' => PHPWG_VERSION,
418    'F_ACTION' => 'install.php?language=' . $language,
419    'F_DB_HOST' => $dbhost,
420    'F_DB_USER' => $dbuser,
421    'F_DB_NAME' => $dbname,
422    'F_DB_PREFIX' => $prefixeTable,
423    'F_ADMIN' => $admin_name,
424    'F_ADMIN_EMAIL' => $admin_mail,
425    'EMAIL' => '<span class="adminEmail">'.$admin_mail.'</span>',
426    'F_NEWSLETTER_SUBSCRIBE' => $is_newsletter_subscribe,
427    'L_INSTALL_HELP' => sprintf(l10n('Need help ? Ask your question on <a href="%s">Piwigo message board</a>.'), PHPWG_URL.'/forum'),
428    ));
429
430//------------------------------------------------------ errors & infos display
431if ($step == 1)
432{
433  $template->assign('install', true);
434}
435else
436{
437  array_push(
438    $infos,
439    l10n('Congratulations, Piwigo installation is completed')
440    );
441
442  if (isset($error_copy))
443  {
444    array_push($errors, $error_copy);
445  }
446  else
447  {
448    session_set_save_handler('pwg_session_open',
449      'pwg_session_close',
450      'pwg_session_read',
451      'pwg_session_write',
452      'pwg_session_destroy',
453      'pwg_session_gc'
454    );
455    if ( function_exists('ini_set') )
456    {
457      ini_set('session.use_cookies', $conf['session_use_cookies']);
458      ini_set('session.use_only_cookies', $conf['session_use_only_cookies']);
459      ini_set('session.use_trans_sid', intval($conf['session_use_trans_sid']));
460      ini_set('session.cookie_httponly', 1);
461    }
462    session_name($conf['session_name']);
463    session_set_cookie_params(0, cookie_path());
464    $user = build_user(1, true);
465    log_user($user['id'], false);
466   
467    // email notification
468    if (isset($_POST['send_password_by_mail']))
469    {
470      include_once(PHPWG_ROOT_PATH.'include/functions_mail.inc.php');
471           
472      $keyargs_content = array(
473        get_l10n_args('Hello %s,', $admin_name),
474        get_l10n_args('Welcome to your new installation of Piwigo!', ''),
475        get_l10n_args('', ''),
476        get_l10n_args('Here are your connection settings', ''),
477        get_l10n_args('Username: %s', $admin_name),
478        get_l10n_args('Password: %s', $admin_pass1),
479        get_l10n_args('Email: %s', $admin_mail),
480        get_l10n_args('', ''),
481        get_l10n_args('Don\'t hesitate to consult our forums for any help: %s', PHPWG_URL),
482        );
483       
484      pwg_mail(
485        $admin_mail,
486        array(
487          'subject' => l10n('Just another Piwigo gallery'),
488          'content' => l10n_args($keyargs_content),
489          'content_format' => 'text/plain',
490          )
491        );
492    }
493  }
494}
495if (count($errors) != 0)
496{
497  $template->assign('errors', $errors);
498}
499
500if (count($infos) != 0 )
501{
502  $template->assign('infos', $infos);
503}
504
505//----------------------------------------------------------- html code display
506$template->pparse('install');
507?>
Note: See TracBrowser for help on using the repository browser.