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