]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/action.php
Introduced isCurrentProfileInScope() which shall check if current profile is
[quix0rs-gnu-social.git] / lib / action.php
index d89a8b07ac9fda44bdf413ff4e79a79b2a68b553..c019b65dc92f40e38f2acfe74991cbc5149d8bb4 100644 (file)
@@ -30,9 +30,6 @@
 
 if (!defined('GNUSOCIAL')) { exit(1); }
 
-require_once INSTALLDIR.'/lib/noticeform.php';
-require_once INSTALLDIR.'/lib/htmloutputter.php';
-
 /**
  * Base class for all actions
  *
@@ -61,7 +58,8 @@ class Action extends HTMLOutputter // lawsuit
     protected $ajax   = false;
     protected $menus  = true;
     protected $needLogin = false;
-    protected $needPost = false;
+    protected $needPost = false;    // implies canPost if true
+    protected $canPost = false;     // can this action handle POST method?
 
     // The currently scoped profile (normally Profile::current; from $this->auth_user for API)
     protected $scoped = null;
@@ -120,9 +118,16 @@ class Action extends HTMLOutputter // lawsuit
             common_config_set('db', 'database', $mirror);
         }
 
-        if ($this->prepare($args)) {
+        $status = $this->prepare($args);
+        if ($status) {
             $this->handle($args);
+        } else {
+            common_debug('Prepare failed for Action.');
         }
+
+        $this->flush();
+
+        Event::handle('EndActionExecute', array($status, $this));
     }
 
     /**
@@ -139,9 +144,16 @@ class Action extends HTMLOutputter // lawsuit
             $this->clientError(_('This method requires a POST.'), 405);
         }
 
+        // needPost, of course, overrides canPost if true
+        if (!$this->canPost) {
+            $this->canPost = $this->needPost;
+        }
+
         $this->args = common_copy_args($args);
 
-        $this->action = $this->trimmed('action');
+        // This could be set with get_called_action and then
+        // chop off 'Action' from the class name. In lower case.
+        $this->action = strtolower($this->trimmed('action'));
 
         if ($this->ajax || $this->boolean('ajax')) {
             // check with StatusNet::isAjax()
@@ -152,11 +164,41 @@ class Action extends HTMLOutputter // lawsuit
             $this->checkLogin(); // if not logged in, this redirs/excepts
         }
 
-        $this->scoped = Profile::current();
+        $this->updateScopedProfile();
 
         return true;
     }
 
+    public function updateScopedProfile()
+    {
+        $this->scoped = Profile::current();
+        return $this->scoped;
+    }
+
+    public function getScoped()
+    {
+        return ($this->scoped instanceof Profile) ? $this->scoped : null;
+    }
+
+    // Must be run _after_ prepare
+    public function getActionName()
+    {
+        return $this->action;
+    }
+
+    public function isAction(array $names)
+    {
+        foreach ($names as $class) {
+            // PHP is case insensitive, and we have stuff like ApiUpperCaseAction,
+            // but we at least make a point out of wanting to do stuff case-sensitive.
+            $class = ucfirst($class) . 'Action';
+            if ($this instanceof $class) {
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * Show page, a template method.
      *
@@ -164,6 +206,10 @@ class Action extends HTMLOutputter // lawsuit
      */
     function showPage()
     {
+        if (StatusNet::isAjax()) {
+            self::showAjax();
+            return;
+        }
         if (Event::handle('StartShowHTML', array($this))) {
             $this->startHTML();
             $this->flush();
@@ -184,6 +230,23 @@ class Action extends HTMLOutputter // lawsuit
         }
     }
 
