5 * Copyright 2004 (c) GForge LLC
6 * Copyright 2010, Roland Mas
7 * Copyright (C) 2011 Alain Peyrat - Alcatel-Lucent
9 * Thorsten Glaser <t.glaser@tarent.de>
10 * Copyright 2014, Stéphane-Eymeric Bredthauer
12 * This file is part of FusionForge. FusionForge is free software;
13 * you can redistribute it and/or modify it under the terms of the
14 * GNU General Public License as published by the Free Software
15 * Foundation; either version 2 of the Licence, or (at your option)
18 * FusionForge is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU General Public License for more details.
23 * You should have received a copy of the GNU General Public License along
24 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
25 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 require_once '../../env.inc.php';
29 require_once $gfcommon.'include/pre.php';
30 require_once $gfwww.'project/admin/project_admin_utils.php';
31 require_once $gfcommon.'include/Role.class.php';
32 require_once $gfcommon.'include/rbac_texts.php';
34 $group_id = getIntFromRequest('group_id');
35 session_require_perm ('project_admin', $group_id) ;
37 $role_id = getStringFromRequest('role_id');
38 $data = getStringFromRequest('data');
40 $group = group_get_object($group_id);
42 if (getStringFromRequest('delete')) {
43 session_redirect('/project/admin/roledelete.php?group_id='.$group_id.'&role_id='.$role_id);
46 if (getStringFromRequest('add')) {
47 $role_name = trim(getStringFromRequest('role_name')) ;
48 $role = new Role ($group) ;
49 $role_id=$role->createDefault($role_name) ;
51 $role = RBACEngine::getInstance()->getRoleById($role_id) ;
53 if (!$role || !is_object($role)) {
54 exit_error(_('Could Not Get Role'),'admin');
55 } elseif ($role->isError()) {
56 exit_error($role->getErrorMessage(),'admin');
59 $old_data = $role->getSettingsForProject ($group) ;
60 $new_data = array () ;
62 if (!is_array ($data)) {
65 foreach ($old_data as $section => $values) {
66 if (!array_key_exists ($section, $data)) {
69 foreach ($values as $ref_id => $val) {
70 if (!array_key_exists ($ref_id, $data[$section])) {
73 $new_data[$section][$ref_id] = $data[$section][$ref_id] ;
77 if (getStringFromRequest('submit')) {
78 if (($role->getHomeProject() != NULL)
79 && ($role->getHomeProject()->getID() == $group_id)) {
80 $role_name = trim(getStringFromRequest('role_name'));
81 $public = getIntFromRequest('public') ? true : false ;
83 $role_name = $role->getName() ;
84 $public = $role->isPublic() ;
87 $error_msg .= _('Missing Role Name');
90 $role_id = $role->create($role_name, $data);
92 $error_msg .= $role->getErrorMessage();
94 $feedback = _('Successfully Created New Role');
97 if ($role instanceof RoleExplicit) {
98 $role->setPublic($public) ;
100 if (!$role->update($role_name, $data, false)) {
101 $error_msg .= $role->getErrorMessage();
103 $feedback = _('Successfully Updated Role');
110 $title= _('New Role');
112 $title= _('Edit Role');
114 $msg = _('Use this page to edit the permissions attached to each role. Note that each role has at least as much access as the Anonymous and LoggedIn roles. For example, if the Anonymous role has read access to a forum, all other roles will have it too.');
116 project_admin_header(array('title'=> $title, 'group'=>$group_id));
118 echo '<p>'.$msg.'</p>';
120 <form action="'.getStringFromServer('PHP_SELF').'?group_id='.$group_id.'&role_id='. $role_id .'" method="post">';
122 if ($role->getHomeProject() == NULL
123 || $role->getHomeProject()->getID() != $group_id) {
124 echo '<p><strong>'._('Role Name').'</strong></p>' ;
125 echo $role->getDisplayableName ($group) ;
127 echo '<p><strong>'._('Role Name').'</strong><br /><input type="text" name="role_name" value="'.$role->getName().'" required="required" /><br />' ;
128 echo '<input type="checkbox" name="public" value="1"' ;
129 if ($role->isPublic()) {
130 echo ' checked="checked"' ;
132 echo ' /> '._('Shared role (can be referenced by other projects)').'</p>' ;
135 $titles[]=_('Section');
136 $titles[]=_('Subsection');
137 $titles[]=_('Setting');
139 setup_rbac_strings();
141 echo $HTML->listTableTop($titles);
144 // Get the keys for this role and interate to build page
146 // Everything is built on the multi-dimensial arrays in the Role object
149 $keys = array_keys($role->getSettingsForProject ($group)) ;
151 foreach ($keys as $key) {
152 if (!in_array ($key, $role->global_settings)) {
157 for ($i=0; $i<count($keys); $i++) {
158 if ((!$group->usesForum() && preg_match("/forum/", $keys[$i])) ||
159 (!$group->usesTracker() && preg_match("/tracker/", $keys[$i])) ||
160 (!$group->usesPM() && preg_match("/pm/", $keys[$i])) ||
161 (!$group->usesFRS() && preg_match("/frs/", $keys[$i])) ||
162 (!$group->usesSCM() && preg_match("/scm/", $keys[$i])) ||
163 (!$group->usesDocman() && preg_match("/docman/", $keys[$i]))) {
164 // We don't display modules not used
168 if (preg_match("/^plugin_([a-z]*)/", $keys[$i], $matches)) {
170 if (!$group->usesPlugin($p)) {
171 // We don't display settings for unused plugins either
176 if ($keys[$i] == 'forum' || $keys[$i] == 'forumpublic' || $keys[$i] == 'forumanon') {
178 // Handle forum settings for all roles
181 if ($keys[$i] == 'forumanon') {
182 //skip as we have special case below
184 $res=db_query_params ('SELECT group_forum_id,forum_name
185 FROM forum_group_list WHERE group_id=$1',
187 for ($q=0; $q<db_numrows($res); $q++) {
189 // Special cases - when going through the keys, we want to show trackeranon
190 // on the same line as tracker public
192 if ($keys[$i] == 'forumpublic') {
193 $txt=' '.html_build_select_box_from_assoc(
194 $role->getRoleVals('forumanon'),
195 "data[forumanon][".db_result($res,$q,'group_forum_id')."]",
196 $role->getVal('forumanon',db_result($res,$q,'group_forum_id')),
201 echo '<tr ' . $HTML->boxGetAltRowStyle($j++) . '>
202 <td style="padding-left: 4em;">'.$rbac_edit_section_names[$keys[$i]].'</td>
203 <td>'.db_result($res,$q,'forum_name').'</td>
204 <td>'.html_build_select_box_from_assoc(
205 $role->getRoleVals($keys[$i]),
206 "data[".$keys[$i]."][".db_result($res,$q,'group_forum_id')."]",
207 $role->getVal($keys[$i],db_result($res,$q,'group_forum_id')),
208 false, false ). $txt .'</td></tr>';
212 // Handle task mgr settings for all roles
214 } elseif ($keys[$i] == 'pm' || $keys[$i] == 'pmpublic') {
216 $res=db_query_params ('SELECT group_project_id,project_name
217 FROM project_group_list WHERE group_id=$1',
219 for ($q=0; $q<db_numrows($res); $q++) {
220 echo '<tr '. $HTML->boxGetAltRowStyle($j++) . '>
221 <td style="padding-left: 4em;">'.$rbac_edit_section_names[$keys[$i]].'</td>
222 <td>'.db_result($res,$q,'project_name').'</td>
223 <td>'.html_build_select_box_from_assoc(
224 $role->getRoleVals($keys[$i]),
225 "data[".$keys[$i]."][".db_result($res,$q,'group_project_id')."]",
226 $role->getVal($keys[$i],db_result($res,$q,'group_project_id')),
227 false, false ).'</td></tr>';
231 // Handle tracker settings for all roles
233 } elseif ($keys[$i] == 'tracker' || $keys[$i] == 'trackerpublic' || $keys[$i] == 'trackeranon') {
235 if ($keys[$i] == 'trackeranon') {
236 //skip as we have special case below
238 $res=db_query_params ('SELECT group_artifact_id,name
239 FROM artifact_group_list WHERE group_id=$1',
241 for ($q=0; $q<db_numrows($res); $q++) {
243 // Special cases - when going through the keys, we want to show trackeranon
244 // on the same line as tracker public
246 if ($keys[$i] == 'trackerpublic') {
247 $txt = ' '.html_build_select_box_from_assoc(
248 $role->getRoleVals('trackeranon'),
249 "data[trackeranon][".db_result($res,$q,'group_artifact_id')."]",
250 $role->getVal('trackeranon',db_result($res,$q,'group_artifact_id')),
255 echo '<tr '. $HTML->boxGetAltRowStyle($j++) . '>
256 <td style="padding-left: 4em;">'.$rbac_edit_section_names[$keys[$i]].'</td>
257 <td>'.db_result($res,$q,'name').'</td>
258 <td>'.html_build_select_box_from_assoc(
259 $role->getRoleVals($keys[$i]),
260 "data[".$keys[$i]."][".db_result($res,$q,'group_artifact_id')."]",
261 $role->getVal($keys[$i],db_result($res,$q,'group_artifact_id')),
262 false, false ). $txt .'</td></tr>';
267 // File release system - each package can be public/private
269 } elseif ($keys[$i] == 'frspackage') {
271 $res=db_query_params ('SELECT package_id,name,is_public
272 FROM frs_package WHERE group_id=$1',
274 for ($q=0; $q<db_numrows($res); $q++) {
275 echo '<tr '. $HTML->boxGetAltRowStyle($j++) . '>
276 <td>'.$rbac_edit_section_names[$keys[$i]].'</td>
277 <td>'.db_result($res,$q,'name').'</td>
278 <td>'.html_build_select_box_from_assoc(
279 $role->getRoleVals($keys[$i]),
280 "data[".$keys[$i]."][".db_result($res,$q,'package_id')."]",
281 $role->getVal($keys[$i],db_result($res,$q,'package_id')),
282 false, false ).'</td></tr>';
286 // Handle all other settings for all roles
290 echo '<tr '. $HTML->boxGetAltRowStyle($j++) . '>
291 <td colspan="2"><strong>'.$rbac_edit_section_names[$keys[$i]].'</strong></td>
293 echo html_build_select_box_from_assoc($role->getRoleVals($keys[$i]), "data[".$keys[$i]."][$group_id]", $role->getVal($keys[$i],$group_id), false, false ) ;
301 echo $HTML->listTableBottom();
303 echo '<p><input type="submit" name="submit" value="'._('Submit').'" /></p>
306 project_admin_footer(array());
310 // c-file-style: "bsd"