FOSSology  4.7.1
Open Source License Compliance by Open Source Software
UserController.php
Go to the documentation of this file.
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2018, 2021 Siemens AG
4  Author: Gaurav Mishra <mishra.gaurav@siemens.com>
5 
6  SPDX-License-Identifier: GPL-2.0-only
7 */
13 namespace Fossology\UI\Api\Controllers;
14 
30 use Psr\Http\Message\ServerRequestInterface;
31 
37 {
47  public function getUsers($request, $response, $args)
48  {
49  $this->throwNotAdminException();
50  $apiVersion = ApiVersion::getVersion($request);
51  $id = null;
52  if (isset($args['pathParam'])) {
53  if ($apiVersion == ApiVersion::V2) {
54  $user = $this->restHelper->getUserDao()->getUserByName($args['pathParam']);
55  if ($user === null) {
56  throw new HttpNotFoundException("UserId doesn't exist");
57  }
58  $id = intval($user['user_pk']);
59  } else {
60  $id = intval($args['pathParam']);
61  }
62  if (! $this->dbHelper->doesIdExist("users", "user_pk", $id)) {
63  throw new HttpNotFoundException("UserId doesn't exist");
64  }
65  }
66  $users = $this->dbHelper->getUsers($id);
67 
68  $allUsers = array();
69  foreach ($users as $user) {
70  $allUsers[] = $user->getArray($apiVersion);
71  }
72  if ($id !== null) {
73  $allUsers = $allUsers[0];
74  }
75  return $response->withJson($allUsers, 200);
76  }
77 
87  public function addUser($request, $response, $args)
88  {
89  $this->throwNotAdminException();
90  $apiVersion = ApiVersion::getVersion($request);
91  $userDetails = $this->getParsedBody($request);
92  if ($userDetails === null || !is_array($userDetails)) {
93  throw new HttpBadRequestException("Request body is empty or malformed.");
94  }
95  if (empty($userDetails['name'])) {
96  throw new HttpBadRequestException("Username must be specified.");
97  }
98  $userHelper = new UserHelper();
99  // creating symphony request
100  $symfonyRequest = new \Symfony\Component\HttpFoundation\Request();
101  $symfonyRequest->request->set('username', $userDetails['name']);
102  $symfonyRequest->request->set('pass1', $userDetails[$apiVersion == ApiVersion::V2 ? 'userPass' : 'user_pass']);
103  $symfonyRequest->request->set('pass2', $userDetails[$apiVersion == ApiVersion::V2 ? 'userPass' : 'user_pass']);
104  $symfonyRequest->request->set('description', $userDetails['description']);
105  $symfonyRequest->request->set('permission', $userHelper->getEquivalentValueForPermission($userDetails['accessLevel']));
106  $symfonyRequest->request->set('folder', $userDetails['rootFolderId']);
107  $symfonyRequest->request->set('enote', $userDetails['emailNotification'] ? 'y' : 'n');
108  $symfonyRequest->request->set('email', $userDetails['email']);
109  $symfonyRequest->request->set('public', $userDetails['defaultVisibility']);
110  $symfonyRequest->request->set('default_bucketpool_fk', $userDetails['defaultBucketpool'] ?? 2);
111 
112  $agents = array();
113  if (isset($userDetails['agents'])) {
114  if (is_string($userDetails['agents'])) { // If 'x-www-form-urlencoded', inner elements are not decoded
115  $userDetails['agents'] = json_decode($userDetails['agents'], true);
116  }
117  $agents['Check_agent_mimetype'] = isset($userDetails['agents']['mime']) && $userDetails['agents']['mime'] ? 1 : 0;
118  $agents['Check_agent_monk'] = isset($userDetails['agents']['monk']) && $userDetails['agents']['monk'] ? 1 : 0;
119  $agents['Check_agent_ojo'] = isset($userDetails['agents']['ojo']) && $userDetails['agents']['ojo'] ? 1 : 0;
120  $agents['Check_agent_bucket'] = isset($userDetails['agents']['bucket']) && $userDetails['agents']['bucket'] ? 1 : 0 ;
121  $agents['Check_agent_copyright'] = isset($userDetails['agents'][$apiVersion == ApiVersion::V2 ? 'copyrightEmailAuthor' : 'copyright_email_author']) && $userDetails['agents'][$apiVersion == ApiVersion::V2 ? 'copyrightEmailAuthor' : 'copyright_email_author'] ? 1 : 0;
122  $agents['Check_agent_ecc'] = isset($userDetails['agents']['ecc']) && $userDetails['agents']['ecc'] ? 1 : 0;
123  $agents['Check_agent_keyword'] = isset($userDetails['agents']['keyword']) && $userDetails['agents']['keyword'] ? 1 : 0;
124  $agents['Check_agent_nomos'] = isset($userDetails['agents']['nomos']) && $userDetails['agents']['nomos'] ? 1 : 0;
125  $agents['Check_agent_pkgagent'] = isset($userDetails['agents']['package']) && $userDetails['agents']['package'] ? 1 : 0;
126  $agents['Check_agent_reso'] = isset($userDetails['agents']['reso']) && $userDetails['agents']['reso'] ? 1 : 0;
127  $agents['Check_agent_shagent'] = isset($userDetails['agents']['heritage']) && $userDetails['agents']['heritage'] ? 1 : 0 ;
128  }
129 
130  $symfonyRequest->request->set('user_agent_list', userAgents($agents));
131 
132  // initialising the user_add object
133  global $container;
134  $restHelper = $container->get('helper.restHelper');
135  $userAddObj = $restHelper->getPlugin('user_add');
136 
137  // calling the add function
138  $ErrMsg = $userAddObj->add($symfonyRequest);
139 
140  if ($ErrMsg != '') {
141  throw new HttpInternalServerErrorException($ErrMsg);
142  }
143 
144  $returnVal = new Info(201, "User created successfully", InfoType::INFO);
145  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
146  }
147 
157  public function deleteUser($request, $response, $args)
158  {
159  $this->throwNotAdminException();
160  $apiVersion = ApiVersion::getVersion($request);
161  if ($apiVersion == ApiVersion::V2) {
162  $user = $this->restHelper->getUserDao()->getUserByName($args['pathParam']);
163  if ($user === null) {
164  throw new HttpNotFoundException("UserId doesn't exist");
165  }
166  $id = intval($user['user_pk']);
167  } else {
168  $id = intval($args['pathParam']);
169  }
170  if (!$this->dbHelper->doesIdExist("users","user_pk", $id)) {
171  throw new HttpNotFoundException("UserId doesn't exist");
172  }
173 
174  $this->dbHelper->deleteUser($id);
175  $returnVal = new Info(202, "User will be deleted", InfoType::INFO);
176  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
177  }
178 
187  public function getCurrentUser($request, $response, $args)
188  {
189  $apiVersion = ApiVersion::getVersion($request);
190  $user = $this->dbHelper->getUsers($this->restHelper->getUserId())[0]->getArray($apiVersion);
191  if ($apiVersion == ApiVersion::V2) {
192  return $response->withJson($user, 200);
193  }
194  $userDao = $this->restHelper->getUserDao();
195  $defaultGroup = $userDao->getUserAndDefaultGroupByUserName($user["name"])["group_name"];
196  $user['default_group'] = $defaultGroup;
197  return $response->withJson($user, 200);
198  }
199 
209  public function updateUser($request, $response, $args)
210  {
211  $apiVersion = ApiVersion::getVersion($request);
212  if ($apiVersion == ApiVersion::V2) {
213  $user = $this->restHelper->getUserDao()->getUserByName($args['pathParam']);
214  if ($user === null) {
215  throw new HttpNotFoundException("UserId doesn't exist");
216  }
217  $id = intval($user['user_pk']);
218  } else {
219  $id = intval($args['pathParam']);
220  }
221  if ($id !== intval($this->restHelper->getUserId())) {
222  $this->throwNotAdminException();
223  }
224  if (!$this->dbHelper->doesIdExist("users","user_pk", $id)) {
225  throw new HttpNotFoundException("UserId doesn't exist");
226  }
227  $reqBody = $this->getParsedBody($request);
228  $userHelper = new UserHelper($id);
229  $returnVal = $userHelper->modifyUserDetails($reqBody, $apiVersion);
230  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
231  }
232 
242  public function createRestApiToken($request, $response, $args)
243  {
244  $reqBody = $this->getParsedBody($request);
245  $tokenRequest = TokenRequest::fromArray($reqBody,
246  ApiVersion::getVersion($request));
247  $symfonyRequest = new \Symfony\Component\HttpFoundation\Request();
248 
249  // translating values for symfony request
250  $symfonyRequest->request->set('pat_name', $tokenRequest->getTokenName());
251  $symfonyRequest->request->set('pat_expiry', $tokenRequest->getTokenExpire());
252  $symfonyRequest->request->set('pat_scope', $tokenRequest->getTokenScope());
253 
254  // initialising the user_edit plugin
255  global $container;
257  $restHelper = $container->get('helper.restHelper');
259  $userEditObj = $restHelper->getPlugin('user_edit');
260 
261  // creating the REST token
262  try {
263  $token = $userEditObj->generateNewToken($symfonyRequest);
264  } catch (DuplicateTokenKeyException $e) {
265  throw new HttpTooManyRequestException("Please try again later.", $e);
266  } catch (DuplicateTokenNameException $e) {
267  throw new HttpConflictException($e->getMessage(), $e);
268  } catch (\UnexpectedValueException $e) {
269  throw new HttpBadRequestException($e->getMessage(), $e);
270  }
271 
272  $returnVal = new Info(201, "Token created successfully", InfoType::INFO);
273  $res = $returnVal->getArray();
274  $res['token'] = $token;
275  return $response->withJson($res, $returnVal->getCode());
276  }
277 
287  public function getTokens($request, $response, $args)
288  {
289  $apiVersion = ApiVersion::getVersion($request);
290  $tokenType = $args['type'];
291  if ($tokenType != "active" && $tokenType != "expired") {
292  throw new HttpBadRequestException("Invalid request!");
293  }
294  // initialising the user_edit plugin
295  global $container;
296  $restHelper = $container->get('helper.restHelper');
297  $userEditObj = $restHelper->getPlugin('user_edit');
298 
299  // getting the list of tokens based on the type of token requested
300  $tokens = $tokenType == "active" ? $userEditObj->getListOfActiveTokens() : $userEditObj->getListOfExpiredTokens();
301  $manageTokenObj = $restHelper->getPlugin('manage-token');
302 
303  $finalTokens = array();
304  foreach ($tokens as $token) {
305  list($tokenPk) = explode(".", $token['id']);
306  $tokenVal = $manageTokenObj->revealToken($tokenPk);
307  $finalTokens[] = array_merge($token, ['token' => $tokenVal['token']]);
308  }
309 
310  $returnVal = new Info(200, "Success", InfoType::INFO);
311  $res = $returnVal->getArray();
312  $res[$tokenType . ($apiVersion == ApiVersion::V2 ? 'Tokens' : '_tokens')] = $finalTokens;
313  return $response->withJson($res, $returnVal->getCode());
314  }
315 }
Exception when a token has duplicate key for same user.
Exception when a token has duplicate name for same user.
Base controller for REST calls.
getParsedBody(ServerRequestInterface $request)
Parse request body as JSON and return associative PHP array.
getCurrentUser($request, $response, $args)
Override Slim response for withJson function.
Provides various DAO helper functions for REST api.
Definition: RestHelper.php:32
Handle user related queries.
Definition: UserHelper.php:28
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
static fromArray(array $input, int $version)
userAgents($agents=null)
Read the UI form and format the user selected agents into a comma separated list.