+    public function showAjax()
+    {
+        $this->startHTML('text/xml;charset=utf-8');
+        $this->elementStart('head');
+        // TRANS: Title for conversation page.
+        $this->element('title', null, $this->title());
+        $this->elementEnd('head');
+        $this->elementStart('body');
+        if ($this->getError()) {
+            $this->element('p', array('id'=>'error'), $this->getError());
+        } else {
+            $this->showContent();
+        }
+        $this->elementEnd('body');
+        $this->endHTML();
+    }
+
     function endHTML()
     {
         global $_startTime;
@@ -296,19 +359,6 @@ class Action extends HTMLOutputter // lawsuit
             $this->cssLink('js/extlib/jquery-ui/css/smoothness/jquery-ui.css');
 
             if (Event::handle('StartShowUAStyles', array($this))) {
-                $this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
-                               'href="'.Theme::path('css/ie.css', 'base').'?version='.STATUSNET_VERSION.'" /><![endif]');
-                foreach (array(6,7) as $ver) {
-                    if (file_exists(Theme::file('css/ie'.$ver.'.css', 'base'))) {
-                        // Yes, IE people should be put in jail.
-                        $this->comment('[if lte IE '.$ver.']><link rel="stylesheet" type="text/css" '.
-                                       'href="'.Theme::path('css/ie'.$ver.'.css', 'base').'?version='.STATUSNET_VERSION.'" /><![endif]');
-                    }
-                }
-                if (file_exists(Theme::file('css/ie.css'))) {
-                    $this->comment('[if IE]><link rel="stylesheet" type="text/css" '.
-                               'href="'.Theme::path('css/ie.css', null).'?version='.STATUSNET_VERSION.'" /><![endif]');
-                }
                 Event::handle('EndShowUAStyles', array($this));
             }
 
@@ -361,33 +411,20 @@ class Action extends HTMLOutputter // lawsuit
     {
         if (Event::handle('StartShowScripts', array($this))) {
             if (Event::handle('StartShowJQueryScripts', array($this))) {
-                if (common_config('site', 'minify')) {
-                    $this->script('extlib/jquery.min.js');
-                    $this->script('extlib/jquery.form.min.js');
-                    $this->script('extlib/jquery-ui/jquery-ui.min.js');
-                    $this->script('extlib/jquery.cookie.min.js');
-                    $this->inlineScript('if (typeof window.JSON !== "object") { $.getScript("'.common_path('js/extlib/json2.min.js', StatusNet::isHTTPS()).'"); }');
-                    $this->script('extlib/jquery.infieldlabel.min.js');
-                } else {
-                    $this->script('extlib/jquery.js');
-                    $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');
-                }
+                $this->script('extlib/jquery.js');
+                $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)) &&
-                Event::handle('StartShowLaconicaScripts', array($this))) {
-                if (common_config('site', 'minify')) {
-                    $this->script('util.min.js');
-                } else {
-                    $this->script('util.js');
-                    $this->script('xbImportNode.js');
-                    $this->script('geometa.js');
-                }
+            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 = "' .
@@ -401,7 +438,6 @@ class Action extends HTMLOutputter // lawsuit
                     $this->inlineScript('if (window.top !== window.self) { document.write = ""; window.top.location = window.self.location; setTimeout(function () { document.body.innerHTML = ""; }, 1); window.self.onload = function () { document.body.innerHTML = ""; }; }');
                 }
                 Event::handle('EndShowStatusNetScripts', array($this));
-                Event::handle('EndShowLaconicaScripts', array($this));
             }
             Event::handle('EndShowScripts', array($this));
         }
