Exemple #1
0
/**
 * Return a string consisting of callers in the stack. Useful sometimes
 * for profiling specific points.
 *
 * @param int $limit The maximum depth of the stack frame to return, or false for the entire stack.
 * @return string
 */
function wfGetAllCallers($limit = 3)
{
    $trace = array_reverse(wfDebugBacktrace());
    if (!$limit || $limit > count($trace) - 1) {
        $limit = count($trace) - 1;
    }
    $trace = array_slice($trace, -$limit - 1, $limit);
    return implode('/', array_map('wfFormatStackFrame', $trace));
}
Exemple #2
0
 /**
  * Get an array describing the calling function at a specified offset.
  *
  * @param $callerOffset integer: How far up the callstack is the original
  *    caller. 0 = function that called getCallerDescription()
  * @return array with two keys: 'file' and 'func'
  */
 private static function getCallerDescription($callerOffset)
 {
     $callers = wfDebugBacktrace();
     if (isset($callers[$callerOffset])) {
         $callerfile = $callers[$callerOffset];
         if (isset($callerfile['file']) && isset($callerfile['line'])) {
             $file = $callerfile['file'] . ' at line ' . $callerfile['line'];
         } else {
             $file = '(internal function)';
         }
     } else {
         $file = '(unknown location)';
     }
     if (isset($callers[$callerOffset + 1])) {
         $callerfunc = $callers[$callerOffset + 1];
         $func = '';
         if (isset($callerfunc['class'])) {
             $func .= $callerfunc['class'] . '::';
         }
         if (isset($callerfunc['function'])) {
             $func .= $callerfunc['function'];
         }
     } else {
         $func = 'unknown';
     }
     return array('file' => $file, 'func' => $func);
 }
Exemple #3
0
 /**
  * Get function caller
  *
  * @param $level Integer
  */
 static function getCaller($level)
 {
     $backtrace = wfDebugBacktrace();
     if (isset($backtrace[$level])) {
         if (isset($backtrace[$level]['class'])) {
             $caller = $backtrace[$level]['class'] . '::' . $backtrace[$level]['function'];
         } else {
             $caller = $backtrace[$level]['function'];
         }
     } else {
         $caller = 'unknown';
     }
     return $caller;
 }
/**
 * Send a warning either to the debug log or in a PHP error depending on
 * $wgDevelopmentWarnings
 *
 * @param $msg String: message to send
 * @param $callerOffset Integer: number of items to go back in the backtrace to
 *        find the correct caller (1 = function calling wfWarn, ...)
 * @param $level Integer: PHP error level; only used when $wgDevelopmentWarnings
 *        is true
 */
function wfWarn($msg, $callerOffset = 1, $level = E_USER_NOTICE)
{
    global $wgDevelopmentWarnings;
    $callers = wfDebugBacktrace();
    if (isset($callers[$callerOffset + 1])) {
        $callerfunc = $callers[$callerOffset + 1];
        $callerfile = $callers[$callerOffset];
        if (isset($callerfile['file']) && isset($callerfile['line'])) {
            $file = $callerfile['file'] . ' at line ' . $callerfile['line'];
        } else {
            $file = '(internal function)';
        }
        $func = '';
        if (isset($callerfunc['class'])) {
            $func .= $callerfunc['class'] . '::';
        }
        if (isset($callerfunc['function'])) {
            $func .= $callerfunc['function'];
        }
        $msg .= " [Called from {$func} in {$file}]";
    }
    if ($wgDevelopmentWarnings) {
        trigger_error($msg, $level);
    } else {
        wfDebug("{$msg}\n");
    }
}
Exemple #5
0
 /**
  * Wikia denug backtrace logger
  *
  * @example Wikia::debugBacktrace(__METHOD__);
  * @author Piotr Molski <*****@*****.**>
  *
  * @param String $method - use __METHOD__ as default
  *
  * @deprecated use WikiaLogger instead
  */
 public static function debugBacktrace($method)
 {
     $backtrace = wfDebugBacktrace();
     $msg = "***** BEGIN *****";
     Wikia::log($method, false, $msg, true);
     foreach ($backtrace as $call) {
         $msg = "";
         if (isset($call['file'])) {
             $f = explode(DIRECTORY_SEPARATOR, $call['file']);
             $file = $f[count($f) - 1];
         } else {
             $file = '-';
         }
         if (isset($call['line'])) {
             $line = $call['line'];
         } else {
             $line = '-';
         }
         $msg .= "{$file} line {$line} calls ";
         if (!empty($call['class'])) {
             $msg .= $call['class'] . '::';
         }
         $msg .= $call['function'] . '()';
         Wikia::log($method, false, $msg, true);
     }
     $msg = "***** END *****";
     Wikia::log($method, false, $msg, true);
 }
