FOSSology  4.7.1
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 
29 use Psr\Http\Message\ServerRequestInterface;
30 
36 {
37 
46  public function getGroups($request, $response, $args)
47  {
48  $userDao = $this->restHelper->getUserDao();
49  $groups = array();
50  if (Auth::isAdmin()) {
51  $groups = $userDao->getAdminGroupMap($this->restHelper->getUserId(),Auth::PERM_ADMIN);
52  } else {
53  $groups = $userDao->getUserGroupMap($this->restHelper->getUserId());
54  }
55  $groupList = array();
56  foreach ($groups as $key => $value) {
57  $groupObject = new Group($key,$value);
58  $groupList[] = $groupObject->getArray();
59  }
60  return $response->withJson($groupList, 200);
61  }
62 
72  public function createGroup($request, $response, $args)
73  {
74  $apiVersion = ApiVersion::getVersion($request);
75  $groupName = '';
76  if ($apiVersion == ApiVersion::V2) {
77  $queryParams = $request->getQueryParams();
78  $groupName = $queryParams['name'] ?? '';
79  } else {
80  $groupName = $request->getHeaderLine('name') ?: '';
81  }
82  if (empty($groupName)) {
83  throw new HttpBadRequestException("ERROR - no group name provided");
84  }
85  $userDao = $this->restHelper->getUserDao();
86  $groupId = $userDao->addGroup($groupName);
87  $userDao->addGroupMembership($groupId, $this->restHelper->getUserId());
88  $statusCode = $apiVersion == ApiVersion::V2 ? 201 : 200;
89  $returnVal = new Info($statusCode, "Group $groupName added.", InfoType::INFO);
90  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
91  }
92 
102  public function deleteGroup($request, $response, $args)
103  {
104  $apiVersion = ApiVersion::getVersion($request);
105  if (empty($args['pathParam'])) {
106  throw new HttpBadRequestException("ERROR - No group name or id provided");
107  }
108  $userId = $this->restHelper->getUserId();
109 
111  $userDao = $this->restHelper->getUserDao();
112  $groupMap = $userDao->getDeletableAdminGroupMap($userId,
113  $_SESSION[Auth::USER_LEVEL]);
114  $groupId = null;
115  if ($apiVersion == ApiVersion::V2) {
116  $groupName = $args['pathParam'];
117  $groupId = intval($userDao->getGroupIdByName($groupName));
118  } else {
119  $groupId = intval($args['pathParam']);
120  }
121 
122  if (!$this->dbHelper->doesIdExist("groups", "group_pk", $groupId)) {
123  throw new HttpNotFoundException("Group id not found!");
124  }
125  try {
126  $userDao->deleteGroup($groupId);
127  $returnVal = new Info(202, "User Group will be deleted", InfoType::INFO);
128  unset($groupMap[$groupId]);
129  } catch (\Exception $e) {
130  throw new HttpBadRequestException($e->getMessage(), $e);
131  }
132  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
133  }
134 
144  public function updateGroup($request, $response, $args)
145  {
146  $apiVersion = ApiVersion::getVersion($request);
147  if (empty($args['pathParam'])) {
148  throw new HttpBadRequestException("ERROR - No group name or id provided");
149  }
150  $newGroupName = trim($this->getParsedBody($request)['name'] ?? '');
151  if (empty($newGroupName)) {
152  throw new HttpBadRequestException("ERROR - no group name provided");
153  }
155  $adminGroupEdit = $this->restHelper->getPlugin('group_edit');
156  $validationError = $adminGroupEdit->validateGroupName($newGroupName);
157  if (!empty($validationError)) {
158  throw new HttpBadRequestException($validationError);
159  }
160 
162  $userDao = $this->restHelper->getUserDao();
163  $groupId = null;
164  if ($apiVersion == ApiVersion::V2) {
165  $groupId = intval($userDao->getGroupIdByName($args['pathParam']));
166  } else {
167  $groupId = intval($args['pathParam']);
168  }
169 
170  if (!$this->dbHelper->doesIdExist("groups", "group_pk", $groupId)) {
171  throw new HttpNotFoundException("Group id not found!");
172  }
173  $groupMap = $userDao->getDeletableAdminGroupMap($this->restHelper->getUserId(),
174  $_SESSION[Auth::USER_LEVEL]);
175  if (!array_key_exists($groupId, $groupMap)) {
176  throw new HttpForbiddenException("Not admin of the group. " .
177  "Can not process request.");
178  }
179  try {
180  $userDao->editGroup($groupId, $newGroupName);
181  } catch (\Exception $e) {
182  throw new HttpConflictException($e->getMessage(), $e);
183  }
184  $returnVal = new Info(200, "Group $newGroupName updated.", InfoType::INFO);
185  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
186  }
187 
197  public function deleteGroupMember($request, $response, $args)
198  {
199  $apiVersion = ApiVersion::getVersion($request);
200  $dbManager = $this->dbHelper->getDbManager();
201 
202  $user_pk = null;
203  $group_pk = null;
204  if ($apiVersion == ApiVersion::V2) {
205  $user = $this->restHelper->getUserDao()->getUserByName($args['userPathParam']);
206  if ($user === null) {
207  throw new HttpNotFoundException("User not found");
208  }
209  $user_pk = intval($user['user_pk']);
210  $group_pk = intval($this->restHelper->getUserDao()->getGroupIdByName($args['pathParam']));
211  } else {
212  $user_pk = intval($args['userPathParam']);
213  $group_pk = intval($args['pathParam']);
214  }
215 
216  $userIsAdmin = Auth::isAdmin();
217  $userHasGroupAccess = $this->restHelper->getUserDao()->isAdvisorOrAdmin(
218  $this->restHelper->getUserId(), $group_pk);
219 
220  if (!$this->dbHelper->doesIdExist("groups", "group_pk", $group_pk)) {
221  throw new HttpNotFoundException("Group id not found!");
222  }
223  if (!$this->dbHelper->doesIdExist("users", "user_pk", $user_pk)) {
224  throw new HttpNotFoundException("User id not found!");
225  }
226  if (! $userIsAdmin && ! $userHasGroupAccess) {
227  throw new HttpForbiddenException("Not advisor or admin of the group. " .
228  "Can not process request.");
229  }
230  $fetchResult = $dbManager->getSingleRow(
231  "SELECT group_user_member_pk FROM group_user_member " .
232  "WHERE group_fk=$1 AND user_fk=$2", [$group_pk, $user_pk],
233  __METHOD__ . ".getByGroupAndUser");
234  if (empty($fetchResult)) {
235  throw new HttpNotFoundException("Not a member!");
236  }
237  $group_user_member_pk = $fetchResult['group_user_member_pk'];
239  $adminGroupUsers = $this->restHelper->getPlugin('group_manage_users');
240  $adminGroupUsers->updateGUMPermission($group_user_member_pk, -1,$dbManager);
241  $returnVal = new Info(202, "User will be removed from group.", InfoType::INFO);
242  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
243  }
244 
253  public function getDeletableGroups($request, $response, $args)
254  {
255  $userId = $this->restHelper->getUserId();
256  /* @var $userDao UserDao */
257  $userDao = $this->restHelper->getUserDao();
258  $groupMap = $userDao->getDeletableAdminGroupMap($userId,
259  $_SESSION[Auth::USER_LEVEL]);
260 
261  $groupList = array();
262  foreach ($groupMap as $key => $value) {
263  $groupObject = new Group($key, $value);
264  $groupList[] = $groupObject->getArray();
265  }
266  return $response->withJson($groupList, 200);
267  }
268 
278  public function getGroupMembers($request, $response, $args)
279  {
280  $apiVersion = ApiVersion::getVersion($request);
281  $userId = $this->restHelper->getUserId();
282  $userDao = $this->restHelper->getUserDao();
283  $groupMap = $userDao->getAdminGroupMap($userId, $_SESSION[Auth::USER_LEVEL]);
284 
285  if (empty($groupMap)) {
286  throw new HttpForbiddenException("You have no permission to manage any group.");
287  }
288 
289  // Get the group name/id form the params and then the group Id
290  $groupId = $apiVersion == ApiVersion::V2 ? intval($this->restHelper->getUserDao()->getGroupIdByName($args['pathParam'])) : intval($args['pathParam']);
291 
292  // The query to get the list of users with corresponding roles from the group.
293  $dbManager = $this->dbHelper->getDbManager();
294 
295  $stmt = __METHOD__ . "getUsersWithGroup";
296  $dbManager->prepare($stmt, "SELECT user_pk, group_perm
297  FROM users INNER JOIN group_user_member gum ON gum.user_fk=users.user_pk AND gum.group_fk=$1;");
298 
299  $result = $dbManager->execute($stmt, array($groupId));
300  $usersWithGroup = $dbManager->fetchAll($result);
301 
302  // Convert back fields [user_pk , group_user_member_pk ,group_perm ] from String to Integer
303  $memberList = array();
304  foreach ($usersWithGroup as $record) {
305  $user = $this->dbHelper->getUsers($record['user_pk']);
306  $userGroupMember = new UserGroupMember($user[0],$record["group_perm"]);
307  $memberList[] = $userGroupMember->getArray(ApiVersion::getVersion($request));
308  }
309  $dbManager->freeResult($result);
310 
311  return $response->withJson($memberList, 200);
312  }
313 
314 
324  public function addMember($request, $response, $args)
325  {
326  $apiVersion = ApiVersion::getVersion($request);
327  $dbManager = $this->dbHelper->getDbManager();
328 
329  $body = $this->getParsedBody($request);
330  $newuser = null;
331  $group_pk = null;
332  if ($apiVersion == ApiVersion::V2) {
333  $user = $this->restHelper->getUserDao()->getUserByName($args['userPathParam']);
334  if ($user === null) {
335  throw new HttpNotFoundException("User not found");
336  }
337  $newuser = intval($user['user_pk']);
338  $group_pk = intval($this->restHelper->getUserDao()->getGroupIdByName($args['pathParam']));
339  } else {
340  $group_pk = intval($args['pathParam']);
341  $newuser = intval($args['userPathParam']);
342  }
343  $newperm = intval($body['perm']);
344 
345  $userIsAdmin = Auth::isAdmin();
346  $userHasGroupAccess = $this->restHelper->getUserDao()->isAdvisorOrAdmin(
347  $this->restHelper->getUserId(), $group_pk);
348 
349  if (!isset($newperm)) {
350  throw new HttpBadRequestException("ERROR - no default permission provided");
351  }
352  if (!$this->dbHelper->doesIdExist("groups", "group_pk", $group_pk)) {
353  throw new HttpNotFoundException("Group id not found!");
354  }
355  if (!$this->dbHelper->doesIdExist("users", "user_pk", $newuser)) {
356  throw new HttpNotFoundException("User id not found!");
357  }
358  if ($newperm < 0 || $newperm > 2) {
359  throw new HttpBadRequestException("ERROR - Permission should be in range [0-2]");
360  }
361  if (! $userIsAdmin && ! $userHasGroupAccess) {
362  throw new HttpForbiddenException("Not advisor or admin of the group. " .
363  "Can not process request.");
364  }
365  $stmt = __METHOD__ . ".getByGroupAndUser";
366  $sql = "SELECT group_user_member_pk FROM group_user_member WHERE group_fk=$1 AND user_fk=$2;";
367  $fetchResult = $dbManager->getSingleRow($sql, [$group_pk, $newuser], $stmt);
368 
369  // Do not produce duplicate
370  if (!empty($fetchResult)) {
371  throw new HttpBadRequestException("Already a member!");
372  }
373  $dbManager->prepare($stmt = __METHOD__ . ".insertGUP",
374  "INSERT INTO group_user_member (group_fk, user_fk, group_perm) VALUES ($1,$2,$3)");
375  $dbManager->freeResult(
376  $dbManager->execute($stmt, array($group_pk, $newuser, $newperm)));
377 
378  $returnVal = new Info(201, "User added to group.", InfoType::INFO);
379  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
380  }
381 
391  public function changeUserPermission($request, $response, $args)
392  {
393  // Extract all prerequisites (dbManager , user_pk , new_permission , group_pk ) for this functionality
394  $apiVersion = ApiVersion::getVersion($request);
395  $dbManager = $this->dbHelper->getDbManager();
396 
397  $user_pk = null;
398  $group_pk = null;
399  if ($apiVersion == ApiVersion::V2) {
400  $user = $this->restHelper->getUserDao()->getUserByName($args['userPathParam']);
401  if ($user === null) {
402  throw new HttpNotFoundException("User not found");
403  }
404  $user_pk = intval($user['user_pk']);
405  $group_pk = intval($this->restHelper->getUserDao()->getGroupIdByName($args['pathParam']));
406  } else {
407  $user_pk = intval($args['userPathParam']);
408  $group_pk = intval($args['pathParam']);
409  }
410 
411  $newperm = intval($this->getParsedBody($request)['perm']);
412  $userIsAdmin = Auth::isAdmin();
413  $userHasGroupAccess = $this->restHelper->getUserDao()->isAdvisorOrAdmin(
414  $this->restHelper->getUserId(), $group_pk);
415 
416  // Validate arguments
417 
418  if (!isset($newperm)) {
419  throw new HttpBadRequestException("Permission should be provided");
420  }
421  if (!$this->dbHelper->doesIdExist("groups", "group_pk", $group_pk)) {
422  throw new HttpNotFoundException("Group id not found!");
423  }
424  if (!$this->dbHelper->doesIdExist("users", "user_pk", $user_pk)) {
425  throw new HttpNotFoundException("User id not found!");
426  }
427  if ($newperm < 0) {
428  throw new HttpBadRequestException("Permission can not be negative");
429  }
430  if ($newperm > 2) {
431  throw new HttpBadRequestException("Permission can not be greater than 2");
432  }
433  if (! $userIsAdmin && ! $userHasGroupAccess) {
434  throw new HttpForbiddenException("Not advisor or admin of the group. " .
435  "Can not process request.");
436  }
437 
438  // Check if the relation already exists, retrieve the PK.
439  // IF not, return 404 error
440  $memberRow = $dbManager->getSingleRow("SELECT group_user_member_pk FROM group_user_member WHERE group_fk=$1 AND user_fk=$2",
441  [$group_pk, $user_pk],
442  __METHOD__ . ".getByGroupAndUser");
443 
444  if (empty($memberRow)) {
445  throw new HttpNotFoundException("User not part of the group");
446  }
447  $group_user_member_pk = $memberRow['group_user_member_pk'];
449  $adminGroupUsers = $this->restHelper->getPlugin('group_manage_users');
450  $adminGroupUsers->updateGUMPermission($group_user_member_pk, $newperm,$dbManager);
451  $info = new Info(202, "Permission updated successfully.", InfoType::INFO);
452  return $response->withJson($info->getArray(), $info->getCode());
453  }
454 }
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.
static getVersion(ServerRequestInterface $request)
Definition: ApiVersion.php:29
Different type of infos provided by REST.
Definition: InfoType.php:16
Info model to contain general error and return values.
Definition: Info.php:19
char * trim(char *ptext)
Trimming whitespace.
Definition: fossconfig.c:690