FOSSology  4.7.1
Open Source License Compliance by Open Source Software
user-edit.php
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2014 Hewlett-Packard Development Company, L.P.
4  SPDX-FileCopyrightText: © 2021-2022 Orange
5  Contributors: Piotr Pszczola, Bartlomiej Drozdz
6 
7  SPDX-License-Identifier: GPL-2.0-only
8 */
9 
21 use Symfony\Component\HttpFoundation\Request;
22 
24 {
25  const NAME = "user_edit";
26 
28  private $dbManager;
29 
33  private $authHelper;
34 
38  private $userDao;
39 
40  function __construct()
41  {
42  parent::__construct(self::NAME, array(
43  self::TITLE => _("Edit User Account"),
44  self::MENU_LIST => 'Admin::Users::Edit User Account',
45  self::REQUIRES_LOGIN => true,
46  self::PERMISSION => Auth::PERM_READ
47  ));
48 
49  $this->dbManager = $this->getObject('db.manager');
50  $this->authHelper = $this->getObject('helper.authHelper');
51  $this->userDao = $this->getObject('dao.user');
52  }
53 
63  function handle(Request $request)
64  {
65  /* Is the session owner an admin? */
66  $user_pk = Auth::getUserId();
67  $SessionUserRec = $this->GetUserRec($user_pk);
68  $SessionIsAdmin = $this->IsSessionAdmin($SessionUserRec);
69  $newToken = "";
70  $newClient = "";
71 
72  $vars = array('refreshUri' => Traceback_uri() . "?mod=" . self::NAME);
73 
74  if (GetParm('new_client', PARM_STRING)) {
75  try {
76  $newClient = $this->addNewClient($request);
77  } catch (\Exception $e) {
78  $newClient = $e->getMessage();
79  }
80  }
81  if (GetParm('new_pat', PARM_STRING)) {
82  try {
83  $newToken = $this->generateNewToken($request);
84  } catch (\Exception $e) {
85  $vars['message'] = $e->getMessage();
86  }
87  }
88 
89  $user_pk_to_modify = intval($request->get('user_pk'));
90  if (! ($SessionIsAdmin || empty($user_pk_to_modify) ||
91  $user_pk == $user_pk_to_modify)) {
92  $vars['content'] = _("Your request is not valid.");
93  return $this->render('include/base.html.twig', $this->mergeWithDefault($vars));
94  }
95 
96  /*
97  * If this is a POST (the submit button was clicked), then process the
98  * request.
99  */
100  $BtnText = $request->get('UpdateBtn');
101  if (! empty($BtnText)) {
102  /* Get the form data to in an associated array */
103  $UserRec = $this->CreateUserRec($request, "");
104 
105  $rv = $this->UpdateUser($UserRec, $SessionIsAdmin);
106  if (empty($rv)) {
107  // Successful db update
108  $vars['message'] = "User $UserRec[user_name] updated.";
109 
110  /* Reread the user record as update verification */
111  $UserRec = $this->CreateUserRec($request, $UserRec['user_pk']);
112  if ($user_pk == $user_pk_to_modify) {
113  $_SESSION['User'] = $UserRec['user_name'];
114  }
115  } else {
116  if (empty($UserRec['user_name']) || $_SESSION['User'] != $UserRec['user_name']) {
117  $UserRec = $this->CreateUserRec($request, $UserRec['user_pk']);
118  }
119  $vars['message'] = $rv;
120  }
121  } else {
122  $NewUserpk = intval($request->get('newuser'));
123  $UserRec = empty($NewUserpk) ? $this->CreateUserRec($request, $user_pk) : $this->CreateUserRec($request, $NewUserpk);
124  }
125 
126  /* display the edit form with the requested user data */
127  $vars = array_merge($vars, $this->DisplayForm($UserRec, $SessionIsAdmin));
128  $vars['userId'] = $UserRec['user_pk'];
129  $vars['newToken'] = $newToken;
130  $vars['newClient'] = $newClient;
131  $vars['tokenList'] = $this->getListOfActiveTokens();
132  $vars['expiredTokenList'] = $this->getListOfExpiredTokens();
133  $vars['clientList'] = $this->getListOfActiveClients();
134  $vars['revokedClientList'] = $this->getListOfExpiredClients();
135  $vars['maxTokenDate'] = $this->authHelper->getMaxTokenValidity();
136  $vars['writeAccess'] = ($_SESSION[Auth::USER_LEVEL] >= 3);
137  $vars['policyRegex'] = generate_password_policy();
138  $vars['policyDisabled'] = "true"; // Form allows empty password for unchanged
139  $vars['formName'] = "user_edit";
140  $vars['passwordPolicy'] = "";
142  if ($policy != "No policy defined.") {
143  $vars['passwordPolicy'] = $policy;
144  }
145  $restToken = Auth::getRestTokenType();
146  if ($restToken == Auth::TOKEN_OAUTH) {
147  $restToken = "oauth";
148  } elseif ($restToken == Auth::TOKEN_BOTH) {
149  $restToken = "both";
150  } else {
151  $restToken = "token";
152  }
153  $vars['resttoken'] = $restToken;
154 
155  return $this->render('user_edit.html.twig', $this->mergeWithDefault($vars));
156  }
157 
165  private function DisplayForm($UserRec, $SessionIsAdmin)
166  {
167  global $SysConf;
168 
169  $vars = array('isSessionAdmin' => $SessionIsAdmin,
170  'userId' => $UserRec['user_pk']);
171  $vars['userDescReadOnly'] = $SysConf['SYSCONFIG']['UserDescReadOnly'];
172 
173  /* For Admins, get the list of all users
174  * For non-admins, only show themselves
175  */
176  if ($SessionIsAdmin) {
177  $stmt = __METHOD__ . '.asSessionAdmin';
178  $sql = "SELECT * FROM users ORDER BY user_name";
179  $this->dbManager->prepare($stmt, $sql);
180  $res = $this->dbManager->execute($stmt);
181  $allUsers = array();
182  while ($row = $this->dbManager->fetchArray($res)) {
183  $allUsers[$row['user_pk']] = htmlentities($row['user_name']);
184  }
185  $this->dbManager->freeResult($res);
186  $vars['allUsers'] = $allUsers;
187  }
188 
189  $vars['userName'] = $UserRec['user_name'];
190  $vars['userDescription'] = $UserRec['user_desc'];
191  $vars['userEMail'] = $UserRec["user_email"];
192  $vars['eMailNotification'] = ($UserRec['email_notify'] == 'y');
193  $spdxSettings = isset($UserRec['spdx_settings']) ? explode(',', $UserRec['spdx_settings']) : ['unchecked', 'unchecked', 'unchecked'];
194  if (count($spdxSettings) < 3) {
195  $spdxSettings = array_pad($spdxSettings, 3, 'unchecked');
196  }
197  $vars['osselotExportEnabled'] = ($spdxSettings[0] === 'checked');
198  $vars['spdxLicenseCommentDefault'] = ($spdxSettings[1] === 'checked');
199  $vars['ignoreFilesWOInfoDefault'] = ($spdxSettings[2] === 'checked');
200 
201  $cyclonedxSettings = isset($UserRec['cyclonedx_settings']) ? explode(',', $UserRec['cyclonedx_settings']) : ['unchecked', 'unchecked', 'unchecked'];
202  if (count($cyclonedxSettings) < 3) {
203  $cyclonedxSettings = array_pad($cyclonedxSettings, 3, 'unchecked');
204  }
205  $vars['cyclonedxOsselotExportEnabled'] = ($cyclonedxSettings[0] === 'checked');
206  $vars['cyclonedxLicenseCommentDefault'] = ($cyclonedxSettings[1] === 'checked');
207  $vars['cyclonedxIgnoreFilesWOInfoDefault'] = ($cyclonedxSettings[2] === 'checked');
208 
209  if ($SessionIsAdmin) {
210  $vars['allAccessLevels'] = array(
211  PLUGIN_DB_NONE => _("None (very basic, no database access)"),
212  PLUGIN_DB_READ => _("Read-only (read, but no writes or downloads)"),
213  PLUGIN_DB_WRITE => _("Read-Write (read, download, or edit information)"),
214  PLUGIN_DB_CADMIN => _("Clearing Administrator (read, download, edit information and edit decisions)"),
215  PLUGIN_DB_ADMIN => _("Full Administrator (all access including adding and deleting users)")
216  );
217  $vars['accessLevel'] = $UserRec['user_perm'];
218 
219  $vars['allUserStatuses'] = array(
220  "active" => _("Active"),
221  "inactive" => _("Inactive")
222  );
223 
224  $vars['userStatus'] = $UserRec['user_status'];
225 
226  $SelectedFolderPk = $UserRec['root_folder_fk'];
227  $vars['folderListOption'] = FolderListOption($ParentFolder = -1, $Depth = 0, $IncludeTop = 1, $SelectedFolderPk);
228 
229  }
230  $SelectedDefaultFolderPk = $UserRec['default_folder_fk'];
231  $vars['folderListOption2'] = FolderListOption($ParentFolder = $UserRec['root_folder_fk'], $Depth = 0, $IncludeTop = 1, $SelectedDefaultFolderPk);
232 
233  $vars['isBlankPassword'] = ($UserRec['_blank_pass'] == 'on');
234  $vars['agentSelector'] = AgentCheckBoxMake(-1, array("agent_unpack",
235  "agent_adj2nest", "wget_agent"), $UserRec['user_name']);
236  $vars['bucketPool'] = SelectBucketPool($UserRec["default_bucketpool_fk"]);
237  $vars['defaultGroupOption'] = $this->getUserGroupSelect($UserRec);
238  $vars['uploadVisibility'] = $UserRec['upload_visibility'];
239 
240  return $vars;
241  }
242 
249  function UpdateUser($UserRec, $SessionIsAdmin)
250  {
251  global $PG_CONN;
252 
253  $Errors = "";
254 
255  /**** Validations ****/
256  /* Make sure we have a user_pk */
257  if (empty($UserRec['user_pk'])) {
258  $Errors .= "<li>" . _("Consistency error (User_pk missing). Please start over.") . "</li>";
259  }
260 
261  /* Make sure username looks valid */
262  if (empty($UserRec['user_name'])) {
263  $Errors .= "<li>" . _("Username must be specified.") . "</li>";
264  }
265 
266  /* Verify the user_name is not a duplicate */
267  $CheckUserRec = GetSingleRec("users", "WHERE user_name='$UserRec[user_name]'");
268  if ((!empty($CheckUserRec)) and ( $CheckUserRec['user_pk'] != $UserRec['user_pk'])) {
269  $Errors .= "<li>" . _("Username is not unique.") . "</li>";
270  }
271 
272  /* Make sure password matches */
273  if ($UserRec['_pass1'] != $UserRec['_pass2']) {
274  $Errors .= "<li>" . _("Passwords do not match.") . "</li>";
275  }
276 
277  $oldEmail = $this->dbManager->getSingleRow(
278  "SELECT user_email FROM users WHERE user_pk = $1;",
279  array($UserRec['user_pk']), __METHOD__."oldEmail");
280  if (strcmp($oldEmail['user_email'],$UserRec['user_email']) != 0) {
281  /* Make sure email looks valid */
282  $Check = preg_replace("/[^a-zA-Z0-9@_.+-]/", "", $UserRec['user_email']);
283  if ($Check != $UserRec['user_email']) {
284  $Errors .= "<li>" . _("Invalid email address.") . "</li>";
285  }
286 
287  /* Make sure email is unique */
288  $email_count = 0;
289  if (!empty($UserRec['user_email'])) {
290  $email_count = $this->dbManager->getSingleRow(
291  "SELECT COUNT(*) as count FROM users WHERE user_email = $1 LIMIT 1;",
292  array($UserRec['user_email']), __METHOD__."email_count")["count"];
293  }
294  if ($email_count > 0) {
295  $Errors .= "<li>" . _("Email address already exists.") . "</li>";
296  }
297  }
298 
299  /* Make sure user can't ask for blank password if policy is enabled */
300  if (passwordPolicyEnabled() && !empty($UserRec['_blank_pass'])) {
301  $Errors .= "<li>" . _("Password policy enabled, can't have a blank password.") . "</li>";
302  }
303 
304  /* Did they specify a password and also request a blank password? */
305  if (!empty($UserRec['_blank_pass']) && ( !empty($UserRec['_pass1']) || ! empty($UserRec['_pass2']))) {
306  $Errors .= "<li>" . _("You cannot specify both a password and a blank password.") . "</li>";
307  }
308 
309  /* Make sure password matches policy */
310  if (!empty($UserRec['_pass1']) && !empty($UserRec['_pass2'])) {
311  $policyRegex = generate_password_policy();
312  $result = preg_match('/^' . $policyRegex . '$/m', $UserRec['_pass1']);
313  if ($result !== 1) {
314  $Errors .= "<li>" . _("Password does not match policy.");
315  $Errors .= "<br />" . generate_password_policy_string();
316  $Errors .= "</li>";
317  }
318  }
319 
320  /* Check if the user is member of the group */
321  if (!empty($UserRec['group_fk'])) {
322  $group_map = $this->userDao->getUserGroupMap($UserRec['user_pk']);
323  if (!in_array($UserRec['group_fk'], array_keys($group_map))) {
324  $Errors .= "<li>" . _("User is not member of provided group.") .
325  "</li>";
326  }
327  }
328 
329  /* Make sure only admin can change the username */
330  if ((!Auth::isAdmin()) && ($UserRec['user_name'] != $_SESSION['User'])) {
331  $Errors .= "<li>" . _("Only admin can change the username.") . "</li>";
332  }
333 
334  /* If we have any errors, return them */
335  if (!empty($Errors)) {
336  return _("Errors") . ":<ol>$Errors </ol>";
337  }
338 
339  /**** Update the users database record ****/
340  /* First remove user_pass and user_seed if the password wasn't changed. */
341  if (!empty($UserRec['_blank_pass']) ) {
342  $UserRec['user_seed'] = '';
343  $options = array('cost' => 10);
344  $UserRec['user_pass'] = password_hash("", PASSWORD_DEFAULT, $options);
345  } else if (empty($UserRec['_pass1'])) { // password wasn't changed
346  unset( $UserRec['user_pass']);
347  unset( $UserRec['user_seed']);
348  }
349 
350  /* Build the sql update */
351  $sql = "UPDATE users SET ";
352  $first = true;
353  foreach ($UserRec as $key=>$val) {
354  if ($key[0] == '_' || $key == "user_pk") {
355  continue;
356  }
357  if (!$SessionIsAdmin && ($key == "user_perm" || $key == "root_folder_fk" || $key == "user_status")) {
358  continue;
359  }
360  if (!$first) {
361  $sql .= ",";
362  }
363  $sql .= "$key='" . pg_escape_string($val) . "'";
364  $first = false;
365  }
366  $sql .= " WHERE user_pk=$UserRec[user_pk]";
367  $result = pg_query($PG_CONN, $sql);
368  DBCheckResult($result, $sql, __FILE__, __LINE__);
369  pg_free_result($result);
370 
371  return null;
372  } // UpdateUser()
373 
381  function GetUserRec($user_pk)
382  {
383  if (empty($user_pk)) {
384  throw new Exception("Invalid access. Your session has expired.",1);
385  }
386 
387  $UserRec = GetSingleRec("users", "WHERE user_pk=$user_pk");
388  if (empty($UserRec)) {
389  throw new Exception("Invalid user. ",1);
390  }
391  return $UserRec;
392  }
393 
399  function IsSessionAdmin($UserRec)
400  {
401  return ($UserRec['user_perm'] == PLUGIN_DB_ADMIN);
402  }
403 
414  function CreateUserRec(Request $request, $user_pk="")
415  {
416  /* If a $user_pk was given, use it to read the user db record.
417  * Otherwise, use the form data.
418  */
419  if (!empty($user_pk)) {
420  $UserRec = $this->GetUserRec($user_pk);
421  $UserRec['_pass1'] = "";
422  $UserRec['_pass2'] = "";
423  $UserRec['_blank_pass'] = password_verify('', $UserRec['user_pass']) ? "on" : "";
424  } else {
425  $UserRec = array();
426  $UserRec['user_pk'] = intval($request->get('user_pk'));
427  $UserRec['user_name'] = stripslashes($request->get('user_name'));
428  $UserRec['root_folder_fk'] = intval($request->get('root_folder_fk'));
429  $UserRec['upload_visibility'] = stripslashes($request->get('public'));
430  $UserRec['default_folder_fk'] = intval($request->get('default_folder_fk'));
431  $UserRec['user_desc'] = stripslashes($request->get('user_desc'));
432  $defaultGroup = $request->get('default_group_fk', null);
433  if ($defaultGroup !== null) {
434  $UserRec['group_fk'] = intval($defaultGroup);
435  }
436 
437  $UserRec['_pass1'] = stripslashes($request->get('_pass1'));
438  $UserRec['_pass2'] = stripslashes($request->get('_pass2'));
439  if (!empty($UserRec['_pass1'])) {
440  $UserRec['user_seed'] = 'Seed';
441  $options = array('cost' => 10);
442  $UserRec['user_pass'] = password_hash($UserRec['_pass1'], PASSWORD_DEFAULT, $options);
443  $UserRec['_blank_pass'] = "";
444  } else {
445  $UserRec['user_pass'] = "";
446  $UserRec['_blank_pass'] = stripslashes($request->get("_blank_pass"));
447  if (empty($UserRec['_blank_pass'])) { // check for blank password
448  $StoredUserRec = $this->GetUserRec($UserRec['user_pk']);
449  $options = array('cost' => 10);
450  $UserRec['_blank_pass'] = password_verify($StoredUserRec['user_pass'], password_hash("", PASSWORD_DEFAULT, $options)) ? "on" : "";
451  }
452  }
453 
454  $UserRec['user_perm'] = intval($request->get('user_perm'));
455  $UserRec['user_status'] = stripslashes($request->get('user_status'));
456  $UserRec['user_email'] = stripslashes($request->get('user_email'));
457  $UserRec['email_notify'] = stripslashes($request->get('email_notify'));
458  if (!empty($UserRec['email_notify'])) {
459  $UserRec['email_notify'] = 'y';
460  }
461  $UserRec['user_agent_list'] = is_null($request->get('user_agent_list')) ? userAgents() : $request->get('user_agent_list');
462  $UserRec['default_bucketpool_fk'] = intval($request->get("default_bucketpool_fk"));
463 
464  if ($this->dbManager->existsColumn('users', 'spdx_settings')) {
465  $osselotEnabled = !empty($request->get('osselot_export_enabled')) ? 'checked' : 'unchecked';
466  $spdxCommentEnabled = !empty($request->get('spdx_license_comment_default')) ? 'checked' : 'unchecked';
467  $ignoreFilesEnabled = !empty($request->get('ignore_files_wo_info_default')) ? 'checked' : 'unchecked';
468 
469  $UserRec['spdx_settings'] = "$osselotEnabled,$spdxCommentEnabled,$ignoreFilesEnabled";
470  }
471 
472  if ($this->dbManager->existsColumn('users', 'cyclonedx_settings')) {
473  $cyclonedxOsselotEnabled = !empty($request->get('cyclonedx_osselot_export_enabled')) ? 'checked' : 'unchecked';
474  $cyclonedxCommentEnabled = !empty($request->get('cyclonedx_license_comment_default')) ? 'checked' : 'unchecked';
475  $cyclonedxIgnoreFilesEnabled = !empty($request->get('cyclonedx_ignore_files_wo_info_default')) ? 'checked' : 'unchecked';
476 
477  $UserRec['cyclonedx_settings'] = "$cyclonedxOsselotEnabled,$cyclonedxCommentEnabled,$cyclonedxIgnoreFilesEnabled";
478  }
479  }
480  return $UserRec;
481  }
482 
494  function generateNewToken(Request $request)
495  {
496  global $container;
497 
498  $user_pk = Auth::getUserId();
499  $tokenName = $request->get('pat_name');
500  $tokenExpiry = $request->get('pat_expiry');
501  if ($_SESSION[Auth::USER_LEVEL] < 3) {
502  $tokenScope = 'r';
503  } else {
504  $tokenScope = $request->get('pat_scope');
505  }
506  $tokenScope = array_search($tokenScope, RestHelper::SCOPE_DB_MAP);
507  if ($tokenScope === false) {
508  throw new \UnexpectedValueException("Invalid token scope " .
509  $request->get('pat_scope') . ".");
510  }
511  $tokenScope = RestHelper::SCOPE_DB_MAP[$tokenScope];
513  $restHelper = $container->get('helper.restHelper');
514  try {
515  $restHelper->validateTokenRequest($tokenExpiry, $tokenName, $tokenScope);
516  } catch (HttpBadRequestException $e) {
517  throw new \UnexpectedValueException($e->getMessage());
518  }
519 
521  $restDbHelper = $container->get('helper.dbHelper');
522  $key = bin2hex(
523  openssl_random_pseudo_bytes(RestHelper::TOKEN_KEY_LENGTH / 2));
524  try {
525  $jti = $restDbHelper->insertNewTokenKey($user_pk, $tokenExpiry,
526  $tokenScope, $tokenName, $key);
527  } catch (DuplicateTokenKeyException $e) {
528  // Key already exists, try again.
529  $key = bin2hex(
530  openssl_random_pseudo_bytes(RestHelper::TOKEN_KEY_LENGTH / 2));
531  try {
532  $jti = $restDbHelper->insertNewTokenKey($user_pk, $tokenExpiry,
533  $tokenScope, $tokenName, $key);
534  } catch (DuplicateTokenKeyException $e) {
535  // New key also failed, give up!
536  throw new DuplicateTokenKeyException("Please try again later.");
537  } catch (DuplicateTokenNameException $e) {
538  throw $e;
539  }
540  } catch (DuplicateTokenNameException $e) {
541  throw new \UnexpectedValueException($e->getMessage());
542  }
543  return $this->authHelper->generateJwtToken($tokenExpiry,
544  $jti['created_on'], $jti['jti'], $tokenScope, $key);
545  }
546 
555  {
556  $user_pk = Auth::getUserId();
557  $sql = "SELECT pat_pk, user_fk, expire_on, token_scope, token_name, created_on, active " .
558  "FROM personal_access_tokens " .
559  "WHERE user_fk = $1 AND active = true AND client_id IS NULL;";
560  $rows = $this->dbManager->getRows($sql, [$user_pk],
561  __METHOD__ . ".getActiveTokens");
562  $response = [];
563  foreach ($rows as $row) {
564  try {
565  $this->authHelper->isTokenActive($row, $row["pat_pk"]);
566  } catch (HttpForbiddenException $_) {
567  continue;
568  }
569  $entry = [
570  "id" => $row["pat_pk"] . "." . $user_pk,
571  "name" => $row["token_name"],
572  "created" => $row["created_on"],
573  "expire" => $row["expire_on"],
574  "scope" => $row["token_scope"]
575  ];
576  $response[] = $entry;
577  }
578  array_multisort(array_column($response, "created"), SORT_ASC, $response);
579  return $response;
580  }
581 
587  {
588  $user_pk = Auth::getUserId();
589  $retentionPeriod = $this->getMaxExpiredTokenRetentionPeriod();
590  $sql = "SELECT pat_pk, user_fk, expire_on, token_scope, token_name, created_on " .
591  "FROM personal_access_tokens " .
592  "WHERE user_fk = $1 AND active = false " .
593  "AND expire_on >= (SELECT CURRENT_DATE - ($2)::integer) " .
594  "AND client_id IS NULL;";
595  $rows = $this->dbManager->getRows($sql, [$user_pk, $retentionPeriod],
596  __METHOD__ . ".getExpiredTokens");
597  $response = [];
598  foreach ($rows as $row) {
599  $entry = [
600  "id" => $row["pat_pk"] . "." . $user_pk,
601  "name" => $row["token_name"],
602  "created" => $row["created_on"],
603  "expire" => $row["expire_on"],
604  "scope" => $row["token_scope"]
605  ];
606  $response[] = $entry;
607  }
608  array_multisort(array_column($response, "created"), SORT_ASC, $response);
609  return $response;
610  }
611 
617  private function getUserGroupSelect($userRec)
618  {
619  $groups = $this->userDao->getUserGroupMap($userRec['user_pk']);
620  $userDefaults = $this->userDao->getUserAndDefaultGroupByUserName($userRec['user_name']);
621  $options = "";
622  foreach ($groups as $groupId => $groupName) {
623  $options .= "<option value='$groupId' ";
624  if ($groupId == $userDefaults['group_fk']) {
625  $options .= "selected='selected'";
626  }
627  $options .= ">$groupName</option>";
628  }
629  return $options;
630  }
631 
642  private function addNewClient(Request $request)
643  {
644  global $container;
645 
646  $user_pk = Auth::getUserId();
647  $clientName = GetParm('client_name', PARM_STRING);
648  $clientId = GetParm('client_id', PARM_STRING);
649  if ($_SESSION[Auth::USER_LEVEL] < 3) {
650  $clientScope = 'r';
651  } else {
652  $clientScope = GetParm('client_scope', PARM_STRING);
653  }
655  $restHelper = $container->get('helper.restHelper');
656  try {
657  $restHelper->validateNewOauthClient($user_pk, $clientName, $clientScope,
658  $clientId);
659  } catch (HttpBadRequestException $e) {
660  throw new \UnexpectedValueException($e->getMessage());
661  }
662 
663  $restHelper->getDbHelper()->addNewClient($clientName, $user_pk,
664  $clientId, $clientScope);
665  return "Client \"$clientName\" added with ID \"$clientId\"";
666  }
667 
675  private function getListOfActiveClients()
676  {
677  $user_pk = Auth::getUserId();
678  $sql = "SELECT pat_pk, user_fk, token_scope, token_name, " .
679  "created_on, active, client_id " .
680  "FROM personal_access_tokens " .
681  "WHERE user_fk = $1 AND active = true AND token_key IS NULL;";
682  $rows = $this->dbManager->getRows($sql, [$user_pk],
683  __METHOD__ . ".getActiveClients");
684  $response = [];
685  foreach ($rows as $row) {
686  $entry = [
687  "id" => $row["pat_pk"] . "." . $user_pk,
688  "name" => $row["token_name"],
689  "created" => $row["created_on"],
690  "clientid" => $row["client_id"],
691  "scope" => $row["token_scope"]
692  ];
693  $response[] = $entry;
694  }
695  array_multisort(array_column($response, "created"), SORT_ASC, $response);
696  return $response;
697  }
698 
703  private function getListOfExpiredClients()
704  {
705  $user_pk = Auth::getUserId();
706  $sql = "SELECT pat_pk, user_fk, token_scope, token_name, " .
707  "created_on, active, client_id " .
708  "FROM personal_access_tokens " .
709  "WHERE user_fk = $1 AND active = false AND token_key IS NULL;";
710  $rows = $this->dbManager->getRows($sql, [$user_pk],
711  __METHOD__ . ".getRevokedClients");
712  $response = [];
713  foreach ($rows as $row) {
714  $entry = [
715  "id" => $row["pat_pk"] . "." . $user_pk,
716  "name" => $row["token_name"],
717  "created" => $row["created_on"],
718  "clientid" => $row["client_id"],
719  "scope" => $row["token_scope"]
720  ];
721  $response[] = $entry;
722  }
723  array_multisort(array_column($response, "created"), SORT_ASC, $response);
724  return $response;
725  }
726 
732  {
733  global $SysConf;
734  return $SysConf['SYSCONFIG']['PATMaxPostExpiryRetention'];
735  } /* getMaxExpiredTokenRetentionPeriod() */
736 }
737 register_plugin(new UserEditPage());
Contains the constants and helpers for authentication of user.
Definition: Auth.php:24
Exception when a token has duplicate key for same user.
Exception when a token has duplicate name for same user.
render($templateName, $vars=null, $headers=null)
Provides helper methods for REST api.
Definition: AuthHelper.php:38
Provides helper methods to access database for REST api.
Definition: DbHelper.php:38
Provides various DAO helper functions for REST api.
Definition: RestHelper.php:32
CreateUserRec(Request $request, $user_pk="")
Create a user record.
Definition: user-edit.php:414
GetUserRec($user_pk)
Get a user record.
Definition: user-edit.php:381
getListOfExpiredClients()
Definition: user-edit.php:703
getListOfActiveClients()
Get a list of active clients for current user.
Definition: user-edit.php:675
IsSessionAdmin($UserRec)
Determine if the session user is an admin.
Definition: user-edit.php:399
UpdateUser($UserRec, $SessionIsAdmin)
Validate and update the user data.
Definition: user-edit.php:249
getListOfActiveTokens()
Get a list of active tokens for current user.
Definition: user-edit.php:554
handle(Request $request)
Allow user to change their account settings (users db table).
Definition: user-edit.php:63
DisplayForm($UserRec, $SessionIsAdmin)
Display the user record edit form.
Definition: user-edit.php:165
getListOfExpiredTokens()
Definition: user-edit.php:586
getUserGroupSelect($userRec)
Definition: user-edit.php:617
getMaxExpiredTokenRetentionPeriod()
getMaxExpiredTokenRetentionPeriod() get the refresh time from DB. @Returns number of days to retain e...
Definition: user-edit.php:731
userAgents($agents=null)
Read the UI form and format the user selected agents into a comma separated list.
AgentCheckBoxMake($upload_pk, $SkipAgents=array(), $specified_username="")
Generate a checkbox list of available agents.
generate_password_policy_string()
passwordPolicyEnabled()
generate_password_policy()
SelectBucketPool($selected, $active='Y')
Return a select list containing all the active bucketpool's.
DBCheckResult($result, $sql, $filenm, $lineno)
Check the postgres result for unexpected errors. If found, treat them as fatal.
Definition: common-db.php:189
GetSingleRec($Table, $Where="")
Retrieve a single database record.
Definition: common-db.php:91
FolderListOption($ParentFolder, $Depth, $IncludeTop=1, $SelectId=-1, $linkParent=false, $OldParent=0)
Create the folder tree, using OPTION tags.
Traceback_uri()
Get the URI without query to this location.
Definition: common-parm.php:97
const PARM_STRING
Definition: common-parm.php:18
GetParm($parameterName, $parameterType)
This function will retrieve the variables and check data types.
Definition: common-parm.php:46
#define PLUGIN_DB_WRITE
Plugin requires write permission on DB.
Definition: libfossology.h:38
#define PERM_READ
Read-only permission.
Definition: libfossology.h:32
#define PLUGIN_DB_NONE
Plugin requires no DB permission.
Definition: libfossology.h:36
#define PLUGIN_DB_READ
Plugin requires read permission on DB.
Definition: libfossology.h:37
#define PLUGIN_DB_ADMIN
Plugin requires admin level permission on DB.
Definition: libfossology.h:39
foreach($Options as $Option=> $OptVal) if(0==$reference_flag &&0==$nomos_flag) $PG_CONN
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16