function update_rs_role_defs($sitewide = false, $customize_defaults = false)
 {
     $default_prefix = $customize_defaults ? 'default_' : '';
     $default_role_caps = apply_filters('define_role_caps_rs', cr_role_caps());
     $cap_defs = new CR_Capabilities();
     $cap_defs = apply_filters('define_capabilities_rs', $cap_defs);
     $cap_defs->add_member_objects(cr_cap_defs());
     global $scoper, $scoper_role_types;
     $role_defs = new CR_Roles();
     $role_defs->add_member_objects(cr_role_defs());
     $role_defs = apply_filters('define_roles_rs', $role_defs);
     $reviewed_roles = explode(',', $_POST['reviewed_roles']);
     $disable_caps = array();
     $add_caps = array();
     foreach ($default_role_caps as $role_handle => $default_caps) {
         if (!in_array($role_handle, $reviewed_roles)) {
             continue;
         }
         if ($role_defs->member_property($role_handle, 'no_custom_caps') || $role_defs->member_property($role_handle, 'anon_user_blogrole')) {
             continue;
         }
         $posted_set_caps = empty($_POST["{$role_handle}_caps"]) ? array() : $_POST["{$role_handle}_caps"];
         // html IDs have any spaces stripped out of cap names.  Replace them for processing.
         $set_caps = array();
         foreach ($posted_set_caps as $cap_name) {
             if (strpos($cap_name, ' ')) {
                 $set_caps[] = str_replace('_', ' ', $cap_name);
             } else {
                 $set_caps[] = $cap_name;
             }
         }
         // deal with caps which are locked into role, therefore displayed as a disabled checkbox and not included in $_POST
         foreach (array_keys($default_caps) as $cap_name) {
             if (!in_array($cap_name, $set_caps) && $cap_defs->member_property($cap_name, 'no_custom_remove')) {
                 $set_caps[] = $cap_name;
             }
         }
         $disable_caps[$role_handle] = array_fill_keys(array_diff(array_keys($default_caps), $set_caps), true);
         $add_caps[$role_handle] = array_fill_keys(array_diff($set_caps, array_keys($default_caps)), true);
     }
     scoper_update_option($default_prefix . 'disabled_role_caps', $disable_caps, $sitewide);
     scoper_update_option($default_prefix . 'user_role_caps', $add_caps, $sitewide);
     scoper_refresh_options();
     $scoper->load_definition('cap_defs');
     global $wp_roles;
     // synchronize WP roles as requested
     if (!empty($_POST['sync_wp_roles'])) {
         foreach ($_POST['sync_wp_roles'] as $sync_request) {
             $scoper->log_cap_usage($scoper->role_defs, $scoper->cap_defs);
             $sync_handles = explode(':', $sync_request);
             $rs_role_handle = $sync_handles[0];
             $wp_role_handle = $sync_handles[1];
             $wp_role_name = str_replace('wp_', '', $wp_role_handle);
             // only remove caps which are defined for this RS role's data source and object type
             $role_attributes = $scoper->role_defs->get_role_attributes($rs_role_handle);
             $otype_caps = $scoper->cap_defs->get_matching($role_attributes->src_name, $role_attributes->object_type, '', STATUS_ANY_RS);
             // make the roledef change for all blogs if RS role def is sitewide
             if (IS_MU_RS && $sitewide) {
                 global $wpdb, $blog_id;
                 $blog_ids = scoper_get_col("SELECT blog_id FROM {$wpdb->blogs}");
                 $orig_blog_id = $blog_id;
             } else {
                 $blog_ids = array('');
             }
             foreach ($blog_ids as $id) {
                 if (count($blog_ids) > 1) {
                     switch_to_blog($id);
                 }
                 if (!isset($wp_roles->role_objects[$wp_role_name])) {
                     continue;
                 }
                 if ($wp_missing_caps = array_diff_key($scoper->role_defs->role_caps[$rs_role_handle], $wp_roles->role_objects[$wp_role_name]->capabilities)) {
                     foreach (array_keys($wp_missing_caps) as $cap_name) {
                         $wp_roles->add_cap($wp_role_name, $cap_name);
                     }
                 }
                 $wp_defined_caps = array_intersect_key($wp_roles->role_objects[$wp_role_name]->capabilities, $otype_caps);
                 if ($wp_extra_caps = array_diff_key($wp_defined_caps, $scoper->role_defs->role_caps[$rs_role_handle])) {
                     foreach (array_keys($wp_extra_caps) as $cap_name) {
                         $wp_roles->remove_cap($wp_role_name, $cap_name);
                     }
                 }
             }
             if (count($blog_ids) > 1) {
                 switch_to_blog($orig_blog_id);
             }
             $wp_roles = new WP_Roles();
         }
     }
     $scoper->role_defs->locked = false;
     $scoper->log_wp_roles($scoper->role_defs);
     $scoper->role_defs->lock();
 }
