]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - index.php
Merge branch 'testing' of gitorious.org:statusnet/mainline into 0.9.x
[quix0rs-gnu-social.git] / index.php
index 644812bd55ac1c8b1549fd4446189266f3c121af..06ff9900fd5bff24466be4cbd6ee5ffaeb87ac6e 100644 (file)
--- a/index.php
+++ b/index.php
@@ -29,7 +29,7 @@
  * @author   Robin Millette <millette@controlyourself.ca>
  * @author   Sarven Capadisli <csarven@controlyourself.ca>
  * @author   Tom Adams <tom@holizz.com>
- * 
+ *
  * @license  GNU Affero General Public License http://www.gnu.org/licenses/
  */
 
@@ -76,11 +76,16 @@ function handleError($error)
     if (common_config('site', 'logdebug')) {
         $logmsg .= " : ". $error->getDebugInfo();
     }
+    // DB queries often end up with a lot of newlines; merge to a single line
+    // for easier grepability...
+    $logmsg = str_replace("\n", " ", $logmsg);
     common_log(LOG_ERR, $logmsg);
+
+    // @fixme backtrace output should be consistent with exception handling
     if (common_config('site', 'logdebug')) {
         $bt = $error->getBacktrace();
-        foreach ($bt as $line) {
-            common_log(LOG_ERR, $line);
+        foreach ($bt as $n => $line) {
+            common_log(LOG_ERR, formatBacktraceLine($n, $line));
         }
     }
     if ($error instanceof DB_DataObject_Error
@@ -109,12 +114,59 @@ function handleError($error)
     exit(-1);
 }
 
-function checkMirror($action_obj, $args)
+/**
+ * Format a backtrace line for debug output roughly like debug_print_backtrace() does.
+ * Exceptions already have this built in, but PEAR error objects just give us the array.
+ *
+ * @param int $n line number
+ * @param array $line per-frame array item from debug_backtrace()
+ * @return string
+ */
+function formatBacktraceLine($n, $line)
+{
+    $out = "#$n ";
+    if (isset($line['class'])) $out .= $line['class'];
+    if (isset($line['type'])) $out .= $line['type'];
+    if (isset($line['function'])) $out .= $line['function'];
+    $out .= '(';
+    if (isset($line['args'])) {
+        $args = array();
+        foreach ($line['args'] as $arg) {
+            // debug_print_backtrace seems to use var_export
+            // but this gets *very* verbose!
+            $args[] = gettype($arg);
+        }
+        $out .= implode(',', $args);
+    }
+    $out .= ')';
+    $out .= ' called at [';
+    if (isset($line['file'])) $out .= $line['file'];
+    if (isset($line['line'])) $out .= ':' . $line['line'];
+    $out .= ']';
+    return $out;
+}
+
+function setupRW()
 {
     global $config;
 
     static $alwaysRW = array('session', 'remember_me');
 
+    // We ensure that these tables always are used
+    // on the master DB
+
+    $config['db']['database_rw'] = $config['db']['database'];
+    $config['db']['ini_rw'] = INSTALLDIR.'/classes/statusnet.ini';
+
+    foreach ($alwaysRW as $table) {
+        $config['db']['table_'.$table] = 'rw';
+    }
+}
+
+function checkMirror($action_obj, $args)
+{
+    global $config;
+
     if (common_config('db', 'mirror') && $action_obj->isReadOnly($args)) {
         if (is_array(common_config('db', 'mirror'))) {
             // "load balancing", ha ha
@@ -125,16 +177,6 @@ function checkMirror($action_obj, $args)
             $mirror = common_config('db', 'mirror');
         }
 
-        // We ensure that these tables always are used
-        // on the master DB
-
-        $config['db']['database_rw'] = $config['db']['database'];
-        $config['db']['ini_rw'] = INSTALLDIR.'/classes/statusnet.ini';
-
-        foreach ($alwaysRW as $table) {
-            $config['db']['table_'.$table] = 'rw';
-        }
-
         // everyone else uses the mirror
 
         $config['db']['database'] = $mirror;
@@ -143,7 +185,7 @@ function checkMirror($action_obj, $args)
 
 function isLoginAction($action)
 {
-    static $loginActions =  array('login', 'recoverpassword', 'api', 'doc', 'register');
+    static $loginActions =  array('login', 'recoverpassword', 'api', 'doc', 'register', 'publicxrds');
 
     $login = null;
 
@@ -200,9 +242,13 @@ function main()
 
     PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError');
 
+    // Make sure RW database is setup
+
+    setupRW();
+
     // XXX: we need a little more structure in this script
 
-    // get and cache current user
+    // get and cache current user (may hit RW!)
 
     $user = common_current_user();
 
@@ -239,7 +285,23 @@ function main()
     if (!$user && common_config('site', 'private')
         && !isLoginAction($action)
         && !preg_match('/rss$/', $action)
-    ) {
+        && $action != 'robotstxt'
+        && !preg_match('/^Api/', $action)) {
+
+        // set returnto
+        $rargs =& common_copy_args($args);
+        unset($rargs['action']);
+        if (common_config('site', 'fancy')) {
+            unset($rargs['p']);
+        }
+        if (array_key_exists('submit', $rargs)) {
+            unset($rargs['submit']);
+        }
+        foreach (array_keys($_COOKIE) as $cookie) {
+            unset($rargs[$cookie]);
+        }
+        common_set_returnto(common_local_url($action, $rargs));
+
         common_redirect(common_local_url('login'));
         return;
     }