web/wp-content/plugins/bbpress/includes/users/capabilities.php
changeset 196 5e8dcbe22c24
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/users/capabilities.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,646 @@
+<?php
+
+/**
+ * bbPress User Capabilites
+ *
+ * Used to map user capabilities to WordPress's existing capabilities.
+ *
+ * @package bbPress
+ * @subpackage Capabilities
+ */
+
+/**
+ * Maps primary capabilities
+ *
+ * @since bbPress (r4242)
+ *
+ * @param array $caps Capabilities for meta capability
+ * @param string $cap Capability name
+ * @param int $user_id User id
+ * @param mixed $args Arguments
+ * @uses apply_filters() Filter mapped results
+ * @return array Actual capabilities for meta capability
+ */
+function bbp_map_primary_meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
+
+	// What capability is being checked?
+	switch ( $cap ) {
+		case 'spectate'    :
+		case 'participate' :
+		case 'moderate'    :
+
+			// Do not allow inactive users
+			if ( bbp_is_user_inactive( $user_id ) ) {
+				$caps = array( 'do_not_allow' );
+
+			// Moderators are always participants
+			} else {
+				$caps = array( $cap );
+			}
+
+			break;
+	}
+
+	return apply_filters( 'bbp_map_primary_meta_caps', $caps, $cap, $user_id, $args );
+}
+
+/**
+ * Return a user's main role
+ *
+ * @since bbPress (r3860)
+ *
+ * @param int $user_id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses get_userdata() To get the user data
+ * @uses apply_filters() Calls 'bbp_set_user_role' with the role and user id
+ * @return string
+ */
+function bbp_set_user_role( $user_id = 0, $new_role = '' ) {
+
+	// Validate user id
+	$user_id = bbp_get_user_id( $user_id, false, false );
+	$user    = get_userdata( $user_id );
+
+	// User exists
+	if ( !empty( $user ) ) {
+
+		// Get users forum role
+		$role = bbp_get_user_role( $user_id );
+
+		// User already has this role so no new role is set
+		if ( $new_role == $role ) {
+			$new_role = false;
+
+		// Users role is different than the new role
+		} else {
+
+			// Remove the old role
+			if ( ! empty( $role ) ) {
+				$user->remove_role( $role );
+			}
+
+			// Add the new role
+			if ( !empty( $new_role ) ) {
+				$user->add_role( $new_role );
+			}
+		}
+
+	// User does don exist so return false
+	} else {
+		$new_role = false;
+	}
+
+	return apply_filters( 'bbp_set_user_role', $new_role, $user_id, $user );
+}
+
+/**
+ * Return a user's forums role
+ *
+ * @since bbPress (r3860)
+ *
+ * @param int $user_id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses get_userdata() To get the user data
+ * @uses apply_filters() Calls 'bbp_get_user_role' with the role and user id
+ * @return string
+ */
+function bbp_get_user_role( $user_id = 0 ) {
+
+	// Validate user id
+	$user_id = bbp_get_user_id( $user_id, false, false );
+	$user    = get_userdata( $user_id );
+	$role    = false;
+
+	// User has roles so lets
+	if ( ! empty( $user->roles ) ) {
+		$roles = array_intersect( array_values( $user->roles ), array_keys( bbp_get_dynamic_roles() ) );
+
+		// If there's a role in the array, use the first one
+		if ( !empty( $roles ) ) {
+			$role = array_shift( array_values( $roles ) );
+		}
+	}
+
+	return apply_filters( 'bbp_get_user_role', $role, $user_id, $user );
+}
+
+/**
+ * Return a user's blog role
+ *
+ * @since bbPress (r4446)
+ *
+ * @param int $user_id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses get_userdata() To get the user data
+ * @uses apply_filters() Calls 'bbp_get_user_blog_role' with the role and user id
+ * @return string
+ */
+function bbp_get_user_blog_role( $user_id = 0 ) {
+	global $wp_roles;
+
+	// This really shold not be necessary anymore, and will likely be removed
+	// at a later date. If roles aren't loaded yet, something else is wrong.
+	if ( ! isset( $wp_roles ) )
+		$wp_roles = new WP_Roles();
+
+	// Validate user id
+	$user_id   = bbp_get_user_id( $user_id, false, false );
+	$user      = get_userdata( $user_id );
+	$role      = false;
+	$all_roles = apply_filters( 'editable_roles', $wp_roles->roles );
+
+	// User has roles so lets
+	if ( ! empty( $user->roles ) ) {
+		$roles = array_intersect( array_values( $user->roles ), array_keys( $all_roles ) );
+
+		// If there's a role in the array, use the first one
+		if ( !empty( $roles ) ) {
+			$role = array_shift( array_values( $roles ) );
+		}
+	}
+
+	return apply_filters( 'bbp_get_user_blog_role', $role, $user_id, $user );
+}
+
+/**
+ * Helper function hooked to 'bbp_edit_user_profile_update' action to save or
+ * update user roles and capabilities.
+ *
+ * @since bbPress (r4235)
+ *
+ * @param int $user_id
+ * @uses bbp_reset_user_caps() to reset caps
+ * @usse bbp_save_user_caps() to save caps
+ */
+function bbp_profile_update_role( $user_id = 0 ) {
+
+	// Bail if no user ID was passed
+	if ( empty( $user_id ) )
+		return;
+
+	// Bail if no role
+	if ( ! isset( $_POST['bbp-forums-role'] ) )
+		return;
+
+	// Fromus role we want the user to have
+	$new_role    = sanitize_text_field( $_POST['bbp-forums-role'] );
+	$forums_role = bbp_get_user_role( $user_id );
+
+	// Set the new forums role
+	if ( $new_role != $forums_role ) {
+		bbp_set_user_role( $user_id, $new_role );
+	}
+}
+
+/**
+ * Add the default role to the current user if needed
+ *
+ * This function will bail if the forum is not global in a multisite
+ * installation of WordPress, or if the user is marked as spam or deleted.
+ *
+ * @since bbPress (r3380)
+ *
+ * @uses is_user_logged_in() To bail if user is not logged in
+ * @uses bbp_get_user_role() To bail if user already has a role
+ * @uses bbp_is_user_inactive() To bail if user is inactive
+ * @uses bbp_allow_global_access() To know whether to save role to database
+ * @uses bbp_get_user_role_map() To get the WP to BBP role map array
+ * @uses bbp_get_default_role() To get the site's default forums role
+ * @uses get_option()
+ *
+ * @return If not multisite, not global, or user is deleted/spammed
+ */
+function bbp_set_current_user_default_role() {
+
+	/** Sanity ****************************************************************/
+
+	// Bail if deactivating bbPress
+	if ( bbp_is_deactivation() )
+		return;
+
+	// Catch all, to prevent premature user initialization
+	if ( ! did_action( 'set_current_user' ) )
+		return;
+
+	// Bail if not logged in or already a member of this site
+	if ( ! is_user_logged_in() )
+		return;
+
+	// Get the current user ID
+	$user_id = bbp_get_current_user_id();
+
+	// Bail if user already has a forums role
+	if ( bbp_get_user_role( $user_id ) )
+		return;
+
+	// Bail if user is marked as spam or is deleted
+	if ( bbp_is_user_inactive( $user_id ) )
+		return;
+
+	/** Ready *****************************************************************/
+
+	// Load up bbPress once
+	$bbp         = bbpress();
+
+	// Get whether or not to add a role to the user account
+	$add_to_site = bbp_allow_global_access();
+
+	// Get the current user's WordPress role. Set to empty string if none found.
+	$user_role   = bbp_get_user_blog_role( $user_id );
+
+	// Get the role map
+	$role_map    = bbp_get_user_role_map();
+
+	/** Forum Role ************************************************************/
+
+	// Use a mapped role
+	if ( isset( $role_map[$user_role] ) ) {
+		$new_role = $role_map[$user_role];
+
+	// Use the default role
+	} else {
+		$new_role = bbp_get_default_role();
+	}
+
+	/** Add or Map ************************************************************/
+
+	// Add the user to the site
+	if ( true == $add_to_site ) {
+		$bbp->current_user->add_role( $new_role );
+
+	// Don't add the user, but still give them the correct caps dynamically
+	} else {		
+		$bbp->current_user->caps[$new_role] = true;
+		$bbp->current_user->get_role_caps();
+	}
+}
+
+/**
+ * Return a map of WordPress roles to bbPress roles. Used to automatically grant
+ * appropriate bbPress roles to WordPress users that wouldn't already have a
+ * role in the forums. Also guarantees WordPress admins get the Keymaster role.
+ *
+ * @since bbPress (r4334)
+ *
+ * @return array Filtered array of WordPress roles to bbPress roles
+ */
+function bbp_get_user_role_map() {
+
+	// Get the default role once here
+	$default_role = bbp_get_default_role();
+
+	// Return filtered results, forcing admins to keymasters.
+	return (array) apply_filters( 'bbp_get_user_role_map', array (
+		'administrator' => bbp_get_keymaster_role(),
+		'editor'        => $default_role,
+		'author'        => $default_role,
+		'contributor'   => $default_role,
+		'subscriber'    => $default_role
+	) );
+}
+
+/** User Status ***************************************************************/
+
+/**
+ * Checks if the user has been marked as a spammer.
+ *
+ * @since bbPress (r3355)
+ *
+ * @param int $user_id int The ID for the user.
+ * @return bool True if spammer, False if not.
+ */
+function bbp_is_user_spammer( $user_id = 0 ) {
+
+	// Default to current user
+	if ( empty( $user_id ) && is_user_logged_in() )
+		$user_id = bbp_get_current_user_id();
+
+	// No user to check
+	if ( empty( $user_id ) )
+		return false;
+
+	// Assume user is not spam
+	$is_spammer = false;
+
+	// Get user data
+	$user = get_userdata( $user_id );
+
+	// No user found
+	if ( empty( $user ) ) {
+		$is_spammer = false;
+
+	// Check if spam
+	} elseif ( !empty( $user->spam ) ) {
+		$is_spammer = true;
+	}
+
+	return (bool) apply_filters( 'bp_core_is_user_spammer', $is_spammer );
+}
+
+/**
+ * Mark a users topics and replies as spam when the user is marked as spam
+ *
+ * @since bbPress (r3405)
+ *
+ * @global WPDB $wpdb
+ * @param int $user_id Optional. User ID to spam. Defaults to displayed user.
+
+ * @uses bbp_is_single_user()
+ * @uses bbp_is_user_home()
+ * @uses bbp_get_displayed_user_field()
+ * @uses is_super_admin()
+ * @uses get_blogs_of_user()
+ * @uses get_current_blog_id()
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_reply_post_type()
+ * @uses switch_to_blog()
+ * @uses get_post_type()
+ * @uses bbp_spam_topic()
+ * @uses bbp_spam_reply()
+ * @uses restore_current_blog()
+ *
+ * @return If no user ID passed
+ */
+function bbp_make_spam_user( $user_id = 0 ) {
+
+	// Use displayed user if it's not yourself
+	if ( empty( $user_id ) && bbp_is_single_user() && !bbp_is_user_home() )
+		$user_id = bbp_get_displayed_user_id();
+
+	// Bail if no user ID
+	if ( empty( $user_id ) )
+		return;
+
+	// Bail if user ID is super admin
+	if ( is_super_admin( $user_id ) )
+		return;
+
+	// Arm the torpedos
+	global $wpdb;
+
+	// Get the blog IDs of the user to mark as spam
+	$blogs = get_blogs_of_user( $user_id, true );
+
+	// If user has no blogs, they are a guest on this site
+	if ( empty( $blogs ) )
+		$blogs[$wpdb->blogid] = array();
+
+	// Make array of post types to mark as spam
+	$post_types  = array( bbp_get_topic_post_type(), bbp_get_reply_post_type() );
+	$post_types  = "'" . implode( "', '", $post_types ) . "'";
+	$status      = bbp_get_public_status_id();
+
+	// Loop through blogs and remove their posts
+	foreach ( (array) array_keys( $blogs ) as $blog_id ) {
+
+		// Switch to the blog ID
+		switch_to_blog( $blog_id );
+
+		// Get topics and replies
+		$posts = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE post_author = {$user_id} AND post_status = '{$status}' AND post_type IN ({$post_types})" );
+
+		// Loop through posts and spam them
+		if ( !empty( $posts ) ) {
+			foreach ( $posts as $post_id ) {
+
+				// The routines for topics ang replies are different, so use the
+				// correct one based on the post type
+				switch ( get_post_type( $post_id ) ) {
+
+					case bbp_get_topic_post_type() :
+						bbp_spam_topic( $post_id );
+						break;
+
+					case bbp_get_reply_post_type() :
+						bbp_spam_reply( $post_id );
+						break;
+				}
+			}
+		}
+
+		// Switch back to current blog
+		restore_current_blog();
+	}
+}
+
+/**
+ * Mark a users topics and replies as spam when the user is marked as spam
+ *
+ * @since bbPress (r3405)
+ *
+ * @global WPDB $wpdb
+ * @param int $user_id Optional. User ID to unspam. Defaults to displayed user.
+ *
+ * @uses bbp_is_single_user()
+ * @uses bbp_is_user_home()
+ * @uses bbp_get_displayed_user_field()
+ * @uses is_super_admin()
+ * @uses get_blogs_of_user()
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_reply_post_type()
+ * @uses switch_to_blog()
+ * @uses get_post_type()
+ * @uses bbp_unspam_topic()
+ * @uses bbp_unspam_reply()
+ * @uses restore_current_blog()
+ *
+ * @return If no user ID passed
+ */
+function bbp_make_ham_user( $user_id = 0 ) {
+
+	// Use displayed user if it's not yourself
+	if ( empty( $user_id ) && bbp_is_single_user() && !bbp_is_user_home() )
+		$user_id = bbp_get_displayed_user_field();
+
+	// Bail if no user ID
+	if ( empty( $user_id ) )
+		return;
+
+	// Bail if user ID is super admin
+	if ( is_super_admin( $user_id ) )
+		return;
+
+	// Arm the torpedos
+	global $wpdb;
+
+	// Get the blog IDs of the user to mark as spam
+	$blogs = get_blogs_of_user( $user_id, true );
+
+	// If user has no blogs, they are a guest on this site
+	if ( empty( $blogs ) )
+		$blogs[$wpdb->blogid] = array();
+
+	// Make array of post types to mark as spam
+	$post_types = array( bbp_get_topic_post_type(), bbp_get_reply_post_type() );
+	$post_types = "'" . implode( "', '", $post_types ) . "'";
+	$status     = bbp_get_spam_status_id();
+
+	// Loop through blogs and remove their posts
+	foreach ( (array) array_keys( $blogs ) as $blog_id ) {
+
+		// Switch to the blog ID
+		switch_to_blog( $blog_id );
+
+		// Get topics and replies
+		$posts = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE post_author = {$user_id} AND post_status = '{$status}' AND post_type IN ({$post_types})" );
+
+		// Loop through posts and spam them
+		if ( !empty( $posts ) ) {
+			foreach ( $posts as $post_id ) {
+
+				// The routines for topics ang replies are different, so use the
+				// correct one based on the post type
+				switch ( get_post_type( $post_id ) ) {
+
+					case bbp_get_topic_post_type() :
+						bbp_unspam_topic( $post_id );
+						break;
+
+					case bbp_get_reply_post_type() :
+						bbp_unspam_reply( $post_id );
+						break;
+				}
+			}
+		}
+
+		// Switch back to current blog
+		restore_current_blog();
+	}
+}
+
+/**
+ * Checks if the user has been marked as deleted.
+ *
+ * @since bbPress (r3355)
+ *
+ * @param int $user_id int The ID for the user.
+ * @return bool True if deleted, False if not.
+ */
+function bbp_is_user_deleted( $user_id = 0 ) {
+
+	// Default to current user
+	if ( empty( $user_id ) && is_user_logged_in() )
+		$user_id = bbp_get_current_user_id();
+
+	// No user to check
+	if ( empty( $user_id ) )
+		return false;
+
+	// Assume user is not deleted
+	$is_deleted = false;
+
+	// Get user data
+	$user = get_userdata( $user_id );
+
+	// No user found
+	if ( empty( $user ) ) {
+		$is_deleted = true;
+
+	// Check if deleted
+	} elseif ( !empty( $user->deleted ) ) {
+		$is_deleted = true;
+	}
+
+	return (bool) apply_filters( 'bp_core_is_user_deleted', $is_deleted );
+}
+
+/**
+ * Checks if user is active
+ *
+ * @since bbPress (r3502)
+ *
+ * @uses is_user_logged_in() To check if user is logged in
+ * @uses bbp_get_displayed_user_id() To get current user ID
+ * @uses bbp_is_user_spammer() To check if user is spammer
+ * @uses bbp_is_user_deleted() To check if user is deleted
+ *
+ * @param int $user_id The user ID to check
+ * @return bool True if public, false if not
+ */
+function bbp_is_user_active( $user_id = 0 ) {
+
+	// Default to current user
+	if ( empty( $user_id ) && is_user_logged_in() )
+		$user_id = bbp_get_current_user_id();
+
+	// No user to check
+	if ( empty( $user_id ) )
+		return false;
+
+	// Check spam
+	if ( bbp_is_user_spammer( $user_id ) )
+		return false;
+
+	// Check deleted
+	if ( bbp_is_user_deleted( $user_id ) )
+		return false;
+
+	// Assume true if not spam or deleted
+	return true;
+}
+
+/**
+ * Checks if user is not active.
+ *
+ * @since bbPress (r3502)
+ *
+ * @uses is_user_logged_in() To check if user is logged in
+ * @uses bbp_get_displayed_user_id() To get current user ID
+ * @uses bbp_is_user_active() To check if user is active
+ *
+ * @param int $user_id The user ID to check. Defaults to current user ID
+ * @return bool True if inactive, false if active
+ */
+function bbp_is_user_inactive( $user_id = 0 ) {
+
+	// Default to current user
+	if ( empty( $user_id ) && is_user_logged_in() )
+		$user_id = bbp_get_current_user_id();
+
+	// No user to check
+	if ( empty( $user_id ) )
+		return false;
+
+	// Return the inverse of active
+	return !bbp_is_user_active( $user_id );
+}
+
+/**
+ * Does a user have a profile for the current site
+ *
+ * @since bbPress (r4362)
+ *
+ * @param int $user_id User ID to check
+ * @param int $blog_id Blog ID to check
+ *
+ * @uses bbp_get_user_id() To verify the user ID
+ * @uses get_userdata() To get the user's data
+ * @uses is_super_admin() To determine if user can see inactive users
+ * @uses bbp_is_user_inactive() To check if user is spammer or deleted
+ * @uses apply_filters() To allow override of this functions result
+ *
+ * @return boolean Whether or not the user has a profile on this blog_id
+ */
+function bbp_user_has_profile( $user_id = 0 ) {
+
+	// Assume every user has a profile
+	$retval  = true;
+
+	// Validate user ID, default to displayed or current user
+	$user_id = bbp_get_user_id( $user_id, true, true );
+
+	// Try to get this user's data
+	$user    = get_userdata( $user_id );
+
+	// No user found, return false
+	if ( empty( $user ) ) {
+		$retval = false;
+
+	// User is inactive, and current user is not a super admin
+	} elseif ( ! is_super_admin() && bbp_is_user_inactive( $user->ID ) ) {
+		$retval = false;
+	}
+
+	// Filter and return
+	return (bool) apply_filters( 'bbp_show_user_profile', $retval, $user_id );
+}