Skip to:
Content

BuddyPress.org

Ticket #5121: 5121.01.patch

File 5121.01.patch, 3.5 KB (added by thebrandonallen, 5 years ago)

Proof-of-concept

  • src/bp-core/bp-core-component.php

    diff --git src/bp-core/bp-core-component.php src/bp-core/bp-core-component.php
    index a24de99..4b79f1a 100644
    class BP_Component { 
    429429                // Generate rewrite rules
    430430                add_action( 'bp_generate_rewrite_rules', array( $this, 'generate_rewrite_rules' ), 10 );
    431431
     432                // Map meta caps
     433                add_filter( 'map_meta_cap',              array( $this, 'map_meta_caps'          ), 10, 4 );
     434
    432435                /**
    433436                 * Fires at the end of the setup_actions method inside BP_Component.
    434437                 *
    class BP_Component { 
    485488        }
    486489
    487490        /**
     491         * Map component meta caps.
     492         *
     493         * @since BuddyPress (x.x.x)
     494         *
     495         * @param array  $caps
     496         * @param string $cap
     497         * @param int    $user_id
     498         * @param mixed  $args
     499         * @uses apply_filters()
     500         *
     501         * @return array Mapped meta cap.
     502         */
     503        public function map_meta_caps( $caps, $cap, $user_id, $args ) {
     504
     505                /**
     506                 * Fires at the end of the map_meta_caps method inside BP_Component.
     507                 *
     508                 * This is a dynamic filter that is based on the component string ID.
     509                 *
     510                 * @since BuddyPress (x.x.x)
     511                 */
     512                return apply_filters( 'bp_' . $this->id . '_map_meta_caps', $caps, $cap, $user_id, $args );
     513        }
     514
     515        /**
    488516         * Set up the component entries in the WordPress Admin Bar.
    489517         *
    490518         * @see WP_Admin_Bar::add_menu() for a description of the syntax
  • src/bp-groups/bp-groups-loader.php

    diff --git src/bp-groups/bp-groups-loader.php src/bp-groups/bp-groups-loader.php
    index 674448c..208a87f 100644
    class BP_Groups_Component extends BP_Component { 
    622622        }
    623623
    624624        /**
     625         * Map groups component meta caps.
     626         *
     627         * @since BuddyPress (x.x.x)
     628         *
     629         * @param array  $caps
     630         * @param string $cap
     631         * @param int    $user_id
     632         * @param mixed  $args
     633         * @uses bp_get_option()
     634         * @uses bp_get_current_group_id()
     635         * @uses groups_is_user_admin()
     636         * @uses BP_Component::map_meta_caps()
     637         *
     638         * @return array Mapped meta cap.
     639         */
     640        public function map_meta_caps( $caps, $cap, $user_id, $args ) {
     641
     642                switch ( $cap ) {
     643
     644                        case 'create_group' :
     645
     646                                // Group creation option
     647                                $restricted = (bool) bp_get_option( 'bp_restrict_group_creation', 0 );
     648
     649                                // If the user exists and group creation is unrestricted, give them access.
     650                                // Otherwise, default to super admins.
     651                                if ( ! empty( $user_id ) && empty( $restricted ) ) {
     652                                        $caps = array( 'exist' );
     653                                } else {
     654                                        $caps = array( 'manage_options' );
     655                                }
     656                                break;
     657
     658                        case 'edit_group'   :
     659                        case 'delete_group' :
     660
     661                                /*
     662                                 * Attempt to get a valid group id
     663                                 *
     664                                 * First we check for the current group id. If none exists, we check to see
     665                                 * if one was passed to current_user_can() or user_can().
     666                                 */
     667                                $group_id = bp_get_current_group_id();
     668                                if ( empty( $group_id ) && ! empty( $args[0] ) ) {
     669                                        if ( is_numeric( $args[0] ) ) {
     670                                                $group_id = $args[0];
     671                                        } elseif ( ( $args[0] instanceof BP_Groups_Group ) && ! empty( $args[0]->id ) ) {
     672                                                $group_id = $args[0]->id;
     673                                        }
     674                                }
     675
     676                                // If the user exists and is the group admin, give them access. Otherwise,
     677                                // default to super admins.
     678                                if ( ! empty( $user_id ) && groups_is_user_admin( $user_id, $group_id ) ) {
     679                                        $caps = array( 'exist' );
     680                                } else {
     681                                        $caps = array( 'manage_options' );
     682                                }
     683                                break;
     684                }
     685
     686                return parent::map_meta_caps( $caps, $cap, $user_id, $args );
     687        }
     688
     689        /**
    625690         * Set up the component entries in the WordPress Admin Bar.
    626691         *
    627692         * @see BP_Component::setup_nav() for a description of the $wp_admin_nav