Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Roles en permissions commands #322

Merged
merged 46 commits into from
Jul 2, 2024
Merged
Show file tree
Hide file tree
Changes from 36 commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
64a5283
Added user commands
nico8948 Jul 20, 2023
67bfd08
Changed indents and add doc comments
Jul 24, 2023
41128a8
corrected phpcs errors, checked for indents..
Jul 24, 2023
9f8337a
phpcs errors run 5644308163
Jul 25, 2023
8bbfa5c
PR #316
Jul 27, 2023
6e9b6ab
Apply minor suggestions from code review
yorkshire-pudding Jul 29, 2023
4e12f04
Removed auto creation role
Aug 1, 2023
856e8de
Add additional tests
Aug 1, 2023
c232eb2
Cannot redeclare UserCommandsTest::test_user_password_command_works()
Aug 1, 2023
626bc1b
idents errors
Aug 1, 2023
ac87c56
changed username joe
Aug 2, 2023
24e4714
Test sequence is important, user cancel at the end..
Aug 2, 2023
26feaa5
Apply suggestions from code review
yorkshire-pudding Aug 2, 2023
ff4308d
Fix PHPCS
yorkshire-pudding Aug 2, 2023
0b68820
changed user back to joe
Aug 3, 2023
6747f87
Roles and permission commands
Aug 3, 2023
9b7538e
added RolesCommandsTest.php
Aug 3, 2023
49026cd
added RolesCommandsTest.php
Aug 3, 2023
845395c
Add node commands, like list, create, update and delete
Aug 21, 2023
d124006
added backdrop/NodesCommandsTest.php
Aug 21, 2023
60d35e5
add test file NodesCommandsTest.php
Aug 21, 2023
ae7f438
Add menu commands, like list, create, update and delete
Aug 28, 2023
354f9f8
Merge branch 'backdrop-contrib:1.x-1.x' into 1.x-1.x
nico8948 Aug 29, 2023
1da7ed2
Tue Aug 29 02:23:06 PM CEST 2023
Aug 29, 2023
feb6d9f
Wed Aug 30 09:19:41 AM CEST 2023
Aug 30, 2023
df2acaa
assertRegExp() is deprecated!
Aug 30, 2023
7eeb2ed
changed add role help, add definition
Jun 18, 2024
0f94fe8
changed function names
Jun 18, 2024
4acaf51
changed role test alphabetically
Jun 18, 2024
8f4c309
permissions; list only modules with permissions
Jun 18, 2024
5147e85
184 | ERROR | [x] Expected 1 space(s) after closing parenthesis
Jun 18, 2024
45d1566
Update commands/role.bee.inc
nico8948 Jun 20, 2024
4373fe5
Update commands/role.bee.inc
nico8948 Jun 20, 2024
18658d4
Update tests/backdrop/RolesCommandsTest.php
nico8948 Jun 20, 2024
2a6789d
Changed variables to full names
Jun 20, 2024
7570a64
Changed table roles output into text etc.
Jun 25, 2024
9505805
Add role example
Jun 25, 2024
4ef27b4
Update commands/role.bee.inc
nico8948 Jun 26, 2024
6e1a48e
Update commands/role.bee.inc
nico8948 Jun 26, 2024
0abe5e4
Update commands/role.bee.inc
nico8948 Jun 26, 2024
ddfd02b
Update commands/role.bee.inc
nico8948 Jun 26, 2024
3002596
removed condition at line 134
Jun 26, 2024
c852cb9
newline in listing etc
Jun 26, 2024
17bc79f
Update tests/backdrop/RolesCommandsTest.php
yorkshire-pudding Jun 26, 2024
9288292
Changed output role to text, check for permissions
Jul 2, 2024
d591860
Update commands/role.bee.inc
nico8948 Jul 2, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
386 changes: 386 additions & 0 deletions commands/role.bee.inc
Original file line number Diff line number Diff line change
@@ -0,0 +1,386 @@
<?php
/**
* @file
* Command(s) for working with roles.
*/

