X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FGlobalFunctions.php;h=d5c65539588ac3a0b6380f8ffa2aecbfc2b6ed75;hb=a2f838d9c16206c1a1c9c2128e650dcee7726207;hp=5c42bc26cfec0402deebc443bec090416823884d;hpb=2af9a2ff14e00142a4d2e4b37d5ddee5fbddddcf;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index 5c42bc26cf..d5c6553958 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -30,7 +30,6 @@ use MediaWiki\Session\SessionManager; // Hide compatibility functions from Doxygen /// @cond - /** * Compatibility functions * @@ -501,12 +500,26 @@ function wfAppendQuery( $url, $query ) { $query = wfArrayToCgi( $query ); } if ( $query != '' ) { + // Remove the fragment, if there is one + $fragment = false; + $hashPos = strpos( $url, '#' ); + if ( $hashPos !== false ) { + $fragment = substr( $url, $hashPos ); + $url = substr( $url, 0, $hashPos ); + } + + // Add parameter if ( false === strpos( $url, '?' ) ) { $url .= '?'; } else { $url .= '&'; } $url .= $query; + + // Put the fragment back + if ( $fragment !== false ) { + $url .= $fragment; + } } return $url; } @@ -2120,6 +2133,24 @@ function wfTempDir() { return $tmp; } } + + /** + * PHP on Windows will detect C:\Windows\Temp as not writable even though PHP can write to it + * so create a directory within that called 'mwtmp' with a suffix of the user running the + * current process. + * The user is included as if various scripts are run by different users they will likely + * not be able to access each others temporary files. + */ + if ( wfIsWindows() ) { + $tmp = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'mwtmp' . '-' . get_current_user(); + if ( !file_exists( $tmp ) ) { + mkdir( $tmp ); + } + if ( file_exists( $tmp ) && is_dir( $tmp ) && is_writable( $tmp ) ) { + return $tmp; + } + } + throw new MWException( 'No writable temporary directory could be found. ' . 'Please set $wgTmpDirectory to a writable directory.' ); } @@ -2425,6 +2456,15 @@ function wfShellExec( $cmd, &$retval = null, $environ = [], } wfDebug( "wfShellExec: $cmd\n" ); + // Don't try to execute commands that exceed Linux's MAX_ARG_STRLEN. + // Other platforms may be more accomodating, but we don't want to be + // accomodating, because very long commands probably include user + // input. See T129506. + if ( strlen( $cmd ) > SHELL_MAX_ARG_STRLEN ) { + throw new Exception( __METHOD__ . + '(): total length of $cmd must not exceed SHELL_MAX_ARG_STRLEN' ); + } + $desc = [ 0 => [ 'file', 'php://stdin', 'r' ], 1 => [ 'pipe', 'w' ], @@ -3109,6 +3149,9 @@ function wfSplitWikiID( $wiki ) { * Note 2: use $this->getDB() in maintenance scripts that may be invoked by * updater to ensure that a proper database is being updated. * + * @todo Replace calls to wfGetDB with calls to LoadBalancer::getConnection() + * on an injected instance of LoadBalancer. + * * @return DatabaseBase */ function wfGetDB( $db, $groups = [], $wiki = false ) { @@ -3118,20 +3161,30 @@ function wfGetDB( $db, $groups = [], $wiki = false ) { /** * Get a load balancer object. * + * @deprecated since 1.27, use MediaWikiServices::getDBLoadBalancer() + * or MediaWikiServices::getDBLoadBalancerFactory() instead. + * * @param string|bool $wiki Wiki ID, or false for the current wiki * @return LoadBalancer */ function wfGetLB( $wiki = false ) { - return wfGetLBFactory()->getMainLB( $wiki ); + if ( $wiki === false ) { + return \MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancer(); + } else { + $factory = \MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); + return $factory->getMainLB( $wiki ); + } } /** * Get the load balancer factory object * + * @deprecated since 1.27, use MediaWikiServices::getDBLoadBalancerFactory() instead. + * * @return LBFactory */ function wfGetLBFactory() { - return LBFactory::singleton(); + return \MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory(); } /**