Ticket #8974: WordPressURLRewrite-misc(11027).patch

File WordPressURLRewrite-misc(11027).patch, 6.9 KB (added by peaceablewhale, 3 years ago)

New patch to resolve conflict between WordPressURLRewrite.patch and the current revision of misc.php in trunk

  • wp-admin/includes/misc.php

     
    362362                exit; 
    363363        } 
    364364} 
     365 
     366/** 
     367 * Updates the IIS web.config file with the current rules if it is writable. 
     368 * If the permalinks do not require rewrite rules then the rules are deleted from the web.config file. 
     369 *  
     370 *  
     371 * @return bool True if web.config was updated successfully 
     372 */ 
     373function iis7_save_url_rewrite_rules(){ 
     374        global $wp_rewrite; 
     375         
     376        $home_path = get_home_path(); 
     377        $web_config_file = $home_path.'web.config'; 
     378 
     379        // Using is__writable() instead of is_writable() because of a bug in Windows PHP         
     380        if ((!file_exists($web_config_file) && is__writable($home_path) && $wp_rewrite->using_mod_rewrite_permalinks()) || is__writable($web_config_file)) { 
     381                if ( iis7_supports_permalinks() ) { 
     382                        $rule = $wp_rewrite -> iis7_url_rewrite_rules(); 
     383                        if ( !empty($rule) ) //  
     384                                return iis7_add_rewrite_rule($web_config_file, $rule); 
     385                        else{ 
     386                                return iis7_delete_rewrite_rule($web_config_file); 
     387                        } 
     388                } 
     389        } 
     390        return false; 
     391} 
     392// IIS 7 specific functions 
     393 
     394/** 
     395 * Check if IIS 7 supports pretty permalinks 
     396 *  
     397 *  
     398 * @return bool 
     399 */ 
     400function iis7_supports_permalinks(){ 
     401        // First we check if the DOMDocument class exists. If it does not exist, 
     402        // which is the case for PHP 4.X, then we cannot easily update the xml configuration file, 
     403        // hence we just bail out and tell user that pretty permalinks cannot be used. 
     404        // This is not a big issue because PHP 4.X is going to be depricated and for IIS it 
     405        // is recommended to use PHP 5.X NTS. 
     406        $supports_permalinks = class_exists('DOMDocument') && iis7_url_rewrite_loaded(); 
     407        return apply_filters('iis7_supports_permalinks', $supports_permalinks); 
     408} 
     409 
     410/** 
     411 * Check if rewrite rule for WordPress already exists in the IIS 7 configuration file 
     412 *  
     413 *  
     414 * @return bool 
     415 * @param string $filename The file path to the configuration file 
     416 */ 
     417function iis7_rewrite_rule_exists($filename) 
     418{        
     419        if (!file_exists($filename)) return false;       
     420        if (!class_exists('DOMDocument')) return false; 
     421         
     422        $doc = new DOMDocument(); 
     423        if ($doc -> load($filename) === false) return false; 
     424        $xpath = new DOMXPath($doc); 
     425        $rules = $xpath -> query('/configuration/system.webServer/rewrite/rules/rule[@name=\'wordpress\']'); 
     426        if ($rules -> length == 0)  
     427                return false; 
     428        else 
     429                return true;     
     430} 
     431 
     432/** 
     433 * Delete WordPress rewrite rule from web.config file if it exists there 
     434 * @return  
     435 * @param string $filename Name of the configuration file 
     436 */ 
     437function iis7_delete_rewrite_rule($filename) 
     438{        
     439        // If configuration file does not exist then rules also do not exist so there is nothing to delete 
     440        if (!file_exists($filename)) return true; 
     441         
     442        if (!class_exists('DOMDocument')) return false; 
     443         
     444        $doc = new DOMDocument(); 
     445        $doc -> preserveWhiteSpace = false; 
     446 
     447        if ($doc -> load($filename) === false) return false; 
     448        $xpath = new DOMXPath($doc); 
     449        $rules = $xpath -> query('/configuration/system.webServer/rewrite/rules/rule[@name=\'wordpress\']'); 
     450        if ($rules -> length > 0) { 
     451                $child = $rules -> item(0); 
     452                $parent = $child -> parentNode; 
     453                $parent -> removeChild($child); 
     454                $doc -> formatOutput = true; 
     455                saveDomDocument($doc, $filename); 
     456        } 
     457        return true; 
     458} 
     459 
     460/** 
     461 * Add WordPress rewrite rule to the IIS 7 configuration file. 
     462 *  
     463 *  
     464 * @return bool 
     465 * @param string $filename The file path to the configuration file 
     466 * @param string $rewrite_rule The XML fragment with URL Rewrite rule 
     467 */ 
     468function iis7_add_rewrite_rule($filename, $rewrite_rule) 
     469{        
     470        if (!class_exists('DOMDocument')) return false; 
     471         
     472        // If configuration file does not exist then we create one. 
     473        if (!file_exists($filename)) { 
     474                $fp = fopen( $filename, 'w'); 
     475                fwrite($fp, '<configuration/>'); 
     476                fclose($fp); 
     477        } 
     478         
     479        $doc = new DOMDocument(); 
     480        $doc -> preserveWhiteSpace = false; 
     481 
     482        if ($doc -> load($filename) === false) return false; 
     483         
     484        $xpath = new DOMXPath($doc); 
     485 
     486        // First check if the rule already exists as in that case there is no need to re-add it 
     487        $wordpress_rules = $xpath -> query('/configuration/system.webServer/rewrite/rules/rule[@name=\'wordpress\']'); 
     488        if ($wordpress_rules -> length > 0) return true; 
     489 
     490        // Check the XPath to the rewrite rule and create XML nodes if they do not exist 
     491        $xmlnodes = $xpath -> query('/configuration/system.webServer/rewrite/rules'); 
     492        if ($xmlnodes -> length > 0){ 
     493                $rules_node = $xmlnodes -> item(0); 
     494        } 
     495        else{ 
     496                $rules_node = $doc -> createElement('rules'); 
     497                 
     498                $xmlnodes = $xpath -> query('/configuration/system.webServer/rewrite'); 
     499                if ($xmlnodes -> length > 0){ 
     500                        $rewrite_node = $xmlnodes -> item(0); 
     501                        $rewrite_node -> appendChild($rules_node); 
     502                } 
     503                else{ 
     504                        $rewrite_node = $doc -> createElement('rewrite'); 
     505                        $rewrite_node -> appendChild($rules_node); 
     506 
     507                        $xmlnodes = $xpath -> query('/configuration/system.webServer'); 
     508                        if ($xmlnodes -> length > 0){ 
     509                                $system_webServer_node = $xmlnodes -> item(0); 
     510                                $system_webServer_node -> appendChild($rewrite_node); 
     511                        } 
     512                        else{ 
     513                                $system_webServer_node = $doc -> createElement('system.webServer'); 
     514                                $system_webServer_node -> appendChild($rewrite_node); 
     515                 
     516                                $xmlnodes = $xpath -> query('/configuration'); 
     517                                if ($xmlnodes -> length > 0){ 
     518                                        $config_node = $xmlnodes -> item(0); 
     519                                        $config_node -> appendChild($system_webServer_node); 
     520                                } 
     521                                else{ 
     522                                        $config_node = $doc -> createElement('configuration'); 
     523                                        $doc -> appendChild($config_node); 
     524                                        $config_node -> appendChild($system_webServer_node); 
     525                                }  
     526                        }                
     527                } 
     528        } 
     529         
     530        $rule_fragment = $doc -> createDocumentFragment(); 
     531        $rule_fragment -> appendXML($rewrite_rule); 
     532        $rules_node -> appendChild($rule_fragment); 
     533 
     534        $doc -> formatOutput = true;     
     535        saveDomDocument($doc, $filename); 
     536 
     537        return true;     
     538} 
     539 
     540/** 
     541 * Saves the XML document into a file 
     542 *  
     543 * @param DOMDocument $doc 
     544 * @param string $filename 
     545 */ 
     546function saveDomDocument($doc, $filename) 
     547{ 
     548        $config = $doc -> saveXML();     
     549        $config = preg_replace("/([^\r])\n/", "$1\r\n", $config); 
     550        $fp = fopen($filename, 'w'); 
     551        fwrite($fp, $config); 
     552        fclose($fp); 
     553} 
     554 
     555/** 
     556 * Workaround for Windows bug in is_writable() function 
     557 *  
     558 * @return  
     559 * @param object $path 
     560 */ 
     561function is__writable($path) { 
     562//will work in despite of Windows ACLs bug 
     563//NOTE: use a trailing slash for folders!!! 
     564//see http://bugs.php.net/bug.php?id=27609 
     565//see http://bugs.php.net/bug.php?id=30931 
     566 
     567    if ($path{strlen($path)-1}=='/') // recursively return a temporary file path 
     568        return is__writable($path.uniqid(mt_rand()).'.tmp'); 
     569    else if (is_dir($path)) 
     570        return is__writable($path.'/'.uniqid(mt_rand()).'.tmp'); 
     571    // check tmp file for read/write capabilities 
     572    $rm = file_exists($path); 
     573    $f = @fopen($path, 'a'); 
     574    if ($f===false) 
     575        return false; 
     576    fclose($f); 
     577    if (!$rm) 
     578        unlink($path); 
     579    return true; 
     580} 
     581?> 
     582 No newline at end of file