Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
0.00% covered (danger)
0.00%
0 / 46
0.00% covered (danger)
0.00%
0 / 13
CRAP
0.00% covered (danger)
0.00%
0 / 1
tao_models_classes_RoleService
0.00% covered (danger)
0.00%
0 / 46
0.00% covered (danger)
0.00%
0 / 13
342
0.00% covered (danger)
0.00%
0 / 1
 __construct
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 initRole
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 getRole
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
 getRoleClass
0.00% covered (danger)
0.00%
0 / 3
0.00% covered (danger)
0.00%
0 / 1
2
 setRoleToUsers
0.00% covered (danger)
0.00%
0 / 11
0.00% covered (danger)
0.00%
0 / 1
20
 getUsers
0.00% covered (danger)
0.00%
0 / 7
0.00% covered (danger)
0.00%
0 / 1
2
 addRole
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 removeRole
0.00% covered (danger)
0.00%
0 / 2
0.00% covered (danger)
0.00%
0 / 1
2
 getIncludedRoles
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 includeRole
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 unincludeRole
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
2
 getAllRoles
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 1
2
 createInstance
0.00% covered (danger)
0.00%
0 / 4
0.00% covered (danger)
0.00%
0 / 1
6
1<?php
2
3/*
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; under version 2
7 * of the License (non-upgradable).
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
17 *
18 * Copyright (c) 2002-2008 (original work) Public Research Centre Henri Tudor & University of Luxembourg
19 *                         (under the project TAO & TAO2);
20 *               2008-2010 (update and modification) Deutsche Institut für Internationale Pädagogische Forschung
21 *                         (under the project TAO-TRANSFER);
22 *               2009-2012 (update and modification) Public Research Centre Henri Tudor
23 *                         (under the project TAO-SUSTAIN & TAO-DEV);
24 *
25 */
26
27use oat\generis\model\GenerisRdf;
28use oat\oatbox\event\EventManagerAwareTrait;
29use oat\tao\model\event\RoleChangedEvent;
30use oat\tao\model\event\RoleCreatedEvent;
31use oat\tao\model\event\RoleRemovedEvent;
32
33/**
34 * This class provide service on user roles management
35 *
36 * @access public
37 * @author Joel Bout, <joel@taotesting.com>
38 * @package tao
39 */
40class tao_models_classes_RoleService extends tao_models_classes_GenerisService implements
41    core_kernel_users_RolesManagement
42{
43    use EventManagerAwareTrait;
44
45    /**
46     * the core user service
47     *
48     * @access public
49     * @var core_kernel_users_Service
50     */
51    protected $generisUserService = null;
52
53    /**
54     * the class of the target role
55     *
56     * @access public
57     * @var core_kernel_classes_Class
58     */
59    private $roleClass = null;
60
61
62    /**
63     * Constructor, calls the initRole method.
64     *
65     * @access protected
66     * @author Joel Bout, <joel@taotesting.com>
67     */
68    protected function __construct()
69    {
70        parent::__construct();
71        $this->generisUserService = core_kernel_users_Service::singleton();
72        $this->initRole();
73    }
74
75    /**
76     * Initialize the allowed role.
77     * To be overriden.
78     *
79     * @access protected
80     * @author Joel Bout, <joel@taotesting.com>
81     * @return mixed
82     */
83    protected function initRole()
84    {
85        $this->roleClass = new core_kernel_classes_Class(GenerisRdf::CLASS_ROLE);
86    }
87
88    /**
89     * Get the Role matching the uri
90     *
91     * @access public
92     * @author Joel Bout, <joel@taotesting.com>
93     * @param  string uri
94     * @return core_kernel_classes_Resource
95     */
96    public function getRole($uri)
97    {
98        $returnValue = null;
99
100        if (!empty($uri)) {
101            $returnValue = new core_kernel_classes_Resource($uri);
102        }
103
104        return $returnValue;
105    }
106
107    /**
108     * get the target role class
109     *
110     * @access public
111     * @author Joel Bout, <joel@taotesting.com>
112     * @return core_kernel_classes_Class
113     */
114    public function getRoleClass()
115    {
116        $returnValue = null;
117
118        $returnValue = $this->roleClass;
119
120        return $returnValue;
121    }
122
123    /**
124     * assign a role to a set of users
125     *
126     * @access public
127     * @author Joel Bout, <joel@taotesting.com>
128     * @param  Resource role
129     * @param  array users
130     * @return boolean
131     */
132    public function setRoleToUsers(core_kernel_classes_Resource $role, $users = [])
133    {
134        $returnValue = (bool) false;
135        $userService = tao_models_classes_UserService::singleton();
136
137        $rolesProperty = new core_kernel_classes_Property(GenerisRdf::PROPERTY_USER_ROLES);
138        foreach ($users as $u) {
139            $u = ($u instanceof core_kernel_classes_Resource) ? $u : new core_kernel_classes_Resource($u);
140
141            // just in case of ...
142            $userService->unnatachRole($u, $role);
143
144            // assign the new role.
145            $u->setPropertyValue($rolesProperty, $role);
146
147            if (common_session_SessionManager::getSession()->getUserUri() == $u->getUri()) {
148                common_session_SessionManager::getSession()->refresh();
149            }
150        }
151
152        $returnValue = true;
153
154        return (bool) $returnValue;
155    }
156
157    /**
158     * get the users who have the role in parameter
159     *
160     * @access public
161     * @author Joel Bout, <joel@taotesting.com>
162     * @param  core_kernel_classes_Resource role
163     * @return array
164     */
165    public function getUsers(core_kernel_classes_Resource $role)
166    {
167        $returnValue = [];
168
169        $filters = [GenerisRdf::PROPERTY_USER_ROLES => $role->getUri()];
170        $options = ['like' => false, 'recursive' => true];
171
172        $userClass = new core_kernel_classes_Class(GenerisRdf::CLASS_GENERIS_USER);
173        $results = $userClass->searchInstances($filters, $options);
174
175        $returnValue = array_keys($results);
176
177        return (array) $returnValue;
178    }
179
180    /**
181     * Creates a new Role in persistent memory.
182     *
183     * @param string $label The label of the new role.
184     * @param mixed $includedRoles The roles to include to the new role. Can be either a core_kernel_classes_Resource
185     *                             or an array of core_kernel_classes_Resource.
186     * @param core_kernel_classes_Class (optional) A specific class for the new role.
187     * @return core_kernel_classes_Resource The newly created role.
188     */
189    public function addRole($label, $includedRoles = null, core_kernel_classes_Class $class = null)
190    {
191        return $this->generisUserService->addRole($label, $includedRoles, $class);
192    }
193
194    /**
195     * Remove a given Role from persistent memory. References to this role
196     * will also be removed from the persistent memory.
197     *
198     * @param core_kernel_classes_Resource $role The Role to remove.
199     * @return boolean True if the Role was removed, false otherwise.
200     * @deprecated use oat\tao\test\unit\models\classes\accessControl\Service\DeleteRoleService
201     *
202     * @todo Move this logic to oat\tao\test\unit\models\classes\accessControl\Service\DeleteRoleService
203     */
204    public function removeRole(core_kernel_classes_Resource $role)
205    {
206        $this->getEventManager()->trigger(new RoleRemovedEvent($role->getUri()));
207        return $this->generisUserService->removeRole($role);
208    }
209
210    /**
211     * Returns the Roles included by a given Role.
212     *
213     * @param core_kernel_classes_Resource $role The Role you want to know what are its included Roles.
214     * @return array An array of core_kernel_classes_Resource corresponding to the included Roles.
215     */
216    public function getIncludedRoles(core_kernel_classes_Resource $role)
217    {
218        return $this->generisUserService->getIncludedRoles($role);
219    }
220
221    /**
222     * Includes the $roleToInclude Role to the $role Role.
223     *
224     * @param core_kernel_classes_Resource $role A Role.
225     * @param core_kernel_classes_Resource $roleToInclude A Role to include.
226     */
227    public function includeRole(core_kernel_classes_Resource $role, core_kernel_classes_Resource $roleToInclude)
228    {
229        $this->generisUserService->includeRole($role, $roleToInclude);
230        $this->getEventManager()->trigger(
231            new RoleChangedEvent($role->getUri(), 'included role', $roleToInclude->getUri())
232        );
233    }
234
235    /**
236     * Uninclude a Role from another Role.
237     *
238     * @param core_kernel_classes_Resource $role The Role from which you want to uninclude another Role.
239     * @param core_kernel_classes_Resource $roleToUninclude The Role to uninclude.
240     */
241    public function unincludeRole(core_kernel_classes_Resource $role, core_kernel_classes_Resource $roleToUninclude)
242    {
243        $this->generisUserService->unincludeRole($role, $roleToUninclude);
244        $this->getEventManager()->trigger(
245            new RoleChangedEvent($role->getUri(), 'excluded role', $roleToUninclude->getUri())
246        );
247    }
248
249    /**
250     * Returns the whole collection of Roles stored into TAO.
251     *
252     * @return array An associative array where keys are Role URIs and values are core_kernel_classes_Resource
253     *               instances.
254     */
255    public function getAllRoles()
256    {
257        return $this->generisUserService->getAllRoles();
258    }
259
260    /**
261     * @inheritdoc
262     */
263    public function createInstance(core_kernel_classes_Class $clazz, $label = '')
264    {
265        $instance = parent::createInstance($clazz, $label);
266        if ($instance) {
267            $this->getEventManager()->trigger(new RoleCreatedEvent($instance->getUri()));
268        }
269        return $instance;
270    }
271}