Skip to:
Content

BuddyPress.org

Changeset 10941


Ignore:
Timestamp:
07/10/2016 09:46:27 PM (3 years ago)
Author:
djpaul
Message:

Emails: add unsubscribe feature.

Updates the unsubscribe token to link to a new unsubscribe action handler.

All emails from other platforms or popular websites have a unsubscribe link. For previous versions of BuddyPress, our unsubscribe link pointed to that user's notifications page. However, if someone creates an account on a BuddyPress with a fraudulent email address (for example), that email address' owner will not know the account's authentication details, and so have no way to unsubscribe from that "spam" email.

The change implements a new action handler which accepts unsubscription requests from un-authenticated requests. It adds an new option containing a dynamically generated salt which is used to generate the hash on the unsubscribe link.

Fixes #6932

Props tharsheblows, DJPaul

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/bp-activity/bp-activity-notifications.php

    r10895 r10941  
    5454            $group_name = bp_get_current_group_name();
    5555        }
     56
     57        $unsubscribe_args = array(
     58            'user_id'           => $receiver_user_id,
     59            'notification_type' => $email_type,
     60        );
    5661
    5762        $args = array(
     
    6368                'poster.name'      => $poster_name,
    6469                'receiver-user.id' => $receiver_user_id,
     70                'unsubscribe'      => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    6571            ),
    6672        );
     
    114120        // Send an email if the user hasn't opted-out.
    115121        if ( 'no' != bp_get_user_meta( $original_activity->user_id, 'notification_activity_new_reply', true ) ) {
     122
     123            $unsubscribe_args = array(
     124                'user_id'           => $original_activity->user_id,
     125                'notification_type' => 'activity-comment',
     126            );
     127
    116128            $args = array(
    117129                'tokens' => array(
     
    122134                    'poster.name'               => $poster_name,
    123135                    'thread.url'                => esc_url( $thread_link ),
     136                    'unsubscribe'               => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    124137                ),
    125138            );
     
    156169        // Send an email if the user hasn't opted-out.
    157170        if ( 'no' != bp_get_user_meta( $parent_comment->user_id, 'notification_activity_new_reply', true ) ) {
     171
     172            $unsubscribe_args = array(
     173                'user_id'           => $parent_comment->user_id,
     174                'notification_type' => 'activity-comment-author',
     175            );
     176
    158177            $args = array(
    159178                'tokens' => array(
     
    164183                    'poster.name'            => $poster_name,
    165184                    'thread.url'             => esc_url( $thread_link ),
     185                    'unsubscribe'            => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    166186                ),
    167187            );
     
    179199         * @param int                  $commenter_id   ID of the user who made the comment.
    180200         * @param array                $params         Arguments used with the original activity comment.
    181          */
     201         */
    182202        do_action( 'bp_activity_sent_reply_to_reply_notification', $parent_comment, $comment_id, $commenter_id, $params );
    183203    }
  • trunk/src/bp-core/admin/bp-core-admin-schema.php

    r10902 r10941  
    501501
    502502    $emails       = bp_email_get_schema();
    503     $descriptions = bp_email_get_type_schema();
     503    $descriptions = bp_email_get_type_schema( 'description' );
    504504
    505505    // Add these emails to the database.
  • trunk/src/bp-core/bp-core-actions.php

    r10829 r10941  
    111111// Activation redirect.
    112112add_action( 'bp_activation', 'bp_add_activation_redirect' );
     113
     114// Email unsubscribe.
     115add_action( 'bp_get_request_unsubscribe', 'bp_email_unsubscribe_handler' );
  • trunk/src/bp-core/bp-core-filters.php

    r10899 r10941  
    10311031    $tokens['recipient.name']      = '';
    10321032    $tokens['recipient.username']  = '';
    1033     $tokens['unsubscribe']         = site_url( 'wp-login.php' );
    10341033
    10351034
     
    10481047
    10491048        if ( $user_obj ) {
    1050             // Unsubscribe link.
    1051             $tokens['unsubscribe'] = esc_url( sprintf(
    1052                 '%s%s/notifications/',
    1053                 bp_core_get_user_domain( $user_obj->ID ),
    1054                 function_exists( 'bp_get_settings_slug' ) ? bp_get_settings_slug() : 'settings'
    1055             ) );
    10561049            $tokens['recipient.username'] = $user_obj->user_login;
    1057         }
     1050            if ( bp_is_active( 'settings' ) && empty( $tokens['unsubscribe'] ) ) {
     1051                $tokens['unsubscribe'] = esc_url( sprintf(
     1052                    '%s%s/notifications/',
     1053                    bp_core_get_user_domain( $user_obj->ID ),
     1054                    bp_get_settings_slug()
     1055                ) );
     1056            }
     1057        }
     1058    }
     1059
     1060    // Set default unsubscribe link if not passed.
     1061    if ( empty( $tokens['unsubscribe'] ) ) {
     1062        $tokens['unsubscribe'] = site_url( 'wp-login.php' );
    10581063    }
    10591064
  • trunk/src/bp-core/bp-core-functions.php

    r10899 r10941  
    33703370 *
    33713371 * @since 2.5.1
    3372  *
    3373  * @return array
    3374  */
    3375 function bp_email_get_type_schema() {
    3376     return array(
    3377         'activity-comment'                   => __( 'A member has replied to an activity update that the recipient posted.', 'buddypress' ),
    3378         'activity-comment-author'            => __( 'A member has replied to a comment on an activity update that the recipient posted.', 'buddypress' ),
    3379         'activity-at-message'                => __( 'Recipient was mentioned in an activity update.', 'buddypress' ),
    3380         'groups-at-message'                  => __( 'Recipient was mentioned in a group activity update.', 'buddypress' ),
    3381         'core-user-registration'             => __( 'Recipient has registered for an account.', 'buddypress' ),
    3382         'core-user-registration-with-blog'   => __( 'Recipient has registered for an account and site.', 'buddypress' ),
    3383         'friends-request'                    => __( 'A member has sent a friend request to the recipient.', 'buddypress' ),
    3384         'friends-request-accepted'           => __( 'Recipient has had a friend request accepted by a member.', 'buddypress' ),
    3385         'groups-details-updated'             => __( "A group's details were updated.", 'buddypress' ),
    3386         'groups-invitation'                  => __( 'A member has sent a group invitation to the recipient.', 'buddypress' ),
    3387         'groups-member-promoted'             => __( "Recipient's status within a group has changed.", 'buddypress' ),
    3388         'groups-membership-request'          => __( 'A member has requested permission to join a group.', 'buddypress' ),
    3389         'messages-unread'                    => __( 'Recipient has received a private message.', 'buddypress' ),
    3390         'settings-verify-email-change'       => __( 'Recipient has changed their email address.', 'buddypress' ),
    3391         'groups-membership-request-accepted' => __( 'Recipient had requested to join a group, which was accepted.', 'buddypress' ),
    3392         'groups-membership-request-rejected' => __( 'Recipient had requested to join a group, which was rejected.', 'buddypress' ),
     3372 * @since 2.7.0 $field argument added.
     3373 *
     3374 * @param string $field Optional; defaults to "description" for backwards compatibility. Other values: "all".
     3375 * @return array {
     3376 *     The array of email types and their schema.
     3377 *
     3378 *     @type string $description The description of the action which causes this to trigger.
     3379 *     @type array  $unsubscribe {
     3380 *         Replacing this with false indicates that a user cannot unsubscribe from this type.
     3381 *
     3382 *         @type string $meta_key The meta_key used to toggle the email setting for this notification.
     3383 *         @type string $message  The message shown when the user has successfully unsubscribed.
     3384 *     }
     3385 */
     3386function bp_email_get_type_schema( $field = 'description' ) {
     3387    $activity_comment = array(
     3388        'description'   => __( 'A member has replied to an activity update that the recipient posted.', 'buddypress' ),
     3389        'unsubscribe'   => array(
     3390            'meta_key'  => 'notification_activity_new_reply',
     3391            'message'   => __( 'You will no longer receive emails when someone replies to an update or comment you posted.', 'buddypress' ),
     3392            ),
    33933393    );
    3394 }
     3394
     3395    $activity_comment_author = array(
     3396        'description'   => __( 'A member has replied to a comment on an activity update that the recipient posted.', 'buddypress' ),
     3397        'unsubscribe'   => array(
     3398            'meta_key'  => 'notification_activity_new_reply',
     3399            'message'   => __( 'You will no longer receive emails when someone replies to an update or comment you posted.', 'buddypress' ),
     3400            ),
     3401    );
     3402
     3403    $activity_at_message = array(
     3404        'description'   => __( 'Recipient was mentioned in an activity update.', 'buddypress' ),
     3405        'unsubscribe'   => array(
     3406            'meta_key'  => 'notification_activity_new_mention',
     3407            'message'   => __( 'You will no longer receive emails when someone mentions you in an update.', 'buddypress' ),
     3408        ),
     3409    );
     3410
     3411    $groups_at_message = array(
     3412        'description'   => __( 'Recipient was mentioned in a group activity update.', 'buddypress' ),
     3413        'unsubscribe'   => array(
     3414            'meta_key'  => 'notification_activity_new_mention',
     3415            'message'   => __( 'You will no longer receive emails when someone mentions you in an update.', 'buddypress' ),
     3416        ),
     3417    );
     3418
     3419    $core_user_registration = array(
     3420        'description'   => __( 'Recipient has registered for an account.', 'buddypress' ),
     3421        'unsubscribe'   => false,
     3422    );
     3423
     3424    $core_user_registration_with_blog = array(
     3425        'description'   => __( 'Recipient has registered for an account and site.', 'buddypress' ),
     3426        'unsubscribe'   => false,
     3427    );
     3428
     3429    $friends_request = array(
     3430        'description'   => __( 'A member has sent a friend request to the recipient.', 'buddypress' ),
     3431        'unsubscribe'   => array(
     3432            'meta_key'  => 'notification_friends_friendship_request',
     3433            'message'   => __( 'You will no longer receive emails when someone sends you a friend request.', 'buddypress' ),
     3434        ),
     3435    );
     3436
     3437    $friends_request_accepted = array(
     3438        'description'   => __( 'Recipient has had a friend request accepted by a member.', 'buddypress' ),
     3439        'unsubscribe'   => array(
     3440            'meta_key'  => 'notification_friends_friendship_accepted',
     3441            'message'   => __( 'You will no longer receive emails when someone accepts your friendship request.', 'buddypress' ),
     3442        ),
     3443    );
     3444
     3445    $groups_details_updated = array(
     3446        'description'   => __( "A group's details were updated.", 'buddypress' ),
     3447        'unsubscribe'   => array(
     3448            'meta_key'  => 'notification_groups_group_updated',
     3449            'message'   => __( 'You will no longer receive emails when one of your groups is updated.', 'buddypress' ),
     3450        ),
     3451    );
     3452
     3453    $groups_details_updated = array(
     3454        'description'   => __( "A group's details were updated.", 'buddypress' ),
     3455        'unsubscribe'   => array(
     3456            'meta_key'  => 'notification_groups_group_updated',
     3457            'message'   => __( 'You will no longer receive emails when one of your groups is updated.', 'buddypress' ),
     3458        ),
     3459    );
     3460
     3461    $groups_invitation = array(
     3462        'description'   => __( 'A member has sent a group invitation to the recipient.', 'buddypress' ),
     3463        'unsubscribe'   => array(
     3464            'meta_key'  => 'notification_groups_invite',
     3465            'message'   => __( 'You will no longer receive emails when you are invited to join a group.', 'buddypress' ),
     3466        ),
     3467    );
     3468
     3469    $groups_member_promoted = array(
     3470        'description'   => __( "Recipient's status within a group has changed.", 'buddypress' ),
     3471        'unsubscribe'   => array(
     3472            'meta_key'  => 'notification_groups_admin_promotion',
     3473            'message'   => __( 'You will no longer receive emails when you have been promoted in a group.', 'buddypress' ),
     3474        ),
     3475    );
     3476
     3477    $groups_member_promoted = array(
     3478        'description'   => __( "Recipient's status within a group has changed.", 'buddypress' ),
     3479        'unsubscribe'   => array(
     3480            'meta_key'  => 'notification_groups_admin_promotion',
     3481            'message'   => __( 'You will no longer receive emails when you have been promoted in a group.', 'buddypress' ),
     3482        ),
     3483    );
     3484
     3485    $groups_membership_request = array(
     3486        'description'   => __( 'A member has requested permission to join a group.', 'buddypress' ),
     3487        'unsubscribe'   => array(
     3488            'meta_key'  => 'notification_groups_membership_request',
     3489            'message'   => __( 'You will no longer receive emails when someone requests to be a member of your group.', 'buddypress' ),
     3490        ),
     3491    );
     3492
     3493    $messages_unread = array(
     3494        'description'   => __( 'Recipient has received a private message.', 'buddypress' ),
     3495        'unsubscribe'   => array(
     3496            'meta_key'  => 'notification_messages_new_message',
     3497            'message'   => __( 'You will no longer receive emails when someone sends you a message.', 'buddypress' ),
     3498        ),
     3499    );
     3500
     3501    $settings_verify_email_change = array(
     3502        'description'   => __( 'Recipient has changed their email address.', 'buddypress' ),
     3503        'unsubscribe'   => false,
     3504    );
     3505
     3506    $groups_membership_request_accepted = array(
     3507        'description'   => __( 'Recipient had requested to join a group, which was accepted.', 'buddypress' ),
     3508        'unsubscribe'   => array(
     3509            'meta_key'  => 'notification_membership_request_completed',
     3510            'message'   => __( 'You will no longer receive emails when your request to join a group has been accepted or denied.', 'buddypress' ),
     3511        ),
     3512    );
     3513
     3514    $groups_membership_request_rejected = array(
     3515        'description'   => __( 'Recipient had requested to join a group, which was rejected.', 'buddypress' ),
     3516        'unsubscribe'   => array(
     3517            'meta_key'  => 'notification_membership_request_completed',
     3518            'message'   => __( 'You will no longer receive emails when your request to join a group has been accepted or denied.', 'buddypress' ),
     3519        ),
     3520    );
     3521
     3522    $types = array(
     3523        'activity-comment'                   => $activity_comment,
     3524        'activity-comment-author'            => $activity_comment_author,
     3525        'activity-at-message'                => $activity_at_message,
     3526        'groups-at-message'                  => $groups_at_message,
     3527        'core-user-registration'             => $core_user_registration,
     3528        'core-user-registration-with-blog'   => $core_user_registration_with_blog,
     3529        'friends-request'                    => $friends_request,
     3530        'friends-request-accepted'           => $friends_request_accepted,
     3531        'groups-details-updated'             => $groups_details_updated,
     3532        'groups-invitation'                  => $groups_invitation,
     3533        'groups-member-promoted'             => $groups_member_promoted,
     3534        'groups-membership-request'          => $groups_membership_request,
     3535        'messages-unread'                    => $messages_unread,
     3536        'settings-verify-email-change'       => $settings_verify_email_change,
     3537        'groups-membership-request-accepted' => $groups_membership_request_accepted,
     3538        'groups-membership-request-rejected' => $groups_membership_request_rejected,
     3539    );
     3540
     3541    if ( $field !== 'all' ) {
     3542        return wp_list_pluck( $types, $field );
     3543    } else {
     3544        return $types;
     3545    }
     3546}
     3547
     3548/**
     3549 * Handles unsubscribing user from notification emails.
     3550 *
     3551 * @since 2.7.0
     3552 */
     3553function bp_email_unsubscribe_handler() {
     3554    $emails         = bp_email_get_type_schema( 'all' );
     3555    $raw_email_type = ! empty( $_GET['nt'] ) ? $_GET['nt'] : '';
     3556    $raw_hash       = ! empty( $_GET['nh'] ) ? $_GET['nh'] : '';
     3557    $raw_user_id    = ! empty( $_GET['uid'] ) ? absint( $_GET['uid'] ) : 0;
     3558    $new_hash       = hash_hmac( 'sha1', "{$raw_email_type}:{$raw_user_id}", bp_email_get_salt() );
     3559
     3560    // Check required values.
     3561    if ( ! $raw_user_id || ! $raw_email_type || ! $raw_hash || ! array_key_exists( $raw_email_type, $emails ) ) {
     3562        $redirect_to = site_url( 'wp-login.php' );
     3563        $result_msg  = __( 'Something has gone wrong.', 'buddypress' );
     3564        $unsub_msg   = __( 'Please log in and go to your settings to unsubscribe from notification emails.', 'buddypress' );
     3565
     3566    // Check valid hash.
     3567    } elseif ( ! hash_equals( $new_hash, $raw_hash ) ) {
     3568        $redirect_to = site_url( 'wp-login.php' );
     3569        $result_msg  = __( 'Something has gone wrong.', 'buddypress' );
     3570        $unsub_msg   = __( 'Please log in and go to your settings to unsubscribe from notification emails.', 'buddypress' );
     3571
     3572    // Don't let authenticated users unsubscribe other users' email notifications.
     3573    } elseif ( is_user_logged_in() && get_current_user_id() !== $raw_user_id ) {
     3574        $result_msg  = __( 'Something has gone wrong.', 'buddypress' );
     3575        $unsub_msg   = __( 'Please go to your notifications settings to unsubscribe from emails.', 'buddypress' );
     3576
     3577        if ( bp_is_active( 'settings' ) ) {
     3578            $redirect_to = sprintf(
     3579                '%s%s/notifications/',
     3580                bp_core_get_user_domain( get_current_user_id() ),
     3581                bp_get_settings_slug()
     3582            );
     3583        } else {
     3584            $redirect_to = bp_core_get_user_domain( get_current_user_id() );
     3585        }
     3586
     3587    } else {
     3588        if ( bp_is_active( 'settings' ) ) {
     3589            $redirect_to = sprintf(
     3590                '%s%s/notifications/',
     3591                bp_core_get_user_domain( $raw_user_id ),
     3592                bp_get_settings_slug()
     3593            );
     3594        } else {
     3595            $redirect_to = bp_core_get_user_domain( $raw_user_id );
     3596        }
     3597
     3598        // Unsubscribe.
     3599        $meta_key = $emails[ $raw_email_type ]['unsubscribe']['meta_key'];
     3600        bp_update_user_meta( $raw_user_id, $meta_key, 'no' );
     3601
     3602        $result_msg = $emails[ $raw_email_type ]['unsubscribe']['message'];
     3603        $unsub_msg  = __( 'You can change this or any other email notification preferences in your email settings.', 'buddypress' );
     3604    }
     3605
     3606    $message = sprintf(
     3607        '%1$s <a href="%2$s">%3$s</a>',
     3608        $result_msg,
     3609        esc_url( $redirect_to ),
     3610        esc_html( $unsub_msg )
     3611    );
     3612
     3613    bp_core_add_message( $message );
     3614    bp_core_redirect( bp_core_get_user_domain( $raw_user_id ) );
     3615
     3616    exit;
     3617}
     3618
     3619/**
     3620 * Creates unsubscribe link for notification emails.
     3621 *
     3622 * @since 2.7.0
     3623 *
     3624 * @param string $redirect_to The URL to which the unsubscribe query string is appended.
     3625 * @param array $args {
     3626 *    Used to build unsubscribe query string.
     3627 *
     3628 *    @type string $notification_type Which notification type is being sent.
     3629 *    @type string $user_id           The ID of the user to whom the notification is sent.
     3630 *    @type string $redirect_to       Optional. The url to which the user will be redirected. Default is the activity directory.
     3631 * }
     3632 * @return string The unsubscribe link.
     3633 */
     3634function bp_email_get_unsubscribe_link( $args ) {
     3635    $emails = bp_email_get_type_schema( 'all' );
     3636
     3637    if ( empty( $args['notification_type'] ) || ! array_key_exists( $args['notification_type'], $emails ) ) {
     3638        return site_url( 'wp-login.php' );
     3639    }
     3640
     3641    $email_type  = $args['notification_type'];
     3642    $redirect_to = ! empty( $args['redirect_to'] ) ? $args['redirect_to'] : site_url();
     3643    $user_id     = (int) $args['user_id'];
     3644
     3645    // Bail out if the activity type is not un-unsubscribable.
     3646    if ( empty( $emails[ $email_type ]['unsubscribe'] ) ) {
     3647        return '';
     3648    }
     3649
     3650    $link = add_query_arg(
     3651        array(
     3652            'action' => 'unsubscribe',
     3653            'nh'     => hash_hmac( 'sha1', "{$email_type}:{$user_id}", bp_email_get_salt() ),
     3654            'nt'     => $args['notification_type'],
     3655            'uid'    => $user_id,
     3656        ),
     3657        $redirect_to
     3658    );
     3659
     3660    /**
     3661     * Filters the unsubscribe link.
     3662     *
     3663     * @since 2.7.0
     3664     */
     3665    return apply_filters( 'bp_email_get_link', $link, $redirect_to, $args );
     3666}
     3667
     3668/**
     3669 * Get a persistent salt for email unsubscribe links.
     3670 *
     3671 * @since 2.7.0
     3672 *
     3673 * @return string|null Returns null if value isn't set, otherwise string.
     3674 */
     3675function bp_email_get_salt() {
     3676    return bp_get_option( 'bp-emails-unsubscribe-salt', null );
     3677}
  • trunk/src/bp-core/bp-core-options.php

    r10899 r10941  
    7373        // The ID for the current theme package.
    7474        '_bp_theme_package_id'                 => 'legacy',
     75
     76        // Email unsubscribe salt.
     77        'bp-emails-unsubscribe-salt'           => base64_encode( wp_generate_password( 64, true, true ) ),
    7578
    7679        /* Groups ************************************************************/
  • trunk/src/bp-core/bp-core-update.php

    r10902 r10941  
    264264            bp_update_to_2_5();
    265265        }
     266
     267        // Version 2.7.0.
     268        if ( $raw_db_version < 10940 ) {
     269            bp_update_to_2_7();
     270        }
    266271    }
    267272
     
    498503function bp_update_to_2_5() {
    499504    bp_core_install_emails();
     505}
     506
     507/**
     508 * 2.7.0 update routine.
     509 *
     510 * - Add email unsubscribe salt.
     511 *
     512 * @since 2.7.0
     513 */
     514function bp_update_to_2_7() {
     515    bp_add_option( 'bp-emails-unsubscribe-salt', base64_encode( wp_generate_password( 64, true, true ) ) );
    500516}
    501517
  • trunk/src/bp-friends/bp-friends-notifications.php

    r10587 r10941  
    3232        return;
    3333    }
     34
     35    $unsubscribe_args = array(
     36        'user_id'           => $friend_id,
     37        'notification_type' => 'friends-request',
     38    );
    3439
    3540    $args = array(
     
    4146            'initiator.url'       => esc_url( bp_core_get_user_domain( $initiator_id ) ),
    4247            'initiator.name'      => bp_core_get_user_displayname( $initiator_id ),
     48            'unsubscribe'         => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    4349        ),
    4450    );
     
    6369        return;
    6470    }
     71
     72    $unsubscribe_args = array(
     73        'user_id'           => $initiator_id,
     74        'notification_type' => 'friends-request-accepted',
     75    );
    6576
    6677    $args = array(
     
    7182            'friendship.id'  => $friendship_id,
    7283            'initiator.id'   => $initiator_id,
     84            'unsubscribe'      => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    7385        ),
    7486    );
  • trunk/src/bp-groups/bp-groups-notifications.php

    r10606 r10941  
    6969        }
    7070
     71        $unsubscribe_args = array(
     72            'user_id'           => $user_id,
     73            'notification_type' => 'groups-details-updated',
     74        );
     75
    7176        $args = array(
    7277            'tokens' => array(
     
    7681                'group.url'    => esc_url( bp_get_group_permalink( $group ) ),
    7782                'group.name'   => $group->name,
     83                'unsubscribe'  => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    7884            ),
    7985        );
     
    116122            'secondary_item_id' => $requesting_user_id,
    117123            'component_name'    => buddypress()->groups->id,
    118             'component_action'  => 'new_membership_request'
     124            'component_action'  => 'new_membership_request',
    119125        ) );
    120126    }
     
    124130        return;
    125131    }
     132
     133    $unsubscribe_args = array(
     134        'user_id'           => $admin_id,
     135        'notification_type' => 'groups-membership-request',
     136    );
    126137
    127138    $group = groups_get_group( array( 'group_id' => $group_id ) );
     
    137148            'requesting-user.id'   => $requesting_user_id,
    138149            'requesting-user.name' => bp_core_get_user_displayname( $requesting_user_id ),
     150            'unsubscribe'          => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    139151        ),
    140152    );
     
    185197
    186198    if ( ! empty( $accepted ) ) {
     199
     200        $unsubscribe_args = array(
     201            'user_id'           => $requesting_user_id,
     202            'notification_type' => 'groups-membership-request-accepted',
     203        );
     204
     205        $args['tokens']['unsubscribe'] = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     206
    187207        bp_send_email( 'groups-membership-request-accepted', (int) $requesting_user_id, $args );
     208
    188209    } else {
     210
     211        $unsubscribe_args = array(
     212            'user_id'           => $requesting_user_id,
     213            'notification_type' => 'groups-membership-request-rejected',
     214        );
     215
     216        $args['tokens']['unsubscribe'] = esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) );
     217
    189218        bp_send_email( 'groups-membership-request-rejected', (int) $requesting_user_id, $args );
    190219    }
     
    226255        return;
    227256    }
     257
     258    $unsubscribe_args = array(
     259        'user_id'           => $user_id,
     260        'notification_type' => 'groups-member-promoted',
     261    );
    228262
    229263    $group = groups_get_group( array( 'group_id' => $group_id ) );
     
    236270            'promoted_to' => $promoted_to,
    237271            'user.id'     => $user_id,
     272            'unsubscribe' => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    238273        ),
    239274    );
     
    278313
    279314    $invited_link = bp_core_get_user_domain( $invited_user_id ) . bp_get_groups_slug();
     315
     316    $unsubscribe_args = array(
     317        'user_id'           => $invited_user_id,
     318        'notification_type' => 'groups-invitation',
     319    );
     320
    280321    $args         = array(
    281322        'tokens' => array(
     
    287328            'inviter.id'   => $inviter_user_id,
    288329            'invites.url'  => esc_url( $invited_link . '/invites/' ),
     330            'unsubscribe'  => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    289331        ),
    290332    );
  • trunk/src/bp-messages/bp-messages-notifications.php

    r10706 r10941  
    5959        }
    6060
     61        $unsubscribe_args = array(
     62            'user_id'           => $recipient->user_id,
     63            'notification_type' => 'messages-unread',
     64        );
     65
    6166        $args = array(
    6267            'tokens' => array(
     
    6570                'sender.name' => $sender_name,
    6671                'usersubject' => sanitize_text_field( stripslashes( $subject ) ),
     72                'unsubscribe' => esc_url( bp_email_get_unsubscribe_link( $unsubscribe_args ) ),
    6773            ),
    6874        );
  • trunk/tests/phpunit/testcases/admin/functions.php

    r10647 r10941  
    253253        ) );
    254254
    255         $correct_descriptions = bp_email_get_type_schema();
     255        $correct_descriptions = bp_email_get_type_schema( 'description' );
    256256        foreach ( $d_terms as $d_term ) {
    257257            $correct_description = $correct_descriptions[ $d_term->slug ];
Note: See TracChangeset for help on using the changeset viewer.