FOSSology  4.4.0
Open Source License Compliance by Open Source Software
GroupController.php
Go to the documentation of this file.
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2021 Orange
4  SPDX-FileCopyrightText: © 2022 Samuel Dushimimana <dushsam100@gmail.com>
5  Author: Piotr Pszczola <piotr.pszczola@orange.com>
6 
7  SPDX-License-Identifier: GPL-2.0-only
8 */
14 namespace Fossology\UI\Api\Controllers;
15 
27 use Psr\Http\Message\ServerRequestInterface;
28 
34 {
35 
44  public function getGroups($request, $response, $args)
45  {
46  $userDao = $this->restHelper->getUserDao();
47  $groups = array();
48  if (Auth::isAdmin()) {
49  $groups = $userDao->getAdminGroupMap($this->restHelper->getUserId(),Auth::PERM_ADMIN);
50  } else {
51  $groups = $userDao->getUserGroupMap($this->restHelper->getUserId());
52  }
53  $groupList = array();
54  foreach ($groups as $key => $value) {
55  $groupObject = new Group($key,$value);
56  $groupList[] = $groupObject->getArray();
57  }
58  return $response->withJson($groupList, 200);
59  }
60 
70  public function createGroup($request, $response, $args)
71  {
72  $groupName = $request->getHeaderLine("name");
73  if (empty($request->getHeaderLine("name"))) {
74  throw new HttpBadRequestException("ERROR - no group name provided");
75  }
76  $userDao = $this->restHelper->getUserDao();
77  $groupId = $userDao->addGroup($groupName);
78  $userDao->addGroupMembership($groupId, $this->restHelper->getUserId());
79  $returnVal = new Info(200, "Group $groupName added.", InfoType::INFO);
80  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
81  }
82 
92  public function deleteGroup($request, $response, $args)
93  {
94  if (empty($args['id'])) {
95  throw new HttpBadRequestException("ERROR - no group id provided");
96  }
97  $userId = $this->restHelper->getUserId();
98 
100  $userDao = $this->restHelper->getUserDao();
101  $groupMap = $userDao->getDeletableAdminGroupMap($userId,
102  $_SESSION[Auth::USER_LEVEL]);
103  $groupId = intval($args['id']);
104 
105  if (!$this->dbHelper->doesIdExist("groups", "group_pk", $groupId)) {
106  throw new HttpNotFoundException("Group id not found!");
107  }
108  try {
109  $userDao->deleteGroup($groupId);
110  $returnVal = new Info(202, "User Group will be deleted", InfoType::INFO);
111  unset($groupMap[$groupId]);
112  } catch (\Exception $e) {
113  throw new HttpBadRequestException($e->getMessage(), $e);
114  }
115  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
116  }
117 
127  public function deleteGroupMember($request, $response, $args)
128  {
129  $dbManager = $this->dbHelper->getDbManager();
130 
131  $group_pk = intval($args['id']);
132  $user_pk = intval($args['userId']);
133 
134  $userIsAdmin = Auth::isAdmin();
135  $userHasGroupAccess = $this->restHelper->getUserDao()->isAdvisorOrAdmin(
136  $this->restHelper->getUserId(), $group_pk);
137 
138  if (!$this->dbHelper->doesIdExist("groups", "group_pk", $group_pk)) {
139  throw new HttpNotFoundException("Group id not found!");
140  }
141  if (!$this->dbHelper->doesIdExist("users", "user_pk", $user_pk)) {
142  throw new HttpNotFoundException("User id not found!");
143  }
144  if (! $userIsAdmin && ! $userHasGroupAccess) {
145  throw new HttpForbiddenException("Not advisor or admin of the group. " .
146  "Can not process request.");
147  }
148  $fetchResult = $dbManager->getSingleRow(
149  "SELECT group_user_member_pk FROM group_user_member " .
150  "WHERE group_fk=$1 AND user_fk=$2", [$group_pk, $user_pk],
151  __METHOD__ . ".getByGroupAndUser");
152  if (empty($fetchResult)) {
153  throw new HttpNotFoundException("Not a member!");
154  }
155  $group_user_member_pk = $fetchResult['group_user_member_pk'];
157  $adminGroupUsers = $this->restHelper->getPlugin('group_manage_users');
158  $adminGroupUsers->updateGUMPermission($group_user_member_pk, -1,$dbManager);
159  $returnVal = new Info(200, "User will be removed from group.", InfoType::INFO);
160  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
161  }
162 
171  public function getDeletableGroups($request, $response, $args)
172  {
173  $userId = $this->restHelper->getUserId();
174  /* @var $userDao UserDao */
175  $userDao = $this->restHelper->getUserDao();
176  $groupMap = $userDao->getDeletableAdminGroupMap($userId,
177  $_SESSION[Auth::USER_LEVEL]);
178 
179  $groupList = array();
180  foreach ($groupMap as $key => $value) {
181  $groupObject = new Group($key, $value);
182  $groupList[] = $groupObject->getArray();
183  }
184  return $response->withJson($groupList, 200);
185  }
186 
196  public function getGroupMembers($request, $response, $args)
197  {
198  $userId = $this->restHelper->getUserId();
199  $userDao = $this->restHelper->getUserDao();
200  $groupMap = $userDao->getAdminGroupMap($userId, $_SESSION[Auth::USER_LEVEL]);
201 
202  if (empty($groupMap)) {
203  throw new HttpForbiddenException("You have no permission to manage any group.");
204  }
205 
206  // Get the group id from the params
207  $groupId = intval($args['id']);
208 
209  // The query to get the list of users with corresponding roles from the group.
210  $dbManager = $this->dbHelper->getDbManager();
211 
212  $stmt = __METHOD__ . "getUsersWithGroup";
213  $dbManager->prepare($stmt, "SELECT user_pk, group_perm
214  FROM users INNER JOIN group_user_member gum ON gum.user_fk=users.user_pk AND gum.group_fk=$1;");
215 
216  $result = $dbManager->execute($stmt, array($groupId));
217  $usersWithGroup = $dbManager->fetchAll($result);
218 
219  // Convert back fields [user_pk , group_user_member_pk ,group_perm ] from String to Integer
220  $memberList = array();
221  foreach ($usersWithGroup as $record) {
222  $user = $this->dbHelper->getUsers($record['user_pk']);
223  $userGroupMember = new UserGroupMember($user[0],$record["group_perm"]);
224  $memberList[] = $userGroupMember->getArray();
225  }
226  $dbManager->freeResult($result);
227 
228  return $response->withJson($memberList, 200);
229  }
230 
231 
241  public function addMember($request, $response, $args)
242  {
243  $dbManager = $this->dbHelper->getDbManager();
244 
245  $body = $this->getParsedBody($request);
246 
247  $group_pk = intval($args['id']);
248  $newuser = intval($args['userId']);
249  $newperm = intval($body['perm']);
250 
251  $userIsAdmin = Auth::isAdmin();
252  $userHasGroupAccess = $this->restHelper->getUserDao()->isAdvisorOrAdmin(
253  $this->restHelper->getUserId(), $group_pk);
254 
255  if (!isset($newperm)) {
256  throw new HttpBadRequestException("ERROR - no default permission provided");
257  }
258  if (!$this->dbHelper->doesIdExist("groups", "group_pk", $group_pk)) {
259  throw new HttpNotFoundException("Group id not found!");
260  }
261  if (!$this->dbHelper->doesIdExist("users", "user_pk", $newuser)) {
262  throw new HttpNotFoundException("User id not found!");
263  }
264  if ($newperm < 0 || $newperm > 2) {
265  throw new HttpBadRequestException("ERROR - Permission should be in range [0-2]");
266  }
267  if (! $userIsAdmin && ! $userHasGroupAccess) {
268  throw new HttpForbiddenException("Not advisor or admin of the group. " .
269  "Can not process request.");
270  }
271  $stmt = __METHOD__ . ".getByGroupAndUser";
272  $sql = "SELECT group_user_member_pk FROM group_user_member WHERE group_fk=$1 AND user_fk=$2;";
273  $fetchResult = $dbManager->getSingleRow($sql, [$group_pk, $newuser], $stmt);
274 
275  // Do not produce duplicate
276  if (!empty($fetchResult)) {
277  throw new HttpBadRequestException("Already a member!");
278  }
279  $dbManager->prepare($stmt = __METHOD__ . ".insertGUP",
280  "INSERT INTO group_user_member (group_fk, user_fk, group_perm) VALUES ($1,$2,$3)");
281  $dbManager->freeResult(
282  $dbManager->execute($stmt, array($group_pk, $newuser, $newperm)));
283 
284  $returnVal = new Info(200, "User will be added to group.", InfoType::INFO);
285  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
286  }
287 
297  public function changeUserPermission($request, $response, $args)
298  {
299  // Extract all prerequisites (dbManager , user_pk , new_permission , group_pk ) for this functionality
300  $dbManager = $this->dbHelper->getDbManager();
301  $user_pk = intval($args['userId']);
302  $newperm = intval($this->getParsedBody($request)['perm']);
303  $group_pk = intval($args['id']);
304  $userIsAdmin = Auth::isAdmin();
305  $userHasGroupAccess = $this->restHelper->getUserDao()->isAdvisorOrAdmin(
306  $this->restHelper->getUserId(), $group_pk);
307 
308  // Validate arguments
309 
310  if (!isset($newperm)) {
311  throw new HttpBadRequestException("Permission should be provided");
312  }
313  if (!$this->dbHelper->doesIdExist("groups", "group_pk", $group_pk)) {
314  throw new HttpNotFoundException("Group id not found!");
315  }
316  if (!$this->dbHelper->doesIdExist("users", "user_pk", $user_pk)) {
317  throw new HttpNotFoundException("User id not found!");
318  }
319  if ($newperm < 0) {
320  throw new HttpBadRequestException("Permission can not be negative");
321  }
322  if ($newperm > 2) {
323  throw new HttpBadRequestException("Permission can not be greater than 2");
324  }
325  if (! $userIsAdmin && ! $userHasGroupAccess) {
326  throw new HttpForbiddenException("Not advisor or admin of the group. " .
327  "Can not process request.");
328  }
329 
330  // Check if the relation already exists, retrieve the PK.
331  // IF not, return 404 error
332  $group_user_member_pk = $dbManager->getSingleRow("SELECT group_user_member_pk FROM group_user_member WHERE group_fk=$1 AND user_fk=$2",
333  [$group_pk, $user_pk],
334  __METHOD__ . ".getByGroupAndUser")['group_user_member_pk'];
335 
336  if (empty($group_user_member_pk)) {
337  throw new HttpNotFoundException("User not part of the group");
338  }
340  $adminGroupUsers = $this->restHelper->getPlugin('group_manage_users');
341  $adminGroupUsers->updateGUMPermission($group_user_member_pk, $newperm,$dbManager);
342  $info = new Info(202, "Permission updated successfully.", InfoType::INFO);
343  return $response->withJson($info->getArray(), $info->getCode());
344  }
345 }
Contains the constants and helpers for authentication of user.
Definition: Auth.php:24
static isAdmin()
Check if user is admin.
Definition: Auth.php:92
getDeletableGroups($request, $response, $args)
Base controller for REST calls.
getParsedBody(ServerRequestInterface $request)
Parse request body as JSON and return associative PHP array.
Override Slim response for withJson function.
Different type of infos provided by REST.
Definition: InfoType.php:16
Info model to contain general error and return values.
Definition: Info.php:19