Skip to:
Content

bbPress.org


Ignore:
Timestamp:
09/17/2012 12:03:03 AM (14 years ago)
Author:
johnjamesjacoby
Message:

Capabilities:

  • Remove experimental Bozo functionality. We can use the 'participate' to prevent forum participation without creating topics or replies.
  • Introduce functions to reset, save, and remove user capabilities.
  • Use these functions in both theme-side and admin-side profiles.
  • Add capabilities to bbp-twentyten theme. This will be moved into the stand-alone bbp-twentyten theme soon'ish.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/bbp-includes/bbp-core-caps.php

    r4206 r4222  
    115115                'moderate',
    116116                'throttle',
    117                 'view_trash',
    118                 'bozo'
     117                'view_trash'
    119118        ) );
    120119}
    … …  
    277276                                $retval = __( 'View items in forum trash', 'bbpress' );
    278277                                break;
    279                         case 'bozo' :
    280                                 $retval = __( 'User is a forum bozo', 'bbpress' );
    281                                 break;
    282278
    283279                        // Forum caps
    … …  
    426422                /** General ***********************************************************/
    427423
    428                 case 'bozo' :
    429 
    430                         // Inactive users are not bozos
     424                /**
     425                 * The 'participate' capability is similar to WordPress's 'read' cap,
     426                 * in that it is the minimum required cap to perform any other bbPress
     427                 * related thing.
     428                 */
     429                case 'participate' :
     430
     431                        // Inactive users cannot participate
    431432                        if ( bbp_is_user_inactive( $user_id ) ) {
    432433                                $caps = array( 'do_not_allow' );
    433434
    434                         // Moderators are not bozos
     435                        // Moderators are always participants
    435436                        } elseif ( user_can( $user_id, 'moderate' ) ) {
     437                                $caps = array( $cap );
     438
     439                        // Map to read
     440                        } else {
     441                                $caps = array( 'read' );
     442                        }
     443
     444                        break;
     445                       
     446                case 'moderate' :
     447
     448                        // All admins are administrators
     449                        if ( user_can( $user_id, 'administrator' ) ) {
     450                                $caps = array( 'read' );
     451                        }
     452                        break;
     453
     454                /** Reading ***********************************************************/
     455
     456                case 'read_private_forums' :
     457                case 'read_hidden_forums'  :
     458
     459                        // Non-participants cannot never read private/hidden forums
     460                        if ( ! user_can( $user_id, 'participate' ) ) {
    436461                                $caps = array( 'do_not_allow' );
    437                         }
    438 
    439                         break;
    440 
    441                 /** Reading ***********************************************************/
     462
     463                        // Moderators can always read private/hidden forums
     464                        } elseif ( user_can( $user_id, 'moderate' ) ) {
     465                                $caps = array( $cap );
     466                        }
     467
     468                        break;
    442469
    443470                case 'read_forum' :
    … …  
    445472                case 'read_reply' :
    446473
    447                         // Get the post
    448                         $_post = get_post( $args[0] );
    449                         if ( !empty( $_post ) ) {
    450 
    451                                 // Get caps for post type object
    452                                 $post_type = get_post_type_object( $_post->post_type );
    453                                 $caps      = array();
    454 
    455                                 // Post is public
    456                                 if ( bbp_get_public_status_id() == $_post->post_status ) {
    457                                         $caps[] = 'read';
    458 
    459                                 // User is author so allow read
    460                                 } elseif ( (int) $user_id == (int) $_post->post_author ) {
    461                                         $caps[] = 'read';
    462 
    463                                 // Unknown so map to private posts
    464                                 } else {
    465                                         $caps[] = $post_type->cap->read_private_posts;
     474                        // User cannot participate
     475                        if ( ! user_can( $user_id, 'participate' ) ) {
     476                                $caps = array( 'do_not_allow' );
     477
     478                        // Do some post ID based logic
     479                        } else {
     480                       
     481                                // Get the post
     482                                $_post = get_post( $args[0] );
     483                                if ( !empty( $_post ) ) {
     484
     485                                        // Get caps for post type object
     486                                        $post_type = get_post_type_object( $_post->post_type );
     487
     488                                        // Post is public
     489                                        if ( bbp_get_public_status_id() == $_post->post_status ) {
     490                                                $caps = array( 'particpate' );
     491
     492                                        // User is author so allow read
     493                                        } elseif ( (int) $user_id == (int) $_post->post_author ) {
     494                                                $caps = array( 'participate' );
     495
     496                                        // Unknown so map to private posts
     497                                        } else {
     498                                                $caps = array( $post_type->cap->read_private_forums );
     499                                        }
    466500                                }
    467501                        }
    … …  
    475509                case 'publish_replies' :
    476510
    477                         // Add do_not_allow cap if user is spam or deleted
    478                         if ( bbp_is_user_inactive( $user_id ) )
     511                        // Non participants cannot participate
     512                        if ( ! user_can( $user_id, 'participate' ) ) {
    479513                                $caps = array( 'do_not_allow' );
    480514
     515                        // Moderators can always edit
     516                        } elseif ( user_can( $user_id, 'moderate' ) ) {
     517                                $caps = array( $cap );
     518                        }
     519
    481520                        break;
    482521
    … …  
    484523
    485524                // Used primarily in wp-admin
    486                 case 'edit_forums' :
    487                 case 'edit_topics' :
    488                 case 'edit_replies' :
    489 
    490                         // Add do_not_allow cap if user is spam or deleted
    491                         if ( bbp_is_user_inactive( $user_id ) )
     525                case 'edit_forums'         :
     526                case 'edit_topics'         :
     527                case 'edit_replies'        :
     528                case 'edit_others_topics'  :
     529                case 'edit_others_replies' :
     530
     531                        // Moderators can always edit
     532                        if ( ! user_can( $user_id, 'participate' ) ) {
    492533                                $caps = array( 'do_not_allow' );
     534
     535                        // Moderators can always edit forum content
     536                        } elseif ( user_can( $user_id, 'moderate' ) ) {
     537                                $caps = array( $cap );
     538                        }
    493539
    494540                        break;
    … …  
    567613                                        $caps[] = 'do_not_allow';
    568614
     615                                // Moderators can always edit forum content
     616                                } elseif ( user_can( $user_id, 'moderate' ) ) {
     617                                        $caps[] = 'participate';
     618
    569619                                // Unknown so map to delete_others_posts
    570620                                } else {
    571621                                        $caps[] = $post_type->cap->delete_others_posts;
    572622                                }
     623                        }
     624
     625                        break;
     626                       
     627                // Moderation override
     628                case 'delete_topics'         :
     629                case 'delete_replies'        :
     630                case 'delete_others_topics'  :
     631                case 'delete_others_replies' :
     632
     633                        // Moderators can always edit
     634                        if ( ! user_can( $user_id, 'participate' ) ) {
     635                                $caps = array( 'do_not_allow' );
     636
     637                        // Moderators can always edit forum content
     638                        } elseif ( user_can( $user_id, 'moderate' ) ) {
     639                                $caps = array( $cap );
     640                        }
     641
     642                        break;
     643                       
     644                /** Topic Tags ********************************************************/
     645
     646                case 'manage_topic_tags' :
     647                case 'edit_topic_tags'   :
     648                case 'delete_topic_tags' :
     649                case 'assign_topic_tags' :
     650
     651                        // Moderators can always edit
     652                        if ( ! user_can( $user_id, 'participate' ) ) {
     653                                $caps = array( 'do_not_allow' );
     654
     655                        // Moderators can always edit forum content
     656                        } elseif ( user_can( $user_id, 'moderate' ) ) {
     657                                $caps = array( $cap );
    573658                        }
    574659
    … …  
    748833
    749834        return apply_filters( 'bbp_get_caps_for_role', $caps, $role );
     835}
     836
     837/**
     838 * Remove all bbPress capabilities for a given user
     839 *
     840 * @since bbPress (r4221)
     841 *
     842 * @param int $user_id
     843 * @return boolean True on success, false on failure
     844 */
     845function bbp_remove_user_caps( $user_id = 0 ) {
     846
     847        // Bail if no user was passed
     848        if ( empty( $user_id ) )
     849                return false;
     850
     851        // Load up the user
     852        $user = new WP_User( $user_id );
     853
     854        // Remove all caps
     855        foreach ( bbp_get_capability_groups() as $group )
     856                foreach ( bbp_get_capabilities_for_group( $group ) as $capability )
     857                        $user->remove_cap( $capability );
     858
     859        // Success
     860        return true;
     861}
     862
     863/**
     864 * Remove all bbPress capabilities for a given user
     865 *
     866 * @since bbPress (r4221)
     867 *
     868 * @param int $user_id
     869 * @return boolean True on success, false on failure
     870 */
     871function bbp_reset_user_caps( $user_id = 0 ) {
     872
     873        // Bail if no user was passed
     874        if ( empty( $user_id ) )
     875                return false;
     876
     877        // Bail if not a member of this blog
     878        if ( ! user_can( $user_id, 'read' ) )
     879                return false;
     880
     881        // Remove all caps for user
     882        bbp_remove_user_caps( $user_id );
     883
     884        // Load up the user
     885        $user = new WP_User( $user_id );
     886
     887        // User has no role so bail
     888        if ( ! isset( $user->roles ) )
     889                return false;
     890
     891        // Use first user role
     892        $caps = bbp_get_caps_for_role( array_shift( $user->roles ) );
     893
     894        // Add caps for the first role
     895        foreach ( $caps as $cap )
     896                $user->add_cap( $cap, true );
     897
     898        // Success
     899        return true;
     900}
     901
     902/**
     903 * Save all bbPress capabilities for a given user
     904 *
     905 * @since bbPress (r4221)
     906 *
     907 * @param type $user_id
     908 * @return boolean
     909 */
     910function bbp_save_user_caps( $user_id = 0 ) {
     911
     912        // Bail if no user was passed
     913        if ( empty( $user_id ) )
     914                return false;
     915
     916        // Bail if not a member of this blog
     917        if ( ! user_can( $user_id, 'read' ) )
     918                return false;
     919
     920        // Load up the user
     921        $user = new WP_User( $user_id );
     922
     923        // Loop through capability groups
     924        foreach ( bbp_get_capability_groups() as $group ) {
     925                foreach ( bbp_get_capabilities_for_group( $group ) as $capability ) {
     926
     927                        // Maybe add cap
     928                        if ( ! empty( $_POST['_bbp_' . $capability] ) && ! $user->has_cap( $capability ) ) {
     929                                $user->add_cap( $capability, true );
     930
     931                        // Maybe remove cap
     932                        } elseif ( empty( $_POST['_bbp_' . $capability] ) && $user->has_cap( $capability ) ) {
     933                                $user->add_cap( $capability, false );
     934                        }
     935                }
     936        }
     937
     938        // Success
     939        return true;
    750940}
    751941
Note: See TracChangeset for help on using the changeset viewer.