WordPress 3.8
[autoinstalls/wordpress.git] / wp-admin / setup-config.php
1 <?php
2 /**
3  * Retrieves and creates the wp-config.php file.
4  *
5  * The permissions for the base directory must allow for writing files in order
6  * for the wp-config.php to be created using this page.
7  *
8  * @internal This file must be parsable by PHP4.
9  *
10  * @package WordPress
11  * @subpackage Administration
12  */
13
14 /**
15  * We are installing.
16  *
17  * @package WordPress
18  */
19 define('WP_INSTALLING', true);
20
21 /**
22  * We are blissfully unaware of anything.
23  */
24 define('WP_SETUP_CONFIG', true);
25
26 /**
27  * Disable error reporting
28  *
29  * Set this to error_reporting( E_ALL ) or error_reporting( E_ALL | E_STRICT ) for debugging
30  */
31 error_reporting(0);
32
33 /**#@+
34  * These three defines are required to allow us to use require_wp_db() to load
35  * the database class while being wp-content/db.php aware.
36  * @ignore
37  */
38 define('ABSPATH', dirname(dirname(__FILE__)).'/');
39 define('WPINC', 'wp-includes');
40 define('WP_CONTENT_DIR', ABSPATH . 'wp-content');
41 define('WP_DEBUG', false);
42 /**#@-*/
43
44 require(ABSPATH . WPINC . '/load.php');
45 require(ABSPATH . WPINC . '/version.php');
46
47 // Check for the required PHP version and for the MySQL extension or a database drop-in.
48 wp_check_php_mysql_versions();
49
50 require_once(ABSPATH . WPINC . '/functions.php');
51
52 // Also loads plugin.php, l10n.php, pomo/mo.php (all required by setup-config.php)
53 wp_load_translations_early();
54
55 // Turn register_globals off.
56 wp_unregister_GLOBALS();
57
58 // Standardize $_SERVER variables across setups.
59 wp_fix_server_vars();
60
61 require_once(ABSPATH . WPINC . '/compat.php');
62 require_once(ABSPATH . WPINC . '/class-wp-error.php');
63 require_once(ABSPATH . WPINC . '/formatting.php');
64
65 // Add magic quotes and set up $_REQUEST ( $_GET + $_POST )
66 wp_magic_quotes();
67
68 // Support wp-config-sample.php one level up, for the develop repo.
69 if ( file_exists( ABSPATH . 'wp-config-sample.php' ) )
70         $config_file = file( ABSPATH . 'wp-config-sample.php' );
71 elseif ( file_exists( dirname( ABSPATH ) . '/wp-config-sample.php' ) )
72         $config_file = file( dirname( ABSPATH ) . '/wp-config-sample.php' );
73 else
74         wp_die( __( 'Sorry, I need a wp-config-sample.php file to work from. Please re-upload this file from your WordPress installation.' ) );
75
76 // Check if wp-config.php has been created
77 if ( file_exists( ABSPATH . 'wp-config.php' ) )
78         wp_die( '<p>' . sprintf( __( "The file 'wp-config.php' already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href='%s'>installing now</a>." ), 'install.php' ) . '</p>' );
79
80 // Check if wp-config.php exists above the root directory but is not part of another install
81 if ( file_exists(ABSPATH . '../wp-config.php' ) && ! file_exists( ABSPATH . '../wp-settings.php' ) )
82         wp_die( '<p>' . sprintf( __( "The file 'wp-config.php' already exists one level above your WordPress installation. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href='install.php'>installing now</a>."), 'install.php' ) . '</p>' );
83
84 $step = isset( $_GET['step'] ) ? (int) $_GET['step'] : 0;
85
86 /**
87  * Display setup wp-config.php file header.
88  *
89  * @ignore
90  * @since 2.3.0
91  * @package WordPress
92  * @subpackage Installer_WP_Config
93  */
94 function setup_config_display_header() {
95         global $wp_version;
96
97         header( 'Content-Type: text/html; charset=utf-8' );
98 ?>
99 <!DOCTYPE html>
100 <html xmlns="http://www.w3.org/1999/xhtml"<?php if ( is_rtl() ) echo ' dir="rtl"'; ?>>
101 <head>
102 <meta name="viewport" content="width=device-width" />
103 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
104 <title><?php _e( 'WordPress &rsaquo; Setup Configuration File' ); ?></title>
105 <link rel="stylesheet" href="css/install.css?ver=<?php echo preg_replace( '/[^0-9a-z\.-]/i', '', $wp_version ); ?>" type="text/css" />
106 <link rel="stylesheet" href="../wp-includes/css/buttons.css?ver=<?php echo preg_replace( '/[^0-9a-z\.-]/i', '', $wp_version ); ?>" type="text/css" />
107
108 </head>
109 <body class="wp-core-ui<?php if ( is_rtl() ) echo ' rtl'; ?>">
110 <h1 id="logo"><a href="<?php esc_attr_e( 'http://wordpress.org/' ); ?>"><?php _e( 'WordPress' ); ?></a></h1>
111 <?php
112 } // end function setup_config_display_header();
113
114 switch($step) {
115         case 0:
116                 setup_config_display_header();
117 ?>
118
119 <p><?php _e( 'Welcome to WordPress. Before getting started, we need some information on the database. You will need to know the following items before proceeding.' ) ?></p>
120 <ol>
121         <li><?php _e( 'Database name' ); ?></li>
122         <li><?php _e( 'Database username' ); ?></li>
123         <li><?php _e( 'Database password' ); ?></li>
124         <li><?php _e( 'Database host' ); ?></li>
125         <li><?php _e( 'Table prefix (if you want to run more than one WordPress in a single database)' ); ?></li>
126 </ol>
127 <p><strong><?php _e( "If for any reason this automatic file creation doesn&#8217;t work, don&#8217;t worry. All this does is fill in the database information to a configuration file. You may also simply open <code>wp-config-sample.php</code> in a text editor, fill in your information, and save it as <code>wp-config.php</code>." ); ?></strong></p>
128 <p><?php _e( "In all likelihood, these items were supplied to you by your Web Host. If you do not have this information, then you will need to contact them before you can continue. If you&#8217;re all ready&hellip;" ); ?></p>
129
130 <p class="step"><a href="setup-config.php?step=1<?php if ( isset( $_GET['noapi'] ) ) echo '&amp;noapi'; ?>" class="button button-large"><?php _e( 'Let&#8217;s go!' ); ?></a></p>
131 <?php
132         break;
133
134         case 1:
135                 setup_config_display_header();
136         ?>
137 <form method="post" action="setup-config.php?step=2">
138         <p><?php _e( "Below you should enter your database connection details. If you&#8217;re not sure about these, contact your host." ); ?></p>
139         <table class="form-table">
140                 <tr>
141                         <th scope="row"><label for="dbname"><?php _e( 'Database Name' ); ?></label></th>
142                         <td><input name="dbname" id="dbname" type="text" size="25" value="wordpress" /></td>
143                         <td><?php _e( 'The name of the database you want to run WP in.' ); ?></td>
144                 </tr>
145                 <tr>
146                         <th scope="row"><label for="uname"><?php _e( 'User Name' ); ?></label></th>
147                         <td><input name="uname" id="uname" type="text" size="25" value="<?php echo htmlspecialchars( _x( 'username', 'example username' ), ENT_QUOTES ); ?>" /></td>
148                         <td><?php _e( 'Your MySQL username' ); ?></td>
149                 </tr>
150                 <tr>
151                         <th scope="row"><label for="pwd"><?php _e( 'Password' ); ?></label></th>
152                         <td><input name="pwd" id="pwd" type="text" size="25" value="<?php echo htmlspecialchars( _x( 'password', 'example password' ), ENT_QUOTES ); ?>" /></td>
153                         <td><?php _e( '&hellip;and your MySQL password.' ); ?></td>
154                 </tr>
155                 <tr>
156                         <th scope="row"><label for="dbhost"><?php _e( 'Database Host' ); ?></label></th>
157                         <td><input name="dbhost" id="dbhost" type="text" size="25" value="localhost" /></td>
158                         <td><?php _e( 'You should be able to get this info from your web host, if <code>localhost</code> does not work.' ); ?></td>
159                 </tr>
160                 <tr>
161                         <th scope="row"><label for="prefix"><?php _e( 'Table Prefix' ); ?></label></th>
162                         <td><input name="prefix" id="prefix" type="text" value="wp_" size="25" /></td>
163                         <td><?php _e( 'If you want to run multiple WordPress installations in a single database, change this.' ); ?></td>
164                 </tr>
165         </table>
166         <?php if ( isset( $_GET['noapi'] ) ) { ?><input name="noapi" type="hidden" value="1" /><?php } ?>
167         <p class="step"><input name="submit" type="submit" value="<?php echo htmlspecialchars( __( 'Submit' ), ENT_QUOTES ); ?>" class="button button-large" /></p>
168 </form>
169 <?php
170         break;
171
172         case 2:
173         foreach ( array( 'dbname', 'uname', 'pwd', 'dbhost', 'prefix' ) as $key )
174                 $$key = trim( wp_unslash( $_POST[ $key ] ) );
175
176         $tryagain_link = '</p><p class="step"><a href="setup-config.php?step=1" onclick="javascript:history.go(-1);return false;" class="button button-large">' . __( 'Try again' ) . '</a>';
177
178         if ( empty( $prefix ) )
179                 wp_die( __( '<strong>ERROR</strong>: "Table Prefix" must not be empty.' . $tryagain_link ) );
180
181         // Validate $prefix: it can only contain letters, numbers and underscores.
182         if ( preg_match( '|[^a-z0-9_]|i', $prefix ) )
183                 wp_die( __( '<strong>ERROR</strong>: "Table Prefix" can only contain numbers, letters, and underscores.' . $tryagain_link ) );
184
185         // Test the db connection.
186         /**#@+
187          * @ignore
188          */
189         define('DB_NAME', $dbname);
190         define('DB_USER', $uname);
191         define('DB_PASSWORD', $pwd);
192         define('DB_HOST', $dbhost);
193         /**#@-*/
194
195         // We'll fail here if the values are no good.
196         require_wp_db();
197         if ( ! empty( $wpdb->error ) )
198                 wp_die( $wpdb->error->get_error_message() . $tryagain_link );
199
200         // Fetch or generate keys and salts.
201         $no_api = isset( $_POST['noapi'] );
202         if ( ! $no_api ) {
203                 require_once( ABSPATH . WPINC . '/class-http.php' );
204                 require_once( ABSPATH . WPINC . '/http.php' );
205                 /**#@+
206                  * @ignore
207                  */
208                 function get_bloginfo() {
209                         return wp_guess_url();
210                 }
211                 /**#@-*/
212                 $secret_keys = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' );
213         }
214
215         if ( $no_api || is_wp_error( $secret_keys ) ) {
216                 $secret_keys = array();
217                 require_once( ABSPATH . WPINC . '/pluggable.php' );
218                 for ( $i = 0; $i < 8; $i++ ) {
219                         $secret_keys[] = wp_generate_password( 64, true, true );
220                 }
221         } else {
222                 $secret_keys = explode( "\n", wp_remote_retrieve_body( $secret_keys ) );
223                 foreach ( $secret_keys as $k => $v ) {
224                         $secret_keys[$k] = substr( $v, 28, 64 );
225                 }
226         }
227
228         $key = 0;
229         // Not a PHP5-style by-reference foreach, as this file must be parseable by PHP4.
230         foreach ( $config_file as $line_num => $line ) {
231                 if ( '$table_prefix  =' == substr( $line, 0, 16 ) ) {
232                         $config_file[ $line_num ] = '$table_prefix  = \'' . addcslashes( $prefix, "\\'" ) . "';\r\n";
233                         continue;
234                 }
235
236                 if ( ! preg_match( '/^define\(\'([A-Z_]+)\',([ ]+)/', $line, $match ) )
237                         continue;
238
239                 $constant = $match[1];
240                 $padding  = $match[2];
241
242                 switch ( $constant ) {
243                         case 'DB_NAME'     :
244                         case 'DB_USER'     :
245                         case 'DB_PASSWORD' :
246                         case 'DB_HOST'     :
247                                 $config_file[ $line_num ] = "define('" . $constant . "'," . $padding . "'" . addcslashes( constant( $constant ), "\\'" ) . "');\r\n";
248                                 break;
249                         case 'AUTH_KEY'         :
250                         case 'SECURE_AUTH_KEY'  :
251                         case 'LOGGED_IN_KEY'    :
252                         case 'NONCE_KEY'        :
253                         case 'AUTH_SALT'        :
254                         case 'SECURE_AUTH_SALT' :
255                         case 'LOGGED_IN_SALT'   :
256                         case 'NONCE_SALT'       :
257                                 $config_file[ $line_num ] = "define('" . $constant . "'," . $padding . "'" . $secret_keys[$key++] . "');\r\n";
258                                 break;
259                 }
260         }
261         unset( $line );
262
263         if ( ! is_writable(ABSPATH) ) :
264                 setup_config_display_header();
265 ?>
266 <p><?php _e( "Sorry, but I can&#8217;t write the <code>wp-config.php</code> file." ); ?></p>
267 <p><?php _e( 'You can create the <code>wp-config.php</code> manually and paste the following text into it.' ); ?></p>
268 <textarea id="wp-config" cols="98" rows="15" class="code" readonly="readonly"><?php
269                 foreach( $config_file as $line ) {
270                         echo htmlentities($line, ENT_COMPAT, 'UTF-8');
271                 }
272 ?></textarea>
273 <p><?php _e( 'After you&#8217;ve done that, click &#8220;Run the install.&#8221;' ); ?></p>
274 <p class="step"><a href="install.php" class="button button-large"><?php _e( 'Run the install' ); ?></a></p>
275 <script>
276 (function(){
277 var el=document.getElementById('wp-config');
278 el.focus();
279 el.select();
280 })();
281 </script>
282 <?php
283         else :
284                 // If this file doesn't exist, then we are using the wp-config-sample.php
285                 // file one level up, which is for the develop repo.
286                 if ( file_exists( ABSPATH . 'wp-config-sample.php' ) )
287                         $path_to_wp_config = ABSPATH . 'wp-config.php';
288                 else
289                         $path_to_wp_config = dirname( ABSPATH ) . '/wp-config.php';
290
291                 $handle = fopen( $path_to_wp_config, 'w' );
292                 foreach( $config_file as $line ) {
293                         fwrite( $handle, $line );
294                 }
295                 fclose( $handle );
296                 chmod( $path_to_wp_config, 0666 );
297                 setup_config_display_header();
298 ?>
299 <p><?php _e( "All right, sparky! You&#8217;ve made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to&hellip;" ); ?></p>
300
301 <p class="step"><a href="install.php" class="button button-large"><?php _e( 'Run the install' ); ?></a></p>
302 <?php
303         endif;
304         break;
305 }
306 ?>
307 </body>
308 </html>