]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - lib/menu.php
XSS vulnerability when remote-subscribing
[quix0rs-gnu-social.git] / lib / menu.php
1 <?php
2 /**
3  * StatusNet - the distributed open-source microblogging tool
4  * Copyright (C) 2011, StatusNet, Inc.
5  *
6  * Menu widget
7  * 
8  * PHP version 5
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU Affero General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU Affero General Public License for more details.
19  *
20  * You should have received a copy of the GNU Affero General Public License
21  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
22  *
23  * @category  Widget
24  * @package   StatusNet
25  * @author    Evan Prodromou <evan@status.net>
26  * @copyright 2011 StatusNet, Inc.
27  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
28  * @link      http://status.net/
29  */
30
31 if (!defined('STATUSNET')) {
32     // This check helps protect against security problems;
33     // your code file can't be executed directly from the web.
34     exit(1);
35 }
36
37 /**
38  * Superclass for menus
39  *
40  * @category  General
41  * @package   StatusNet
42  * @author    Evan Prodromou <evan@status.net>
43  * @copyright 2011 StatusNet, Inc.
44  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
45  * @link      http://status.net/
46  */
47
48 class Menu extends Widget
49 {
50     var $action     = null;
51     var $actionName = null;
52     var $actionArgs = null;
53     
54     /**
55      * Construction
56      *
57      * @param Action $action current action, used for output
58      */
59     function __construct(Action $action=null)
60     {
61         parent::__construct($action);
62
63         $this->action     = $action;
64         $this->actionName = $action->trimmed('action');
65
66         $rtargs = $action->returnToArgs();
67
68         $this->actionArgs = $rtargs[1];
69     }
70
71     function getItems()
72     {
73         return array();
74     }
75
76     function tag()
77     {
78         return null;
79     }
80     
81     function show()
82     {
83         $items = $this->getItems();
84         $tag = $this->tag();
85
86         $attrs = array('class' => 'nav');
87
88         if (!is_null($tag)) {
89             $attrs['id']  = 'nav_' . $tag;
90         }
91
92         if (Event::handle('StartNav', array($this, &$tag, &$items))) {
93
94             $this->out->elementStart('ul', $attrs);
95
96             foreach ($items as $item) {
97                 list($actionName, $args, $label, $description, $id) = $item;
98                 $this->item($actionName, $args, $label, $description, $id);
99             }
100         
101             $this->out->elementEnd('ul');
102             
103             Event::handle('EndNav', array($this, $tag, $items));
104         }
105     }
106     
107     function item($actionName, array $args, $label, $description, $id=null, $cls=null)
108     {
109         if (empty($id)) {
110             $id = $this->menuItemID($actionName, $args);
111         }
112
113         $url = common_local_url($actionName, $args);
114
115         $this->out->menuItem($url,
116                              $label,
117                              $description,
118                              $this->isCurrent($actionName, $args),
119                              $id,
120                              $cls);
121     }
122
123     function isCurrent($actionName, array $args)
124     {
125         if ($actionName != $this->actionName) {
126             return false;
127         }
128
129         foreach ($this->actionArgs as $k => $v) {
130             if (!array_key_exists($k, $args) || $args[$k] != $v) {
131                 return false;
132             }
133         }
134
135         return true;
136     }
137     
138     function menuItemID($actionName, $args = null)
139     {
140         $id = sprintf('nav_%s', $actionName);
141         
142         if (!is_null($args)) {
143             foreach ($args as $key => $value) {
144                 $id .= '_' . $key . '_' . $value;
145             }
146         }
147
148         return $id;
149     }
150
151     function submenu($label, $menu)
152     {
153         if (Event::handle('StartSubMenu', array($this->action, $menu, $label))) {
154             $this->action->elementStart('li');
155             $this->action->element('h3', null, $label);
156             $menu->show();
157             $this->action->elementEnd('li');
158             Event::handle('EndSubMenu', array($this->action, $menu, $label));
159         }
160     }
161 }