3 * Project Admin Users Page
5 * Copyright 2004 GForge, LLC
6 * Copyright 2006 federicot
8 * Thorsten Glaser <t.glaser@tarent.de>
9 * Copyright 2011, Roland Mas
10 * All rights reserved.
11 * http://fusionforge.org
13 * This file is part of FusionForge. FusionForge is free software;
14 * you can redistribute it and/or modify it under the terms of the
15 * GNU General Public License as published by the Free Software
16 * Foundation; either version 2 of the Licence, or (at your option)
19 * FusionForge is distributed in the hope that it will be useful,
20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 * GNU General Public License for more details.
24 * You should have received a copy of the GNU General Public License along
25 * with FusionForge; if not, write to the Free Software Foundation, Inc.,
26 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
28 * This page contains administrative information for the project as well
29 * as allows to manage it. This page should be accessible to all project
30 * members, but only admins may perform most functions.
33 require_once('../../env.inc.php');
34 require_once $gfcommon.'include/pre.php';
35 require_once $gfwww.'project/admin/project_admin_utils.php';
36 require_once $gfwww.'include/role_utils.php';
37 require_once $gfcommon.'include/account.php';
38 require_once $gfcommon.'include/GroupJoinRequest.class.php';
40 $group_id = getIntFromRequest('group_id');
42 session_require_perm ('project_admin', $group_id) ;
44 // get current information
45 $group = group_get_object($group_id);
46 if (!$group || !is_object($group)) {
48 } elseif ($group->isError()) {
49 exit_error($group->getErrorMessage(),'admin');
52 // Add hook to replace users managements by a plugin.
54 if (plugin_hook_listeners("project_admin_users") > 0) {
55 $hook_params = array () ;
56 $hook_params['group_id'] = $group_id ;
57 plugin_hook ("project_admin_users", $hook_params);
60 function cache_external_roles () {
61 global $used_external_roles, $unused_external_roles, $group, $group_id;
63 $unused_external_roles = array () ;
64 foreach (RBACEngine::getInstance()->getPublicRoles() as $r) {
65 $grs = $r->getLinkedProjects () ;
67 foreach ($grs as $g) {
68 if ($g->getID() == $group_id) {
74 $unused_external_roles[] = $r ;
77 $used_external_roles = array () ;
78 foreach ($group->getRoles() as $r) {
79 if ($r->getHomeProject() == NULL
80 || $r->getHomeProject()->getID() != $group_id) {
81 $used_external_roles[] = $r ;
85 sortRoleList ($used_external_roles, $group, 'composite') ;
86 sortRoleList ($unused_external_roles, $group, 'composite') ;
90 cache_external_roles () ;
92 if (getStringFromRequest('submit')) {
93 if (getStringFromRequest('adduser')) {
94 /* Add user to this project */
95 $form_unix_name = getStringFromRequest('form_unix_name');
96 $user_object = &user_get_object_by_name($form_unix_name);
97 if ($user_object === false) {
98 $warning_msg .= _('No Matching Users Found');
100 $role_id = getIntFromRequest('role_id');
102 $warning_msg .= _('Role not selected');
104 $user_id = $user_object->getID();
105 if (!$group->addUser($form_unix_name,$role_id)) {
106 $error_msg = $group->getErrorMessage();
108 $feedback = _("Member Added Successfully");
109 //if the user have requested to join this group
110 //we should remove him from the request list
111 //since it has already been added
112 $gjr=new GroupJoinRequest($group,$user_id);
113 if ($gjr || is_object($gjr) || !$gjr->isError()) {
119 } else if (getStringFromRequest('rmuser')) {
120 /* Remove a member from this project */
121 $user_id = getIntFromRequest('user_id');
122 $role_id = getIntFromRequest('role_id');
123 $role = RBACEngine::getInstance()->getRoleById($role_id) ;
124 if ($role->getHomeProject() == NULL) {
125 session_require_global_perm ('forge_admin') ;
127 session_require_perm ('project_admin', $role->getHomeProject()->getID()) ;
129 if (!$role->removeUser (user_get_object ($user_id))) {
130 $error_msg = $role->getErrorMessage() ;
132 $feedback = _("Member Removed Successfully");
134 } else if (getStringFromRequest('updateuser')) {
135 /* Adjust Member Role */
136 $user_id = getIntFromRequest('user_id');
137 $role_id = getIntFromRequest('role_id');
139 $error_msg = _("Role not selected");
142 if (!$group->updateUser($user_id,$role_id)) {
143 $error_msg = $group->getErrorMessage();
145 $feedback = _("Member Updated Successfully");
148 } elseif (getStringFromRequest('acceptpending')) {
149 /* Add user to this project */
150 $role_id = getIntFromRequest('role_id');
152 $warning_msg .= _("Role not selected");
154 $form_userid = getIntFromRequest('form_userid');
155 $form_unix_name = getStringFromRequest('form_unix_name');
156 if (!$group->addUser($form_unix_name,$role_id)) {
157 $error_msg = $group->getErrorMessage();
159 $gjr=new GroupJoinRequest($group,$form_userid);
160 if (!$gjr || !is_object($gjr) || $gjr->isError()) {
161 $error_msg = _('Error Getting GroupJoinRequest');
165 $feedback = _("Member Added Successfully");
168 } elseif (getStringFromRequest('rejectpending')) {
169 /* Reject adding user to this project */
170 $form_userid = getIntFromRequest('form_userid');
171 $gjr=new GroupJoinRequest($group,$form_userid);
172 if (!$gjr || !is_object($gjr) || $gjr->isError()) {
173 $error_msg .= _('Error Getting GroupJoinRequest');
175 if (!$gjr->reject()) {
176 $error_msg = $gjr->getErrorMessage();
178 $feedback .= 'Rejected';
181 } else if (getStringFromRequest('linkrole')) {
182 /* link a role to this project */
183 $role_id = getIntFromRequest('role_id');
184 foreach ($unused_external_roles as $r) {
185 if ($r->getID() == $role_id) {
186 if (!$r->linkProject($group)) {
187 $error_msg = $r->getErrorMessage();
189 $feedback = _("Role linked successfully");
190 cache_external_roles () ;
194 } else if (getStringFromRequest('unlinkrole')) {
195 /* unlink a role from this project */
196 $role_id = getIntFromRequest('role_id');
197 foreach ($used_external_roles as $r) {
198 if ($r->getID() == $role_id) {
199 if (!$r->unLinkProject($group)) {
200 $error_msg = $r->getErrorMessage();
202 $feedback = _("Role unlinked successfully");
203 cache_external_roles () ;
210 $group->clearError();
212 project_admin_header(array('title'=>sprintf(_('Members of %s'), $group->getPublicName()),'group'=>$group->getID()));
216 <table width="100%" cellpadding="2" cellspacing="2">
218 <td width="50%"><?php
222 $reqs =& get_group_join_requests($group);
223 if (count($reqs) > 0) {
224 echo $HTML->boxTop(_("Pending Membership Requests"));
225 for ($i=0; $i<count($reqs); $i++) {
226 $user =& user_get_object($reqs[$i]->getUserId());
227 if (!$user || !is_object($user)) {
231 <form action="<?php echo getStringFromServer('PHP_SELF').'?group_id='.$group_id; ?>"
233 <input type="hidden" name="submit" value="y" />
234 <input type="hidden" name="form_userid" value="<?php echo $user->getId(); ?>" />
235 <input type="hidden" name="form_unix_name" value="<?php echo $user->getUnixName(); ?>" />
238 <td style="white-space: nowrap;"><a
240 echo $user->getUnixName();
241 ?>"><?php echo $user->getRealName(); ?></a>
243 <td style="white-space: nowrap; text-align: right;"><?php
244 echo role_box($group_id,'role_id'); ?>
245 <input type="submit" name="acceptpending"
246 value="<?php echo _("Accept") ?>" />
247 <input type="submit" name="rejectpending"
248 value="<?php echo _("Reject") ?>" />
257 echo $HTML->boxMiddle(_("Add Member"));
259 echo $HTML->boxTop(_("Add Member"));
262 if (isset($html_code['add_user'])) {
263 echo $html_code['add_user'];
271 action="<?php echo getStringFromServer('PHP_SELF').'?group_id='.$group_id; ?>"
273 <input type="hidden" name="submit" value="y" />
274 <div style="float:left;">
275 <input type="text" name="form_unix_name" size="16" value="" />
276 </div><div style="float:right;">
277 <?php echo role_box($group_id,'role_id'); ?>
278 <input type="submit" name="adduser" value="<?php echo _("Add Member") ?>" />
281 <div style="clear:both;">
282 <a href="massadd.php?group_id=<?php echo $group_id; ?>">
283 <?php echo _("Add Users From List"); ?>
289 echo $HTML->boxMiddle(_("Current Project Members"));
293 Show the members of this project
297 $members = $group->getUsers() ;
299 echo '<table width="100%"><thead><tr>';
300 echo '<th>'._('User name').'</th>';
301 echo '<th>'._('Role').'</th>';
302 echo '<th style="text-align:right">'._('Action').'</th>';
303 echo '</tr></thead><tbody>';
306 foreach ($members as $user) {
310 foreach (RBACEngine::getInstance()->getAvailableRolesForUser ($user) as $role) {
311 if ($role->getHomeProject() && $role->getHomeProject()->getID() == $group->getID()) {
316 sortRoleList ($roles) ;
319 foreach ($roles as $role) {
320 echo '<tr '. $HTML->boxGetAltRowStyle($i) . '>' ;
322 echo '<td style="white-space: nowrap;" rowspan="'.(count($roles)+1).'">
323 <a href="/users/'.$user->getUnixName().'">';
324 $display = $user->getRealName();
325 if (!empty($display)) {
326 echo $user->getRealName();
328 echo $user->getUnixName();
334 echo '<td colspan="2">
335 <div style="float:left;">
336 ' . $role->getName() . '
337 </div><div style="float:right;">
338 <form action="'.getStringFromServer('PHP_SELF').'" method="post">
339 <input type="hidden" name="submit" value="y" />
340 <input type="hidden" name="username" value="'.$user->getUnixName() // Functionally ignored, only used for testsuite
342 <input type="hidden" name="user_id" value="'.$user->getID().'" />
343 <input type="hidden" name="group_id" value="'. $group_id .'" />
344 <input type="hidden" name="role_id" value="'.$role->getID().'" />
345 <input type="submit" name="rmuser" value="'._("Remove").'" />
350 echo '<tr '. $HTML->boxGetAltRowStyle($i) . '><td colspan="2">
351 <form action="'.getStringFromServer('PHP_SELF').'" method="post">
352 <input type="hidden" name="submit" value="y" />
353 <input type="hidden" name="form_unix_name" value="'.$user->getUnixName().'" />
354 <input type="hidden" name="group_id" value="'. $group_id .'" />
355 <div style="float:left;">
356 ' . role_box($group_id,'role_id',$role->getID()) . '
357 </div><div style="float:right;">
358 <input type="submit" name="adduser" value="'._("Grant extra role").'" />
362 echo '</tbody></table>';
364 echo $HTML->boxBottom();
376 // RBAC Editing Functions
378 echo $HTML->boxTop(_("Edit Roles"));
380 echo '<table width="100%"><thead><tr>';
381 echo '<th>'._('Role name').'</th>';
382 echo '<th style="text-align:right">'._('Action').'</th>';
383 echo '</tr></thead><tbody>';
385 $roles = $group->getRoles() ;
386 sortRoleList ($roles, $group, 'composite') ;
388 foreach ($roles as $r) {
389 /* this would work, but only here, not below the foreach */
391 // <td>'.$r->getDisplayableName($group).'</td>
392 // <td><form action="roleedit.php?group_id='. $group_id .'" method="post">
393 // <input type="hidden" name="role_id" value="'.$r->getID().'" />
394 // <input type="submit" name="edit" value="'._("Edit Permissions").'" />
397 /* but doesn't look as well as using the same method everywhere */
398 echo '<tr><td colspan="2">
399 <form action="roleedit.php?group_id='. $group_id .'" method="post">
400 <div style="float:left;">
401 '.$r->getDisplayableName($group).'
402 </div><div style="float:right;">
403 <input type="hidden" name="role_id" value="'.$r->getID().'" />
404 <input type="submit" name="edit" value="'._("Edit Permissions").'" />
408 if ($r->getHomeProject() != NULL && $r->getHomeProject()->getId() == $group_id) {
409 echo '<form action="roledelete.php?group_id='. $group_id .'" method="post">
410 <div style="float:right;">
411 <input type="hidden" name="role_id" value="'.$r->getID().'" />
412 <input type="submit" name="delete" value="'._("Delete role").'" />
420 /* note: we cannot put the form outside of a td here */
421 echo '<tr><td colspan="2">
422 <form action="roleedit.php?group_id='. $group_id .'" method="post">
423 <div style="float:left;">
424 <input type="text" name="role_name" size="10" value="" />
425 </div><div style="float:right;">
426 <input type="submit" name="add" value="'._("Create Role").'" />
431 echo '</tbody></table>' ;
434 <form action="roleedit.php?group_id='. $group_id .'&role_id=observer" method="post">
435 <p><input type="submit" name="edit" value="'._("Edit Observer").'" /></p>
438 if (count ($used_external_roles)) {
439 echo $HTML->boxMiddle(_("Currently used external roles"));
440 echo '<table width="100%"><thead><tr>';
441 echo '<th>'._('Role name').'</th>';
442 echo '<th style="text-align:right">'._('Action').'</th>';
443 echo '</tr></thead><tbody>';
445 foreach ($used_external_roles as $r) {
446 echo '<tr><td colspan="2">
447 <form action="'.getStringFromServer('PHP_SELF').'" method="post">
448 <input type="hidden" name="submit" value="y" />
449 <input type="hidden" name="role_id" value="'.$r->getID().'" />
450 <input type="hidden" name="group_id" value="'.$group_id.'" />
451 <div style="float:left;">
452 ' . $r->getDisplayableName($group) . '
453 </div><div style="float:right;">
454 <input type="submit" name="unlinkrole" value="'._("Unlink Role").'" />
459 echo '</tbody></table>' ;
462 if (count ($unused_external_roles)) {
463 echo $HTML->boxMiddle(_("Available external roles"));
464 echo '<table width="100%"><thead><tr>';
465 echo '<th>'._('Role name').'</th>';
466 echo '<th style="text-align:right">'._('Action').'</th>';
467 echo '</tr></thead><tbody>';
471 foreach ($unused_external_roles as $r) {
472 $ids[] = $r->getID() ;
473 $names[] = $r->getDisplayableName($group) ;
475 echo '<tr><td colspan="2">
476 <form action="'.getStringFromServer('PHP_SELF').'" method="post">
477 <input type="hidden" name="submit" value="y" />
478 <input type="hidden" name="group_id" value="'.$group_id.'" />
479 <div style="float:left;">
481 echo html_build_select_box_from_arrays($ids,$names,'role_id','',false,'',false,'');
483 </div><div style="float:right;">
484 <input type="submit" name="linkrole" value="'._("Link external role").'" />
488 echo '</tbody></table>' ;
491 echo $HTML->boxBottom();
499 project_admin_footer(array());
503 // c-file-style: "bsd"