Skip to:
Content

BuddyPress.org

Ticket #7819: 7819.diff

File 7819.diff, 6.3 KB (added by boonebgorges, 6 years ago)
  • src/bp-messages/bp-messages-filters.php

    diff --git src/bp-messages/bp-messages-filters.php src/bp-messages/bp-messages-filters.php
    index 05ca3eee3..bc501df7b 100644
    add_filter( 'bp_get_the_thread_message_content', 'stripslashes_deep' ); 
    7979add_filter( 'bp_get_the_thread_subject',              'stripslashes_deep'    );
    8080add_filter( 'bp_get_message_thread_content',          'stripslashes_deep', 1 );
    8181
     82// Personal data export.
     83add_filter( 'wp_privacy_personal_data_exporters', 'bp_messages_register_personal_data_exporter' );
     84
    8285/**
    8386 * Enforce limitations on viewing private message contents
    8487 *
    function bp_messages_filter_kses( $content ) { 
    126129        $messages_allowedtags = apply_filters( 'bp_messages_allowed_tags', $messages_allowedtags );
    127130        return wp_kses( $content, $messages_allowedtags );
    128131}
     132
     133/**
     134 * Register Messages personal data exporter.
     135 *
     136 * @since 4.0.0
     137 *
     138 * @param array $exporters  An array of personal data exporters.
     139 * @return array An array of personal data exporters.
     140 */
     141function bp_messages_register_personal_data_exporter( $exporters ) {
     142        $exporters['buddypress-messages'] = array(
     143                'exporter_friendly_name' => __( 'BuddyPress Messages', 'buddypress' ),
     144                'callback'               => 'bp_messages_personal_data_exporter',
     145        );
     146
     147        return $exporters;
     148}
  • src/bp-messages/bp-messages-functions.php

    diff --git src/bp-messages/bp-messages-functions.php src/bp-messages/bp-messages-functions.php
    index 6699597b4..c0ff5e2b9 100644
    function messages_notification_new_message( $raw_args = array() ) { 
    624624        do_action( 'bp_messages_sent_notification_email', $recipients, '', '', $args );
    625625}
    626626add_action( 'messages_message_sent', 'messages_notification_new_message', 10 );
     627
     628/**
     629 * Finds and exports personal data associated with an email address from the Messages tables.
     630 *
     631 * @since 4.0.0
     632 *
     633 * @param string $email_address  The user's email address.
     634 * @param int    $page           Batch number.
     635 * @return array An array of personal data.
     636 */
     637function bp_messages_personal_data_exporter( $email_address, $page ) {
     638        $number = 10;
     639
     640        $email_address = trim( $email_address );
     641
     642        $data_to_export = array();
     643
     644        $user = get_user_by( 'email', $email_address );
     645
     646        if ( ! $user ) {
     647                return array(
     648                        'data' => array(),
     649                        'done' => true,
     650                );
     651        }
     652
     653        $user_data_to_export = array();
     654
     655        $user_threads = BP_Messages_Thread::get_current_threads_for_user( array(
     656                'user_id' => $user->ID,
     657                'box'     => 'sentbox',
     658                'type'    => null,
     659                'limit'   => $number,
     660                'page'    => $page,
     661        ) );
     662
     663        foreach ( $user_threads['threads'] as $thread ) {
     664                $recipient_links = array();
     665                foreach ( $thread->recipients as $recipient ) {
     666                        if ( $recipient->user_id === $user->ID ) {
     667                                continue;
     668                        }
     669
     670                        $recipient_links[] = bp_core_get_userlink( $recipient->user_id );
     671                }
     672                $recipients = implode( ', ', $recipient_links );
     673
     674                $thread_link = bp_get_message_thread_view_link( $thread->thread_id, $user->ID );
     675
     676                foreach ( $thread->messages as $message_index => $message ) {
     677                        // Only include messages written by the user.
     678                        if ( $recipient->user_id !== $message->sender_id ) {
     679                                continue;
     680                        }
     681
     682                        $message_data = array(
     683                                array(
     684                                        'name'  => __( 'Message Subject', 'buddypress' ),
     685                                        'value' => $message->subject,
     686                                ),
     687                                array(
     688                                        'name'  => __( 'Message Content', 'buddypress' ),
     689                                        'value' => $message->message,
     690                                ),
     691                                array(
     692                                        'name'  => __( 'Date Sent', 'buddypress' ),
     693                                        'value' => $message->date_sent,
     694                                ),
     695                                array(
     696                                        'name' => __( 'Recipients', 'buddypress' ),
     697                                        'value' => $recipients,
     698                                ),
     699                                array(
     700                                        'name'  => __( 'Thread URL', 'buddypress' ),
     701                                        'value' => $thread_link,
     702                                ),
     703                        );
     704
     705                        $data_to_export[] = array(
     706                                'group_id'    => 'bp_messages',
     707                                'group_label' => __( 'Private Messages', 'buddypress' ),
     708                                'item_id'     => "bp-messages-{$message->id}",
     709                                'data'        => $message_data,
     710                        );
     711                }
     712        }
     713
     714        return array(
     715                'data' => $data_to_export,
     716                'done' => true,
     717        );
     718}
  • tests/phpunit/testcases/messages/functions.php

    diff --git tests/phpunit/testcases/messages/functions.php tests/phpunit/testcases/messages/functions.php
    index 108b444ab..4af19fcb3 100644
    class BP_Tests_Messages_Functions extends BP_UnitTestCase { 
    8989        public function remove_recipients_before_save( $message ) {
    9090                $message->recipients = array();
    9191        }
     92
     93        /**
     94         * @ticket BP7819
     95         * @ticket BP7698
     96         */
     97        public function test_bp_messages_personal_data_exporter() {
     98                $u1 = self::factory()->user->create();
     99                $u2 = self::factory()->user->create();
     100
     101                $time = time();
     102
     103                $t1 = messages_new_message( array(
     104                        'sender_id'  => $u1,
     105                        'recipients' => array( $u2 ),
     106                        'subject'    => 'A new message',
     107                        'content'    => 'Hey there!',
     108                        'date_sent'  => date( 'Y-m-d H:i:s', $time - ( 3 * HOUR_IN_SECONDS ) ),
     109                ) );
     110
     111                $t1m1 = messages_new_message( array(
     112                        'sender_id'  => $u2,
     113                        'thread_id'  => $t1,
     114                        'recipients' => array( $u1 ),
     115                        'subject'    => 'Reply to ' . $t1,
     116                        'content'    => 'Hey there!',
     117                        'date_sent'  => date( 'Y-m-d H:i:s', $time - ( 2 * HOUR_IN_SECONDS ) ),
     118                ) );
     119
     120                $t1m2 = messages_new_message( array(
     121                        'sender_id'  => $u1,
     122                        'thread_id'  => $t1,
     123                        'recipients' => array( $u2 ),
     124                        'subject'    => 'Reply to ' . $t1,
     125                        'content'    => 'Hey there!',
     126                        'date_sent'  => date( 'Y-m-d H:i:s', $time - ( 2 * HOUR_IN_SECONDS ) ),
     127                ) );
     128
     129                $t2 = messages_new_message( array(
     130                        'sender_id'  => $u2,
     131                        'recipients' => array( $u1 ),
     132                        'subject'    => 'A new message',
     133                        'content'    => 'Hey there!',
     134                        'date_sent'  => date( 'Y-m-d H:i:s', $time - ( 5 * HOUR_IN_SECONDS ) ),
     135                ) );
     136
     137                $t2m1 = messages_new_message( array(
     138                        'sender_id'  => $u1,
     139                        'thread_id'  => $t2,
     140                        'recipients' => array( $u2 ),
     141                        'subject'    => 'Reply to ' . $t2,
     142                        'content'    => 'Hey there!',
     143                        'date_sent'  => date( 'Y-m-d H:i:s', $time - ( 4 * HOUR_IN_SECONDS ) ),
     144                ) );
     145
     146                $test_user = new WP_User( $u1 );
     147
     148                $actual = bp_messages_personal_data_exporter( $test_user->user_email, 1 );
     149
     150                $this->assertTrue( $actual['done'] );
     151
     152                // Number of exported messages.
     153                $this->assertSame( 3, count( $actual['data'] ) );
     154        }
    92155}