function scoper_expire_file_rules()
{
    if (IS_MU_RS) {
        scoper_update_option('file_htaccess_min_date', agp_time_gmt(), true);
    } else {
        if (did_action('scoper_init')) {
            scoper_flush_file_rules();
        } else {
            add_action('scoper_init', 'scoper_flush_file_rules');
        }
    }
}
</a>&nbsp;)</span>
</h2>

<?php 
$groups_url = 'admin.php?page=rs-groups';
echo "<a href='{$groups_url}'>Back to Groups</a>";
?>

<form action="" method="post" name="role_assign" id="role_assign">

<?php 
require_once dirname(__FILE__) . '/groups-support.php';
wp_nonce_field('scoper-assign-termroles');
if (isset($_POST['rs_submit'])) {
    $stored_groups = isset($_POST['group']) ? $_POST['group'] : array();
    scoper_update_option('default_groups', $stored_groups);
    echo '<div id="message" class="updated fade"><p>';
    printf(__('Default Groups Updated: %s groups', 'scoper'), count($stored_groups));
    echo '</p></div>';
} else {
    $stored_groups = scoper_get_option('default_groups');
}
if (!($all_groups = ScoperAdminLib::get_all_groups(UNFILTERED_RS))) {
    return;
}
if ($editable_ids = ScoperAdminLib::get_all_groups(FILTERED_RS, COL_ID_RS)) {
    echo "<div id='default_groupsdiv_rs' style='margin-top:1em'>";
    if (!$stored_groups) {
        $stored_groups = array();
        echo '<p><strong>';
        _e('No default groups defined.', 'scoper');
function scoper_set_default_rs_roledefs()
{
    global $wp_roles, $scoper;
    $sitewide = IS_MU_RS;
    if (scoper_get_option('disabled_role_caps', $sitewide) || scoper_get_option('default_disabled_role_caps', $sitewide)) {
        return;
    }
    $default_role_caps = cr_role_caps();
    $wp_role_sync = array('rs_post_contributor' => 'contributor', 'rs_post_revisor' => 'revisor', 'rs_post_author' => 'author', 'rs_post_editor' => 'editor', 'rs_page_revisor' => 'revisor', 'rs_page_editor' => 'editor');
    $disable_caps = array();
    foreach ($wp_role_sync as $rs_role_handle => $wp_role_name) {
        if (isset($wp_roles->role_objects[$wp_role_name])) {
            if ($wp_missing_caps = array_diff_key($default_role_caps[$rs_role_handle], $wp_roles->role_objects[$wp_role_name]->capabilities)) {
                $disable_caps[$rs_role_handle] = $wp_missing_caps;
            }
        }
    }
    if ($disable_caps) {
        scoper_update_option('disabled_role_caps', $disable_caps, $sitewide);
        if ($sitewide) {
            scoper_update_option('default_disabled_role_caps', $disable_caps, $sitewide);
        }
    }
}
 function update_blog_file_rules($include_rs_rules = true)
 {
     global $blog_id;
     // avoid file collision by skipping if another flush was initiated < 5 seconds ago
     if ($last_regen = scoper_get_option('file_htaccess_date')) {
         if (intval($last_regen) > agp_time_gmt() - 5) {
             return;
         }
     }
     scoper_update_option('file_htaccess_date', agp_time_gmt());
     $include_rs_rules = $include_rs_rules && scoper_get_option('file_filtering');
     if (!ScoperRewrite::site_config_supports_rewrite()) {
         return;
     } elseif (!$include_rs_rules) {
         $rules = '';
     } else {
         $rules = ScoperRewrite::build_blog_file_rules();
     }
     require_once dirname(__FILE__) . '/uploads_rs.php';
     $uploads = scoper_get_upload_info();
     // If a filter has changed MU basedir, don't filter file attachments for this blog because we might not be able to regenerate the basedir for rule removal at RS deactivation
     if (!IS_MU_RS || strpos($uploads['basedir'], "/blogs.dir/{$blog_id}/files") || false !== strpos($uploads['basedir'], trailingslashit(WP_CONTENT_DIR) . 'uploads')) {
         $htaccess_path = trailingslashit($uploads['basedir']) . '.htaccess';
         ScoperRewrite::insert_with_markers($htaccess_path, 'Role Scoper', $rules);
     }
 }
 function update_page_otype_options($sitewide = false, $customize_defaults = false)
 {
     global $scoper_default_otype_options;
     // changes to these options will trigger .htaccess regen
     if ($sitewide) {
         add_filter('add_site_option_scoper_use_term_roles', 'scoper_expire_file_rules');
         add_filter('add_site_option_scoper_use_object_roles', 'scoper_expire_file_rules');
         add_filter('pre_update_site_option_scoper_use_term_roles', 'scoper_maybe_expire_file_rules', 10, 2);
         // update_site_option hook does not pass old_value (as of WP 3.0)
         add_filter('pre_update_site_option_scoper_use_object_roles', 'scoper_maybe_expire_file_rules', 10, 2);
     } else {
         add_filter('update_option_scoper_use_term_roles', 'scoper_maybe_expire_file_rules', 10, 2);
         add_filter('update_option_scoper_use_object_roles', 'scoper_maybe_expire_file_rules', 10, 2);
     }
     $default_prefix = $customize_defaults ? 'default_' : '';
     $reviewed_otype_options = explode(',', $_POST['all_otype_options']);
     $otype_option_vals = array();
     foreach ($reviewed_otype_options as $option_basename) {
         if (isset($scoper_default_otype_options[$option_basename])) {
             if ($opt = $scoper_default_otype_options[$option_basename]) {
                 foreach (array_keys($opt) as $src_otype) {
                     if (is_array($opt[$src_otype])) {
                         foreach (array_keys($opt[$src_otype]) as $taxonomy) {
                             $postvar = $option_basename . '-' . str_replace(':', '_', $src_otype) . '-' . $taxonomy;
                             $value = isset($_POST[$postvar]) ? $_POST[$postvar] : '';
                             if (!is_array($value)) {
                                 $value = trim($value);
                             }
                             $otype_option_vals[$option_basename][$src_otype][$taxonomy] = stripslashes_deep($value);
                         }
                     } else {
                         $postvar = $option_basename . '-' . str_replace(':', '_', $src_otype);
                         $value = isset($_POST[$postvar]) ? $_POST[$postvar] : '';
                         if (!is_array($value)) {
                             $value = trim($value);
                         }
                         $otype_option_vals[$option_basename][$src_otype] = stripslashes_deep($value);
                     }
                 }
             }
         }
     }
     foreach ($otype_option_vals as $option_basename => $value) {
         scoper_update_option($default_prefix . $option_basename, $value, $sitewide);
     }
 }