array( 'heading' => __( 'What personal data we collect and why we collect it' ), 'subheadings' => array( 'comments' => __( 'Comments' ), 'media' => __( 'Media' ), 'contact_forms' => __( 'Contact Forms' ), 'cookies' => __( 'Cookies' ), 'embeds' => __( 'Embedded content from other websites' ), 'analytics' => __( 'Analytics' ), 'security_logs' => __( 'Security Logs' ), ), ), 'sharing' => __( 'Who we share your data with' ), 'retention' => __( 'How long we retain your data' ), 'rights' => __( 'What rights you have over your data' ), 'sending' => __( 'Where we send your data' ), 'additional' => __( 'Additional information' ), 'protection' => __( 'How we protect your data' ), 'breach_procedures' => __( 'What data breach procedures we have in place' ), 'third_parties' => __( 'What third parties we receive data from' ), 'profiling' => __( 'What automated decision making and/or profiling we do with user data' ), ); $sections = apply_filters( 'itsec_get_privacy_policy_sections', $sections ); $policy = ''; foreach ( $sections as $section => $details ) { $section_text = apply_filters( "itsec_get_privacy_policy_for_$section", '' ); if ( is_string( $details ) ) { $section_heading = $details; } else { $section_heading = $details['heading']; foreach ( $details['subheadings'] as $id => $heading ) { $text = apply_filters( "itsec_get_privacy_policy_for_$id", '' ); if ( ! empty( $text ) ) { $section_text .= "

$heading

\n$text\n"; } } } if ( ! empty( $section_text ) ) { $policy .= "

$section_heading

\n$section_text\n"; } } if ( ! empty( $policy ) ) { $policy = "
\n$policy\n
\n"; } return $policy; } public static function export( $email, $page ) { global $wpdb; $limit = 500; $offset = ( $page - 1 ) * $limit; $user = get_user_by( 'email', $email ); $user_id = false === $user ? false : $user->ID; $escaped_email = '%%' . $wpdb->esc_like( $email ) . '%%'; if ( false === $user ) { $query = "SELECT id, module, code, type, timestamp, user_id, url FROM {$wpdb->base_prefix}itsec_logs WHERE data LIKE %s OR url LIKE %s LIMIT $offset,$limit"; $query = $wpdb->prepare( $query, $escaped_email, $escaped_email ); } else { $query = "SELECT id, module, code, type, timestamp, user_id, url FROM {$wpdb->base_prefix}itsec_logs WHERE data LIKE %s OR url LIKE %s OR user_id=%d LIMIT $offset,$limit"; $query = $wpdb->prepare( $query, $escaped_email, $escaped_email, $user_id ); } $logs = $wpdb->get_results( $query, ARRAY_A ); $export_items = array(); foreach ( (array) $logs as $log ) { $group_id = 'security-logs'; $group_label = __( 'Security Logs', 'better-wp-security' ); $item_id = "security-log-{$log['id']}"; $data = self::get_data_from_log_entry( $log, $email, $user_id ); $export_items[] = compact( 'group_id', 'group_label', 'item_id', 'data' ); } $done = count( $logs ) < $limit; return array( 'data' => $export_items, 'done' => $done, ); } public static function erase( $email, $page ) { global $wpdb; $limit = 500; $offset = ( $page - 1 ) * $limit; $user = get_user_by( 'email', $email ); $user_id = false === $user ? false : $user->ID; $escaped_email = '%%' . $wpdb->esc_like( $email ) . '%%'; if ( false === $user ) { $query = "SELECT COUNT(id) AS count FROM {$wpdb->base_prefix}itsec_logs WHERE data LIKE %s OR url LIKE %s LIMIT $offset,$limit"; $query = $wpdb->prepare( $query, $escaped_email, $escaped_email ); } else { $query = "SELECT COUNT(id) AS count FROM {$wpdb->base_prefix}itsec_logs WHERE data LIKE %s OR url LIKE %s OR user_id=%d LIMIT $offset,$limit"; $query = $wpdb->prepare( $query, $escaped_email, $escaped_email, $user_id ); } $count = (int) $wpdb->get_var( $query ); $done = $count < $limit; return array( 'items_removed' => false, 'items_retained' => true, 'messages' => array( __( 'The security logs are retained since they may be required as part of analysis of a site compromise.', 'better-wp-security' ), ), 'done' => $done, ); } private static function get_data_from_log_entry( $log, $email, $user_id ) { $data = array( array( 'name' => __( 'Timestamp', 'better-wp-security' ), 'value' => $log['timestamp'], ), ); if ( false === strpos( $log['code'], '::' ) ) { $code = $log['code']; } else { list( $code, $junk ) = explode( '::', $log['code'], 2 ); } if ( 'lockout' === $log['module'] ) { $event = __( 'Failed login', 'better-wp-security' ); } else if ( 'four_oh_four' === $log['module'] ) { $event = __( 'Requested suspicious URL', 'better-wp-security' ); } else if ( 'ipcheck' === $log['module'] ) { $event = __( 'Failed check by network brute force protection', 'better-wp-security' ); } else if ( 'brute_force' === $log['module'] ) { if ( 'auto-ban-admin-username' === $code ) { $event = __( 'Attempted to log in as admin', 'better-wp-security' ); } else { $event = __( 'Failed login', 'better-wp-security' ); } } else if ( 'away_mode' === $log['module'] ) { $event = __( 'Access while site in away mode', 'better-wp-security' ); } else if ( 'recaptcha' === $log['module'] ) { $event = __( 'Failed reCAPTCHA validation', 'better-wp-security' ); } else if ( 'two_factor' === $log['module'] ) { if ( 'failed_authentication' === $code ) { $event = __( 'Failed two-factor authentication validation', 'better-wp-security' ); } else if ( 'successful_authentication' === $code ) { $event = __( 'Two-factor authentication validated successfully', 'better-wp-security' ); } else if ( 'sync_override' === $code ) { $event = __( 'Overrode two-factor authentication using iThemes Sync', 'better-wp-security' ); } } else if ( 'user_logging' === $log['module'] ) { if ( 'post-status-changed' === $code ) { $event = __( 'Changed content', 'better-wp-security' ); } else if ( 'user-logged-in' === $code ) { $event = __( 'Logged in', 'better-wp-security' ); } else if ( 'user-logged-out' === $code ) { $event = __( 'Logged out', 'better-wp-security' ); } } if ( empty( $event ) ) { $event = __( 'Unknown event or action', 'better-wp-security' ); } $data[] = array( 'name' => __( 'Event', 'better-wp-security' ), 'value' => $event, ); return $data; } }