| 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> |