ASong2U_Web/wp-content/plugins/buddypress/bp-forums/bbpress/bb-includes/functions.bb-capabilities.php

349 lines
9.6 KiB
PHP

<?php
/**
* bbPress Roles and Capabilities Wrapping Functions.
*
* @package bbPress
* @subpackage User
*/
/**
* Whether current user has capability or role.
*
* @since 0.7.2
* @uses $bb_current_user Current User Object
*
* @param string $capability Capability or role name.
* @return bool
*/
function bb_current_user_can($capability) {
global $bb_current_user;
$args = array_slice(func_get_args(), 1);
$args = array_merge(array($capability), $args);
if ( empty($bb_current_user) ) {
$retvalue = false;
if ( ( $capability == 'write_topic' || $capability == 'write_topics' ) && !bb_is_login_required() )
$retvalue = true;
} else {
$retvalue = call_user_func_array(array(&$bb_current_user, 'has_cap'), $args);
}
// Use bb_user_has_cap whenever possible! This will not work everywhere.
return apply_filters('bb_current_user_can', $retvalue, $capability, $args);
}
/**
* Give a user the default role
*
* @since 0.7.2
*
* @param BP_User $user User object to give default role to
*/
function bb_give_user_default_role( $user ) {
if ( !( is_object($user) && is_a($user, 'BP_User') ) )
return;
$user->set_role('member');
}
/**
* Setup all default roles and associate them with capabilities
*
* @since 0.7.2
*
* @param BP_Roles $roles Roles object to add default roles to
*/
function bb_init_roles( &$roles ) {
$roles->add_role( 'keymaster', __('Key Master'), array(
'use_keys' => true, // Verb forms of roles - keymaster
'administrate' => true, // administrator
'moderate' => true, // moderator
'participate' => true, // member
'keep_gate' => true, // Make new Key Masters //+
'import_export' => true, // Import and export data //+
'recount' => true, // bb-do-counts.php //+
'manage_options' => true, // backend //+
'manage_themes' => true, // Themes //+
'manage_plugins' => true, // Plugins //+
'manage_options' => true, // Options //+
'edit_users' => true,
'manage_tags' => true, // Rename, Merge, Destroy
'edit_others_favorites' => true,
'manage_forums' => true, // Add/Rename forum
'delete_forums' => true, // Delete forum
'delete_topics' => true,
'close_topics' => true,
'stick_topics' => true,
'move_topics' => true,
'view_by_ip' => true, // view-ip.php
'edit_closed' => true, // Edit closed topics
'edit_deleted' => true, // Edit deleted topics/posts
'browse_deleted' => true, // Use 'deleted' view
'edit_others_tags' => true,
'edit_others_topics' => true,
'delete_posts' => true,
'throttle' => true, // Post back to back arbitrarily quickly
'ignore_edit_lock' => true,
'edit_others_posts' => true,
'edit_favorites' => true,
'edit_tags' => true,
'edit_topics' => true, // Edit title, resolution status
'edit_posts' => true,
'edit_profile' => true,
'write_topics' => true,
'write_posts' => true,
'change_password' => true,
'read' => true
) );
$roles->add_role( 'administrator', __('Administrator'), array(
'administrate' => true,
'moderate' => true,
'participate' => true,
'edit_users' => true, //+
'edit_others_favorites' => true, //+
'manage_forums' => true, //+
'delete_forums' => true, //+
'manage_tags' => true,
'delete_topics' => true,
'close_topics' => true,
'stick_topics' => true,
'move_topics' => true,
'view_by_ip' => true,
'edit_closed' => true,
'edit_deleted' => true,
'browse_deleted' => true,
'edit_others_tags' => true,
'edit_others_topics' => true,
'delete_posts' => true,
'throttle' => true,
'ignore_edit_lock' => true,
'edit_others_posts' => true,
'edit_favorites' => true,
'edit_tags' => true,
'edit_topics' => true,
'edit_posts' => true,
'edit_profile' => true,
'write_topics' => true,
'write_posts' => true,
'change_password' => true,
'read' => true
) );
$roles->add_role( 'moderator', __('Moderator'), array(
'moderate' => true,
'participate' => true,
'manage_tags' => true, //+
'delete_topics' => true, //+
'close_topics' => true, //+
'stick_topics' => true, //+
'move_topics' => true, //+
'view_by_ip' => true, //+
'edit_closed' => true, //+
'edit_deleted' => true, //+
'browse_deleted' => true, //+
'edit_others_tags' => true, //+
'edit_others_topics' => true, //+
'delete_posts' => true, //+
'throttle' => true, //+
'ignore_edit_lock' => true, //+
'edit_others_posts' => true, //+
'edit_favorites' => true,
'edit_tags' => true,
'edit_topics' => true,
'edit_posts' => true,
'edit_profile' => true,
'write_topics' => true,
'write_posts' => true,
'change_password' => true,
'read' => true
) );
$roles->add_role( 'member', __('Member'), array(
'participate' => true,
'edit_favorites' => true,
'edit_tags' => true,
'edit_topics' => true,
'edit_posts' => true,
'edit_profile' => true,
'write_topics' => true,
'write_posts' => true,
'change_password' => true,
'read' => true
) );
$roles->add_role( 'inactive', __('Inactive'), array(
'change_password' => true,
'read' => true
) );
$roles->add_role( 'blocked', __('Blocked'), array(
'not_play_nice' => true // Madness - a negative capability. Don't try this at home.
) );
}
/**
* Map meta capabilities to primitive capabilities.
*
* This does not actually compare whether the user ID has the actual capability,
* just what the capability or capabilities are. Meta capability list value can
* be 'delete_user', 'edit_user', 'delete_post', 'delete_page', 'edit_post',
* 'edit_page', 'read_post', or 'read_page'.
*
* @since 0.7.2
*
* @param array $caps Previously existing capabilities
* @param string $cap Capability name.
* @param int $user_id User ID.
* @return array Actual capabilities for meta capability.
*/
function bb_map_meta_cap( $caps, $cap, $user_id, $args ) {
// Unset the meta cap
if ( false !== $cap_pos = array_search( $cap, $caps ) )
unset( $caps[$cap_pos] );
switch ( $cap ) {
case 'write_post':
$caps[] = 'write_posts';
break;
case 'edit_post':
// edit_posts, edit_others_posts, edit_deleted, edit_closed, ignore_edit_lock
if ( !$bb_post = bb_get_post( $args[0] ) ) {
$caps[] = 'magically_provide_data_given_bad_input';
return $caps;
}
if ( $user_id == $bb_post->poster_id )
$caps[] = 'edit_posts';
else
$caps[] = 'edit_others_posts';
if ( $bb_post->post_status == '1' )
$caps[] = 'edit_deleted';
if ( !topic_is_open( $bb_post->topic_id ) )
$caps[] = 'edit_closed';
$post_time = bb_gmtstrtotime( $bb_post->post_time );
$curr_time = time() + 1;
$edit_lock = bb_get_option( 'edit_lock' );
if ( $edit_lock >= 0 && $curr_time - $post_time > $edit_lock * 60 )
$caps[] = 'ignore_edit_lock';
break;
case 'delete_post' :
// edit_deleted, delete_posts
if ( !$bb_post = bb_get_post( $args[0] ) ) {
$caps[] = 'magically_provide_data_given_bad_input';
return $caps;
}
if ( 0 != $bb_post->post_status )
$caps[] = 'edit_deleted';
// NO BREAK
case 'manage_posts' : // back compat
$caps[] = 'delete_posts';
break;
case 'write_topic':
$caps[] = 'write_topics';
break;
case 'edit_topic':
// edit_closed, edit_deleted, edit_topics, edit_others_topics
if ( !$topic = get_topic( $args[0] ) ) {
$caps[] = 'magically_provide_data_given_bad_input';
return $caps;
}
if ( !topic_is_open( $args[0]) )
$caps[] = 'edit_closed';
if ( '1' == $topic->topic_status )
$caps[] = 'edit_deleted';
if ( $user_id == $topic->topic_poster )
$caps[] = 'edit_topics';
else
$caps[] = 'edit_others_topics';
break;
case 'move_topic' :
$caps[] = 'move_topics';
break;
case 'stick_topic' :
$caps[] = 'stick_topics';
break;
case 'close_topic' :
$caps[] = 'close_topics';
break;
case 'delete_topic' :
$caps[] = 'delete_topics';
add_filter( 'get_topic_where', 'bb_no_where', 9999 );
if ( !$topic = get_topic( $args[0] ) ) {
$caps[] = 'magically_provide_data_given_bad_input';
return $caps;
}
if ( 0 != $topic->topic_status )
$caps[] = 'edit_deleted';
remove_filter( 'get_topic_where', 'bb_no_where', 9999 );
break;
case 'manage_topics' :
// back compat
$caps[] = 'move_topics';
$caps[] = 'stick_topics';
$caps[] = 'close_topics';
$caps[] = 'delete_topics';
break;
case 'add_tag_to':
// edit_closed, edit_deleted, edit_tags;
if ( !$topic = get_topic( $args[0] ) ) {
$caps[] = 'magically_provide_data_given_bad_input';
return $caps;
}
if ( !topic_is_open( $topic->topic_id ) )
$caps[] = 'edit_closed';
if ( '1' == $topic->topic_status )
$caps[] = 'edit_deleted';
$caps[] = 'edit_tags';
break;
case 'edit_tag_by_on':
// edit_closed, edit_deleted, edit_tags, edit_others_tags
if ( !$topic = get_topic( $args[1] ) ) {
$caps[] = 'magically_provide_data_given_bad_input';
return $caps;
}
if ( !topic_is_open( $topic->topic_id ) )
$caps[] = 'edit_closed';
if ( '1' == $topic->topic_status )
$caps[] = 'edit_deleted';
if ( $user_id == $args[0] )
$caps[] = 'edit_tags';
else
$caps[] = 'edit_others_tags';
break;
case 'edit_user':
// edit_profile, edit_users;
if ( $user_id == $args[0] )
$caps[] = 'edit_profile';
else
$caps[] = 'edit_users';
break;
case 'edit_favorites_of':
// edit_favorites, edit_others_favorites;
if ( $user_id == $args[0] )
$caps[] = 'edit_favorites';
else
$caps[] = 'edit_others_favorites';
break;
case 'delete_forum':
$caps[] = 'delete_forums';
break;
case 'change_user_password':
// change_password, edit_users
$caps[] = 'change_password';
if ( $user_id != $args[0] )
$caps[] = 'edit_users';
break;
default:
// If no meta caps match, return the original cap.
$caps[] = $cap;
}
return $caps;
}