users_who_can('', COLS_ID_NAME_RS); } if ( in_array(ROLE_BASIS_GROUPS, $role_bases) ) { $agents[ROLE_BASIS_GROUPS] = ScoperAdminLib::get_all_groups(UNFILTERED_RS); if ( ! $agents[ROLE_BASIS_GROUPS] ) unset( $agents[ROLE_BASIS_GROUPS] ); } return $agents; } function agent_names($agents) { $agent_names = array(); foreach ( array_keys($agents) as $role_basis ) foreach( $agents[$role_basis] as $agent ) $agent_names[$role_basis][$agent->ID] = str_replace(' ', ' ', $agent->display_name); return $agent_names; } function agent_list_prefixes() { $agent_list_prefix = array(); $agent_list_prefix[ROLE_BASIS_USER] = ''; $agent_list_prefix[ROLE_BASIS_GROUPS] = __('Groups') . ': '; return $agent_list_prefix; } function agent_captions_plural($role_bases) { if ( count($role_bases) > 1 ) return __('Users or Groups', 'scoper'); elseif ( in_array(ROLE_BASIS_USER, $role_bases) ) return __awp('Users'); elseif ( in_array(ROLE_BASIS_GROUPS, $role_bases) ) return __('Groups', 'scoper'); } function agent_captions($role_bases) { if ( count($role_bases) > 1 ) return __('User / Group', 'scoper'); elseif ( in_array(ROLE_BASIS_USER, $role_bases) ) return __('User', 'scoper'); elseif ( in_array(ROLE_BASIS_GROUPS, $role_bases) ) return __('Group', 'scoper'); } function get_role_codes() { global $scoper; $role_defs = $scoper->role_defs->get_matching('rs'); $role_codes = array(); //generate temporary numeric id for each defined role, to reduce html bulk $i = 0; foreach( array_keys($role_defs) as $role_handle) { $role_codes[$role_handle] = $i; $i++; } return $role_codes; } function display_inputs($mode, $assignment_modes, $args = array()) { $defaults = array( 'role_bases' => '', 'agents' => '', 'agent_caption_plural' => '', 'max_scopes' => array(), 'scope' => '', 'src_or_tx_name' => '' ); $args = array_merge($defaults, (array) $args); extract($args); global $scoper; echo "
"; echo ''; ?>

2. '; //printf( _ x('Select %s to Modify', 'Users or Groups', 'scoper'), $agent_caption_plural ); printf( __('Select %s to Modify', 'scoper'), $agent_caption_plural ); echo '

'; $args = array( 'suppress_extra_prefix' => true, 'filter_threshold' => 20, 'default_hide_threshold' => 20, 'check_for_incomplete_submission' => true ); require_once(dirname(__FILE__).'/agents_checklist_rs.php'); ScoperAgentsChecklist::all_agents_checklist($role_bases, $agents, $args); echo '

'; echo '
'; } //=================== end users/groups and assignment mode selection display ==================== if ( $duration_limits_enabled || $content_date_limits_enabled ) { echo '

3. '; _e('Set Role Duration and/or Content Date Limits (optional)', 'scoper'); echo '

'; ScoperAdminBulkLib::display_date_limit_inputs( $duration_limits_enabled, $content_date_limits_enabled ); } if ( ROLE_ASSIGNMENT_RS == $mode ) { $num = ( $duration_limits_enabled || $content_date_limits_enabled ) ? 4 : 3; echo "

$num. "; $msg = __('Select Roles to Assign / Remove', 'scoper'); echo "$msg

"; } else { $num = 2; echo "

$num. "; $msg = __('Select Roles to Modify', 'scoper'); echo "$msg

"; } } function role_submission($scope, $mode, $role_bases, $src_or_tx_name, $role_codes, $agent_caption_plural, $nonce_id) { global $scoper; $role_assigner = init_role_assigner(); $err = 0; $role_count = 0; check_admin_referer( $nonce_id ); $set_roles = array(); $selected_roles = isset($_POST['roles']) ? $_POST['roles'] : array(); if ( OBJECT_SCOPE_RS == $scope ) { $src = $scoper->data_sources->get($src_or_tx_name); $date_col_defined = ! empty( $src->cols->date ); } elseif ( TERM_SCOPE_RS == $scope ) { $tx = $scoper->taxonomies->get($src_or_tx_name); $date_col_defined = $scoper->data_sources->member_property( $tx->object_source, 'cols', 'date' ); } else $date_col_defined = true; switch ($mode) { case ROLE_ASSIGNMENT_RS: $assign_for = $_POST['assign_for']; $selected_agents = array(); foreach ( $role_bases as $role_basis ) { if ( ! empty($_POST[$role_basis]) ) $selected_agents[$role_basis] = $_POST[$role_basis]; else { $csv_id = "{$role_basis}_csv"; if ( ! empty( $_POST[$csv_id] ) ) $selected_agents[$role_basis] = ScoperAdminLib::agent_ids_from_csv( $csv_id, $role_basis ); else $role_bases = array_diff($role_bases, array($role_basis) ); } } $agents_msg = array(); $valid_role_selection = ! empty($selected_roles); $duration_limits_enabled = $date_col_defined && scoper_get_option('role_duration_limits'); $content_date_limits_enabled = $date_col_defined && scoper_get_option('role_content_date_limits'); break; case ROLE_RESTRICTION_RS: $role_bases = array('n/a'); $default_restrictions = isset($_POST['default_restrictions']) ? $_POST['default_restrictions'] : array(); $max_scope = $_POST['max_scope']; $require_for = $_POST['require_for']; $selected_agents = array('n/a' => array(0) ); $valid_role_selection = ! empty($selected_roles) || ! empty($default_restrictions); $modcount = 0; $duration_limits_enabled = $content_date_limits_enabled = false; break; } if ( ! $selected_agents ) { $_POST['scoper_error'] = 1; echo '

'; printf( __('Error: no %s were selected!', 'scoper'), $agent_caption_plural); echo '

'; $err = 1; } elseif ( ! $valid_role_selection ) { $_POST['scoper_error'] = 1; echo '

'; _e('Error: no roles were selected!', 'scoper'); echo '

'; $err = 2; } else { if ( ROLE_ASSIGNMENT_RS == $mode ) { if ( ! empty($_POST['set_role_duration']) || ! empty($_POST['set_content_date_limits']) ) $date_entries_gmt = ScoperAdminBulkLib::process_role_date_entries(); } foreach ( $role_bases as $role_basis ) { foreach($selected_agents[$role_basis] as $agent_id) { // must set default restrictions first if ( ! empty($default_restrictions) ) { $def_roles = array(); foreach($default_restrictions as $role) { $keys = explode('-', $role); //keys[0]=role_code, 1=term_id or obj_id if ( count($keys) < 2 ) continue; if ( ! $role_handle = array_search($keys[0], $role_codes) ) continue; $def_roles[ $keys[1] ][ $role_handle ] = array( 'max_scope' => $max_scope, 'for_item' => false, 'for_children' => true ); $modcount++; } $role_assigner->restrict_roles($scope, $src_or_tx_name, 0, $def_roles[0], array('force_flush' => true) ); } if ( ! empty($selected_roles) ) { foreach($selected_roles as $role) { $keys = explode('-', $role); //keys[0]=role_code, 1=term_id or obj_id, 2=group_id or user_id if ( count($keys) < 2 ) continue; if ( ! $role_handle = array_search($keys[0], $role_codes) ) continue; switch ($mode) { case ROLE_ASSIGNMENT_RS: $set_roles[ $role_basis ][ $keys[1] ][ $role_handle ][ $agent_id ] = ( $keys[1] || ! $assign_for ) ? $assign_for : ASSIGN_FOR_CHILDREN_RS; // always assign default category assignments as for_children break; case ROLE_RESTRICTION_RS: $for_item = (ASSIGN_FOR_ENTITY_RS == $require_for) || (ASSIGN_FOR_BOTH_RS == $require_for); $for_children = (ASSIGN_FOR_CHILDREN_RS == $require_for) || (ASSIGN_FOR_BOTH_RS == $require_for); $set_roles[ $keys[1] ][ $role_handle ] = array( 'max_scope' => $max_scope, 'for_item' => $for_item, 'for_children' => $for_children ); $modcount++; break; } } } if ( ROLE_ASSIGNMENT_RS == $mode ) { $args = array( 'force_flush' => true, 'set_role_duration' => '', 'set_content_date_limits' => '' ); if ( $duration_limits_enabled && ! empty($_POST['set_role_duration']) ) { $is_limited = ( $date_entries_gmt->start_date_gmt || ( $date_entries_gmt->end_date_gmt != SCOPER_MAX_DATE_STRING ) || ! empty( $_POST['start_date_gmt_keep-timestamp'] ) || ! empty( $_POST['end_date_gmt_keep-timestamp'] ) ); $args[ 'set_role_duration' ] = (object) array( 'date_limited' => $is_limited, 'start_date_gmt' => $date_entries_gmt->start_date_gmt, 'end_date_gmt' => $date_entries_gmt->end_date_gmt ); } if( $content_date_limits_enabled && ! empty($_POST['set_content_date_limits']) ) { $is_limited = ( $date_entries_gmt->content_min_date_gmt || ( $date_entries_gmt->content_max_date_gmt != SCOPER_MAX_DATE_STRING ) || ! empty( $_POST['content_min_date_gmt_keep-timestamp'] ) || ! empty( $_POST['content_max_date_gmt_keep-timestamp'] ) ); $args[ 'set_content_date_limits' ] = (object) array( 'content_date_limited' => $is_limited, 'content_min_date_gmt' => $date_entries_gmt->content_min_date_gmt, 'content_max_date_gmt' => $date_entries_gmt->content_max_date_gmt ); } if ( isset($set_roles[$role_basis]) ) foreach ( $set_roles[$role_basis] as $id => $item_roles ) $role_assigner->assign_roles($scope, $src_or_tx_name, $id, $item_roles, $role_basis, $args ); } else { foreach ( $set_roles as $id => $item_roles ) $role_assigner->restrict_roles($scope, $src_or_tx_name, $id, $item_roles, array('force_flush' => true) ); } } // end foreach selected agents if ( ! empty($selected_agents[$role_basis]) ) { if ( ROLE_BASIS_USER == $role_basis ) $agents_msg []= sprintf(_n("%d user", "%d users", count($selected_agents[$role_basis]), 'scoper'), count($selected_agents[$role_basis]) ); else $agents_msg []= sprintf(_n("%d group", "%d groups", count($selected_agents[$role_basis]), 'scoper'), count($selected_agents[$role_basis]) ); } } // end foreach role basis echo '

'; switch ($mode) { case ROLE_ASSIGNMENT_RS: $roles_msg = sprintf(_n("%d role selection", "%d role selections", count($selected_roles), 'scoper'), count($selected_roles) ); $agents_msg = implode( ", ", $agents_msg ); //printf( _ x('Role Assignments Updated: %1$s for %2$s', 'n role selections for x users, y groups', 'scoper'), $roles_msg, $agents_msg ); printf( __('Role Assignments Updated: %1$s for %2$s', 'scoper'), $roles_msg, $agents_msg ); break; case ROLE_RESTRICTION_RS: printf(_n("Role Restrictions Updated: %d setting", "Role Restrictions Updated: %d settings", $modcount, 'scoper'), $modcount ); break; } echo '

'; // allow the DB server a little time to refresh before querying what we just put in global $wpdb; $junk = scoper_get_col("SELECT assignment_id FROM $wpdb->user2role2object_rs LIMIT 10"); } //endif no input error return $err; } function get_objects_info($object_ids, &$object_names, &$object_status, &$unlisted_objects, $src, $otype, $ignore_hierarchy) { global $wpdb; // buffer titles in case they are translated if ( 'page' == $otype->name ) // todo: other hierarchical types? $titles = ScoperAdminBulkParent::get_page_titles(); $col_id = $src->cols->id; $col_name = $src->cols->name; $cols = "$col_name, $col_id"; if ( isset($src->cols->parent) && ! $ignore_hierarchy ) { $col_parent = $src->cols->parent; $cols .= ", $col_parent"; } else $col_parent = ''; $col_status = ( ! empty($src->cols->status) ) ? $src->cols->status : ''; if ( $col_status ) $cols .= ", $col_status"; $unroled_count = 0; $unroled_limit = ( ! empty($otype->admin_max_unroled_objects) ) ? $otype->admin_max_unroled_objects : 999999; if ( ! empty($src->cols->type) ) { $otype_clause = "AND {$src->cols->type} = '$otype->name'"; if ( 'post' == $src->name ) $otype_clause .= "AND {$src->cols->status} != 'auto-draft'"; } else $otype_clause = ''; $obj = ''; if ( $results = scoper_get_results("SELECT $cols FROM $src->table WHERE 1=1 $otype_clause ORDER BY $col_id DESC") ) { foreach ( $results as $row ) { if ( isset($titles[$row->$col_id]) ) $object_names[$row->$col_id] = $titles[$row->$col_id]; elseif ( 'post' == $src->name ) $object_names[$row->$col_id] = apply_filters( 'the_title', $row->$col_name, $row->$col_id ); else $object_names[$row->$col_id] = $row->$col_name; if ( $col_status ) $object_status[$row->$col_id] = $row->$col_status; unset($obj); if ( $col_parent ) // temporarily key by name for alpha sort of additional items prior to hierarchy sort $obj = (object) array($col_id => $row->$col_id, $col_name => $row->$col_name, $col_parent => $row->$col_parent); else $obj = (object) array($col_id => $row->$col_id, $col_name => $row->$col_name); // List only a limited number of unroled objects if ( ($unroled_limit >= 0) && ! isset($object_ids[$row->$col_id]) ) { if ( $unroled_count >= $unroled_limit ) { $unlisted_objects[$row->$col_id] = $obj; continue; } $unroled_count++; } $listed_objects[$row->$col_id] = $obj; } } // restore buffered page titles in case they were filtered previously if ( 'page' == $otype->name ) { scoper_restore_property_array( $listed_objects, $titles, 'ID', 'post_title' ); scoper_restore_property_array( $unlisted_objects, $titles, 'ID', 'post_title' ); } return $listed_objects; } function filter_objects_listing($mode, &$role_settings, $src, $object_type) { global $wpdb; $filter_args = array(); // only list role assignments which the logged-in user can administer $filter_args['required_operation'] = OP_EDIT_RS; // Possible TODO: re-implement OP_ADMIN distinction with admin-specific capabilities /* global $scoper; if ( cr_get_reqd_caps( $src->name, OP_ADMIN_RS, $object_type ) ) { $filter_args['required_operation'] = OP_ADMIN_RS; } else { $reqd_caps = array(); foreach (array_keys($src->statuses) as $status_name) { $admin_caps = $scoper->cap_defs->get_matching($src->name, $object_type, OP_ADMIN_RS, $status_name); $delete_caps = $scoper->cap_defs->get_matching($src->name, $object_type, OP_DELETE_RS, $status_name); $reqd_caps[$object_type][$status_name] = array_merge(array_keys($admin_caps), array_keys($delete_caps)); } $filter_args['force_reqd_caps'] = $reqd_caps; } */ $qry = "SELECT $src->table.{$src->cols->id} FROM $src->table WHERE 1=1 AND {$src->cols->type} = '$object_type'"; //$filter_args['require_full_object_role'] = true; $qry_flt = apply_filters('objects_request_rs', $qry, $src->name, $object_type, $filter_args); if ( $cu_admin_results = scoper_get_col( $qry_flt ) ) $cu_admin_results = array_fill_keys( $cu_admin_results, true ); if ( ROLE_ASSIGNMENT_RS == $mode ) { foreach ( array_keys($role_settings) as $role_basis ) foreach ( array_keys($role_settings[$role_basis]) as $obj_id ) if ( ! isset($cu_admin_results[$obj_id]) ) unset($role_settings[$role_basis][$obj_id]); } else { $setting_types = array('restrictions', 'unrestrictions'); foreach ($setting_types as $setting_type) if ( isset($role_settings[$setting_type]) ) foreach ( array_keys($role_settings[$setting_type]) as $role_handle ) foreach ( array_keys($role_settings[$setting_type][$role_handle]) as $obj_id ) if ( ! isset($cu_admin_results[$obj_id]) ) unset($role_settings[$setting_type][$role_handle][$obj_id]); } return $cu_admin_results; } function item_tree_jslinks($mode, $args='') { $defaults = array ( 'role_bases' => '', 'default_hide_empty' => false, 'hide_roles' => false, 'scope' => '', 'src' => '', 'otype' => '' ); $args = array_merge($defaults, (array) $args); extract($args); if ( (ROLE_ASSIGNMENT_RS == $mode) && empty($role_bases) ) $role_bases = array(ROLE_BASIS_USER, ROLE_BASIS_GROUPS); $tr_display = (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) ? 'block' : 'table-row'; /* // this is problematic because some roles are mutually exclusive for assignment echo ""; _e('select all roles', 'scoper'); echo " | "; */ echo ""; _e('unselect all roles', 'scoper'); echo ' | '; if ( $role_bases && in_array(ROLE_BASIS_USER, $role_bases) ) { echo ""; _e('hide users', 'scoper'); echo ''; echo " | '; } if ( $role_bases && in_array(ROLE_BASIS_GROUPS, $role_bases) ) { echo ""; _e('hide groups', 'scoper'); echo ''; echo " | '; } if ( $hide_roles ) { echo ""; _e('hide roles', 'scoper'); echo ''; echo " | '; } // Hide Empty $hide_tr_sfx = ( $default_hide_empty ) ? '-hide' : ''; $hide_li_sfx = ( $default_hide_empty ) ? '-hide' : ''; $js_call = " agp_set_display('rs-show_empty','inline',this.id); agp_display_marked_elements('li','no-rol-li{$hide_li_sfx}','none'); agp_setcss('.no-rol{$hide_tr_sfx}','display','none'); agp_set_display('max_unroled_notice','none'); "; if ( $role_bases ) $js_call .= " agp_setcss('.user-csv','display','inline'); agp_setcss('.groups-csv','display','inline'); agp_set_display('max_unroled_notice','none',''); "; $unroled_limit = ( ! empty($otype->max_unroled_objects) ) ? $otype->max_unroled_objects : 999999; $style = ( $default_hide_empty ) ? ' style="display:none;"' : ''; $title = __('hide unmodified items', 'scoper'); echo ""; if ( ROLE_RESTRICTION_RS == $mode ) _e('hide defaulted', 'scoper'); else _e('hide unassigned', 'scoper'); echo ''; $js_call = " agp_set_display('rs-hide_empty','inline',this.id); agp_display_marked_elements('li','no-rol-li{$hide_li_sfx}','block'); agp_setcss('.no-rol{$hide_tr_sfx}','display','$tr_display'); agp_set_display('max_unroled_notice','block'); "; $style = ( $default_hide_empty ) ? '' : ' style="display:none;"'; $src_label = ( ! empty($src->labels->name) ) ? agp_strtolower($src->labels->name) : __('items', 'scoper'); if ( ROLE_RESTRICTION_RS == $mode ) $title = sprintf(__('include the newest %s with default restrictions', 'scoper'), $src_label); else $title = sprintf(__('include the newest %s with no role assignments', 'scoper'), $src_label); echo ""; if ( ROLE_RESTRICTION_RS == $mode ) _e('show defaulted', 'scoper'); else _e('show unassigned', 'scoper'); // Collapse All if ( empty($otype->ignore_object_hierarchy) ) { echo ' | '; $js_call = " agp_set_display('rs-expand_all','inline',this.id); agp_display_marked_elements('li','role-li','none'); agp_set_marked_elem_property('a','term-tgl','innerHTML','+'); agp_display_marked_elements('span','rs-termjump','none'); "; echo ""; _e('collapse all', 'scoper'); echo ''; } $js_call = " agp_set_display('rs-collapse_all','inline',this.id); agp_display_marked_elements('li','role-li','block'); agp_set_marked_elem_property('a','term-tgl','innerHTML','-'); agp_display_marked_elements('span','rs-termjump','inline'); "; echo "'; if ( ! empty($otype->admin_max_unroled_objects) ) { $display_style = ( $default_hide_empty ) ? 'style="display:none;"' : ''; echo "

"; if ( ROLE_RESTRICTION_RS == $mode ) printf(__('Note: %1$s with default restrictions will not be listed here unless they are among the %2$s newest.', 'scoper'), $src_label, $otype->admin_max_unroled_objects); else printf(__('Note: %1$s with no role assignments will not be listed here unless they are among the %2$s newest.', 'scoper'), $src_label, $otype->admin_max_unroled_objects); echo '
'; } } function item_tree($scope, $mode, $src, $otype_or_tx, $all_items, $assigned_roles, $strict_items, $role_defs_by_otype, $role_codes, $args = array()) { $defaults = array ( 'admin_items' => '', 'editable_roles' => '', 'ul_class' => 'rs-termlist', 'ie_link_style' => '', 'object_names' => '', 'table_captions' => '', 'err' => '', 'object_status' => '', 'agent_caption_plural' => '', 'agent_list_prefix' => '', 'agent_names' => '', 'default_hide_empty' => false, 'role_bases' => array(ROLE_BASIS_USER, ROLE_BASIS_GROUPS), 'single_item' => false ); $args = array_merge($defaults, (array) $args); extract($args); global $scoper; if ( ! is_object($src) ) $src = $scoper->data_sources->get($src); $col_id = $src->cols->id; $col_name = $src->cols->name; $col_parent = ( isset($src->cols->parent) ) ? $src->cols->parent : ''; $item_label = $otype_or_tx->labels->singular_name; if ( TERM_SCOPE_RS == $scope ) { $src_or_tx_name = $otype_or_tx->name; $edit_url_base = ( ! empty($otype_or_tx->edit_url) ) ? $otype_or_tx->edit_url : ''; } else { $src_or_tx_name = $src->name; $edit_url_base = ( ! empty($src->edit_url) ) ? $src->edit_url : ''; } if ( $default_hide_empty ) { $hide_tr_sfx = '-hide'; $hide_li_sfx = '-hide'; } else { $hide_tr_sfx = ''; $hide_li_sfx = ''; } $nextlink = ''; $prevlink = ''; if ( empty($admin_items) ) $admin_items = array(); if ( empty($agent_caption_plural) ) $agent_caption_plural = __('Users or Groups', 'scoper'); if ( empty($agent_list_prefix) ) { $agent_list_prefix = array(); $agent_list_prefix[ROLE_BASIS_USER] = ''; $agent_list_prefix[ROLE_BASIS_GROUPS] = __('Groups') . ': '; } static $prevtext, $nexttext, $is_administrator, $role_header, $agents_header; if ( empty($prevtext) ) { // buffer prev/next caption for display with each term //$prevtext = _ x('prev', '|abbreviated link to previous item', 'scoper'); //$nexttext = _ x('next', '|abbreviated link to next item', 'scoper'); $prevtext = __('prev', 'scoper'); $nexttext = __('next', 'scoper'); $is_administrator = is_administrator_rs($src, 'user'); $role_header = __awp('Role'); switch ( $mode ) { case ROLE_ASSIGNMENT_RS: //$agents_header = sprintf( _ x('Current %s', 'users or groups', 'scoper'), $agent_caption_plural); $agents_header = sprintf( __('Current %s', 'scoper'), $agent_caption_plural); break; case ROLE_RESTRICTION_RS: $agents_header = __('Current Restrictions', 'scoper'); break; default: return; } } // disregard roles that don't apply to this scope foreach ( $role_defs_by_otype as $object_type => $role_defs ) foreach ( $role_defs as $role_handle => $role ) if ( ! isset($role->valid_scopes[$scope]) ) unset( $role_defs_by_otype[$object_type][$role_handle] ); // for object scope, assign "private post reader" role, but label it as "post reader" to limit confusion $role_display_name = array(); foreach ( $role_defs_by_otype as $role_defs ) foreach ( array_keys($role_defs) as $role_handle ) $role_display_name[$role_handle] = $scoper->role_defs->get_display_name( $role_handle, $scope . '_ui' ); // display a separate role assignment list for each individual term / object $last_id = -1; $last_name = ''; $last_parent_id = -1; $parent_id = 0; $parents = array(); $depth = 0; $_top_link = "" . __('top', 'scoper') . ''; $tr_display = (strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE') !== false) ? 'block' : 'table-row'; $show_all_caption = __('show all', 'scoper'); echo "'; $depth--; } echo ''; echo '

'; } // endif not single item } // end function item_tree } // end class ScoperAdminBulk ?>