View source
<?php
function user_configuration_api() {
return array(
'user_role' => array(
'name' => t('Roles'),
'feature_source' => TRUE,
'default_hook' => 'user_default_roles',
'default_file' => CONFIGURATION_DEFAULTS_INCLUDED,
),
'user_permission' => array(
'name' => t('Permissions'),
'feature_source' => TRUE,
'default_hook' => 'user_default_permissions',
'default_file' => CONFIGURATION_DEFAULTS_INCLUDED,
),
);
}
function user_permission_configuration_export($data, &$export, $module_name = '') {
$export['dependencies']['configuration'] = 'configuration';
$map = user_permission_get_modules();
foreach ($data as $perm) {
if (isset($map[$perm])) {
$perm_module = $map[$perm];
$export['dependencies'][$perm_module] = $perm_module;
$export['configuration']['user_permission'][$perm] = $perm;
}
}
return array();
}
function user_permission_configuration_export_options() {
$modules = array();
$module_info = system_get_info('module');
foreach (module_implements('permission') as $module) {
$modules[$module_info[$module]['name']] = $module;
}
ksort($modules);
$options = array();
foreach ($modules as $display_name => $module) {
if ($permissions = module_invoke($module, 'permission')) {
foreach ($permissions as $perm => $perm_item) {
$options[$perm] = strip_tags("{$display_name}: {$perm_item['title']}");
}
}
}
return $options;
}
function user_permission_configuration_export_render($module, $data) {
$perm_modules =& drupal_static(__FUNCTION__ . '_perm_modules');
if (!isset($perm_modules)) {
$perm_modules = user_permission_get_modules();
}
$code = array();
$code[] = ' $permissions = array();';
$code[] = '';
$permissions = _user_configuration_get_permissions();
foreach ($data as $perm_name) {
$permission = array();
$permission['name'] = $perm_name;
if (isset($permissions[$perm_name])) {
sort($permissions[$perm_name]);
$permission['roles'] = $permissions[$perm_name];
$permission['module'] = $perm_modules[$perm_name];
}
else {
$permission['roles'] = array();
}
$perm_identifier = configuration_var_export($perm_name);
$perm_export = configuration_var_export($permission, ' ');
$code[] = " // Exported permission: {$perm_name}";
$code[] = " \$permissions[{$perm_identifier}] = {$perm_export};";
$code[] = "";
}
$code[] = ' return $permissions;';
$code = implode("\n", $code);
return array(
'user_default_permissions' => $code,
);
}
function user_permission_configuration_revert($module, $module_name = 'configuration') {
user_permission_configuration_rebuild($module, $module_name);
}
function user_permission_configuration_rebuild($identifiers, $module_name = 'configuration') {
if ($defaults = configuration_get_default('user_permission', $module_name)) {
node_types_rebuild();
$roles = _user_configuration_get_roles();
$permissions_by_role = _user_configuration_get_permissions(FALSE);
foreach ($defaults as $permission) {
$perm = $permission['name'];
if (in_array($perm, $identifiers)) {
foreach ($roles as $role) {
if (in_array($role, $permission['roles']) || !empty($identifiers) && $identifiers[0] == '#import_all') {
$permissions_by_role[$role][$perm] = TRUE;
}
else {
$permissions_by_role[$role][$perm] = FALSE;
}
}
}
}
foreach ($roles as $rid => $role) {
if (isset($permissions_by_role[$role])) {
user_role_change_permissions($rid, $permissions_by_role[$role]);
}
}
foreach ($identifiers as $identifier) {
configuration_check_user_permission($identifier);
}
cache_clear_all('config_export', 'cache');
}
}
function user_role_configuration_export($data, &$export, $module_name = '') {
$export['dependencies']['configuration'] = 'configuration';
$map = configuration_get_default_map('user_role', 'name');
foreach ($data as $role) {
if (isset($map[$role]) && $map[$role] != $module_name) {
$export['dependencies'][$map[$role]] = $map[$role];
}
if (user_role_load_by_name($role)) {
$export['configuration']['user_role'][$role] = $role;
}
}
return array();
}
function user_role_configuration_export_options() {
return drupal_map_assoc(_user_configuration_get_roles(FALSE));
}
function user_role_configuration_export_render($module, $data) {
$code = array();
$code[] = ' $roles = array();';
$code[] = '';
foreach ($data as $name) {
if ($role = user_role_load_by_name($name)) {
unset($role->rid);
$role_identifier = configuration_var_export($name);
$role_export = configuration_var_export($role, ' ');
$code[] = " // Exported role: {$name}";
$code[] = " \$roles[{$role_identifier}] = {$role_export};";
$code[] = "";
}
}
$code[] = ' return $roles;';
$code = implode("\n", $code);
return array(
'user_default_roles' => $code,
);
}
function user_role_configuration_revert($module, $module_name = 'configuration') {
user_role_configuration_rebuild($module, $module_name);
}
function user_role_configuration_rebuild($identifiers, $module_name = 'configuration') {
if ($defaults = configuration_get_default('user_role', $module_name)) {
foreach ($defaults as $role) {
if (in_array($role['name'], $identifiers) || !empty($identifiers) && $identifiers[0] == '#import_all') {
$role = (object) $role;
if ($existing = user_role_load_by_name($role->name)) {
$role->rid = $existing->rid;
}
user_role_save($role);
configuration_check_user_role($role->name);
}
}
cache_clear_all('config_export', 'cache');
}
}
function _user_configuration_get_roles($builtin = TRUE) {
$roles = array();
foreach (user_roles() as $rid => $name) {
switch ($rid) {
case DRUPAL_ANONYMOUS_RID:
if ($builtin) {
$roles[$rid] = 'anonymous user';
}
break;
case DRUPAL_AUTHENTICATED_RID:
if ($builtin) {
$roles[$rid] = 'authenticated user';
}
break;
default:
$roles[$rid] = $name;
break;
}
}
return $roles;
}
function _user_configuration_get_permissions($by_role = TRUE) {
$map = user_permission_get_modules();
$roles = _user_configuration_get_roles();
$permissions = array();
foreach (user_role_permissions($roles) as $rid => $role_permissions) {
if ($by_role) {
foreach (array_keys(array_filter($role_permissions)) as $permission) {
if (isset($map[$permission])) {
$permissions[$permission][] = $roles[$rid];
}
}
}
else {
$permissions[$roles[$rid]] = array();
foreach ($role_permissions as $permission => $status) {
if (isset($map[$permission])) {
$permissions[$roles[$rid]][$permission] = $status;
}
}
}
}
return $permissions;
}
function configuration_check_user_permission($identifier) {
$from_activestore =& drupal_static('configuration_from_activestore');
$component = 'user_permission';
if (file_exists("config://configuration.user_permission.inc")) {
include_once drupal_realpath("config://configuration.user_permission.inc");
module_load_include('inc', 'configuration', "includes/configuration.user");
module_load_include('inc', 'configuration', 'configuration.export');
$config = configuration_get_configuration();
$identifiers = is_array($identifier) ? $identifier : array(
$identifier,
);
$code = user_permission_configuration_export_render('configuration', $identifiers);
eval(array_pop($code));
$permissions_code = configuration_user_default_permissions();
if (empty($permissions)) {
configuration_set_status($component, $identifier, CONFIGURATION_TRACKED_DATASTORE_ONLY);
}
foreach ($identifiers as $identifier) {
configuration_update_component_status($component, $identifier, $permissions, $permissions_code, $from_activestore);
}
}
}
function configuration_hash_user_permission($identifier) {
module_load_include('inc', 'configuration', 'configuration.export');
$data = user_permission_configuration_export_options();
$code = user_permission_configuration_export_render('configuration', array(
$identifier,
));
eval(array_pop($code));
return md5(serialize($permissions[$identifier]));
}
function configuration_check_user_role($identifier) {
$from_activestore =& drupal_static('configuration_from_activestore');
$component = 'user_role';
if (file_exists("config://configuration.user_role.inc")) {
include_once drupal_realpath("config://configuration.user_role.inc");
$roles = user_roles();
module_load_include('inc', 'configuration', 'configuration.export');
$config = configuration_get_configuration('user_role');
$code = user_role_configuration_export_render('configuration', array(
$identifier,
));
eval(array_pop($code));
if (empty($roles)) {
configuration_set_status($component, $identifier, CONFIGURATION_TRACKED_DATASTORE_ONLY);
}
$roles_code = configuration_user_default_roles();
$return = '';
$component = 'user_role';
$status = $config[$identifier]['status'];
if ($from_activestore == TRUE) {
$roles = user_roles();
foreach (array_keys($config) as $identifier) {
if (!in_array($identifier, $roles)) {
$status = $status | CONFIGURATION_DELETE;
configuration_set_status($component, $identifier, $status);
}
}
}
$md5_datastore = is_array($roles_code) && array_key_exists($identifier, $roles_code) ? md5(serialize($roles_code[$identifier])) : '';
$md5_activestore = is_array($roles) && array_key_exists($identifier, $roles) ? md5(serialize($roles[$identifier])) : '';
if (!$from_activestore && (isset($config[$identifier]) && isset($roles_code[$identifier])) && $md5_datastore == $config[$identifier]['hash']) {
$status = $status & ~CONFIGURATION_DATASTORE_OVERRIDDEN;
configuration_set_status($component, $identifier, $status);
}
if (isset($roles[$identifier]) && isset($roles_code[$identifier]) && $md5_activestore == $md5_datastore) {
$status = CONFIGURATION_IN_SYNC;
configuration_set_status($component, $identifier, $status);
configuration_set_hash($component, $identifier, $md5_activestore);
}
if (isset($roles[$identifier]) && isset($roles_code[$identifier]) && $md5_activestore != $md5_datastore) {
$status = $settings['status'] | CONFIGURATION_DATASTORE_OVERRIDDEN;
configuration_set_status($component, $identifier, $status);
}
if ($status != CONFIGURATION_IN_SYNC) {
$configuration[$component][$identifier]['activestore'] = is_array($roles) && array_key_exists($identifier, $roles) ? $roles[$identifier] : '';
$configuration[$component][$identifier]['datastore'] = is_array($roles_code) && array_key_exists($identifier, $roles_code) ? $roles_code[$identifier] : '';
cache_set("{$component}:{$identifier}", $configuration, 'cache_configuration');
}
foreach (array_keys($roles_code) as $name) {
if (!in_array($name, array_keys($config))) {
configuration_add_status('user_role', $name, md5(serialize($roles_code[$name])));
}
}
}
}
function configuration_hash_user_role($identifier) {
module_load_include('inc', 'configuration', 'configuration.export');
$data = user_role_configuration_export_options();
$code = user_role_configuration_export_render('configuration', array(
$identifier,
));
eval(array_pop($code));
return md5(serialize($roles[$identifier]));
}