danielebarchiesi@4: array( danielebarchiesi@4: 'name' => t('Roles'), danielebarchiesi@4: 'feature_source' => TRUE, danielebarchiesi@4: 'default_hook' => 'user_default_roles', danielebarchiesi@4: 'default_file' => FEATURES_DEFAULTS_INCLUDED, danielebarchiesi@4: ), danielebarchiesi@4: 'user_permission' => array( danielebarchiesi@4: 'name' => t('Permissions'), danielebarchiesi@4: 'feature_source' => TRUE, danielebarchiesi@4: 'default_hook' => 'user_default_permissions', danielebarchiesi@4: 'default_file' => FEATURES_DEFAULTS_INCLUDED, danielebarchiesi@4: ), danielebarchiesi@4: ); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_export(). danielebarchiesi@4: */ danielebarchiesi@4: function user_permission_features_export($data, &$export, $module_name = '') { danielebarchiesi@4: $export['dependencies']['features'] = 'features'; danielebarchiesi@4: danielebarchiesi@4: // Ensure the modules that provide the given permissions are included as dependencies. danielebarchiesi@4: $map = user_permission_get_modules(); danielebarchiesi@4: foreach ($data as $perm) { danielebarchiesi@4: $perm_name = $perm; danielebarchiesi@4: // Export vocabulary permissions using the machine name, instead of danielebarchiesi@4: // vocabulary id. danielebarchiesi@4: _user_features_change_term_permission($perm_name, 'machine_name'); danielebarchiesi@4: if (isset($map[$perm_name])) { danielebarchiesi@4: $perm_module = $map[$perm_name]; danielebarchiesi@4: $export['dependencies'][$perm_module] = $perm_module; danielebarchiesi@4: $export['features']['user_permission'][$perm] = $perm; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: return array(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_export_options(). danielebarchiesi@4: */ danielebarchiesi@4: function user_permission_features_export_options() { danielebarchiesi@4: $modules = array(); danielebarchiesi@4: $module_info = system_get_info('module'); danielebarchiesi@4: foreach (module_implements('permission') as $module) { danielebarchiesi@4: $modules[$module_info[$module]['name']] = $module; danielebarchiesi@4: } danielebarchiesi@4: ksort($modules); danielebarchiesi@4: danielebarchiesi@4: $options = array(); danielebarchiesi@4: foreach ($modules as $display_name => $module) { danielebarchiesi@4: if ($permissions = module_invoke($module, 'permission')) { danielebarchiesi@4: foreach ($permissions as $perm => $perm_item) { danielebarchiesi@4: // Export vocabulary permissions using the machine name, instead of danielebarchiesi@4: // vocabulary id. danielebarchiesi@4: _user_features_change_term_permission($perm); danielebarchiesi@4: $options[$perm] = strip_tags("{$display_name}: {$perm_item['title']}"); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return $options; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_export_render(). danielebarchiesi@4: */ danielebarchiesi@4: function user_permission_features_export_render($module, $data) { danielebarchiesi@4: $perm_modules = &drupal_static(__FUNCTION__ . '_perm_modules'); danielebarchiesi@4: if (!isset($perm_modules)) { danielebarchiesi@4: $perm_modules = user_permission_get_modules(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $code = array(); danielebarchiesi@4: $code[] = ' $permissions = array();'; danielebarchiesi@4: $code[] = ''; danielebarchiesi@4: danielebarchiesi@4: $permissions = _user_features_get_permissions(); danielebarchiesi@4: danielebarchiesi@4: foreach ($data as $perm_name) { danielebarchiesi@4: $permission = array(); danielebarchiesi@4: // Export vocabulary permissions using the machine name, instead of danielebarchiesi@4: // vocabulary id. danielebarchiesi@4: $perm = $perm_name; danielebarchiesi@4: _user_features_change_term_permission($perm_name, 'machine_name'); danielebarchiesi@4: $permission['name'] = $perm; danielebarchiesi@4: if (!empty($permissions[$perm_name])) { danielebarchiesi@4: sort($permissions[$perm_name]); danielebarchiesi@4: $permission['roles'] = drupal_map_assoc($permissions[$perm_name]); danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $permission['roles'] = array(); danielebarchiesi@4: } danielebarchiesi@4: if (isset($perm_modules[$perm_name])) { danielebarchiesi@4: $permission['module'] = $perm_modules[$perm_name]; danielebarchiesi@4: } danielebarchiesi@4: $perm_identifier = features_var_export($perm); danielebarchiesi@4: $perm_export = features_var_export($permission, ' '); danielebarchiesi@4: $code[] = " // Exported permission: {$perm_identifier}."; danielebarchiesi@4: $code[] = " \$permissions[{$perm_identifier}] = {$perm_export};"; danielebarchiesi@4: $code[] = ""; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $code[] = ' return $permissions;'; danielebarchiesi@4: $code = implode("\n", $code); danielebarchiesi@4: return array('user_default_permissions' => $code); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_revert(). danielebarchiesi@4: */ danielebarchiesi@4: function user_permission_features_revert($module) { danielebarchiesi@4: user_permission_features_rebuild($module); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_rebuild(). danielebarchiesi@4: * Iterate through default permissions and update the permissions map. danielebarchiesi@4: * danielebarchiesi@4: * @param $module danielebarchiesi@4: * The module whose default user permissions should be rebuilt. danielebarchiesi@4: */ danielebarchiesi@4: function user_permission_features_rebuild($module) { danielebarchiesi@4: if ($defaults = features_get_default('user_permission', $module)) { danielebarchiesi@4: // Make sure the list of available node types is up to date, especially when danielebarchiesi@4: // installing multiple features at once, for example from an install profile danielebarchiesi@4: // or via drush. danielebarchiesi@4: node_types_rebuild(); danielebarchiesi@4: danielebarchiesi@4: $modules = user_permission_get_modules(); danielebarchiesi@4: $roles = _user_features_get_roles(); danielebarchiesi@4: $permissions_by_role = _user_features_get_permissions(FALSE); danielebarchiesi@4: foreach ($defaults as $permission) { danielebarchiesi@4: $perm = $permission['name']; danielebarchiesi@4: _user_features_change_term_permission($perm, 'machine_name'); danielebarchiesi@4: if (empty($modules[$perm])) { danielebarchiesi@4: $args = array('!name' => $perm, '!module' => $module,); danielebarchiesi@4: $msg = t('Warning in features rebuild of !module. No module defines permission "!name".', $args); danielebarchiesi@4: drupal_set_message($msg, 'warning'); danielebarchiesi@4: continue; danielebarchiesi@4: } danielebarchiesi@4: // Export vocabulary permissions using the machine name, instead of danielebarchiesi@4: // vocabulary id. danielebarchiesi@4: foreach ($roles as $role) { danielebarchiesi@4: if (in_array($role, $permission['roles'])) { danielebarchiesi@4: $permissions_by_role[$role][$perm] = TRUE; danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $permissions_by_role[$role][$perm] = FALSE; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: // Write the updated permissions. danielebarchiesi@4: foreach ($roles as $rid => $role) { danielebarchiesi@4: if (isset($permissions_by_role[$role])) { danielebarchiesi@4: user_role_change_permissions($rid, $permissions_by_role[$role]); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_export(). danielebarchiesi@4: */ danielebarchiesi@4: function user_role_features_export($data, &$export, $module_name = '') { danielebarchiesi@4: $export['dependencies']['features'] = 'features'; danielebarchiesi@4: $map = features_get_default_map('user_role', 'name'); danielebarchiesi@4: foreach ($data as $role) { danielebarchiesi@4: // Role is provided by another module. Add dependency. danielebarchiesi@4: if (isset($map[$role]) && $map[$role] != $module_name) { danielebarchiesi@4: $export['dependencies'][$map[$role]] = $map[$role]; danielebarchiesi@4: } danielebarchiesi@4: // Export. danielebarchiesi@4: elseif(user_role_load_by_name($role)) { danielebarchiesi@4: $export['features']['user_role'][$role] = $role; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return array(); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_export_options(). danielebarchiesi@4: */ danielebarchiesi@4: function user_role_features_export_options() { danielebarchiesi@4: return drupal_map_assoc(_user_features_get_roles(FALSE)); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_export_render(). danielebarchiesi@4: */ danielebarchiesi@4: function user_role_features_export_render($module, $data) { danielebarchiesi@4: $code = array(); danielebarchiesi@4: $code[] = ' $roles = array();'; danielebarchiesi@4: $code[] = ''; danielebarchiesi@4: danielebarchiesi@4: foreach ($data as $name) { danielebarchiesi@4: if ($role = user_role_load_by_name($name)) { danielebarchiesi@4: unset($role->rid); danielebarchiesi@4: $role_identifier = features_var_export($name); danielebarchiesi@4: $role_export = features_var_export($role , ' '); danielebarchiesi@4: $code[] = " // Exported role: {$name}."; danielebarchiesi@4: $code[] = " \$roles[{$role_identifier}] = {$role_export};"; danielebarchiesi@4: $code[] = ""; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: $code[] = ' return $roles;'; danielebarchiesi@4: $code = implode("\n", $code); danielebarchiesi@4: return array('user_default_roles' => $code); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_revert(). danielebarchiesi@4: */ danielebarchiesi@4: function user_role_features_revert($module) { danielebarchiesi@4: user_role_features_rebuild($module); danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Implements hook_features_rebuild(). danielebarchiesi@4: */ danielebarchiesi@4: function user_role_features_rebuild($module) { danielebarchiesi@4: if ($defaults = features_get_default('user_role', $module)) { danielebarchiesi@4: foreach ($defaults as $role) { danielebarchiesi@4: $role = (object) $role; danielebarchiesi@4: if ($existing = user_role_load_by_name($role->name)) { danielebarchiesi@4: $role->rid = $existing->rid; danielebarchiesi@4: } danielebarchiesi@4: user_role_save($role); danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Generate $rid => $role with role names untranslated. danielebarchiesi@4: */ danielebarchiesi@4: function _user_features_get_roles($builtin = TRUE) { danielebarchiesi@4: $roles = array(); danielebarchiesi@4: foreach (user_roles() as $rid => $name) { danielebarchiesi@4: switch ($rid) { danielebarchiesi@4: case DRUPAL_ANONYMOUS_RID: danielebarchiesi@4: if ($builtin) { danielebarchiesi@4: $roles[$rid] = 'anonymous user'; danielebarchiesi@4: } danielebarchiesi@4: break; danielebarchiesi@4: case DRUPAL_AUTHENTICATED_RID: danielebarchiesi@4: if ($builtin) { danielebarchiesi@4: $roles[$rid] = 'authenticated user'; danielebarchiesi@4: } danielebarchiesi@4: break; danielebarchiesi@4: default: danielebarchiesi@4: $roles[$rid] = $name; danielebarchiesi@4: break; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return $roles; danielebarchiesi@4: } danielebarchiesi@4: danielebarchiesi@4: /** danielebarchiesi@4: * Represent the current state of permissions as a perm to role name array map. danielebarchiesi@4: */ danielebarchiesi@4: function _user_features_get_permissions($by_role = TRUE) { danielebarchiesi@4: $map = user_permission_get_modules(); danielebarchiesi@4: $roles = _user_features_get_roles(); danielebarchiesi@4: $permissions = array(); danielebarchiesi@4: foreach (user_role_permissions($roles) as $rid => $role_permissions) { danielebarchiesi@4: if ($by_role) { danielebarchiesi@4: foreach (array_keys(array_filter($role_permissions)) as $permission) { danielebarchiesi@4: if (isset($map[$permission])) { danielebarchiesi@4: $permissions[$permission][] = $roles[$rid]; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: else { danielebarchiesi@4: $permissions[$roles[$rid]] = array(); danielebarchiesi@4: foreach ($role_permissions as $permission => $status) { danielebarchiesi@4: if (isset($map[$permission])) { danielebarchiesi@4: $permissions[$roles[$rid]][$permission] = $status; danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: } danielebarchiesi@4: return $permissions; danielebarchiesi@4: }