Index: wp-admin/network.php
===================================================================
--- wp-admin/network.php	(revision 15769)
+++ wp-admin/network.php	(working copy)
@@ -26,6 +26,177 @@
 	$wpdb->$table = $prefixed_table;
 
 /**
+ * @param string $base configuration
+ * @param bool $subdomain_install configuration
+ * @return string htaccess file content (mod_rewrite directives);
+ */
+function network_admin_generate_htaccess_file_content($base, $subdomain_install ) {
+
+	$uploaded_files = sprintf(
+		'^%sfiles/(.+) wp-includes/ms-files.php?file=$1',
+		$subdomain_install ? '' : '[_0-9a-zA-Z-]+/' 
+	);
+	
+	// $htaccess_comment_if_a_subdomain_install
+	$comment_if = $subdomain_install ? '# ' : '';
+	
+	$content = 
+'RewriteEngine On
+RewriteBase ' . $base . '
+RewriteRule ^index\.php$ - [L]
+
+# uploaded files
+RewriteRule ' . $uploaded_files . ' [L]
+
+# add a trailing slash to /wp-admin (commented if a subdomain install)
+' . $comment_if . 'RewriteRule ^([_0-9a-zA-Z-]+/)wp-admin$ $1wp-admin/ [R=301,L]
+
+RewriteCond %{REQUEST_FILENAME} -f [OR]
+RewriteCond %{REQUEST_FILENAME} -d
+RewriteRule ^ - [L]
+
+# serach for non-existent files (commented if a subdomain install)
+' . $comment_if . 'RewriteRule  ^[_0-9a-zA-Z-]+/(wp-(content|admin|includes).*) $1 [L]
+' . $comment_if . 'RewriteRule  ^[_0-9a-zA-Z-]+/(.*\.php)$ $1 [L]
+
+RewriteRule . index.php [L]
+';
+	
+	return $content;
+}
+
+/**
+ * @return array array-keys as the key constant names and array-values as the according value.
+ */
+function network_admin_generate_key_salts() {
+	$key_names = array('AUTH_KEY', 'SECURE_AUTH_KEY', 'LOGGED_IN_KEY', 'NONCE_KEY', 'AUTH_SALT', 'SECURE_AUTH_SALT', 'LOGGED_IN_SALT', 'NONCE_SALT');
+	$key_existing_names = array_filter( $key_names, 'defined' );
+	$key_inexist = array_diff( $key_names, $key_existing_names );
+	$keys_count = count($key_inexist);
+	if ( 0 === $keys_count )
+		return array();
+	 
+	$keys_salts = array_combine( $key_inexist, array_fill( 0, $keys_count, '' ) );
+	
+	$from_api = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' );
+	if ( is_wp_error( $from_api ) ) {
+		foreach ( $keys_salts as $c => $v ) {
+			$keys_salts[ $c ] = wp_generate_password( 64, true, true );
+		}
+	} else {
+		$from_api = explode( "\n", wp_remote_retrieve_body( $from_api ) );
+		foreach ( $keys_salts as $c => $v ) {
+			$keys_salts[ $c ] = substr( array_shift( $from_api ), 28, 64 );
+		}
+	}
+
+	return $key_salts;
+}
+
+/**
+ * @return string web config content
+ */
+function network_admin_web_config_content_subdirecotry_install() {
+	return 				
+'<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <system.webServer>
+        <rewrite>
+            <rules>
+                <rule name="WordPress Rule 1" stopProcessing="true">
+                    <match url="^index\.php$" ignoreCase="false" />
+                    <action type="None" />
+                </rule>
+                <rule name="WordPress Rule 2" stopProcessing="true">
+                    <match url="^([_0-9a-zA-Z-]+/)?files/(.+)" ignoreCase="false" />
+                    <action type="Rewrite" url="wp-includes/ms-files.php?file={R:2}" appendQueryString="false" />
+                </rule>
+                <rule name="WordPress Rule 3" stopProcessing="true">
+                    <match url="^([_0-9a-zA-Z-]+/)?wp-admin$" ignoreCase="false" />
+                    <action type="Redirect" url="{R:1}wp-admin/" redirectType="Permanent" />
+                </rule>
+                <rule name="WordPress Rule 4" stopProcessing="true">
+                    <match url="^" ignoreCase="false" />
+                    <conditions logicalGrouping="MatchAny">
+                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" />
+                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" />
+                    </conditions>
+                    <action type="None" />
+                </rule>
+                <rule name="WordPress Rule 5" stopProcessing="true">
+                    <match url="^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*)" ignoreCase="false" />
+                    <action type="Rewrite" url="{R:2}" />
+                </rule>
+                <rule name="WordPress Rule 6" stopProcessing="true">
+                    <match url="^([_0-9a-zA-Z-]+/)?(.*\.php)$" ignoreCase="false" />
+                    <action type="Rewrite" url="{R:2}" />
+                </rule>
+                <rule name="WordPress Rule 7" stopProcessing="true">
+                    <match url="." ignoreCase="false" />
+                    <action type="Rewrite" url="index.php" />
+                </rule>
+            </rules>
+        </rewrite>
+    </system.webServer>
+</configuration>';
+}
+
+/**
+ * @return string web config content
+ */
+function network_admin_web_config_content_subdomain_install() {
+	return 
+'<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <system.webServer>
+        <rewrite>
+            <rules>
+                <rule name="WordPress Rule 1" stopProcessing="true">
+                    <match url="^index\.php$" ignoreCase="false" />
+                    <action type="None" />
+                </rule>
+                <rule name="WordPress Rule 2" stopProcessing="true">
+                    <match url="^files/(.+)" ignoreCase="false" />
+                    <action type="Rewrite" url="wp-includes/ms-files.php?file={R:1}" appendQueryString="false" />
+                </rule>
+                <rule name="WordPress Rule 3" stopProcessing="true">
+                    <match url="^" ignoreCase="false" />
+                    <conditions logicalGrouping="MatchAny">
+                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" />
+                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" />
+                    </conditions>
+                    <action type="None" />
+                </rule>
+                <rule name="WordPress Rule 4" stopProcessing="true">
+                    <match url="." ignoreCase="false" />
+                    <action type="Rewrite" url="index.php" />
+                </rule>
+            </rules>
+        </rewrite>
+    </system.webServer>
+</configuration>';
+}
+
+/**
+ * @param string $base path of current site configuration
+ * @param string $hostname domain current site configuration
+ * @param bool $subdomain_install configuration
+ * @return string file content
+ */
+function network_admin_generate_wpconfig_file_content( $base, $hostname, $subdomain_install ) {
+	$subdomain = $subdomain_install ? 'true' : 'false';
+	return
+"define( 'MULTISITE', true );
+define( 'SUBDOMAIN_INSTALL', {$subdomain} );
+\$base = '{$base}';
+define( 'DOMAIN_CURRENT_SITE', '{$hostname}' );
+define( 'PATH_CURRENT_SITE', '{$base}' );
+define( 'SITE_ID_CURRENT_SITE', 1 );
+define( 'BLOG_ID_CURRENT_SITE', 1 );
+";
+}
+
+/**
  * Check for an existing network.
  *
  * @since 3.0.0
@@ -328,157 +499,51 @@
 				if ( WP_CONTENT_DIR != ABSPATH . 'wp-content' )
 					echo ' <strong>' . __('Warning:') . ' ' . __( 'Networks may not be fully compatible with custom wp-content directories.' ) . '</strong';
 			?></p></li>
-			<li><p><?php printf( __( 'Add the following to your <code>wp-config.php</code> file in <code>%s</code> <strong>above</strong> the line reading <code>/* That&#8217;s all, stop editing! Happy blogging. */</code>:' ), ABSPATH ); ?></p>
+			<?php
+				$file_content = network_admin_generate_wpconfig_file_content( $base, $hostname, $subdomain_install );
+			?>
+			<li>
+				<p><?php printf( __( 'Add the following to your <code>wp-config.php</code> file in <code>%s</code> <strong>above</strong> the line reading <code>/* That&#8217;s all, stop editing! Happy blogging. */</code>:' ), ABSPATH ); ?></p>
 				<textarea class="code" readonly="readonly" cols="100" rows="7">
