X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=lib%2Faction.php;h=fc7f0a06dde20954d7ff68cc19e5d4a9f206d927;hb=5e7a7701b94ee63927750064a39b188d9e17164a;hp=f3a125d3b5556732d1763e7a82c134cb1c72347e;hpb=8892702f0cf84ca7b74ef8fdbb785e3155637c72;p=quix0rs-gnu-social.git diff --git a/lib/action.php b/lib/action.php index f3a125d3b5..fc7f0a06dd 100644 --- a/lib/action.php +++ b/lib/action.php @@ -95,9 +95,22 @@ class Action extends HTMLOutputter // lawsuit return $this->msg; } + public function handleError($e) + { + if ($e instanceof ClientException) { + $this->clientError($e->getMessage(), $e->getCode()); + } elseif ($e instanceof ServerException) { + $this->serverError($e->getMessage(), $e->getCode()); + } else { + // If it wasn't specified more closely which kind of exception it was + $this->serverError($e->getMessage(), 500); + } + } + static public function run(array $args=array(), $output='php://output', $indent=null) { $class = get_called_class(); $action = new $class($output, $indent); + set_exception_handler(array($action, 'handleError')); $action->execute($args); return $action; } @@ -118,16 +131,17 @@ class Action extends HTMLOutputter // lawsuit common_config_set('db', 'database', $mirror); } - $status = $this->prepare($args); - if ($status) { - $this->handle($args); - } else { - common_debug('Prepare failed for Action.'); - } - - $this->flush(); + if (Event::handle('StartActionExecute', array($this, &$args))) { + $prepared = $this->prepare($args); + if ($prepared) { + $this->handle($args); + } else { + common_debug('Prepare failed for Action.'); + } - Event::handle('EndActionExecute', array($status, $this)); + $this->flush(); + Event::handle('EndActionExecute', array($this)); + } } /** @@ -156,8 +170,8 @@ class Action extends HTMLOutputter // lawsuit $this->action = strtolower($this->trimmed('action')); if ($this->ajax || $this->boolean('ajax')) { - // check with StatusNet::isAjax() - StatusNet::setAjax(true); + // check with GNUsocial::isAjax() + GNUsocial::setAjax(true); } if ($this->needLogin) { @@ -204,9 +218,9 @@ class Action extends HTMLOutputter // lawsuit * * @return nothing */ - function showPage() + public function showPage() { - if (StatusNet::isAjax()) { + if (GNUsocial::isAjax()) { self::showAjax(); return; } @@ -326,7 +340,7 @@ class Action extends HTMLOutputter // lawsuit } else { // favicon.ico should be HTTPS if the rest of the page is $this->element('link', array('rel' => 'shortcut icon', - 'href' => common_path('favicon.ico', StatusNet::isHTTPS()))); + 'href' => common_path('favicon.ico', GNUsocial::isHTTPS()))); } if (common_config('site', 'mobile')) { @@ -380,8 +394,7 @@ class Action extends HTMLOutputter // lawsuit { $theme = new Theme($mainTheme); - // Some themes may have external stylesheets, such as using the - // Google Font APIs to load webfonts. + // Some themes may have external stylesheets foreach ($theme->getExternals() as $url) { $this->cssLink($url, $mainTheme, $media); } @@ -415,21 +428,19 @@ class Action extends HTMLOutputter // lawsuit $this->script('extlib/jquery.form.js'); $this->script('extlib/jquery-ui/jquery-ui.js'); $this->script('extlib/jquery.cookie.js'); - $this->inlineScript('if (typeof window.JSON !== "object") { $.getScript("'.common_path('js/extlib/json2.js', StatusNet::isHTTPS()).'"); }'); - $this->script('extlib/jquery.infieldlabel.js'); Event::handle('EndShowJQueryScripts', array($this)); } if (Event::handle('StartShowStatusNetScripts', array($this))) { $this->script('util.js'); $this->script('xbImportNode.js'); - $this->script('geometa.js'); // This route isn't available in single-user mode. // Not sure why, but it causes errors here. $this->inlineScript('var _peopletagAC = "' . common_local_url('peopletagautocomplete') . '";'); $this->showScriptMessages(); + $this->showScriptVariables(); // Anti-framing code to avoid clickjacking attacks in older browsers. // This will show a blank page if the page is being framed, which is // consistent with the behavior of the 'X-Frame-Options: SAMEORIGIN' @@ -459,12 +470,7 @@ class Action extends HTMLOutputter // lawsuit // TRANS: Localized tooltip for '...' expansion button on overlong remote messages. $messages['showmore_tooltip'] = _m('TOOLTIP', 'Show more'); - - // TRANS: Inline reply form submit button: submits a reply comment. - $messages['reply_submit'] = _m('BUTTON', 'Reply'); - - // TRANS: Placeholder text for inline reply form. Clicking in this box will turn it into a mini notice form. - $messages['reply_placeholder'] = _m('Write a reply...'); + $messages['popup_close_button'] = _m('TOOLTIP', 'Close popup'); $messages = array_merge($messages, $this->getScriptMessages()); @@ -478,6 +484,19 @@ class Action extends HTMLOutputter // lawsuit return $messages; } + protected function showScriptVariables() + { + $vars = array(); + + if (Event::handle('StartScriptVariables', array($this, &$vars))) { + $vars['urlNewNotice'] = common_local_url('newnotice'); + } + if (!empty($vars)) { + $this->inlineScript('SN.V = ' . json_encode($vars)); + } + return $vars; + } + /** * If the action will need localizable text strings, export them here like so: * @@ -526,15 +545,11 @@ class Action extends HTMLOutputter // lawsuit */ function showFeeds() { - $feeds = $this->getFeeds(); - - if ($feeds) { - foreach ($feeds as $feed) { - $this->element('link', array('rel' => $feed->rel(), - 'href' => $feed->url, - 'type' => $feed->mimeType(), - 'title' => $feed->title)); - } + foreach ($this->getFeeds() as $feed) { + $this->element('link', array('rel' => $feed->rel(), + 'href' => $feed->url, + 'type' => $feed->mimeType(), + 'title' => $feed->title)); } } @@ -638,7 +653,7 @@ class Action extends HTMLOutputter // lawsuit $this->elementStart('a', array('class' => 'home bookmark', 'href' => $url)); - if (StatusNet::isHTTPS()) { + if (GNUsocial::isHTTPS()) { $logoUrl = common_config('site', 'ssllogo'); if (empty($logoUrl)) { // if logo is an uploaded file, try to fall back to HTTPS file URL @@ -1027,9 +1042,9 @@ class Action extends HTMLOutputter // lawsuit function showExportData() { $feeds = $this->getFeeds(); - if ($feeds) { - $fl = new FeedList($this); - $fl->show($feeds); + if (!empty($feeds)) { + $fl = new FeedList($this, $feeds); + $fl->show(); } } @@ -1144,12 +1159,12 @@ class Action extends HTMLOutputter // lawsuit $image = common_config('license', 'image'); $sslimage = common_config('license', 'sslimage'); - if (StatusNet::isHTTPS()) { + if (GNUsocial::isHTTPS()) { if (!empty($sslimage)) { $url = $sslimage; } else if (preg_match('#^http://i.creativecommons.org/#', $image)) { // CC support HTTPS on their images - $url = preg_replace('/^http/', 'https', $image); + $url = preg_replace('/^http/', 'https', $image, 1); } else { // Better to show mixed content than no content $url = $image; @@ -1167,12 +1182,10 @@ class Action extends HTMLOutputter // lawsuit // TRANS: license message in footer. // TRANS: %1$s is the site name, %2$s is a link to the license URL, with a licence name set in configuration. $notice = _('All %1$s content and data are available under the %2$s license.'); - $link = "" . - htmlspecialchars(common_config('license', 'title')) . - ""; - $this->raw(sprintf(htmlspecialchars($notice), + $link = sprintf('%2$s', + htmlspecialchars(common_config('license', 'url')), + htmlspecialchars(common_config('license', 'title'))); + $this->raw(@sprintf(htmlspecialchars($notice), htmlspecialchars(common_config('site', 'name')), $link)); $this->elementEnd('p'); @@ -1356,6 +1369,19 @@ class Action extends HTMLOutputter // lawsuit } } + /** + * This is a cheap hack to avoid a bug in DB_DataObject + * where '' is non-type-aware compared to 0, which means it + * will always be true for values like false and 0 too... + * + * Upstream bug is:: + * https://pear.php.net/bugs/bug.php?id=20291 + */ + function booleanintstring($key, $def=false) + { + return $this->boolean($key, $def) ? '1' : '0'; + } + /** * Integer value of an argument * @@ -1427,7 +1453,9 @@ class Action extends HTMLOutputter // lawsuit $this->endDocument('json'); break; default: - throw new ServerException($msg, $code); + common_log(LOG_ERR, 'Handled serverError ('._ve($code).') but cannot output into desired format ('._ve($this->format).'): '._ve($msg)); + $action = new ServerErrorAction($msg, $code); + $action->execute(); } exit((int)$code); @@ -1455,7 +1483,7 @@ class Action extends HTMLOutputter // lawsuit if (!array_key_exists($code, ClientErrorAction::$status)) { $code = 400; } - + $status_string = ClientErrorAction::$status[$code]; switch ($format) { @@ -1474,7 +1502,7 @@ class Action extends HTMLOutputter // lawsuit } $this->initDocument('json'); $error_array = array('error' => $msg, 'request' => $_SERVER['REQUEST_URI']); - $this->text(json_encode($error_array)); + print(json_encode($error_array)); $this->endDocument('json'); break; case 'text': @@ -1483,7 +1511,9 @@ class Action extends HTMLOutputter // lawsuit echo $msg; break; default: - throw new ClientException($msg, $code); + common_log(LOG_ERR, 'Handled clientError ('._ve($code).') but cannot output into desired format ('._ve($this->format).'): '._ve($msg)); + $action = new ClientErrorAction($msg, $code); + $action->execute(); } exit((int)$code); } @@ -1639,7 +1669,7 @@ class Action extends HTMLOutputter // lawsuit */ function getFeeds() { - return null; + return array(); } /**