| | 16 | // Collect all the export verification requests from the options and usermeta |
| | 17 | |
| | 18 | function _wp_privacy_get_all_personal_data_export_requests() { |
| | 19 | global $wpdb; |
| | 20 | |
| | 21 | $requests = array(); |
| | 22 | |
| | 23 | $registered_user_export_requests = $wpdb->get_results( |
| | 24 | "SELECT * FROM $wpdb->usermeta WHERE meta_key LIKE '_account_action_%'", |
| | 25 | ARRAY_A |
| | 26 | ); |
| | 27 | |
| | 28 | foreach ( (array) $registered_user_export_requests as $export_request ) { |
| | 29 | error_log( print_r( $export_request, true ) ); |
| | 30 | |
| | 31 | $user = get_user_by( 'id', $export_request['user_id'] ); |
| | 32 | // TODO handle user not found |
| | 33 | |
| | 34 | $email = $user->user_email; |
| | 35 | $username = $user->user_login; |
| | 36 | $details = explode( ':', $export_request['meta_value'] ); |
| | 37 | // TODO handle malformed details |
| | 38 | |
| | 39 | $requests[] = array( |
| | 40 | 'email' => $email, |
| | 41 | 'requested' => $details[0], |
| | 42 | 'verified' => '' |
| | 43 | ); |
| | 44 | } |
| | 45 | |
| | 46 | $email_only_export_requests = $wpdb->get_results( |
| | 47 | "SELECT * FROM $wpdb->options WHERE option_name LIKE '_account_action_%'", |
| | 48 | ARRAY_A |
| | 49 | ); |
| | 50 | |
| | 51 | foreach ( (array) $email_only_export_requests as $export_request ) { |
| | 52 | $details = explode( ':', $export_request['option_value'] ); |
| | 53 | // TODO handle malformed details |
| | 54 | |
| | 55 | $requests[] = array( |
| | 56 | 'email' => $details[2], |
| | 57 | 'requested' => $details[0], |
| | 58 | 'verified' => '' |
| | 59 | ); |
| | 60 | } |
| | 61 | |
| | 62 | return $requests; |
| | 63 | } |
| | 64 | |
| | 65 | global $export_requests; |
| | 66 | $export_requests = _wp_privacy_get_all_personal_data_export_requests(); |
| | 67 | |
| | 68 | if ( ! class_exists( 'WP_List_Table' ) ) { |
| | 69 | require_once( ABSPATH . 'wp-admin/includes/class-wp-list-table.php' ); |
| | 70 | } |
| | 71 | |
| | 72 | // Build export request list table class here for now so we don't have to create new files |
| | 73 | |
| | 74 | class WP_Personal_Data_Export_Requests_Table extends WP_List_Table { |
| | 75 | function get_columns() { |
| | 76 | $columns = array( |
| | 77 | 'email' => __( 'Email' ), |
| | 78 | 'requested' => __( 'Requested' ), |
| | 79 | 'verified' => __( 'Verified' ), |
| | 80 | 'actions' => __( 'Export File Actions' ), |
| | 81 | ); |
| | 82 | |
| | 83 | return $columns; |
| | 84 | } |
| | 85 | |
| | 86 | function prepare_items() { |
| | 87 | global $export_requests; |
| | 88 | |
| | 89 | $columns = $this->get_columns(); |
| | 90 | $hidden = array(); |
| | 91 | $sortable = array(); |
| | 92 | $this->_column_headers = array( $columns, $hidden, $sortable ); |
| | 93 | $this->items = $export_requests; |
| | 94 | } |
| | 95 | |
| | 96 | function column_default( $item, $column_name ) { |
| | 97 | $cell_value = $item[ $column_name ]; |
| | 98 | |
| | 99 | if ( in_array( $column_name, array( 'requested', 'verified' ) ) ) { |
| | 100 | if ( empty( $cell_value ) ) { |
| | 101 | return '-'; |
| | 102 | } |
| | 103 | |
| | 104 | $time_diff = current_time( 'timestamp', true ) - $cell_value; |
| | 105 | if ( $time_diff > 0 && $time_diff < DAY_IN_SECONDS ) { |
| | 106 | return sprintf( __( '%s ago' ), human_time_diff( $cell_value ) ); |
| | 107 | } |
| | 108 | |
| | 109 | return |
| | 110 | date( get_option( 'date_format' ), $cell_value ) . |
| | 111 | '<br>' . |
| | 112 | date( get_option( 'time_format' ), $cell_value ); |
| | 113 | } |
| | 114 | |
| | 115 | if ( 'actions' === $column_name ) { |
| | 116 | return '<a href="#">Download</a> | <a href="#">Send via Email</a>'; |
| | 117 | } |
| | 118 | |
| | 119 | return $cell_value; |
| | 120 | } |
| | 121 | |
| | 122 | function column_email( $item ) { |
| | 123 | // TODO links, nonces |
| | 124 | |
| | 125 | $actions = array( |
| | 126 | 'resend' => __( '<a href="#">Re-send verification email</a>' ), |
| | 127 | 'delete' => __( '<a href="#">Delete</a>' ), |
| | 128 | ); |
| | 129 | |
| | 130 | return sprintf( '%1$s %2$s', $item['email'], $this->row_actions( $actions ) ); |
| | 131 | } |
| | 132 | } |
| | 133 | |
| | 134 | $personal_data_export_requests_table = new WP_Personal_Data_Export_Requests_Table(); |
| | 135 | |
| | 182 | } elseif ( 'add-export-request' === $action ) { |
| | 183 | $username_or_email_address = isset( $_POST['username_or_email_to_export'] ) ? $_POST['username_or_email_to_export'] : ''; |
| | 184 | $username_or_email_address = sanitize_text_field( $username_or_email_address ); |
| | 185 | |
| | 186 | if ( ! is_email( $username_or_email_address ) ) { |
| | 187 | $user = get_user_by( 'login', $username_or_email_address ); |
| | 188 | if ( ! $user instanceof WP_User ) { |
| | 189 | add_settings_error( |
| | 190 | 'username_or_email_to_export', |
| | 191 | 'username_or_email_to_export', |
| | 192 | __( 'Unable to add export request. A valid email address or username must be supplied.' ), |
| | 193 | 'error' |
| | 194 | ); |
| | 195 | } else { |
| | 196 | $doing_personal_data_export_for_email = $user->user_email; |
| | 197 | } |
| | 198 | } else { |
| | 199 | $doing_personal_data_export_for_email = $username_or_email_address; |
| | 200 | } |
| | 201 | |
| | 202 | if ( ! empty( $doing_personal_data_export_for_email ) ) { |
| | 203 | $result = send_confirm_account_action_email( 'export_personal_data', __( 'Export personal data' ), $doing_personal_data_export_for_email ); |
| | 204 | if ( is_wp_error( $result ) || ! $result ) { |
| | 205 | add_settings_error( |
| | 206 | 'username_or_email_to_export', |
| | 207 | 'username_or_email_to_export', |
| | 208 | __( 'Unable to initiate export verification request.' ), |
| | 209 | 'error' |
| | 210 | ); |
| | 211 | } else { |
| | 212 | add_settings_error( |
| | 213 | 'username_or_email_to_export', |
| | 214 | 'username_or_email_to_export', |
| | 215 | __( 'Export verification request initiated successfully.' ), |
| | 216 | 'updated' |
| | 217 | ); |
| | 218 | |
| | 219 | // Re-fetch the requests since we just added one |
| | 220 | global $export_requests; |
| | 221 | $export_requests =_wp_privacy_get_all_personal_data_export_requests(); |
| | 222 | } |
| | 223 | } |
| | 362 | |
| | 363 | <h2><?php _e( 'Personal Data Export Requests' ); ?></h2> |
| | 364 | <?php |
| | 365 | $personal_data_export_requests_table->prepare_items(); |
| | 366 | $personal_data_export_requests_table->display(); |
| | 367 | ?> |
| | 368 | <h3><?php _e( 'Add New Request' ); ?></h3> |
| | 369 | <form method="post" action=""> |
| | 370 | <input type="hidden" name="action" value="add-export-request" /> |
| | 371 | <?php wp_nonce_field( 'add-export-request' ); ?> |
| | 372 | <fieldset> |
| | 373 | <legend class="screen-reader-text"><span><?php _e( 'Enter the username or email address of the user whose personal data you wish to export.' ); ?></span></legend> |
| | 374 | <label for="username_or_email_to_export"> |
| | 375 | <input type="text" class="regular-text" name="username_or_email_to_export" /> |
| | 376 | </label> |
| | 377 | <p class="description"><?php _e( 'A verification email will be sent to the user at this email address, asking them to verify the request.' ); ?></p> |
| | 378 | </fieldset> |
| | 379 | <?php submit_button( __( 'Add New Request' ) ); ?> |
| | 380 | </form> |