-define( 'MULTISITE', true );
-define( 'SUBDOMAIN_INSTALL', <?php echo $subdomain_install ? 'true' : 'false'; ?> );
-$base = '<?php echo $base; ?>';
-define( 'DOMAIN_CURRENT_SITE', '<?php echo $hostname; ?>' );
-define( 'PATH_CURRENT_SITE', '<?php echo $base; ?>' );
-define( 'SITE_ID_CURRENT_SITE', 1 );
-define( 'BLOG_ID_CURRENT_SITE', 1 );</textarea>
+				<?php echo wp_htmledit_pre( $file_content ); ?>
+				</textarea>
+				<?php
+				$keys_salts = network_admin_generate_key_salts();
+				$num_keys_salts = count( $keys_salts );
+				?>
+				<p>
+				<?php echo _n( 'This unique authentication key is also missing from your <code>wp-config.php</code> file.', 'These unique authentication keys are also missing from your <code>wp-config.php</code> file.', $num_keys_salts ); ?>
+				<?php _e( 'To make your installation more secure, you should also add:' ) ?></p>
+				<textarea class="code" readonly="readonly" cols="100" rows="<?php echo $num_keys_salts; ?>"><?php
+					foreach ( $keys_salts as $c => $v ) {
+						echo "\ndefine( '$c', '" . htmlspecialchars( $v ) . "' );";
+					}
+				?></textarea>
 <?php
