<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><style type="text/css"><!--
#msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; }
#msg ul, pre { overflow: auto; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<title>[13655] trunk/wp-admin: First pass at error handling for populate_network()
  and network.php.</title>
</head>
<body>

<div id="msg">
<dl>
<dt>Revision</dt> <dd><a href="http://trac.wordpress.org/changeset/13655">13655</a></dd>
<dt>Author</dt> <dd>nacin</dd>
<dt>Date</dt> <dd>2010-03-11 01:51:24 +0000 (Thu, 11 Mar 2010)</dd>
</dl>

<h3>Log Message</h3>
<pre>First pass at error handling for populate_network() and network.php. see <a href="http://trac.wordpress.org/ticket/11816">#11816</a></pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkwpadminincludesschemaphp">trunk/wp-admin/includes/schema.php</a></li>
<li><a href="#trunkwpadminnetworkphp">trunk/wp-admin/network.php</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkwpadminincludesschemaphp"></a>
<div class="modfile"><h4>Modified: trunk/wp-admin/includes/schema.php (13654 => 13655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/includes/schema.php        2010-03-10 23:38:05 UTC (rev 13654)
+++ trunk/wp-admin/includes/schema.php        2010-03-11 01:51:24 UTC (rev 13655)
</span><span class="lines">@@ -619,25 +619,29 @@
</span><span class="cx">  * @since 3.0
</span><span class="cx">  *
</span><span class="cx">  * @param int $network_id id of network to populate
</span><ins>+ * @return bool|WP_Error True on success, or WP_Error on warning (with the install otherwise successful,
+ *         so the error code must be checked) or failure.
</ins><span class="cx">  */
</span><span class="cx"> function populate_network( $network_id = 1, $domain = '', $email = '', $site_name = '', $path = '/', $subdomain_install = false ) {
</span><span class="cx">         global $wpdb, $current_site, $wp_db_version, $wp_rewrite;
</span><span class="cx"> 
</span><del>-        $msg = '';
-        //@todo: turn these checks into returned messages
-        if ( $domain == '' )
-                die( 'You must provide a domain name!' );
-        if ( $site_name == '' )
-                die( 'You must provide a site name!' );
</del><ins>+        $errors = new WP_Error();
+        if ( '' == $domain )
+                $errors-&gt;add( 'empty_domain', __( 'You must provide a domain name.' ) );
+        if ( '' == $site_name )
+                $errors-&gt;add( 'empty_sitename', __( 'You must provide a name for your network of sites.' ) );
</ins><span class="cx"> 
</span><span class="cx">         // check for network collision
</span><del>-        $existing_network = $wpdb-&gt;get_var( $wpdb-&gt;prepare( &quot;SELECT id FROM $wpdb-&gt;site WHERE id = %d&quot;, $network_id ) );
-        if ( $existing_network == $network_id )
-                die( 'That network already exists!' );
</del><ins>+        if ( $network_id == $wpdb-&gt;get_var( $wpdb-&gt;prepare( &quot;SELECT id FROM $wpdb-&gt;site WHERE id = %d&quot;, $network_id ) ) )
+                $errors-&gt;add( 'siteid_exists', __( 'The network already exists.' ) );
</ins><span class="cx"> 
</span><span class="cx">         $site_user = get_user_by_email( $email );
</span><del>-        if ( !$site_user )
-                die( 'You must provide an email address!' );
</del><ins>+        if ( ! is_email( $email ) )
+                $errors-&gt;add( 'invalid_email', __( 'You must provide a valid e-mail address.' ) );
+
+        if ( $errors-&gt;get_error_code() )
+                return $errors;
+
</ins><span class="cx">         // set up site tables
</span><span class="cx">         $template = get_option( 'template' );
</span><span class="cx">         $stylesheet = get_option( 'stylesheet' );
</span><span class="lines">@@ -742,26 +746,27 @@
</span><span class="cx"> 
</span><span class="cx">         if ( $subdomain_install ) {
</span><span class="cx">                 $vhost_ok = false;
</span><ins>+                $errstr = '';
</ins><span class="cx">                 $hostname = substr( md5( time() ), 0, 6 ) . '.' . $domain; // Very random hostname!
</span><span class="cx">                 $page = wp_remote_get( 'http://' . $hostname, array( 'timeout' =&gt; 5, 'httpversion' =&gt; '1.1' ) );
</span><del>-                if ( is_wp_error( $page ) ) {
-                        foreach ( $page-&gt;get_error_messages() as $err ) {
-                                $errstr = $err;
-                        }
-                } elseif( $page[ 'response' ][ 'code' ] == 200 ) {
</del><ins>+                if ( is_wp_error( $page ) )
+                        $errstr = $page-&gt;get_error_message();
+                elseif ( 200 == $page['response']['code'] )
</ins><span class="cx">                                 $vhost_ok = true;
</span><del>-                }
</del><ins>+
</ins><span class="cx">                 if ( ! $vhost_ok ) {
</span><del>-                        // @todo Update this to reflect the merge. Also: Multisite readme file, or remove the &lt;blockquote&gt; tags.
-                        $msg = '&lt;h2&gt;' . esc_html__( 'Warning! Wildcard DNS may not be configured correctly!' ) . '&lt;/h2&gt;';
-                        $msg .= '&lt;p&gt;' . __( 'To use the subdomain feature of WordPress MU you must have a wildcard entry in your dns. The installer attempted to contact a random hostname ($hostname) on your domain but failed. It returned this error message:' ) . '&lt;br /&gt;';
-                        $msg .= '&lt;br/&gt;&lt;strong&gt;' . $errstr . '&lt;/strong&gt;&lt;/p&gt;';
-                        $msg .= '&lt;p&gt;' . __( 'From the README.txt:' ) . '&lt;/p&gt;';
-                        $msg .= '&lt;blockquote&gt;&lt;p&gt;' . __( &quot;If you want to host blogs of the form http://blog.domain.tld/ where domain.tld is the domain name of your machine then you must add a wildcard record to your DNS records. This usually means adding a '*' hostname record pointing at your webserver in your DNS configuration tool.  Matt has a more detailed &lt;a href='http://ma.tt/2003/10/10/wildcard-dns-and-sub-domains/'&gt;explanation&lt;/a&gt; on his blog. If you still have problems, these &lt;a href='http://mu.wordpress.org/forums/tags/wildcard'&gt;forum messages&lt;/a&gt; may help.&quot; ) . '&lt;/p&gt;&lt;/blockquote&gt;';
-                        $msg .= '&lt;p&gt;' . __( 'You can still use your site but any subdomain you create may not be accessible. This check is not foolproof so ignore if you know your dns is correct.' ) . '&lt;/p&gt;';
</del><ins>+                        $msg = '&lt;p&gt;&lt;strong&gt;' . __( 'Warning! Wildcard DNS may not be configured correctly!' ) . '&lt;/strong&gt;&lt;/p&gt;';
+                        $msg .= '&lt;p&gt;' . sprintf( __( 'To use a subdomain configuration, you must have a wildcard entry in your DNS. The installer attempted to contact a random hostname (&lt;code&gt;%1$s&lt;/code&gt;) on your domain.' ), $hostname );
+                        if ( ! empty ( $errstr ) )
+                                $msg .= ' ' . sprintf( __( 'This resulted in an error message: %s' ), $errstr );
+                        $msg .= '&lt;/p&gt;';
+                        $msg .= '&lt;p&gt;' . __( 'If you want to host sites in the form of &lt;code&gt;http://site1.example.com&lt;/code&gt; then you must add a wildcard record to your DNS records. This usually means adding a &lt;code&gt;*&lt;/code&gt; hostname record pointing at your web server in your DNS configuration tool.' ) . '&lt;/p&gt;';
+                        $msg .= '&lt;p&gt;' . __( 'You can still use your site but any subdomain you create may not be accessible. If you know your DNS is correct, ignore this message.' ) . '&lt;/p&gt;';
+                        return new WP_Error( 'no_wildcard_dns', $msg );
</ins><span class="cx">                 }
</span><span class="cx">         }
</span><del>-        return $msg;
</del><ins>+
+        return true;
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> ?&gt;
</span></span></pre></div>
<a id="trunkwpadminnetworkphp"></a>
<div class="modfile"><h4>Modified: trunk/wp-admin/network.php (13654 => 13655)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/wp-admin/network.php        2010-03-10 23:38:05 UTC (rev 13654)
+++ trunk/wp-admin/network.php        2010-03-11 01:51:24 UTC (rev 13655)
</span><span class="lines">@@ -62,7 +62,7 @@
</span><span class="cx"> &lt;?php screen_icon(); ?&gt;
</span><span class="cx"> &lt;h2&gt;&lt;?php echo esc_html( $title ); ?&gt;&lt;/h2&gt;
</span><span class="cx"> 
</span><del>-&lt;form method=&quot;post&quot; action=&quot;network.php&quot;&gt;
</del><ins>+&lt;form method=&quot;post&quot;&gt;
</ins><span class="cx"> &lt;?php
</span><span class="cx"> /**
</span><span class="cx">  * Prints step 1 for Network installation process.
</span><span class="lines">@@ -72,7 +72,7 @@
</span><span class="cx">  *
</span><span class="cx">  * @since 3.0.0
</span><span class="cx">  */
</span><del>-function network_step1() {
</del><ins>+function network_step1( $errors = false ) {
</ins><span class="cx"> 
</span><span class="cx">         $active_plugins = get_option( 'active_plugins' );
</span><span class="cx">         if ( ! empty( $active_plugins ) ) {
</span><span class="lines">@@ -95,16 +95,31 @@
</span><span class="cx">                 die();
</span><span class="cx">         }
</span><span class="cx"> 
</span><ins>+        wp_nonce_field( 'install-network-1' );
+
+        $error_codes = array();
+        if ( is_wp_error( $errors ) ) {
+                echo '&lt;div class=&quot;error&quot;&gt;&lt;p&gt;&lt;strong&gt;' . __( 'ERROR: The network could not be created.' ) . '&lt;/strong&gt;&lt;/p&gt;';
+                foreach ( $errors-&gt;get_error_messages() as $error )
+                        echo &quot;&lt;p&gt;$error&lt;/p&gt;&quot;;
+                echo '&lt;/div&gt;';
+                $error_codes = $errors-&gt;get_error_codes();
+        }
+
+        $site_name = ( ! empty( $_POST['sitename'] ) &amp;&amp; ! in_array( 'empty_sitename', $error_codes ) ) ? $_POST['sitename'] : sprintf( _x('%s Sites', 'Default network name' ), get_option( 'blogname' ) );
+        $admin_email = ( ! empty( $_POST['email'] ) &amp;&amp; ! in_array( 'invalid_email', $error_codes ) ) ? $_POST['email'] : get_option( 'admin_email' );
</ins><span class="cx">         ?&gt;
</span><span class="cx">         &lt;p&gt;&lt;?php _e( 'Welcome to the Network installation process!' ); ?&gt;&lt;/p&gt;
</span><span class="cx">         &lt;p&gt;&lt;?php _e( &quot;Fill in the information below and you'll be on your way to creating a network of WordPress sites. We'll create configuration files in the next step.&quot; ); ?&gt;&lt;/p&gt;
</span><span class="cx">         &lt;?php
</span><span class="cx"> 
</span><span class="cx">         // @todo IIS...
</span><del>-        if ( apache_mod_loaded('mod_rewrite') ) { // assume nothing
-                $rewrite_enabled = true;
</del><ins>+        if ( ! empty( $_POST['subdomain_install'] ) ) {
+                $subdomain_install = (bool) $_POST['subdomain_install'];
+        } elseif ( apache_mod_loaded('mod_rewrite') ) { // assume nothing
+                $subdomain_install = true;
</ins><span class="cx">         } else {
</span><del>-                $rewrite_enabled = false;
</del><ins>+                $subdomain_install = false;
</ins><span class="cx">                 if ( got_mod_rewrite() ) // dangerous assumptions
</span><span class="cx">                         echo '&lt;p&gt;' . __( 'Please make sure the Apache &lt;code&gt;mod_rewrite&lt;/code&gt; module is installed as it will be used at the end of this install.' ) . '&lt;/p&gt;';
</span><span class="cx">                 else
</span><span class="lines">@@ -112,23 +127,21 @@
</span><span class="cx">                 echo '&lt;p&gt;' . __( 'If &lt;code&gt;mod_rewrite&lt;/code&gt; is disabled ask your administrator to enable that module, or look at the &lt;a href=&quot;http://httpd.apache.org/docs/mod/mod_rewrite.html&quot;&gt;Apache documentation&lt;/a&gt; or &lt;a href=&quot;http://www.google.com/search?q=apache+mod_rewrite&quot;&gt;elsewhere&lt;/a&gt; for help setting it up.' ) . '&lt;/p&gt;';
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        wp_nonce_field( 'install-network-1' );
-
</del><span class="cx">         if ( 'localhost' != $hostname ) : ?&gt;
</span><span class="cx">                 &lt;h3&gt;&lt;?php esc_html_e( 'Addresses of Sites in your Network' ); ?&gt;&lt;/h3&gt;
</span><span class="cx">                 &lt;p&gt;&lt;?php _e( 'Please choose whether you would like sites in your WordPress network to use sub-domains or sub-directories. &lt;strong&gt;You cannot change this later.&lt;/strong&gt;' ); ?&gt;&lt;/p&gt;
</span><span class="cx">                 &lt;p&gt;&lt;?php _e( &quot;You will need a wildcard DNS record if you're going to use the virtual host (sub-domain) functionality.&quot; ); ?&gt;&lt;/p&gt;
</span><span class="cx">                 &lt;?php /* @todo: Link to an MS readme? */ ?&gt;
</span><del>-                &lt;?php if ( ! $rewrite_enabled ) { ?&gt;
</del><ins>+                &lt;?php if ( ! $subdomain_install ) { ?&gt;
</ins><span class="cx">                 &lt;p&gt;&lt;?php _e( '&lt;strong&gt;Note&lt;/strong&gt; It looks like &lt;code&gt;mod_rewrite&lt;/code&gt; is not installed.' ); ?&gt;&lt;/p&gt;
</span><span class="cx">                 &lt;?php } ?&gt;
</span><span class="cx">                 &lt;table class=&quot;form-table&quot;&gt;
</span><span class="cx">                         &lt;tr&gt;
</span><del>-                                &lt;th&gt;&lt;label&gt;&lt;input type='radio' name='subdomain_install' value='1'&lt;?php checked( $rewrite_enabled ); ?&gt; /&gt; Sub-domains&lt;/label&gt;&lt;/th&gt;
</del><ins>+                                &lt;th&gt;&lt;label&gt;&lt;input type='radio' name='subdomain_install' value='1'&lt;?php checked( $subdomain_install ); ?&gt; /&gt; Sub-domains&lt;/label&gt;&lt;/th&gt;
</ins><span class="cx">                                 &lt;td&gt;&lt;?php _e('like &lt;code&gt;site1.example.com&lt;/code&gt; and &lt;code&gt;site2.example.com&lt;/code&gt;'); ?&gt;&lt;/td&gt;
</span><span class="cx">                         &lt;/tr&gt;
</span><span class="cx">                         &lt;tr&gt;
</span><del>-                                &lt;th&gt;&lt;label&gt;&lt;input type='radio' name='subdomain_install' value='0'&lt;?php checked( ! $rewrite_enabled ); ?&gt; /&gt; Sub-directories&lt;/label&gt;&lt;/th&gt;
</del><ins>+                                &lt;th&gt;&lt;label&gt;&lt;input type='radio' name='subdomain_install' value='0'&lt;?php checked( ! $subdomain_install ); ?&gt; /&gt; Sub-directories&lt;/label&gt;&lt;/th&gt;
</ins><span class="cx">                                 &lt;td&gt;&lt;?php _e('like &lt;code&gt;example.com/site1&lt;/code&gt; and &lt;code&gt;example.com/site2&lt;/code&gt;'); ?&gt;&lt;/td&gt;
</span><span class="cx">                         &lt;/tr&gt;
</span><span class="cx">                 &lt;/table&gt;
</span><span class="lines">@@ -136,7 +149,7 @@
</span><span class="cx"> &lt;?php
</span><span class="cx">         endif;
</span><span class="cx"> 
</span><del>-                $is_www = ( substr( $hostname, 0, 4 ) == 'www.' );
</del><ins>+                $is_www = ( 0 === strpos( $hostname, 'www.' ) );
</ins><span class="cx">                 if ( $is_www ) :
</span><span class="cx">                 ?&gt;
</span><span class="cx">                 &lt;h3&gt;&lt;?php esc_html_e( 'Server Address' ); ?&gt;&lt;/h3&gt;
</span><span class="lines">@@ -146,7 +159,6 @@
</span><span class="cx">                                 &lt;th scope='row'&gt;&lt;?php esc_html_e( 'Server Address' ); ?&gt;&lt;/th&gt;
</span><span class="cx">                                 &lt;td&gt;
</span><span class="cx">                                         &lt;?php printf( __( 'The Internet address of your network will be &lt;code&gt;%s&lt;/code&gt;.' ), $hostname ); ?&gt;
</span><del>-                                        &lt;input type='hidden' name='basedomain' value='&lt;?php echo esc_attr( $hostname ); ?&gt;' /&gt;
</del><span class="cx">                                 &lt;/td&gt;
</span><span class="cx">                         &lt;/tr&gt;
</span><span class="cx">                 &lt;/table&gt;
</span><span class="lines">@@ -171,14 +183,14 @@
</span><span class="cx">                         &lt;tr&gt;
</span><span class="cx">                                 &lt;th scope='row'&gt;&lt;?php esc_html_e( 'Network Title' ); ?&gt;&lt;/th&gt;
</span><span class="cx">                                 &lt;td&gt;
</span><del>-                                        &lt;input name='weblog_title' type='text' size='45' value='&lt;?php echo esc_attr( sprintf( __('%s Sites'), get_option( 'blogname' ) ) ); ?&gt;' /&gt;
</del><ins>+                                        &lt;input name='sitename' type='text' size='45' value='&lt;?php echo esc_attr( $site_name ); ?&gt;' /&gt;
</ins><span class="cx">                                         &lt;br /&gt;&lt;?php _e( 'What would you like to call your network?' ); ?&gt;
</span><span class="cx">                                 &lt;/td&gt;
</span><span class="cx">                         &lt;/tr&gt;
</span><span class="cx">                         &lt;tr&gt;
</span><span class="cx">                                 &lt;th scope='row'&gt;&lt;?php esc_html_e( 'Admin E-mail Address' ); ?&gt;&lt;/th&gt;
</span><span class="cx">                                 &lt;td&gt;
</span><del>-                                        &lt;input name='email' type='text' size='45' value='&lt;?php echo esc_attr( get_option( 'admin_email' ) ); ?&gt;' /&gt;
</del><ins>+                                        &lt;input name='email' type='text' size='45' value='&lt;?php echo esc_attr( $admin_email ); ?&gt;' /&gt;
</ins><span class="cx">                                         &lt;br /&gt;&lt;?php _e( 'Your email address.' ); ?&gt;
</span><span class="cx">                                 &lt;/td&gt;
</span><span class="cx">                         &lt;/tr&gt;
</span><span class="lines">@@ -192,9 +204,14 @@
</span><span class="cx">  *
</span><span class="cx">  * @since 3.0.0
</span><span class="cx">  */
</span><del>-function network_step2() {
</del><ins>+function network_step2( $errors = false ) {
</ins><span class="cx">         global $base, $wpdb;
</span><span class="cx">         $hostname = get_clean_basedomain();
</span><ins>+
+        // Wildcard DNS message.
+        if ( is_wp_error( $errors ) )
+                echo '&lt;div class=&quot;error&quot;&gt;' . $errors-&gt;get_error_message() . '&lt;/div&gt;';
+
</ins><span class="cx">         if ( $_POST ) {
</span><span class="cx">                 $vhost = 'localhost' == $hostname ? false : (bool) $_POST['subdomain_install'];
</span><span class="cx">         } else {
</span><span class="lines">@@ -263,14 +280,11 @@
</span><span class="cx"> &lt;/li&gt;
</span><span class="cx"> &lt;?php
</span><span class="cx"> 
</span><del>-        // remove ending slash from $base and $url
-        $htaccess = '';
-        $base = rtrim( $base, '/' );
</del><ins>+// @todo custom content dir
+$htaccess_file = 'RewriteEngine On
+RewriteBase ' . $base . '
</ins><span class="cx"> 
</span><del>-        $htaccess_file = 'RewriteEngine On
-RewriteBase ' . $base . '/
-
-#uploaded files
</del><ins>+# uploaded files
</ins><span class="cx"> RewriteRule ^(.*/)?files/$ index.php [L]
</span><span class="cx"> RewriteCond %{REQUEST_URI} !.*wp-content/plugins.*
</span><span class="cx"> RewriteRule ^(.*/)?files/(.*) wp-includes/ms-files.php?file=$2 [L]
</span><span class="lines">@@ -307,10 +321,19 @@
</span><span class="cx">         install_network();
</span><span class="cx">         $hostname = get_clean_basedomain();
</span><span class="cx">         $subdomain_install = 'localhost' == $hostname ? false : (bool) $_POST['subdomain_install'];
</span><del>-        if ( ! network_domain_check() )
-                populate_network( 1, get_clean_basedomain(), sanitize_email( $_POST['email'] ), $_POST['weblog_title'], $base, $subdomain_install );
-        // create wp-config.php / htaccess
-        network_step2();
</del><ins>+        if ( ! network_domain_check() ) {
+                $result = populate_network( 1, get_clean_basedomain(), sanitize_email( $_POST['email'] ), $_POST['sitename'], $base, $subdomain_install );
+                if ( is_wp_error( $result ) ) {
+                        if ( 1 == count( $result-&gt;get_error_codes() ) &amp;&amp; 'no_wildcard_dns' == $result-&gt;get_error_code() )
+                                network_step2( $result );
+                        else
+                                network_step1( $result );
+                } else {
+                        network_step2();
+                }
+        } else {
+                network_step2();
+        }
</ins><span class="cx"> } elseif ( is_multisite() || network_domain_check() ) {
</span><span class="cx">         network_step2();
</span><span class="cx"> } else {
</span></span></pre>
</div>
</div>

</body>
</html>