@@ -535,9 +571,11 @@ class Action extends HTMLOutputter // lawsuit
      */
     function showBody()
     {
-        $this->elementStart('body', (common_current_user()) ? array('id' => strtolower($this->trimmed('action')),
-                                                                    'class' => 'user_in')
-                            : array('id' => strtolower($this->trimmed('action'))));
+        $params = array('id' => $this->getActionName());
+        if ($this->scoped instanceof Profile) {
+            $params['class'] = 'user_in';
+        }
+        $this->elementStart('body', $params);
         $this->elementStart('div', array('id' => 'wrap'));
         if (Event::handle('StartShowHeader', array($this))) {
             $this->showHeader();
@@ -584,8 +622,7 @@ class Action extends HTMLOutputter // lawsuit
      */
     function showLogo()
     {
-        $this->elementStart('address', array('id' => 'site_contact',
-                                             'class' => 'vcard'));
+        $this->elementStart('address', array('id' => 'site_contact', 'class' => 'h-card'));
         if (Event::handle('StartAddressData', array($this))) {
             if (common_config('singleuser', 'enabled')) {
                 $user = User::singleUser();
@@ -598,7 +635,7 @@ class Action extends HTMLOutputter // lawsuit
                 $url = common_local_url('public');
             }
 
-            $this->elementStart('a', array('class' => 'url home bookmark',
+            $this->elementStart('a', array('class' => 'home bookmark',
                                            'href' => $url));
 
             if (StatusNet::isHTTPS()) {
@@ -624,13 +661,11 @@ class Action extends HTMLOutputter // lawsuit
             }
 
             if (!empty($logoUrl)) {
-                $this->element('img', array('class' => 'logo photo',
+                $this->element('img', array('class' => 'logo u-photo p-name',
                                             'src' => $logoUrl,
                                             'alt' => common_config('site', 'name')));
             }
 
-            $this->text(' ');
-            $this->element('span', array('class' => 'fn org'), common_config('site', 'name'));
             $this->elementEnd('a');
 
             Event::handle('EndAddressData', array($this));
@@ -686,44 +721,42 @@ class Action extends HTMLOutputter // lawsuit
     function showNoticeForm()
     {
         // TRANS: Tab on the notice form.
-        $tabs = array('status' => _m('TAB','Status'));
+        $tabs = array('status' => array('title' => _m('TAB','Status'),
+                                        'href'  => common_local_url('newnotice')));
 
         $this->elementStart('div', 'input_forms');
 
+        $this->element('label', array('for'=>'input_form_nav'), _m('TAB', 'Share your:'));
+
         if (Event::handle('StartShowEntryForms', array(&$tabs))) {
             $this->elementStart('ul', array('class' => 'nav',
                                             'id' => 'input_form_nav'));
 
-            foreach ($tabs as $tag => $title) {
+            foreach ($tabs as $tag => $data) {
+                $tag = htmlspecialchars($tag);
                 $attrs = array('id' => 'input_form_nav_'.$tag,
                                'class' => 'input_form_nav_tab');
 
                 if ($tag == 'status') {
-                    // We're actually showing the placeholder form,
-                    // but we special-case the 'Status' tab as if
-                    // it were a small version of it.
                     $attrs['class'] .= ' current';
                 }
                 $this->elementStart('li', $attrs);
 
                 $this->element('a',
-                               array('href' => 'javascript:SN.U.switchInputFormTab("'.$tag.'")'),
-                               $title);
+                               array('onclick' => 'return SN.U.switchInputFormTab("'.$tag.'");',
+                                     'href' => $data['href']),
+                               $data['title']);
                 $this->elementEnd('li');
             }
 
             $this->elementEnd('ul');
 
-            $attrs = array('class' => 'input_form current',
-                           'id' => 'input_form_placeholder');
-            $this->elementStart('div', $attrs);
-            $form = new NoticePlaceholderForm($this);
-            $form->show();
-            $this->elementEnd('div');
-
-            foreach ($tabs as $tag => $title) {
+            foreach ($tabs as $tag => $data) {
                 $attrs = array('class' => 'input_form',
                                'id' => 'input_form_'.$tag);
+                if ($tag == 'status') {
+                    $attrs['class'] .= ' current';
+                }
 
                 $this->elementStart('div', $attrs);
 
@@ -957,7 +990,7 @@ class Action extends HTMLOutputter // lawsuit
      *
      * @return nothing
      */
-    function showContent()
+    protected function showContent()
     {
     }
 
@@ -1046,33 +1079,33 @@ class Action extends HTMLOutputter // lawsuit
      */
     function showLicenses()
     {
-        $this->showStatusNetLicense();
+        $this->showGNUsocialLicense();
         $this->showContentLicense();
     }
 
     /**
-     * Show StatusNet license.
+     * Show GNU social license.
      *
      * @return nothing
      */
-    function showStatusNetLicense()
+    function showGNUsocialLicense()
     {
         if (common_config('site', 'broughtby')) {
-            // TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set.
+            // TRANS: First sentence of the GNU social site license. Used if 'broughtby' is set.
             // TRANS: Text between [] is a link description, text between () is the link itself.
             // TRANS: Make sure there is no whitespace between "]" and "(".
             // TRANS: "%%site.broughtby%%" is the value of the variable site.broughtby
             $instr = _('**%%site.name%%** is a social network, courtesy of [%%site.broughtby%%](%%site.broughtbyurl%%).');
         } else {
-            // TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is not set.
+            // TRANS: First sentence of the GNU social site license. Used if 'broughtby' is not set.
             $instr = _('**%%site.name%%** is a social network.');
         }
         $instr .= ' ';
-        // TRANS: Second sentence of the StatusNet site license. Mentions the StatusNet source code license.
+        // TRANS: Second sentence of the GNU social site license. Mentions the GNU social source code license.
         // TRANS: Make sure there is no whitespace between "]" and "(".
-        // TRANS: Text between [] is a link description, text between () is the link itself.
-        // TRANS: %s is the version of StatusNet that is being used.
-        $instr .= sprintf(_('It runs on [GNU social](http://www.gnu.org/software/social/), version %s, available under the [GNU Affero General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html).'), STATUSNET_VERSION);
+        // TRANS: [%1$s](%2$s) is a link description followed by the link itself
+        // TRANS: %3$s is the version of GNU social that is being used.
+        $instr .= sprintf(_('It runs on [%1$s](%2$s), version %3$s, available under the [GNU Affero General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html).'), GNUSOCIAL_ENGINE, GNUSOCIAL_ENGINE_URL, GNUSOCIAL_VERSION);
         $output = common_markup_to_html($instr);
         $this->raw($output);
         // do it
@@ -1134,12 +1167,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 = "<a class=\"license\" rel=\"external license\" href=\"" .
-                        htmlspecialchars(common_config('license', 'url')) .
-                        "\">" .
-                        htmlspecialchars(common_config('license', 'title')) .
-                        "</a>";
-                $this->raw(sprintf(htmlspecialchars($notice),
+                $link = sprintf('<a class="license" rel="external license" href="%1$s">%2$s</a>',
+                                htmlspecialchars(common_config('license', 'url')),
+                                htmlspecialchars(common_config('license', 'title')));
+                $this->raw(@sprintf(htmlspecialchars($notice),
                                    htmlspecialchars(common_config('site', 'name')),
                                    $link));
                 $this->elementEnd('p');
@@ -1185,7 +1216,7 @@ class Action extends HTMLOutputter // lawsuit
      *
      * @return boolean is read only action?
      */
-    function isReadOnly($args)
+    function isReadOnly(array $args=array())
     {
         return false;
     }
@@ -1335,9 +1366,9 @@ class Action extends HTMLOutputter // lawsuit
      */
     function int($key, $defValue=null, $maxValue=null, $minValue=null)
     {
-        $arg = strtolower($this->trimmed($key));
+        $arg = intval($this->arg($key));
 
-        if (is_null($arg) || !is_integer($arg)) {
+        if (!is_numeric($this->arg($key)) || $arg != $this->arg($key)) {
             return $defValue;
         }
 
@@ -1495,7 +1526,7 @@ class Action extends HTMLOutputter // lawsuit
      */
     function returnToArgs()
     {
-        $action = $this->trimmed('action');
+        $action = $this->getActionName();
         $args   = $this->args;
         unset($args['action']);
         if (common_config('site', 'fancy')) {