/**
* Implements hook_bee_command().
*/
function role_bee_command() {
return array(
'roles' => array(
'description' => bt('List all roles with the permissions.'),
'callback' => 'roles_bee_callback',
'group' => 'roles',
'aliases' => array('rls', 'roles-list'),
'options' => array(
'role' => array(
'description' => bt("Get the permissions granted to this role."),
'value' => bt('Role'),
),
),
'bootstrap' => BEE_BOOTSTRAP_FULL,
'examples' => array(
'bee roles' => bt('Display a list of all roles with the permissions for the current site.'),
),
yorkshire-pudding marked this conversation as resolved.
Show resolved Hide resolved
),
'permissions' => array(
'description' => bt('List all permissons of the modules.'),
'callback' => 'permissions_bee_callback',
'group' => 'roles',
'aliases' => array('pls', 'permissions-list'),
'options' => array(
'module' => array(
'description' => bt("Get the permissions for this module."),
'value' => bt('Module'),
),
),
'bootstrap' => BEE_BOOTSTRAP_FULL,
'examples' => array(
'bee permissions' => bt('Display a list of all permissions of the modules for the current site.'),
'bee permissions --module=node' => bt('Display a list of all permissions from the module node for the current site.'),
),
),

'role-create' => array(
'description' => bt('Add a role.'),
'callback' => 'role_add_bee_callback',
'group' => 'roles',
'arguments' => array(
'role' => bt('Role to add'),
),
'aliases' => array('rcrt'),
'bootstrap' => BEE_BOOTSTRAP_FULL,
'examples' => array(
'bee role-create manager' => bt("Add role 'manager'."),
),
),
'role-delete' => array(
'description' => bt('Delete a role.'),
'callback' => 'role_delete_bee_callback',
'group' => 'roles',
'arguments' => array(
'role' => bt('Role to delete'),
),
'aliases' => array('rdel'),
'bootstrap' => BEE_BOOTSTRAP_FULL,
'examples' => array(
'bee role-delete manager' => bt("Delete role 'manager'."),
),
),
'role-add-perm' => array(
'description' => bt('Grant specified permission(s) to a role.'),
'callback' => 'role_add_permission_bee_callback',
'group' => 'roles',
'arguments' => array(
'permissions' => bt('Permissions'),
'role' => bt('Role'),
),
'aliases' => array('rap'),
'bootstrap' => BEE_BOOTSTRAP_FULL,
'examples' => array(
'bee role-add-perm \'post comments\' \'anonymous user\'' => bt("Allow anon users to post comments."),
'bee role-add-perm "\'view own unpublished content\' , \'view any unpublished content\' , \'view revisions\'" \'anonymous user\'' => bt("Grant multiple permissions to the anon users"),
),
),
'role-remove-perm' => array(
'description' => bt('Remove specified permission(s) from a role.'),
'callback' => 'role_remove_permission_bee_callback',
'group' => 'roles',
'arguments' => array(
'permissions' => bt('Permissions'),
'role' => bt('Role'),
),
'aliases' => array('rrp'),
'bootstrap' => BEE_BOOTSTRAP_FULL,
'examples' => array(
'bee role-remove-perm \'access content\' \'anonymous user\'' => bt("Hide content from anon users."),
'bee role-remove-perm "\'view own unpublished content\' , \'view any unpublished content\' , \'view revisions\'" \'anonymous user\'' => bt("Remove multiple permissions from the anon users"),
),
),
);
}

