This bug come from a part of code that use old database field "reviewers" (from previous workspace structure before TYPO3 v4.5) of "sys_workspace" table.
/typo3/sysext/core/Classes/Authentication/BackendUserAuthentication.php
function checkWorkspace(...)
// Checking if he is reviewer user:
if (GeneralUtility::inList($wsRec['reviewers'], 'be_users_' . $this->user['uid'])) {
return array_merge($wsRec, array('_ACCESS' => 'reviewer'));
}
// Checking if he is reviewer through a user group of his:
foreach ($this->userGroupsUID as $groupUid) {
if (GeneralUtility::inList($wsRec['reviewers'], 'be_groups_' . $groupUid)) {
return array_merge($wsRec, array('_ACCESS' => 'reviewer'));
}
}
$wsRec['reviewers'] is the field "reviewers" of the table "sys_workspace", and was used long time ago (before v4.5) to store the list of users selected for review.
The 4.5 migration didn't empty this field while creating the new workspace "custom stage".
This field doesn't have a valid TCA declaration, but still in sql declaration, and couldn't be updated (without use of phpmyadmin or equivalent).
The result of "_ACCESS" is checked in function workspaceCheckStageForCurrent(...) for custom stage :
if ($workspaceRec['custom_stages'] > 0 && $stage !== 0 && $stage !== -10) {
// Get custom stage record
$workspaceStageRec = BackendUtility::getRecord('sys_workspace_stage', $stage);
// Check if the user is responsible for the current stage
if (
$stat['_ACCESS'] === 'owner'
|| $stat['_ACCESS'] === 'member'
&& GeneralUtility::inList($workspaceStageRec['responsible_persons'], 'be_users_' . $this->user['uid'])
) {
return true;
}
[...]
}
For users already listed in old field "reviewers", they are flagged $stat['_ACCESS'] ="reviewer", so they are not allowed to manage custom stage (only owner or member responsible of custom stage are allowed here)
The text "reviewer" is also used in various places of the code (in workspace notification, in some sql query, in dataset for testing).
I think all those parts of code can be removed.