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  SPDX-FileCopyrightText: Kaushlendra Pratap <kaushlendra-pratap.singh@siemens.com>
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  $apiVersion = ApiVersion::getVersion($request);
50  $id = null;
51  if (isset($args['pathParam'])) {
52  if ($apiVersion == ApiVersion::V2) {
53  $user = $this->restHelper->getUserDao()->getUserByName($args['pathParam']);
54  if ($user === null) {
55  throw new HttpNotFoundException("UserId doesn't exist");
56  }
57  $id = intval($user['user_pk']);
58  } else {
59  $id = intval($args['pathParam']);
60  }
61  if (! $this->dbHelper->doesIdExist("users", "user_pk", $id)) {
62  throw new HttpNotFoundException("UserId doesn't exist");
63  }
64  }
65  $users = $this->dbHelper->getUsers($id);
66 
67  $allUsers = array();
68  foreach ($users as $user) {
69  $allUsers[] = $user->getArray($apiVersion);
70  }
71  if ($id !== null) {
72  $allUsers = $allUsers[0];
73  }
74  return $response->withJson($allUsers, 200);
75  }
76 
86  public function addUser($request, $response, $args)
87  {
88  $this->throwNotAdminException();
89  $apiVersion = ApiVersion::getVersion($request);
90  $userDetails = $this->getParsedBody($request);
91  if ($userDetails === null || !is_array($userDetails)) {
92  throw new HttpBadRequestException("Request body is empty or malformed.");
93  }
94  if (empty($userDetails['name'])) {
95  throw new HttpBadRequestException("Username must be specified.");
96  }
97  $userHelper = new UserHelper();
98  // creating symphony request
99  $symfonyRequest = new \Symfony\Component\HttpFoundation\Request();
100  $symfonyRequest->request->set('username', $userDetails['name']);
101  $symfonyRequest->request->set('pass1', $userDetails[$apiVersion == ApiVersion::V2 ? 'userPass' : 'user_pass']);
102  $symfonyRequest->request->set('pass2', $userDetails[$apiVersion == ApiVersion::V2 ? 'userPass' : 'user_pass']);
103  $symfonyRequest->request->set('description', $userDetails['description']);
104  $symfonyRequest->request->set('permission', $userHelper->getEquivalentValueForPermission($userDetails['accessLevel']));
105  $symfonyRequest->request->set('folder', $userDetails['rootFolderId']);
106  $symfonyRequest->request->set('enote', $userDetails['emailNotification'] ? 'y' : 'n');
107  $symfonyRequest->request->set('email', $userDetails['email']);
108  $symfonyRequest->request->set('public', $userDetails['defaultVisibility']);
109  $symfonyRequest->request->set('default_bucketpool_fk', $userDetails['defaultBucketpool'] ?? 2);
110 
111  $agents = array();
112  if (isset($userDetails['agents'])) {
113  if (is_string($userDetails['agents'])) { // If 'x-www-form-urlencoded', inner elements are not decoded
114  $userDetails['agents'] = json_decode($userDetails['agents'], true);
115  }
116  $agents['Check_agent_mimetype'] = isset($userDetails['agents']['mime']) && $userDetails['agents']['mime'] ? 1 : 0;
117  $agents['Check_agent_monk'] = isset($userDetails['agents']['monk']) && $userDetails['agents']['monk'] ? 1 : 0;
118  $agents['Check_agent_ojo'] = isset($userDetails['agents']['ojo']) && $userDetails['agents']['ojo'] ? 1 : 0;
119  $agents['Check_agent_bucket'] = isset($userDetails['agents']['bucket']) && $userDetails['agents']['bucket'] ? 1 : 0 ;
120  $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;
121  $agents['Check_agent_ecc'] = isset($userDetails['agents']['ecc']) && $userDetails['agents']['ecc'] ? 1 : 0;
122  $agents['Check_agent_keyword'] = isset($userDetails['agents']['keyword']) && $userDetails['agents']['keyword'] ? 1 : 0;
123  $agents['Check_agent_nomos'] = isset($userDetails['agents']['nomos']) && $userDetails['agents']['nomos'] ? 1 : 0;
124  $agents['Check_agent_pkgagent'] = isset($userDetails['agents']['package']) && $userDetails['agents']['package'] ? 1 : 0;
125  $agents['Check_agent_reso'] = isset($userDetails['agents']['reso']) && $userDetails['agents']['reso'] ? 1 : 0;
126  $agents['Check_agent_shagent'] = isset($userDetails['agents']['heritage']) && $userDetails['agents']['heritage'] ? 1 : 0 ;
127  }
128 
129  $symfonyRequest->request->set('user_agent_list', userAgents($agents));
130 
131  // initialising the user_add object
132  global $container;
133  $restHelper = $container->get('helper.restHelper');
134  $userAddObj = $restHelper->getPlugin('user_add');
135 
136  // calling the add function
137  $ErrMsg = $userAddObj->add($symfonyRequest);
138 
139  if ($ErrMsg != '') {
140  throw new HttpInternalServerErrorException($ErrMsg);
141  }
142 
143  $returnVal = new Info(201, "User created successfully", InfoType::INFO);
144  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
145  }
146 
156  public function deleteUser($request, $response, $args)
157  {
158  $this->throwNotAdminException();
159  $apiVersion = ApiVersion::getVersion($request);
160  if ($apiVersion == ApiVersion::V2) {
161  $user = $this->restHelper->getUserDao()->getUserByName($args['pathParam']);
162  if ($user === null) {
163  throw new HttpNotFoundException("UserId doesn't exist");
164  }
165  $id = intval($user['user_pk']);
166  } else {
167  $id = intval($args['pathParam']);
168  }
169  if (!$this->dbHelper->doesIdExist("users","user_pk", $id)) {
170  throw new HttpNotFoundException("UserId doesn't exist");
171  }
172 
173  $this->dbHelper->deleteUser($id);
174  $returnVal = new Info(202, "User will be deleted", InfoType::INFO);
175  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
176  }
177 
186  public function getCurrentUser($request, $response, $args)
187  {
188  $apiVersion = ApiVersion::getVersion($request);
189  $user = $this->dbHelper->getUsers($this->restHelper->getUserId())[0]->getArray($apiVersion);
190  if ($apiVersion == ApiVersion::V2) {
191  return $response->withJson($user, 200);
192  }
193  $userDao = $this->restHelper->getUserDao();
194  $defaultGroup = $userDao->getUserAndDefaultGroupByUserName($user["name"])["group_name"];
195  $user['default_group'] = $defaultGroup;
196  return $response->withJson($user, 200);
197  }
198 
208  public function updateUser($request, $response, $args)
209  {
210  $apiVersion = ApiVersion::getVersion($request);
211  if ($apiVersion == ApiVersion::V2) {
212  $user = $this->restHelper->getUserDao()->getUserByName($args['pathParam']);
213  if ($user === null) {
214  throw new HttpNotFoundException("UserId doesn't exist");
215  }
216  $id = intval($user['user_pk']);
217  } else {
218  $id = intval($args['pathParam']);
219  }
220  if ($id !== intval($this->restHelper->getUserId())) {
221  $this->throwNotAdminException();
222  }
223  if (!$this->dbHelper->doesIdExist("users","user_pk", $id)) {
224  throw new HttpNotFoundException("UserId doesn't exist");
225  }
226  $reqBody = $this->getParsedBody($request);
227  $userHelper = new UserHelper($id);
228  $returnVal = $userHelper->modifyUserDetails($reqBody, $apiVersion);
229  return $response->withJson($returnVal->getArray(), $returnVal->getCode());
230  }
231 
241  public function createRestApiToken($request, $response, $args)
242  {
243  $reqBody = $this->getParsedBody($request);
244  $tokenRequest = TokenRequest::fromArray($reqBody,
245  ApiVersion::getVersion($request));
246  $symfonyRequest = new \Symfony\Component\HttpFoundation\Request();
247 
248  // translating values for symfony request
249  $symfonyRequest->request->set('pat_name', $tokenRequest->getTokenName());
250  $symfonyRequest->request->set('pat_expiry', $tokenRequest->getTokenExpire());
251  $symfonyRequest->request->set('pat_scope', $tokenRequest->getTokenScope());
252 
253  // initialising the user_edit plugin
254  global $container;
256  $restHelper = $container->get('helper.restHelper');
258  $userEditObj = $restHelper->getPlugin('user_edit');
259 
260  // creating the REST token
261  try {
262  $token = $userEditObj->generateNewToken($symfonyRequest);
263  } catch (DuplicateTokenKeyException $e) {
264  throw new HttpTooManyRequestException("Please try again later.", $e);
265  } catch (DuplicateTokenNameException $e) {
266  throw new HttpConflictException($e->getMessage(), $e);
267  } catch (\UnexpectedValueException $e) {
268  throw new HttpBadRequestException($e->getMessage(), $e);
269  }
270 
271  $returnVal = new Info(201, "Token created successfully", InfoType::INFO);
272  $res = $returnVal->getArray();
273  $res['token'] = $token;
274  return $response->withJson($res, $returnVal->getCode());
275  }
276 
286  public function getTokens($request, $response, $args)
287  {
288  $apiVersion = ApiVersion::getVersion($request);
289  $tokenType = $args['type'];
290  if ($tokenType != "active" && $tokenType != "expired") {
291  throw new HttpBadRequestException("Invalid request!");
292  }
293  // initialising the user_edit plugin
294  global $container;
295  $restHelper = $container->get('helper.restHelper');
296  $userEditObj = $restHelper->getPlugin('user_edit');
297 
298  // getting the list of tokens based on the type of token requested
299  $tokens = $tokenType == "active" ? $userEditObj->getListOfActiveTokens() : $userEditObj->getListOfExpiredTokens();
300  $manageTokenObj = $restHelper->getPlugin('manage-token');
301 
302  $finalTokens = array();
303  foreach ($tokens as $token) {
304  list($tokenPk) = explode(".", $token['id']);
305  $tokenVal = $manageTokenObj->revealToken($tokenPk);
306  $finalTokens[] = array_merge($token, ['token' => $tokenVal['token']]);
307  }
308 
309  $returnVal = new Info(200, "Success", InfoType::INFO);
310  $res = $returnVal->getArray();
311  $res[$tokenType . ($apiVersion == ApiVersion::V2 ? 'Tokens' : '_tokens')] = $finalTokens;
312  return $response->withJson($res, $returnVal->getCode());
313  }
314 }
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.