From 89cb3ce03ad98d0c673506604f8d68c70046636e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julio=20Cesar=20Laura=20Avenda=C3=B1o?= Date: Thu, 12 Sep 2019 09:56:50 -0400 Subject: [PATCH] PMC-780 --- database/factories/RbacRolesFactory.php | 17 ++++++ database/factories/RbacUsersFactory.php | 46 ++++++++++++++++ database/factories/RbacUsersRolesFactory.php | 17 ++++++ rbac/engine/classes/model/Roles.php | 2 + .../rbac/engine/classes/model/RolesTest.php | 55 +++++++++++++++++++ .../src/ProcessMaker/Model/RbacRoles.php | 12 ++++ .../src/ProcessMaker/Model/RbacUsers.php | 12 ++++ .../src/ProcessMaker/Model/RbacUsersRoles.php | 12 ++++ 8 files changed, 173 insertions(+) create mode 100644 database/factories/RbacRolesFactory.php create mode 100644 database/factories/RbacUsersFactory.php create mode 100644 database/factories/RbacUsersRolesFactory.php create mode 100644 tests/unit/rbac/engine/classes/model/RolesTest.php create mode 100644 workflow/engine/src/ProcessMaker/Model/RbacRoles.php create mode 100644 workflow/engine/src/ProcessMaker/Model/RbacUsers.php create mode 100644 workflow/engine/src/ProcessMaker/Model/RbacUsersRoles.php diff --git a/database/factories/RbacRolesFactory.php b/database/factories/RbacRolesFactory.php new file mode 100644 index 000000000..f4ce2a7bc --- /dev/null +++ b/database/factories/RbacRolesFactory.php @@ -0,0 +1,17 @@ +define(\ProcessMaker\Model\RbacRoles::class, function(Faker $faker) { + return [ + 'ROL_UID' => G::generateUniqueID(), + 'ROL_PARENT' => '', // This value is empty because actually don't exists this type of relations between roles + 'ROL_SYSTEM' => '00000000000000000000000000000002', // Hardcoded value, this value refers to ProcessMaker + 'ROL_CODE' => strtoupper($faker->word), + 'ROL_CREATE_DATE' => $faker->date('Y-m-d H:i:s', 'now'), + 'ROL_UPDATE_DATE' => $faker->date('Y-m-d H:i:s', 'now'), + 'ROL_STATUS' => $faker->randomElement([0, 1]) + ]; +}); diff --git a/database/factories/RbacUsersFactory.php b/database/factories/RbacUsersFactory.php new file mode 100644 index 000000000..00413b726 --- /dev/null +++ b/database/factories/RbacUsersFactory.php @@ -0,0 +1,46 @@ +define(\ProcessMaker\Model\RbacUsers::class, function (Faker $faker) { + return [ + 'USR_UID' => G::generateUniqueID(), + 'USR_USERNAME' => $faker->unique()->userName, + 'USR_PASSWORD' => $faker->password, + 'USR_FIRSTNAME' => $faker->firstName, + 'USR_LASTNAME' => $faker->lastName, + 'USR_EMAIL' => $faker->unique()->email, + 'USR_DUE_DATE' => $faker->dateTimeInInterval('now', '+1 year')->format('Y-m-d H:i:s'), + 'USR_CREATE_DATE' => $faker->date('Y-m-d H:i:s', 'now'), + 'USR_UPDATE_DATE' => $faker->date('Y-m-d H:i:s', 'now'), + 'USR_STATUS' => $faker->randomElement([0, 1]), + 'USR_AUTH_TYPE' => 'MYSQL', // Authentication type, by default is MySQL + 'UID_AUTH_SOURCE' => '00000000000000000000000000000000', // When the type is "MYSQL" the value for this field is this... + 'USR_AUTH_USER_DN' => '', // Don't required for now + 'USR_AUTH_SUPERVISOR_DN' => '' // Don't required for now + ]; +}); + +// Create a deleted user +$factory->state(\ProcessMaker\Model\RbacUsers::class, 'deleted', function () { + return [ + 'USR_USERNAME' => '', + 'USR_STATUS' => 0, + 'USR_AUTH_TYPE' => '', + 'UID_AUTH_SOURCE' => '' + ]; +}); + +// Create an active user +$factory->state(\ProcessMaker\Model\RbacUsers::class, 'active', function () { + return [ + 'USR_STATUS' => 1 + ]; +}); + +// Create an inactive user +$factory->state(\ProcessMaker\Model\RbacUsers::class, 'inactive', function () { + return [ + 'USR_STATUS' => 0 + ]; +}); diff --git a/database/factories/RbacUsersRolesFactory.php b/database/factories/RbacUsersRolesFactory.php new file mode 100644 index 000000000..6d912a9c4 --- /dev/null +++ b/database/factories/RbacUsersRolesFactory.php @@ -0,0 +1,17 @@ +define(\ProcessMaker\Model\RbacUsersRoles::class, function() { + return [ + 'USR_UID' => function() { + $rbacUser = factory(\ProcessMaker\Model\RbacUsers::class)->create(); + return $rbacUser->USR_UID; + }, + 'ROL_UID' => function() { + $rbacRole = factory(\ProcessMaker\Model\RbacRoles::class)->create(); + return $rbacRole->ROL_UID; + } + ]; +}); diff --git a/rbac/engine/classes/model/Roles.php b/rbac/engine/classes/model/Roles.php index 871ace93a..09ec91c80 100644 --- a/rbac/engine/classes/model/Roles.php +++ b/rbac/engine/classes/model/Roles.php @@ -873,6 +873,8 @@ class Roles extends BaseRoles $criteria->addSelectColumn(RbacUsersPeer::USR_UID); $criteria->add(RolesPeer::ROL_UID, '', Criteria::NOT_EQUAL); $criteria->add(RolesPeer::ROL_UID, $rolUid); + // If the username is empty, the user was deleted in the application + $criteria->add(RbacUsersPeer::USR_USERNAME, '', Criteria::NOT_EQUAL); $criteria->addJoin(RolesPeer::ROL_UID, UsersRolesPeer::ROL_UID); $criteria->addJoin(UsersRolesPeer::USR_UID, RbacUsersPeer::USR_UID); diff --git a/tests/unit/rbac/engine/classes/model/RolesTest.php b/tests/unit/rbac/engine/classes/model/RolesTest.php new file mode 100644 index 000000000..c032095c8 --- /dev/null +++ b/tests/unit/rbac/engine/classes/model/RolesTest.php @@ -0,0 +1,55 @@ +create(); + $deletedUser = factory(RbacUsers::class)->states('deleted')->create(); + $activeUser = factory(RbacUsers::class)->states('active')->create(); + $inactiveUser = factory(RbacUsers::class)->states('inactive')->create(); + + // Assign the role to a deleted user + factory(RbacUsersRoles::class)->create([ + 'ROL_UID' => $role->ROL_UID, + 'USR_UID' => $deletedUser->USR_UID + ]); + // Should be 0, because a deleted user should not be considered + $this->assertEquals(0, $rolesInstance->numUsersWithRole($role->ROL_UID)); + + // Assign the role to an active user + factory(RbacUsersRoles::class)->create([ + 'ROL_UID' => $role->ROL_UID, + 'USR_UID' => $activeUser->USR_UID + ]); + // Should be 1, because only the active user should be considered + $this->assertEquals(1, $rolesInstance->numUsersWithRole($role->ROL_UID)); + + // Assign the role to an inactive user + factory(RbacUsersRoles::class)->create([ + 'ROL_UID' => $role->ROL_UID, + 'USR_UID' => $inactiveUser->USR_UID + ]); + // Should be 2, because only the active and the inactive users should be considered + $this->assertEquals(2, $rolesInstance->numUsersWithRole($role->ROL_UID)); + } +} diff --git a/workflow/engine/src/ProcessMaker/Model/RbacRoles.php b/workflow/engine/src/ProcessMaker/Model/RbacRoles.php new file mode 100644 index 000000000..5f14bb9ec --- /dev/null +++ b/workflow/engine/src/ProcessMaker/Model/RbacRoles.php @@ -0,0 +1,12 @@ +