FOSSology  4.4.0
Open Source License Compliance by Open Source Software
AdminGroupUsers.php
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2014-2015, 2018 Siemens AG
4  Author: Steffen Weber
5  SPDX-FileCopyrightText: © 2021-2022 Orange
6  Contributors: Piotr Pszczola, Bartlomiej Drozdz
7 
8  SPDX-License-Identifier: GPL-2.0-only
9 */
10 
11 namespace Fossology\UI\Page;
12 
16 use Symfony\Component\HttpFoundation\Request;
17 use Symfony\Component\HttpFoundation\Response;
18 
24 {
25  var $groupPermissions = array(-1 => "None", UserDao::USER => "User",
26  UserDao::ADMIN => "Admin", UserDao::ADVISOR => "Advisor");
27  const NAME = 'group_manage_users';
28 
29  function __construct()
30  {
31  parent::__construct(self::NAME, array(
32  self::TITLE => _("Manage Group Users"),
33  self::MENU_LIST => "Admin::Groups::Manage Group Users",
34  self::PERMISSION => Auth::PERM_WRITE,
35  self::REQUIRES_LOGIN => TRUE
36  ));
37  }
38 
43  protected function handle(Request $request)
44  {
45  $userId = Auth::getUserId();
47  $userDao = $this->getObject('dao.user');
48  $groupMap = $userDao->getAdminGroupMap($userId, $_SESSION[Auth::USER_LEVEL]);
49  if (empty($groupMap)) {
50  $text = _("You have no permission to manage any group.");
51  return $this->render('include/base.html.twig', $this->mergeWithDefault(array('message' => $text)));
52  }
54  $dbManager = $this->getObject('db.manager');
55  $group_pk = intval($request->get('group'));
56  if (empty($group_pk) || !array_key_exists($group_pk, $groupMap)) {
57  $group_pk = key($groupMap);
58  }
59 
60  $gum_pk = intval($request->get('gum_pk'));
61  $text = "";
62  if ($gum_pk) {
63  $perm = intval($request->get('perm'));
64  $atleastOneUserShouldBePart = $dbManager->getSingleRow("SELECT count(*) cnt FROM group_user_member WHERE group_fk = (SELECT group_fk FROM group_user_member WHERE group_user_member_pk = $1)",
65  array($gum_pk), $stmt = __METHOD__ . ".atleastOneUserShouldBePart");
66  if ($atleastOneUserShouldBePart['cnt'] <= 1) {
67  $text = _("Error: atleast one user should be part of a group.");
68  } else {
69  $this->updateGUMPermission($gum_pk, $perm,$dbManager);
70  }
71  $groupMap = $userDao->getAdminGroupMap($userId,
72  $_SESSION[Auth::USER_LEVEL]);
73  }
74 
75  $newuser = intval($request->get('newuser'));
76  $newperm = intval($request->get('newperm'));
77 
78  if ($newuser && $group_pk) {
79  // do not produce duplicate
80  $dbManager->prepare($stmt = __METHOD__ . ".delByGroupAndUser",
81  "delete from group_user_member where group_fk=$1 and user_fk=$2");
82  $dbManager->freeResult(
83  $dbManager->execute($stmt, array($group_pk, $newuser)));
84  if ($newperm >= 0) {
85  $dbManager->prepare($stmt = __METHOD__ . ".insertGUP",
86  "insert into group_user_member (group_fk, user_fk, group_perm) values ($1,$2,$3)");
87  $dbManager->freeResult(
88  $dbManager->execute($stmt, array($group_pk, $newuser, $newperm)));
89  }
90  if ($newuser == $userId) {
91  $groupMap = $userDao->getAdminGroupMap($userId, $_SESSION[Auth::USER_LEVEL]);
92  }
93  $newperm = $newuser = 0;
94  }
95 
96  natcasesort($groupMap);
97  $baseUrl = Traceback_uri() . "?mod=" . $this->getName() . '&group=';
98  $onchange = "onchange=\"js_url(this.value, '$baseUrl')\"";
99  $baseUrl .= $group_pk;
100  $vars = array('groupMap' => $groupMap,
101  'groupId' => $group_pk,
102  'permissionMap' => $this->groupPermissions,
103  'baseUrl' => $baseUrl,
104  'groupMapAction' => $onchange);
105 
106  $stmt = __METHOD__ . "getUsersWithGroup";
107  $dbManager->prepare($stmt, "select user_pk, user_name, user_status, user_desc, group_user_member_pk, group_perm
108  FROM users LEFT JOIN group_user_member gum ON gum.user_fk=users.user_pk AND gum.group_fk=$1
109  ORDER BY user_name");
110  $result = $dbManager->execute($stmt, array($group_pk));
111  $vars['usersWithGroup'] = $dbManager->fetchAll($result);
112  $dbManager->freeResult($result);
113 
114  $otherUsers = array('0' => '');
115  foreach ($vars['usersWithGroup'] as $row) {
116  if ($row['group_user_member_pk'] || $row['user_status']!='active') {
117  continue;
118  }
119  $otherUsers[$row['user_pk']] = !empty($row['user_desc']) ? $row['user_desc']. ' ('. $row['user_name'] .')' : $row['user_name'];
120  }
121 
122  $vars['existsOtherUsers'] = count($otherUsers) - 1;
123  if ($vars['existsOtherUsers']) {
124  $vars['newPermissionMap'] = $this->groupPermissions;
125  unset($vars['newPermissionMap'][-1]);
126  $script = "var newpermurl;
127  function setNewPermUrl(newperm){
128  newpermurl='" . $baseUrl . "&newperm='+newperm+'&newuser=';
129  }
130  setNewPermUrl($newperm);";
131  $scripts = js_url() . '<script type="text/javascript"> ' . $script . '</script>';
132  $vars['otherUsers'] = $otherUsers;
133  } else {
134  $scripts = js_url();
135  }
136 
137  $vars['scripts'] = $scripts;
138  if (!empty($text)) {
139  $vars['message'] .= $text;
140  }
141  return $this->render('admin_group_users.html.twig', $this->mergeWithDefault($vars));
142  }
143 
144  public function updateGUMPermission($gum_pk, $perm,$dbManager)
145  {
146  if ($perm === -1) {
147  $dbManager->prepare($stmt = __METHOD__ . ".delByGUM",
148  "DELETE FROM group_user_member WHERE group_user_member_pk=$1 RETURNING user_fk, group_fk");
149  $deletedEntry = $dbManager->execute($stmt, array($gum_pk));
150  $effectedUser = $dbManager->fetchArray($deletedEntry);
151  $isEffected = $dbManager->getSingleRow("SELECT count(*) cnt FROM users WHERE user_pk=$1 AND group_fk = $2",
152  array($effectedUser['user_fk'], $effectedUser['group_fk']), $stmt = __METHOD__ . ".isUserEffectedFromRemoval");
153  if ($isEffected['cnt'] == 1) {
154  $dbManager->getSingleRow("UPDATE users SET group_fk = (
155  SELECT group_fk FROM group_user_member WHERE user_fk = $1 AND group_perm >= 0 LIMIT 1)
156  WHERE user_pk = $1",
157  array($effectedUser['user_fk']), $stmt = __METHOD__ . ".setNewGroupId");
158  }
159  $dbManager->freeResult($deletedEntry);
160  } else if (array_key_exists($perm, $this->groupPermissions)) {
161  $dbManager->getSingleRow("UPDATE group_user_member SET group_perm=$1 WHERE group_user_member_pk=$2",
162  array($perm, $gum_pk), $stmt = __METHOD__ . ".updatePermInGUM");
163  }
164  }
165 }
166 
167 register_plugin(new AdminGroupUsers());
Contains the constants and helpers for authentication of user.
Definition: Auth.php:24
static getUserId()
Get the current user's id.
Definition: Auth.php:68
render($templateName, $vars=null, $headers=null)
js_url()
Load a new url.
Traceback_uri()
Get the URI without query to this location.
Definition: common-parm.php:97