-	$keys_salts = array( 'AUTH_KEY' => '', 'SECURE_AUTH_KEY' => '', 'LOGGED_IN_KEY' => '', 'NONCE_KEY' => '', 'AUTH_SALT' => '', 'SECURE_AUTH_SALT' => '', 'LOGGED_IN_SALT' => '', 'NONCE_SALT' => '' );
-	foreach ( $keys_salts as $c => $v ) {
-		if ( defined( $c ) )
-			unset( $keys_salts[ $c ] );
 	}
-	if ( ! empty( $keys_salts ) ) {
-		$from_api = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' );
-		if ( is_wp_error( $from_api ) ) {
-			foreach ( $keys_salts as $c => $v ) {
-				$keys_salts[ $c ] = wp_generate_password( 64, true, true );
-			}
-		} else {
-			$from_api = explode( "\n", wp_remote_retrieve_body( $from_api ) );
-			foreach ( $keys_salts as $c => $v ) {
-				$keys_salts[ $c ] = substr( array_shift( $from_api ), 28, 64 );
-			}
-		}
-		$num_keys_salts = count( $keys_salts );
 ?>
-	<p><?php
-		echo _n( 'This unique authentication key is also missing from your <code>wp-config.php</code> file.', 'These unique authentication keys are also missing from your <code>wp-config.php</code> file.', $num_keys_salts ); ?> <?php _e( 'To make your installation more secure, you should also add:' ) ?></p>
-	<textarea class="code" readonly="readonly" cols="100" rows="<?php echo $num_keys_salts; ?>"><?php
-	foreach ( $keys_salts as $c => $v ) {
-		echo "\ndefine( '$c', '$v' );";
-	}
-?></textarea>
-<?php
-	}
-?>
 </li>
 <?php
 	if ( iis7_supports_permalinks() ) :
