Task Issue 889 UserMgmt DefaultRole Guest - sebiboga/testlink-upgraded GitHub Wiki
Task 889 β Default role + reserved/undefined role handling in User Management create/edit (gap vs legacy)
Issue: #889
Branch: task/issue-889-default-role
Status: IMPLEMENTED / VERIFIED (2026-09-12)
The legacy User Management create/edit flow (lib/usermanagement/usersEdit.php +
gui/templates/dashio/usermanagement/usersEdit.tpl) never shows the undefined /
<inherited> role (id 0) in the Global Role dropdown and defaults a new user to
$tlCfg->default_roleid (guest, role 5). The modern screen originally offered
{"id":0,"name":"<inherited>"} in GET /api/users/meta/roles and pre-selected the
first dropdown option on create β <reserved system role 1> (id 1, zero rights) β
so users created from the UI got a role with no rights, and editing a user with a
0/absent stored role could silently rewrite them onto the reserved role.
-
lib/usermanagement/usersEdit.php:77-78β role dropdown list is built withtlRole::getAll(..., TLOBJ_O_GET_DETAIL_MINIMUM)and thenunset($roles[TL_ROLES_UNDEFINED])β the id-0 pseudo-role is never selectable. -
gui/templates/dashio/usermanagement/usersEdit.tpl:240-243β$selected_role = $gui->user->globalRoleID; if ($gui->user->globalRoleID eq 0) $selected_role = $tlCfg->default_roleid;(config.inc.php:1968=TL_ROLES_GUEST, role 5). -
doCreate()/doUpdate()persist the selectedrights_idverbatim; because the dropdown never contains 0, role-0-by-omission cannot happen through the UI.
Landing commit: 80790f9d3 "fix(usersView): preselect default_roleid (guest) for
create/edit instead of reserved role 1 (Fixes #1412)" β already on the default
branch; this task verified and documented the full parity.
BFF api/users/index.php
-
GET /users/meta/roles(lines 189-207): skipsintval($r->dbID) <= 0(mirror of legacyunset($roles[TL_ROLES_UNDEFINED])) and exposesdefaultRoleID = intval(config_get('default_roleid')). -
POST /users(lines 293-294):$roleID = intval($body['globalRoleID'] ?? 0);$u->globalRoleID = $roleID > 0 ? $roleID : intval(config_get('default_roleid'))β a missing/zero role can never persist as a reserved/zero-rights role.
Frontend gui/templates/usermanagement/usersView.html
- New
presetRole(value)(lines 384-393): 0/absent βdefaultRoleID, otherwise selects the requested role when present, else first option. -
showCreateModal()line 408 βpresetRole(defaultRoleID)(legacy create default). -
editUser()line 433 βpresetRole(u.globalRoleID)(legacy edit preselection).
No i18n bundle was touched β every label/option content already exists (no new
user-facing string). php -l and node --check clean on the touched files.


-
GET /api/users/meta/rolesβitemsids 1..9 only (no<inherited>),defaultRoleID: 5. - Create modal β Global Role preselected guest, 9 options, no id 0.
- Create
rolletestkeeping the default β DBrole_id = 5(guest). - Create
roleditpickpicking "tester" β DBrole_id = 7(explicit preserved). - Edit
rolletestguestβtester β DBrole_id = 7; back to guest βrole_id = 5. - Legacy edge:
UPDATE users SET role_id=0onroleditpick, open Edit β modal preselects guest (5), Save persistsrole_id = 5β exactusersEdit.tpl:240-243behavior. - BFF POST without
globalRoleIDβ HTTP 200globalRoleID: 5; withglobalRoleID: 0β HTTP 200globalRoleID: 5. - Event Viewer /
eventstable:log_level <= 3count = 0 (onlylog_level=16audit rows); browser console clean.
tmp/TLU_Test_Cases.md β "Task β Issue #889: Default role + reserved/undefined role
handling in User Management create/edit (gap vs legacy)" β 11/11 PASS.
-
api/users/index.phpβ role-0 filter +defaultRoleID+ POST role fallback (landed in80790f9d3, Refs #1412). -
gui/templates/usermanagement/usersView.htmlβpresetRole()for create/edit (landed in80790f9d3). -
CHANGELOGβ NEW FEATURES entry (#889). -
tmp/TLU_Test_Cases.mdβ Task suite #889.