source: branches/2.0/install.php @ 3204

Last change on this file since 3204 was 3204, checked in by patdenice, 16 years ago

merge r3203 from trunk to branch 2.0.
Move template class inclusion to common.inc.php.
Add forum link in upgrade page.
Install and upgrade try to configure PHP5.

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 12.6 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based picture gallery                                  |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008-2009 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/**
28 * loads an sql file and executes all queries
29 *
30 * Before executing a query, $replaced is... replaced by $replacing. This is
31 * useful when the SQL file contains generic words. Drop table queries are
32 * not executed.
33 *
34 * @param string filepath
35 * @param string replaced
36 * @param string replacing
37 * @return void
38 */
39function execute_sqlfile($filepath, $replaced, $replacing)
40{
41  $sql_lines = file($filepath);
42  $query = '';
43  foreach ($sql_lines as $sql_line)
44  {
45    $sql_line = trim($sql_line);
46    if (preg_match('/(^--|^$)/', $sql_line))
47    {
48      continue;
49    }
50    $query.= ' '.$sql_line;
51    // if we reached the end of query, we execute it and reinitialize the
52    // variable "query"
53    if (preg_match('/;$/', $sql_line))
54    {
55      $query = trim($query);
56      $query = str_replace($replaced, $replacing, $query);
57      // we don't execute "DROP TABLE" queries
58      if (!preg_match('/^DROP TABLE/i', $query))
59      {
60        global $install_charset_collate;
61        if ( !empty($install_charset_collate) )
62        {
63          if ( preg_match('/^(CREATE TABLE .*)[\s]*;[\s]*/im', $query, $matches) )
64          {
65            $query = $matches[1].' '.$install_charset_collate.';';
66          }
67        }
68        pwg_query($query);
69      }
70      $query = '';
71    }
72  }
73}
74
75set_magic_quotes_runtime(0); // Disable magic_quotes_runtime
76//
77// addslashes to vars if magic_quotes_gpc is off this is a security
78// precaution to prevent someone trying to break out of a SQL statement.
79//
80if( !get_magic_quotes_gpc() )
81{
82  if( is_array($_POST) )
83  {
84    while( list($k, $v) = each($_POST) )
85    {
86      if( is_array($_POST[$k]) )
87      {
88        while( list($k2, $v2) = each($_POST[$k]) )
89        {
90          $_POST[$k][$k2] = addslashes($v2);
91        }
92        @reset($_POST[$k]);
93      }
94      else
95      {
96        $_POST[$k] = addslashes($v);
97      }
98    }
99    @reset($_POST);
100  }
101
102  if( is_array($_GET) )
103  {
104    while( list($k, $v) = each($_GET) )
105    {
106      if( is_array($_GET[$k]) )
107      {
108        while( list($k2, $v2) = each($_GET[$k]) )
109        {
110          $_GET[$k][$k2] = addslashes($v2);
111        }
112        @reset($_GET[$k]);
113      }
114      else
115      {
116        $_GET[$k] = addslashes($v);
117      }
118    }
119    @reset($_GET);
120  }
121
122  if( is_array($_COOKIE) )
123  {
124    while( list($k, $v) = each($_COOKIE) )
125    {
126      if( is_array($_COOKIE[$k]) )
127      {
128        while( list($k2, $v2) = each($_COOKIE[$k]) )
129        {
130          $_COOKIE[$k][$k2] = addslashes($v2);
131        }
132        @reset($_COOKIE[$k]);
133      }
134      else
135      {
136        $_COOKIE[$k] = addslashes($v);
137      }
138    }
139    @reset($_COOKIE);
140  }
141}
142
143//----------------------------------------------------- variable initialization
144
145define('DEFAULT_PREFIX_TABLE', 'piwigo_');
146
147// Obtain various vars
148$dbhost = (!empty($_POST['dbhost'])) ? $_POST['dbhost'] : 'localhost';
149$dbuser = (!empty($_POST['dbuser'])) ? $_POST['dbuser'] : '';
150$dbpasswd = (!empty($_POST['dbpasswd'])) ? $_POST['dbpasswd'] : '';
151$dbname = (!empty($_POST['dbname'])) ? $_POST['dbname'] : '';
152
153if (isset($_POST['install']))
154{
155  $table_prefix = $_POST['prefix'];
156}
157else
158{
159  $table_prefix = DEFAULT_PREFIX_TABLE;
160}
161
162$admin_name = (!empty($_POST['admin_name'])) ? $_POST['admin_name'] : '';
163$admin_pass1 = (!empty($_POST['admin_pass1'])) ? $_POST['admin_pass1'] : '';
164$admin_pass2 = (!empty($_POST['admin_pass2'])) ? $_POST['admin_pass2'] : '';
165$admin_mail = (!empty($_POST['admin_mail'])) ? $_POST['admin_mail'] : '';
166
167$infos = array();
168$errors = array();
169
170// Open config.php ... if it exists
171$config_file = PHPWG_ROOT_PATH.'include/mysql.inc.php';
172if (@file_exists($config_file))
173{
174  include($config_file);
175  // Is Piwigo already installed ?
176  if (defined("PHPWG_INSTALLED"))
177  {
178    die('Piwigo is already installed');
179  }
180}
181
182$prefixeTable = $table_prefix;
183include(PHPWG_ROOT_PATH . 'include/config_default.inc.php');
184@include(PHPWG_ROOT_PATH. 'include/config_local.inc.php');
185include(PHPWG_ROOT_PATH . 'include/constants.php');
186include(PHPWG_ROOT_PATH . 'include/functions.inc.php');
187include(PHPWG_ROOT_PATH . 'admin/include/functions.php');
188include(PHPWG_ROOT_PATH . 'admin/include/functions_upgrade.php');
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 (get_languages('utf-8') 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 {
212  define('PHPWG_DOMAIN', 'piwigo.org');
213}
214define('PHPWG_URL', 'http://'.PHPWG_DOMAIN);
215
216load_language( 'common.lang', '', array('language'=>$language, 'target_charset'=>'utf-8') );
217load_language( 'admin.lang', '', array('language'=>$language, 'target_charset'=>'utf-8') );
218load_language( 'install.lang', '', array('language'=>$language, 'target_charset'=>'utf-8') );
219
220//------------------------------------------------- check php version
221if (version_compare(PHP_VERSION, REQUIRED_PHP_VERSION, '<'))
222{
223  include(PHPWG_ROOT_PATH.'install/php5_apache_configuration.php');
224}
225
226//----------------------------------------------------- template initialization
227include( PHPWG_ROOT_PATH .'include/template.class.php');
228$template=new Template(PHPWG_ROOT_PATH.'admin/template/goto', 'roma');
229$template->set_filenames( array('install'=>'install.tpl') );
230$step = 1;
231//---------------------------------------------------------------- form analyze
232if ( isset( $_POST['install'] ))
233{
234  if ( @mysql_connect( $_POST['dbhost'],
235                       $_POST['dbuser'],
236                       $_POST['dbpasswd'] ) )
237  {
238    if ( @mysql_select_db($_POST['dbname'] ) )
239    {
240      array_push( $infos, l10n('step1_confirmation') );
241    }
242    else
243    {
244      array_push( $errors, l10n('step1_err_db') );
245    }
246    if ( version_compare(mysql_get_server_info(), '4.1.0', '>=') )
247    {
248      $pwg_charset='utf-8';
249      $pwg_db_charset='utf8';
250      $install_charset_collate = "DEFAULT CHARACTER SET $pwg_db_charset";
251    }
252    else
253    {
254      $pwg_charset='iso-8859-1';
255      $pwg_db_charset='latin1';
256      $install_charset_collate = '';
257      if ( !array_key_exists($language, get_languages($pwg_charset) ) )
258      {
259        $language='en_UK';
260      }
261    }
262  }
263  else
264  {
265    array_push( $errors, l10n('step1_err_server') );
266  }
267
268  $webmaster = trim(preg_replace( '/\s{2,}/', ' ', $admin_name ));
269  if ( empty($webmaster))
270    array_push( $errors, l10n('step2_err_login1') );
271  else if ( preg_match( '/[\'"]/', $webmaster ) )
272    array_push( $errors, l10n('step2_err_login3') );
273  if ( $admin_pass1 != $admin_pass2 || empty($admin_pass1) )
274    array_push( $errors, l10n('step2_err_pass') );
275  if ( empty($admin_mail))
276    array_push( $errors, l10n('reg_err_mail_address') );
277  else
278  {
279    $error_mail_address = validate_mail_address(null, $admin_mail);
280    if (!empty($error_mail_address))
281      array_push( $errors, $error_mail_address );
282  }
283
284  if ( count( $errors ) == 0 )
285  {
286    $step = 2;
287    $file_content = '<?php
288$cfgBase = \''.$dbname.'\';
289$cfgUser = \''.$dbuser.'\';
290$cfgPassword = \''.$dbpasswd.'\';
291$cfgHote = \''.$dbhost.'\';
292
293$prefixeTable = \''.$table_prefix.'\';
294
295define(\'PHPWG_INSTALLED\', true);
296define(\'PWG_CHARSET\', \''.$pwg_charset.'\');
297define(\'DB_CHARSET\', \''.$pwg_db_charset.'\');
298define(\'DB_COLLATE\', \'\');
299
300?'.'>';
301
302    @umask(0111);
303    // writing the configuration file
304    if ( !($fp = @fopen( $config_file, 'w' )))
305    {
306      $html_content = htmlentities( $file_content, ENT_QUOTES );
307      $html_content = nl2br( $html_content );
308      $error_copy = l10n('step1_err_copy');
309      $error_copy .= '<br />--------------------------------------------------------------------<br />';
310      $error_copy .= '<span class="sql_content">' . $html_content . '</span>';
311      $error_copy .= '<br />--------------------------------------------------------------------<br />';
312    }
313    @fputs($fp, $file_content, strlen($file_content));
314    @fclose($fp);
315
316    // Create empty local files to avoid log errors
317    create_empty_local_files();
318
319    // tables creation, based on piwigo_structure.sql
320    execute_sqlfile(
321      PHPWG_ROOT_PATH.'install/piwigo_structure.sql',
322      DEFAULT_PREFIX_TABLE,
323      $table_prefix
324      );
325    // We fill the tables with basic informations
326    execute_sqlfile(
327      PHPWG_ROOT_PATH.'install/config.sql',
328      DEFAULT_PREFIX_TABLE,
329      $table_prefix
330      );
331
332    // fill $conf global array
333    load_conf_from_db();
334
335    $insert = array(
336      'id' => 1,
337      'galleries_url' => PHPWG_ROOT_PATH.'galleries/',
338      );
339    mass_inserts(SITES_TABLE, array_keys($insert), array($insert));
340
341    // webmaster admin user
342    $inserts = array(
343      array(
344        'id'           => 1,
345        'username'     => $admin_name,
346        'password'     => md5($admin_pass1),
347        'mail_address' => $admin_mail,
348        ),
349      array(
350        'id'           => 2,
351        'username'     => 'guest',
352        ),
353      );
354    mass_inserts(USERS_TABLE, array_keys($inserts[0]), $inserts);
355
356    create_user_infos(array(1,2), array('language' => $language));
357
358    // Available upgrades must be ignored after a fresh installation. To
359    // make PWG avoid upgrading, we must tell it upgrades have already been
360    // made.
361    list($dbnow) = mysql_fetch_row(pwg_query('SELECT NOW();'));
362    define('CURRENT_DATE', $dbnow);
363    $datas = array();
364    foreach (get_available_upgrade_ids() as $upgrade_id)
365    {
366      array_push(
367        $datas,
368        array(
369          'id'          => $upgrade_id,
370          'applied'     => CURRENT_DATE,
371          'description' => 'upgrade included in installation',
372          )
373        );
374    }
375    mass_inserts(
376      UPGRADE_TABLE,
377      array_keys($datas[0]),
378      $datas
379      );
380  }
381}
382
383//------------------------------------------------------ start template output
384foreach (get_languages('utf-8') as $language_code => $language_name)
385{
386  if ($language == $language_code)
387  {
388    $template->assign('language_selection', $language_code);
389  }
390  $languages_options[$language_code] = $language_name;
391}
392$template->assign('language_options', $languages_options);
393
394$template->assign(
395  array(
396    'T_CONTENT_ENCODING' => 'utf-8',
397    'RELEASE'=>PHPWG_VERSION,
398    'F_ACTION' => 'install.php?language=' . $language,
399    'F_DB_HOST'=>$dbhost,
400    'F_DB_USER'=>$dbuser,
401    'F_DB_NAME'=>$dbname,
402    'F_DB_PREFIX' => $table_prefix,
403    'F_ADMIN'=>$admin_name,
404    'F_ADMIN_EMAIL'=>$admin_mail,
405    'L_INSTALL_HELP'=>sprintf(l10n('install_help'), PHPWG_URL.'/forum'),
406    ));
407
408//------------------------------------------------------ errors & infos display
409if ($step == 1)
410{
411  $template->assign('install', true);
412}
413else
414{
415  array_push($infos, l10n('install_end_message'));
416
417  if (isset($error_copy))
418  {
419    array_push($errors, $error_copy);
420  }
421}
422if (count($errors) != 0)
423{
424  $template->assign('errors', $errors);
425}
426
427if (count($infos) != 0 )
428{
429  $template->assign('infos', $infos);
430}
431
432//----------------------------------------------------------- html code display
433$template->pparse('install');
434?>
Note: See TracBrowser for help on using the repository browser.