-
-			if ( $subdomain_install ) {
-				$web_config_file =
-'<?xml version="1.0" encoding="UTF-8"?>
-<configuration>
-    <system.webServer>
-        <rewrite>
-            <rules>
-                <rule name="WordPress Rule 1" stopProcessing="true">
-                    <match url="^index\.php$" ignoreCase="false" />
-                    <action type="None" />
-                </rule>
-                <rule name="WordPress Rule 2" stopProcessing="true">
-                    <match url="^files/(.+)" ignoreCase="false" />
-                    <action type="Rewrite" url="wp-includes/ms-files.php?file={R:1}" appendQueryString="false" />
-                </rule>
-                <rule name="WordPress Rule 3" stopProcessing="true">
-                    <match url="^" ignoreCase="false" />
-                    <conditions logicalGrouping="MatchAny">
-                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" />
-                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" />
-                    </conditions>
-                    <action type="None" />
-                </rule>
-                <rule name="WordPress Rule 4" stopProcessing="true">
-                    <match url="." ignoreCase="false" />
-                    <action type="Rewrite" url="index.php" />
-                </rule>
-            </rules>
-        </rewrite>
-    </system.webServer>
-</configuration>';
-			} else {
-				$web_config_file =
-'<?xml version="1.0" encoding="UTF-8"?>
-<configuration>
-    <system.webServer>
-        <rewrite>
-            <rules>
-                <rule name="WordPress Rule 1" stopProcessing="true">
-                    <match url="^index\.php$" ignoreCase="false" />
-                    <action type="None" />
-                </rule>
-                <rule name="WordPress Rule 2" stopProcessing="true">
-                    <match url="^([_0-9a-zA-Z-]+/)?files/(.+)" ignoreCase="false" />
-                    <action type="Rewrite" url="wp-includes/ms-files.php?file={R:2}" appendQueryString="false" />
-                </rule>
-                <rule name="WordPress Rule 3" stopProcessing="true">
-                    <match url="^([_0-9a-zA-Z-]+/)?wp-admin$" ignoreCase="false" />
-                    <action type="Redirect" url="{R:1}wp-admin/" redirectType="Permanent" />
-                </rule>
-                <rule name="WordPress Rule 4" stopProcessing="true">
-                    <match url="^" ignoreCase="false" />
-                    <conditions logicalGrouping="MatchAny">
-                        <add input="{REQUEST_FILENAME}" matchType="IsFile" ignoreCase="false" />
-                        <add input="{REQUEST_FILENAME}" matchType="IsDirectory" ignoreCase="false" />
-                    </conditions>
-                    <action type="None" />
-                </rule>
-                <rule name="WordPress Rule 5" stopProcessing="true">
-                    <match url="^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*)" ignoreCase="false" />
-                    <action type="Rewrite" url="{R:2}" />
-                </rule>
-                <rule name="WordPress Rule 6" stopProcessing="true">
-                    <match url="^([_0-9a-zA-Z-]+/)?(.*\.php)$" ignoreCase="false" />
-                    <action type="Rewrite" url="{R:2}" />
-                </rule>
-                <rule name="WordPress Rule 7" stopProcessing="true">
-                    <match url="." ignoreCase="false" />
-                    <action type="Rewrite" url="index.php" />
-                </rule>
-            </rules>
-        </rewrite>
-    </system.webServer>
-</configuration>';
-			}
+		if ( $subdomain_install ) {
+			$file_content = network_admin_web_config_content_subdomain_install();
+		} else {
+			$file_content = network_admin_web_config_content_subdirecotry_install();
+		}
 	?>
 		<li><p><?php printf( __( 'Add the following to your <code>web.config</code> file in <code>%s</code>, replacing other WordPress rules:' ), ABSPATH ); ?></p>
 		<textarea class="code" readonly="readonly" cols="100" rows="20">
-		<?php echo wp_htmledit_pre( $web_config_file ); ?>
+		<?php echo wp_htmledit_pre( $file_content ); ?>
 		</textarea></li>
 		</ol>
 
 	<?php else : // end iis7_supports_permalinks(). construct an htaccess file instead:
 
-		$htaccess_file = 'RewriteEngine On
-RewriteBase ' . $base . '
-RewriteRule ^index\.php$ - [L]
-
-# uploaded files
-RewriteRule ^' . ( $subdomain_install ? '' : '([_0-9a-zA-Z-]+/)?' ) . 'files/(.+) wp-includes/ms-files.php?file=$' . ( $subdomain_install ? 1 : 2 ) . ' [L]' . "\n";
-
-		if ( ! $subdomain_install )
-			$htaccess_file .= "\n# add a trailing slash to /wp-admin\n" . 'RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]' . "\n";
-
-		$htaccess_file .= "\n" . 'RewriteCond %{REQUEST_FILENAME} -f [OR]
-RewriteCond %{REQUEST_FILENAME} -d
-RewriteRule ^ - [L]';
-
-		// @todo custom content dir.
-		if ( ! $subdomain_install )
-			$htaccess_file .= "\nRewriteRule  ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]\nRewriteRule  ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]";
-
-		$htaccess_file .= "\nRewriteRule . index.php [L]";
-
+		$file_content = network_admin_generate_htaccess_file_content( $base, $subdomain_install );
 		?>
 		<li><p><?php printf( __( 'Add the following to your <code>.htaccess</code> file in <code>%s</code>, replacing other WordPress rules:' ), ABSPATH ); ?></p>
 		<textarea class="code" readonly="readonly" cols="100" rows="<?php echo $subdomain_install ? 11 : 16; ?>">
-<?php echo wp_htmledit_pre( $htaccess_file ); ?></textarea></li>
+<?php echo wp_htmledit_pre( $file_content ); ?></textarea></li>
 		</ol>
 
 	<?php endif; // end IIS/Apache code branches.
