FOSSology  4.6.0-rc1
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  if ($SessionIsAdmin) {
202  $vars['allAccessLevels'] = array(
203  PLUGIN_DB_NONE => _("None (very basic, no database access)"),
204  PLUGIN_DB_READ => _("Read-only (read, but no writes or downloads)"),
205  PLUGIN_DB_WRITE => _("Read-Write (read, download, or edit information)"),
206  PLUGIN_DB_CADMIN => _("Clearing Administrator (read, download, edit information and edit decisions)"),
207  PLUGIN_DB_ADMIN => _("Full Administrator (all access including adding and deleting users)")
208  );
209  $vars['accessLevel'] = $UserRec['user_perm'];
210 
211  $vars['allUserStatuses'] = array(
212  "active" => _("Active"),
213  "inactive" => _("Inactive")
214  );
215 
216  $vars['userStatus'] = $UserRec['user_status'];
217 
218  $SelectedFolderPk = $UserRec['root_folder_fk'];
219  $vars['folderListOption'] = FolderListOption($ParentFolder = -1, $Depth = 0, $IncludeTop = 1, $SelectedFolderPk);
220 
221  }
222  $SelectedDefaultFolderPk = $UserRec['default_folder_fk'];
223  $vars['folderListOption2'] = FolderListOption($ParentFolder = $UserRec['root_folder_fk'], $Depth = 0, $IncludeTop = 1, $SelectedDefaultFolderPk);
224 
225  $vars['isBlankPassword'] = ($UserRec['_blank_pass'] == 'on');
226  $vars['agentSelector'] = AgentCheckBoxMake(-1, array("agent_unpack",
227  "agent_adj2nest", "wget_agent"), $UserRec['user_name']);
228  $vars['bucketPool'] = SelectBucketPool($UserRec["default_bucketpool_fk"]);
229  $vars['defaultGroupOption'] = $this->getUserGroupSelect($UserRec);
230  $vars['uploadVisibility'] = $UserRec['upload_visibility'];
231 
232  return $vars;
233  }
234 
241  function UpdateUser($UserRec, $SessionIsAdmin)
242  {
243  global $PG_CONN;
244 
245  $Errors = "";
246 
247  /**** Validations ****/
248  /* Make sure we have a user_pk */
249  if (empty($UserRec['user_pk'])) {
250  $Errors .= "<li>" . _("Consistency error (User_pk missing). Please start over.") . "</li>";
251  }
252 
253  /* Make sure username looks valid */
254  if (empty($UserRec['user_name'])) {
255  $Errors .= "<li>" . _("Username must be specified.") . "</li>";
256  }
257 
258  /* Verify the user_name is not a duplicate */
259  $CheckUserRec = GetSingleRec("users", "WHERE user_name='$UserRec[user_name]'");
260  if ((!empty($CheckUserRec)) and ( $CheckUserRec['user_pk'] != $UserRec['user_pk'])) {
261  $Errors .= "<li>" . _("Username is not unique.") . "</li>";
262  }
263 
264  /* Make sure password matches */
265  if ($UserRec['_pass1'] != $UserRec['_pass2']) {
266  $Errors .= "<li>" . _("Passwords do not match.") . "</li>";
267  }
268 
269  $oldEmail = $this->dbManager->getSingleRow(
270  "SELECT user_email FROM users WHERE user_pk = $1;",
271  array($UserRec['user_pk']), __METHOD__."oldEmail");
272  if (strcmp($oldEmail['user_email'],$UserRec['user_email']) != 0) {
273  /* Make sure email looks valid */
274  $Check = preg_replace("/[^a-zA-Z0-9@_.+-]/", "", $UserRec['user_email']);
275  if ($Check != $UserRec['user_email']) {
276  $Errors .= "<li>" . _("Invalid email address.") . "</li>";
277  }
278 
279  /* Make sure email is unique */
280  $email_count = 0;
281  if (!empty($UserRec['user_email'])) {
282  $email_count = $this->dbManager->getSingleRow(
283  "SELECT COUNT(*) as count FROM users WHERE user_email = $1 LIMIT 1;",
284  array($UserRec['user_email']), __METHOD__."email_count")["count"];
285  }
286  if ($email_count > 0) {
287  $Errors .= "<li>" . _("Email address already exists.") . "</li>";
288  }
289  }
290 
291  /* Make sure user can't ask for blank password if policy is enabled */
292  if (passwordPolicyEnabled() && !empty($UserRec['_blank_pass'])) {
293  $Errors .= "<li>" . _("Password policy enabled, can't have a blank password.") . "</li>";
294  }
295 
296  /* Did they specify a password and also request a blank password? */
297  if (!empty($UserRec['_blank_pass']) && ( !empty($UserRec['_pass1']) || ! empty($UserRec['_pass2']))) {
298  $Errors .= "<li>" . _("You cannot specify both a password and a blank password.") . "</li>";
299  }
300 
301  /* Make sure password matches policy */
302  if (!empty($UserRec['_pass1']) && !empty($UserRec['_pass2'])) {
303  $policyRegex = generate_password_policy();
304  $result = preg_match('/^' . $policyRegex . '$/m', $UserRec['_pass1']);
305  if ($result !== 1) {
306  $Errors .= "<li>" . _("Password does not match policy.");
307  $Errors .= "<br />" . generate_password_policy_string();
308  $Errors .= "</li>";
309  }
310  }
311 
312  /* Check if the user is member of the group */
313  if (!empty($UserRec['group_fk'])) {
314  $group_map = $this->userDao->getUserGroupMap($UserRec['user_pk']);
315  if (!in_array($UserRec['group_fk'], array_keys($group_map))) {
316  $Errors .= "<li>" . _("User is not member of provided group.") .
317  "</li>";
318  }
319  }
320 
321  /* Make sure only admin can change the username */
322  if ((!Auth::isAdmin()) && ($UserRec['user_name'] != $_SESSION['User'])) {
323  $Errors .= "<li>" . _("Only admin can change the username.") . "</li>";
324  }
325 
326  /* If we have any errors, return them */
327  if (!empty($Errors)) {
328  return _("Errors") . ":<ol>$Errors </ol>";
329  }
330 
331  /**** Update the users database record ****/
332  /* First remove user_pass and user_seed if the password wasn't changed. */
333  if (!empty($UserRec['_blank_pass']) ) {
334  $UserRec['user_seed'] = '';
335  $options = array('cost' => 10);
336  $UserRec['user_pass'] = password_hash("", PASSWORD_DEFAULT, $options);
337  } else if (empty($UserRec['_pass1'])) { // password wasn't changed
338  unset( $UserRec['user_pass']);
339  unset( $UserRec['user_seed']);
340  }
341 
342  /* Build the sql update */
343  $sql = "UPDATE users SET ";
344  $first = true;
345  foreach ($UserRec as $key=>$val) {
346  if ($key[0] == '_' || $key == "user_pk") {
347  continue;
348  }
349  if (!$SessionIsAdmin && ($key == "user_perm" || $key == "root_folder_fk" || $key == "user_status")) {
350  continue;
351  }
352  if (!$first) {
353  $sql .= ",";
354  }
355  $sql .= "$key='" . pg_escape_string($val) . "'";
356  $first = false;
357  }
358  $sql .= " WHERE user_pk=$UserRec[user_pk]";
359  $result = pg_query($PG_CONN, $sql);
360  DBCheckResult($result, $sql, __FILE__, __LINE__);
361  pg_free_result($result);
362 
363  return null;
364  } // UpdateUser()
365 
373  function GetUserRec($user_pk)
374  {
375  if (empty($user_pk)) {
376  throw new Exception("Invalid access. Your session has expired.",1);
377  }
378 
379  $UserRec = GetSingleRec("users", "WHERE user_pk=$user_pk");
380  if (empty($UserRec)) {
381  throw new Exception("Invalid user. ",1);
382  }
383  return $UserRec;
384  }
385 
391  function IsSessionAdmin($UserRec)
392  {
393  return ($UserRec['user_perm'] == PLUGIN_DB_ADMIN);
394  }
395 
406  function CreateUserRec(Request $request, $user_pk="")
407  {
408  /* If a $user_pk was given, use it to read the user db record.
409  * Otherwise, use the form data.
410  */
411  if (!empty($user_pk)) {
412  $UserRec = $this->GetUserRec($user_pk);
413  $UserRec['_pass1'] = "";
414  $UserRec['_pass2'] = "";
415  $UserRec['_blank_pass'] = password_verify('', $UserRec['user_pass']) ? "on" : "";
416  } else {
417  $UserRec = array();
418  $UserRec['user_pk'] = intval($request->get('user_pk'));
419  $UserRec['user_name'] = stripslashes($request->get('user_name'));
420  $UserRec['root_folder_fk'] = intval($request->get('root_folder_fk'));
421  $UserRec['upload_visibility'] = stripslashes($request->get('public'));
422  $UserRec['default_folder_fk'] = intval($request->get('default_folder_fk'));
423  $UserRec['user_desc'] = stripslashes($request->get('user_desc'));
424  $defaultGroup = $request->get('default_group_fk', null);
425  if ($defaultGroup !== null) {
426  $UserRec['group_fk'] = intval($defaultGroup);
427  }
428 
429  $UserRec['_pass1'] = stripslashes($request->get('_pass1'));
430  $UserRec['_pass2'] = stripslashes($request->get('_pass2'));
431  if (!empty($UserRec['_pass1'])) {
432  $UserRec['user_seed'] = 'Seed';
433  $options = array('cost' => 10);
434  $UserRec['user_pass'] = password_hash($UserRec['_pass1'], PASSWORD_DEFAULT, $options);
435  $UserRec['_blank_pass'] = "";
436  } else {
437  $UserRec['user_pass'] = "";
438  $UserRec['_blank_pass'] = stripslashes($request->get("_blank_pass"));
439  if (empty($UserRec['_blank_pass'])) { // check for blank password
440  $StoredUserRec = $this->GetUserRec($UserRec['user_pk']);
441  $options = array('cost' => 10);
442  $UserRec['_blank_pass'] = password_verify($StoredUserRec['user_pass'], password_hash("", PASSWORD_DEFAULT, $options)) ? "on" : "";
443  }
444  }
445 
446  $UserRec['user_perm'] = intval($request->get('user_perm'));
447  $UserRec['user_status'] = stripslashes($request->get('user_status'));
448  $UserRec['user_email'] = stripslashes($request->get('user_email'));
449  $UserRec['email_notify'] = stripslashes($request->get('email_notify'));
450  if (!empty($UserRec['email_notify'])) {
451  $UserRec['email_notify'] = 'y';
452  }
453  $UserRec['user_agent_list'] = is_null($request->get('user_agent_list')) ? userAgents() : $request->get('user_agent_list');
454  $UserRec['default_bucketpool_fk'] = intval($request->get("default_bucketpool_fk"));
455 
456  if ($this->dbManager->existsColumn('users', 'spdx_settings')) {
457  $osselotEnabled = !empty($request->get('osselot_export_enabled')) ? 'checked' : 'unchecked';
458  $spdxCommentEnabled = !empty($request->get('spdx_license_comment_default')) ? 'checked' : 'unchecked';
459  $ignoreFilesEnabled = !empty($request->get('ignore_files_wo_info_default')) ? 'checked' : 'unchecked';
460 
461  $UserRec['spdx_settings'] = "$osselotEnabled,$spdxCommentEnabled,$ignoreFilesEnabled";
462  }
463  }
464  return $UserRec;
465  }
466 
478  function generateNewToken(Request $request)
479  {
480  global $container;
481 
482  $user_pk = Auth::getUserId();
483  $tokenName = $request->get('pat_name');
484  $tokenExpiry = $request->get('pat_expiry');
485  if ($_SESSION[Auth::USER_LEVEL] < 3) {
486  $tokenScope = 'r';
487  } else {
488  $tokenScope = $request->get('pat_scope');
489  }
490  $tokenScope = array_search($tokenScope, RestHelper::SCOPE_DB_MAP);
491  if ($tokenScope === false) {
492  throw new \UnexpectedValueException("Invalid token scope " .
493  $request->get('pat_scope') . ".");
494  }
495  $tokenScope = RestHelper::SCOPE_DB_MAP[$tokenScope];
497  $restHelper = $container->get('helper.restHelper');
498  try {
499  $restHelper->validateTokenRequest($tokenExpiry, $tokenName, $tokenScope);
500  } catch (HttpBadRequestException $e) {
501  throw new \UnexpectedValueException($e->getMessage());
502  }
503 
505  $restDbHelper = $container->get('helper.dbHelper');
506  $key = bin2hex(
507  openssl_random_pseudo_bytes(RestHelper::TOKEN_KEY_LENGTH / 2));
508  try {
509  $jti = $restDbHelper->insertNewTokenKey($user_pk, $tokenExpiry,
510  $tokenScope, $tokenName, $key);
511  } catch (DuplicateTokenKeyException $e) {
512  // Key already exists, try again.
513  $key = bin2hex(
514  openssl_random_pseudo_bytes(RestHelper::TOKEN_KEY_LENGTH / 2));
515  try {
516  $jti = $restDbHelper->insertNewTokenKey($user_pk, $tokenExpiry,
517  $tokenScope, $tokenName, $key);
518  } catch (DuplicateTokenKeyException $e) {
519  // New key also failed, give up!
520  throw new DuplicateTokenKeyException("Please try again later.");
521  } catch (DuplicateTokenNameException $e) {
522  throw $e;
523  }
524  } catch (DuplicateTokenNameException $e) {
525  throw new \UnexpectedValueException($e->getMessage());
526  }
527  return $this->authHelper->generateJwtToken($tokenExpiry,
528  $jti['created_on'], $jti['jti'], $tokenScope, $key);
529  }
530 
539  {
540  $user_pk = Auth::getUserId();
541  $sql = "SELECT pat_pk, user_fk, expire_on, token_scope, token_name, created_on, active " .
542  "FROM personal_access_tokens " .
543  "WHERE user_fk = $1 AND active = true AND client_id IS NULL;";
544  $rows = $this->dbManager->getRows($sql, [$user_pk],
545  __METHOD__ . ".getActiveTokens");
546  $response = [];
547  foreach ($rows as $row) {
548  try {
549  $this->authHelper->isTokenActive($row, $row["pat_pk"]);
550  } catch (HttpForbiddenException $_) {
551  continue;
552  }
553  $entry = [
554  "id" => $row["pat_pk"] . "." . $user_pk,
555  "name" => $row["token_name"],
556  "created" => $row["created_on"],
557  "expire" => $row["expire_on"],
558  "scope" => $row["token_scope"]
559  ];
560  $response[] = $entry;
561  }
562  array_multisort(array_column($response, "created"), SORT_ASC, $response);
563  return $response;
564  }
565 
571  {
572  $user_pk = Auth::getUserId();
573  $retentionPeriod = $this->getMaxExpiredTokenRetentionPeriod();
574  $sql = "SELECT pat_pk, user_fk, expire_on, token_scope, token_name, created_on " .
575  "FROM personal_access_tokens " .
576  "WHERE user_fk = $1 AND active = false " .
577  "AND expire_on >= (SELECT CURRENT_DATE - ($2)::integer) " .
578  "AND client_id IS NULL;";
579  $rows = $this->dbManager->getRows($sql, [$user_pk, $retentionPeriod],
580  __METHOD__ . ".getExpiredTokens");
581  $response = [];
582  foreach ($rows as $row) {
583  $entry = [
584  "id" => $row["pat_pk"] . "." . $user_pk,
585  "name" => $row["token_name"],
586  "created" => $row["created_on"],
587  "expire" => $row["expire_on"],
588  "scope" => $row["token_scope"]
589  ];
590  $response[] = $entry;
591  }
592  array_multisort(array_column($response, "created"), SORT_ASC, $response);
593  return $response;
594  }
595 
601  private function getUserGroupSelect($userRec)
602  {
603  $groups = $this->userDao->getUserGroupMap($userRec['user_pk']);
604  $userDefaults = $this->userDao->getUserAndDefaultGroupByUserName($userRec['user_name']);
605  $options = "";
606  foreach ($groups as $groupId => $groupName) {
607  $options .= "<option value='$groupId' ";
608  if ($groupId == $userDefaults['group_fk']) {
609  $options .= "selected='selected'";
610  }
611  $options .= ">$groupName</option>";
612  }
613  return $options;
614  }
615 
626  private function addNewClient(Request $request)
627  {
628  global $container;
629 
630  $user_pk = Auth::getUserId();
631  $clientName = GetParm('client_name', PARM_STRING);
632  $clientId = GetParm('client_id', PARM_STRING);
633  if ($_SESSION[Auth::USER_LEVEL] < 3) {
634  $clientScope = 'r';
635  } else {
636  $clientScope = GetParm('client_scope', PARM_STRING);
637  }
639  $restHelper = $container->get('helper.restHelper');
640  try {
641  $restHelper->validateNewOauthClient($user_pk, $clientName, $clientScope,
642  $clientId);
643  } catch (HttpBadRequestException $e) {
644  throw new \UnexpectedValueException($e->getMessage());
645  }
646 
647  $restHelper->getDbHelper()->addNewClient($clientName, $user_pk,
648  $clientId, $clientScope);
649  return "Client \"$clientName\" added with ID \"$clientId\"";
650  }
651 
659  private function getListOfActiveClients()
660  {
661  $user_pk = Auth::getUserId();
662  $sql = "SELECT pat_pk, user_fk, token_scope, token_name, " .
663  "created_on, active, client_id " .
664  "FROM personal_access_tokens " .
665  "WHERE user_fk = $1 AND active = true AND token_key IS NULL;";
666  $rows = $this->dbManager->getRows($sql, [$user_pk],
667  __METHOD__ . ".getActiveClients");
668  $response = [];
669  foreach ($rows as $row) {
670  $entry = [
671  "id" => $row["pat_pk"] . "." . $user_pk,
672  "name" => $row["token_name"],
673  "created" => $row["created_on"],
674  "clientid" => $row["client_id"],
675  "scope" => $row["token_scope"]
676  ];
677  $response[] = $entry;
678  }
679  array_multisort(array_column($response, "created"), SORT_ASC, $response);
680  return $response;
681  }
682 
687  private function getListOfExpiredClients()
688  {
689  $user_pk = Auth::getUserId();
690  $sql = "SELECT pat_pk, user_fk, token_scope, token_name, " .
691  "created_on, active, client_id " .
692  "FROM personal_access_tokens " .
693  "WHERE user_fk = $1 AND active = false AND token_key IS NULL;";
694  $rows = $this->dbManager->getRows($sql, [$user_pk],
695  __METHOD__ . ".getRevokedClients");
696  $response = [];
697  foreach ($rows as $row) {
698  $entry = [
699  "id" => $row["pat_pk"] . "." . $user_pk,
700  "name" => $row["token_name"],
701  "created" => $row["created_on"],
702  "clientid" => $row["client_id"],
703  "scope" => $row["token_scope"]
704  ];
705  $response[] = $entry;
706  }
707  array_multisort(array_column($response, "created"), SORT_ASC, $response);
708  return $response;
709  }
710 
716  {
717  global $SysConf;
718  return $SysConf['SYSCONFIG']['PATMaxPostExpiryRetention'];
719  } /* getMaxExpiredTokenRetentionPeriod() */
720 }
721 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:406
GetUserRec($user_pk)
Get a user record.
Definition: user-edit.php:373
getListOfExpiredClients()
Definition: user-edit.php:687
getListOfActiveClients()
Get a list of active clients for current user.
Definition: user-edit.php:659
IsSessionAdmin($UserRec)
Determine if the session user is an admin.
Definition: user-edit.php:391
UpdateUser($UserRec, $SessionIsAdmin)
Validate and update the user data.
Definition: user-edit.php:241
getListOfActiveTokens()
Get a list of active tokens for current user.
Definition: user-edit.php:538
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:570
getUserGroupSelect($userRec)
Definition: user-edit.php:601
getMaxExpiredTokenRetentionPeriod()
getMaxExpiredTokenRetentionPeriod() get the refresh time from DB. @Returns number of days to retain e...
Definition: user-edit.php:715
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:187
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