/**
* Command callback: List all roles.
*/
function roles_bee_callback($arguments, $options) {
$rows = array();
$roles = user_roles(TRUE);
nico8948 marked this conversation as resolved.
Show resolved Hide resolved
unset($roles['authenticated']);
yorkshire-pudding marked this conversation as resolved.
Show resolved Hide resolved
if (!empty($options['role'])) {
// If a role has been specified, check if exists, and return error if
// not.
$role = strtolower($options['role']);
if (!array_key_exists($role, $roles)) {
bee_message(bt("The role '!role' doesn't exists!", array(
'!role' => $role,
)), 'error');
return;
}
$role_array = array(strtolower($options['role']));
$permissions = implode('\',\'', user_role_permissions($role_array));
nico8948 marked this conversation as resolved.
Show resolved Hide resolved
if (!empty($permissions)) {
$permissions = '\''.$permissions.'\'';
nico8948 marked this conversation as resolved.
Show resolved Hide resolved
}
bee_message(bt("The !role role has the following permissions granted: !permissions", array(
'!role' => $options['role'],
'!permissions' => $permissions,
)));
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. The output should be inside the positive pathway
  2. Like the permissions_bee_callback() this needs to be output as text, not as a message.
  3. There needs to be a negative pathway (i.e. if no permissions have been granted). It's not necessarily an error but the message needs to be different. Perhaps an info message? The role will have all authenticated permissions, so it's not like they won't have permissions, so the message needs to reflect that.

This comment was marked as resolved.

}
else {
$output = array();
foreach ($roles as $role => $value) {
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
foreach ($roles as $role => $value) {
foreach ($roles as $role => $role_label) {

This comment was marked as resolved.

if (!empty($role)) {
yorkshire-pudding marked this conversation as resolved.
Show resolved Hide resolved
$role_array = array($role);
$permissions = implode('\' , \'', user_role_permissions($role_array));
nico8948 marked this conversation as resolved.
Show resolved Hide resolved
if (!empty($permissions)) {
$permissions = '\''.$permissions.'\'';
}
$output[] = array(
'type' => 'text',
'variables' => array(
'value' => strtoupper($role) . ': ' . $permissions ,
),
);
yorkshire-pudding marked this conversation as resolved.
Show resolved Hide resolved
$output[] = array(
'type' => 'text',
'variables' => array(
'value' => '' ,
),
);
yorkshire-pudding marked this conversation as resolved.
Show resolved Hide resolved
}
}
return($output);
}
}

/**
* Command callback: List all permissions of the modules.
*/
function permissions_bee_callback($arguments, $options) {
$module_list = module_list();
if (!empty($options['module'])) {
// If a module has been specified, check it is active, and return error if
// not.
$module = strtolower($options['module']);
if (!array_key_exists($module, $module_list)) {
bee_message(bt("The module '!module' is not enabled.", array(
'!module' => $module,
)), 'error');
return;
}
// Check if the module has permissions defined.
$permissions = module_invoke($module, 'permission');
if (!empty($permissions)) {
// Convert the permissions array to a comma separated list of quoted
// permissions.
$permissions = implode('\',\'', array_keys($permissions));
$permissions = '\'' . $permissions . '\'';
// Prepare the command output.
$output = array(array(
'type' => 'text',
'variables' => array(
'value' => bt("The module '!module' has the following permissions: !permissions ", array(
'!module' => $module,
'!permissions' => $permissions,
)),
),
),);
return $output;
}
else {
// If the module has no defined permissions, return an error.
bee_message(bt("The module '!module' has no permissions defined.", array(
'!module' => $module,
)), 'error');
return;
}
}
else {
// If no module is defined, show all modules with permissions.
$output = array();
// Check all active modules for defined permissions.
foreach ($module_list as $key => $module) {
$permissions = module_invoke($module, 'permission');
if (!empty($permissions)) {
// If permissions exist for the module, convert the permissions array
// to a comma separated list of quoted permissions.
$permissions = implode('\',\'', array_keys($permissions));
$permissions = '\''.$permissions.'\'';
// Prepare the command output.
$output[] = array(
'type' => 'text',
'variables' => array(
'value' => strtoupper($module) . ': ' . $permissions ,
),
);
$output[] = array(
'type' => 'text',
'variables' => array(
'value' => '' ,
),
);
yorkshire-pudding marked this conversation as resolved.
Show resolved Hide resolved
}
}
return $output;
}
}

/**
* Command callback: Add a role
*/
function role_add_bee_callback($arguments, $options) {
$roles = user_roles(TRUE);
if (empty($roles[$arguments['role']])) {
$role = new stdClass();
$role->name = $arguments['role'];
$role->label = $arguments['role'];
if (user_role_save($role)) {
bee_message(bt("The !role role has been created.", array(
'!role' => $arguments['role'],
)), 'success');
}
else {
bee_message(bt("The !role role creation failed.", array(
'!role' => $arguments['role'],
)), 'error');
}
}
else {
bee_message(bt("The !role role allready exists.", array(
'!role' => $arguments['role'],
)), 'error');
}
}

/**
* Command callback: Delete a role
*/
function role_delete_bee_callback($arguments, $options) {
$roles = user_roles(TRUE);
if (empty($roles[$arguments['role']])) {
bee_message(bt("The !role role does not exits.", array(
'!role' => $arguments['role'],
)));
return;
}
// Is the role in use by an user?
$users = entity_load_multiple('user');

foreach ($users as $user) {
// Skip the 'anonymous' user.
if ($user->uid == 0) {
continue;
}
if (in_array($arguments['role'], $user->roles)) {
bee_message(bt("The !role role is in use by user !user", array(
'!role' => $arguments['role'],
'!user' => $user->name,
)), 'error');
return;
}
}
// Delete the role.
user_role_delete($arguments['role']);
$roles = user_roles(TRUE);
if (empty($roles[$arguments['role']])) {
bee_message(bt("The !role role has been deleted.", array(
'!role' => $arguments['role'],
)), 'success');
}
else {
bee_message(bt("The !role role could not be deleted", array(
'!role' => $arguments['role'],
)), 'error');
}
}

/**
* Command callback: Add permission(s) to a role
*/
function role_add_permission_bee_callback($arguments, $options) {
$roles = user_roles(TRUE);
// Do the role exists?
if (empty($roles[$arguments['role']])) {
bee_message(bt("The !role role does not exits.", array(
'!role' => $arguments['role'],
)));
return;
}
// Do the permission exists?
$module_list = module_list();
$permissions = array();
foreach ($module_list as $key => $module) {
$modify_permission = module_invoke($module, 'permission');
if (!empty($modify_permission)) {
$permissions = array_merge($permissions, array_keys($modify_permission));
}
}
$permissions = explode(',', (str_replace('\'', '', (str_replace('"', '', $arguments['permissions'])))));
foreach ($permissions as $permission) {
if (! in_array("$permission", $permissions)) {
bee_message(bt("The !permission permission could not be found!", array(
'!permission' => $permission,
)), 'error');
return;
}
}
// Grant the permissions.
user_role_grant_permissions($arguments['role'], $permissions);
$role = array($arguments['role']);
$permissions = implode('\',\'', user_role_permissions($role));
if (!empty($permissions)) {
$permissions = '\''.$permissions.'\'';
}
bee_message(bt("The !role role has the following permissions granted: !permissions", array(
'!role' => $arguments['role'],
'!permissions' => $permissions,
)), 'success');
}

/**
* Command callback: Remove permission(s) from a role
*/
function role_remove_permission_bee_callback($arguments, $options) {
$roles = user_roles(TRUE);
// Do the role exists?
if (empty($roles[$arguments['role']])) {
bee_message(bt("The !role role does not exits.", array(
'!role' => $arguments['role'],
)));
return;
}
$grant_permissions = array();
$permissions = explode(',', (str_replace('\'', '', (str_replace('"', '', $arguments['permissions'])))));
$role = array($arguments['role']);
$current_permissions = user_role_permissions($role);
// First set all to TRUE.
// Any value that evaluates to TRUE will cause the permission to be granted.
if ( ! empty($current_permissions)) {
foreach ($permissions as $permission) {
$grant_permissions[$permission] = TRUE;
}
}
foreach ($permissions as $permission) {
if (! in_array("$permission", $current_permissions)) {
bee_message(bt("The !permssion permission has not be granted!", array(
'!permission' => $permssion,
)), 'error');
return;
}
else {
$grant_permissions[$permission] = FALSE;
}
}
user_role_change_permissions($arguments['role'], $grant_permissions);
$permissions = implode('\',\'', user_role_permissions($role));
if (!empty($permissions)) {
$permissions = '\''.$permissions.'\'';
}
bee_message(bt("The !role role has the following permissions granted: !perms", array(
'!role' => $arguments['role'],
'!perms' => $permissions,
)), 'success');
}
Loading
Loading