diff --git a/htdocs/core/lib/usergroups.lib.php b/htdocs/core/lib/usergroups.lib.php index 3b6c29c94e6..1e698c743dd 100644 --- a/htdocs/core/lib/usergroups.lib.php +++ b/htdocs/core/lib/usergroups.lib.php @@ -226,6 +226,13 @@ function user_prepare_head(User $object) $h++; } + if (!empty($object->api_key)) { + $head[$h][0] = DOL_URL_ROOT.'/user/api_token/list.php?id='.$object->id; + $head[$h][1] = $langs->trans("ApiToken"); + $head[$h][2] = 'apitoken'; + $h++; + } + complete_head_from_modules($conf, $langs, $object, $head, $h, 'user', 'remove'); return $head; diff --git a/htdocs/langs/en_US/users.lang b/htdocs/langs/en_US/users.lang index b1505c79b80..12cb850fa6f 100644 --- a/htdocs/langs/en_US/users.lang +++ b/htdocs/langs/en_US/users.lang @@ -144,3 +144,6 @@ CloneCategoriesUser=Clone the user's categories ConfirmUserClone=Are you sure you want to clone the user: %s? NewEmailUserClone=Email address of the new user SocialNetworksUser=Social networks for user +ApiToken=Api token +ListOfTokensForUser=List of tokens for this user +NumberOfPermissions=Number of permissions diff --git a/htdocs/user/api_token/list.php b/htdocs/user/api_token/list.php new file mode 100644 index 00000000000..756f0285d7a --- /dev/null +++ b/htdocs/user/api_token/list.php @@ -0,0 +1,237 @@ + + * Copyright (C) 2010-2015 Regis Houssin + * Copyright (C) 2013 Florian Henry + * Copyright (C) 2018 Ferran Marcet + * Copyright (C) 2024 Frédéric France + * Copyright (C) 2024-2025 MDW + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file htdocs/user/param_ihm.php + * \brief Page to show user setup for display + */ + +// Load Dolibarr environment +require '../../main.inc.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/usergroups.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formadmin.class.php'; + +/** + * @var Conf $conf + * @var DoliDB $db + * @var HookManager $hookmanager + * @var Translate $langs + * @var User $user + */ + +// Load translation files required by page +$langs->loadLangs(array('companies', 'products', 'admin', 'users', 'languages', 'projects', 'members')); + +// Defini si peux lire/modifier permissions +$canreaduser = ($user->admin || $user->hasRight("user", "user", "read")); +$caneditfield = false; + +$id = GETPOSTINT('id'); +$action = GETPOST('action', 'aZ09'); +$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'userihm'; // To manage different context of search + +if (!isset($id) || empty($id)) { + accessforbidden(); +} +'@phan-var-force int<1,max> $id'; + +// $user est le user qui edite, $id est l'id de l'utilisateur edite +$caneditfield = ((($user->id == $id) && $user->hasRight("user", "self", "write")) + || (($user->id != $id) && $user->hasRight("user", "user", "write"))); + + +// Security check +$socid = 0; +if ($user->socid > 0) { + $socid = $user->socid; +} +$feature2 = (($socid && $user->hasRight("user", "self", "write")) ? '' : 'user'); + +// Initialize a technical object to manage hooks of page. Note that conf->hooks_modules contains an array of hook context +$hookmanager->initHooks(array('usercard', 'userihm', 'globalcard')); + +$result = restrictedArea($user, 'user', $id, 'user&user', $feature2); +if ($user->id != $id && !$canreaduser) { + accessforbidden(); +} + +$object = new User($db); +$object->fetch($id, '', '', 1); +$object->loadRights(); + +$form = new Form($db); +$formadmin = new FormAdmin($db); + +/* + * Actions + */ + +$parameters = array('id' => $socid); +$reshook = $hookmanager->executeHooks('doActions', $parameters, $object, $action); // Note that $action and $object may have been modified by some hooks +if ($reshook < 0) { + setEventMessages($hookmanager->error, $hookmanager->errors, 'errors'); +} + +if (empty($reshook)) { + if ($action == 'update' && ($caneditfield || !empty($user->admin))) { + header('Location: '.$_SERVER["PHP_SELF"].'?id='.$id); + exit; + } +} + + +/* + * View + */ + +$person_name = !empty($object->firstname) ? $object->lastname.", ".$object->firstname : $object->lastname; +$title = $person_name." - ".$langs->trans('Card'); +$help_url = ''; + +llxHeader('', $title, $help_url, '', 0, 0, '', '', '', 'mod-user page-card_param_ihm'); + +$head = user_prepare_head($object); + +$title = $langs->trans("User"); + +if ($action == 'edit') { + print '
'; + print ''; + print ''; + print ''; +} + +print dol_get_fiche_head($head, 'apitoken', $title, -1, 'user'); + +$linkback = ''.$langs->trans("BackToList").''; + +$morehtmlref = ''; +$morehtmlref .= img_picto($langs->trans("Download").' '.$langs->trans("VCard"), 'vcard.png', 'class="valignmiddle marginleftonly paddingrightonly"'); +$morehtmlref .= ''; + +$urltovirtualcard = '/user/virtualcard.php?id='.((int) $object->id); +$morehtmlref .= dolButtonToOpenUrlInDialogPopup('publicvirtualcard', $langs->transnoentitiesnoconv("PublicVirtualCardUrl").' - '.$object->getFullName($langs), img_picto($langs->trans("PublicVirtualCardUrl"), 'card', 'class="valignmiddle marginleftonly paddingrightonly"'), $urltovirtualcard, '', 'nohover'); + +dol_banner_tab($object, 'id', $linkback, $user->hasRight("user", "user", "read") || $user->admin, 'rowid', 'ref', $morehtmlref); + +print '
'; + +print '
'; + +print ''; + +// Login +print ''; +if (!empty($object->ldap_sid) && $object->status == 0) { + print ''; +} else { + print ''; +} +print ''."\n"; + +print '
'.$langs->trans("Login").''; + print $langs->trans("LoginAccountDisableInDolibarr"); + print ''; + $addadmin = ''; + if (property_exists($object, 'admin')) { + if (isModEnabled('multicompany') && !empty($object->admin) && empty($object->entity)) { + $addadmin .= img_picto($langs->trans("SuperAdministratorDesc"), "redstar", 'class="paddingleft valignmiddle"'); + } elseif (!empty($object->admin)) { + $addadmin .= img_picto($langs->trans("AdministratorDesc"), "star", 'class="paddingleft valignmiddle"'); + } + } + print showValueWithClipboardCPButton($object->login).$addadmin; + print '
'; + +print '
'; + +print dol_get_fiche_end(); + +print ''."\n"; + +$morehtmlright = ''; +//if (!empty($moreoptions['showhideaddbutton']) && $conf->use_javascript_ajax) { +$tmpurlforbutton = DOL_URL_ROOT.'/user/api_token/list.php?id='.$id.'&action=create'; +// TODO Permissions ? $morehtmlright .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', $tmpurlforbutton, '', $permtoeditline); +$morehtmlright .= dolGetButtonTitle($langs->trans('New'), '', 'fa fa-plus-circle', $tmpurlforbutton); +//} + +print load_fiche_titre($langs->trans("ListOfTokensForUser"), $morehtmlright, ''); + +// TODO : Build the hook management +// Other form for add user to group +//$parameters = array('caneditgroup' => $permissiontoeditgroup, 'groupslist' => $groupslist, 'exclude' => $exclude); +//$reshook = $hookmanager->executeHooks('formAddUserToGroup', $parameters, $object, $action); // Note that $action and $object may have been modified by hook +//print $hookmanager->resPrint; + +if (empty($reshook)) { + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + $sql = "SELECT ot.token, ot.entity, ot.state, ot.datec, ot.tms"; + $sql .= " FROM ".MAIN_DB_PREFIX."oauth_token as ot"; + $sql .= " WHERE ot.fk_user = ".((int) $object->id); + + $resql = $db->query($sql); + + // List of groups of user + if ($db->num_rows($resql) > 0) { + while ($obj = $db->fetch_object($resql)) { + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + } + } else { + print ''; + } + + print "
'.$langs->trans("ApiToken").''.$langs->trans("Entity").''.$langs->trans("NumberOfPermissions").''.$langs->trans("DateCreation").''.$langs->trans("DateModification").'
'; + print $obj->token; + print ''; + print $obj->entity; + print ''; + print $obj->state; + print ''; + print $obj->datec; + print ''; + print $obj->tms; + print '
'.$langs->trans("None").'
"; + print "
"; +} + +// End of page +llxFooter(); +$db->close();