source: trunk/install.php @ 2302

Last change on this file since 2302 was 2299, checked in by plg, 16 years ago

Bug fixed: as rvelices notified me by email, my header replacement script was
bugged (r2297 was repeating new and old header).

By the way, I've also removed the replacement keywords. We were using them
because it was a common usage with CVS but it is advised not to use them with
Subversion. Personnaly, it is a problem when I search differences between 2
Piwigo installations outside Subversion.

  • Property svn:eol-style set to LF
  • Property svn:keywords set to Author Date Id Revision
File size: 11.8 KB
Line 
1<?php
2// +-----------------------------------------------------------------------+
3// | Piwigo - a PHP based picture gallery                                  |
4// +-----------------------------------------------------------------------+
5// | Copyright(C) 2008      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        mysql_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', 'phpwebgallery_');
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 PhpWebGallery already installed ?
176  if (defined("PHPWG_INSTALLED"))
177  {
178    die('PhpWebGallery 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');
189include(PHPWG_ROOT_PATH . 'include/template.class.php');
190
191if (isset($_GET['language']))
192{
193  $language = strip_tags($_GET['language']);
194}
195else
196{
197  $language = 'en_UK';
198  // Try to get browser language
199  foreach (get_languages('utf-8') as $language_code => $language_name)
200  {
201    if (substr($language_code,0,2) == @substr($_SERVER["HTTP_ACCEPT_LANGUAGE"],0,2))
202    {
203      $language = $language_code;
204      break;
205    }
206  }
207}
208
209load_language( 'common.lang', '', $language, false, 'utf-8' );
210load_language( 'admin.lang', '', $language, false, 'utf-8' );
211load_language( 'install.lang', '', $language, false, 'utf-8' );
212
213//----------------------------------------------------- template initialization
214$template=new Template(PHPWG_ROOT_PATH.'template/yoga', 'clear');
215$template->set_filenames( array('install'=>'install.tpl') );
216$step = 1;
217//---------------------------------------------------------------- form analyze
218if ( isset( $_POST['install'] ))
219{
220  if ( @mysql_connect( $_POST['dbhost'],
221                       $_POST['dbuser'],
222                       $_POST['dbpasswd'] ) )
223  {
224    if ( @mysql_select_db($_POST['dbname'] ) )
225    {
226      array_push( $infos, l10n('step1_confirmation') );
227    }
228    else
229    {
230      array_push( $errors, l10n('step1_err_db') );
231    }
232    if ( version_compare(mysql_get_server_info(), '4.1.0', '>=') )
233    {
234      $pwg_charset='utf-8';
235      $pwg_db_charset='utf8';
236      $install_charset_collate = "DEFAULT CHARACTER SET $pwg_db_charset";
237    }
238    else
239    {
240      $pwg_charset='iso-8859-1';
241      $pwg_db_charset='latin1';
242      $install_charset_collate = '';
243      if ( !array_key_exists($language, get_languages($pwg_charset) ) )
244      {
245        $language='en_UK';
246      }
247    }
248  }
249  else
250  {
251    array_push( $errors, l10n('step1_err_server') );
252  }
253
254  $webmaster = trim(preg_replace( '/\s{2,}/', ' ', $admin_name ));
255  if ( empty($webmaster))
256    array_push( $errors, l10n('step2_err_login1') );
257  else if ( preg_match( '/[\'"]/', $webmaster ) )
258    array_push( $errors, l10n('step2_err_login3') );
259  if ( $admin_pass1 != $admin_pass2 || empty($admin_pass1) )
260    array_push( $errors, l10n('step2_err_pass') );
261  if ( empty($admin_mail))
262    array_push( $errors, l10n('reg_err_mail_address') );
263  else
264  {
265    $error_mail_address = validate_mail_address(null, $admin_mail);
266    if (!empty($error_mail_address))
267      array_push( $errors, $error_mail_address );
268  }
269
270  if ( count( $errors ) == 0 )
271  {
272    $step = 2;
273    $file_content = '<?php
274$cfgBase = \''.$dbname.'\';
275$cfgUser = \''.$dbuser.'\';
276$cfgPassword = \''.$dbpasswd.'\';
277$cfgHote = \''.$dbhost.'\';
278
279$prefixeTable = \''.$table_prefix.'\';
280
281define(\'PHPWG_INSTALLED\', true);
282define(\'PWG_CHARSET\', \''.$pwg_charset.'\');
283define(\'DB_CHARSET\', \''.$pwg_db_charset.'\');
284define(\'DB_COLLATE\', \'\');
285
286?'.'>';
287
288    @umask(0111);
289    // writing the configuration file
290    if ( !($fp = @fopen( $config_file, 'w' )))
291    {
292      $html_content = htmlentities( $file_content, ENT_QUOTES );
293      $html_content = nl2br( $html_content );
294      $template->assign('error_copy', $html_content);
295    }
296    @fputs($fp, $file_content, strlen($file_content));
297    @fclose($fp);
298
299    // Create empty local files to avoid log errors
300    create_empty_local_files();
301
302    // tables creation, based on phpwebgallery_structure.sql
303    execute_sqlfile(
304      PHPWG_ROOT_PATH.'install/phpwebgallery_structure.sql',
305      DEFAULT_PREFIX_TABLE,
306      $table_prefix
307      );
308    // We fill the tables with basic informations
309    execute_sqlfile(
310      PHPWG_ROOT_PATH.'install/config.sql',
311      DEFAULT_PREFIX_TABLE,
312      $table_prefix
313      );
314
315    // fill $conf global array
316    load_conf_from_db();
317
318    $insert = array(
319      'id' => 1,
320      'galleries_url' => PHPWG_ROOT_PATH.'galleries/',
321      );
322    mass_inserts(SITES_TABLE, array_keys($insert), array($insert));
323
324    // webmaster admin user
325    $inserts = array(
326      array(
327        'id'           => 1,
328        'username'     => $admin_name,
329        'password'     => md5($admin_pass1),
330        'mail_address' => $admin_mail,
331        ),
332      array(
333        'id'           => 2,
334        'username'     => 'guest',
335        ),
336      );
337    mass_inserts(USERS_TABLE, array_keys($inserts[0]), $inserts);
338
339    create_user_infos(array(1,2), array('language' => $language));
340
341    // Available upgrades must be ignored after a fresh installation. To
342    // make PWG avoid upgrading, we must tell it upgrades have already been
343    // made.
344    list($dbnow) = mysql_fetch_row(pwg_query('SELECT NOW();'));
345    define('CURRENT_DATE', $dbnow);
346    $datas = array();
347    foreach (get_available_upgrade_ids() as $upgrade_id)
348    {
349      array_push(
350        $datas,
351        array(
352          'id'          => $upgrade_id,
353          'applied'     => CURRENT_DATE,
354          'description' => 'upgrade included in installation',
355          )
356        );
357    }
358    mass_inserts(
359      UPGRADE_TABLE,
360      array_keys($datas[0]),
361      $datas
362      );
363  }
364}
365
366//------------------------------------------------------ start template output
367foreach (get_languages('utf-8') as $language_code => $language_name)
368{
369  if ($language == $language_code)
370  {
371    $template->assign('language_selection', $language_code);
372  }
373  $languages_options[$language_code] = $language_name;
374}
375$template->assign('language_options', $languages_options);
376
377$template->assign(
378  array(
379    'T_CONTENT_ENCODING' => 'utf-8',
380    'RELEASE'=>PHPWG_VERSION,
381    'F_ACTION' => 'install.php?language=' . $language,
382    'F_DB_HOST'=>$dbhost,
383    'F_DB_USER'=>$dbuser,
384    'F_DB_NAME'=>$dbname,
385    'F_DB_PREFIX' => $table_prefix,
386    'F_ADMIN'=>$admin_name,
387    'F_ADMIN_EMAIL'=>$admin_mail,
388    'L_INSTALL_HELP'=>sprintf(l10n('install_help'), 'http://forum.'.PHPWG_DOMAIN.'/'),
389    ));
390
391//------------------------------------------------------ errors & infos display
392if (count($errors) != 0)
393{
394  $template->assign('errors', $errors);
395}
396
397if (count($infos) != 0 )
398{
399  $template->assign('infos', $infos);
400}
401
402if ($step == 1)
403{
404  $template->assign('install', true);
405}
406
407//----------------------------------------------------------- html code display
408$template->pparse('install');
409?>
Note: See TracBrowser for help on using the repository browser.