danielebarchiesi@4
|
1 <?php
|
danielebarchiesi@4
|
2
|
danielebarchiesi@4
|
3 /**
|
danielebarchiesi@4
|
4 * Implements hook_features_api().
|
danielebarchiesi@4
|
5 */
|
danielebarchiesi@4
|
6 function user_features_api() {
|
danielebarchiesi@4
|
7 return array(
|
danielebarchiesi@4
|
8 'user_role' => array(
|
danielebarchiesi@4
|
9 'name' => t('Roles'),
|
danielebarchiesi@4
|
10 'feature_source' => TRUE,
|
danielebarchiesi@4
|
11 'default_hook' => 'user_default_roles',
|
danielebarchiesi@4
|
12 'default_file' => FEATURES_DEFAULTS_INCLUDED,
|
danielebarchiesi@4
|
13 ),
|
danielebarchiesi@4
|
14 'user_permission' => array(
|
danielebarchiesi@4
|
15 'name' => t('Permissions'),
|
danielebarchiesi@4
|
16 'feature_source' => TRUE,
|
danielebarchiesi@4
|
17 'default_hook' => 'user_default_permissions',
|
danielebarchiesi@4
|
18 'default_file' => FEATURES_DEFAULTS_INCLUDED,
|
danielebarchiesi@4
|
19 ),
|
danielebarchiesi@4
|
20 );
|
danielebarchiesi@4
|
21 }
|
danielebarchiesi@4
|
22
|
danielebarchiesi@4
|
23 /**
|
danielebarchiesi@4
|
24 * Implements hook_features_export().
|
danielebarchiesi@4
|
25 */
|
danielebarchiesi@4
|
26 function user_permission_features_export($data, &$export, $module_name = '') {
|
danielebarchiesi@4
|
27 $export['dependencies']['features'] = 'features';
|
danielebarchiesi@4
|
28
|
danielebarchiesi@4
|
29 // Ensure the modules that provide the given permissions are included as dependencies.
|
danielebarchiesi@4
|
30 $map = user_permission_get_modules();
|
danielebarchiesi@4
|
31 foreach ($data as $perm) {
|
danielebarchiesi@4
|
32 $perm_name = $perm;
|
danielebarchiesi@4
|
33 // Export vocabulary permissions using the machine name, instead of
|
danielebarchiesi@4
|
34 // vocabulary id.
|
danielebarchiesi@4
|
35 _user_features_change_term_permission($perm_name, 'machine_name');
|
danielebarchiesi@4
|
36 if (isset($map[$perm_name])) {
|
danielebarchiesi@4
|
37 $perm_module = $map[$perm_name];
|
danielebarchiesi@4
|
38 $export['dependencies'][$perm_module] = $perm_module;
|
danielebarchiesi@4
|
39 $export['features']['user_permission'][$perm] = $perm;
|
danielebarchiesi@4
|
40 }
|
danielebarchiesi@4
|
41 }
|
danielebarchiesi@4
|
42
|
danielebarchiesi@4
|
43 return array();
|
danielebarchiesi@4
|
44 }
|
danielebarchiesi@4
|
45
|
danielebarchiesi@4
|
46 /**
|
danielebarchiesi@4
|
47 * Implements hook_features_export_options().
|
danielebarchiesi@4
|
48 */
|
danielebarchiesi@4
|
49 function user_permission_features_export_options() {
|
danielebarchiesi@4
|
50 $modules = array();
|
danielebarchiesi@4
|
51 $module_info = system_get_info('module');
|
danielebarchiesi@4
|
52 foreach (module_implements('permission') as $module) {
|
danielebarchiesi@4
|
53 $modules[$module_info[$module]['name']] = $module;
|
danielebarchiesi@4
|
54 }
|
danielebarchiesi@4
|
55 ksort($modules);
|
danielebarchiesi@4
|
56
|
danielebarchiesi@4
|
57 $options = array();
|
danielebarchiesi@4
|
58 foreach ($modules as $display_name => $module) {
|
danielebarchiesi@4
|
59 if ($permissions = module_invoke($module, 'permission')) {
|
danielebarchiesi@4
|
60 foreach ($permissions as $perm => $perm_item) {
|
danielebarchiesi@4
|
61 // Export vocabulary permissions using the machine name, instead of
|
danielebarchiesi@4
|
62 // vocabulary id.
|
danielebarchiesi@4
|
63 _user_features_change_term_permission($perm);
|
danielebarchiesi@4
|
64 $options[$perm] = strip_tags("{$display_name}: {$perm_item['title']}");
|
danielebarchiesi@4
|
65 }
|
danielebarchiesi@4
|
66 }
|
danielebarchiesi@4
|
67 }
|
danielebarchiesi@4
|
68 return $options;
|
danielebarchiesi@4
|
69 }
|
danielebarchiesi@4
|
70
|
danielebarchiesi@4
|
71 /**
|
danielebarchiesi@4
|
72 * Implements hook_features_export_render().
|
danielebarchiesi@4
|
73 */
|
danielebarchiesi@4
|
74 function user_permission_features_export_render($module, $data) {
|
danielebarchiesi@4
|
75 $perm_modules = &drupal_static(__FUNCTION__ . '_perm_modules');
|
danielebarchiesi@4
|
76 if (!isset($perm_modules)) {
|
danielebarchiesi@4
|
77 $perm_modules = user_permission_get_modules();
|
danielebarchiesi@4
|
78 }
|
danielebarchiesi@4
|
79
|
danielebarchiesi@4
|
80 $code = array();
|
danielebarchiesi@4
|
81 $code[] = ' $permissions = array();';
|
danielebarchiesi@4
|
82 $code[] = '';
|
danielebarchiesi@4
|
83
|
danielebarchiesi@4
|
84 $permissions = _user_features_get_permissions();
|
danielebarchiesi@4
|
85
|
danielebarchiesi@4
|
86 foreach ($data as $perm_name) {
|
danielebarchiesi@4
|
87 $permission = array();
|
danielebarchiesi@4
|
88 // Export vocabulary permissions using the machine name, instead of
|
danielebarchiesi@4
|
89 // vocabulary id.
|
danielebarchiesi@4
|
90 $perm = $perm_name;
|
danielebarchiesi@4
|
91 _user_features_change_term_permission($perm_name, 'machine_name');
|
danielebarchiesi@4
|
92 $permission['name'] = $perm;
|
danielebarchiesi@4
|
93 if (!empty($permissions[$perm_name])) {
|
danielebarchiesi@4
|
94 sort($permissions[$perm_name]);
|
danielebarchiesi@4
|
95 $permission['roles'] = drupal_map_assoc($permissions[$perm_name]);
|
danielebarchiesi@4
|
96 }
|
danielebarchiesi@4
|
97 else {
|
danielebarchiesi@4
|
98 $permission['roles'] = array();
|
danielebarchiesi@4
|
99 }
|
danielebarchiesi@4
|
100 if (isset($perm_modules[$perm_name])) {
|
danielebarchiesi@4
|
101 $permission['module'] = $perm_modules[$perm_name];
|
danielebarchiesi@4
|
102 }
|
danielebarchiesi@4
|
103 $perm_identifier = features_var_export($perm);
|
danielebarchiesi@4
|
104 $perm_export = features_var_export($permission, ' ');
|
danielebarchiesi@4
|
105 $code[] = " // Exported permission: {$perm_identifier}.";
|
danielebarchiesi@4
|
106 $code[] = " \$permissions[{$perm_identifier}] = {$perm_export};";
|
danielebarchiesi@4
|
107 $code[] = "";
|
danielebarchiesi@4
|
108 }
|
danielebarchiesi@4
|
109
|
danielebarchiesi@4
|
110 $code[] = ' return $permissions;';
|
danielebarchiesi@4
|
111 $code = implode("\n", $code);
|
danielebarchiesi@4
|
112 return array('user_default_permissions' => $code);
|
danielebarchiesi@4
|
113 }
|
danielebarchiesi@4
|
114
|
danielebarchiesi@4
|
115 /**
|
danielebarchiesi@4
|
116 * Implements hook_features_revert().
|
danielebarchiesi@4
|
117 */
|
danielebarchiesi@4
|
118 function user_permission_features_revert($module) {
|
danielebarchiesi@4
|
119 user_permission_features_rebuild($module);
|
danielebarchiesi@4
|
120 }
|
danielebarchiesi@4
|
121
|
danielebarchiesi@4
|
122 /**
|
danielebarchiesi@4
|
123 * Implements hook_features_rebuild().
|
danielebarchiesi@4
|
124 * Iterate through default permissions and update the permissions map.
|
danielebarchiesi@4
|
125 *
|
danielebarchiesi@4
|
126 * @param $module
|
danielebarchiesi@4
|
127 * The module whose default user permissions should be rebuilt.
|
danielebarchiesi@4
|
128 */
|
danielebarchiesi@4
|
129 function user_permission_features_rebuild($module) {
|
danielebarchiesi@4
|
130 if ($defaults = features_get_default('user_permission', $module)) {
|
danielebarchiesi@4
|
131 // Make sure the list of available node types is up to date, especially when
|
danielebarchiesi@4
|
132 // installing multiple features at once, for example from an install profile
|
danielebarchiesi@4
|
133 // or via drush.
|
danielebarchiesi@4
|
134 node_types_rebuild();
|
danielebarchiesi@4
|
135
|
danielebarchiesi@4
|
136 $modules = user_permission_get_modules();
|
danielebarchiesi@4
|
137 $roles = _user_features_get_roles();
|
danielebarchiesi@4
|
138 $permissions_by_role = _user_features_get_permissions(FALSE);
|
danielebarchiesi@4
|
139 foreach ($defaults as $permission) {
|
danielebarchiesi@4
|
140 $perm = $permission['name'];
|
danielebarchiesi@4
|
141 _user_features_change_term_permission($perm, 'machine_name');
|
danielebarchiesi@4
|
142 if (empty($modules[$perm])) {
|
danielebarchiesi@4
|
143 $args = array('!name' => $perm, '!module' => $module,);
|
danielebarchiesi@4
|
144 $msg = t('Warning in features rebuild of !module. No module defines permission "!name".', $args);
|
danielebarchiesi@4
|
145 drupal_set_message($msg, 'warning');
|
danielebarchiesi@4
|
146 continue;
|
danielebarchiesi@4
|
147 }
|
danielebarchiesi@4
|
148 // Export vocabulary permissions using the machine name, instead of
|
danielebarchiesi@4
|
149 // vocabulary id.
|
danielebarchiesi@4
|
150 foreach ($roles as $role) {
|
danielebarchiesi@4
|
151 if (in_array($role, $permission['roles'])) {
|
danielebarchiesi@4
|
152 $permissions_by_role[$role][$perm] = TRUE;
|
danielebarchiesi@4
|
153 }
|
danielebarchiesi@4
|
154 else {
|
danielebarchiesi@4
|
155 $permissions_by_role[$role][$perm] = FALSE;
|
danielebarchiesi@4
|
156 }
|
danielebarchiesi@4
|
157 }
|
danielebarchiesi@4
|
158 }
|
danielebarchiesi@4
|
159 // Write the updated permissions.
|
danielebarchiesi@4
|
160 foreach ($roles as $rid => $role) {
|
danielebarchiesi@4
|
161 if (isset($permissions_by_role[$role])) {
|
danielebarchiesi@4
|
162 user_role_change_permissions($rid, $permissions_by_role[$role]);
|
danielebarchiesi@4
|
163 }
|
danielebarchiesi@4
|
164 }
|
danielebarchiesi@4
|
165 }
|
danielebarchiesi@4
|
166 }
|
danielebarchiesi@4
|
167
|
danielebarchiesi@4
|
168 /**
|
danielebarchiesi@4
|
169 * Implements hook_features_export().
|
danielebarchiesi@4
|
170 */
|
danielebarchiesi@4
|
171 function user_role_features_export($data, &$export, $module_name = '') {
|
danielebarchiesi@4
|
172 $export['dependencies']['features'] = 'features';
|
danielebarchiesi@4
|
173 $map = features_get_default_map('user_role', 'name');
|
danielebarchiesi@4
|
174 foreach ($data as $role) {
|
danielebarchiesi@4
|
175 // Role is provided by another module. Add dependency.
|
danielebarchiesi@4
|
176 if (isset($map[$role]) && $map[$role] != $module_name) {
|
danielebarchiesi@4
|
177 $export['dependencies'][$map[$role]] = $map[$role];
|
danielebarchiesi@4
|
178 }
|
danielebarchiesi@4
|
179 // Export.
|
danielebarchiesi@4
|
180 elseif(user_role_load_by_name($role)) {
|
danielebarchiesi@4
|
181 $export['features']['user_role'][$role] = $role;
|
danielebarchiesi@4
|
182 }
|
danielebarchiesi@4
|
183 }
|
danielebarchiesi@4
|
184 return array();
|
danielebarchiesi@4
|
185 }
|
danielebarchiesi@4
|
186
|
danielebarchiesi@4
|
187 /**
|
danielebarchiesi@4
|
188 * Implements hook_features_export_options().
|
danielebarchiesi@4
|
189 */
|
danielebarchiesi@4
|
190 function user_role_features_export_options() {
|
danielebarchiesi@4
|
191 return drupal_map_assoc(_user_features_get_roles(FALSE));
|
danielebarchiesi@4
|
192 }
|
danielebarchiesi@4
|
193
|
danielebarchiesi@4
|
194 /**
|
danielebarchiesi@4
|
195 * Implements hook_features_export_render().
|
danielebarchiesi@4
|
196 */
|
danielebarchiesi@4
|
197 function user_role_features_export_render($module, $data) {
|
danielebarchiesi@4
|
198 $code = array();
|
danielebarchiesi@4
|
199 $code[] = ' $roles = array();';
|
danielebarchiesi@4
|
200 $code[] = '';
|
danielebarchiesi@4
|
201
|
danielebarchiesi@4
|
202 foreach ($data as $name) {
|
danielebarchiesi@4
|
203 if ($role = user_role_load_by_name($name)) {
|
danielebarchiesi@4
|
204 unset($role->rid);
|
danielebarchiesi@4
|
205 $role_identifier = features_var_export($name);
|
danielebarchiesi@4
|
206 $role_export = features_var_export($role , ' ');
|
danielebarchiesi@4
|
207 $code[] = " // Exported role: {$name}.";
|
danielebarchiesi@4
|
208 $code[] = " \$roles[{$role_identifier}] = {$role_export};";
|
danielebarchiesi@4
|
209 $code[] = "";
|
danielebarchiesi@4
|
210 }
|
danielebarchiesi@4
|
211 }
|
danielebarchiesi@4
|
212
|
danielebarchiesi@4
|
213 $code[] = ' return $roles;';
|
danielebarchiesi@4
|
214 $code = implode("\n", $code);
|
danielebarchiesi@4
|
215 return array('user_default_roles' => $code);
|
danielebarchiesi@4
|
216 }
|
danielebarchiesi@4
|
217
|
danielebarchiesi@4
|
218 /**
|
danielebarchiesi@4
|
219 * Implements hook_features_revert().
|
danielebarchiesi@4
|
220 */
|
danielebarchiesi@4
|
221 function user_role_features_revert($module) {
|
danielebarchiesi@4
|
222 user_role_features_rebuild($module);
|
danielebarchiesi@4
|
223 }
|
danielebarchiesi@4
|
224
|
danielebarchiesi@4
|
225 /**
|
danielebarchiesi@4
|
226 * Implements hook_features_rebuild().
|
danielebarchiesi@4
|
227 */
|
danielebarchiesi@4
|
228 function user_role_features_rebuild($module) {
|
danielebarchiesi@4
|
229 if ($defaults = features_get_default('user_role', $module)) {
|
danielebarchiesi@4
|
230 foreach ($defaults as $role) {
|
danielebarchiesi@4
|
231 $role = (object) $role;
|
danielebarchiesi@4
|
232 if ($existing = user_role_load_by_name($role->name)) {
|
danielebarchiesi@4
|
233 $role->rid = $existing->rid;
|
danielebarchiesi@4
|
234 }
|
danielebarchiesi@4
|
235 user_role_save($role);
|
danielebarchiesi@4
|
236 }
|
danielebarchiesi@4
|
237 }
|
danielebarchiesi@4
|
238 }
|
danielebarchiesi@4
|
239
|
danielebarchiesi@4
|
240 /**
|
danielebarchiesi@4
|
241 * Generate $rid => $role with role names untranslated.
|
danielebarchiesi@4
|
242 */
|
danielebarchiesi@4
|
243 function _user_features_get_roles($builtin = TRUE) {
|
danielebarchiesi@4
|
244 $roles = array();
|
danielebarchiesi@4
|
245 foreach (user_roles() as $rid => $name) {
|
danielebarchiesi@4
|
246 switch ($rid) {
|
danielebarchiesi@4
|
247 case DRUPAL_ANONYMOUS_RID:
|
danielebarchiesi@4
|
248 if ($builtin) {
|
danielebarchiesi@4
|
249 $roles[$rid] = 'anonymous user';
|
danielebarchiesi@4
|
250 }
|
danielebarchiesi@4
|
251 break;
|
danielebarchiesi@4
|
252 case DRUPAL_AUTHENTICATED_RID:
|
danielebarchiesi@4
|
253 if ($builtin) {
|
danielebarchiesi@4
|
254 $roles[$rid] = 'authenticated user';
|
danielebarchiesi@4
|
255 }
|
danielebarchiesi@4
|
256 break;
|
danielebarchiesi@4
|
257 default:
|
danielebarchiesi@4
|
258 $roles[$rid] = $name;
|
danielebarchiesi@4
|
259 break;
|
danielebarchiesi@4
|
260 }
|
danielebarchiesi@4
|
261 }
|
danielebarchiesi@4
|
262 return $roles;
|
danielebarchiesi@4
|
263 }
|
danielebarchiesi@4
|
264
|
danielebarchiesi@4
|
265 /**
|
danielebarchiesi@4
|
266 * Represent the current state of permissions as a perm to role name array map.
|
danielebarchiesi@4
|
267 */
|
danielebarchiesi@4
|
268 function _user_features_get_permissions($by_role = TRUE) {
|
danielebarchiesi@4
|
269 $map = user_permission_get_modules();
|
danielebarchiesi@4
|
270 $roles = _user_features_get_roles();
|
danielebarchiesi@4
|
271 $permissions = array();
|
danielebarchiesi@4
|
272 foreach (user_role_permissions($roles) as $rid => $role_permissions) {
|
danielebarchiesi@4
|
273 if ($by_role) {
|
danielebarchiesi@4
|
274 foreach (array_keys(array_filter($role_permissions)) as $permission) {
|
danielebarchiesi@4
|
275 if (isset($map[$permission])) {
|
danielebarchiesi@4
|
276 $permissions[$permission][] = $roles[$rid];
|
danielebarchiesi@4
|
277 }
|
danielebarchiesi@4
|
278 }
|
danielebarchiesi@4
|
279 }
|
danielebarchiesi@4
|
280 else {
|
danielebarchiesi@4
|
281 $permissions[$roles[$rid]] = array();
|
danielebarchiesi@4
|
282 foreach ($role_permissions as $permission => $status) {
|
danielebarchiesi@4
|
283 if (isset($map[$permission])) {
|
danielebarchiesi@4
|
284 $permissions[$roles[$rid]][$permission] = $status;
|
danielebarchiesi@4
|
285 }
|
danielebarchiesi@4
|
286 }
|
danielebarchiesi@4
|
287 }
|
danielebarchiesi@4
|
288 }
|
danielebarchiesi@4
|
289 return $permissions;
|
danielebarchiesi@4
|
290 }
|