Exemple #6
0
 /**
  * Internal error handler
  *
  * @internal Internal error handler
  * @param string $message Error message
  * @param string $file Filename
  * @param integer $line Line number
  * @param integer $code Error code
  * @return void
  */
 private static function __triggerError($message, $file, $line, $code = 0, $depthLimit = null)
 {
     $message = $message . "depth=" . $depthLimit;
     wfDebug(print_r(wfDebugBacktrace($depthLimit), true));
     if (self::$useExceptions) {
         throw new S3Exception($message, $file, $line, $code);
     } else {
         trigger_error($message, E_USER_WARNING);
     }
 }
/**
 * Throws an E_USER_NOTICE saying that $function is deprecated
 * @param string $function
 * @return null
 */
function wfDeprecated($function)
{
    global $wgDebugLogFile;
    if (!$wgDebugLogFile) {
        return;
    }
    $callers = wfDebugBacktrace();
    if (isset($callers[2])) {
        $callerfunc = $callers[2];
        $callerfile = $callers[1];
        if (isset($callerfile['file']) && isset($callerfile['line'])) {
            $file = $callerfile['file'] . ' at line ' . $callerfile['line'];
        } else {
            $file = '(internal function)';
        }
        $func = '';
        if (isset($callerfunc['class'])) {
            $func .= $callerfunc['class'] . '::';
        }
        $func .= @$callerfunc['function'];
        $msg = "Use of {$function} is deprecated. Called from {$func} in {$file}";
    } else {
        $msg = "Use of {$function} is deprecated.";
    }
    wfDebug("{$msg}\n");
}
/** Return a string consisting all callers in stack, somewhat useful sometimes for profiling specific points */
function wfGetAllCallers()
{
    return implode('/', array_map(create_function('$frame', ' 
			return isset( $frame["class"] )?
				$frame["class"]."::".$frame["function"]:
				$frame["function"]; 
			'), array_reverse(wfDebugBacktrace())));
}
 /**
  * Mark this test as skipped. Puts extra information in the logs.
  *
  * @param string $message
  */
 public static function markTestSkipped($message = '')
 {
     $backtrace = wfDebugBacktrace(3);
     $entry = $backtrace[1];
     Wikia::log(wfFormatStackFrame($entry), false, "marked as skipped - {$message}");
     parent::markTestSkipped($message);
 }
Exemple #10
0
/**
 * Go through the backtrace and return the first method that is not in the ingored class
 * @param $ignoreClasses mixed array of ignored class names or a single class name
 * @return string method name
 */
function wfGetCallerClassMethod($ignoreClasses)
{
    // analyze the backtrace to log the source of purge requests
    $backtrace = wfDebugBacktrace();
    $method = '';
    if (is_string($ignoreClasses)) {
        $ignoreClasses = [$ignoreClasses];
    }
    while ($entry = array_shift($backtrace)) {
        if (empty($entry['class']) || in_array($entry['class'], $ignoreClasses)) {
            continue;
        }
        // skip closures
        // e.g. "FilePageController:{closure}"
        if ($entry['function'] === '{closure}') {
            continue;
        }
        $method = $entry['class'] . ':' . $entry['function'];
        break;
    }
    return $method;
}
Exemple #11
0
 /**
  * Save this user's settings into the database.
  * @todo Only rarely do all these fields need to be set!
  */
 public function saveSettings()
 {
     global $wgAuth;
     $this->load();
     if (wfReadOnly()) {
         return;
     }
     if (0 == $this->mId) {
         return;
     }
     $this->mTouched = self::newTouchedTimestamp();
     if (!$wgAuth->allowSetLocalPassword()) {
         $this->mPassword = '';
     }
     // wikia change begin
     /**
      * @author Krzysztof Krzyżaniak (eloy)
      * trap for BugId: 4013
      */
     if ($this->mEmail == "*****@*****.**" || $this->mEmail == "*****@*****.**") {
         // gather everything we know about request
         global $wgCommandLineMode;
         $log = "MOLI TRAP@devbox: ";
         if ($wgCommandLineMode && !empty($argv)) {
             $log .= $argv[0];
             openlog("trap", LOG_PID | LOG_PERROR, LOG_LOCAL6);
             syslog(LOG_WARNING, "{$log}");
             closelog();
         } else {
             global $wgTitle;
             if (is_object($wgTitle)) {
                 $log .= $wgTitle->getFullUrl();
                 error_log($log);
             }
         }
     }
     /**
      * @author Michał Roszka (Mix)
      * trap for BugId:17012
      */
     if ('Lancer1289' == $this->mName) {
         $oTo = $oFrom = new MailAddress('*****@*****.**');
         UserMailer::send($oTo, $oFrom, 'BugId:17012 Occurrence Report', serialize(wfDebugBacktrace()));
     }
     // wikia change end
     $dbw = wfGetDB(DB_MASTER);
     $dbw->update('user', array('user_name' => $this->mName, 'user_password' => $this->mPassword, 'user_newpassword' => $this->mNewpassword, 'user_newpass_time' => $dbw->timestampOrNull($this->mNewpassTime), 'user_real_name' => $this->mRealName, 'user_email' => $this->mEmail, 'user_email_authenticated' => $dbw->timestampOrNull($this->mEmailAuthenticated), 'user_touched' => $dbw->timestamp($this->mTouched), 'user_token' => strval($this->mToken), 'user_email_token' => $this->mEmailToken, 'user_email_token_expires' => $dbw->timestampOrNull($this->mEmailTokenExpires)), array('user_id' => $this->mId), __METHOD__);
     $this->saveOptions();
     wfRunHooks('UserSaveSettings', array($this));
     $this->clearSharedCache();
     # Wikia - bad style fix for #1531 - needs review if it is still needed
     global $wgRequest;
     $action = $wgRequest->getVal('action');
     $commit = isset($action) && $action == 'ajax';
     if ($commit === true) {
         $dbw->commit();
     }
     $this->getUserPage()->invalidateCache();
 }
/**
 * Custom error handler
 *
 * @param $errType Integer: type of error
 * @param $errMsg String: error message
 * @param $errFile String: file where the error occured
 * @param $errLine Integer: line where the error occured
 * @param $errVars Array: hmm?
 */
function efErrorHandler($errType, $errMsg, $errFile, $errLine, $errVars)
{
    global $wgErrorHandlerErrors, $wgErrorHandlerOutputDone, $wgErrorHandlerShowBackTrace, $wgErrorHandlerReport, $wgErrorHandlerMaxStringSize, $wgErrorHandlerAlwaysReport, $wgErrorHandlerReportAfterOutput, $wgErrorHandlerLog;
    global $IP, $wgCommandLineMode;
    static $errorsMap = array(E_ERROR => 'fatal', E_WARNING => 'warning', E_PARSE => 'parse', E_NOTICE => 'notice', E_CORE_ERROR => 'core-error', E_CORE_WARNING => 'core-warning', E_COMPILE_ERROR => 'compile-error', E_COMPILE_WARNING => 'compile-warning', E_USER_ERROR => 'user-error', E_USER_WARNING => 'user-warning', E_USER_NOTICE => 'user-notice', E_STRICT => 'strict', 4096 => 'recoverable', 8192 => 'deprecated', 16384 => 'user-deprecated');
    if (!($errType & $wgErrorHandlerReport) || !$wgErrorHandlerAlwaysReport && !(error_reporting() & $errType)) {
        return false;
    }
    $trace = array();
    // Show the backtrace
    if ($wgErrorHandlerShowBackTrace) {
        if (function_exists('wfDebugBacktrace')) {
            $backtrace = array_slice(wfDebugBacktrace(), 1);
        } else {
            $backtrace = array_slice(debug_backtrace(), 1);
        }
        foreach ($backtrace as $call) {
            if (isset($call['file']) && isset($call['line'])) {
                $safeIP = preg_quote($IP, '/');
                $file = preg_replace("/^{$safeIP}/", '.', $call['file']);
                $line = $call['line'];
                $internal = false;
            } else {
                $internal = true;
            }
            $func = '';
            if (!empty($call['class'])) {
                $func .= $call['class'] . $call['type'];
            }
            $func .= $call['function'];
            if (isset($call['args']) && !empty($call['args']) && is_array($call['args'])) {
                $args = array();
                foreach ($call['args'] as $arg) {
                    if (is_object($arg)) {
                        $args[] = 'Object(' . get_class($arg) . ')';
                    } elseif (is_null($arg)) {
                        $args[] = 'null';
                    } elseif (is_array($arg)) {
                        $args[] = 'array()';
                    } elseif (is_string($arg)) {
                        if (strlen($arg) > $wgErrorHandlerMaxStringSize) {
                            $str = substr($arg, 0, $wgErrorHandlerMaxStringSize) . '...';
                        } else {
                            $str = $arg;
                        }
                        $args[] = '\'' . str_replace("\n", '', $str) . '\'';
                    } elseif (is_numeric($arg)) {
                        $args[] = (string) $arg;
                    } elseif (is_bool($arg)) {
                        $args[] = 'bool(' . ($arg ? 'true' : 'false') . ')';
                    } else {
                        $args[] = gettype($arg) . '(' . $arg . ')';
                    }
                }
                $func .= '( ' . implode(', ', $args) . ' )';
            } else {
                $func .= '()';
            }
            $func = htmlspecialchars($func);
            if ($internal) {
                $res = array('errorhandler-trace-line-internal', $func);
            } else {
                $file = htmlspecialchars($file);
                $res = array('errorhandler-trace-line', $file, $line, $func);
            }
            $trace[] = $res;
        }
    }
    $err = array('error' => 'errorhandler-error-' . $errorsMap[$errType], 'msg' => $errMsg, 'file' => $errFile, 'line' => $errLine, 'trace' => $trace);
    $errText = efErrorGetText($err, true);
    if ($wgErrorHandlerLog === true) {
        error_log($errText, 0);
    } elseif (file_exists($wgErrorHandlerLog)) {
        error_log($errText, 3, $wgErrorHandlerLog);
    }
    if ($wgCommandLineMode) {
        echo $errText;
    } else {
        if ($wgErrorHandlerOutputDone) {
            if ($wgErrorHandlerReportAfterOutput) {
                echo efErrorGetText($err);
            } else {
                $wgErrorHandlerErrors[] = $err;
            }
        }
    }
    return true;
}
 public function updateUser()
 {
     global $wgExternalSharedDB;
     wfProfileIn(__METHOD__);
     if (wfReadOnly()) {
         // Change to wgReadOnlyDbMode if we implement that
         wfDebug(__METHOD__ . ": tried to updateUser while in read-only mode.\n");
     } else {
         wfDebug(__METHOD__ . ": update central user data \n");
         /**
          * @author Michał Roszka (Mix)
          * trap for BugId:17012
          */
         if ('Lancer1289' == $this->mUser->mName) {
             $oTo = $oFrom = new MailAddress('*****@*****.**');
             UserMailer::send($oTo, $oFrom, 'BugId:17012 Occurrence Report', serialize(wfDebugBacktrace()));
         }
         $dbw = wfGetDB(DB_MASTER, array(), $wgExternalSharedDB);
         $this->mUser->mTouched = User::newTouchedTimestamp();
         $dbw->update('`user`', array('user_name' => $this->mUser->mName, 'user_password' => $this->mUser->mPassword, 'user_newpassword' => $this->mUser->mNewpassword, 'user_newpass_time' => $dbw->timestampOrNull($this->mUser->mNewpassTime), 'user_real_name' => $this->mUser->mRealName, 'user_email' => $this->mUser->mEmail, 'user_email_authenticated' => $dbw->timestampOrNull($this->mUser->mEmailAuthenticated), 'user_options' => '', 'user_touched' => $dbw->timestamp($this->mUser->mTouched), 'user_token' => $this->mUser->mToken, 'user_email_token' => $this->mUser->mEmailToken, 'user_email_token_expires' => $dbw->timestampOrNull($this->mUser->mEmailTokenExpires)), array('user_id' => $this->mUser->mId), __METHOD__);
         $dbw->commit();
     }
     wfProfileOut(__METHOD__);
 }
/** Return a string consisting all callers in stack, somewhat useful sometimes for profiling specific points */
function wfGetAllCallers()
{
    return implode('/', array_map('wfFormatStackFrame', array_reverse(wfDebugBacktrace())));
}