Skip to:
Content

BuddyPress.org

Changeset 11776


Ignore:
Timestamp:
12/14/2017 01:24:01 PM (22 months ago)
Author:
dcavins
Message:

Use bp_user_can for group-related permissions.

Centralize and de-duplicate permissions checks for group-related functions, like checking whether a user can join a group or send invitations from a group.

Props dcavins, djpaul.

Fixes #7610.

Location:
trunk
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-groups/bp-groups-actions.php

    r11763 r11776  
    421421
    422422        // User wants to join a group that is not public.
    423         if ( $bp->groups->current_group->status != 'public' ) {
     423        if ( bp_current_user_can( 'groups_join_group', array( 'group_id' => $bp->groups->current_group->id ) ) ) {
    424424            if ( !groups_check_user_has_invite( bp_loggedin_user_id(), $bp->groups->current_group->id ) ) {
    425425                bp_core_add_message( __( 'There was an error joining the group.', 'buddypress' ), 'error' );
  • trunk/src/bp-groups/bp-groups-filters.php

    r11764 r11776  
    159159    }
    160160
    161     if ( 'groups' === $activity->component ) {
    162         $group = groups_get_group( $activity->item_id );
    163         if ( 'public' !== $group->status && ! groups_is_user_member( $user_id, $group->id ) ) {
    164             $send = false;
    165         }
     161    if ( 'groups' === $activity->component && ! bp_user_can( $user_id, 'groups_access_group', array( 'group_id' => $activity->item_id ) ) ) {
     162        $send = false;
    166163    }
    167164
     
    191188    return $avatar;
    192189}
     190
     191/**
     192 * Filter the bp_user_can value to determine what the user can do
     193 * with regards to a specific group.
     194 *
     195 * @since 3.0.0
     196 *
     197 * @param bool   $retval     Whether or not the current user has the capability.
     198 * @param int    $user_id
     199 * @param string $capability The capability being checked for.
     200 * @param int    $site_id    Site ID. Defaults to the BP root blog.
     201 * @param array  $args       Array of extra arguments passed.
     202 *
     203 * @return bool
     204 */
     205function bp_groups_user_can_filter( $retval, $user_id, $capability, $site_id, $args ) {
     206    if ( empty( $args['group_id'] ) ) {
     207        $group_id = bp_get_current_group_id();
     208    } else {
     209        $group_id = (int) $args['group_id'];
     210    }
     211
     212    switch ( $capability ) {
     213        case 'groups_join_group':
     214            // Return early if the user isn't logged in or the group ID is unknown.
     215            if ( ! $user_id || ! $group_id ) {
     216                break;
     217            }
     218
     219            // The group must allow joining, and the user should not currently be a member.
     220            $group = groups_get_group( $group_id );
     221            if ( 'public' === bp_get_group_status( $group )
     222                && ! groups_is_user_member( $user_id, $group->id )
     223                && ! groups_is_user_banned( $user_id, $group->id )
     224            ) {
     225                $retval = true;
     226            }
     227            break;
     228
     229        case 'groups_request_membership':
     230            // Return early if the user isn't logged in or the group ID is unknown.
     231            if ( ! $user_id || ! $group_id ) {
     232                break;
     233            }
     234
     235            /*
     236            * The group must accept membership requests, and the user should not
     237            * currently be a member, have an active request, or be banned.
     238            */
     239            $group = groups_get_group( $group_id );
     240            if ( 'private' === bp_get_group_status( $group )
     241                && ! groups_is_user_member( $user_id, $group->id )
     242                && ! groups_check_for_membership_request( $user_id, $group->id )
     243                && ! groups_is_user_banned( $user_id, $group->id )
     244            ) {
     245                $retval = true;
     246            }
     247            break;
     248
     249        case 'groups_send_invitation':
     250            // Return early if the user isn't logged in or the group ID is unknown.
     251            if ( ! $user_id || ! $group_id ) {
     252                break;
     253            }
     254
     255            /*
     256            * The group must allow invitations, and the user should not
     257            * currently be a member or be banned from the group.
     258            */
     259            $group = groups_get_group( $group_id );
     260            // Users with the 'bp_moderate' cap can always send invitations.
     261            if ( bp_user_can( $user_id, 'bp_moderate' ) ) {
     262                $retval = true;
     263            } else {
     264                $invite_status = bp_group_get_invite_status( $group_id );
     265
     266                switch ( $invite_status ) {
     267                    case 'admins' :
     268                        if ( groups_is_user_admin( $user_id, $group_id ) ) {
     269                            $retval = true;
     270                        }
     271                        break;
     272
     273                    case 'mods' :
     274                        if ( groups_is_user_mod( $user_id, $group_id ) || groups_is_user_admin( $user_id, $group_id ) ) {
     275                            $retval = true;
     276                        }
     277                        break;
     278
     279                    case 'members' :
     280                        if ( groups_is_user_member( $user_id, $group_id ) ) {
     281                            $retval = true;
     282                        }
     283                        break;
     284                }
     285            }
     286            break;
     287
     288        case 'groups_receive_invitation':
     289            // Return early if the user isn't logged in or the group ID is unknown.
     290            if ( ! $user_id || ! $group_id ) {
     291                break;
     292            }
     293
     294            /*
     295            * The group must allow invitations, and the user should not
     296            * currently be a member or be banned from the group.
     297            */
     298            $group = groups_get_group( $group_id );
     299            if ( in_array( bp_get_group_status( $group ), array( 'private', 'hidden' ), true )
     300                && ! groups_is_user_member( $user_id, $group->id )
     301                && ! groups_is_user_banned( $user_id, $group->id )
     302            ) {
     303                $retval = true;
     304            }
     305            break;
     306
     307        case 'groups_access_group':
     308            // Return early if the group ID is unknown.
     309            if ( ! $group_id ) {
     310                break;
     311            }
     312
     313            $group = groups_get_group( $group_id );
     314
     315            // If the check is for the logged-in user, use the BP_Groups_Group property.
     316            if ( $user_id === bp_loggedin_user_id() ) {
     317                $retval = $group->user_has_access;
     318
     319            /*
     320             * If the check is for a specified user who is not the logged-in user
     321             * run the check manually.
     322             */
     323            } elseif ( 'public' === bp_get_group_status( $group ) || groups_is_user_member( $user_id, $group->id ) ) {
     324                $retval = true;
     325            }
     326            break;
     327
     328        case 'groups_see_group':
     329            // Return early if the group ID is unknown.
     330            if ( ! $group_id ) {
     331                break;
     332            }
     333
     334            $group = groups_get_group( $group_id );
     335
     336            // If the check is for the logged-in user, use the BP_Groups_Group property.
     337            if ( $user_id === bp_loggedin_user_id() ) {
     338                $retval = $group->is_visible;
     339
     340            /*
     341             * If the check is for a specified user who is not the logged-in user
     342             * run the check manually.
     343             */
     344            } elseif ( 'hidden' !== bp_get_group_status( $group ) || groups_is_user_member( $user_id, $group->id ) ) {
     345                $retval = true;
     346            }
     347            break;
     348    }
     349
     350    return $retval;
     351
     352}
     353add_filter( 'bp_user_can', 'bp_groups_user_can_filter', 10, 5 );
  • trunk/src/bp-groups/bp-groups-template.php

    r11763 r11776  
    21862186
    21872187    if ( $user_id ) {
    2188         // Users with the 'bp_moderate' cap can always send invitations.
    2189         if ( bp_user_can( $user_id, 'bp_moderate' ) ) {
    2190             $can_send_invites = true;
    2191         } else {
    2192             $invite_status = bp_group_get_invite_status( $group_id );
    2193 
    2194             switch ( $invite_status ) {
    2195                 case 'admins' :
    2196                     if ( groups_is_user_admin( $user_id, $group_id ) ) {
    2197                         $can_send_invites = true;
    2198                     }
    2199                     break;
    2200 
    2201                 case 'mods' :
    2202                     if ( groups_is_user_mod( $user_id, $group_id ) || groups_is_user_admin( $user_id, $group_id ) ) {
    2203                         $can_send_invites = true;
    2204                     }
    2205                     break;
    2206 
    2207                 case 'members' :
    2208                     if ( groups_is_user_member( $user_id, $group_id ) ) {
    2209                         $can_send_invites = true;
    2210                     }
    2211                     break;
    2212             }
    2213         }
     2188        $can_send_invites = bp_user_can( $user_id, 'groups_send_invitation', array( 'group_id' => $group_id ) );
    22142189    }
    22152190
  • trunk/src/bp-groups/classes/class-bp-groups-component.php

    r11763 r11776  
    544544            // member and does not have an outstanding invitation,
    545545            // show a "Request Membership" nav item.
    546             if ( is_user_logged_in() &&
    547                  ! $this->current_group->is_member &&
    548                  ! groups_check_for_membership_request( bp_loggedin_user_id(), $this->current_group->id ) &&
    549                  $this->current_group->status == 'private' &&
    550                  ! groups_check_user_has_invite( bp_loggedin_user_id(), $this->current_group->id )
    551                 ) {
     546            if ( bp_current_user_can( 'groups_request_membership', array( 'group_id' => $this->current_group->id ) ) ) {
    552547
    553548                $sub_nav[] = array(
  • trunk/src/bp-templates/bp-legacy/buddypress-functions.php

    r11773 r11776  
    14931493
    14941494    if ( ! groups_is_user_member( bp_loggedin_user_id(), $group->id ) ) {
    1495         if ( 'public' == $group->status ) {
     1495        if ( bp_current_user_can( 'groups_join_group', array( 'group_id' => $group->id ) ) ) {
    14961496            check_ajax_referer( 'groups_join_group' );
    14971497
     
    15021502            }
    15031503
    1504         } elseif ( 'private' == $group->status ) {
     1504        } elseif ( bp_current_user_can( 'groups_request_membership', array( 'group_id' => $group->id ) ) ) {
    15051505
    15061506            // If the user has already been invited, then this is
     
    15321532        if ( ! groups_leave_group( $group->id ) ) {
    15331533            _e( 'Error leaving group', 'buddypress' );
    1534         } elseif ( 'public' == $group->status ) {
     1534        } elseif ( bp_current_user_can( 'groups_join_group', array( 'group_id' => $group->id ) ) ) {
    15351535            echo '<a id="group-' . esc_attr( $group->id ) . '" class="group-button join-group" rel="join" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'join', 'groups_join_group' ) . '">' . __( 'Join Group', 'buddypress' ) . '</a>';
    1536         } elseif ( 'private' == $group->status ) {
     1536        } elseif ( bp_current_user_can( 'groups_request_membership', array( 'group_id' => $group->id ) ) ) {
    15371537            echo '<a id="group-' . esc_attr( $group->id ) . '" class="group-button request-membership" rel="join" href="' . wp_nonce_url( bp_get_group_permalink( $group ) . 'request-membership', 'groups_request_membership' ) . '">' . __( 'Request Membership', 'buddypress' ) . '</a>';
    15381538        }
Note: See TracChangeset for help on using the changeset viewer.