GDPR - Version 2.0.7

Version Description

  • Changing some texts to be consistent.
  • Cleaned up code with VIP Code Standard.
  • Improved security.
  • Fix internet explorer bug.
  • Fix JS function with wrong variable name when an AJAX error happened.
  • Fix Warning on woocommerce consent checkboxes.
  • Renaming buttons and translating placeholders.
  • Added another parameter to the request forms function and shortcode to allow users to customize the button text.
  • Fix a bug in the privacy preferences center when you moved to a different page without accepting cookies it would uncheck fields that should continue being checked.
  • Fix settings tooltips z-index to sit on top of other elements.
Download this release

Release Info

Developer fclaussen
Plugin Icon 128x128 GDPR
Version 2.0.7
Comparing to
See all releases

Code changes from version 2.0.6 to 2.0.7

Files changed (41) hide show
  1. README.txt +13 -1
  2. admin/class-gdpr-admin.php +194 -170
  3. admin/class-gdpr-requests-admin.php +75 -68
  4. admin/class-gdpr-telemetry.php +72 -69
  5. admin/partials/requests.php +93 -83
  6. admin/partials/settings.php +88 -85
  7. admin/partials/templates/tmpl-consents.php +2 -2
  8. admin/partials/templates/tmpl-cookies.php +18 -18
  9. admin/partials/templates/tmpl-tools.php +6 -6
  10. admin/partials/tools.php +20 -22
  11. assets/css/gdpr-admin.css +1 -1
  12. assets/css/gdpr-public.css +1 -1
  13. assets/js/gdpr-public.js +1 -1
  14. gdpr.php +2 -2
  15. includes/class-gdpr-activator.php +28 -26
  16. includes/class-gdpr-audit-log.php +22 -22
  17. includes/class-gdpr-deactivator.php +1 -1
  18. includes/class-gdpr-email.php +50 -42
  19. includes/class-gdpr-help.php +93 -67
  20. includes/class-gdpr-requests.php +68 -39
  21. includes/class-gdpr.php +62 -58
  22. includes/helper-functions.php +32 -24
  23. languages/gdpr.pot +256 -264
  24. public/class-gdpr-public.php +81 -65
  25. public/class-gdpr-requests-public.php +127 -79
  26. public/partials/complaint-form.php +4 -4
  27. public/partials/confirmation-screens.php +10 -13
  28. public/partials/delete-form.php +3 -3
  29. public/partials/export-data-form.php +3 -3
  30. public/partials/privacy-bar.php +1 -1
  31. public/partials/privacy-preferences-modal.php +18 -16
  32. public/partials/reconsent-bar.php +2 -2
  33. public/partials/rectify-form.php +4 -4
  34. templates/email/complaint-request.php +8 -8
  35. templates/email/data-breach-notification.php +5 -6
  36. templates/email/data-breach-request.php +6 -7
  37. templates/email/delete-request.php +6 -6
  38. templates/email/delete-resolved.php +2 -2
  39. templates/email/export-data-request.php +8 -8
  40. templates/email/new-request.php +3 -3
  41. templates/email/rectify-request.php +8 -8
README.txt CHANGED
@@ -5,7 +5,7 @@ Tags: gdpr, compliance, privacy, law, general data protection regulation
5
  Requires at least: 4.7
6
  Requires PHP: 5.6
7
  Tested up to: 4.9
8
- Stable tag: 2.0.6
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
@@ -206,6 +206,18 @@ Activating this plugin does not guarantee that an organisation is successfully m
206
 
207
  == Changelog ==
208
 
 
 
 
 
 
 
 
 
 
 
 
 
209
  = 2.0.6 =
210
  * Fix XML export error.
211
 
5
  Requires at least: 4.7
6
  Requires PHP: 5.6
7
  Tested up to: 4.9
8
+ Stable tag: 2.0.7
9
  License: GPLv2 or later
10
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
11
 
206
 
207
  == Changelog ==
208
 
209
+ = 2.0.7 =
210
+ * Changing some texts to be consistent.
211
+ * Cleaned up code with VIP Code Standard.
212
+ * Improved security.
213
+ * Fix internet explorer bug.
214
+ * Fix JS function with wrong variable name when an AJAX error happened.
215
+ * Fix Warning on woocommerce consent checkboxes.
216
+ * Renaming buttons and translating placeholders.
217
+ * Added another parameter to the request forms function and shortcode to allow users to customize the button text.
218
+ * Fix a bug in the privacy preferences center when you moved to a different page without accepting cookies it would uncheck fields that should continue being checked.
219
+ * Fix settings tooltips z-index to sit on top of other elements.
220
+
221
  = 2.0.6 =
222
  * Fix XML export error.
223
 
admin/class-gdpr-admin.php CHANGED
@@ -62,8 +62,8 @@ class GDPR_Admin {
62
  $this->version = $version;
63
  $this->allowed_html = array(
64
  'a' => array(
65
- 'href' => true,
66
- 'title' => true,
67
  'target' => true,
68
  ),
69
  );
@@ -103,14 +103,16 @@ class GDPR_Admin {
103
  $function = array( $this, 'requests_page_template' );
104
  $icon_url = 'dashicons-id';
105
 
106
- $requests = get_option( 'gdpr_requests', array() );
107
- $confirmed_requests = array_filter( $requests, function( $item ) {
108
- return $item['confirmed'] == true;
109
- } );
 
 
110
 
111
- $menu_title = esc_html__( 'GDPR', 'gdpr' );
112
  if ( count( $confirmed_requests ) ) {
113
- $menu_title = sprintf( esc_html( 'GDPR %s' ), '<span class="awaiting-mod">' . count( $confirmed_requests ) . '</span>' );
114
  }
115
 
116
  add_menu_page( $page_title, $menu_title, $capability, $parent_slug, $function, $icon_url );
@@ -133,21 +135,19 @@ class GDPR_Admin {
133
 
134
  $settings_hook = add_submenu_page( $parent_slug, $menu_title, $menu_title, $capability, $menu_slug, $function );
135
 
 
136
 
137
- $menu_slug = 'edit.php?post_type=telemetry';
138
-
139
- $cpt = 'telemetry';
140
  $cpt_obj = get_post_type_object( $cpt );
141
 
142
  if ( $cpt_obj ) {
143
  add_submenu_page( $parent_slug, $cpt_obj->labels->name, $cpt_obj->labels->menu_name, $capability, $menu_slug );
144
  }
145
 
146
-
147
  add_action( "load-{$requests_hook}", array( 'GDPR_Help', 'add_requests_help' ) );
148
  add_action( "load-{$tools_hook}", array( 'GDPR_Help', 'add_tools_help' ) );
149
  add_action( "load-{$settings_hook}", array( 'GDPR_Help', 'add_settings_help' ) );
150
- add_action( "load-edit.php", array( 'GDPR_Help', 'add_telemetry_help' ) );
151
  }
152
 
153
  /**
@@ -165,13 +165,13 @@ class GDPR_Admin {
165
  }
166
 
167
  foreach ( $cookie_categories as $key => $props ) {
168
- $key = sanitize_text_field( $key );
169
  $output[ $key ] = array(
170
- 'name' => isset( $props['name'] ) ? sanitize_text_field( $props['name'] ) : '',
171
- 'status' => isset( $props['status'] ) ? sanitize_text_field( $props['status'] ) : '',
172
  'cookies_used' => isset( $props['cookies_used'] ) ? sanitize_text_field( wp_unslash( $props['cookies_used'] ) ) : '',
173
- 'how_we_use' => isset( $props['how_we_use'] ) ? wp_kses_post( $props['how_we_use'] ) : '',
174
- 'hosts' => array(),
175
  );
176
  if ( isset( $props['hosts'] ) ) {
177
  foreach ( $props['hosts'] as $domain_key => $domain ) {
@@ -179,7 +179,7 @@ class GDPR_Admin {
179
 
180
  $output[ $key ]['hosts'][ $domain_key ] = array(
181
  'cookies_used' => isset( $domain['cookies_used'] ) ? sanitize_text_field( $domain['cookies_used'] ) : '',
182
- 'optout' => isset( $domain['optout'] ) ? esc_url_raw( $domain['optout'] ) : '',
183
  );
184
  }
185
  }
@@ -196,7 +196,7 @@ class GDPR_Admin {
196
  $settings = array(
197
  'gdpr_cookie_banner_content' => array( $this, 'sanitize_with_links' ),
198
  'gdpr_cookie_privacy_excerpt' => 'sanitize_textarea_field',
199
- 'gdpr_cookie_popup_content' => array( $this, 'sanitize_cookie_categories' ),
200
  'gdpr_email_limit' => 'intval',
201
  'gdpr_consent_types' => array( $this, 'sanitize_consents' ),
202
  'gdpr_deletion_needs_review' => 'boolval',
@@ -263,7 +263,7 @@ class GDPR_Admin {
263
  */
264
  public function settings_page_template() {
265
  $registered_cookies = get_option( 'gdpr_cookie_popup_content', array() );
266
- $consent_types = get_option( 'gdpr_consent_types', array() );
267
 
268
  $pages = get_pages();
269
 
@@ -280,7 +280,7 @@ class GDPR_Admin {
280
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
281
  */
282
  public function requests_page_template() {
283
- $requests = ( array ) get_option( 'gdpr_requests', array() );
284
 
285
  if ( ! empty( $requests ) ) {
286
  foreach ( $requests as $index => $request ) {
@@ -292,16 +292,16 @@ class GDPR_Admin {
292
  }
293
 
294
  $tabs = array(
295
- 'rectify' => array(
296
- 'name' => __( 'Rectify Data', 'gdpr' ),
297
  'count' => isset( $rectify ) ? count( $rectify ) : 0,
298
  ),
299
  'complaint' => array(
300
- 'name' => __( 'Complaint', 'gdpr' ),
301
  'count' => isset( $complaint ) ? count( $complaint ) : 0,
302
  ),
303
- 'delete' => array(
304
- 'name' => __( 'Erasure', 'gdpr' ),
305
  'count' => isset( $delete ) ? count( $delete ) : 0,
306
  ),
307
  );
@@ -318,9 +318,9 @@ class GDPR_Admin {
318
  public function tools_page_template() {
319
 
320
  $tabs = array(
321
- 'access' => esc_html__( 'Access Data', 'gdpr' ),
322
  'data-breach' => esc_html__( 'Data Breach', 'gdpr' ),
323
- 'audit-log' => esc_html__( 'Audit Log', 'gdpr' ),
324
  );
325
 
326
  include plugin_dir_path( __FILE__ ) . 'partials/tools.php';
@@ -332,26 +332,28 @@ class GDPR_Admin {
332
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
333
  */
334
  public function access_data() {
335
- if ( ! isset( $_POST['nonce'], $_POST['email'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'gdpr-access-data' ) ) {
336
  wp_send_json_error();
337
  }
338
 
339
- $email = sanitize_email( $_POST['email'] );
340
- $user = get_user_by( 'email', $email );
341
 
342
  if ( ! $user instanceof WP_User ) {
343
  wp_send_json_error();
344
  }
345
 
346
- $usermeta = GDPR::get_user_meta( $user->ID );
347
- $comments = get_comments( array(
348
- 'author_email' => $user->user_email,
349
- 'include_unapproved' => true,
350
- ) );
 
 
351
  $user_consents = get_user_meta( $user->ID, 'gdpr_consents' );
352
 
353
  ob_start();
354
- echo '<h2>' . $user->display_name . '<span>( ' . $email . ' )</span></h2>';
355
  echo '<table class="widefat">
356
  <tr>
357
  <td class="row-title">Username</td>
@@ -462,14 +464,14 @@ class GDPR_Admin {
462
  echo '<tr>';
463
  echo '<td class="row-title">' . esc_html( $k ) . '</td>';
464
  echo '<td>';
465
- foreach ( $v as $value ) {
466
- if ( is_serialized( $value ) ) {
467
 
468
- echo '<pre>' . print_r( maybe_unserialize( $value ), true ) . '</pre><br />';
469
- } else {
470
- echo print_r( $value, true ) . '<br />';
471
- }
472
  }
 
473
  echo '</td>';
474
  echo '</tr>';
475
  }
@@ -480,7 +482,12 @@ class GDPR_Admin {
480
  do_action( 'admin_access_data_extra_tables', $email );
481
 
482
  $result = ob_get_clean();
483
- wp_send_json_success( array( 'user_email' => $email, 'result' => $result ) );
 
 
 
 
 
484
 
485
  }
486
 
@@ -490,15 +497,15 @@ class GDPR_Admin {
490
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
491
  */
492
  public function audit_log() {
493
- if ( ! isset( $_POST['nonce'], $_POST['email'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'gdpr-audit-log' ) ) {
494
  wp_send_json_error();
495
  }
496
 
497
- $email = sanitize_email( $_POST['email'] );
498
  $token = null;
499
 
500
- if ( isset( $_POST['token'] ) ) {
501
- $token = sanitize_text_field( wp_unslash( $_POST['token'] ) );
502
  }
503
 
504
  $log = GDPR_Audit_log::get_log( $email, $token );
@@ -517,26 +524,26 @@ class GDPR_Admin {
517
  <div class="notice notice-warning review-after-v2-required is-dismissible">
518
  <h2><?php esc_html_e( 'GDPR' ); ?></h2>
519
  <p><strong><?php esc_html_e( 'Review your settings', 'gdpr' ); ?></strong></p>
520
- <p><?php esc_html_e( 'We have added a few new options which must be reviewed before continuing to use the plugin.', 'gdpr'); ?></p>
521
  <p><?php esc_html_e( 'For cookies, we have added a status which allows you to set them as ON, OFF or Required. For consents, we moved the policy selector into each consent. All policies can now be tracked through this.', 'gdpr' ); ?></p>
522
  <p><?php esc_html_e( 'Please keep in mind the plugin might not work as intended until these settings are reviewed.', 'gdpr' ); ?></p>
523
  </div>
524
  <?php
525
- delete_transient( 'gdpr_updated' );
526
  }
527
  }
528
 
529
  function upgrade_completed( $upgrader_object, $options ) {
530
- // If an update has taken place and the updated type is plugins and the plugins element exists
531
- if( $options['action'] == 'update' && $options['type'] == 'plugin' && isset( $options['plugins'] ) ) {
532
- // Iterate through the plugins being updated and check if ours is there
533
- foreach( $options['plugins'] as $plugin ) {
534
- if( $plugin == 'gdpr/gdpr.php' ) {
535
- // Set a transient to record that our plugin has just been updated
536
- set_transient( 'gdpr_updated', 1 );
537
- }
538
- }
539
- }
540
  }
541
 
542
  /**
@@ -554,9 +561,9 @@ class GDPR_Admin {
554
  ?>
555
  <div class="notice notice-warning policy-page-updated-notice">
556
  <?php /* translators: Name of the page that was updated. */ ?>
557
- <strong><?php echo sprintf( esc_html__( 'Your %s page has been updated.', 'gdpr'), $policy ); ?></strong>
558
  <span>
559
- <?php esc_html_e( 'In case this was not a small typo fix, you must ask users for explicit consent again.' , 'gdpr' ); ?>
560
  </span>
561
  <span class="spinner"></span>
562
  <form method="post" class="frm-policy-updated">
@@ -588,62 +595,65 @@ class GDPR_Admin {
588
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
589
  */
590
  public function send_data_breach_confirmation_email() {
591
- if ( ! isset( $_POST['gdpr_data_breach_nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST[ 'gdpr_data_breach_nonce' ] ), 'gdpr-data-breach' ) ) {
592
  wp_die( esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ) );
593
  }
594
 
595
  if (
596
  ! isset(
597
- $_POST['gdpr-data-breach-email-content'],
598
- $_POST['gdpr-data-breach-nature'],
599
- $_POST['gdpr-name-contact-details-protection-officer'],
600
- $_POST['gdpr-likely-consequences'],
601
- $_POST['gdpr-measures-taken']
602
  )
603
  ) {
604
  wp_die( esc_html__( 'One or more required fields are missing. Please try again.', 'gdpr' ) );
605
  }
606
 
607
- $email = get_bloginfo( 'admin_email' );
608
- $user = wp_get_current_user();
609
- $content = sanitize_textarea_field( wp_unslash( $_POST['gdpr-data-breach-email-content'] ) );
610
- $nature = sanitize_textarea_field( wp_unslash( $_POST['gdpr-data-breach-nature'] ) );
611
- $office_contact = sanitize_textarea_field( wp_unslash( $_POST['gdpr-name-contact-details-protection-officer'] ) );
612
- $consequences = sanitize_textarea_field( wp_unslash( $_POST['gdpr-likely-consequences'] ) );
613
- $measures = sanitize_textarea_field( wp_unslash( $_POST['gdpr-measures-taken'] ) );
614
 
615
  $key = wp_generate_password( 20, false );
616
- update_option( 'gdpr_data_breach_initiated', array(
617
- 'key' => $key,
618
- 'content' => $content,
619
- 'nature' => $nature,
620
- 'office_contact' => $office_contact,
621
- 'consequences' => $consequences,
622
- 'measures' => $measures
623
- ) );
 
 
624
 
625
  $confirm_url = add_query_arg(
626
- array(
627
- 'type' => 'data-breach-confirmed',
628
- 'key' => $key
629
- ),
630
- get_home_url() . wp_get_referer() . '#data-breach'
631
  );
632
 
633
  GDPR_Email::send(
634
  $email,
635
  'data-breach-request',
636
  array(
637
- 'requester' => $user->user_email,
638
- 'nature'=> $nature,
639
  'office_contact' => $office_contact,
640
- 'consequences' => $consequences,
641
- 'measures' => $measures,
642
- 'confirm_url' => $confirm_url,
643
  )
644
  );
645
 
646
- if ( $time = wp_next_scheduled( 'clean_gdpr_data_breach_request' ) ) {
 
647
  wp_unschedule_event( $time, 'clean_gdpr_data_breach_request' );
648
  }
649
  wp_schedule_single_event( time() + 2 * DAY_IN_SECONDS, 'clean_gdpr_data_breach_request' );
@@ -654,7 +664,7 @@ class GDPR_Admin {
654
  esc_url_raw(
655
  add_query_arg(
656
  array(
657
- 'settings-updated' => true
658
  ),
659
  wp_get_referer() . '#data-breach'
660
  )
@@ -679,9 +689,9 @@ class GDPR_Admin {
679
  */
680
  public function telemetry_cleanup() {
681
  $args = array(
682
- 'post_type' => 'telemetry',
683
  'posts_per_page' => -1,
684
- 'fields' => 'ids',
685
  );
686
 
687
  $telemetry_posts = get_posts( $args );
@@ -692,7 +702,7 @@ class GDPR_Admin {
692
  }
693
 
694
  /**
695
- * Sanitizes the consents during wordpress registration.
696
  * @since 1.0.0
697
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
698
  * @param WP_Error $errors The error object.
@@ -701,24 +711,26 @@ class GDPR_Admin {
701
  * @return WP_Error WP_Error object with added errors or not.
702
  */
703
  public function registration_errors( $errors, $sanitized_user_login, $user_email ) {
704
- $consent_types = get_option( 'gdpr_consent_types', array() );
705
- if ( empty( $consent_types ) ) {
706
- return $errors;
707
- }
708
-
709
- foreach ( $consent_types as $key => $consent ) {
710
- if ( $consent['policy-page'] ) {
711
- if ( ! isset( $_POST['user_consents'][ $key ] ) ) {
712
- $errors->add( 'missing_required_consents', sprintf(
713
- '<strong>%s</strong>: %s %s.',
714
- __( 'ERROR', 'gdpr' ),
715
- $consent['name'],
716
- __( 'is a required consent', 'gdpr' )
717
- ) );
718
- }
719
- }
720
- }
721
- return $errors;
 
 
722
  }
723
 
724
  /**
@@ -727,20 +739,22 @@ class GDPR_Admin {
727
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
728
  */
729
  public function seek_consent() {
730
- if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['nonce'] ), 'gdpr-seek-consent' ) ) {
731
  wp_send_json_error( esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ) );
732
  }
733
 
734
- $policy_id = sanitize_text_field( $_POST['policy_id'] );
735
- $policy_name = sanitize_text_field( $_POST['policy_name'] );
736
  $policies_updated = get_option( 'gdpr_policies_updated', array() );
737
 
738
  unset( $policies_updated[ $policy_id ] );
739
  update_option( 'gdpr_policies_updated', $policies_updated );
740
 
741
- $users = get_users( array(
742
- 'fields' => 'all_with_meta'
743
- ) );
 
 
744
 
745
  foreach ( $users as $user ) {
746
  $usermeta = get_user_meta( $user->ID, 'gdpr_consents' );
@@ -758,23 +772,27 @@ class GDPR_Admin {
758
  * Check if the privacy policy page content has been updated or not.
759
  * @since 1.0.0
760
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
761
- * @param int $ID The page ID.
762
  * @param WP_Post $post The post object.
763
  */
764
- public function policy_updated( $ID, $post ) {
765
- $policies_updated = get_option( 'gdpr_policies_updated', array() );
766
- $consents = get_option( 'gdpr_consent_types', array() );
767
- $required_consents = array_filter( $consents, function( $consent ) {
768
- return ! empty( $consent['policy-page'] );
769
- } );
 
 
770
 
771
  if ( ! empty( $required_consents ) ) {
772
  foreach ( $required_consents as $consent_id => $consent ) {
773
- if ( $ID === $consent['policy-page'] ) {
774
- $revisions = wp_get_post_revisions( $ID );
775
- $revisions = array_filter( $revisions, function( $rev ) {
776
- return strpos( $rev->post_name, 'autosave' ) === false;
777
- });
 
 
778
 
779
  reset( $revisions );
780
  if ( current( $revisions )->post_content !== $post->post_content ) {
@@ -792,11 +810,11 @@ class GDPR_Admin {
792
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
793
  */
794
  public function ignore_policy_update() {
795
- if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['nonce'] ), 'gdpr-ignore-update' ) ) {
796
  wp_send_json_error( esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ) );
797
  }
798
 
799
- $policy = sanitize_text_field( $_POST['policy_id'] );
800
  $policies_updated = get_option( 'gdpr_policies_updated', array() );
801
  unset( $policies_updated[ $policy ] );
802
  update_option( 'gdpr_policies_updated', $policies_updated );
@@ -816,26 +834,26 @@ class GDPR_Admin {
816
  return;
817
  }
818
  ?>
819
- <h3><?php _e( 'Consent Management', 'gdpr' ); ?></h3>
820
-
821
- <table class="form-table">
822
- <?php foreach ( $consent_types as $consent_key => $consent ): ?>
823
- <tr>
824
- <th>
825
- <label><?php echo esc_html( $consent['name'] ); ?></label>
826
- </th>
827
- <td>
828
- <?php if ( $consent['required'] ): ?>
829
- <input type="checkbox" name="user_consents[]" value="<?php echo esc_attr( $consent_key ); ?>" disabled checked>
830
- <input type="hidden" name="user_consents[]" value="<?php echo esc_attr( $consent_key ); ?>">
831
- <?php else: ?>
832
- <input type="checkbox" name="user_consents[]" value="<?php echo esc_attr( $consent_key ); ?>" <?php echo ! empty( $user_consents ) ? checked( in_array( $consent_key, $user_consents, true ), 1, false ) : ''; ?>>
833
- <?php endif ?>
834
- <span class="description"><?php echo wp_kses( $consent['description'], $this->allowed_html ); ?></span>
835
- </td>
836
- </tr>
837
- <?php endforeach ?>
838
- </table>
839
 
840
  <?php
841
  }
@@ -847,11 +865,11 @@ class GDPR_Admin {
847
  * @param int $user_id The user ID.
848
  */
849
  public function user_profile_update( $user_id ) {
850
- if ( ! isset( $_POST['user_consents'] ) ) {
851
  return;
852
  }
853
 
854
- $consents = array_map( 'sanitize_text_field', (array) $_POST['user_consents'] );
855
 
856
  GDPR_Audit_Log::log( $user_id, esc_html__( 'Profile Updated. These are the user consents after the save:', 'gdpr' ) );
857
 
@@ -863,7 +881,7 @@ class GDPR_Admin {
863
  GDPR_Audit_Log::log( $user_id, $consent );
864
  }
865
 
866
- setcookie( "gdpr[consent_types]", json_encode( $consents ), time() + YEAR_IN_SECONDS, "/" );
867
  }
868
 
869
  /**
@@ -875,13 +893,17 @@ class GDPR_Admin {
875
  public function woocommerce_consent_checkboxes( $fields ) {
876
  $consent_types = get_option( 'gdpr_consent_types', array() );
877
 
 
 
 
 
878
  foreach ( $consent_types as $key => $consent ) {
879
  $required = ( isset( $consent['policy-page'] ) && $consent['policy-page'] ) ? 'required' : '';
880
 
881
- $fields['account']['user_consents_' . esc_attr( $key ) ] = array(
882
- 'type' => 'checkbox',
883
- 'label' => wp_kses( $consent['registration'], $this->allowed_html ),
884
- 'required' => $required,
885
  );
886
  }
887
  return $fields;
@@ -895,10 +917,12 @@ class GDPR_Admin {
895
  * @param array $data All data submitted during checkout.
896
  */
897
  public function woocommerce_checkout_save_consent( $customer_id, $data ) {
898
- $data = array_filter( $data );
899
- $consent_arr = array_filter( array_keys( $data ), function( $item ) {
900
- return false !== strpos( $item, 'user_consents_' );
901
- } );
 
 
902
 
903
  foreach ( $consent_arr as $key => $value ) {
904
  $consent = str_replace( 'user_consents_', '', $value );
@@ -919,10 +943,10 @@ class GDPR_Admin {
919
  public function add_consents_to_consents_column( $val, $column_name, $user_id ) {
920
  if ( 'consents' === $column_name ) {
921
  $user_consents = get_user_meta( $user_id, 'gdpr_consents' );
922
- return implode(', ', $user_consents );
923
  }
924
 
925
- return $val;
926
  }
927
 
928
  public function add_consents_column_to_user_table( $column_headers ) {
62
  $this->version = $version;
63
  $this->allowed_html = array(
64
  'a' => array(
65
+ 'href' => true,
66
+ 'title' => true,
67
  'target' => true,
68
  ),
69
  );
103
  $function = array( $this, 'requests_page_template' );
104
  $icon_url = 'dashicons-id';
105
 
106
+ $requests = get_option( 'gdpr_requests', array() );
107
+ $confirmed_requests = array_filter(
108
+ $requests, function( $item ) {
109
+ return true === $item['confirmed'];
110
+ }
111
+ );
112
 
113
+ $menu_title = esc_html__( 'GDPR', 'gdpr' );
114
  if ( count( $confirmed_requests ) ) {
115
+ $menu_title = sprintf( esc_html( 'GDPR %s' ), '<span class="awaiting-mod">' . count( $confirmed_requests ) . '</span>' );
116
  }
117
 
118
  add_menu_page( $page_title, $menu_title, $capability, $parent_slug, $function, $icon_url );
135
 
136
  $settings_hook = add_submenu_page( $parent_slug, $menu_title, $menu_title, $capability, $menu_slug, $function );
137
 
138
+ $menu_slug = 'edit.php?post_type=telemetry';
139
 
140
+ $cpt = 'telemetry';
 
 
141
  $cpt_obj = get_post_type_object( $cpt );
142
 
143
  if ( $cpt_obj ) {
144
  add_submenu_page( $parent_slug, $cpt_obj->labels->name, $cpt_obj->labels->menu_name, $capability, $menu_slug );
145
  }
146
 
 
147
  add_action( "load-{$requests_hook}", array( 'GDPR_Help', 'add_requests_help' ) );
148
  add_action( "load-{$tools_hook}", array( 'GDPR_Help', 'add_tools_help' ) );
149
  add_action( "load-{$settings_hook}", array( 'GDPR_Help', 'add_settings_help' ) );
150
+ add_action( 'load-edit.php', array( 'GDPR_Help', 'add_telemetry_help' ) );
151
  }
152
 
153
  /**
165
  }
166
 
167
  foreach ( $cookie_categories as $key => $props ) {
168
+ $key = sanitize_text_field( $key );
169
  $output[ $key ] = array(
170
+ 'name' => isset( $props['name'] ) ? sanitize_text_field( $props['name'] ) : '',
171
+ 'status' => isset( $props['status'] ) ? sanitize_text_field( $props['status'] ) : '',
172
  'cookies_used' => isset( $props['cookies_used'] ) ? sanitize_text_field( wp_unslash( $props['cookies_used'] ) ) : '',
173
+ 'how_we_use' => isset( $props['how_we_use'] ) ? wp_kses_post( $props['how_we_use'] ) : '',
174
+ 'hosts' => array(),
175
  );
176
  if ( isset( $props['hosts'] ) ) {
177
  foreach ( $props['hosts'] as $domain_key => $domain ) {
179
 
180
  $output[ $key ]['hosts'][ $domain_key ] = array(
181
  'cookies_used' => isset( $domain['cookies_used'] ) ? sanitize_text_field( $domain['cookies_used'] ) : '',
182
+ 'optout' => isset( $domain['optout'] ) ? esc_url_raw( $domain['optout'] ) : '',
183
  );
184
  }
185
  }
196
  $settings = array(
197
  'gdpr_cookie_banner_content' => array( $this, 'sanitize_with_links' ),
198
  'gdpr_cookie_privacy_excerpt' => 'sanitize_textarea_field',
199
+ 'gdpr_cookie_popup_content' => array( $this, 'sanitize_cookie_categories' ),
200
  'gdpr_email_limit' => 'intval',
201
  'gdpr_consent_types' => array( $this, 'sanitize_consents' ),
202
  'gdpr_deletion_needs_review' => 'boolval',
263
  */
264
  public function settings_page_template() {
265
  $registered_cookies = get_option( 'gdpr_cookie_popup_content', array() );
266
+ $consent_types = get_option( 'gdpr_consent_types', array() );
267
 
268
  $pages = get_pages();
269
 
280
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
281
  */
282
  public function requests_page_template() {
283
+ $requests = (array) get_option( 'gdpr_requests', array() );
284
 
285
  if ( ! empty( $requests ) ) {
286
  foreach ( $requests as $index => $request ) {
292
  }
293
 
294
  $tabs = array(
295
+ 'rectify' => array(
296
+ 'name' => __( 'Rectify Data', 'gdpr' ),
297
  'count' => isset( $rectify ) ? count( $rectify ) : 0,
298
  ),
299
  'complaint' => array(
300
+ 'name' => __( 'Complaint', 'gdpr' ),
301
  'count' => isset( $complaint ) ? count( $complaint ) : 0,
302
  ),
303
+ 'delete' => array(
304
+ 'name' => __( 'Erasure', 'gdpr' ),
305
  'count' => isset( $delete ) ? count( $delete ) : 0,
306
  ),
307
  );
318
  public function tools_page_template() {
319
 
320
  $tabs = array(
321
+ 'access' => esc_html__( 'Access Data', 'gdpr' ),
322
  'data-breach' => esc_html__( 'Data Breach', 'gdpr' ),
323
+ 'audit-log' => esc_html__( 'Audit Log', 'gdpr' ),
324
  );
325
 
326
  include plugin_dir_path( __FILE__ ) . 'partials/tools.php';
332
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
333
  */
334
  public function access_data() {
335
+ if ( ! isset( $_POST['nonce'], $_POST['email'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'gdpr-access-data' ) ) { // WPCS: Input var ok.
336
  wp_send_json_error();
337
  }
338
 
339
+ $email = sanitize_email( wp_unslash( $_POST['email'] ) ); // WPCS: Input var ok.
340
+ $user = get_user_by( 'email', $email );
341
 
342
  if ( ! $user instanceof WP_User ) {
343
  wp_send_json_error();
344
  }
345
 
346
+ $usermeta = GDPR::get_user_meta( $user->ID );
347
+ $comments = get_comments(
348
+ array(
349
+ 'author_email' => $user->user_email,
350
+ 'include_unapproved' => true,
351
+ )
352
+ );
353
  $user_consents = get_user_meta( $user->ID, 'gdpr_consents' );
354
 
355
  ob_start();
356
+ echo '<h2>' . esc_html( $user->display_name ) . '<span>( ' . esc_html( $email ) . ' )</span></h2>';
357
  echo '<table class="widefat">
358
  <tr>
359
  <td class="row-title">Username</td>
464
  echo '<tr>';
465
  echo '<td class="row-title">' . esc_html( $k ) . '</td>';
466
  echo '<td>';
467
+ foreach ( $v as $value ) {
468
+ if ( is_serialized( $value ) ) {
469
 
470
+ echo '<pre>' . esc_html( print_r( maybe_unserialize( $value ), true ) ) . '</pre><br />';
471
+ } else {
472
+ echo esc_html( print_r( $value, true ) ) . '<br />';
 
473
  }
474
+ }
475
  echo '</td>';
476
  echo '</tr>';
477
  }
482
  do_action( 'admin_access_data_extra_tables', $email );
483
 
484
  $result = ob_get_clean();
485
+ wp_send_json_success(
486
+ array(
487
+ 'user_email' => $email,
488
+ 'result' => $result,
489
+ )
490
+ );
491
 
492
  }
493
 
497
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
498
  */
499
  public function audit_log() {
500
+ if ( ! isset( $_POST['nonce'], $_POST['email'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'gdpr-audit-log' ) ) { // WPCS: Input var ok.
501
  wp_send_json_error();
502
  }
503
 
504
+ $email = sanitize_email( wp_unslash( $_POST['email'] ) ); // WPCS: Input var ok.
505
  $token = null;
506
 
507
+ if ( isset( $_POST['token'] ) ) { // WPCS: Input var ok.
508
+ $token = sanitize_text_field( wp_unslash( $_POST['token'] ) ); // WPCS: Input var ok.
509
  }
510
 
511
  $log = GDPR_Audit_log::get_log( $email, $token );
524
  <div class="notice notice-warning review-after-v2-required is-dismissible">
525
  <h2><?php esc_html_e( 'GDPR' ); ?></h2>
526
  <p><strong><?php esc_html_e( 'Review your settings', 'gdpr' ); ?></strong></p>
527
+ <p><?php esc_html_e( 'We have added a few new options which must be reviewed before continuing to use the plugin.', 'gdpr' ); ?></p>
528
  <p><?php esc_html_e( 'For cookies, we have added a status which allows you to set them as ON, OFF or Required. For consents, we moved the policy selector into each consent. All policies can now be tracked through this.', 'gdpr' ); ?></p>
529
  <p><?php esc_html_e( 'Please keep in mind the plugin might not work as intended until these settings are reviewed.', 'gdpr' ); ?></p>
530
  </div>
531
  <?php
532
+ delete_transient( 'gdpr_updated' );
533
  }
534
  }
535
 
536
  function upgrade_completed( $upgrader_object, $options ) {
537
+ // If an update has taken place and the updated type is plugins and the plugins element exists
538
+ if ( 'update' === $options['action'] && 'plugin' === $options['type'] && isset( $options['plugins'] ) ) {
539
+ // Iterate through the plugins being updated and check if ours is there
540
+ foreach ( $options['plugins'] as $plugin ) {
541
+ if ( 'gdpr/gdpr.php' === $plugin ) {
542
+ // Set a transient to record that our plugin has just been updated
543
+ set_transient( 'gdpr_updated', 1 );
544
+ }
545
+ }
546
+ }
547
  }
548
 
549
  /**
561
  ?>
562
  <div class="notice notice-warning policy-page-updated-notice">
563
  <?php /* translators: Name of the page that was updated. */ ?>
564
+ <strong><?php echo sprintf( esc_html__( 'Your %s page has been updated.', 'gdpr' ), esc_html( $policy ) ); ?></strong>
565
  <span>
566
+ <?php esc_html_e( 'In case this was not a small typo fix, you must ask users for explicit consent again.', 'gdpr' ); ?>
567
  </span>
568
  <span class="spinner"></span>
569
  <form method="post" class="frm-policy-updated">
595
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
596
  */
597
  public function send_data_breach_confirmation_email() {
598
+ if ( ! isset( $_POST['gdpr_data_breach_nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['gdpr_data_breach_nonce'] ), 'gdpr-data-breach' ) ) { // WPCS: Input var ok.
599
  wp_die( esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ) );
600
  }
601
 
602
  if (
603
  ! isset(
604
+ $_POST['gdpr-data-breach-email-content'], // WPCS: Input var ok.
605
+ $_POST['gdpr-data-breach-nature'], // WPCS: Input var ok.
606
+ $_POST['gdpr-name-contact-details-protection-officer'], // WPCS: Input var ok.
607
+ $_POST['gdpr-likely-consequences'], // WPCS: Input var ok.
608
+ $_POST['gdpr-measures-taken'] // WPCS: Input var ok.
609
  )
610
  ) {
611
  wp_die( esc_html__( 'One or more required fields are missing. Please try again.', 'gdpr' ) );
612
  }
613
 
614
+ $email = get_bloginfo( 'admin_email' );
615
+ $user = wp_get_current_user();
616
+ $content = sanitize_textarea_field( wp_unslash( $_POST['gdpr-data-breach-email-content'] ) ); // WPCS: Input var ok.
617
+ $nature = sanitize_textarea_field( wp_unslash( $_POST['gdpr-data-breach-nature'] ) ); // WPCS: Input var ok.
618
+ $office_contact = sanitize_textarea_field( wp_unslash( $_POST['gdpr-name-contact-details-protection-officer'] ) ); // WPCS: Input var ok.
619
+ $consequences = sanitize_textarea_field( wp_unslash( $_POST['gdpr-likely-consequences'] ) ); // WPCS: Input var ok.
620
+ $measures = sanitize_textarea_field( wp_unslash( $_POST['gdpr-measures-taken'] ) ); // WPCS: Input var ok.
621
 
622
  $key = wp_generate_password( 20, false );
623
+ update_option(
624
+ 'gdpr_data_breach_initiated', array(
625
+ 'key' => $key,
626
+ 'content' => $content,
627
+ 'nature' => $nature,
628
+ 'office_contact' => $office_contact,
629
+ 'consequences' => $consequences,
630
+ 'measures' => $measures,
631
+ )
632
+ );
633
 
634
  $confirm_url = add_query_arg(
635
+ array(
636
+ 'type' => 'data-breach-confirmed',
637
+ 'key' => $key,
638
+ ),
639
+ get_home_url() . wp_get_referer() . '#data-breach'
640
  );
641
 
642
  GDPR_Email::send(
643
  $email,
644
  'data-breach-request',
645
  array(
646
+ 'requester' => $user->user_email,
647
+ 'nature' => $nature,
648
  'office_contact' => $office_contact,
649
+ 'consequences' => $consequences,
650
+ 'measures' => $measures,
651
+ 'confirm_url' => $confirm_url,
652
  )
653
  );
654
 
655
+ $time = wp_next_scheduled( 'clean_gdpr_data_breach_request' );
656
+ if ( $time ) {
657
  wp_unschedule_event( $time, 'clean_gdpr_data_breach_request' );
658
  }
659
  wp_schedule_single_event( time() + 2 * DAY_IN_SECONDS, 'clean_gdpr_data_breach_request' );
664
  esc_url_raw(
665
  add_query_arg(
666
  array(
667
+ 'settings-updated' => true,
668
  ),
669
  wp_get_referer() . '#data-breach'
670
  )
689
  */
690
  public function telemetry_cleanup() {
691
  $args = array(
692
+ 'post_type' => 'telemetry',
693
  'posts_per_page' => -1,
694
+ 'fields' => 'ids',
695
  );
696
 
697
  $telemetry_posts = get_posts( $args );
702
  }
703
 
704
  /**
705
+ * Sanitizes the consents during WordPress registration.
706
  * @since 1.0.0
707
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
708
  * @param WP_Error $errors The error object.
711
  * @return WP_Error WP_Error object with added errors or not.
712
  */
713
  public function registration_errors( $errors, $sanitized_user_login, $user_email ) {
714
+ $consent_types = get_option( 'gdpr_consent_types', array() );
715
+ if ( empty( $consent_types ) ) {
716
+ return $errors;
717
+ }
718
+
719
+ foreach ( $consent_types as $key => $consent ) {
720
+ if ( $consent['policy-page'] ) {
721
+ if ( ! isset( $_POST['user_consents'][ $key ] ) ) { // WPCS: Input var ok, CSRF ok.
722
+ $errors->add(
723
+ 'missing_required_consents', sprintf(
724
+ '<strong>%s</strong>: %s %s.',
725
+ __( 'ERROR', 'gdpr' ),
726
+ $consent['name'],
727
+ __( 'is a required consent', 'gdpr' )
728
+ )
729
+ );
730
+ }
731
+ }
732
+ }
733
+ return $errors;
734
  }
735
 
736
  /**
739
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
740
  */
741
  public function seek_consent() {
742
+ if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['nonce'] ), 'gdpr-seek-consent' ) ) { // WPCS: Input var ok.
743
  wp_send_json_error( esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ) );
744
  }
745
 
746
+ $policy_id = isset( $_POST['policy_id'] ) ? sanitize_text_field( wp_unslash( $_POST['policy_id'] ) ) : ''; // WPCS: Input var ok.
747
+ $policy_name = isset( $_POST['policy_name'] ) ? sanitize_text_field( wp_unslash( $_POST['policy_name'] ) ) : ''; // WPCS: Input var ok.
748
  $policies_updated = get_option( 'gdpr_policies_updated', array() );
749
 
750
  unset( $policies_updated[ $policy_id ] );
751
  update_option( 'gdpr_policies_updated', $policies_updated );
752
 
753
+ $users = get_users(
754
+ array(
755
+ 'fields' => 'all_with_meta',
756
+ )
757
+ );
758
 
759
  foreach ( $users as $user ) {
760
  $usermeta = get_user_meta( $user->ID, 'gdpr_consents' );
772
  * Check if the privacy policy page content has been updated or not.
773
  * @since 1.0.0
774
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
775
+ * @param int $id The page ID.
776
  * @param WP_Post $post The post object.
777
  */
778
+ public function policy_updated( $id, $post ) {
779
+ $policies_updated = get_option( 'gdpr_policies_updated', array() );
780
+ $consents = get_option( 'gdpr_consent_types', array() );
781
+ $required_consents = array_filter(
782
+ $consents, function( $consent ) {
783
+ return ! empty( $consent['policy-page'] );
784
+ }
785
+ );
786
 
787
  if ( ! empty( $required_consents ) ) {
788
  foreach ( $required_consents as $consent_id => $consent ) {
789
+ if ( $id === $consent['policy-page'] ) {
790
+ $revisions = wp_get_post_revisions( $id );
791
+ $revisions = array_filter(
792
+ $revisions, function( $rev ) {
793
+ return strpos( $rev->post_name, 'autosave' ) === false;
794
+ }
795
+ );
796
 
797
  reset( $revisions );
798
  if ( current( $revisions )->post_content !== $post->post_content ) {
810
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
811
  */
812
  public function ignore_policy_update() {
813
+ if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['nonce'] ), 'gdpr-ignore-update' ) ) { // WPCS: Input var ok.
814
  wp_send_json_error( esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ) );
815
  }
816
 
817
+ $policy = isset( $_POST['policy_id'] ) ? sanitize_text_field( wp_unslash( $_POST['policy_id'] ) ) : ''; // WPCS: Input var ok.
818
  $policies_updated = get_option( 'gdpr_policies_updated', array() );
819
  unset( $policies_updated[ $policy ] );
820
  update_option( 'gdpr_policies_updated', $policies_updated );
834
  return;
835
  }
836
  ?>
837
+ <h3><?php esc_html_e( 'Consent Management', 'gdpr' ); ?></h3>
838
+
839
+ <table class="form-table">
840
+ <?php foreach ( $consent_types as $consent_key => $consent ) : ?>
841
+ <tr>
842
+ <th>
843
+ <label><?php echo esc_html( $consent['name'] ); ?></label>
844
+ </th>
845
+ <td>
846
+ <?php if ( $consent['required'] ) : ?>
847
+ <input type="checkbox" name="user_consents[]" value="<?php echo esc_attr( $consent_key ); ?>" disabled checked>
848
+ <input type="hidden" name="user_consents[]" value="<?php echo esc_attr( $consent_key ); ?>">
849
+ <?php else : ?>
850
+ <input type="checkbox" name="user_consents[]" value="<?php echo esc_attr( $consent_key ); ?>" <?php echo ! empty( $user_consents ) ? checked( in_array( $consent_key, $user_consents, true ), 1, false ) : ''; ?>>
851
+ <?php endif ?>
852
+ <span class="description"><?php echo wp_kses( $consent['description'], $this->allowed_html ); ?></span>
853
+ </td>
854
+ </tr>
855
+ <?php endforeach ?>
856
+ </table>
857
 
858
  <?php
859
  }
865
  * @param int $user_id The user ID.
866
  */
867
  public function user_profile_update( $user_id ) {
868
+ if ( ! isset( $_POST['user_consents'] ) ) { // WPCS: Input var ok, CSRF ok.
869
  return;
870
  }
871
 
872
+ $consents = array_map( 'sanitize_text_field', (array) wp_unslash( $_POST['user_consents'] ) ); // WPCS: Input var ok, CSRF ok.
873
 
874
  GDPR_Audit_Log::log( $user_id, esc_html__( 'Profile Updated. These are the user consents after the save:', 'gdpr' ) );
875
 
881
  GDPR_Audit_Log::log( $user_id, $consent );
882
  }
883
 
884
+ setcookie( 'gdpr[consent_types]', json_encode( $consents ), time() + YEAR_IN_SECONDS, '/' );
885
  }
886
 
887
  /**
893
  public function woocommerce_consent_checkboxes( $fields ) {
894
  $consent_types = get_option( 'gdpr_consent_types', array() );
895
 
896
+ if ( empty( $consent_types ) ) {
897
+ return $fields;
898
+ }
899
+
900
  foreach ( $consent_types as $key => $consent ) {
901
  $required = ( isset( $consent['policy-page'] ) && $consent['policy-page'] ) ? 'required' : '';
902
 
903
+ $fields['account'][ 'user_consents_' . esc_attr( $key ) ] = array(
904
+ 'type' => 'checkbox',
905
+ 'label' => wp_kses( $consent['registration'], $this->allowed_html ),
906
+ 'required' => $required,
907
  );
908
  }
909
  return $fields;
917
  * @param array $data All data submitted during checkout.
918
  */
919
  public function woocommerce_checkout_save_consent( $customer_id, $data ) {
920
+ $data = array_filter( $data );
921
+ $consent_arr = array_filter(
922
+ array_keys( $data ), function( $item ) {
923
+ return false !== strpos( $item, 'user_consents_' );
924
+ }
925
+ );
926
 
927
  foreach ( $consent_arr as $key => $value ) {
928
  $consent = str_replace( 'user_consents_', '', $value );
943
  public function add_consents_to_consents_column( $val, $column_name, $user_id ) {
944
  if ( 'consents' === $column_name ) {
945
  $user_consents = get_user_meta( $user_id, 'gdpr_consents' );
946
+ return implode( ', ', $user_consents );
947
  }
948
 
949
+ return $val;
950
  }
951
 
952
  public function add_consents_column_to_user_table( $column_headers ) {
admin/class-gdpr-requests-admin.php CHANGED
@@ -26,12 +26,12 @@ class GDPR_Requests_Admin extends GDPR_Requests {
26
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
27
  */
28
  public function add_to_deletion_requests() {
29
- if ( ! isset( $_POST['gdpr_deletion_requests_nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['gdpr_deletion_requests_nonce'] ), 'gdpr-add-to-deletion-requests' ) ) {
30
  wp_die( esc_html__( 'We could not verify the user email or the security token. Please try again.', 'gdpr' ) );
31
  }
32
 
33
- $email = sanitize_email( $_POST['user_email'] );
34
- $user = get_user_by( 'email', $email );
35
 
36
  if ( ! $user instanceof WP_User ) {
37
  add_settings_error( 'gdpr-requests', 'invalid-user', esc_html__( 'User not found.', 'gdpr' ), 'error' );
@@ -40,7 +40,7 @@ class GDPR_Requests_Admin extends GDPR_Requests {
40
  esc_url_raw(
41
  add_query_arg(
42
  array(
43
- 'settings-updated' => true
44
  ),
45
  wp_get_referer() . '#delete'
46
  )
@@ -48,10 +48,12 @@ class GDPR_Requests_Admin extends GDPR_Requests {
48
  );
49
  exit;
50
  } else {
51
- if ( in_array( 'administrator', $user->roles ) ) {
52
- $admins_query = new WP_User_Query( array(
53
- 'role' => 'Administrator'
54
- ) );
 
 
55
  if ( 1 === $admins_query->get_total() ) {
56
  /* translators: User email */
57
  add_settings_error( 'gdpr-requests', 'invalid-request', sprintf( esc_html__( 'User %s is the only admin of the site. It cannot be deleted.', 'gdpr' ), $email ), 'error' );
@@ -60,7 +62,7 @@ class GDPR_Requests_Admin extends GDPR_Requests {
60
  esc_url_raw(
61
  add_query_arg(
62
  array(
63
- 'settings-updated' => true
64
  ),
65
  wp_get_referer() . '#delete'
66
  )
@@ -71,7 +73,7 @@ class GDPR_Requests_Admin extends GDPR_Requests {
71
  }
72
  }
73
 
74
- $requests = ( array ) get_option( 'gdpr_requests', array() );
75
 
76
  if ( empty( $requests ) ) {
77
  parent::add_to_requests( $email, 'delete', null, true );
@@ -83,7 +85,7 @@ class GDPR_Requests_Admin extends GDPR_Requests {
83
  esc_url_raw(
84
  add_query_arg(
85
  array(
86
- 'settings-updated' => true
87
  ),
88
  wp_get_referer() . '#delete'
89
  )
@@ -92,10 +94,12 @@ class GDPR_Requests_Admin extends GDPR_Requests {
92
  exit;
93
  }
94
 
95
- $deletion_requests = array_filter( $requests, function( $arr ) {
96
- return 'delete' === $arr['type'];
97
- });
98
- $user_has_already_requested = array_search( $email, array_column( $deletion_requests, 'email' ) );
 
 
99
 
100
  if ( false !== $user_has_already_requested ) {
101
  add_settings_error( 'gdpr-requests', 'invalid-user', esc_html__( 'User already placed a deletion request.', 'gdpr' ), 'error' );
@@ -104,7 +108,7 @@ class GDPR_Requests_Admin extends GDPR_Requests {
104
  esc_url_raw(
105
  add_query_arg(
106
  array(
107
- 'settings-updated' => true
108
  ),
109
  wp_get_referer() . '#delete'
110
  )
@@ -122,7 +126,7 @@ class GDPR_Requests_Admin extends GDPR_Requests {
122
  esc_url_raw(
123
  add_query_arg(
124
  array(
125
- 'settings-updated' => true
126
  ),
127
  wp_get_referer() . '#delete'
128
  )
@@ -137,26 +141,26 @@ class GDPR_Requests_Admin extends GDPR_Requests {
137
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
138
  */
139
  public function cancel_request() {
140
- if ( ! isset( $_POST['type'] ) ) {
141
  wp_die( esc_html__( 'We could not verify the type of request you want to cancel.', 'gdpr' ) );
142
  }
143
 
144
- $type = sanitize_text_field( trim( strtolower( $_POST['type'] ) ) );
145
  $allowed_types = parent::get_allowed_types();
146
 
147
- if ( ! in_array( $type, $allowed_types ) ) {
148
  /* translators: The type of request */
149
- wp_die( sprintf( esc_html__( 'Type of request \'%s\' is not an allowed type.', 'gdpr' ), $type ) );
150
  }
151
 
152
  $nonce_field = 'gdpr_cancel_' . $type . '_nonce';
153
 
154
- if ( ! isset( $_POST[ $nonce_field ], $_POST['user_email'], $_POST['index'] ) || ! wp_verify_nonce( sanitize_key( $_POST[ $nonce_field ] ), 'gdpr-request-nonce' ) ) {
155
  wp_die( esc_html__( 'We could not verify the user email or the security token. Please try again.', 'gdpr' ) );
156
  }
157
 
158
- $email = sanitize_email( $_POST['user_email'] );
159
- $index = sanitize_text_field( wp_unslash( $_POST['index'] ) );
160
 
161
  parent::remove_from_requests( $index );
162
  $user = get_user_by( 'email', $email );
@@ -170,7 +174,7 @@ class GDPR_Requests_Admin extends GDPR_Requests {
170
  esc_url_raw(
171
  add_query_arg(
172
  array(
173
- 'settings-updated' => true
174
  ),
175
  wp_get_referer() . '#' . $type
176
  )
@@ -185,27 +189,26 @@ class GDPR_Requests_Admin extends GDPR_Requests {
185
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
186
  */
187
  public function mark_resolved() {
188
- if ( ! isset( $_POST['type'] ) ) {
189
  wp_die( esc_html__( 'We could not verify the type of request you want to cancel.', 'gdpr' ) );
190
  }
191
 
192
- $type = sanitize_text_field( trim( strtolower( $_POST['type'] ) ) );
193
  $allowed_types = parent::get_allowed_types();
194
 
195
- if ( ! in_array( $type, $allowed_types ) ) {
196
  /* translators: The type of request i.e. 'delete' */
197
- wp_die( sprintf( esc_html__( 'Type of request \'%s\' is not an allowed type.', 'gdpr' ), $type ) );
198
  }
199
 
200
  $nonce_field = 'gdpr_' . $type . '_mark_resolved_nonce';
201
 
202
- if ( ! isset( $_POST[ $nonce_field ], $_POST['user_email'], $_POST['index'] ) || ! wp_verify_nonce( sanitize_key( $_POST[ $nonce_field ] ), 'gdpr-mark-as-resolved' ) ) {
203
  wp_die( esc_html__( 'We could not verify the user email or the security token. Please try again.', 'gdpr' ) );
204
  }
205
 
206
- $email = sanitize_email( $_POST['user_email'] );
207
- $index = sanitize_text_field( $_POST['index'] );
208
-
209
 
210
  parent::remove_from_requests( $index );
211
 
@@ -221,7 +224,7 @@ class GDPR_Requests_Admin extends GDPR_Requests {
221
  esc_url_raw(
222
  add_query_arg(
223
  array(
224
- 'settings-updated' => true
225
  ),
226
  wp_get_referer() . '#' . $type
227
  )
@@ -236,19 +239,19 @@ class GDPR_Requests_Admin extends GDPR_Requests {
236
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
237
  */
238
  public function delete_user() {
239
- if ( ! isset( $_POST['gdpr_delete_user'], $_POST['user_email'], $_POST['index'] ) || ! wp_verify_nonce( $_POST['gdpr_delete_user'], 'gdpr-request-delete-user' ) ) {
240
  wp_die( esc_html__( 'We could not verify the user email or the security token. Please try again.', 'gdpr' ) );
241
  }
242
 
243
- $email = sanitize_email( $_POST['user_email'] );
244
- $user = get_user_by( 'email', $email );
245
- $index = sanitize_text_field( $_POST['index'] );
246
  parent::remove_from_requests( $index );
247
 
248
  $token = GDPR::generate_pin();
249
  GDPR_Email::send( $user->user_email, 'delete-resolved', array( 'token' => $token ) );
250
 
251
- GDPR_Audit_Log::log( $user->ID, esc_html__( 'User was removed from the site.', 'gdpr') );
252
  GDPR_Audit_Log::export_log( $user->ID, $token );
253
  wp_delete_user( $user->ID );
254
 
@@ -259,7 +262,7 @@ class GDPR_Requests_Admin extends GDPR_Requests {
259
  esc_url_raw(
260
  add_query_arg(
261
  array(
262
- 'settings-updated' => true
263
  ),
264
  wp_get_referer() . '#delete'
265
  )
@@ -274,33 +277,35 @@ class GDPR_Requests_Admin extends GDPR_Requests {
274
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
275
  */
276
  public function anonymize_comments() {
277
- if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'gdpr-anonymize-comments-action' ) ) {
278
  wp_send_json_error( esc_html__( 'We could not verify the security token. Please try again.', 'gdpr' ) );
279
  }
280
 
281
- $email = sanitize_email( $_POST['user_email'] );
282
- $comment_count = ( int ) $_POST['comment_count'];
283
 
284
  $user = get_user_by( 'email', $email );
285
  if ( ! $user instanceof WP_User ) {
286
  wp_send_json_error( esc_html__( 'User not found.', 'gdpr' ) );
287
  }
288
 
289
- $comments = get_comments( array(
290
- 'author_email' => $user->user_email,
291
- 'include_unapproved' => true,
292
- 'number' => $comment_count,
293
- ) );
 
 
294
 
295
  foreach ( $comments as $comment ) {
296
- $new_comment = array();
297
- $new_comment['comment_ID'] = $comment->comment_ID;
298
- $new_comment['comment_author_IP'] = '0.0.0.0';
299
  $new_comment['comment_author_email'] = '';
300
- $new_comment['comment_author_url'] = '';
301
- $new_comment['comment_agent'] = '';
302
- $new_comment['comment_author'] = esc_html__( 'Guest', 'gdpr' );
303
- $new_comment['user_id'] = 0;
304
  wp_update_comment( $new_comment );
305
  }
306
  GDPR_Audit_Log::log( $user->ID, esc_html__( 'User comments were anonymized.', 'gdpr' ) );
@@ -313,18 +318,18 @@ class GDPR_Requests_Admin extends GDPR_Requests {
313
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
314
  */
315
  public function reassign_content() {
316
- if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'gdpr-reassign-content-action' ) ) {
317
  wp_send_json_error( esc_html__( 'We could not verify the security token. Please try again.', 'gdpr' ) );
318
  }
319
 
320
- if ( ! isset( $_POST['user_email'], $_POST['reassign_to'], $_POST['post_type'], $_POST['post_count'] ) ) {
321
  wp_send_json_error( esc_html__( 'Essential data missing. Please try again.', 'gdpr' ) );
322
  }
323
 
324
- $email = sanitize_email( $_POST['user_email'] );
325
- $reassign_to = ( int ) $_POST['reassign_to'];
326
- $post_type = sanitize_text_field( wp_unslash( $_POST['post_type'] ) );
327
- $post_count = ( int ) $_POST['post_count'];
328
 
329
  $user = get_user_by( 'email', $email );
330
  if ( ! $user instanceof WP_User ) {
@@ -332,8 +337,8 @@ class GDPR_Requests_Admin extends GDPR_Requests {
332
  }
333
 
334
  $args = array(
335
- 'author' => $user->ID,
336
- 'post_type' => $post_type,
337
  'posts_per_page' => $post_count,
338
  );
339
 
@@ -341,15 +346,17 @@ class GDPR_Requests_Admin extends GDPR_Requests {
341
 
342
  if ( ! empty( $posts ) ) {
343
  foreach ( $posts as $post ) {
344
- wp_update_post( array(
345
- 'ID' => $post->ID,
346
- 'post_author' => $reassign_to,
347
- ) );
 
 
348
  }
349
 
350
  $reassign_to_user = get_user_by( 'ID', $reassign_to );
351
  /* translators: 1: The post type, 2: The user the posts were reassigned to */
352
- GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'User %s were reassigned to %s.', 'gdpr' ), $post_type, $reassign_to_user->display_name ) );
353
  wp_send_json_success();
354
  }
355
 
26
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
27
  */
28
  public function add_to_deletion_requests() {
29
+ if ( ! isset( $_POST['gdpr_deletion_requests_nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['gdpr_deletion_requests_nonce'] ), 'gdpr-add-to-deletion-requests' ) ) { // WPCS: Input var ok.
30
  wp_die( esc_html__( 'We could not verify the user email or the security token. Please try again.', 'gdpr' ) );
31
  }
32
 
33
+ $email = isset( $_POST['user_email'] ) ? sanitize_email( wp_unslash( $_POST['user_email'] ) ) : ''; // WPCS: Input var ok.
34
+ $user = get_user_by( 'email', $email );
35
 
36
  if ( ! $user instanceof WP_User ) {
37
  add_settings_error( 'gdpr-requests', 'invalid-user', esc_html__( 'User not found.', 'gdpr' ), 'error' );
40
  esc_url_raw(
41
  add_query_arg(
42
  array(
43
+ 'settings-updated' => true,
44
  ),
45
  wp_get_referer() . '#delete'
46
  )
48
  );
49
  exit;
50
  } else {
51
+ if ( in_array( 'administrator', $user->roles, true ) ) {
52
+ $admins_query = new WP_User_Query(
53
+ array(
54
+ 'role' => 'Administrator',
55
+ )
56
+ );
57
  if ( 1 === $admins_query->get_total() ) {
58
  /* translators: User email */
59
  add_settings_error( 'gdpr-requests', 'invalid-request', sprintf( esc_html__( 'User %s is the only admin of the site. It cannot be deleted.', 'gdpr' ), $email ), 'error' );
62
  esc_url_raw(
63
  add_query_arg(
64
  array(
65
+ 'settings-updated' => true,
66
  ),
67
  wp_get_referer() . '#delete'
68
  )
73
  }
74
  }
75
 
76
+ $requests = (array) get_option( 'gdpr_requests', array() );
77
 
78
  if ( empty( $requests ) ) {
79
  parent::add_to_requests( $email, 'delete', null, true );
85
  esc_url_raw(
86
  add_query_arg(
87
  array(
88
+ 'settings-updated' => true,
89
  ),
90
  wp_get_referer() . '#delete'
91
  )
94
  exit;
95
  }
96
 
97
+ $deletion_requests = array_filter(
98
+ $requests, function( $arr ) {
99
+ return 'delete' === $arr['type'];
100
+ }
101
+ );
102
+ $user_has_already_requested = array_search( $email, array_column( $deletion_requests, 'email' ), true );
103
 
104
  if ( false !== $user_has_already_requested ) {
105
  add_settings_error( 'gdpr-requests', 'invalid-user', esc_html__( 'User already placed a deletion request.', 'gdpr' ), 'error' );
108
  esc_url_raw(
109
  add_query_arg(
110
  array(
111
+ 'settings-updated' => true,
112
  ),
113
  wp_get_referer() . '#delete'
114
  )
126
  esc_url_raw(
127
  add_query_arg(
128
  array(
129
+ 'settings-updated' => true,
130
  ),
131
  wp_get_referer() . '#delete'
132
  )
141
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
142
  */
143
  public function cancel_request() {
144
+ if ( ! isset( $_POST['type'] ) ) { // WPCS: Input var ok.
145
  wp_die( esc_html__( 'We could not verify the type of request you want to cancel.', 'gdpr' ) );
146
  }
147
 
148
+ $type = trim( strtolower( sanitize_text_field( wp_unslash( $_POST['type'] ) ) ) ); // WPCS: Input var ok, CSRF ok.
149
  $allowed_types = parent::get_allowed_types();
150
 
151
+ if ( ! in_array( $type, $allowed_types, true ) ) {
152
  /* translators: The type of request */
153
+ wp_die( sprintf( esc_html__( 'Type of request \'%s\' is not an allowed type.', 'gdpr' ), esc_html( $type ) ) );
154
  }
155
 
156
  $nonce_field = 'gdpr_cancel_' . $type . '_nonce';
157
 
158
+ if ( ! isset( $_POST[ $nonce_field ], $_POST['user_email'], $_POST['index'] ) || ! wp_verify_nonce( sanitize_key( $_POST[ $nonce_field ] ), 'gdpr-request-nonce' ) ) { // WPCS: Input var ok.
159
  wp_die( esc_html__( 'We could not verify the user email or the security token. Please try again.', 'gdpr' ) );
160
  }
161
 
162
+ $email = sanitize_email( wp_unslash( $_POST['user_email'] ) ); // WPCS: Input var ok.
163
+ $index = sanitize_text_field( wp_unslash( $_POST['index'] ) ); // WPCS: Input var ok.
164
 
165
  parent::remove_from_requests( $index );
166
  $user = get_user_by( 'email', $email );
174
  esc_url_raw(
175
  add_query_arg(
176
  array(
177
+ 'settings-updated' => true,
178
  ),
179
  wp_get_referer() . '#' . $type
180
  )
189
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
190
  */
191
  public function mark_resolved() {
192
+ if ( ! isset( $_POST['type'] ) ) { // WPCS: Input var ok.
193
  wp_die( esc_html__( 'We could not verify the type of request you want to cancel.', 'gdpr' ) );
194
  }
195
 
196
+ $type = isset( $_POST['type'] ) ? trim( strtolower( sanitize_text_field( wp_unslash( $_POST['type'] ) ) ) ) : ''; // WPCS: Input var ok, CSRF ok.
197
  $allowed_types = parent::get_allowed_types();
198
 
199
+ if ( ! in_array( $type, $allowed_types, true ) ) {
200
  /* translators: The type of request i.e. 'delete' */
201
+ wp_die( sprintf( esc_html__( 'Type of request \'%s\' is not an allowed type.', 'gdpr' ), esc_html( $type ) ) );
202
  }
203
 
204
  $nonce_field = 'gdpr_' . $type . '_mark_resolved_nonce';
205
 
206
+ if ( ! isset( $_POST[ $nonce_field ], $_POST['user_email'], $_POST['index'] ) || ! wp_verify_nonce( sanitize_key( $_POST[ $nonce_field ] ), 'gdpr-mark-as-resolved' ) ) { // WPCS: Input var ok.
207
  wp_die( esc_html__( 'We could not verify the user email or the security token. Please try again.', 'gdpr' ) );
208
  }
209
 
210
+ $email = sanitize_email( wp_unslash( $_POST['user_email'] ) ); // WPCS: Input var ok.
211
+ $index = sanitize_text_field( wp_unslash( $_POST['index'] ) ); // WPCS: Input var ok.
 
212
 
213
  parent::remove_from_requests( $index );
214
 
224
  esc_url_raw(
225
  add_query_arg(
226
  array(
227
+ 'settings-updated' => true,
228
  ),
229
  wp_get_referer() . '#' . $type
230
  )
239
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
240
  */
241
  public function delete_user() {
242
+ if ( ! isset( $_POST['gdpr_delete_user'], $_POST['user_email'], $_POST['index'] ) || ! wp_verify_nonce( sanitize_key( $_POST['gdpr_delete_user'] ), 'gdpr-request-delete-user' ) ) { // WPCS: Input var ok.
243
  wp_die( esc_html__( 'We could not verify the user email or the security token. Please try again.', 'gdpr' ) );
244
  }
245
 
246
+ $email = sanitize_email( wp_unslash( $_POST['user_email'] ) ); // WPCS: Input var ok.
247
+ $user = get_user_by( 'email', $email );
248
+ $index = sanitize_text_field( wp_unslash( $_POST['index'] ) ); // WPCS: Input var ok.
249
  parent::remove_from_requests( $index );
250
 
251
  $token = GDPR::generate_pin();
252
  GDPR_Email::send( $user->user_email, 'delete-resolved', array( 'token' => $token ) );
253
 
254
+ GDPR_Audit_Log::log( $user->ID, esc_html__( 'User was removed from the site.', 'gdpr' ) );
255
  GDPR_Audit_Log::export_log( $user->ID, $token );
256
  wp_delete_user( $user->ID );
257
 
262
  esc_url_raw(
263
  add_query_arg(
264
  array(
265
+ 'settings-updated' => true,
266
  ),
267
  wp_get_referer() . '#delete'
268
  )
277
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
278
  */
279
  public function anonymize_comments() {
280
+ if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'gdpr-anonymize-comments-action' ) ) { // WPCS: Input var ok.
281
  wp_send_json_error( esc_html__( 'We could not verify the security token. Please try again.', 'gdpr' ) );
282
  }
283
 
284
+ $email = isset( $_POST['user_email'] ) ? sanitize_email( wp_unslash( $_POST['user_email'] ) ) : ''; // WPCS: Input var ok.
285
+ $comment_count = isset( $_POST['comment_count'] ) ? (int) $_POST['comment_count'] : 0; // WPCS: Input var ok.
286
 
287
  $user = get_user_by( 'email', $email );
288
  if ( ! $user instanceof WP_User ) {
289
  wp_send_json_error( esc_html__( 'User not found.', 'gdpr' ) );
290
  }
291
 
292
+ $comments = get_comments(
293
+ array(
294
+ 'author_email' => $user->user_email,
295
+ 'include_unapproved' => true,
296
+ 'number' => $comment_count,
297
+ )
298
+ );
299
 
300
  foreach ( $comments as $comment ) {
301
+ $new_comment = array();
302
+ $new_comment['comment_ID'] = $comment->comment_ID;
303
+ $new_comment['comment_author_IP'] = '0.0.0.0';
304
  $new_comment['comment_author_email'] = '';
305
+ $new_comment['comment_author_url'] = '';
306
+ $new_comment['comment_agent'] = '';
307
+ $new_comment['comment_author'] = esc_html__( 'Guest', 'gdpr' );
308
+ $new_comment['user_id'] = 0;
309
  wp_update_comment( $new_comment );
310
  }
311
  GDPR_Audit_Log::log( $user->ID, esc_html__( 'User comments were anonymized.', 'gdpr' ) );
318
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
319
  */
320
  public function reassign_content() {
321
+ if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'gdpr-reassign-content-action' ) ) { // WPCS: Input var ok.
322
  wp_send_json_error( esc_html__( 'We could not verify the security token. Please try again.', 'gdpr' ) );
323
  }
324
 
325
+ if ( ! isset( $_POST['user_email'], $_POST['reassign_to'], $_POST['post_type'], $_POST['post_count'] ) ) { // WPCS: Input var ok.
326
  wp_send_json_error( esc_html__( 'Essential data missing. Please try again.', 'gdpr' ) );
327
  }
328
 
329
+ $email = sanitize_email( wp_unslash( $_POST['user_email'] ) ); // WPCS: Input var ok.
330
+ $reassign_to = (int) $_POST['reassign_to']; // WPCS: Input var ok.
331
+ $post_type = sanitize_text_field( wp_unslash( $_POST['post_type'] ) ); // WPCS: Input var ok.
332
+ $post_count = (int) $_POST['post_count']; // WPCS: Input var ok.
333
 
334
  $user = get_user_by( 'email', $email );
335
  if ( ! $user instanceof WP_User ) {
337
  }
338
 
339
  $args = array(
340
+ 'author' => $user->ID,
341
+ 'post_type' => $post_type,
342
  'posts_per_page' => $post_count,
343
  );
344
 
346
 
347
  if ( ! empty( $posts ) ) {
348
  foreach ( $posts as $post ) {
349
+ wp_update_post(
350
+ array(
351
+ 'ID' => $post->ID,
352
+ 'post_author' => $reassign_to,
353
+ )
354
+ );
355
  }
356
 
357
  $reassign_to_user = get_user_by( 'ID', $reassign_to );
358
  /* translators: 1: The post type, 2: The user the posts were reassigned to */
359
+ GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'User %1$s were reassigned to %2$s.', 'gdpr' ), $post_type, $reassign_to_user->display_name ) );
360
  wp_send_json_success();
361
  }
362
 
admin/class-gdpr-telemetry.php CHANGED
@@ -44,21 +44,21 @@ class GDPR_Telemetry {
44
  register_post_type(
45
  'telemetry',
46
  array(
47
- 'label' => esc_html__( 'Telemetry', 'gdpr' ),
48
- 'labels' => array(
49
- 'not_found' => esc_html__( 'No items found. Future connections will be shown at this place.', 'gdpr' ),
50
  'not_found_in_trash' => esc_html__( 'No items found in trash.', 'gdpr' ),
51
- 'search_items' => esc_html__( 'Search in destination', 'gdpr' ),
52
  ),
53
- 'public' => false,
54
- 'show_ui' => true,
55
- 'show_in_menu' => false,
56
- 'show_in_nav_menus' => false,
57
- 'query_var' => true, // try setting to false
58
- 'hierarchical' => false,
59
- 'capability_type' => 'post',
60
- 'publicly_queryable' => false,
61
- 'exclude_from_search' => true
62
  )
63
  );
64
  }
@@ -107,7 +107,7 @@ class GDPR_Telemetry {
107
 
108
  /* Extract backtrace data */
109
  $file = str_replace( ABSPATH, '', $backtrace['file'] );
110
- $line = ( int ) $backtrace['line'];
111
 
112
  /* Response code */
113
  $code = ( is_wp_error( $response ) ? -1 : wp_remote_retrieve_response_code( $response ) );
@@ -119,15 +119,17 @@ class GDPR_Telemetry {
119
  }
120
 
121
  /* Insert CPT */
122
- $this->insert_post( array(
123
- 'url' => esc_url_raw($url),
124
- 'code' => $code,
125
- 'host' => $host,
126
- 'file' => $file,
127
- 'line' => $line,
128
- 'meta' => $meta,
129
- 'postdata' => $postdata,
130
- ) );
 
 
131
  }
132
 
133
  /**
@@ -147,13 +149,13 @@ class GDPR_Telemetry {
147
  $post_id = wp_insert_post(
148
  array(
149
  'post_status' => 'publish',
150
- 'post_type' => 'telemetry'
151
  )
152
  );
153
 
154
  /* Add meta values */
155
- foreach( (array) $meta as $key => $value ) {
156
- add_post_meta( $post_id, '_gdpr_telemetry_' .$key, $value, true );
157
  }
158
 
159
  return $post_id;
@@ -173,16 +175,16 @@ class GDPR_Telemetry {
173
  $url = wp_nonce_url(
174
  add_query_arg(
175
  array(
176
- 'action' => 'delete_all',
177
- 'post_type' => 'telemetry',
178
- 'post_status' => 'publish'
179
  ),
180
- admin_url('edit.php')
181
  ),
182
  'bulk-posts'
183
  );
184
  ?>
185
- <a href="<?php echo esc_url( $url ); ?>" class="button"><?php echo esc_html__('Delete all', 'gdpr'); ?></a>
186
  <?php
187
  }
188
 
@@ -198,7 +200,7 @@ class GDPR_Telemetry {
198
  'file' => esc_html__( 'File', 'gdpr' ),
199
  'code' => esc_html__( 'Code', 'gdpr' ),
200
  'created' => esc_html__( 'Time', 'gdpr' ),
201
- 'postdata' => esc_html__( 'Data', 'gdpr')
202
  );
203
  }
204
 
@@ -216,7 +218,7 @@ class GDPR_Telemetry {
216
  'file' => array( __CLASS__, '_html_file' ),
217
  'code' => array( __CLASS__, '_html_code' ),
218
  'created' => array( __CLASS__, '_html_created' ),
219
- 'postdata' => array( __CLASS__, '_html_postdata' )
220
  );
221
 
222
  /* If type exists */
@@ -240,14 +242,14 @@ class GDPR_Telemetry {
240
  */
241
  private static function _html_url( $post_id ) {
242
  /* Init data */
243
- $url = self::_get_post_meta( $post_id, 'url' );
244
  $host = self::_get_post_meta( $post_id, 'host' );
245
 
246
  /* Print output */
247
  echo sprintf(
248
  '<div>%s</div>',
249
- str_replace( $host, '<code>' .$host. '</code>', esc_url( $url ) )
250
- );
251
  }
252
 
253
  /**
@@ -265,10 +267,10 @@ class GDPR_Telemetry {
265
  /* Print output */
266
  echo sprintf(
267
  '<div>%s: %s<br /><code>/%s:%d</code></div>',
268
- $meta['type'],
269
- $meta['name'],
270
- $file,
271
- $line
272
  );
273
  }
274
 
@@ -280,7 +282,7 @@ class GDPR_Telemetry {
280
  * @param int $post_id The post ID.
281
  */
282
  private static function _html_code( $post_id ) {
283
- echo self::_get_post_meta( $post_id, 'code' );
284
  }
285
 
286
  /**
@@ -294,7 +296,7 @@ class GDPR_Telemetry {
294
  /* translators: Amount of time */
295
  echo sprintf(
296
  esc_html__( '%s ago' ),
297
- human_time_diff( get_post_time( 'G', true, $post_id ) )
298
  );
299
  }
300
 
@@ -327,7 +329,7 @@ class GDPR_Telemetry {
327
  /* Thickbox content start */
328
  echo sprintf(
329
  '<div id="gdpr-telemetry-thickbox-%d" class="gdpr-hidden"><pre>',
330
- $post_id
331
  );
332
 
333
  /* POST data */
@@ -339,7 +341,7 @@ class GDPR_Telemetry {
339
  /* Thickbox button */
340
  echo sprintf(
341
  '<a href="#TB_inline?width=400&height=300&inlineId=gdpr-telemetry-thickbox-%d" class="button thickbox">%s</a>',
342
- $post_id,
343
  esc_html__( 'Show', 'gdpr' )
344
  );
345
  }
@@ -354,7 +356,8 @@ class GDPR_Telemetry {
354
  * @return mixed The post meta.
355
  */
356
  private static function _get_post_meta( $post_id, $key ) {
357
- if ( $value = get_post_meta( $post_id, '_gdpr_telemetry_' .$key, true ) ) {
 
358
  return $value;
359
  }
360
 
@@ -373,19 +376,19 @@ class GDPR_Telemetry {
373
  $trace = array_reverse( debug_backtrace() );
374
 
375
  /* Loop items */
376
- foreach( $trace as $index => $item ) {
377
- if ( ! empty( $item['function'] ) && strpos( $item['function'], 'wp_remote_' ) !== false ) {
378
- /* Use prev item */
379
- if ( empty( $item['file'] ) ) {
380
- $item = $trace[-- $index];
381
- }
382
-
383
- /* Get file and line */
384
- if ( ! empty( $item['file'] ) && ! empty( $item['line'] ) ) {
385
- return $item;
386
- }
387
- }
388
- }
389
  }
390
 
391
  /**
@@ -400,7 +403,7 @@ class GDPR_Telemetry {
400
  /* Default */
401
  $meta = array(
402
  'type' => 'WordPress',
403
- 'name' => 'Core'
404
  );
405
 
406
  /* Empty path */
@@ -409,17 +412,17 @@ class GDPR_Telemetry {
409
  }
410
 
411
  /* Search for plugin */
412
- if ( $data = self::_localize_plugin( $path ) ) {
413
  return array(
414
  'type' => 'Plugin',
415
- 'name' => $data['Name'],
416
  );
417
 
418
- /* Search for theme */
419
- } else if ( $data = self::_localize_theme( $path ) ) {
420
  return array(
421
  'type' => 'Theme',
422
- 'name' => $data->get( 'Name' ),
423
  );
424
  }
425
 
@@ -448,14 +451,14 @@ class GDPR_Telemetry {
448
 
449
  /* Frontend */
450
  if ( ! function_exists( 'get_plugins' ) ) {
451
- require_once( ABSPATH. 'wp-admin/includes/plugin.php' );
452
  }
453
 
454
  /* All active plugins */
455
  $plugins = get_plugins();
456
 
457
  /* Loop plugins */
458
- foreach( $plugins as $path => $plugin ) {
459
  if ( 0 === strpos( $path, $folder ) ) {
460
  return $plugin;
461
  }
@@ -503,13 +506,13 @@ class GDPR_Telemetry {
503
  */
504
  private static function _get_postdata( $args ) {
505
  /* No POST data? */
506
- if ( empty( $args['method'] ) OR 'POST' !== $args['method'] ) {
507
- return NULL;
508
  }
509
 
510
  /* No body data? */
511
  if ( empty( $args['body'] ) ) {
512
- return NULL;
513
  }
514
 
515
  return $args['body'];
44
  register_post_type(
45
  'telemetry',
46
  array(
47
+ 'label' => esc_html__( 'Telemetry', 'gdpr' ),
48
+ 'labels' => array(
49
+ 'not_found' => esc_html__( 'No items found. Future connections will be shown at this place.', 'gdpr' ),
50
  'not_found_in_trash' => esc_html__( 'No items found in trash.', 'gdpr' ),
51
+ 'search_items' => esc_html__( 'Search in destination', 'gdpr' ),
52
  ),
53
+ 'public' => false,
54
+ 'show_ui' => true,
55
+ 'show_in_menu' => false,
56
+ 'show_in_nav_menus' => false,
57
+ 'query_var' => true, // try setting to false
58
+ 'hierarchical' => false,
59
+ 'capability_type' => 'post',
60
+ 'publicly_queryable' => false,
61
+ 'exclude_from_search' => true,
62
  )
63
  );
64
  }
107
 
108
  /* Extract backtrace data */
109
  $file = str_replace( ABSPATH, '', $backtrace['file'] );
110
+ $line = (int) $backtrace['line'];
111
 
112
  /* Response code */
113
  $code = ( is_wp_error( $response ) ? -1 : wp_remote_retrieve_response_code( $response ) );
119
  }
120
 
121
  /* Insert CPT */
122
+ $this->insert_post(
123
+ array(
124
+ 'url' => esc_url_raw( $url ),
125
+ 'code' => $code,
126
+ 'host' => $host,
127
+ 'file' => $file,
128
+ 'line' => $line,
129
+ 'meta' => $meta,
130
+ 'postdata' => $postdata,
131
+ )
132
+ );
133
  }
134
 
135
  /**
149
  $post_id = wp_insert_post(
150
  array(
151
  'post_status' => 'publish',
152
+ 'post_type' => 'telemetry',
153
  )
154
  );
155
 
156
  /* Add meta values */
157
+ foreach ( (array) $meta as $key => $value ) {
158
+ add_post_meta( $post_id, '_gdpr_telemetry_' . $key, $value, true );
159
  }
160
 
161
  return $post_id;
175
  $url = wp_nonce_url(
176
  add_query_arg(
177
  array(
178
+ 'action' => 'delete_all',
179
+ 'post_type' => 'telemetry',
180
+ 'post_status' => 'publish',
181
  ),
182
+ admin_url( 'edit.php' )
183
  ),
184
  'bulk-posts'
185
  );
186
  ?>
187
+ <a href="<?php echo esc_url( $url ); ?>" class="button"><?php echo esc_html__( 'Delete all', 'gdpr' ); ?></a>
188
  <?php
189
  }
190
 
200
  'file' => esc_html__( 'File', 'gdpr' ),
201
  'code' => esc_html__( 'Code', 'gdpr' ),
202
  'created' => esc_html__( 'Time', 'gdpr' ),
203
+ 'postdata' => esc_html__( 'Data', 'gdpr' ),
204
  );
205
  }
206
 
218
  'file' => array( __CLASS__, '_html_file' ),
219
  'code' => array( __CLASS__, '_html_code' ),
220
  'created' => array( __CLASS__, '_html_created' ),
221
+ 'postdata' => array( __CLASS__, '_html_postdata' ),
222
  );
223
 
224
  /* If type exists */
242
  */
243
  private static function _html_url( $post_id ) {
244
  /* Init data */
245
+ $url = self::_get_post_meta( $post_id, 'url' );
246
  $host = self::_get_post_meta( $post_id, 'host' );
247
 
248
  /* Print output */
249
  echo sprintf(
250
  '<div>%s</div>',
251
+ str_replace( $host, '<code>' . $host . '</code>', esc_url( $url ) )
252
+ ); // WPCS: XSS ok.
253
  }
254
 
255
  /**
267
  /* Print output */
268
  echo sprintf(
269
  '<div>%s: %s<br /><code>/%s:%d</code></div>',
270
+ esc_html( $meta['type'] ),
271
+ esc_html( $meta['name'] ),
272
+ esc_html( $file ),
273
+ esc_html( $line )
274
  );
275
  }
276
 
282
  * @param int $post_id The post ID.
283
  */
284
  private static function _html_code( $post_id ) {
285
+ echo esc_html( self::_get_post_meta( $post_id, 'code' ) );
286
  }
287
 
288
  /**
296
  /* translators: Amount of time */
297
  echo sprintf(
298
  esc_html__( '%s ago' ),
299
+ esc_html( human_time_diff( get_post_time( 'G', true, $post_id ) ) )
300
  );
301
  }
302
 
329
  /* Thickbox content start */
330
  echo sprintf(
331
  '<div id="gdpr-telemetry-thickbox-%d" class="gdpr-hidden"><pre>',
332
+ absint( $post_id )
333
  );
334
 
335
  /* POST data */
341
  /* Thickbox button */
342
  echo sprintf(
343
  '<a href="#TB_inline?width=400&height=300&inlineId=gdpr-telemetry-thickbox-%d" class="button thickbox">%s</a>',
344
+ absint( $post_id ),
345
  esc_html__( 'Show', 'gdpr' )
346
  );
347
  }
356
  * @return mixed The post meta.
357
  */
358
  private static function _get_post_meta( $post_id, $key ) {
359
+ $value = get_post_meta( $post_id, '_gdpr_telemetry_' . $key, true );
360
+ if ( $value ) {
361
  return $value;
362
  }
363
 
376
  $trace = array_reverse( debug_backtrace() );
377
 
378
  /* Loop items */
379
+ foreach ( $trace as $index => $item ) {
380
+ if ( ! empty( $item['function'] ) && strpos( $item['function'], 'wp_remote_' ) !== false ) {
381
+ /* Use prev item */
382
+ if ( empty( $item['file'] ) ) {
383
+ $item = $trace[ -- $index ];
384
+ }
385
+
386
+ /* Get file and line */
387
+ if ( ! empty( $item['file'] ) && ! empty( $item['line'] ) ) {
388
+ return $item;
389
+ }
390
+ }
391
+ }
392
  }
393
 
394
  /**
403
  /* Default */
404
  $meta = array(
405
  'type' => 'WordPress',
406
+ 'name' => 'Core',
407
  );
408
 
409
  /* Empty path */
412
  }
413
 
414
  /* Search for plugin */
415
+ if ( self::_localize_plugin( $path ) ) {
416
  return array(
417
  'type' => 'Plugin',
418
+ 'name' => self::_localize_plugin( $path )['Name'],
419
  );
420
 
421
+ /* Search for theme */
422
+ } elseif ( self::_localize_theme( $path ) ) {
423
  return array(
424
  'type' => 'Theme',
425
+ 'name' => self::_localize_theme( $path )->get( 'Name' ),
426
  );
427
  }
428
 
451
 
452
  /* Frontend */
453
  if ( ! function_exists( 'get_plugins' ) ) {
454
+ require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
455
  }
456
 
457
  /* All active plugins */
458
  $plugins = get_plugins();
459
 
460
  /* Loop plugins */
461
+ foreach ( $plugins as $path => $plugin ) {
462
  if ( 0 === strpos( $path, $folder ) ) {
463
  return $plugin;
464
  }
506
  */
507
  private static function _get_postdata( $args ) {
508
  /* No POST data? */
509
+ if ( empty( $args['method'] ) or 'POST' !== $args['method'] ) {
510
+ return null;
511
  }
512
 
513
  /* No body data? */
514
  if ( empty( $args['body'] ) ) {
515
+ return null;
516
  }
517
 
518
  return $args['body'];
admin/partials/requests.php CHANGED
@@ -19,9 +19,9 @@
19
  <?php settings_errors(); ?>
20
  <div class="nav-tab-wrapper">
21
  <?php foreach ( $tabs as $key => $value ) : ?>
22
- <a href="<?php echo '#' . $key; ?>" class="nav-tab">
23
  <?php echo esc_html( $value['name'] ); ?>
24
- <?php if ( $value['count'] ): ?>
25
  <span class="gdpr-pending-requests-badge"><?php echo esc_html( $value['count'] ); ?></span>
26
  <?php endif ?>
27
  </a>
@@ -29,7 +29,7 @@
29
  </div>
30
 
31
  <div class="gdpr-tab hidden" data-id="rectify">
32
- <h2><?php esc_html_e( 'Rectify Data', 'gdpr' ) ?></h2>
33
  <table class="widefat gdpr-request-table">
34
  <thead>
35
  <tr>
@@ -40,33 +40,42 @@
40
  </tr>
41
  </thead>
42
  <tbody>
43
- <?php if ( isset( $rectify ) && ! empty( $rectify ) ): ?>
44
- <?php foreach ( $rectify as $i => $request ): ?>
45
  <tr>
46
  <td class="row-title"><?php echo esc_html( $request['email'] ); ?></td>
47
  <td class="text-center"><?php echo esc_html( $request['date'] ); ?></td>
48
- <td class="text-center"><?php echo wp_kses( wpautop( wp_unslash( $request['data'] ) ), array( 'p' => true, 'br' => true ) ); ?></td>
49
  <td class="text-center">
50
- <form class="frm-process-rectification" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" method="post">
 
 
 
 
 
 
 
 
 
 
51
  <?php wp_nonce_field( 'gdpr-request-nonce', 'gdpr_cancel_rectify_nonce' ); ?>
52
  <input type="hidden" name="action" value="gdpr_cancel_request">
53
  <input type="hidden" name="type" value="rectify">
54
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
55
- <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ) ?>">
56
- <?php submit_button( esc_html__( 'Cancel Request', 'gdpr' ), 'delete', '', false ) ?>
57
  </form>
58
- <form class="frm-process-rectification" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" method="post">
59
  <?php wp_nonce_field( 'gdpr-mark-as-resolved', 'gdpr_rectify_mark_resolved_nonce' ); ?>
60
  <input type="hidden" name="action" value="gdpr_mark_resolved">
61
  <input type="hidden" name="type" value="rectify">
62
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
63
- <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ) ?>">
64
- <?php submit_button( esc_html__( 'Mark as Resolved', 'gdpr' ), 'primary', '', false ) ?>
65
  </form>
66
  </td>
67
  </tr>
68
  <?php endforeach ?>
69
- <?php else: ?>
70
  <tr>
71
  <td colspan="4" class="text-center">
72
  <?php esc_html_e( 'No pending requests', 'gdpr' ); ?>
@@ -86,7 +95,7 @@
86
  </div>
87
 
88
  <div class="gdpr-tab hidden" data-id="complaint">
89
- <h2><?php esc_html_e( 'Complaints', 'gdpr' ) ?></h2>
90
  <table class="widefat gdpr-request-table">
91
  <thead>
92
  <tr>
@@ -97,33 +106,33 @@
97
  </tr>
98
  </thead>
99
  <tbody>
100
- <?php if ( isset( $complaint ) && ! empty( $complaint ) ): ?>
101
- <?php foreach ( $complaint as $i => $request ): ?>
102
  <tr>
103
  <td class="row-title"><?php echo esc_html( $request['email'] ); ?></td>
104
  <td class="text-center"><?php echo esc_html( $request['date'] ); ?></td>
105
  <td class="text-center"><?php echo esc_html( wp_unslash( $request['data'] ) ); ?></td>
106
  <td class="text-center">
107
- <form class="frm-process-complaint" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" method="post">
108
  <?php wp_nonce_field( 'gdpr-request-nonce', 'gdpr_cancel_complaint_nonce' ); ?>
109
  <input type="hidden" name="action" value="gdpr_cancel_request">
110
  <input type="hidden" name="type" value="complaint">
111
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
112
- <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ) ?>">
113
- <?php submit_button( esc_html__( 'Cancel Request', 'gdpr' ), 'delete', '', false ) ?>
114
  </form>
115
- <form class="frm-process-complaint" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" method="post">
116
  <?php wp_nonce_field( 'gdpr-mark-as-resolved', 'gdpr_complaint_mark_resolved_nonce' ); ?>
117
  <input type="hidden" name="action" value="gdpr_mark_resolved">
118
  <input type="hidden" name="type" value="complaint">
119
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
120
- <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ) ?>">
121
- <?php submit_button( esc_html__( 'Mark as Resolved', 'gdpr' ), 'primary', '', false ) ?>
122
  </form>
123
  </td>
124
  </tr>
125
  <?php endforeach ?>
126
- <?php else: ?>
127
  <tr>
128
  <td colspan="4" class="text-center">
129
  <?php esc_html_e( 'No pending requests', 'gdpr' ); ?>
@@ -143,9 +152,9 @@
143
  </div>
144
 
145
  <div class="gdpr-tab hidden" data-id="delete">
146
- <h2><?php esc_html_e( 'Right to erasure', 'gdpr' ) ?></h2>
147
  <div class="postbox not-full">
148
- <form class="gdpr-manual-email-lookup" method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>">
149
  <div class="inside">
150
  <input type="hidden" name="action" value="gdpr_add_to_deletion_requests">
151
  <?php wp_nonce_field( 'gdpr-add-to-deletion-requests', 'gdpr_deletion_requests_nonce' ); ?>
@@ -167,11 +176,11 @@
167
  </tr>
168
  </thead>
169
  <tbody>
170
- <?php if ( isset( $delete ) && ! empty( $delete ) ): ?>
171
  <?php $index = 0; ?>
172
- <?php foreach ( $delete as $i => $request ): ?>
173
- <?php $user = get_user_by( 'email', $request['email'] ) ?>
174
- <tr class="<?php echo ( $index % 2 == 0 ? '' : 'alternate' ); ?>">
175
  <td class="row-title"><?php echo esc_html( $request['email'] ); ?></td>
176
  <td class="text-center"><?php echo esc_html( $request['date'] ); ?></td>
177
  <td class="text-center">
@@ -182,30 +191,29 @@
182
  esc_html_e( 'No content to review', 'gdpr' );
183
  }
184
  ?>
185
- <?php if ( GDPR_Requests::user_has_content( $user ) ): ?>
186
- <?php else: ?>
187
- <?php ?>
188
- <?php endif; ?>
189
  </td>
190
  <td class="text-center">
191
- <form class="frm-process-user-deletion" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" method="post">
192
  <?php wp_nonce_field( 'gdpr-request-nonce', 'gdpr_cancel_delete_nonce' ); ?>
193
  <input type="hidden" name="action" value="gdpr_cancel_request">
194
  <input type="hidden" name="type" value="delete">
195
- <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ) ?>">
196
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
197
- <?php submit_button( esc_html__( 'Cancel Request', 'gdpr' ), 'delete', '', false ) ?>
198
  </form>
199
- <form class="frm-process-user-deletion" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>" method="post">
200
  <?php wp_nonce_field( 'gdpr-request-delete-user', 'gdpr_delete_user' ); ?>
201
  <input type="hidden" name="action" value="gdpr_delete_user">
202
- <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ) ?>">
203
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
204
- <?php submit_button( esc_html__( 'Delete User', 'gdpr' ), 'primary', '', false ) ?>
205
  </form>
206
  </td>
207
  </tr>
208
- <?php if ( GDPR_Requests::user_has_content( $user ) ): ?>
209
  <tr class="review" data-index="<?php echo esc_attr( $index ); ?>">
210
  <td colspan="4">
211
  <div class="hidden">
@@ -213,44 +221,44 @@
213
  <thead>
214
  <tr>
215
  <th><?php esc_html_e( 'Content Type', 'gdpr' ); ?></th>
216
- <th class="text-center"><?php _e( 'Count', 'gdpr' ); ?></th>
217
- <th class="text-center"><?php _e( 'Review', 'gdpr' ); ?></th>
218
- <th class="text-center"><?php _e( 'Reassign', 'gdpr' ); ?></th>
219
- <th class="text-center"><?php _e( 'Action', 'gdpr' ); ?></th>
220
  </tr>
221
  </thead>
222
  <tbody>
223
  <?php $post_types = get_post_types( array( 'public' => true ), 'objects' ); ?>
224
- <?php foreach ( $post_types as $pt ): ?>
225
  <?php
226
  $uid = get_user_by( 'email', $request['email'] );
227
- if ( $uid && $uid instanceof WP_User ) {
228
- $uid = $uid->ID;
229
- }
230
  $count = count_user_posts( $uid, $pt->name );
231
- if ( '0' === $count) {
232
- continue;
233
- }
234
  ?>
235
  <tr>
236
- <td class="row-title"><?php echo esc_attr( $pt->label ) ?></td>
237
- <td class="text-center"><?php echo esc_attr( $count ) ?></td>
238
  <td class="text-center">
239
- <a href="<?php echo admin_url('edit.php?post_type=' . $pt->name . '&author=' . $uid); ?>" target="_blank" class="button"><?php echo esc_html( $pt->labels->view_items ); ?></a>
240
  </td>
241
  <td class="text-center">
242
  <select name="reassign" class="gdpr-reassign">
243
  <option value="0"></option>
244
  <?php $admins = get_users( array( 'role' => 'administrator' ) ); ?>
245
- <?php foreach ( $admins as $admin ): ?>
246
- <option value="<?php echo esc_attr( $admin->ID ) ?>"><?php echo esc_html( $admin->display_name ) ?></option>
247
  <?php endforeach; ?>
248
  </select>
249
  </td>
250
  <td class="text-center">
251
  <form method="post" class="gdpr-reassign-content">
252
- <?php wp_nonce_field( 'gdpr-reassign-content-action', 'gdpr_reassign_content_nonce' ) ?>
253
- <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ) ?>">
254
  <input type="hidden" name="reassign_to" value="">
255
  <input type="hidden" name="post_type" value="<?php echo esc_attr( $pt->name ); ?>">
256
  <input type="hidden" name="post_count" value="<?php echo esc_attr( $count ); ?>">
@@ -263,32 +271,34 @@
263
  </tr>
264
  <?php endforeach; ?>
265
  <?php
266
- $comment_count = get_comments( array(
267
- 'author_email' => $request['email'],
268
- 'include_unapproved' => true,
269
- 'count' => true,
270
- ) );
 
 
271
 
272
- if ( $comment_count ) {
273
- ?>
274
- <tr>
275
- <td class="row-title"><?php esc_html_e( 'Comments', 'gdpr' ); ?></td>
276
- <td class="text-center"><?php echo esc_html( $comment_count ); ?></td>
277
- <td class="text-center"><a href="<?php echo admin_url( 'edit-comments.php?comment_status=all&s=' . urlencode( $request['email'] ) ); ?>" target="_blank" class="button"><?php _e( 'View Comments', 'gdpr' ); ?></a></td>
278
- <td></td>
279
- <td class="text-center">
280
- <form method="post" class="gdpr-anonymize-comments">
281
- <?php wp_nonce_field( 'gdpr-anonymize-comments-action', 'gdpr_anonymize_comments_nonce' ) ?>
282
- <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ) ?>">
283
- <input type="hidden" name="comment_count" value="<?php echo esc_attr( $comment_count ) ?>">
284
- <?php submit_button( esc_html__( 'Anonymize', 'gdpr' ), 'primary', '', false ) ?>
285
- <span class="spinner"></span>
286
- <p class="hidden"><strong><?php esc_html_e( 'Resolved', 'gdpr' ); ?></strong></p>
287
- </form>
288
- </td>
289
- </tr>
290
  <?php
291
- }
292
  ?>
293
  </tbody>
294
  <tr>
@@ -300,7 +310,7 @@
300
  <?php endif ?>
301
  <?php $index++; ?>
302
  <?php endforeach; ?>
303
- <?php else: ?>
304
  <tr>
305
  <td colspan="4" class="text-center">
306
  <?php esc_html_e( 'No pending requests', 'gdpr' ); ?>
19
  <?php settings_errors(); ?>
20
  <div class="nav-tab-wrapper">
21
  <?php foreach ( $tabs as $key => $value ) : ?>
22
+ <a href="<?php echo esc_html( '#' . $key ); ?>" class="nav-tab">
23
  <?php echo esc_html( $value['name'] ); ?>
24
+ <?php if ( $value['count'] ) : ?>
25
  <span class="gdpr-pending-requests-badge"><?php echo esc_html( $value['count'] ); ?></span>
26
  <?php endif ?>
27
  </a>
29
  </div>
30
 
31
  <div class="gdpr-tab hidden" data-id="rectify">
32
+ <h2><?php esc_html_e( 'Rectify Data', 'gdpr' ); ?></h2>
33
  <table class="widefat gdpr-request-table">
34
  <thead>
35
  <tr>
40
  </tr>
41
  </thead>
42
  <tbody>
43
+ <?php if ( isset( $rectify ) && ! empty( $rectify ) ) : ?>
44
+ <?php foreach ( $rectify as $i => $request ) : ?>
45
  <tr>
46
  <td class="row-title"><?php echo esc_html( $request['email'] ); ?></td>
47
  <td class="text-center"><?php echo esc_html( $request['date'] ); ?></td>
 
48
  <td class="text-center">
49
+ <?php
50
+ echo wp_kses(
51
+ wpautop( wp_unslash( $request['data'] ) ), array(
52
+ 'p' => true,
53
+ 'br' => true,
54
+ )
55
+ );
56
+ ?>
57
+ </td>
58
+ <td class="text-center">
59
+ <form class="frm-process-rectification" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post">
60
  <?php wp_nonce_field( 'gdpr-request-nonce', 'gdpr_cancel_rectify_nonce' ); ?>
61
  <input type="hidden" name="action" value="gdpr_cancel_request">
62
  <input type="hidden" name="type" value="rectify">
63
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
64
+ <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ); ?>">
65
+ <?php submit_button( esc_html__( 'Cancel Request', 'gdpr' ), 'delete', '', false ); ?>
66
  </form>
67
+ <form class="frm-process-rectification" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post">
68
  <?php wp_nonce_field( 'gdpr-mark-as-resolved', 'gdpr_rectify_mark_resolved_nonce' ); ?>
69
  <input type="hidden" name="action" value="gdpr_mark_resolved">
70
  <input type="hidden" name="type" value="rectify">
71
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
72
+ <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ); ?>">
73
+ <?php submit_button( esc_html__( 'Mark as Resolved', 'gdpr' ), 'primary', '', false ); ?>
74
  </form>
75
  </td>
76
  </tr>
77
  <?php endforeach ?>
78
+ <?php else : ?>
79
  <tr>
80
  <td colspan="4" class="text-center">
81
  <?php esc_html_e( 'No pending requests', 'gdpr' ); ?>
95
  </div>
96
 
97
  <div class="gdpr-tab hidden" data-id="complaint">
98
+ <h2><?php esc_html_e( 'Complaints', 'gdpr' ); ?></h2>
99
  <table class="widefat gdpr-request-table">
100
  <thead>
101
  <tr>
106
  </tr>
107
  </thead>
108
  <tbody>
109
+ <?php if ( isset( $complaint ) && ! empty( $complaint ) ) : ?>
110
+ <?php foreach ( $complaint as $i => $request ) : ?>
111
  <tr>
112
  <td class="row-title"><?php echo esc_html( $request['email'] ); ?></td>
113
  <td class="text-center"><?php echo esc_html( $request['date'] ); ?></td>
114
  <td class="text-center"><?php echo esc_html( wp_unslash( $request['data'] ) ); ?></td>
115
  <td class="text-center">
116
+ <form class="frm-process-complaint" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post">
117
  <?php wp_nonce_field( 'gdpr-request-nonce', 'gdpr_cancel_complaint_nonce' ); ?>
118
  <input type="hidden" name="action" value="gdpr_cancel_request">
119
  <input type="hidden" name="type" value="complaint">
120
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
121
+ <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ); ?>">
122
+ <?php submit_button( esc_html__( 'Cancel Request', 'gdpr' ), 'delete', '', false ); ?>
123
  </form>
124
+ <form class="frm-process-complaint" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post">
125
  <?php wp_nonce_field( 'gdpr-mark-as-resolved', 'gdpr_complaint_mark_resolved_nonce' ); ?>
126
  <input type="hidden" name="action" value="gdpr_mark_resolved">
127
  <input type="hidden" name="type" value="complaint">
128
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
129
+ <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ); ?>">
130
+ <?php submit_button( esc_html__( 'Mark as Resolved', 'gdpr' ), 'primary', '', false ); ?>
131
  </form>
132
  </td>
133
  </tr>
134
  <?php endforeach ?>
135
+ <?php else : ?>
136
  <tr>
137
  <td colspan="4" class="text-center">
138
  <?php esc_html_e( 'No pending requests', 'gdpr' ); ?>
152
  </div>
153
 
154
  <div class="gdpr-tab hidden" data-id="delete">
155
+ <h2><?php esc_html_e( 'Right to erasure', 'gdpr' ); ?></h2>
156
  <div class="postbox not-full">
157
+ <form class="gdpr-manual-email-lookup" method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
158
  <div class="inside">
159
  <input type="hidden" name="action" value="gdpr_add_to_deletion_requests">
160
  <?php wp_nonce_field( 'gdpr-add-to-deletion-requests', 'gdpr_deletion_requests_nonce' ); ?>
176
  </tr>
177
  </thead>
178
  <tbody>
179
+ <?php if ( isset( $delete ) && ! empty( $delete ) ) : ?>
180
  <?php $index = 0; ?>
181
+ <?php foreach ( $delete as $i => $request ) : ?>
182
+ <?php $user = get_user_by( 'email', $request['email'] ); ?>
183
+ <tr class="<?php echo ( 0 === $index % 2 ? '' : 'alternate' ); ?>">
184
  <td class="row-title"><?php echo esc_html( $request['email'] ); ?></td>
185
  <td class="text-center"><?php echo esc_html( $request['date'] ); ?></td>
186
  <td class="text-center">
191
  esc_html_e( 'No content to review', 'gdpr' );
192
  }
193
  ?>
194
+ <?php if ( GDPR_Requests::user_has_content( $user ) ) : ?>
195
+ <?php else : ?>
196
+ <?php endif; ?>
 
197
  </td>
198
  <td class="text-center">
199
+ <form class="frm-process-user-deletion" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post">
200
  <?php wp_nonce_field( 'gdpr-request-nonce', 'gdpr_cancel_delete_nonce' ); ?>
201
  <input type="hidden" name="action" value="gdpr_cancel_request">
202
  <input type="hidden" name="type" value="delete">
203
+ <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ); ?>">
204
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
205
+ <?php submit_button( esc_html__( 'Cancel Request', 'gdpr' ), 'delete', '', false ); ?>
206
  </form>
207
+ <form class="frm-process-user-deletion" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>" method="post">
208
  <?php wp_nonce_field( 'gdpr-request-delete-user', 'gdpr_delete_user' ); ?>
209
  <input type="hidden" name="action" value="gdpr_delete_user">
210
+ <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ); ?>">
211
  <input type="hidden" name="index" value="<?php echo esc_attr( $i ); ?>">
212
+ <?php submit_button( esc_html__( 'Delete User', 'gdpr' ), 'primary', '', false ); ?>
213
  </form>
214
  </td>
215
  </tr>
216
+ <?php if ( GDPR_Requests::user_has_content( $user ) ) : ?>
217
  <tr class="review" data-index="<?php echo esc_attr( $index ); ?>">
218
  <td colspan="4">
219
  <div class="hidden">
221
  <thead>
222
  <tr>
223
  <th><?php esc_html_e( 'Content Type', 'gdpr' ); ?></th>
224
+ <th class="text-center"><?php esc_html_e( 'Count', 'gdpr' ); ?></th>
225
+ <th class="text-center"><?php esc_html_e( 'Review', 'gdpr' ); ?></th>
226
+ <th class="text-center"><?php esc_html_e( 'Reassign', 'gdpr' ); ?></th>
227
+ <th class="text-center"><?php esc_html_e( 'Action', 'gdpr' ); ?></th>
228
  </tr>
229
  </thead>
230
  <tbody>
231
  <?php $post_types = get_post_types( array( 'public' => true ), 'objects' ); ?>
232
+ <?php foreach ( $post_types as $pt ) : ?>
233
  <?php
234
  $uid = get_user_by( 'email', $request['email'] );
235
+ if ( $uid && $uid instanceof WP_User ) {
236
+ $uid = $uid->ID;
237
+ }
238
  $count = count_user_posts( $uid, $pt->name );
239
+ if ( '0' === $count ) {
240
+ continue;
241
+ }
242
  ?>
243
  <tr>
244
+ <td class="row-title"><?php echo esc_attr( $pt->label ); ?></td>
245
+ <td class="text-center"><?php echo esc_attr( $count ); ?></td>
246
  <td class="text-center">
247
+ <a href="<?php echo esc_url( admin_url( 'edit.php?post_type=' . $pt->name . '&author=' . $uid ) ); ?>" target="_blank" class="button"><?php echo esc_html( $pt->labels->view_items ); ?></a>
248
  </td>
249
  <td class="text-center">
250
  <select name="reassign" class="gdpr-reassign">
251
  <option value="0"></option>
252
  <?php $admins = get_users( array( 'role' => 'administrator' ) ); ?>
253
+ <?php foreach ( $admins as $admin ) : ?>
254
+ <option value="<?php echo esc_attr( $admin->ID ); ?>"><?php echo esc_html( $admin->display_name ); ?></option>
255
  <?php endforeach; ?>
256
  </select>
257
  </td>
258
  <td class="text-center">
259
  <form method="post" class="gdpr-reassign-content">
260
+ <?php wp_nonce_field( 'gdpr-reassign-content-action', 'gdpr_reassign_content_nonce' ); ?>
261
+ <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ); ?>">
262
  <input type="hidden" name="reassign_to" value="">
263
  <input type="hidden" name="post_type" value="<?php echo esc_attr( $pt->name ); ?>">
264
  <input type="hidden" name="post_count" value="<?php echo esc_attr( $count ); ?>">
271
  </tr>
272
  <?php endforeach; ?>
273
  <?php
274
+ $comment_count = get_comments(
275
+ array(
276
+ 'author_email' => $request['email'],
277
+ 'include_unapproved' => true,
278
+ 'count' => true,
279
+ )
280
+ );
281
 
282
+ if ( $comment_count ) {
283
+ ?>
284
+ <tr>
285
+ <td class="row-title"><?php esc_html_e( 'Comments', 'gdpr' ); ?></td>
286
+ <td class="text-center"><?php echo esc_html( $comment_count ); ?></td>
287
+ <td class="text-center"><a href="<?php echo esc_url( admin_url( 'edit-comments.php?comment_status=all&s=' . rawurlencode( $request['email'] ) ) ); ?>" target="_blank" class="button"><?php esc_html_e( 'View Comments', 'gdpr' ); ?></a></td>
288
+ <td></td>
289
+ <td class="text-center">
290
+ <form method="post" class="gdpr-anonymize-comments">
291
+ <?php wp_nonce_field( 'gdpr-anonymize-comments-action', 'gdpr_anonymize_comments_nonce' ); ?>
292
+ <input type="hidden" name="user_email" value="<?php echo esc_attr( $request['email'] ); ?>">
293
+ <input type="hidden" name="comment_count" value="<?php echo esc_attr( $comment_count ); ?>">
294
+ <?php submit_button( esc_html__( 'Anonymize', 'gdpr' ), 'primary', '', false ); ?>
295
+ <span class="spinner"></span>
296
+ <p class="hidden"><strong><?php esc_html_e( 'Resolved', 'gdpr' ); ?></strong></p>
297
+ </form>
298
+ </td>
299
+ </tr>
300
  <?php
301
+ }
302
  ?>
303
  </tbody>
304
  <tr>
310
  <?php endif ?>
311
  <?php $index++; ?>
312
  <?php endforeach; ?>
313
+ <?php else : ?>
314
  <tr>
315
  <td colspan="4" class="text-center">
316
  <?php esc_html_e( 'No pending requests', 'gdpr' ); ?>
admin/partials/settings.php CHANGED
@@ -11,7 +11,7 @@
11
  <tbody>
12
  <tr>
13
  <th scope="row">
14
- <label for="gdpr_email_limit"><?php esc_html_e( 'Outgoing email limit', 'gdpr' ) ?>:</label>
15
  <span class="screen-reader-text"><?php esc_attr_e( 'This is the hourly outgoing email limit set by your server.', 'gdpr' ); ?></span>
16
  <span data-tooltip="<?php esc_attr_e( 'This is the hourly outgoing email limit set by your server.', 'gdpr' ); ?>">
17
  <span class="dashicons dashicons-info"></span>
@@ -25,7 +25,7 @@
25
  </tr>
26
  <tr>
27
  <th scope="row">
28
- <label for="gdpr_deletion_needs_review"><?php esc_html_e( 'User deletion', 'gdpr' ) ?>:</label>
29
  <span class="screen-reader-text"><?php esc_attr_e( 'Useful if you need to remove the user from third-party services.', 'gdpr' ); ?></span>
30
  <span data-tooltip="<?php esc_attr_e( 'Useful if you need to remove the user from third-party services.', 'gdpr' ); ?>">
31
  <span class="dashicons dashicons-info"></span>
@@ -38,7 +38,7 @@
38
  </tr>
39
  <tr>
40
  <th scope="row">
41
- <label for="gdpr_refresh_after_preferences_update"><?php esc_html_e( 'Refresh page after updating preferences', 'gdpr' ) ?>:</label>
42
  </th>
43
  <td>
44
  <?php $refresh_page = get_option( 'gdpr_refresh_after_preferences_update', false ); ?>
@@ -48,7 +48,7 @@
48
  </tr>
49
  <tr>
50
  <th scope="row">
51
- <label for="gdpr_disable_css"><?php esc_html_e( 'Disable CSS', 'gdpr' ) ?>:</label>
52
  </th>
53
  <td>
54
  <?php $disable_css = get_option( 'gdpr_disable_css', false ); ?>
@@ -57,7 +57,7 @@
57
  </tr>
58
  <tr>
59
  <th scope="row">
60
- <label for="gdpr_enable_telemetry_tracker"><?php esc_html_e( 'Enable the Telemetry Tracker', 'gdpr' ) ?>:</label>
61
  <span class="screen-reader-text"><?php esc_attr_e( 'This tracks data that is being sent to outside servers.', 'gdpr' ); ?></span>
62
  <span data-tooltip="<?php esc_attr_e( 'This tracks data that is being sent to outside servers.', 'gdpr' ); ?>">
63
  <span class="dashicons dashicons-info"></span>
@@ -73,13 +73,13 @@
73
  <hr>
74
  <h2 class="title"><?php esc_html_e( 'Privacy Center', 'gdpr' ); ?></h2>
75
  <p>
76
- <?php esc_html_e( 'This section handles the privacy bar and some of the privacy preferences window.', 'gdpr' ) ?><br>
77
- <strong><?php esc_html_e( 'Important:', 'gdpr' ); ?></strong> <?php esc_html_e( 'If the privacy banner text is not filled out, the privacy banner will not show up. Even if you registered your cookies.', 'gdpr' ) ?></p>
78
  <table class="form-table">
79
  <tbody>
80
  <tr>
81
  <th scope="row">
82
- <label for="gdpr_enable_privacy_bar"><?php esc_html_e( 'Enable the Privacy Bar', 'gdpr' ) ?>:</label>
83
  </th>
84
  <td>
85
  <?php $enable_privacy_bar = get_option( 'gdpr_enable_privacy_bar', true ); ?>
@@ -88,7 +88,7 @@
88
  </tr>
89
  <tr>
90
  <th scope="row">
91
- <label for="gdpr_display_cookie_categories_in_bar"><?php esc_html_e( 'Display the cookie categories in the privacy bar', 'gdpr' ) ?>:</label>
92
  </th>
93
  <td>
94
  <?php $display_cookie_cat_checkboxes = get_option( 'gdpr_display_cookie_categories_in_bar', false ); ?>
@@ -97,7 +97,7 @@
97
  </tr>
98
  <tr>
99
  <th scope="row">
100
- <label for="gdpr_cookie_banner_content"><?php esc_html_e( 'Privacy Bar Content', 'gdpr' ) ?>:</label>
101
  <span class="screen-reader-text"><?php esc_attr_e( 'This is required if you want the privacy bar to show up.', 'gdpr' ); ?></span>
102
  <span data-tooltip="<?php esc_attr_e( 'This is required if you want the privacy bar to show up.', 'gdpr' ); ?>">
103
  <span class="dashicons dashicons-info"></span>
@@ -110,7 +110,7 @@
110
  </tr>
111
  <tr>
112
  <th scope="row">
113
- <label for="gdpr_cookie_privacy_excerpt"><?php esc_html_e( 'Privacy Excerpt', 'gdpr' ) ?>:</label>
114
  <span class="screen-reader-text"><?php esc_attr_e( 'This show up in the privacy preferences window.', 'gdpr' ); ?></span>
115
  <span data-tooltip="<?php esc_attr_e( 'This show up in the privacy preferences window.', 'gdpr' ); ?>">
116
  <span class="dashicons dashicons-info"></span>
@@ -128,16 +128,19 @@
128
  <h2 class="title"><?php esc_html_e( 'Request Forms reCAPTCHA', 'gdpr' ); ?></h2>
129
  <p><?php esc_html_e( 'To prevent spam attacks, you have the option to enable reCAPTCHA. Configure below your keys to make it work with our request forms.', 'gdpr' ); ?></p>
130
  <p>
131
- <?php echo sprintf(
 
132
  /* translators: External link with instructions on how to proceed. */
133
  esc_html__( 'You can find the necessary information %s.', 'gdpr' ),
134
  '<a href="https://www.google.com/recaptcha/admin" target="_blank">' . esc_html__( 'here', 'gdpr' ) . '</a>'
135
- ) ?></p>
 
 
136
  <table class="form-table">
137
  <tbody>
138
  <tr>
139
  <th scope="row">
140
- <label for="gdpr_use_recaptcha"><?php esc_html_e( 'Enable reCAPTCHA', 'gdpr' ) ?>:</label>
141
  </th>
142
  <td>
143
  <?php $use_recaptcha = get_option( 'gdpr_use_recaptcha', false ); ?>
@@ -146,7 +149,7 @@
146
  </tr>
147
  <tr>
148
  <th scope="row">
149
- <label for="gdpr_recaptcha_site_key"><?php esc_html_e( 'Site Key', 'gdpr' ) ?>:</label>
150
  </th>
151
  <td>
152
  <?php $site_key = get_option( 'gdpr_recaptcha_site_key', '' ); ?>
@@ -155,7 +158,7 @@
155
  </tr>
156
  <tr>
157
  <th scope="row">
158
- <label for="gdpr_recaptcha_secret_key"><?php esc_html_e( 'Secret Key', 'gdpr' ) ?>:</label>
159
  </th>
160
  <td>
161
  <?php $secret_key = get_option( 'gdpr_recaptcha_secret_key', '' ); ?>
@@ -164,14 +167,14 @@
164
  </tr>
165
  </tbody>
166
  </table>
167
- <?php if ( class_exists( 'WooCommerce' ) ): ?>
168
  <hr>
169
  <h2 class="title"><?php esc_html_e( 'WooCommerce', 'gdpr' ); ?></h2>
170
  <table class="form-table">
171
  <tbody>
172
  <tr>
173
  <th scope="row">
174
- <label for="gdpr_add_consent_checkboxes_registration"><?php esc_html_e( 'Add consent checkboxes to the registration page', 'gdpr' ) ?>:</label>
175
  </th>
176
  <td>
177
  <?php $add_checkboxes_to_registration = get_option( 'gdpr_add_consent_checkboxes_registration', false ); ?>
@@ -180,7 +183,7 @@
180
  </tr>
181
  <tr>
182
  <th scope="row">
183
- <label for="gdpr_add_consent_checkboxes_checkout"><?php esc_html_e( 'Add consent checkboxes to the checkout registration form', 'gdpr' ) ?>:</label>
184
  </th>
185
  <td>
186
  <?php $add_checkboxes_to_checkout = get_option( 'gdpr_add_consent_checkboxes_checkout', false ); ?>
@@ -192,13 +195,13 @@
192
  <?php endif ?>
193
 
194
  <hr>
195
- <h2><?php esc_html_e( 'Cookies', 'gdpr' ) ?></h2>
196
  <input type="text" id="cookie-tabs" class="regular-text" placeholder="<?php esc_attr_e( 'Category name', 'gdpr' ); ?>">
197
- <button class="button button-primary add-tab"><?php esc_html_e( 'Add tab', 'gdpr' ); ?></button>
198
  <div id="gdpr-cookie-categories">
199
- <?php foreach ( $registered_cookies as $cat_id => $cookie_cat ): ?>
200
  <div class="postbox" id="cookie-tab-content-<?php echo esc_attr( $cat_id ); ?>">
201
- <h2 class="hndle"><?php echo esc_html( $cookie_cat['name'] ) ?><button class="notice-dismiss" type="button"><span class="screen-reader-text"><?php esc_html_e( 'Remove this tab.', 'gdpr' ); ?></span></button></h2>
202
  <div class="inside">
203
  <table class="form-table">
204
  <tr>
@@ -263,80 +266,80 @@
263
  <td><textarea name="gdpr_cookie_popup_content[<?php echo esc_attr( $cat_id ); ?>][how_we_use]" id="tab-how-we-use-<?php echo esc_attr( $cat_id ); ?>" cols="53" rows="3"><?php echo esc_html( $registered_cookies[ $cat_id ]['how_we_use'] ); ?></textarea></td>
264
  </tr>
265
  <tr>
266
- <th>
267
- <label for="hosts-<?php echo esc_attr( $cat_id ); ?>">
268
- <?php esc_html_e( 'Third party domain', 'gdpr' ); ?>:
269
- <span class="screen-reader-text"><?php esc_attr_e( 'E.g. facebook.com', 'gdpr' ); ?></span>
270
- <span data-tooltip="<?php esc_attr_e( 'E.g. facebook.com', 'gdpr' ); ?>">
271
- <span class="dashicons dashicons-info"></span>
272
- </span>
273
- </label>
274
- </th>
275
- <td>
276
- <input type="text" id="hosts-<?php echo esc_attr( $cat_id ); ?>" class="regular-text" placeholder="domain.com" />
277
- <button class="button button-primary add-host" data-tabid="<?php echo esc_attr( $cat_id ); ?>"><?php esc_html_e( 'Add', 'gdpr' ); ?></button>
278
- <br>
279
- <span class="description"><?php esc_html_e( 'Cookies that are set by a third party, like facebook.com.', 'gdpr' ); ?></span>
280
- </td>
281
- </tr>
282
  </table>
283
  <div class="tab-hosts" data-tabid="<?php echo esc_attr( $cat_id ); ?>">
284
- <?php if ( isset( $cookie_cat['hosts'] ) && $cookie_cat['hosts'] ) : ?>
285
- <?php foreach ( $cookie_cat['hosts'] as $domain_id => $domain ) : ?>
286
- <div class="postbox">
287
- <h2 class="hndle"><?php echo esc_attr( $domain_id ); ?><button class="notice-dismiss" type="button" aria-label="<?php esc_attr_e( 'Remove this domain.', 'gdpr' ) ?>"></button></h2>
288
- <div class="inside">
289
- <table class="form-table">
290
- <tr>
291
- <th>
292
- <label for="hosts-cookies-used-<?php echo esc_attr( $domain_id ); ?>">
293
- <?php esc_html_e( 'Cookies used', 'gdpr' ); ?>:
294
- <span class="screen-reader-text"><?php esc_attr_e( 'A comma separated list of cookies that your site is using from this third-party provider.', 'gdpr' ); ?></span>
295
- <span data-tooltip="<?php esc_attr_e( 'A comma separated list of cookies that your site is using from this third-party provider.', 'gdpr' ); ?>">
296
- <span class="dashicons dashicons-info"></span>
297
- </span>
298
- </label>
299
- </th>
300
- <td>
301
- <textarea cols="53" rows="3" name="gdpr_cookie_popup_content[<?php echo esc_attr( $cat_id ); ?>][hosts][<?php echo esc_attr( $domain_id ); ?>][cookies_used]" id="hosts-cookies-used-<?php echo esc_attr( $domain_id ); ?>"><?php echo esc_attr( $domain['cookies_used'] ); ?></textarea>
302
- </td>
303
- </tr>
304
- <tr>
305
- <th>
306
- <label for="hosts-cookies-optout-<?php echo esc_attr( $domain_id ); ?>">
307
- <?php esc_html_e( 'Opt Out Link', 'gdpr' ); ?>:
308
- <span class="screen-reader-text"><?php esc_attr_e( 'Add a link with the third-party instructions on how to opt out of their cookies.', 'gdpr' ); ?></span>
309
- <span data-tooltip="<?php esc_attr_e( 'Add a link with the third-party instructions on how to opt out of their cookies.', 'gdpr' ); ?>">
310
- <span class="dashicons dashicons-info"></span>
311
- </span>
312
- </label>
313
- </th>
314
- <td>
315
- <input type="text" name="gdpr_cookie_popup_content[<?php echo esc_attr( $cat_id ); ?>][hosts][<?php echo esc_attr( $domain_id ); ?>][optout]" value="<?php echo esc_attr( $domain['optout'] ); ?>" id="hosts-cookies-optout-<?php echo esc_attr( $domain_id ); ?>" class="regular-text" />
316
- <br>
317
- <span class="description"><?php esc_html_e( 'Url with instructions on how to opt out.', 'gdpr' ); ?></span>
318
- </td>
319
- </tr>
320
- </table>
321
- </div>
322
- </div>
323
- <?php endforeach; ?>
324
- <?php endif; ?>
325
- </div>
326
  </div><!-- .inside -->
327
  </div><!-- .postbox -->
328
  <?php endforeach; ?>
329
  </div>
330
 
331
  <hr>
332
- <h2><?php esc_html_e( 'Consents', 'gdpr' ) ?></h2>
333
  <input type="text" id="type-of-consent" class="regular-text" placeholder="<?php esc_attr_e( 'E.g. Privacy Policy or Cookie Policy', 'gdpr' ); ?>">
334
  <button class="button button-primary add-consent"><?php esc_html_e( 'Add consent', 'gdpr' ); ?></button>
335
  <div id="consent-tabs">
336
  <?php if ( ! empty( $consent_types ) ) : ?>
337
  <?php foreach ( $consent_types as $consent_id => $consent ) : ?>
338
  <div class="postbox" id="consent-type-content-<?php echo esc_attr( $consent_id ); ?>">
339
- <h2 class="hndle"><?php echo esc_html( $consent['name'] ); ?> <span>(id: <?php echo esc_html( $consent_id ); ?>)</span><button class="notice-dismiss" type="button" aria-label="<?php esc_attr_e( 'Unregister this consent.', 'gdpr' ) ?>"></button></h2>
340
  <input type="hidden" name="gdpr_consent_types[<?php echo esc_attr( $consent_id ); ?>][name]" value="<?php echo esc_attr( $consent['name'] ); ?>">
341
  <div class="inside">
342
  <table class="form-table">
@@ -353,8 +356,8 @@
353
  <td>
354
  <select name="gdpr_consent_types[<?php echo esc_attr( $consent_id ); ?>][policy-page]" id="consent-policy-page-<?php echo esc_attr( $consent_id ); ?>">
355
  <option value=""></option>
356
- <?php foreach ( $pages as $page ): ?>
357
- <option value="<?php echo esc_attr( $page->ID ) ?>" <?php selected( $consent['policy-page'], $page->ID ); ?>><?php echo esc_html( $page->post_title ); ?></option>
358
  <?php endforeach ?>
359
  </select>
360
  </td>
11
  <tbody>
12
  <tr>
13
  <th scope="row">
14
+ <label for="gdpr_email_limit"><?php esc_html_e( 'Outgoing email limit', 'gdpr' ); ?>:</label>
15
  <span class="screen-reader-text"><?php esc_attr_e( 'This is the hourly outgoing email limit set by your server.', 'gdpr' ); ?></span>
16
  <span data-tooltip="<?php esc_attr_e( 'This is the hourly outgoing email limit set by your server.', 'gdpr' ); ?>">
17
  <span class="dashicons dashicons-info"></span>
25
  </tr>
26
  <tr>
27
  <th scope="row">
28
+ <label for="gdpr_deletion_needs_review"><?php esc_html_e( 'User deletion', 'gdpr' ); ?>:</label>
29
  <span class="screen-reader-text"><?php esc_attr_e( 'Useful if you need to remove the user from third-party services.', 'gdpr' ); ?></span>
30
  <span data-tooltip="<?php esc_attr_e( 'Useful if you need to remove the user from third-party services.', 'gdpr' ); ?>">
31
  <span class="dashicons dashicons-info"></span>
38
  </tr>
39
  <tr>
40
  <th scope="row">
41
+ <label for="gdpr_refresh_after_preferences_update"><?php esc_html_e( 'Refresh page after updating preferences', 'gdpr' ); ?>:</label>
42
  </th>
43
  <td>
44
  <?php $refresh_page = get_option( 'gdpr_refresh_after_preferences_update', false ); ?>
48
  </tr>
49
  <tr>
50
  <th scope="row">
51
+ <label for="gdpr_disable_css"><?php esc_html_e( 'Disable CSS', 'gdpr' ); ?>:</label>
52
  </th>
53
  <td>
54
  <?php $disable_css = get_option( 'gdpr_disable_css', false ); ?>
57
  </tr>
58
  <tr>
59
  <th scope="row">
60
+ <label for="gdpr_enable_telemetry_tracker"><?php esc_html_e( 'Enable the Telemetry Tracker', 'gdpr' ); ?>:</label>
61
  <span class="screen-reader-text"><?php esc_attr_e( 'This tracks data that is being sent to outside servers.', 'gdpr' ); ?></span>
62
  <span data-tooltip="<?php esc_attr_e( 'This tracks data that is being sent to outside servers.', 'gdpr' ); ?>">
63
  <span class="dashicons dashicons-info"></span>
73
  <hr>
74
  <h2 class="title"><?php esc_html_e( 'Privacy Center', 'gdpr' ); ?></h2>
75
  <p>
76
+ <?php esc_html_e( 'This section handles the privacy bar and some of the privacy preferences window.', 'gdpr' ); ?><br>
77
+ <strong><?php esc_html_e( 'Important:', 'gdpr' ); ?></strong> <?php esc_html_e( 'If the privacy banner text is not filled out, the privacy banner will not show up. Even if you registered your cookies.', 'gdpr' ); ?></p>
78
  <table class="form-table">
79
  <tbody>
80
  <tr>
81
  <th scope="row">
82
+ <label for="gdpr_enable_privacy_bar"><?php esc_html_e( 'Enable the Privacy Bar', 'gdpr' ); ?>:</label>
83
  </th>
84
  <td>
85
  <?php $enable_privacy_bar = get_option( 'gdpr_enable_privacy_bar', true ); ?>
88
  </tr>
89
  <tr>
90
  <th scope="row">
91
+ <label for="gdpr_display_cookie_categories_in_bar"><?php esc_html_e( 'Display the cookie categories in the privacy bar', 'gdpr' ); ?>:</label>
92
  </th>
93
  <td>
94
  <?php $display_cookie_cat_checkboxes = get_option( 'gdpr_display_cookie_categories_in_bar', false ); ?>
97
  </tr>
98
  <tr>
99
  <th scope="row">
100
+ <label for="gdpr_cookie_banner_content"><?php esc_html_e( 'Privacy Bar Content', 'gdpr' ); ?>:</label>
101
  <span class="screen-reader-text"><?php esc_attr_e( 'This is required if you want the privacy bar to show up.', 'gdpr' ); ?></span>
102
  <span data-tooltip="<?php esc_attr_e( 'This is required if you want the privacy bar to show up.', 'gdpr' ); ?>">
103
  <span class="dashicons dashicons-info"></span>
110
  </tr>
111
  <tr>
112
  <th scope="row">
113
+ <label for="gdpr_cookie_privacy_excerpt"><?php esc_html_e( 'Privacy Excerpt', 'gdpr' ); ?>:</label>
114
  <span class="screen-reader-text"><?php esc_attr_e( 'This show up in the privacy preferences window.', 'gdpr' ); ?></span>
115
  <span data-tooltip="<?php esc_attr_e( 'This show up in the privacy preferences window.', 'gdpr' ); ?>">
116
  <span class="dashicons dashicons-info"></span>
128
  <h2 class="title"><?php esc_html_e( 'Request Forms reCAPTCHA', 'gdpr' ); ?></h2>
129
  <p><?php esc_html_e( 'To prevent spam attacks, you have the option to enable reCAPTCHA. Configure below your keys to make it work with our request forms.', 'gdpr' ); ?></p>
130
  <p>
131
+ <?php
132
+ echo sprintf(
133
  /* translators: External link with instructions on how to proceed. */
134
  esc_html__( 'You can find the necessary information %s.', 'gdpr' ),
135
  '<a href="https://www.google.com/recaptcha/admin" target="_blank">' . esc_html__( 'here', 'gdpr' ) . '</a>'
136
+ )
137
+ ?>
138
+ </p>
139
  <table class="form-table">
140
  <tbody>
141
  <tr>
142
  <th scope="row">
143
+ <label for="gdpr_use_recaptcha"><?php esc_html_e( 'Enable reCAPTCHA', 'gdpr' ); ?>:</label>
144
  </th>
145
  <td>
146
  <?php $use_recaptcha = get_option( 'gdpr_use_recaptcha', false ); ?>
149
  </tr>
150
  <tr>
151
  <th scope="row">
152
+ <label for="gdpr_recaptcha_site_key"><?php esc_html_e( 'Site Key', 'gdpr' ); ?>:</label>
153
  </th>
154
  <td>
155
  <?php $site_key = get_option( 'gdpr_recaptcha_site_key', '' ); ?>
158
  </tr>
159
  <tr>
160
  <th scope="row">
161
+ <label for="gdpr_recaptcha_secret_key"><?php esc_html_e( 'Secret Key', 'gdpr' ); ?>:</label>
162
  </th>
163
  <td>
164
  <?php $secret_key = get_option( 'gdpr_recaptcha_secret_key', '' ); ?>
167
  </tr>
168
  </tbody>
169
  </table>
170
+ <?php if ( class_exists( 'WooCommerce' ) ) : ?>
171
  <hr>
172
  <h2 class="title"><?php esc_html_e( 'WooCommerce', 'gdpr' ); ?></h2>
173
  <table class="form-table">
174
  <tbody>
175
  <tr>
176
  <th scope="row">
177
+ <label for="gdpr_add_consent_checkboxes_registration"><?php esc_html_e( 'Add consent checkboxes to the registration page', 'gdpr' ); ?>:</label>
178
  </th>
179
  <td>
180
  <?php $add_checkboxes_to_registration = get_option( 'gdpr_add_consent_checkboxes_registration', false ); ?>
183
  </tr>
184
  <tr>
185
  <th scope="row">
186
+ <label for="gdpr_add_consent_checkboxes_checkout"><?php esc_html_e( 'Add consent checkboxes to the checkout registration form', 'gdpr' ); ?>:</label>
187
  </th>
188
  <td>
189
  <?php $add_checkboxes_to_checkout = get_option( 'gdpr_add_consent_checkboxes_checkout', false ); ?>
195
  <?php endif ?>
196
 
197
  <hr>
198
+ <h2><?php esc_html_e( 'Cookies', 'gdpr' ); ?></h2>
199
  <input type="text" id="cookie-tabs" class="regular-text" placeholder="<?php esc_attr_e( 'Category name', 'gdpr' ); ?>">
200
+ <button class="button button-primary add-tab"><?php esc_html_e( 'Add cookie category', 'gdpr' ); ?></button>
201
  <div id="gdpr-cookie-categories">
202
+ <?php foreach ( $registered_cookies as $cat_id => $cookie_cat ) : ?>
203
  <div class="postbox" id="cookie-tab-content-<?php echo esc_attr( $cat_id ); ?>">
204
+ <h2 class="hndle"><?php echo esc_html( $cookie_cat['name'] ); ?><button class="notice-dismiss" type="button"><span class="screen-reader-text"><?php esc_html_e( 'Remove this tab.', 'gdpr' ); ?></span></button></h2>
205
  <div class="inside">
206
  <table class="form-table">
207
  <tr>
266
  <td><textarea name="gdpr_cookie_popup_content[<?php echo esc_attr( $cat_id ); ?>][how_we_use]" id="tab-how-we-use-<?php echo esc_attr( $cat_id ); ?>" cols="53" rows="3"><?php echo esc_html( $registered_cookies[ $cat_id ]['how_we_use'] ); ?></textarea></td>
267
  </tr>
268
  <tr>
269
+ <th>
270
+ <label for="hosts-<?php echo esc_attr( $cat_id ); ?>">
271
+ <?php esc_html_e( 'Third party domain', 'gdpr' ); ?>:
272
+ <span class="screen-reader-text"><?php esc_attr_e( 'E.g. facebook.com', 'gdpr' ); ?></span>
273
+ <span data-tooltip="<?php esc_attr_e( 'E.g. facebook.com', 'gdpr' ); ?>">
274
+ <span class="dashicons dashicons-info"></span>
275
+ </span>
276
+ </label>
277
+ </th>
278
+ <td>
279
+ <input type="text" id="hosts-<?php echo esc_attr( $cat_id ); ?>" class="regular-text" placeholder="<?php esc_attr_e( 'domain.com', 'gdpr' ); ?>" />
280
+ <button class="button button-primary add-host" data-tabid="<?php echo esc_attr( $cat_id ); ?>"><?php esc_html_e( 'Add', 'gdpr' ); ?></button>
281
+ <br>
282
+ <span class="description"><?php esc_html_e( 'Cookies that are set by a third party, like facebook.com.', 'gdpr' ); ?></span>
283
+ </td>
284
+ </tr>
285
  </table>
286
  <div class="tab-hosts" data-tabid="<?php echo esc_attr( $cat_id ); ?>">
287
+ <?php if ( isset( $cookie_cat['hosts'] ) && $cookie_cat['hosts'] ) : ?>
288
+ <?php foreach ( $cookie_cat['hosts'] as $domain_id => $domain ) : ?>
289
+ <div class="postbox">
290
+ <h2 class="hndle"><?php echo esc_attr( $domain_id ); ?><button class="notice-dismiss" type="button" aria-label="<?php esc_attr_e( 'Remove this domain.', 'gdpr' ); ?>"></button></h2>
291
+ <div class="inside">
292
+ <table class="form-table">
293
+ <tr>
294
+ <th>
295
+ <label for="hosts-cookies-used-<?php echo esc_attr( $domain_id ); ?>">
296
+ <?php esc_html_e( 'Cookies used', 'gdpr' ); ?>:
297
+ <span class="screen-reader-text"><?php esc_attr_e( 'A comma separated list of cookies that your site is using from this third-party provider.', 'gdpr' ); ?></span>
298
+ <span data-tooltip="<?php esc_attr_e( 'A comma separated list of cookies that your site is using from this third-party provider.', 'gdpr' ); ?>">
299
+ <span class="dashicons dashicons-info"></span>
300
+ </span>
301
+ </label>
302
+ </th>
303
+ <td>
304
+ <textarea cols="53" rows="3" name="gdpr_cookie_popup_content[<?php echo esc_attr( $cat_id ); ?>][hosts][<?php echo esc_attr( $domain_id ); ?>][cookies_used]" id="hosts-cookies-used-<?php echo esc_attr( $domain_id ); ?>"><?php echo esc_attr( $domain['cookies_used'] ); ?></textarea>
305
+ </td>
306
+ </tr>
307
+ <tr>
308
+ <th>
309
+ <label for="hosts-cookies-optout-<?php echo esc_attr( $domain_id ); ?>">
310
+ <?php esc_html_e( 'Opt Out Link', 'gdpr' ); ?>:
311
+ <span class="screen-reader-text"><?php esc_attr_e( 'Add a link with the third-party instructions on how to opt out of their cookies.', 'gdpr' ); ?></span>
312
+ <span data-tooltip="<?php esc_attr_e( 'Add a link with the third-party instructions on how to opt out of their cookies.', 'gdpr' ); ?>">
313
+ <span class="dashicons dashicons-info"></span>
314
+ </span>
315
+ </label>
316
+ </th>
317
+ <td>
318
+ <input type="text" name="gdpr_cookie_popup_content[<?php echo esc_attr( $cat_id ); ?>][hosts][<?php echo esc_attr( $domain_id ); ?>][optout]" value="<?php echo esc_attr( $domain['optout'] ); ?>" id="hosts-cookies-optout-<?php echo esc_attr( $domain_id ); ?>" class="regular-text" />
319
+ <br>
320
+ <span class="description"><?php esc_html_e( 'Url with instructions on how to opt out.', 'gdpr' ); ?></span>
321
+ </td>
322
+ </tr>
323
+ </table>
324
+ </div>
325
+ </div>
326
+ <?php endforeach; ?>
327
+ <?php endif; ?>
328
+ </div>
329
  </div><!-- .inside -->
330
  </div><!-- .postbox -->
331
  <?php endforeach; ?>
332
  </div>
333
 
334
  <hr>
335
+ <h2><?php esc_html_e( 'Consents', 'gdpr' ); ?></h2>
336
  <input type="text" id="type-of-consent" class="regular-text" placeholder="<?php esc_attr_e( 'E.g. Privacy Policy or Cookie Policy', 'gdpr' ); ?>">
337
  <button class="button button-primary add-consent"><?php esc_html_e( 'Add consent', 'gdpr' ); ?></button>
338
  <div id="consent-tabs">
339
  <?php if ( ! empty( $consent_types ) ) : ?>
340
  <?php foreach ( $consent_types as $consent_id => $consent ) : ?>
341
  <div class="postbox" id="consent-type-content-<?php echo esc_attr( $consent_id ); ?>">
342
+ <h2 class="hndle"><?php echo esc_html( $consent['name'] ); ?> <span>(id: <?php echo esc_html( $consent_id ); ?>)</span><button class="notice-dismiss" type="button" aria-label="<?php esc_attr_e( 'Unregister this consent.', 'gdpr' ); ?>"></button></h2>
343
  <input type="hidden" name="gdpr_consent_types[<?php echo esc_attr( $consent_id ); ?>][name]" value="<?php echo esc_attr( $consent['name'] ); ?>">
344
  <div class="inside">
345
  <table class="form-table">
356
  <td>
357
  <select name="gdpr_consent_types[<?php echo esc_attr( $consent_id ); ?>][policy-page]" id="consent-policy-page-<?php echo esc_attr( $consent_id ); ?>">
358
  <option value=""></option>
359
+ <?php foreach ( $pages as $page ) : ?>
360
+ <option value="<?php echo esc_attr( $page->ID ); ?>" <?php selected( $consent['policy-page'], $page->ID ); ?>><?php echo esc_html( $page->post_title ); ?></option>
361
  <?php endforeach ?>
362
  </select>
363
  </td>
admin/partials/templates/tmpl-consents.php CHANGED
@@ -17,8 +17,8 @@
17
  <td>
18
  <select name="gdpr_consent_types[{{data.key}}][policy-page]" id="consent-policy-page-{{data.key}}">
19
  <option value=""></option>
20
- <?php foreach ( $pages as $page ): ?>
21
- <option value="<?php echo esc_attr( $page->ID ) ?>"><?php echo esc_html( $page->post_title ); ?></option>
22
  <?php endforeach ?>
23
  </select>
24
  </td>
17
  <td>
18
  <select name="gdpr_consent_types[{{data.key}}][policy-page]" id="consent-policy-page-{{data.key}}">
19
  <option value=""></option>
20
+ <?php foreach ( $pages as $page ) : ?>
21
+ <option value="<?php echo esc_attr( $page->ID ); ?>"><?php echo esc_html( $page->post_title ); ?></option>
22
  <?php endforeach ?>
23
  </select>
24
  </td>
admin/partials/templates/tmpl-cookies.php CHANGED
@@ -40,8 +40,8 @@
40
  <th>
41
  <label for="cookies-used-{{data.key}}">
42
  <?php esc_html_e( 'Cookies used', 'gdpr' ); ?>:
43
- <span class="screen-reader-text"><?php esc_attr_e( 'A comma separated list of cookies that your site is using that fit this category.', 'gdpr' ); ?></span>
44
- <span data-tooltip="<?php esc_attr_e( 'A comma separated list of cookies that your site is using that fit this category.', 'gdpr' ); ?>">
45
  <span class="dashicons dashicons-info"></span>
46
  </span>
47
  </label>
@@ -65,22 +65,22 @@
65
  <td><textarea name="gdpr_cookie_popup_content[{{data.key}}][how_we_use]" id="tab-how-we-use-{{data.key}}" cols="53" rows="3"></textarea></td>
66
  </tr>
67
  <tr>
68
- <th>
69
- <label for="hosts-{{data.key}}">
70
- <?php esc_html_e( 'Third party domain', 'gdpr' ); ?>:
71
- <span class="screen-reader-text"><?php esc_attr_e( 'E.g. youtube.com', 'gdpr' ); ?></span>
72
- <span data-tooltip="<?php esc_attr_e( 'E.g. youtube.com', 'gdpr' ); ?>">
73
- <span class="dashicons dashicons-info"></span>
74
- </span>
75
- </label>
76
- </th>
77
- <td>
78
- <input type="text" id="hosts-{{data.key}}" class="regular-text" placeholder="<?php esc_attr_e( 'domain.com', 'gdpr' ); ?>" />
79
- <button class="button button-primary add-host" data-tabid="{{data.key}}"><?php esc_html_e( 'Add', 'gdpr' ); ?></button>
80
- <br>
81
- <span class="description"><?php esc_html_e( 'Cookies that are set by a third party, like facebook.com.', 'gdpr' ); ?></span>
82
- </td>
83
- </tr>
84
  </table>
85
  <div class="tab-hosts" data-tabid="{{data.key}}">
86
 
40
  <th>
41
  <label for="cookies-used-{{data.key}}">
42
  <?php esc_html_e( 'Cookies used', 'gdpr' ); ?>:
43
+ <span class="screen-reader-text"><?php esc_attr_e( 'A comma-separated list of cookies that your site is using that fit this category.', 'gdpr' ); ?></span>
44
+ <span data-tooltip="<?php esc_attr_e( 'A comma-separated list of cookies that your site is using that fit this category.', 'gdpr' ); ?>">
45
  <span class="dashicons dashicons-info"></span>
46
  </span>
47
  </label>
65
  <td><textarea name="gdpr_cookie_popup_content[{{data.key}}][how_we_use]" id="tab-how-we-use-{{data.key}}" cols="53" rows="3"></textarea></td>
66
  </tr>
67
  <tr>
68
+ <th>
69
+ <label for="hosts-{{data.key}}">
70
+ <?php esc_html_e( 'Third party domain', 'gdpr' ); ?>:
71
+ <span class="screen-reader-text"><?php esc_attr_e( 'E.g. youtube.com', 'gdpr' ); ?></span>
72
+ <span data-tooltip="<?php esc_attr_e( 'E.g. youtube.com', 'gdpr' ); ?>">
73
+ <span class="dashicons dashicons-info"></span>
74
+ </span>
75
+ </label>
76
+ </th>
77
+ <td>
78
+ <input type="text" id="hosts-{{data.key}}" class="regular-text" placeholder="<?php esc_attr_e( 'domain.com', 'gdpr' ); ?>" />
79
+ <button class="button button-primary add-host" data-tabid="{{data.key}}"><?php esc_html_e( 'Add', 'gdpr' ); ?></button>
80
+ <br>
81
+ <span class="description"><?php esc_html_e( 'Cookies that are set by a third party, like facebook.com.', 'gdpr' ); ?></span>
82
+ </td>
83
+ </tr>
84
  </table>
85
  <div class="tab-hosts" data-tabid="{{data.key}}">
86
 
admin/partials/templates/tmpl-tools.php CHANGED
@@ -1,6 +1,6 @@
1
  <script type="text/html" id="tmpl-audit-log-result-success">
2
  <div class="gdpr-audit-log-result">
3
- <h2><?php echo _e( 'Result', 'gdpr' ); ?></h2>
4
  <div class="postbox">
5
  <div class="inside">
6
  <textarea readonly class="gdpr-audit-log-result large-text" rows="20">{{{data.result}}}</textarea>
@@ -11,7 +11,7 @@
11
 
12
  <script type="text/html" id="tmpl-audit-log-result-error">
13
  <div class="gdpr-audit-log-result">
14
- <h2><?php echo _e( 'Error', 'gdpr' ); ?></h2>
15
  <div class="notice notice-error">
16
  <p><?php esc_html_e( 'We could not find a any logs for that email and token combination.', 'gdpr' ); ?></p>
17
  </div>
@@ -20,13 +20,13 @@
20
 
21
  <script type="text/html" id="tmpl-access-data-result-success">
22
  <div class="gdpr-access-data-result">
23
- <h2><?php echo _e( 'Result', 'gdpr' ); ?></h2>
24
  <p>
25
  <form method="post" class="frm-export-data">
26
  <?php wp_nonce_field( 'gdpr-export-data', 'gdpr_export_data_nonce' ); ?>
27
  <input type="hidden" name="user_email" value="{{data.user_email}}">
28
- <?php submit_button( 'XML', 'primary', 'download-data-xml', false ) ?>
29
- <?php submit_button( 'JSON', 'primary', 'download-data-json', false ) ?>
30
  </form>
31
  </p>
32
  <div class="postbox">
@@ -41,7 +41,7 @@
41
 
42
  <script type="text/html" id="tmpl-access-data-result-error">
43
  <div class="gdpr-access-data-result">
44
- <h2><?php echo _e( 'Error', 'gdpr' ); ?></h2>
45
  <div class="notice notice-error">
46
  <p><?php esc_html_e( 'We could not find a user with that email.', 'gdpr' ); ?></p>
47
  </div>
1
  <script type="text/html" id="tmpl-audit-log-result-success">
2
  <div class="gdpr-audit-log-result">
3
+ <h2><?php echo esc_html_e( 'Result', 'gdpr' ); ?></h2>
4
  <div class="postbox">
5
  <div class="inside">
6
  <textarea readonly class="gdpr-audit-log-result large-text" rows="20">{{{data.result}}}</textarea>
11
 
12
  <script type="text/html" id="tmpl-audit-log-result-error">
13
  <div class="gdpr-audit-log-result">
14
+ <h2><?php echo esc_html_e( 'Error', 'gdpr' ); ?></h2>
15
  <div class="notice notice-error">
16
  <p><?php esc_html_e( 'We could not find a any logs for that email and token combination.', 'gdpr' ); ?></p>
17
  </div>
20
 
21
  <script type="text/html" id="tmpl-access-data-result-success">
22
  <div class="gdpr-access-data-result">
23
+ <h2><?php echo esc_html_e( 'Result', 'gdpr' ); ?></h2>
24
  <p>
25
  <form method="post" class="frm-export-data">
26
  <?php wp_nonce_field( 'gdpr-export-data', 'gdpr_export_data_nonce' ); ?>
27
  <input type="hidden" name="user_email" value="{{data.user_email}}">
28
+ <?php submit_button( 'XML', 'primary', 'download-data-xml', false ); ?>
29
+ <?php submit_button( 'JSON', 'primary', 'download-data-json', false ); ?>
30
  </form>
31
  </p>
32
  <div class="postbox">
41
 
42
  <script type="text/html" id="tmpl-access-data-result-error">
43
  <div class="gdpr-access-data-result">
44
+ <h2><?php echo esc_html_e( 'Error', 'gdpr' ); ?></h2>
45
  <div class="notice notice-error">
46
  <p><?php esc_html_e( 'We could not find a user with that email.', 'gdpr' ); ?></p>
47
  </div>
admin/partials/tools.php CHANGED
@@ -14,10 +14,10 @@
14
 
15
  include_once plugin_dir_path( __FILE__ ) . 'templates/tmpl-tools.php';
16
 
17
- if ( isset( $_GET['type'], $_GET['key'] ) ) {
18
 
19
- if ( 'data-breach-confirmed' === $_GET['type'] ) {
20
- $key = sanitize_text_field( wp_unslash( $_GET['key'] ) );
21
 
22
  $data_breach = get_option( 'gdpr_data_breach_initiated', array( 'key' => '' ) );
23
  if ( ! empty( $data_breach ) ) {
@@ -25,16 +25,14 @@ if ( isset( $_GET['type'], $_GET['key'] ) ) {
25
  GDPR_Email::prepare_data_breach_emails( $key );
26
  delete_option( 'gdpr_data_breach_initiated' );
27
 
28
- if ( $time = wp_next_scheduled( 'clean_gdpr_data_breach_request' ) ) {
 
29
  wp_unschedule_event( $time, 'clean_gdpr_data_breach_request' );
30
  }
31
 
32
  add_settings_error( 'gdpr', 'resolved', esc_html__( 'Data Breach confirmed. Preparing bulk emails.', 'gdpr' ), 'updated' );
 
33
  }
34
-
35
- }
36
-
37
-
38
  }
39
  }
40
 
@@ -45,14 +43,14 @@ if ( isset( $_GET['type'], $_GET['key'] ) ) {
45
  <?php settings_errors(); ?>
46
  <div class="nav-tab-wrapper">
47
  <?php foreach ( $tabs as $key => $value ) : ?>
48
- <a href="<?php echo '#' . $key; ?>" class="nav-tab">
49
  <?php echo esc_html( $value ); ?>
50
  </a>
51
  <?php endforeach; ?>
52
  </div>
53
 
54
  <div class="gdpr-tab hidden" data-id="access">
55
- <h2><?php esc_html_e( 'Access Data', 'gdpr' ) ?></h2>
56
  <div class="postbox not-full">
57
  <form class="gdpr-access-data-lookup" method="post">
58
  <div class="inside">
@@ -69,43 +67,43 @@ if ( isset( $_GET['type'], $_GET['key'] ) ) {
69
  </div>
70
 
71
  <div class="gdpr-tab hidden" data-id="data-breach">
72
- <h2><?php esc_html_e( 'Data Breach', 'gdpr' ) ?></h2>
73
- <form class="gdpr-data-breach-form" method="post" action="<?php echo esc_url( admin_url('admin-post.php') ); ?>">
74
  <?php wp_nonce_field( 'gdpr-data-breach', 'gdpr_data_breach_nonce' ); ?>
75
  <input type="hidden" name="action" value="gdpr_data_breach">
76
  <table class="form-table">
77
  <tr>
78
- <th><?php esc_html_e( 'Email content', 'gdpr' ) ?></th>
79
  <td>
80
  <textarea name="gdpr-data-breach-email-content" class="large-text" rows="5"></textarea>
81
- <span class="description"><?php esc_html_e( 'The content that the end user will see before the below information.', 'gdpr' ) ?></span>
82
  </td>
83
  </tr>
84
  <tr>
85
- <th><?php esc_html_e( 'Nature of the personal data breach', 'gdpr' ) ?></th>
86
  <td>
87
  <textarea name="gdpr-data-breach-nature" class="large-text" rows="5" required></textarea>
88
- <span class="description"><?php esc_html_e( 'Describe the nature of the personal data breach including where possible, the categories and the approximate number of data subjects concerned and the categories and the approximate number of personal data records concerned.', 'gdpr' ) ?></span>
89
  </td>
90
  </tr>
91
  <tr>
92
- <th><?php esc_html_e( 'Name and contact details of the data protection officer', 'gdpr' ) ?></th>
93
  <td>
94
  <textarea name="gdpr-name-contact-details-protection-officer" class="large-text" rows="5" required></textarea>
95
- <span class="description"><?php esc_html_e( 'Communicate the name and contact details of the data protection officer or another point of contact where more information can be obtained.', 'gdpr' ) ?></span>
96
  </td>
97
  </tr>
98
  <tr>
99
- <th><?php esc_html_e( 'Likely consequences of the personal data breach', 'gdpr' ) ?></th>
100
  <td>
101
  <textarea name="gdpr-likely-consequences" class="large-text" rows="5" required></textarea>
102
  </td>
103
  </tr>
104
  <tr>
105
- <th><?php esc_html_e( 'Measures taken or proposed to be taken', 'gdpr' ) ?></th>
106
  <td>
107
  <textarea name="gdpr-measures-taken" class="large-text" rows="5" required></textarea>
108
- <span class="description"><?php esc_html_e( 'Describe the measures taken or proposed to be taken by the controller to address the personal data breach, including, where appropriate, measures to mitigate its possible adverse effects.', 'gdpr' ) ?></span>
109
  </td>
110
  </tr>
111
  </table>
@@ -114,7 +112,7 @@ if ( isset( $_GET['type'], $_GET['key'] ) ) {
114
  </div>
115
 
116
  <div class="gdpr-tab hidden" data-id="audit-log">
117
- <h2><?php esc_html_e( 'Audit Log', 'gdpr' ) ?></h2>
118
  <div class="postbox not-full">
119
  <form class="gdpr-audit-log-lookup" method="post">
120
  <div class="inside">
14
 
15
  include_once plugin_dir_path( __FILE__ ) . 'templates/tmpl-tools.php';
16
 
17
+ if ( isset( $_GET['type'], $_GET['key'] ) ) { // WPCS: CSRF ok.
18
 
19
+ if ( 'data-breach-confirmed' === $_GET['type'] ) { // WPCS: CSRF ok.
20
+ $key = sanitize_text_field( wp_unslash( $_GET['key'] ) ); // WPCS: Input var ok, CSRF ok.
21
 
22
  $data_breach = get_option( 'gdpr_data_breach_initiated', array( 'key' => '' ) );
23
  if ( ! empty( $data_breach ) ) {
25
  GDPR_Email::prepare_data_breach_emails( $key );
26
  delete_option( 'gdpr_data_breach_initiated' );
27
 
28
+ $time = wp_next_scheduled( 'clean_gdpr_data_breach_request' );
29
+ if ( $time ) {
30
  wp_unschedule_event( $time, 'clean_gdpr_data_breach_request' );
31
  }
32
 
33
  add_settings_error( 'gdpr', 'resolved', esc_html__( 'Data Breach confirmed. Preparing bulk emails.', 'gdpr' ), 'updated' );
34
+ }
35
  }
 
 
 
 
36
  }
37
  }
38
 
43
  <?php settings_errors(); ?>
44
  <div class="nav-tab-wrapper">
45
  <?php foreach ( $tabs as $key => $value ) : ?>
46
+ <a href="<?php echo esc_html( '#' . $key ); ?>" class="nav-tab">
47
  <?php echo esc_html( $value ); ?>
48
  </a>
49
  <?php endforeach; ?>
50
  </div>
51
 
52
  <div class="gdpr-tab hidden" data-id="access">
53
+ <h2><?php esc_html_e( 'Access Data', 'gdpr' ); ?></h2>
54
  <div class="postbox not-full">
55
  <form class="gdpr-access-data-lookup" method="post">
56
  <div class="inside">
67
  </div>
68
 
69
  <div class="gdpr-tab hidden" data-id="data-breach">
70
+ <h2><?php esc_html_e( 'Data Breach', 'gdpr' ); ?></h2>
71
+ <form class="gdpr-data-breach-form" method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>">
72
  <?php wp_nonce_field( 'gdpr-data-breach', 'gdpr_data_breach_nonce' ); ?>
73
  <input type="hidden" name="action" value="gdpr_data_breach">
74
  <table class="form-table">
75
  <tr>
76
+ <th><?php esc_html_e( 'Email content', 'gdpr' ); ?></th>
77
  <td>
78
  <textarea name="gdpr-data-breach-email-content" class="large-text" rows="5"></textarea>
79
+ <span class="description"><?php esc_html_e( 'The content that the end user will see before the below information.', 'gdpr' ); ?></span>
80
  </td>
81
  </tr>
82
  <tr>
83
+ <th><?php esc_html_e( 'Nature of the personal data breach', 'gdpr' ); ?></th>
84
  <td>
85
  <textarea name="gdpr-data-breach-nature" class="large-text" rows="5" required></textarea>
86
+ <span class="description"><?php esc_html_e( 'Describe the nature of the personal data breach including where possible, the categories and the approximate number of data subjects concerned and the categories and the approximate number of personal data records concerned.', 'gdpr' ); ?></span>
87
  </td>
88
  </tr>
89
  <tr>
90
+ <th><?php esc_html_e( 'Name and contact details of the data protection officer', 'gdpr' ); ?></th>
91
  <td>
92
  <textarea name="gdpr-name-contact-details-protection-officer" class="large-text" rows="5" required></textarea>
93
+ <span class="description"><?php esc_html_e( 'Communicate the name and contact details of the data protection officer or another point of contact where more information can be obtained.', 'gdpr' ); ?></span>
94
  </td>
95
  </tr>
96
  <tr>
97
+ <th><?php esc_html_e( 'Likely consequences of the personal data breach', 'gdpr' ); ?></th>
98
  <td>
99
  <textarea name="gdpr-likely-consequences" class="large-text" rows="5" required></textarea>
100
  </td>
101
  </tr>
102
  <tr>
103
+ <th><?php esc_html_e( 'Measures taken or proposed to be taken', 'gdpr' ); ?></th>
104
  <td>
105
  <textarea name="gdpr-measures-taken" class="large-text" rows="5" required></textarea>
106
+ <span class="description"><?php esc_html_e( 'Describe the measures taken or proposed to be taken by the controller to address the personal data breach, including, where appropriate, measures to mitigate its possible adverse effects.', 'gdpr' ); ?></span>
107
  </td>
108
  </tr>
109
  </table>
112
  </div>
113
 
114
  <div class="gdpr-tab hidden" data-id="audit-log">
115
+ <h2><?php esc_html_e( 'Audit Log', 'gdpr' ); ?></h2>
116
  <div class="postbox not-full">
117
  <form class="gdpr-audit-log-lookup" method="post">
118
  <div class="inside">
assets/css/gdpr-admin.css CHANGED
@@ -1 +1 @@
1
- [data-tooltip]{position:relative;z-index:2;cursor:pointer;display:inline-block;width:21px}[data-tooltip]:before,[data-tooltip]:after{visibility:hidden;opacity:0;pointer-events:none}[data-tooltip]:before{position:absolute;bottom:150%;left:50%;margin-bottom:5px;margin-left:-80px;padding:7px;width:160px;border-radius:3px;background-color:#000;background-color:rgba(51,51,51,0.9);color:#fff;content:attr(data-tooltip);text-align:center;font-size:14px;line-height:1.2}[data-tooltip]:after{position:absolute;bottom:150%;left:50%;margin-left:-5px;width:0;border-top:5px solid #000;border-top:5px solid rgba(51,51,51,0.9);border-right:5px solid transparent;border-left:5px solid transparent;content:" ";font-size:0;line-height:0}[data-tooltip]:hover:before,[data-tooltip]:hover:after,[data-tooltip]:focus:before,[data-tooltip]:focus:after{visibility:visible;opacity:1}.gdpr-required{color:#f00}.gdpr-settings-form #gdpr-cookie-categories,.gdpr-settings-form #consent-tabs{margin-top:20px}.gdpr-settings-form #gdpr-cookie-categories .hndle,.gdpr-settings-form #consent-tabs .hndle{font-size:16px;padding:8px 12px;margin:0;line-height:1.4}.gdpr-settings-form #gdpr-cookie-categories .hndle span,.gdpr-settings-form #consent-tabs .hndle span{font-size:12px}.policy-page-updated-notice .spinner{margin:13px 0}.policy-page-updated-notice form{display:inline-block}.policy-page-updated-notice form .button-secondary{vertical-align:baseline}.policy-page-updated-notice form .button-primary:active{vertical-align:baseline}.gdpr-pending-requests-badge{display:inline-block;vertical-align:text-bottom;margin:1px 0 0 2px;padding:0 5px;min-width:7px;height:17px;border-radius:11px;background-color:#ca4a1f;color:#fff;font-size:9px;line-height:17px;text-align:center}.gdpr-request-table .spinner,.gdpr-manual-email-lookup .spinner{float:none;display:none}.gdpr-manual-email-lookup .inside{margin-bottom:0}.gdpr-request-table td{vertical-align:middle}.gdpr-request-table form{display:inline-block}.gdpr-request-table .text-center{text-align:center}.gdpr-request-table tr.review>td{padding-top:0;padding-bottom:0}.gdpr-request-table tr.review table{margin-bottom:10px}.gdpr-switch{position:relative;display:inline-block;width:45px;height:24px}.gdpr-switch input{display:none}.gdpr-switch .gdpr-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;-o-transition:.4s;transition:.4s}.gdpr-switch .gdpr-slider:before{position:absolute;content:"";height:16px;width:16px;left:4px;bottom:4px;background-color:white;-webkit-transition:.4s;-o-transition:.4s;transition:.4s}.gdpr-switch .gdpr-slider.round{border-radius:34px}.gdpr-switch .gdpr-slider.round:before{border-radius:50%}.gdpr-switch input:checked+.gdpr-slider{background-color:#00b9eb}.gdpr-switch input:checked+.gdpr-slider:before{-webkit-transform:translateX(21px);-ms-transform:translateX(21px);transform:translateX(21px)}.gdpr-switch input:focus+.gdpr-slider{-webkit-box-shadow:0 0 1px #00b9eb;box-shadow:0 0 1px #00b9eb}#TB_ajaxContent pre{white-space:pre-wrap;word-wrap:break-word}.gdpr-hidden{display:none}.post-type-telemetry .page-title-action{display:none}.post-type-telemetry .row-actions{display:none}.post-type-telemetry .search-box{display:none}.post-type-telemetry .actions #filter-by-date,.post-type-telemetry .actions #post-query-submit,.post-type-telemetry .actions.bulkactions{display:none}.gdpr .not-full{display:inline-block}.gdpr .spinner{display:none;visibility:visible}.gdpr .gdpr-access-data-result h2 span{font-size:16px}#gdpr-cookie-categories .postbox .inside{margin:0 !important;padding:0 20px 20px 20px}#gdpr-cookie-categories .postbox .inside .form-table{margin-top:0}#gdpr-cookie-categories .postbox .inside .tab-hosts .postbox .inside{padding-bottom:0;background-color:#f9f9f9}@media screen and (max-width: 1024px){.tab-hosts .postbox{margin-top:15px}.tab-hosts .postbox .inside{padding:10px 20px 20px 20px !important}.form-table td{padding-right:0}.form-table td .button{margin-top:5px;margin-bottom:10px}.type-telemetry *{word-wrap:break-word !important}}@media screen and (max-width: 640px){.postbox{width:100%}.postbox .notice-dismiss{padding:8px}.inside .regular-text{width:100%}.inside .button{margin-top:5px}}
1
+ [data-tooltip]{position:relative;z-index:9999;cursor:pointer;display:inline-block;width:21px}[data-tooltip]:before,[data-tooltip]:after{visibility:hidden;opacity:0;pointer-events:none}[data-tooltip]:before{position:absolute;bottom:150%;left:50%;margin-bottom:5px;margin-left:-80px;padding:7px;width:160px;border-radius:3px;background-color:#000;background-color:rgba(51,51,51,0.9);color:#fff;content:attr(data-tooltip);text-align:center;font-size:14px;line-height:1.2}[data-tooltip]:after{position:absolute;bottom:150%;left:50%;margin-left:-5px;width:0;border-top:5px solid #000;border-top:5px solid rgba(51,51,51,0.9);border-right:5px solid transparent;border-left:5px solid transparent;content:" ";font-size:0;line-height:0}[data-tooltip]:hover:before,[data-tooltip]:hover:after,[data-tooltip]:focus:before,[data-tooltip]:focus:after{visibility:visible;opacity:1}.gdpr-required{color:#f00}.gdpr-settings-form #gdpr-cookie-categories,.gdpr-settings-form #consent-tabs{margin-top:20px}.gdpr-settings-form #gdpr-cookie-categories .hndle,.gdpr-settings-form #consent-tabs .hndle{font-size:16px;padding:8px 12px;margin:0;line-height:1.4}.gdpr-settings-form #gdpr-cookie-categories .hndle span,.gdpr-settings-form #consent-tabs .hndle span{font-size:12px}.policy-page-updated-notice .spinner{margin:13px 0}.policy-page-updated-notice form{display:inline-block}.policy-page-updated-notice form .button-secondary{vertical-align:baseline}.policy-page-updated-notice form .button-primary:active{vertical-align:baseline}.gdpr-pending-requests-badge{display:inline-block;vertical-align:text-bottom;margin:1px 0 0 2px;padding:0 5px;min-width:7px;height:17px;border-radius:11px;background-color:#ca4a1f;color:#fff;font-size:9px;line-height:17px;text-align:center}.gdpr-request-table .spinner,.gdpr-manual-email-lookup .spinner{float:none;display:none}.gdpr-manual-email-lookup .inside{margin-bottom:0}.gdpr-request-table td{vertical-align:middle}.gdpr-request-table form{display:inline-block}.gdpr-request-table .text-center{text-align:center}.gdpr-request-table tr.review>td{padding-top:0;padding-bottom:0}.gdpr-request-table tr.review table{margin-bottom:10px}.gdpr-switch{position:relative;display:inline-block;width:45px;height:24px}.gdpr-switch input{display:none}.gdpr-switch .gdpr-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;-o-transition:.4s;transition:.4s}.gdpr-switch .gdpr-slider:before{position:absolute;content:"";height:16px;width:16px;left:4px;bottom:4px;background-color:white;-webkit-transition:.4s;-o-transition:.4s;transition:.4s}.gdpr-switch .gdpr-slider.round{border-radius:34px}.gdpr-switch .gdpr-slider.round:before{border-radius:50%}.gdpr-switch input:checked+.gdpr-slider{background-color:#00b9eb}.gdpr-switch input:checked+.gdpr-slider:before{-webkit-transform:translateX(21px);-ms-transform:translateX(21px);transform:translateX(21px)}.gdpr-switch input:focus+.gdpr-slider{-webkit-box-shadow:0 0 1px #00b9eb;box-shadow:0 0 1px #00b9eb}#TB_ajaxContent pre{white-space:pre-wrap;word-wrap:break-word}.gdpr-hidden{display:none}.post-type-telemetry .page-title-action{display:none}.post-type-telemetry .row-actions{display:none}.post-type-telemetry .search-box{display:none}.post-type-telemetry .actions #filter-by-date,.post-type-telemetry .actions #post-query-submit,.post-type-telemetry .actions.bulkactions{display:none}.gdpr .not-full{display:inline-block}.gdpr .spinner{display:none;visibility:visible}.gdpr .gdpr-access-data-result h2 span{font-size:16px}#gdpr-cookie-categories .postbox .inside{margin:0 !important;padding:0 20px 20px 20px}#gdpr-cookie-categories .postbox .inside .form-table{margin-top:0}#gdpr-cookie-categories .postbox .inside .tab-hosts .postbox .inside{padding-bottom:0;background-color:#f9f9f9}@media screen and (max-width: 1024px){.tab-hosts .postbox{margin-top:15px}.tab-hosts .postbox .inside{padding:10px 20px 20px 20px !important}.form-table td{padding-right:0}.form-table td .button{margin-top:5px;margin-bottom:10px}.type-telemetry *{word-wrap:break-word !important}}@media screen and (max-width: 640px){.postbox{width:100%}.postbox .notice-dismiss{padding:8px}.inside .regular-text{width:100%}.inside .button{margin-top:5px}}
assets/css/gdpr-public.css CHANGED
@@ -1 +1 @@
1
- .gdpr-noscroll{overflow:hidden;position:fixed;width:100%}.gdpr-hidden{display:none}.gdpr-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);z-index:99999999;display:none}.gdpr *{font-family:Helvetica, Arial, sans-serif !important;text-transform:none !important;letter-spacing:0 !important;color:#455561;background:none;-webkit-box-shadow:none;box-shadow:none;text-shadow:none;outline:none;border:none;margin:0;padding:0}.gdpr .h5{font-size:18px;font-weight:bold;color:#fff}.gdpr button,.gdpr input[type="submit"]{color:#000;font-weight:normal;font-size:14px;margin:0;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);line-height:1.5;display:block;min-width:auto;max-width:auto;cursor:pointer}.gdpr button:before,.gdpr button:after,.gdpr input[type="submit"]:before,.gdpr input[type="submit"]:after{display:inline-block;margin:0;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);top:auto;right:auto;bottom:auto;left:auto;background:none}.gdpr button:hover,.gdpr button:active,.gdpr button:focus,.gdpr input[type="submit"]:hover,.gdpr input[type="submit"]:active,.gdpr input[type="submit"]:focus{margin:0;border:none;-webkit-box-shadow:none;box-shadow:none}.gdpr img{width:100% !important}.gdpr .gdpr-contained-wrapper{max-width:600px;margin:0 auto;padding:20px 40px;-webkit-box-sizing:border-box;box-sizing:border-box}@media screen and (max-width: 1024px){.gdpr .gdpr-contained-wrapper{padding:20px}}.gdpr.gdpr-privacy-bar,.gdpr.gdpr-reconsent-bar{position:fixed;bottom:0;left:0;background:rgba(0,0,0,0.9);width:100%;color:#fff;z-index:9999999}.gdpr.gdpr-privacy-bar .gdpr-wrapper,.gdpr.gdpr-reconsent-bar .gdpr-wrapper{padding:20px 40px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;align-items:center}@media screen and (min-width: 1440px){.gdpr.gdpr-privacy-bar .gdpr-wrapper,.gdpr.gdpr-reconsent-bar .gdpr-wrapper{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}.gdpr.gdpr-privacy-bar .gdpr-wrapper:after,.gdpr.gdpr-reconsent-bar .gdpr-wrapper:after{content:"";display:table;clear:both}.gdpr.gdpr-privacy-bar .gdpr-wrapper p,.gdpr.gdpr-reconsent-bar .gdpr-wrapper p{margin:0;font-size:14px;font-weight:normal}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 0 20px 0;text-align:center}@media screen and (min-width: 1440px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content{padding:0 100px 0 0;text-align:left}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content p,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content p{color:#ffffff;font-size:14px}@media screen and (max-width: 1024px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content{padding-right:0;padding-bottom:20px}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content .gdpr-policy-pages .gdpr-policy-pages-item:after,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content .gdpr-policy-pages .gdpr-policy-pages-item:after{content:',';margin-right:5px}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content .gdpr-policy-pages .gdpr-policy-pages-item:last-of-type:after,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content .gdpr-policy-pages .gdpr-policy-pages-item:last-of-type:after{content:'';margin-right:0}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}@media screen and (max-width: 1024px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list{list-style:none;padding:0 20px 0 0;margin:0 20px 0 0;border-right:1px solid #808080}@media screen and (max-width: 1024px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list{padding:0 0 10px 0;margin:0 0 20px 0;border-right:none;border-bottom:1px solid #808080;text-align:center}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item{display:inline-block;margin:0 10px;padding-top:10px}@media screen and (max-width: 1024px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item{padding-top:0}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item *,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item *,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item *,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item *,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item *,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item *,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item *,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item *{float:left}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item input,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item input,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item input,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item input,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item input,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item input,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item input,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item input{margin-top:3px}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item label,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item label,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item label,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item label,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item label,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item label,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item label,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item label{color:#fff;margin:0 5px;font-size:14px}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item .gdpr-policy-link,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item .gdpr-policy-link,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item .gdpr-policy-link,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item .gdpr-policy-link,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item .gdpr-policy-link,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item .gdpr-policy-link,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item .gdpr-policy-link,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item .gdpr-policy-link{color:#fff;font-size:14px;text-decoration:underline}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories{margin-bottom:5px}}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button{white-space:nowrap}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences{margin-left:10px;margin-right:20px}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences{margin:0 0 10px 15px}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences:before,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences:before{left:-7px}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-agreement,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-agreement{margin:0 10px;-ms-flex-item-align:center;align-self:center}@media screen and (min-width: 1440px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-agreement,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-agreement{margin:0 0 0 10px}}.gdpr.gdpr-privacy-bar .gdpr-preferences,.gdpr.gdpr-reconsent-bar .gdpr-preferences{font-weight:normal;font-size:14px;text-decoration:underline;position:relative;margin-left:9px;color:#fff;float:left}.gdpr.gdpr-privacy-bar .gdpr-preferences:before,.gdpr.gdpr-reconsent-bar .gdpr-preferences:before{content:'\276F';font-size:1.1em;font-weight:normal;padding-right:5px;color:#fff;position:absolute;left:-7px;top:10px}.gdpr.gdpr-privacy-bar .gdpr-preferences:hover,.gdpr.gdpr-privacy-bar .gdpr-preferences:active,.gdpr.gdpr-privacy-bar .gdpr-preferences:focus,.gdpr.gdpr-privacy-bar .gdpr-preferences:focus-within,.gdpr.gdpr-privacy-bar .gdpr-preferences:visited,.gdpr.gdpr-reconsent-bar .gdpr-preferences:hover,.gdpr.gdpr-reconsent-bar .gdpr-preferences:active,.gdpr.gdpr-reconsent-bar .gdpr-preferences:focus,.gdpr.gdpr-reconsent-bar .gdpr-preferences:focus-within,.gdpr.gdpr-reconsent-bar .gdpr-preferences:visited{background:none}.gdpr.gdpr-privacy-bar button,.gdpr.gdpr-reconsent-bar button{margin:0 5px;padding:9px 10px}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-bar button,.gdpr.gdpr-reconsent-bar button{margin:0}}.gdpr.gdpr-privacy-bar .gdpr-agreement,.gdpr.gdpr-reconsent-bar .gdpr-agreement{position:relative;font-size:13px;font-weight:normal;padding:12px 36px 12px 76px;height:auto;line-height:1.4285714;white-space:normal;margin:0;border-width:1px;border-style:solid;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-bar .gdpr-agreement,.gdpr.gdpr-reconsent-bar .gdpr-agreement{padding:7px 16px 7px 56px}}.gdpr.gdpr-privacy-bar .gdpr-agreement:hover,.gdpr.gdpr-reconsent-bar .gdpr-agreement:hover{background:#008ec2;border-color:#006799}.gdpr.gdpr-privacy-bar .gdpr-agreement:hover:before,.gdpr.gdpr-reconsent-bar .gdpr-agreement:hover:before{font-size:26px;background:#fafafa;color:#00b9eb}.gdpr.gdpr-privacy-bar .gdpr-agreement:active,.gdpr.gdpr-privacy-bar .gdpr-agreement:focus,.gdpr.gdpr-reconsent-bar .gdpr-agreement:active,.gdpr.gdpr-reconsent-bar .gdpr-agreement:focus{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.gdpr.gdpr-privacy-bar .gdpr-agreement:active:before,.gdpr.gdpr-privacy-bar .gdpr-agreement:focus:before,.gdpr.gdpr-reconsent-bar .gdpr-agreement:active:before,.gdpr.gdpr-reconsent-bar .gdpr-agreement:focus:before{-webkit-box-shadow:inset 0 2px 0 #ccc;box-shadow:inset 0 2px 0 #ccc;vertical-align:top}.gdpr.gdpr-privacy-bar .gdpr-agreement:before,.gdpr.gdpr-reconsent-bar .gdpr-agreement:before{content:'\2713';top:-1px;bottom:-1px;left:-1px;position:absolute;width:42.5px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s;-webkit-transform:translateZ(0);transform:translateZ(0);text-shadow:none;text-decoration:none;font-size:13px;line-height:26px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-top-left-radius:3px;border-bottom-left-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc;vertical-align:top;border-right:none}.gdpr.gdpr-privacy-preferences .gdpr-wrapper,.gdpr.gdpr-general-confirmation .gdpr-wrapper{position:fixed;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%);z-index:999999999;width:100%;max-width:768px;height:100%;max-height:500px;overflow:hidden;display:none;border-radius:2.5px;padding:15px;-webkit-box-sizing:border-box;box-sizing:border-box}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form,.gdpr.gdpr-general-confirmation .gdpr-wrapper form{height:100%;position:relative}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header{display:-webkit-box;display:-ms-flexbox;display:flex;height:75px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .logo,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .logo{max-width:30%}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .logo a,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .logo a{padding:0;margin:0}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .logo a img,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .logo a img{display:block}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title{background:#23282d;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:relative}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title h3,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title h3{margin:0 !important;padding:0 !important;text-align:center !important;color:#fff !important;font-weight:600 !important;font-size:22px !important}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title h3,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title h3{font-size:18px !important}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title .gdpr-close,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title .gdpr-close{color:#fff;position:absolute;top:0;right:0;cursor:pointer;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;padding:15px 15px;line-height:0}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title .gdpr-close:hover:before,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title .gdpr-close:hover:before{-webkit-transform:scale(1.5);-ms-transform:scale(1.5);transform:scale(1.5)}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title .gdpr-close:before,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title .gdpr-close:before{content:'\00D7';line-height:12.5px;font-size:25px;display:inline-block;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer{position:absolute;padding:0 20px 20px 20px;bottom:0;left:160px;right:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer{left:0;bottom:5px}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer input[type="submit"],.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer input[type="submit"]{font-size:13px;font-weight:normal;line-height:26px;height:28px;margin:0;padding:0 10px 1px;border-width:1px;border-style:solid;border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer input[type="submit"]:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer input[type="submit"]:hover{background:#008ec2;border-color:#006799}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer input[type="submit"]:active,.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer input[type="submit"].focus,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer input[type="submit"]:active,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer input[type="submit"].focus{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer span,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer span{font-size:13px;line-height:20px;color:#555d66;font-style:italic}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer span a,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer span a{color:#0073aa;-webkit-transition-property:border,background,color;-o-transition-property:border,background,color;transition-property:border,background,color;-webkit-transition-duration:.05s;-o-transition-duration:.05s;transition-duration:.05s;-webkit-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;text-decoration:underline}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer span a:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer span a:hover{color:#00a0d2}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu{display:none}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu{display:block}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu button,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu button{width:100%;background-color:#191e23;color:#fff;font-size:14px;text-align:left;padding:15px;border-radius:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;line-height:0}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu button:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu button:hover{color:#00b9eb}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu button:hover:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu button:hover:after{border-top-color:#00b9eb}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu button:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu button:after{content:'';width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:7.5px solid #fff;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s;right:15px;top:12px;position:absolute}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu button.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu button.gdpr-active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content{display:-webkit-box;display:-ms-flexbox;display:flex;height:calc( 100% - 75px);background:#f1f1f1}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content{position:relative;height:calc( 100% - 119px)}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-policies li a,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-policies li a{font-style:italic;font-size:12px !important;color:#ababab !important}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs{border:none !important;min-width:160px;max-width:160px;padding:0;margin:0;overflow-y:auto;background-color:#23282d;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs{position:absolute;height:100%;width:100%;max-width:100%;display:none;z-index:1}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li{list-style:none}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a{display:block;width:100%;background:#23282d;color:#fff;font-size:14px;text-align:left;text-decoration:none;padding:8px;border-radius:0;position:relative}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a{padding:15px;line-height:1}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button:hover,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a:hover{background-color:#191e23;color:#00b9eb}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active{background-color:#0073aa}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:hover,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:hover{color:#fff}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:after,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:after{right:0;border:8px solid transparent;content:'';height:0;width:0;position:absolute;pointer-events:none;border-right-color:#f1f1f1;top:50%;margin-top:-8px}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:after,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:after{display:none}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs{position:relative;padding:8px 0;top:auto;left:auto;right:auto;bottom:auto;border:0;margin:0 0 0 0;-webkit-box-shadow:none;box-shadow:none;background-color:#32373c}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button{background-color:transparent;font-size:13px;line-height:18px;padding:5px 8px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button.gdpr-active,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button.gdpr-active{font-weight:600}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button.gdpr-active:after{border:none;content:''}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content{width:100%;margin-bottom:68px;overflow-y:auto}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div{display:none;padding:20px 20px 0 20px;overflow-y:auto;font-size:13px;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header h4,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header label,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header h4,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header label{margin:0}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header h4,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header h4{font-weight:600 !important;padding-right:10px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info{height:100%;overflow-y:auto;-webkit-box-flex:1;-ms-flex:1;flex:1;margin-top:20px;position:relative}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info>p,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info>p{margin-bottom:16px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info strong,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info strong{border-bottom:1px solid rgba(0,0,0,0.4);display:block}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used{font-family:Helvetica, Arial, sans-serif;border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.04);box-shadow:0 1px 1px rgba(0,0,0,0.04);margin-bottom:10px;background-color:#fff;font-size:13px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used:first-of-type,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used:first-of-type{padding-top:0}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title{padding:10px;border-bottom:1px solid #e1e1e1;color:#32373c;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title p,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title p{margin:0;font-weight:600 !important}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title .gdpr-always-active,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title .gdpr-always-active{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:0 10px;min-height:24px;text-align:center;border-radius:50px;line-height:16px;background-color:#00b9eb;color:#fff;font-style:normal}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title a,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title a{color:#0073aa}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title a:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title a:hover{color:#00a0d2}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookies,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookies{color:#555;background-color:#f9f9f9;padding:10px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookies span,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookies span{font-style:italic}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content .gdpr-active,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content .gdpr-active{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.gdpr.gdpr-general-confirmation .gdpr-wrapper{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;max-width:400px;min-height:250px}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header{display:-webkit-box;display:-ms-flexbox;display:flex;height:75px}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .logo{max-width:30%}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .logo a{padding:0;margin:0}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .logo a img{display:block}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title{background:#23282d;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:relative}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title h3{margin:0 !important;padding:0 !important;text-align:center !important;color:#fff !important;font-weight:600 !important;font-size:22px !important}@media screen and (max-width: 640px){.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title h3{font-size:18px !important}}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title .gdpr-close{color:#fff;position:absolute;top:0;right:0;cursor:pointer;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;padding:15px 15px;line-height:0}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title .gdpr-close:hover:before{-webkit-transform:scale(1.5);-ms-transform:scale(1.5);transform:scale(1.5)}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title .gdpr-close:before{content:'\00D7';line-height:12.5px;font-size:25px;display:inline-block;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer{background:#f1f1f1;padding:20px}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button{font-size:13px;font-weight:normal;line-height:26px;height:28px;margin:0;padding:0 10px 1px;border-width:1px;border-style:solid;border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799;display:inline}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button:hover{background:#008ec2;border-color:#006799}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button:active,.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button.focus{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button.gdpr-cancel{color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc;text-shadow:none}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button.gdpr-cancel:hover{background:#fafafa;border-color:#999;color:#23282d;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button.gdpr-cancel:active,.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button.gdpr-cancel:focus{background:#eee;border-color:#999;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,0.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,0.5);-webkit-transform:translateY(1px);-ms-transform:translateY(1px);transform:translateY(1px);color:#23282d}.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content{padding:20px 20px 0 20px;height:auto}.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content p{margin:0}.gdpr-switch{position:relative;display:inline-block;min-width:45px;height:24px;margin-bottom:0}.gdpr-switch input{position:absolute;left:-999em}.gdpr-switch .gdpr-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;-o-transition:.4s;transition:.4s}.gdpr-switch .gdpr-slider:before{position:absolute;content:"";height:16px;width:16px;left:4px;bottom:4px;background-color:white;-webkit-transition:.4s;-o-transition:.4s;transition:.4s}.gdpr-switch .gdpr-slider.round{border-radius:34px}.gdpr-switch .gdpr-slider.round:before{border-radius:50%}.gdpr-switch input:checked+.gdpr-slider{background-color:#00b9eb}.gdpr-switch input:checked+.gdpr-slider:before{-webkit-transform:translateX(21px);-ms-transform:translateX(21px);transform:translateX(21px)}.gdpr-switch input:focus+.gdpr-slider{-webkit-box-shadow:0 0 1px #00b9eb;box-shadow:0 0 1px #00b9eb}
1
+ .gdpr-noscroll{overflow:hidden;position:fixed;width:100%}.gdpr-hidden{display:none}.gdpr-overlay{position:fixed;top:0;left:0;width:100%;height:100%;background:rgba(0,0,0,0.7);z-index:99999999;display:none}.gdpr *{font-family:Helvetica, Arial, sans-serif !important;text-transform:none !important;letter-spacing:0 !important;color:#455561;background:none;-webkit-box-shadow:none;box-shadow:none;text-shadow:none;outline:none;border:none;margin:0;padding:0}.gdpr .h5{font-size:18px;font-weight:bold;color:#fff}.gdpr button,.gdpr input[type="submit"]{color:#000;font-weight:normal;font-size:14px;margin:0;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);line-height:1.5;display:block;min-width:auto;max-width:auto;cursor:pointer}.gdpr button:before,.gdpr button:after,.gdpr input[type="submit"]:before,.gdpr input[type="submit"]:after{display:inline-block;margin:0;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1);top:auto;right:auto;bottom:auto;left:auto;background:none}.gdpr button:hover,.gdpr button:active,.gdpr button:focus,.gdpr input[type="submit"]:hover,.gdpr input[type="submit"]:active,.gdpr input[type="submit"]:focus{margin:0;border:none;-webkit-box-shadow:none;box-shadow:none}.gdpr img{width:100% !important}.gdpr .gdpr-contained-wrapper{max-width:600px;margin:0 auto;padding:20px 40px;-webkit-box-sizing:border-box;box-sizing:border-box}@media screen and (max-width: 1024px){.gdpr .gdpr-contained-wrapper{padding:20px}}.gdpr.gdpr-privacy-bar,.gdpr.gdpr-reconsent-bar{position:fixed;bottom:0;left:0;background:rgba(0,0,0,0.9);width:100%;color:#fff;z-index:9999999}.gdpr.gdpr-privacy-bar .gdpr-wrapper,.gdpr.gdpr-reconsent-bar .gdpr-wrapper{padding:20px 40px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-sizing:border-box;box-sizing:border-box;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;align-items:center}@media screen and (min-width: 1440px){.gdpr.gdpr-privacy-bar .gdpr-wrapper,.gdpr.gdpr-reconsent-bar .gdpr-wrapper{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}}.gdpr.gdpr-privacy-bar .gdpr-wrapper:after,.gdpr.gdpr-reconsent-bar .gdpr-wrapper:after{content:"";display:table;clear:both}.gdpr.gdpr-privacy-bar .gdpr-wrapper p,.gdpr.gdpr-reconsent-bar .gdpr-wrapper p{margin:0;font-size:14px;font-weight:normal}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content{width:100%;padding:0 0 20px 0;text-align:center}@media screen and (min-width: 1440px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content{-webkit-box-flex:1;-ms-flex:1;flex:1;padding:0 100px 0 0;text-align:left}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content p,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content p{color:#ffffff;font-size:14px}@media screen and (max-width: 1024px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content{padding-right:0;padding-bottom:20px}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content .gdpr-policy-pages .gdpr-policy-pages-item:after,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content .gdpr-policy-pages .gdpr-policy-pages-item:after{content:',';margin-right:5px}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-content .gdpr-policy-pages .gdpr-policy-pages-item:last-of-type:after,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-content .gdpr-policy-pages .gdpr-policy-pages-item:last-of-type:after{content:'';margin-right:0}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center}@media screen and (max-width: 1024px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list{list-style:none;padding:0 20px 0 0;margin:0 20px 0 0;border-right:1px solid #808080}@media screen and (max-width: 1024px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list{padding:0 0 10px 0;margin:0 0 20px 0;border-right:none;border-bottom:1px solid #808080;text-align:center}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item{display:inline-block;margin:0 10px;padding-top:10px}@media screen and (max-width: 1024px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item{padding-top:0}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item *,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item *,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item *,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item *,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item *,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item *,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item *,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item *{float:left}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item input,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item input,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item input,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item input,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item input,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item input,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item input,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item input{margin-top:3px}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item label,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item label,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item label,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item label,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item label,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item label,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item label,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item label{color:#fff;margin:0 5px;font-size:14px}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item .gdpr-policy-link,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item .gdpr-policy-link,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item .gdpr-policy-link,.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item .gdpr-policy-link,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-cookie-categories-item .gdpr-policy-link,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories .gdpr-policy-list-item .gdpr-policy-link,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-cookie-categories-item .gdpr-policy-link,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-policy-list .gdpr-policy-list-item .gdpr-policy-link{color:#fff;font-size:14px;text-decoration:underline}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-cookie-categories{margin-bottom:5px}}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button{white-space:nowrap}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences{margin-left:10px;margin-right:20px}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences{margin:0 0 10px 15px}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences:before,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-preferences:before{left:-7px}}.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-agreement,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-agreement{margin:0 10px;-ms-flex-item-align:center;align-self:center}@media screen and (min-width: 1440px){.gdpr.gdpr-privacy-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-agreement,.gdpr.gdpr-reconsent-bar .gdpr-wrapper .gdpr-right .gdpr-buttons button.gdpr-agreement{margin:0 0 0 10px}}.gdpr.gdpr-privacy-bar .gdpr-preferences,.gdpr.gdpr-reconsent-bar .gdpr-preferences{font-weight:normal;font-size:14px;text-decoration:underline;position:relative;margin-left:9px;color:#fff;float:left}.gdpr.gdpr-privacy-bar .gdpr-preferences:before,.gdpr.gdpr-reconsent-bar .gdpr-preferences:before{content:'\276F';font-size:1.1em;font-weight:normal;padding-right:5px;color:#fff;position:absolute;left:-7px;top:10px}.gdpr.gdpr-privacy-bar .gdpr-preferences:hover,.gdpr.gdpr-privacy-bar .gdpr-preferences:active,.gdpr.gdpr-privacy-bar .gdpr-preferences:focus,.gdpr.gdpr-privacy-bar .gdpr-preferences:focus-within,.gdpr.gdpr-privacy-bar .gdpr-preferences:visited,.gdpr.gdpr-reconsent-bar .gdpr-preferences:hover,.gdpr.gdpr-reconsent-bar .gdpr-preferences:active,.gdpr.gdpr-reconsent-bar .gdpr-preferences:focus,.gdpr.gdpr-reconsent-bar .gdpr-preferences:focus-within,.gdpr.gdpr-reconsent-bar .gdpr-preferences:visited{background:none}.gdpr.gdpr-privacy-bar button,.gdpr.gdpr-reconsent-bar button{margin:0 5px;padding:9px 10px}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-bar button,.gdpr.gdpr-reconsent-bar button{margin:0}}.gdpr.gdpr-privacy-bar .gdpr-agreement,.gdpr.gdpr-reconsent-bar .gdpr-agreement{position:relative;font-size:13px;font-weight:normal;padding:12px 36px 12px 76px;height:auto;line-height:1.4285714;white-space:normal;margin:0;border-width:1px;border-style:solid;border-radius:3px;-webkit-box-sizing:border-box;box-sizing:border-box;background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-bar .gdpr-agreement,.gdpr.gdpr-reconsent-bar .gdpr-agreement{padding:7px 16px 7px 56px}}.gdpr.gdpr-privacy-bar .gdpr-agreement:hover,.gdpr.gdpr-reconsent-bar .gdpr-agreement:hover{background:#008ec2;border-color:#006799}.gdpr.gdpr-privacy-bar .gdpr-agreement:hover:before,.gdpr.gdpr-reconsent-bar .gdpr-agreement:hover:before{font-size:26px;background:#fafafa;color:#00b9eb}.gdpr.gdpr-privacy-bar .gdpr-agreement:active,.gdpr.gdpr-privacy-bar .gdpr-agreement:focus,.gdpr.gdpr-reconsent-bar .gdpr-agreement:active,.gdpr.gdpr-reconsent-bar .gdpr-agreement:focus{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.gdpr.gdpr-privacy-bar .gdpr-agreement:active:before,.gdpr.gdpr-privacy-bar .gdpr-agreement:focus:before,.gdpr.gdpr-reconsent-bar .gdpr-agreement:active:before,.gdpr.gdpr-reconsent-bar .gdpr-agreement:focus:before{-webkit-box-shadow:inset 0 2px 0 #ccc;box-shadow:inset 0 2px 0 #ccc;vertical-align:top}.gdpr.gdpr-privacy-bar .gdpr-agreement:before,.gdpr.gdpr-reconsent-bar .gdpr-agreement:before{content:'\2713';top:-1px;bottom:-1px;left:-1px;position:absolute;width:42.5px;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s;-webkit-transform:translateZ(0);transform:translateZ(0);text-shadow:none;text-decoration:none;font-size:13px;line-height:26px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;-moz-appearance:none;appearance:none;border-top-left-radius:3px;border-bottom-left-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc;vertical-align:top;border-right:none}.gdpr.gdpr-privacy-preferences .gdpr-wrapper,.gdpr.gdpr-general-confirmation .gdpr-wrapper{position:fixed;top:50%;left:50%;-webkit-transform:translate(-50%, -50%);-ms-transform:translate(-50%, -50%);transform:translate(-50%, -50%);z-index:999999999;width:100%;max-width:768px;height:100%;max-height:500px;overflow:hidden;display:none;border-radius:2.5px;padding:15px;-webkit-box-sizing:border-box;box-sizing:border-box}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form,.gdpr.gdpr-general-confirmation .gdpr-wrapper form{height:100%;position:relative}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header{display:-webkit-box;display:-ms-flexbox;display:flex;height:75px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .logo,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .logo{max-width:30%}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .logo a,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .logo a{padding:0;margin:0}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .logo a img,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .logo a img{display:block}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title{background:#23282d;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:relative}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title h3,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title h3{margin:0 !important;padding:0 !important;text-align:center !important;color:#fff !important;font-weight:600 !important;font-size:22px !important}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title h3,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title h3{font-size:18px !important}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title .gdpr-close,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title .gdpr-close{color:#fff;position:absolute;top:0;right:0;cursor:pointer;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;padding:15px 15px;line-height:0}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title .gdpr-close:hover:before,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title .gdpr-close:hover:before{-webkit-transform:scale(1.5);-ms-transform:scale(1.5);transform:scale(1.5)}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>header .gdpr-box-title .gdpr-close:before,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>header .gdpr-box-title .gdpr-close:before{content:'\00D7';line-height:12.5px;font-size:25px;display:inline-block;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer{position:absolute;padding:0 20px 20px 20px;bottom:0;left:160px;right:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer{left:0;bottom:5px}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer input[type="submit"],.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer input[type="submit"]{font-size:13px;font-weight:normal;line-height:26px;height:28px;margin:0;padding:0 10px 1px;border-width:1px;border-style:solid;border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer input[type="submit"]:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer input[type="submit"]:hover{background:#008ec2;border-color:#006799}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer input[type="submit"]:active,.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer input[type="submit"].focus,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer input[type="submit"]:active,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer input[type="submit"].focus{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer span,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer span{font-size:13px;line-height:20px;color:#555d66;font-style:italic}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer span a,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer span a{color:#0073aa;-webkit-transition-property:border,background,color;-o-transition-property:border,background,color;transition-property:border,background,color;-webkit-transition-duration:.05s;-o-transition-duration:.05s;transition-duration:.05s;-webkit-transition-timing-function:ease-in-out;-o-transition-timing-function:ease-in-out;transition-timing-function:ease-in-out;text-decoration:underline}.gdpr.gdpr-privacy-preferences .gdpr-wrapper form>footer span a:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper form>footer span a:hover{color:#00a0d2}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu{display:none}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu{display:block}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu button,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu button{width:100%;background-color:#191e23;color:#fff;font-size:14px;text-align:left;padding:15px;border-radius:0;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:center;-ms-flex-align:center;align-items:center;line-height:0}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu button:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu button:hover{color:#00b9eb}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu button:hover:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu button:hover:after{border-top-color:#00b9eb}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu button:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu button:after{content:'';width:0;height:0;border-left:7.5px solid transparent;border-right:7.5px solid transparent;border-top:7.5px solid #fff;-webkit-transition:all 0.2s;-o-transition:all 0.2s;transition:all 0.2s;right:15px;top:12px;position:absolute}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-mobile-menu button.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-mobile-menu button.gdpr-active:after{-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content{display:-webkit-box;display:-ms-flexbox;display:flex;height:calc( 100% - 75px);background:#f1f1f1}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content{position:relative;height:calc( 100% - 119px)}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-policies li a,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-policies li a{font-style:italic;font-size:12px !important;color:#ababab !important}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs{border:none !important;min-width:160px;max-width:160px;padding:0;margin:0;overflow-y:auto;background-color:#23282d;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs{position:absolute;height:100%;width:100%;max-width:100%;display:none;z-index:1}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li{list-style:none}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a{display:block;width:100%;background:#23282d;color:#fff;font-size:14px;text-align:left;text-decoration:none;padding:8px;border-radius:0;position:relative}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a{padding:15px;line-height:1}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button:hover,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a:hover{background-color:#191e23;color:#00b9eb}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active{background-color:#0073aa}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:hover,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:hover{color:#fff}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:after,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:after{right:0;border:8px solid transparent;content:'';height:0;width:0;position:absolute;pointer-events:none;border-right-color:#f1f1f1;top:50%;margin-top:-8px}@media screen and (max-width: 640px){.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:after,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li button.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li a.gdpr-active:after{display:none}}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs{position:relative;padding:8px 0;top:auto;left:auto;right:auto;bottom:auto;border:0;margin:0 0 0 0;-webkit-box-shadow:none;box-shadow:none;background-color:#32373c}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button{background-color:transparent;font-size:13px;line-height:18px;padding:5px 8px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button.gdpr-active,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button.gdpr-active{font-weight:600}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button.gdpr-active:after,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tabs li .gdpr-subtabs li button.gdpr-active:after{border:none;content:''}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content{width:100%;margin-bottom:68px;overflow-y:auto}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div{display:none;padding:20px 20px 0 20px;overflow-y:auto;font-size:13px;height:100%;-webkit-box-sizing:border-box;box-sizing:border-box}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header h4,.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header label,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header h4,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header label{margin:0}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header h4,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div header h4{font-weight:600 !important;padding-right:10px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info{height:100%;overflow-y:auto;-webkit-box-flex:1;-ms-flex:1;flex:1;margin-top:20px;position:relative}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info>p,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info>p{margin-bottom:16px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info strong,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info strong{border-bottom:1px solid rgba(0,0,0,0.4);display:block}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used{font-family:Helvetica, Arial, sans-serif;border:1px solid #e5e5e5;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.04);box-shadow:0 1px 1px rgba(0,0,0,0.04);margin-bottom:10px;background-color:#fff;font-size:13px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used:first-of-type,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used:first-of-type{padding-top:0}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title{padding:10px;border-bottom:1px solid #e1e1e1;color:#32373c;position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;-webkit-box-align:end;-ms-flex-align:end;align-items:flex-end}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title p,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title p{margin:0;font-weight:600 !important}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title .gdpr-always-active,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title .gdpr-always-active{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:0 10px;min-height:24px;text-align:center;border-radius:50px;line-height:16px;background-color:#00b9eb;color:#fff;font-style:normal}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title a,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title a{color:#0073aa}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title a:hover,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookie-title a:hover{color:#00a0d2}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookies,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookies{color:#555;background-color:#f9f9f9;padding:10px}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookies span,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content>div .gdpr-info .gdpr-cookies-used .gdpr-cookies span{font-style:italic}.gdpr.gdpr-privacy-preferences .gdpr-wrapper .gdpr-content .gdpr-tab-content .gdpr-active,.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content .gdpr-tab-content .gdpr-active{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.gdpr.gdpr-general-confirmation .gdpr-wrapper{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;max-width:400px;min-height:250px}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header{display:-webkit-box;display:-ms-flexbox;display:flex;height:75px}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .logo{max-width:30%}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .logo a{padding:0;margin:0}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .logo a img{display:block}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title{background:#23282d;-webkit-box-flex:1;-ms-flex-positive:1;flex-grow:1;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;position:relative}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title h3{margin:0 !important;padding:0 !important;text-align:center !important;color:#fff !important;font-weight:600 !important;font-size:22px !important}@media screen and (max-width: 640px){.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title h3{font-size:18px !important}}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title .gdpr-close{color:#fff;position:absolute;top:0;right:0;cursor:pointer;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;padding:15px 15px;line-height:0}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title .gdpr-close:hover:before{-webkit-transform:scale(1.5);-ms-transform:scale(1.5);transform:scale(1.5)}.gdpr.gdpr-general-confirmation .gdpr-wrapper>header .gdpr-box-title .gdpr-close:before{content:'\00D7';line-height:12.5px;font-size:25px;display:inline-block;-webkit-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;-webkit-transform:translateZ(0);transform:translateZ(0);-webkit-backface-visibility:hidden;backface-visibility:hidden}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer{background:#f1f1f1;padding:20px}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button{font-size:13px;font-weight:normal;line-height:26px;height:28px;margin:0;padding:0 10px 1px;border-width:1px;border-style:solid;border-radius:3px;white-space:nowrap;-webkit-box-sizing:border-box;box-sizing:border-box;background:#0085ba;border-color:#0073aa #006799 #006799;-webkit-box-shadow:0 1px 0 #006799;box-shadow:0 1px 0 #006799;color:#fff;text-decoration:none;text-shadow:0 -1px 1px #006799, 1px 0 1px #006799, 0 1px 1px #006799, -1px 0 1px #006799;display:inline}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button:hover{background:#008ec2;border-color:#006799}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button:active,.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button.focus{background:#0073aa;border-color:#006799;-webkit-box-shadow:inset 0 2px 0 #006799;box-shadow:inset 0 2px 0 #006799;vertical-align:top}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button.gdpr-cancel{color:#555;border-color:#ccc;background:#f7f7f7;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc;text-shadow:none}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button.gdpr-cancel:hover{background:#fafafa;border-color:#999;color:#23282d;-webkit-box-shadow:0 1px 0 #ccc;box-shadow:0 1px 0 #ccc}.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button.gdpr-cancel:active,.gdpr.gdpr-general-confirmation .gdpr-wrapper>footer button.gdpr-cancel:focus{background:#eee;border-color:#999;-webkit-box-shadow:inset 0 2px 5px -3px rgba(0,0,0,0.5);box-shadow:inset 0 2px 5px -3px rgba(0,0,0,0.5);-webkit-transform:translateY(1px);-ms-transform:translateY(1px);transform:translateY(1px);color:#23282d}.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content{padding:20px 20px 0 20px;height:auto}.gdpr.gdpr-general-confirmation .gdpr-wrapper .gdpr-content p{margin:0}.gdpr-switch{position:relative;display:inline-block;min-width:45px;height:24px;margin-bottom:0}.gdpr-switch input{position:absolute;left:-999em}.gdpr-switch .gdpr-slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;-o-transition:.4s;transition:.4s}.gdpr-switch .gdpr-slider:before{position:absolute;content:"";height:16px;width:16px;left:4px;bottom:4px;background-color:white;-webkit-transition:.4s;-o-transition:.4s;transition:.4s}.gdpr-switch .gdpr-slider.round{border-radius:34px}.gdpr-switch .gdpr-slider.round:before{border-radius:50%}.gdpr-switch input:checked+.gdpr-slider{background-color:#00b9eb}.gdpr-switch input:checked+.gdpr-slider:before{-webkit-transform:translateX(21px);-ms-transform:translateX(21px);transform:translateX(21px)}.gdpr-switch input:focus+.gdpr-slider{-webkit-box-shadow:0 0 1px #00b9eb;box-shadow:0 0 1px #00b9eb}
assets/js/gdpr-public.js CHANGED
@@ -1 +1 @@
1
- !function(e){"use strict";var r=location.search,n=location.protocol+"//"+location.host+location.pathname;function t(r,n,t){t=void 0!==t,e(".gdpr-general-confirmation .gdpr-box-title h3").html(r),e(".gdpr-general-confirmation .gdpr-content p").html(n),t?(e(".gdpr-general-confirmation").addClass("gdpr-delete-confirmation"),e(".gdpr-general-confirmation footer").html('<button class="gdpr-delete-account">'+GDPR.i18n.continue+'</button> <button class="gdpr-cancel">'+GDPR.i18n.cancel+"</button>")):e(".gdpr-general-confirmation footer").html('<button class="gdpr-ok">'+GDPR.i18n.ok+"</button>"),e(".gdpr-overlay").fadeIn(),e("body").addClass("gdpr-noscroll"),e(".gdpr.gdpr-general-confirmation .gdpr-wrapper").css({display:"flex"}).hide().fadeIn()}window.has_consent=function(e){if(Cookies.get("gdpr[consent_types]")&&JSON.parse(Cookies.get("gdpr[consent_types]")).indexOf(e)>-1)return!0;return!1},window.is_allowed_cookie=function(e){if(Cookies.get("gdpr[allowed_cookies]")&&JSON.parse(Cookies.get("gdpr[allowed_cookies]")).indexOf(e)>-1)return!0;return!1},e(function(){-1!==r.indexOf("notify=1")&&(window.history.replaceState({},document.title,n),e("body").addClass("gdpr-notification")),e(document).on("submit",".gdpr-privacy-preferences-frm",function(r){r.preventDefault();e(this);var n=e(this).serialize();e.post(GDPR.ajaxurl,n,function(r){r.success?(Cookies.set("gdpr[privacy_bar]",1,{expires:365}),GDPR.refresh?window.location.reload():(e(".gdpr-overlay").fadeOut(),e("body").removeClass("gdpr-noscroll"),e(".gdpr.gdpr-privacy-preferences .gdpr-wrapper").fadeOut(),e(".gdpr-privacy-bar").fadeOut())):t(r.data.title,r.data.content)})}),e(document).on("submit",".gdpr-request-form",function(r){r.preventDefault();e(this),e(this).find('input[name="type"]').val();var n=e(this).serialize();e.post(GDPR.ajaxurl,n,function(e){t(e.data.title,e.data.content)})}),e(document).on("change",".gdpr-cookie-category",function(){var r=e(this).data("category"),n=e(this).prop("checked");e('[data-category="'+r+'"]').prop("checked",n)}),Cookies.get("gdpr[privacy_bar]")||0==e(".gdpr-reconsent-bar").length&&e(".gdpr.gdpr-privacy-bar").delay(1e3).slideDown(600),e(".gdpr-reconsent-bar").length>0&&e(".gdpr.gdpr-reconsent-bar").delay(1e3).slideDown(600),e(document).on("click",".gdpr.gdpr-privacy-bar .gdpr-agreement",function(){e(".gdpr-privacy-preferences-frm").submit()}),e(document).on("click",".gdpr.gdpr-reconsent-bar .gdpr-agreement",function(){var r=[];e('.gdpr-policy-list input[type="hidden"]').each(function(){r.push(e(this).val())}),e.post(GDPR.ajaxurl,{action:"agree_with_new_policies",nonce:e(this).data("nonce"),consents:r},function(r){r.success?GDPR.refresh?window.location.reload():(e(".gdpr-reconsent-bar").slideUp(600),Cookies.get("gdpr[privacy_bar]")||e(".gdpr.gdpr-privacy-bar").delay(1e3).slideDown(600)):t(response.data.title,response.data.content)})}),e(document).on("click",".gdpr-preferences",function(r){r.preventDefault();e(this).data("type");e(".gdpr-overlay").fadeIn(),e("body").addClass("gdpr-noscroll"),e(".gdpr.gdpr-privacy-preferences .gdpr-wrapper").fadeIn()}),e(document).on("click",".gdpr.gdpr-privacy-preferences .gdpr-close, .gdpr-overlay",function(){e(".gdpr-overlay").fadeOut(),e("body").removeClass("gdpr-noscroll"),e(".gdpr.gdpr-privacy-preferences .gdpr-wrapper").fadeOut()}),e(document).on("click",".gdpr.gdpr-privacy-preferences .gdpr-tabs button",function(){var r="."+e(this).data("target");e(".gdpr.gdpr-privacy-preferences .gdpr-tab-content > div").removeClass("gdpr-active"),e(".gdpr.gdpr-privacy-preferences .gdpr-tab-content "+r).addClass("gdpr-active"),e(".gdpr.gdpr-privacy-preferences .gdpr-tabs").hasClass("gdpr-mobile-expanded")&&(e(".gdpr.gdpr-privacy-preferences .gdpr-mobile-menu button").removeClass("gdpr-active"),e(".gdpr.gdpr-privacy-preferences .gdpr-tabs").toggle()),e(".gdpr.gdpr-privacy-preferences .gdpr-tabs button").removeClass("gdpr-active"),e(".gdpr-subtabs li button").removeClass("gdpr-active"),e(this).hasClass("gdpr-tab-button")?(e(this).addClass("gdpr-active"),e(this).hasClass("gdpr-cookie-settings")&&e(".gdpr-subtabs").find("li button").first().addClass("gdpr-active")):(e(".gdpr-cookie-settings").addClass("gdpr-active"),e(this).addClass("gdpr-active"))}),e(document).on("click",".gdpr.gdpr-privacy-preferences .gdpr-mobile-menu button",function(r){e(this).toggleClass("gdpr-active"),e(".gdpr.gdpr-privacy-preferences .gdpr-tabs").toggle().addClass("gdpr-mobile-expanded")}),e(window).resize(function(){e(window).width()>640&&e(".gdpr.gdpr-privacy-preferences .gdpr-tabs").hasClass("gdpr-mobile-expanded")&&(e(".gdpr.gdpr-privacy-preferences .gdpr-mobile-menu button").removeClass("gdpr-active"),e(".gdpr.gdpr-privacy-preferences .gdpr-tabs").removeClass("gdpr-mobile-expanded").removeAttr("style"))}),e("form.gdpr-add-to-deletion-requests").on("submit",function(r){e(this).hasClass("confirmed")||(r.preventDefault(),e(".gdpr-overlay").fadeIn(),e("body").addClass("gdpr-noscroll"),e(".gdpr.gdpr-delete-confirmation .gdpr-wrapper").css({display:"flex"}).hide().fadeIn())}),e(document).on("click",".gdpr.gdpr-delete-confirmation button.gdpr-delete-account",function(){e("form.gdpr-add-to-deletion-requests").addClass("confirmed"),e('form.gdpr-add-to-deletion-requests.confirmed input[type="submit"]').click(),e(".gdpr-overlay").fadeOut(),e("body").removeClass("gdpr-noscroll"),e(".gdpr.gdpr-delete-confirmation .gdpr-wrapper").fadeOut()}),e("body").hasClass("gdpr-notification")&&(e(".gdpr-overlay").fadeIn(),e("body").addClass("gdpr-noscroll"),e(".gdpr.gdpr-general-confirmation .gdpr-wrapper").css({display:"flex"}).hide().fadeIn()),e(document).on("click",".gdpr.gdpr-general-confirmation button.gdpr-ok",function(){e(".gdpr-overlay").fadeOut(),e("body").removeClass("gdpr-noscroll"),e(".gdpr.gdpr-general-confirmation .gdpr-wrapper").fadeOut()}),e(document).on("click",".gdpr-disagree",function(r){e(".gdpr-overlay").fadeIn(),e("body").addClass("gdpr-noscroll"),e(".gdpr.gdpr-disagree-confirmation .gdpr-wrapper").css({display:"flex"}).hide().fadeIn()}),e(document).on("click",".gdpr-disagree-confirm",function(r){r.preventDefault(),e(".gdpr-overlay").fadeOut(),e(".gdpr.gdpr-disagree-confirmation .gdpr-wrapper").fadeOut(),e(".gdpr-consent-buttons").fadeOut(300,function(){e(".gdpr-updating").html(GDPR.i18n.aborting),e(".gdpr-consent-loading").fadeIn(300)});var n=0;setInterval(function(){e(".gdpr-ellipsis").html();n<3?(e(".gdpr-ellipsis").append("."),n++):(e(".gdpr-ellipsis").html(""),n=0)},600);e.post(GDPR.ajaxurl,{action:"disagree_with_terms",nonce:e(this).data("nonce")},function(e){e.success&&location.reload()})})})}(jQuery),function(e){var r=!1;if("function"==typeof define&&define.amd&&(define(e),r=!0),"object"==typeof exports&&(module.exports=e(),r=!0),!r){var n=window.Cookies,t=window.Cookies=e();t.noConflict=function(){return window.Cookies=n,t}}}(function(){function e(){for(var e=0,r={};e<arguments.length;e++){var n=arguments[e];for(var t in n)r[t]=n[t]}return r}return function r(n){function t(r,o,d){var a;if("undefined"!=typeof document){if(arguments.length>1){if("number"==typeof(d=e({path:"/"},t.defaults,d)).expires){var p=new Date;p.setMilliseconds(p.getMilliseconds()+864e5*d.expires),d.expires=p}d.expires=d.expires?d.expires.toUTCString():"";try{a=JSON.stringify(o),/^[\{\[]/.test(a)&&(o=a)}catch(e){}o=n.write?n.write(o,r):encodeURIComponent(String(o)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),r=(r=(r=encodeURIComponent(String(r))).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent)).replace(/[\(\)]/g,escape);var i="";for(var s in d)d[s]&&(i+="; "+s,!0!==d[s]&&(i+="="+d[s]));return document.cookie=r+"="+o+i}r||(a={});for(var c=document.cookie?document.cookie.split("; "):[],g=/(%[0-9A-Z]{2})+/g,l=0;l<c.length;l++){var f=c[l].split("="),u=f.slice(1).join("=");this.json||'"'!==u.charAt(0)||(u=u.slice(1,-1));try{var m=f[0].replace(g,decodeURIComponent);if(u=n.read?n.read(u,m):n(u,m)||u.replace(g,decodeURIComponent),this.json)try{u=JSON.parse(u)}catch(e){}if(r===m){a=u;break}r||(a[m]=u)}catch(e){}}return a}}return t.set=t,t.get=function(e){return t.call(t,e)},t.getJSON=function(){return t.apply({json:!0},[].slice.call(arguments))},t.defaults={},t.remove=function(r,n){t(r,"",e(n,{expires:-1}))},t.withConverter=r,t}(function(){})});
1
+ !function(e){"use strict";var r=location.search,t=location.protocol+"//"+location.host+location.pathname;function n(r,t,n){n=void 0!==n,e(".gdpr-general-confirmation .gdpr-box-title h3").html(r),e(".gdpr-general-confirmation .gdpr-content p").html(t),n?(e(".gdpr-general-confirmation").addClass("gdpr-delete-confirmation"),e(".gdpr-general-confirmation footer").html('<button class="gdpr-delete-account">'+GDPR.i18n.continue+'</button> <button class="gdpr-cancel">'+GDPR.i18n.cancel+"</button>")):e(".gdpr-general-confirmation footer").html('<button class="gdpr-ok">'+GDPR.i18n.ok+"</button>"),e(".gdpr-overlay").fadeIn(),e("body").addClass("gdpr-noscroll"),e(".gdpr.gdpr-general-confirmation .gdpr-wrapper").css({display:"flex"}).hide().fadeIn()}window.has_consent=function(e){if(Cookies.get("gdpr[consent_types]")&&JSON.parse(Cookies.get("gdpr[consent_types]")).indexOf(e)>-1)return!0;return!1},window.is_allowed_cookie=function(e){if(Cookies.get("gdpr[allowed_cookies]")&&JSON.parse(Cookies.get("gdpr[allowed_cookies]")).indexOf(e)>-1)return!0;return!1},e(function(){-1!==r.indexOf("notify=1")&&(window.history.replaceState({},document.title,t),e("body").addClass("gdpr-notification")),e(document).on("submit",".gdpr-privacy-preferences-frm",function(r){r.preventDefault();e(this);var t=e(this).serialize();e.post(GDPR.ajaxurl,t,function(r){r.success?(Cookies.set("gdpr[privacy_bar]",1,{expires:365}),GDPR.refresh?window.location.reload():(e(".gdpr-overlay").fadeOut(),e("body").removeClass("gdpr-noscroll"),e(".gdpr.gdpr-privacy-preferences .gdpr-wrapper").fadeOut(),e(".gdpr-privacy-bar").fadeOut())):n(r.data.title,r.data.content)})}),e(document).on("submit",".gdpr-request-form",function(r){r.preventDefault();e(this),e(this).find('input[name="type"]').val();var t=e(this).serialize();e.post(GDPR.ajaxurl,t,function(e){n(e.data.title,e.data.content)})}),e(document).on("change",".gdpr-cookie-category",function(){var r=e(this).data("category"),t=e(this).prop("checked");e('[data-category="'+r+'"]').prop("checked",t)}),Cookies.get("gdpr[privacy_bar]")||0==e(".gdpr-reconsent-bar").length&&e(".gdpr.gdpr-privacy-bar").delay(1e3).slideDown(600),e(".gdpr-reconsent-bar").length>0&&e(".gdpr.gdpr-reconsent-bar").delay(1e3).slideDown(600),e(document).on("click",".gdpr.gdpr-privacy-bar .gdpr-agreement",function(){e(".gdpr-privacy-preferences-frm").submit()}),e(document).on("click",".gdpr.gdpr-reconsent-bar .gdpr-agreement",function(){var r=[];e('.gdpr-policy-list input[type="hidden"]').each(function(){r.push(e(this).val())}),e.post(GDPR.ajaxurl,{action:"agree_with_new_policies",nonce:e(this).data("nonce"),consents:r},function(r){r.success?GDPR.refresh?window.location.reload():(e(".gdpr-reconsent-bar").slideUp(600),Cookies.get("gdpr[privacy_bar]")||e(".gdpr.gdpr-privacy-bar").delay(1e3).slideDown(600)):n(r.data.title,r.data.content)})}),e(document).on("click",".gdpr-preferences",function(r){r.preventDefault();e(this).data("type");e(".gdpr-overlay").fadeIn(),e("body").addClass("gdpr-noscroll"),e(".gdpr.gdpr-privacy-preferences .gdpr-wrapper").fadeIn()}),e(document).on("click",".gdpr.gdpr-privacy-preferences .gdpr-close, .gdpr-overlay",function(){e(".gdpr-overlay").fadeOut(),e("body").removeClass("gdpr-noscroll"),e(".gdpr.gdpr-privacy-preferences .gdpr-wrapper").fadeOut()}),e(document).on("click",".gdpr.gdpr-privacy-preferences .gdpr-tabs button",function(){var r="."+e(this).data("target");e(".gdpr.gdpr-privacy-preferences .gdpr-tab-content > div").removeClass("gdpr-active"),e(".gdpr.gdpr-privacy-preferences .gdpr-tab-content "+r).addClass("gdpr-active"),e(".gdpr.gdpr-privacy-preferences .gdpr-tabs").hasClass("gdpr-mobile-expanded")&&(e(".gdpr.gdpr-privacy-preferences .gdpr-mobile-menu button").removeClass("gdpr-active"),e(".gdpr.gdpr-privacy-preferences .gdpr-tabs").toggle()),e(".gdpr.gdpr-privacy-preferences .gdpr-tabs button").removeClass("gdpr-active"),e(".gdpr-subtabs li button").removeClass("gdpr-active"),e(this).hasClass("gdpr-tab-button")?(e(this).addClass("gdpr-active"),e(this).hasClass("gdpr-cookie-settings")&&e(".gdpr-subtabs").find("li button").first().addClass("gdpr-active")):(e(".gdpr-cookie-settings").addClass("gdpr-active"),e(this).addClass("gdpr-active"))}),e(document).on("click",".gdpr.gdpr-privacy-preferences .gdpr-mobile-menu button",function(r){e(this).toggleClass("gdpr-active"),e(".gdpr.gdpr-privacy-preferences .gdpr-tabs").toggle().addClass("gdpr-mobile-expanded")}),e(window).resize(function(){e(window).width()>640&&e(".gdpr.gdpr-privacy-preferences .gdpr-tabs").hasClass("gdpr-mobile-expanded")&&(e(".gdpr.gdpr-privacy-preferences .gdpr-mobile-menu button").removeClass("gdpr-active"),e(".gdpr.gdpr-privacy-preferences .gdpr-tabs").removeClass("gdpr-mobile-expanded").removeAttr("style"))}),e("form.gdpr-add-to-deletion-requests").on("submit",function(r){e(this).hasClass("confirmed")||(r.preventDefault(),e(".gdpr-overlay").fadeIn(),e("body").addClass("gdpr-noscroll"),e(".gdpr.gdpr-delete-confirmation .gdpr-wrapper").css({display:"flex"}).hide().fadeIn())}),e(document).on("click",".gdpr.gdpr-delete-confirmation button.gdpr-delete-account",function(){e("form.gdpr-add-to-deletion-requests").addClass("confirmed"),e('form.gdpr-add-to-deletion-requests.confirmed input[type="submit"]').click(),e(".gdpr-overlay").fadeOut(),e("body").removeClass("gdpr-noscroll"),e(".gdpr.gdpr-delete-confirmation .gdpr-wrapper").fadeOut()}),e("body").hasClass("gdpr-notification")&&(e(".gdpr-overlay").fadeIn(),e("body").addClass("gdpr-noscroll"),e(".gdpr.gdpr-general-confirmation .gdpr-wrapper").css({display:"flex"}).hide().fadeIn()),e(document).on("click",".gdpr.gdpr-general-confirmation button.gdpr-ok",function(){e(".gdpr-overlay").fadeOut(),e("body").removeClass("gdpr-noscroll"),e(".gdpr.gdpr-general-confirmation .gdpr-wrapper").fadeOut()}),e(document).on("click",".gdpr-disagree",function(r){e(".gdpr-overlay").fadeIn(),e("body").addClass("gdpr-noscroll"),e(".gdpr.gdpr-disagree-confirmation .gdpr-wrapper").css({display:"flex"}).hide().fadeIn()}),e(document).on("click",".gdpr-disagree-confirm",function(r){r.preventDefault(),e(".gdpr-overlay").fadeOut(),e(".gdpr.gdpr-disagree-confirmation .gdpr-wrapper").fadeOut(),e(".gdpr-consent-buttons").fadeOut(300,function(){e(".gdpr-updating").html(GDPR.i18n.aborting),e(".gdpr-consent-loading").fadeIn(300)});var t=0;setInterval(function(){e(".gdpr-ellipsis").html();t<3?(e(".gdpr-ellipsis").append("."),t++):(e(".gdpr-ellipsis").html(""),t=0)},600);e.post(GDPR.ajaxurl,{action:"disagree_with_terms",nonce:e(this).data("nonce")},function(e){e.success&&location.reload()})})})}(jQuery),function(e){var r=!1;if("function"==typeof define&&define.amd&&(define(e),r=!0),"object"==typeof exports&&(module.exports=e(),r=!0),!r){var t=window.Cookies,n=window.Cookies=e();n.noConflict=function(){return window.Cookies=t,n}}}(function(){function e(){for(var e=0,r={};e<arguments.length;e++){var t=arguments[e];for(var n in t)r[n]=t[n]}return r}return function r(t){function n(r,o,d){var a;if("undefined"!=typeof document){if(arguments.length>1){if("number"==typeof(d=e({path:"/"},n.defaults,d)).expires){var p=new Date;p.setMilliseconds(p.getMilliseconds()+864e5*d.expires),d.expires=p}d.expires=d.expires?d.expires.toUTCString():"";try{a=JSON.stringify(o),/^[\{\[]/.test(a)&&(o=a)}catch(e){}o=t.write?t.write(o,r):encodeURIComponent(String(o)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),r=(r=(r=encodeURIComponent(String(r))).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent)).replace(/[\(\)]/g,escape);var i="";for(var s in d)d[s]&&(i+="; "+s,!0!==d[s]&&(i+="="+d[s]));return document.cookie=r+"="+o+i}r||(a={});for(var c=document.cookie?document.cookie.split("; "):[],g=/(%[0-9A-Z]{2})+/g,l=0;l<c.length;l++){var f=c[l].split("="),u=f.slice(1).join("=");this.json||'"'!==u.charAt(0)||(u=u.slice(1,-1));try{var m=f[0].replace(g,decodeURIComponent);if(u=t.read?t.read(u,m):t(u,m)||u.replace(g,decodeURIComponent),this.json)try{u=JSON.parse(u)}catch(e){}if(r===m){a=u;break}r||(a[m]=u)}catch(e){}}return a}}return n.set=n,n.get=function(e){return n.call(n,e)},n.getJSON=function(){return n.apply({json:!0},[].slice.call(arguments))},n.defaults={},n.remove=function(r,t){n(r,"",e(t,{expires:-1}))},n.withConverter=r,n}(function(){})});
gdpr.php CHANGED
@@ -16,7 +16,7 @@
16
  * Plugin Name: GDPR
17
  * Plugin URI: https://trewknowledge.com
18
  * Description: This plugin is meant to assist a Controller, Data Processor, and Data Protection Officer (DPO) with efforts to meet the obligations and rights enacted under the GDPR.
19
- * Version: 2.0.6
20
  * Author: Trew Knowledge
21
  * Author URI: https://trewknowledge.com
22
  * License: GPL-2.0+
@@ -35,7 +35,7 @@ if ( ! defined( 'WPINC' ) ) {
35
  * Start at version 1.0.0 and use SemVer - https://semver.org
36
  * Rename this for your plugin and update it as you release new versions.
37
  */
38
- define( 'GDPR_VERSION', '2.0.6' );
39
 
40
  /**
41
  * The code that runs during plugin activation.
16
  * Plugin Name: GDPR
17
  * Plugin URI: https://trewknowledge.com
18
  * Description: This plugin is meant to assist a Controller, Data Processor, and Data Protection Officer (DPO) with efforts to meet the obligations and rights enacted under the GDPR.
19
+ * Version: 2.0.7
20
  * Author: Trew Knowledge
21
  * Author URI: https://trewknowledge.com
22
  * License: GPL-2.0+
35
  * Start at version 1.0.0 and use SemVer - https://semver.org
36
  * Rename this for your plugin and update it as you release new versions.
37
  */
38
+ define( 'GDPR_VERSION', '2.0.7' );
39
 
40
  /**
41
  * The code that runs during plugin activation.
includes/class-gdpr-activator.php CHANGED
@@ -39,32 +39,34 @@ class GDPR_Activator {
39
  add_option( 'gdpr_recaptcha_secret_key', '' );
40
  add_option( 'gdpr_add_consent_checkboxes_registration', true );
41
  add_option( 'gdpr_add_consent_checkboxes_checkout', true );
42
- add_option( 'gdpr_cookie_popup_content', array(
43
- 'necessary' => array(
44
- 'name' => 'Necessary',
45
- 'status' => 'required',
46
- 'cookies_used' => '',
47
- 'how_we_use' => '',
48
- ),
49
- 'advertising' => array(
50
- 'name' => 'Advertising',
51
- 'status' => 'on',
52
- 'cookies_used' => '',
53
- 'how_we_use' => '',
54
- ),
55
- 'analytics' => array(
56
- 'name' => 'Analytics',
57
- 'status' => 'on',
58
- 'cookies_used' => '',
59
- 'how_we_use' => '',
60
- ),
61
- 'other' => array(
62
- 'name' => 'Other',
63
- 'status' => 'on',
64
- 'cookies_used' => '',
65
- 'how_we_use' => '',
66
- ),
67
- ) );
 
 
68
  add_option( 'gdpr_refresh_after_preferences_update', true );
69
  add_option( 'gdpr_enable_privacy_bar', true );
70
  add_option( 'gdpr_display_cookie_categories_in_bar', false );
39
  add_option( 'gdpr_recaptcha_secret_key', '' );
40
  add_option( 'gdpr_add_consent_checkboxes_registration', true );
41
  add_option( 'gdpr_add_consent_checkboxes_checkout', true );
42
+ add_option(
43
+ 'gdpr_cookie_popup_content', array(
44
+ 'necessary' => array(
45
+ 'name' => 'Necessary',
46
+ 'status' => 'required',
47
+ 'cookies_used' => '',
48
+ 'how_we_use' => '',
49
+ ),
50
+ 'advertising' => array(
51
+ 'name' => 'Advertising',
52
+ 'status' => 'on',
53
+ 'cookies_used' => '',
54
+ 'how_we_use' => '',
55
+ ),
56
+ 'analytics' => array(
57
+ 'name' => 'Analytics',
58
+ 'status' => 'on',
59
+ 'cookies_used' => '',
60
+ 'how_we_use' => '',
61
+ ),
62
+ 'other' => array(
63
+ 'name' => 'Other',
64
+ 'status' => 'on',
65
+ 'cookies_used' => '',
66
+ 'how_we_use' => '',
67
+ ),
68
+ )
69
+ );
70
  add_option( 'gdpr_refresh_after_preferences_update', true );
71
  add_option( 'gdpr_enable_privacy_bar', true );
72
  add_option( 'gdpr_display_cookie_categories_in_bar', false );
includes/class-gdpr-audit-log.php CHANGED
@@ -38,7 +38,7 @@ class GDPR_Audit_Log {
38
  * @return string The encrypted string.
39
  */
40
  private static function crypt( $key, $data ) {
41
- $iv = openssl_random_pseudo_bytes( openssl_cipher_iv_length( 'aes-256-cbc' ) );
42
  $encrypted = openssl_encrypt( $data, 'aes-256-cbc', $key, 0, $iv );
43
  return base64_encode( $encrypted . '::' . $iv );
44
  }
@@ -67,9 +67,9 @@ class GDPR_Audit_Log {
67
  * @param string $input The string to be logged.
68
  */
69
  public static function log( $user_id, $input ) {
70
- $user = get_user_by( 'ID', $user_id );
71
- $date = '[' . date('Y/m/d H:i:s') . '] ';
72
- $encrypted = self::crypt( $user->user_email, $date . $input);
73
  add_user_meta( $user_id, 'gdpr_audit_log', $encrypted );
74
  }
75
 
@@ -89,16 +89,16 @@ class GDPR_Audit_Log {
89
  $user_log = get_user_meta( $user->ID, 'gdpr_audit_log', false );
90
  ob_start();
91
  foreach ( $user_log as $log ) {
92
- echo self::decrypt( $email, $log ) . "\n";
93
  }
94
  $log = ob_get_clean();
95
  } else {
96
- $uploads_dir = wp_upload_dir();
97
- $basedir = $uploads_dir['basedir'];
98
- $path = $basedir . '/gdpr_logs/';
99
  $email_masked = self::email_mask( $email . $token );
100
- $filename = base64_encode( $email_masked );
101
- $file_found = file_exists( $path . $filename );
102
  if ( ! $file_found ) {
103
  return false;
104
  } else {
@@ -120,18 +120,18 @@ class GDPR_Audit_Log {
120
  * @param string $character The character that will replace letters.
121
  * @return string The masked email.
122
  */
123
- private static function email_mask( $email, $character = '-' ){
124
  $email_arr = explode( '@', $email, 2 );
125
 
126
- $length = strlen( $email_arr[0] );
127
- $suplement = ( 0 !== $length % 2) ? 1 : 0;
128
- $length = floor( $length / 2 );
129
- $username = substr( $email_arr[0], 0, $length ) . str_repeat( $character, $length + $suplement );
130
 
131
- $length = strlen( $email_arr[1] );
132
- $suplement = ( 0 !== $length % 2) ? 1 : 0;
133
- $length = floor( $length / 2 );
134
- $domain = str_repeat( $character, $length + $suplement ) . substr( $email_arr[1], -$length, $length );
135
 
136
  return $username . '@' . $domain;
137
  }
@@ -151,14 +151,14 @@ class GDPR_Audit_Log {
151
  }
152
 
153
  $uploads_dir = wp_upload_dir();
154
- $basedir = $uploads_dir['basedir'];
155
- $path = $basedir . '/gdpr_logs/';
156
 
157
  if ( wp_mkdir_p( $path ) ) {
158
  if ( ! file_exists( $path . 'index.php' ) ) {
159
  file_put_contents( $path . 'index.php', '' );
160
  }
161
- $log = self::get_log( $user->user_email );
162
  $filename = self::email_mask( $user->user_email . $token );
163
  $filename = base64_encode( $filename );
164
 
38
  * @return string The encrypted string.
39
  */
40
  private static function crypt( $key, $data ) {
41
+ $iv = openssl_random_pseudo_bytes( openssl_cipher_iv_length( 'aes-256-cbc' ) );
42
  $encrypted = openssl_encrypt( $data, 'aes-256-cbc', $key, 0, $iv );
43
  return base64_encode( $encrypted . '::' . $iv );
44
  }
67
  * @param string $input The string to be logged.
68
  */
69
  public static function log( $user_id, $input ) {
70
+ $user = get_user_by( 'ID', $user_id );
71
+ $date = '[' . date( 'Y/m/d H:i:s' ) . '] ';
72
+ $encrypted = self::crypt( $user->user_email, $date . $input );
73
  add_user_meta( $user_id, 'gdpr_audit_log', $encrypted );
74
  }
75
 
89
  $user_log = get_user_meta( $user->ID, 'gdpr_audit_log', false );
90
  ob_start();
91
  foreach ( $user_log as $log ) {
92
+ echo esc_html( self::decrypt( $email, $log ) ) . "\n";
93
  }
94
  $log = ob_get_clean();
95
  } else {
96
+ $uploads_dir = wp_upload_dir();
97
+ $basedir = $uploads_dir['basedir'];
98
+ $path = $basedir . '/gdpr_logs/';
99
  $email_masked = self::email_mask( $email . $token );
100
+ $filename = base64_encode( $email_masked );
101
+ $file_found = file_exists( $path . $filename );
102
  if ( ! $file_found ) {
103
  return false;
104
  } else {
120
  * @param string $character The character that will replace letters.
121
  * @return string The masked email.
122
  */
123
+ private static function email_mask( $email, $character = '-' ) {
124
  $email_arr = explode( '@', $email, 2 );
125
 
126
+ $length = strlen( $email_arr[0] );
127
+ $suplement = ( 0 !== $length % 2 ) ? 1 : 0;
128
+ $length = floor( $length / 2 );
129
+ $username = substr( $email_arr[0], 0, $length ) . str_repeat( $character, $length + $suplement );
130
 
131
+ $length = strlen( $email_arr[1] );
132
+ $suplement = ( 0 !== $length % 2 ) ? 1 : 0;
133
+ $length = floor( $length / 2 );
134
+ $domain = str_repeat( $character, $length + $suplement ) . substr( $email_arr[1], -$length, $length );
135
 
136
  return $username . '@' . $domain;
137
  }
151
  }
152
 
153
  $uploads_dir = wp_upload_dir();
154
+ $basedir = $uploads_dir['basedir'];
155
+ $path = $basedir . '/gdpr_logs/';
156
 
157
  if ( wp_mkdir_p( $path ) ) {
158
  if ( ! file_exists( $path . 'index.php' ) ) {
159
  file_put_contents( $path . 'index.php', '' );
160
  }
161
+ $log = self::get_log( $user->user_email );
162
  $filename = self::email_mask( $user->user_email . $token );
163
  $filename = base64_encode( $filename );
164
 
includes/class-gdpr-deactivator.php CHANGED
@@ -32,7 +32,7 @@ class GDPR_Deactivator {
32
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
33
  */
34
  public static function deactivate() {
35
- wp_clear_scheduled_hook('telemetry_cleanup');
36
  }
37
 
38
  }
32
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
33
  */
34
  public static function deactivate() {
35
+ wp_clear_scheduled_hook( 'telemetry_cleanup' );
36
  }
37
 
38
  }
includes/class-gdpr-email.php CHANGED
@@ -42,9 +42,11 @@ class GDPR_Email {
42
  $plugin_path = plugin_dir_path( dirname( __FILE__ ) ) . 'templates/email/'; // Path to the template folder
43
 
44
  // Search template file in theme folder.
45
- $template = locate_template( array(
46
- $theme_path . $template_name
47
- ) );
 
 
48
 
49
  // Get plugins template file.
50
  if ( ! $template ) {
@@ -98,12 +100,12 @@ class GDPR_Email {
98
  * @return string The noreply email address
99
  */
100
  private static function get_do_not_reply_address() {
101
- $sitename = strtolower( $_SERVER['SERVER_NAME'] );
102
- if ( substr( $sitename, 0, 4 ) === 'www.' ) {
103
  $sitename = substr( $sitename, 4 );
104
- }
105
 
106
- return apply_filters( 'gdpr_do_not_reply_address', 'noreply@' . $sitename );
107
  }
108
 
109
  /**
@@ -122,14 +124,16 @@ class GDPR_Email {
122
 
123
  $limit = get_option( 'gdpr_email_limit', 100 );
124
 
125
- $users = get_users( array(
126
- 'fields' => 'all_with_meta'
127
- ) );
 
 
128
 
129
  $steps = ceil( count( $users ) / $limit );
130
 
131
  foreach ( range( 0, $steps - 1 ) as $loop ) {
132
- $offset = $limit * $loop;
133
  $loop_emails = wp_list_pluck( $users, 'user_email' );
134
  $loop_emails = array_slice( $loop_emails, $offset, $limit );
135
  wp_schedule_single_event( time() + $loop * HOUR_IN_SECONDS, 'send_data_breach_emails', array( $loop_emails, $data_breach ) );
@@ -147,36 +151,37 @@ class GDPR_Email {
147
  public function send_data_breach_emails( $emails, $data ) {
148
  $content = isset( $data['content'] ) ? sanitize_textarea_field( $data['content'] ) : '';
149
 
150
- $nature = sanitize_textarea_field( wp_unslash( $data['nature'] ) );
151
  $office_contact = sanitize_textarea_field( wp_unslash( $data['office_contact'] ) );
152
- $consequences = sanitize_textarea_field( wp_unslash( $data['consequences'] ) );
153
- $measures = sanitize_textarea_field( wp_unslash( $data['measures'] ) );
154
 
155
  foreach ( (array) $emails as $email ) {
156
  $user = get_user_by( 'email', $email );
157
  if ( $user instanceof WP_User ) {
158
  GDPR_Audit_Log::log( $user->ID, esc_html__( 'Data breach notification sent to user.', 'gdpr' ) );
159
  /* translators: email content */
160
- GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'Email content: %s', 'gdpr'), $content ) );
161
  /* translators: nature of the data breach */
162
- GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'Nature of data breach: %s', 'gdpr'), $nature ) );
163
  /* translators: data protection officer contact information */
164
- GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'Data protection officer contact: %s', 'gdpr'), $office_contact ) );
165
  /* translators: likely consequences */
166
- GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'Likely consequences of breach: %s', 'gdpr'), $consequences ) );
167
  /* translators: measures taken */
168
- GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'Measures taken or proposed to be taken: %s', 'gdpr'), $measures ) );
169
  }
170
  }
171
 
172
-
173
- self::send( $emails, 'data-breach-notification', array(
174
- 'content' => $content,
175
- 'nature' => $nature,
176
- 'office_contact' => $office_contact,
177
- 'consequences' => $consequences,
178
- 'measures' => $measures,
179
- ) );
 
180
  }
181
 
182
  /**
@@ -193,33 +198,36 @@ class GDPR_Email {
193
  * @return bool Whether the email contents were sent successfully.
194
  */
195
  public static function send( $emails, $type, $args = array(), $attachments = array() ) {
196
- $possible_types = apply_filters( 'gdpr_email_types', array(
197
- 'new-request' => apply_filters( 'gdpr_new_request_email_subject', esc_html__( 'GDPR Notification: There is a new request waiting to be reviewed.', 'gdpr' ) ),
198
- 'delete-request' => apply_filters( 'gdpr_delete_request_email_subject', esc_html__( 'Someone requested to close your account.', 'gdpr' ) ),
199
- 'delete-resolved' => apply_filters( 'gdpr_delete_resolved_email_subject', esc_html__( 'Your account has been closed.', 'gdpr' ) ),
200
- 'rectify-request' => apply_filters( 'gdpr_rectify_request_email_subject', esc_html__( 'Someone requested that we rectify data of your account.', 'gdpr' ) ),
201
- 'rectify-resolved' => apply_filters( 'gdpr_rectify_resolved_email_subject', esc_html__( 'Your request has been completed.', 'gdpr' ) ),
202
- 'complaint-request' => apply_filters( 'gdpr_complaint_request_email_subject', esc_html__( 'Someone made complaint on behalf of your account.', 'gdpr' ) ),
203
- 'complaint-resolved' => apply_filters( 'gdpr_complaint_resolved_email_subject', esc_html__( 'Your request has been completed.', 'gdpr' ) ),
204
- 'export-data-request' => apply_filters( 'gdpr_export_data_request_email_subject', esc_html__( 'Someone requested to download your data.', 'gdpr' ) ),
205
- 'export-data-resolved' => apply_filters( 'gdpr_export_data_resolved_email_subject', esc_html__( 'Your request has been completed.', 'gdpr' ) ),
206
- 'data-breach-request' => apply_filters( 'gdpr_data_breach_request_email_subject', esc_html__( 'Someone requested to send a data breach notification.', 'gdpr' ) ),
207
- 'data-breach-notification' => apply_filters( 'gdpr_data_breach_resolved_email_subject', esc_html__( 'Data Breach Notification.', 'gdpr' ) ),
208
- ) );
 
 
209
 
210
  if ( ! in_array( $type, array_keys( $possible_types ), true ) ) {
211
  return;
212
  }
213
 
214
  $no_reply = self::get_do_not_reply_address();
215
- $headers = array( 'From: ' . get_bloginfo( 'name' ) . ' <' . $no_reply . '>' );
216
  foreach ( (array) $emails as $email ) {
217
  $headers[] = 'Bcc: ' . sanitize_email( $email );
218
  }
219
 
220
  $content = self::get_email_content( $type . '.php', $args );
221
 
222
- return wp_mail( $no_reply,
 
223
  $possible_types[ $type ],
224
  html_entity_decode( $content, ENT_QUOTES, 'UTF-8' ),
225
  $headers,
42
  $plugin_path = plugin_dir_path( dirname( __FILE__ ) ) . 'templates/email/'; // Path to the template folder
43
 
44
  // Search template file in theme folder.
45
+ $template = locate_template(
46
+ array(
47
+ $theme_path . $template_name,
48
+ )
49
+ );
50
 
51
  // Get plugins template file.
52
  if ( ! $template ) {
100
  * @return string The noreply email address
101
  */
102
  private static function get_do_not_reply_address() {
103
+ $sitename = isset( $_SERVER['SERVER_NAME'] ) ? strtolower( sanitize_text_field( wp_unslash( $_SERVER['SERVER_NAME'] ) ) ) : ''; // WPCS: input var ok.
104
+ if ( substr( $sitename, 0, 4 ) === 'www.' ) {
105
  $sitename = substr( $sitename, 4 );
106
+ }
107
 
108
+ return apply_filters( 'gdpr_do_not_reply_address', 'noreply@' . $sitename );
109
  }
110
 
111
  /**
124
 
125
  $limit = get_option( 'gdpr_email_limit', 100 );
126
 
127
+ $users = get_users(
128
+ array(
129
+ 'fields' => 'all_with_meta',
130
+ )
131
+ );
132
 
133
  $steps = ceil( count( $users ) / $limit );
134
 
135
  foreach ( range( 0, $steps - 1 ) as $loop ) {
136
+ $offset = $limit * $loop;
137
  $loop_emails = wp_list_pluck( $users, 'user_email' );
138
  $loop_emails = array_slice( $loop_emails, $offset, $limit );
139
  wp_schedule_single_event( time() + $loop * HOUR_IN_SECONDS, 'send_data_breach_emails', array( $loop_emails, $data_breach ) );
151
  public function send_data_breach_emails( $emails, $data ) {
152
  $content = isset( $data['content'] ) ? sanitize_textarea_field( $data['content'] ) : '';
153
 
154
+ $nature = sanitize_textarea_field( wp_unslash( $data['nature'] ) );
155
  $office_contact = sanitize_textarea_field( wp_unslash( $data['office_contact'] ) );
156
+ $consequences = sanitize_textarea_field( wp_unslash( $data['consequences'] ) );
157
+ $measures = sanitize_textarea_field( wp_unslash( $data['measures'] ) );
158
 
159
  foreach ( (array) $emails as $email ) {
160
  $user = get_user_by( 'email', $email );
161
  if ( $user instanceof WP_User ) {
162
  GDPR_Audit_Log::log( $user->ID, esc_html__( 'Data breach notification sent to user.', 'gdpr' ) );
163
  /* translators: email content */
164
+ GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'Email content: %s', 'gdpr' ), $content ) );
165
  /* translators: nature of the data breach */
166
+ GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'Nature of data breach: %s', 'gdpr' ), $nature ) );
167
  /* translators: data protection officer contact information */
168
+ GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'Data protection officer contact: %s', 'gdpr' ), $office_contact ) );
169
  /* translators: likely consequences */
170
+ GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'Likely consequences of breach: %s', 'gdpr' ), $consequences ) );
171
  /* translators: measures taken */
172
+ GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'Measures taken or proposed to be taken: %s', 'gdpr' ), $measures ) );
173
  }
174
  }
175
 
176
+ self::send(
177
+ $emails, 'data-breach-notification', array(
178
+ 'content' => $content,
179
+ 'nature' => $nature,
180
+ 'office_contact' => $office_contact,
181
+ 'consequences' => $consequences,
182
+ 'measures' => $measures,
183
+ )
184
+ );
185
  }
186
 
187
  /**
198
  * @return bool Whether the email contents were sent successfully.
199
  */
200
  public static function send( $emails, $type, $args = array(), $attachments = array() ) {
201
+ $possible_types = apply_filters(
202
+ 'gdpr_email_types', array(
203
+ 'new-request' => apply_filters( 'gdpr_new_request_email_subject', esc_html__( 'GDPR Notification: There is a new request waiting to be reviewed.', 'gdpr' ) ),
204
+ 'delete-request' => apply_filters( 'gdpr_delete_request_email_subject', esc_html__( 'Someone requested to close your account.', 'gdpr' ) ),
205
+ 'delete-resolved' => apply_filters( 'gdpr_delete_resolved_email_subject', esc_html__( 'Your account has been closed.', 'gdpr' ) ),
206
+ 'rectify-request' => apply_filters( 'gdpr_rectify_request_email_subject', esc_html__( 'Someone requested that we rectify data of your account.', 'gdpr' ) ),
207
+ 'rectify-resolved' => apply_filters( 'gdpr_rectify_resolved_email_subject', esc_html__( 'Your request has been completed.', 'gdpr' ) ),
208
+ 'complaint-request' => apply_filters( 'gdpr_complaint_request_email_subject', esc_html__( 'Someone made complaint on behalf of your account.', 'gdpr' ) ),
209
+ 'complaint-resolved' => apply_filters( 'gdpr_complaint_resolved_email_subject', esc_html__( 'Your request has been completed.', 'gdpr' ) ),
210
+ 'export-data-request' => apply_filters( 'gdpr_export_data_request_email_subject', esc_html__( 'Someone requested to download your data.', 'gdpr' ) ),
211
+ 'export-data-resolved' => apply_filters( 'gdpr_export_data_resolved_email_subject', esc_html__( 'Your request has been completed.', 'gdpr' ) ),
212
+ 'data-breach-request' => apply_filters( 'gdpr_data_breach_request_email_subject', esc_html__( 'Someone requested to send a data breach notification.', 'gdpr' ) ),
213
+ 'data-breach-notification' => apply_filters( 'gdpr_data_breach_resolved_email_subject', esc_html__( 'Data Breach Notification.', 'gdpr' ) ),
214
+ )
215
+ );
216
 
217
  if ( ! in_array( $type, array_keys( $possible_types ), true ) ) {
218
  return;
219
  }
220
 
221
  $no_reply = self::get_do_not_reply_address();
222
+ $headers = array( 'From: ' . get_bloginfo( 'name' ) . ' <' . $no_reply . '>' );
223
  foreach ( (array) $emails as $email ) {
224
  $headers[] = 'Bcc: ' . sanitize_email( $email );
225
  }
226
 
227
  $content = self::get_email_content( $type . '.php', $args );
228
 
229
+ return wp_mail(
230
+ $no_reply,
231
  $possible_types[ $type ],
232
  html_entity_decode( $content, ENT_QUOTES, 'UTF-8' ),
233
  $headers,
includes/class-gdpr-help.php CHANGED
@@ -29,38 +29,46 @@ class GDPR_Help {
29
  public static function add_requests_help() {
30
  $overview = '<h2>' . esc_html__( 'Overview', 'gdpr' ) . '</h2>' .
31
  '<p>' . esc_html__( 'This page has multiple request tables. Users can request multiple things like getting deleted from the site or having their data rectified. All requests will come to these tables.', 'gdpr' ) . '</p>';
32
- get_current_screen()->add_help_tab( array(
33
- 'id' => 'overview',
34
- 'title' => esc_html__( 'Overview', 'gdpr' ),
35
- 'content' => $overview,
36
- ) );
 
 
37
 
38
  $rectify_help = '<h2>' . esc_html__( 'Rectify Data', 'gdpr' ) . '</h2>' .
39
  '<p>' . esc_html__( 'Users may request to have their data rectified. They can place a request somewhere on your site and those requests will show up here.', 'gdpr' ) . '</p>' .
40
  '<p>' . esc_html__( 'When you complete the request, mark it as resolved and the requester will get a notification email confirming that their request was resolved.', 'gdpr' ) . '</p>';
41
- get_current_screen()->add_help_tab( array(
42
- 'id' => 'rectify-data',
43
- 'title' => esc_html__( 'Rectify Data', 'gdpr' ),
44
- 'content' => $rectify_help,
45
- ) );
 
 
46
 
47
  $complaint_help = '<h2>' . esc_html__( 'Complaints', 'gdpr' ) . '</h2>' .
48
  '<p>' . esc_html__( 'Users may complain about something that happened. They can place a complaint somewhere on your site and those complaints will show up here.', 'gdpr' ) . '</p>' .
49
  '<p>' . esc_html__( 'When you resolve the problem, mark it as resolved and the requester will get a notification email confirming that his complaint was resolved.', 'gdpr' ) . '</p>';
50
- get_current_screen()->add_help_tab( array(
51
- 'id' => 'complaint',
52
- 'title' => esc_html__( 'Complaints', 'gdpr' ),
53
- 'content' => $complaint_help,
54
- ) );
 
 
55
 
56
  $erasure_help = '<h2>' . esc_html__( 'Erasure', 'gdpr' ) . '</h2>' .
57
  '<p>' . esc_html__( 'Users may request to be deleted from the site. If they don\'t have any content published on the site (including comments) they will be removed from the site automatically. Otherwise, they will show up at this review table where you can reassign or delete their published content and anonymize his comments.', 'gdpr' ) . '</p>' .
58
  '<p>' . esc_html__( 'User may request their data to be deleted. The controller has, according to GDPR, 30 days to fulfill the request. On some occasions, you can ask to extend this time limit. When the request has been resolved the user will receive a notification that their account has been closed.', 'gdpr' ) . '</p>';
59
- get_current_screen()->add_help_tab( array(
60
- 'id' => 'erasure',
61
- 'title' => esc_html__( 'Erasures', 'gdpr' ),
62
- 'content' => $erasure_help,
63
- ) );
 
 
64
  }
65
 
66
  /**
@@ -72,40 +80,48 @@ class GDPR_Help {
72
  public static function add_tools_help() {
73
  $overview = '<h2>' . esc_html__( 'Overview', 'gdpr' ) . '</h2>' .
74
  '<p>' . esc_html__( 'We added tools to make your life easier when you need to perform administrative tasks like notify all your users of a possible data breach.', 'gdpr' ) . '</p>';
75
- get_current_screen()->add_help_tab( array(
76
- 'id' => 'overview',
77
- 'title' => esc_html__( 'Overview', 'gdpr' ),
78
- 'content' => $overview,
79
- ) );
 
 
80
 
81
  $access_data_help = '<h2>' . esc_html__( 'Access Data', 'gdpr' ) . '</h2>' .
82
  '<p>' . esc_html__( 'Use this page to look for all known data about a user. You can look it up using the user\'s email address and are able to download it in XML and JSON formats.', 'gdpr' ) . '</p>';
83
- get_current_screen()->add_help_tab( array(
84
- 'id' => 'access-data',
85
- 'title' => esc_html__( 'Access Data', 'gdpr' ),
86
- 'content' => $access_data_help,
87
- ) );
 
 
88
 
89
  $data_breach_help = '<h2>' . esc_html__( 'Data Breach Notification', 'gdpr' ) . '</h2>' .
90
  '<p><strong>' . esc_html__( 'Use this carefully.', 'gdpr' ) . '</strong></p>' .
91
  '<p>' . esc_html__( 'This will send a mass email to all your users with the information provided on these fields. This email is throttled based on the hourly limit set on the plugin settings page. ', 'gdpr' ) . '</p>' .
92
  '<p><strong>' . esc_html__( 'Only use this tool if you believe your site has been compromised and that your user\'s personal data might have been leaked.', 'gdpr' ) . '</strong></p>';
93
- get_current_screen()->add_help_tab( array(
94
- 'id' => 'data-breach',
95
- 'title' => esc_html__( 'Data Breach', 'gdpr' ),
96
- 'content' => $data_breach_help,
97
- ) );
 
 
98
 
99
  $audit_log_help = '<h2>' . esc_html__( 'Audit Log', 'gdpr' ) . '</h2>' .
100
  '<p><strong>' . esc_html__( 'We do not log any of the user\'s personal data.', 'gdpr' ) . '</strong></p>' .
101
  '<p>' . esc_html__( 'All logs are encrypted before saving to the database. An encrypted log file is created whenever a user gets removed from the site.', 'gdpr' ) . '</p>' .
102
  '<p>' . esc_html__( 'This tool will keep a record of some actions such as changing consent preferences, placing a request, data breach notifications received, etc…', 'gdpr' ) . '<br />' .
103
  esc_html__( 'The only way to read the logs is to search for the user email. If the data subject is not a registered site user anymore, you need to ask for the 6 digit token that was provided during deletion. That will allow this tool to look for a log file with his information.', 'gdpr' ) . '</p>';
104
- get_current_screen()->add_help_tab( array(
105
- 'id' => 'audit-log',
106
- 'title' => esc_html__( 'Audit Log', 'gdpr' ),
107
- 'content' => $audit_log_help,
108
- ) );
 
 
109
  }
110
 
111
  /**
@@ -118,49 +134,57 @@ class GDPR_Help {
118
  $general_settings_help = '<h2>' . esc_html__( 'General Settings', 'gdpr' ) . '</h2>' .
119
  '<p>' . esc_html__( 'This plugin needs to know your privacy policy page to track updates to it and ask users to re-consent to your new terms.', 'gdpr' ) . '</p>' .
120
  '<p>' . esc_html__( 'When sending a data breach notification to your users, we need to throttle the emails because of server limitations. This is an hourly limit. Check with your hosting provider before changing this value.', 'gdpr' ) . '</p>';
121
- get_current_screen()->add_help_tab( array(
122
- 'id' => 'general',
123
- 'title' => esc_html__( 'General Settings', 'gdpr' ),
124
- 'content' => $general_settings_help,
125
- ) );
 
 
126
 
127
- $cookies_settings_help = sprintf( '<h2>' . esc_html__( 'Cookie Management', 'gdpr' ) . '</h2>' .
 
128
  '<p>' . esc_html__( 'Fill out every information you can about the cookies your site uses. Set the cookies that you set under Cookies Used and cookies used and set by third parties under the Third party domains.', 'gdpr' ) . '</p>' .
129
  /* translators: the function */
130
  '<p>' . esc_html__( 'You must ask your developer to wrap the code that sets the cookies with our helper function %s.', 'gdpr' ) . '</p>' .
131
  '<p>' . esc_html__( 'Some services like Google Analytics provide a way to opt out from their code with an extra parameter to their snippet.', 'gdpr' ) . '</p>' .
132
  '<h3>' . esc_html__( 'External Links', 'gdpr' ) . '</h3>' .
133
  '<ul>' .
134
- '<li><a href="https://codex.wordpress.org/WordPress_Cookies" title="' . esc_attr__( 'WordPress cookies', 'gdpr' ) . '" target="_blank">'. esc_html__( 'WordPress cookies', 'gdpr' ) .'</a></li>' .
135
  '</ul>',
136
  '<code>is_allowed_cookie( $cookie_name )</code>'
137
  );
138
- get_current_screen()->add_help_tab( array(
139
- 'id' => 'cookies',
140
- 'title' => esc_html__( 'Cookie Management', 'gdpr' ),
141
- 'content' => $cookies_settings_help,
142
- ) );
 
 
143
 
144
- $consent_settings_help = sprintf( '<h2>' . esc_html__( 'Consent Management ( Coming Soon )', 'gdpr' ) . '</h2>' .
 
145
  '<p>' . esc_html__( 'All consents are disabled by default. On first registration, your users will need to consent to your privacy policy. Depending on your privacy policy you should register multiple types of consent on this page and allow them to be toggled on/off.', 'gdpr' ) . '</p>' .
146
  /* translators: the function */
147
  '<p>' . esc_html__( 'If you have an optional consent type, you must have a developer wrap the functionality in our helper function %s.', 'gdpr' ) . '</p>' .
148
  '<p><strong>' . esc_html__( 'i.e.', 'gdpr' ) . '</strong><br />' . esc_html__( 'You registered email marketing as an optional consent but the user did not actively opt into it on their profile page. You should have your email capture form wrapped in our helper function to block registration or better yet, not even display the email capture form. Same goes for blocking adding the user to your mailing system on registration if consent is not given.', 'gdpr' ) . '</p>' .
149
  '<h3>' . esc_html__( 'External Links', 'gdpr' ) . '</h3>' .
150
  '<ul>' .
151
- '<li><a href="https://gdpr-info.eu/art-7-gdpr/" title="' . esc_attr__( 'Article 7 - Conditions for consent', 'gdpr' ) . '" target="_blank">'. esc_html__( 'Article 7 - Conditions for consent', 'gdpr' ) .'</a></li>' .
152
- '<li><a href="https://gdpr-info.eu/art-8-gdpr/" title="' . esc_attr__( "Article 8 - conditions applicable to child's consent in relation to information society services", 'gdpr' ) . '" target="_blank">'. esc_html__( "Article 8 - conditions applicable to child's consent in relation to information society services", 'gdpr' ) .'</a></li>' .
153
- '<li><a href="https://gdpr-info.eu/recitals/no-42/" title="' . esc_attr__( 'Recital 42 - Burden of proof and requirements for consent', 'gdpr' ) . '" target="_blank">'. esc_html__( 'Recital 42 - Burden of proof and requirements for consent', 'gdpr' ) .'</a></li>' .
154
- '<li><a href="https://gdpr-info.eu/recitals/no-43/" title="' . esc_attr__( 'Recital 43 - Freely Given consent', 'gdpr' ) . '" target="_blank">'. esc_html__( 'Recital 43 - Freely Given consent', 'gdpr' ) .'</a></li>' .
155
  '</ul>',
156
  '<code>have_consent( $consent_id )</code>'
157
  );
158
 
159
- get_current_screen()->add_help_tab( array(
160
- 'id' => 'consents',
161
- 'title' => esc_html__( 'Consent Management', 'gdpr' ),
162
- 'content' => $consent_settings_help,
163
- ) );
 
 
164
  }
165
 
166
  /**
@@ -179,10 +203,12 @@ class GDPR_Help {
179
  '<p>' . esc_html__( 'Some plugins also capture data and send it to their servers. Such practice is not allowed for plugins hosted on wordpress.org plugin repository. In case this is a Premium plugin, you should have been given the option to choose which type of data you want to send.', 'gdpr' ) . '</p>' .
180
  '<p>' . esc_html__( 'Use this tool to identify plugins or themes sending potential personal data outside of your server and take action if necessary.', 'gdpr' ) . '</p>' .
181
  '<p>' . esc_html__( 'All information on this page is automatically deleted every 12 hours so this doesn\'t grow too large and slow your site.' ) . '</p>';
182
- get_current_screen()->add_help_tab( array(
183
- 'id' => 'overview',
184
- 'title' => esc_html__( 'Overview', 'gdpr' ),
185
- 'content' => $telemetry_help,
186
- ) );
 
 
187
  }
188
  }
29
  public static function add_requests_help() {
30
  $overview = '<h2>' . esc_html__( 'Overview', 'gdpr' ) . '</h2>' .
31
  '<p>' . esc_html__( 'This page has multiple request tables. Users can request multiple things like getting deleted from the site or having their data rectified. All requests will come to these tables.', 'gdpr' ) . '</p>';
32
+ get_current_screen()->add_help_tab(
33
+ array(
34
+ 'id' => 'overview',
35
+ 'title' => esc_html__( 'Overview', 'gdpr' ),
36
+ 'content' => $overview,
37
+ )
38
+ );
39
 
40
  $rectify_help = '<h2>' . esc_html__( 'Rectify Data', 'gdpr' ) . '</h2>' .
41
  '<p>' . esc_html__( 'Users may request to have their data rectified. They can place a request somewhere on your site and those requests will show up here.', 'gdpr' ) . '</p>' .
42
  '<p>' . esc_html__( 'When you complete the request, mark it as resolved and the requester will get a notification email confirming that their request was resolved.', 'gdpr' ) . '</p>';
43
+ get_current_screen()->add_help_tab(
44
+ array(
45
+ 'id' => 'rectify-data',
46
+ 'title' => esc_html__( 'Rectify Data', 'gdpr' ),
47
+ 'content' => $rectify_help,
48
+ )
49
+ );
50
 
51
  $complaint_help = '<h2>' . esc_html__( 'Complaints', 'gdpr' ) . '</h2>' .
52
  '<p>' . esc_html__( 'Users may complain about something that happened. They can place a complaint somewhere on your site and those complaints will show up here.', 'gdpr' ) . '</p>' .
53
  '<p>' . esc_html__( 'When you resolve the problem, mark it as resolved and the requester will get a notification email confirming that his complaint was resolved.', 'gdpr' ) . '</p>';
54
+ get_current_screen()->add_help_tab(
55
+ array(
56
+ 'id' => 'complaint',
57
+ 'title' => esc_html__( 'Complaints', 'gdpr' ),
58
+ 'content' => $complaint_help,
59
+ )
60
+ );
61
 
62
  $erasure_help = '<h2>' . esc_html__( 'Erasure', 'gdpr' ) . '</h2>' .
63
  '<p>' . esc_html__( 'Users may request to be deleted from the site. If they don\'t have any content published on the site (including comments) they will be removed from the site automatically. Otherwise, they will show up at this review table where you can reassign or delete their published content and anonymize his comments.', 'gdpr' ) . '</p>' .
64
  '<p>' . esc_html__( 'User may request their data to be deleted. The controller has, according to GDPR, 30 days to fulfill the request. On some occasions, you can ask to extend this time limit. When the request has been resolved the user will receive a notification that their account has been closed.', 'gdpr' ) . '</p>';
65
+ get_current_screen()->add_help_tab(
66
+ array(
67
+ 'id' => 'erasure',
68
+ 'title' => esc_html__( 'Erasures', 'gdpr' ),
69
+ 'content' => $erasure_help,
70
+ )
71
+ );
72
  }
73
 
74
  /**
80
  public static function add_tools_help() {
81
  $overview = '<h2>' . esc_html__( 'Overview', 'gdpr' ) . '</h2>' .
82
  '<p>' . esc_html__( 'We added tools to make your life easier when you need to perform administrative tasks like notify all your users of a possible data breach.', 'gdpr' ) . '</p>';
83
+ get_current_screen()->add_help_tab(
84
+ array(
85
+ 'id' => 'overview',
86
+ 'title' => esc_html__( 'Overview', 'gdpr' ),
87
+ 'content' => $overview,
88
+ )
89
+ );
90
 
91
  $access_data_help = '<h2>' . esc_html__( 'Access Data', 'gdpr' ) . '</h2>' .
92
  '<p>' . esc_html__( 'Use this page to look for all known data about a user. You can look it up using the user\'s email address and are able to download it in XML and JSON formats.', 'gdpr' ) . '</p>';
93
+ get_current_screen()->add_help_tab(
94
+ array(
95
+ 'id' => 'access-data',
96
+ 'title' => esc_html__( 'Access Data', 'gdpr' ),
97
+ 'content' => $access_data_help,
98
+ )
99
+ );
100
 
101
  $data_breach_help = '<h2>' . esc_html__( 'Data Breach Notification', 'gdpr' ) . '</h2>' .
102
  '<p><strong>' . esc_html__( 'Use this carefully.', 'gdpr' ) . '</strong></p>' .
103
  '<p>' . esc_html__( 'This will send a mass email to all your users with the information provided on these fields. This email is throttled based on the hourly limit set on the plugin settings page. ', 'gdpr' ) . '</p>' .
104
  '<p><strong>' . esc_html__( 'Only use this tool if you believe your site has been compromised and that your user\'s personal data might have been leaked.', 'gdpr' ) . '</strong></p>';
105
+ get_current_screen()->add_help_tab(
106
+ array(
107
+ 'id' => 'data-breach',
108
+ 'title' => esc_html__( 'Data Breach', 'gdpr' ),
109
+ 'content' => $data_breach_help,
110
+ )
111
+ );
112
 
113
  $audit_log_help = '<h2>' . esc_html__( 'Audit Log', 'gdpr' ) . '</h2>' .
114
  '<p><strong>' . esc_html__( 'We do not log any of the user\'s personal data.', 'gdpr' ) . '</strong></p>' .
115
  '<p>' . esc_html__( 'All logs are encrypted before saving to the database. An encrypted log file is created whenever a user gets removed from the site.', 'gdpr' ) . '</p>' .
116
  '<p>' . esc_html__( 'This tool will keep a record of some actions such as changing consent preferences, placing a request, data breach notifications received, etc…', 'gdpr' ) . '<br />' .
117
  esc_html__( 'The only way to read the logs is to search for the user email. If the data subject is not a registered site user anymore, you need to ask for the 6 digit token that was provided during deletion. That will allow this tool to look for a log file with his information.', 'gdpr' ) . '</p>';
118
+ get_current_screen()->add_help_tab(
119
+ array(
120
+ 'id' => 'audit-log',
121
+ 'title' => esc_html__( 'Audit Log', 'gdpr' ),
122
+ 'content' => $audit_log_help,
123
+ )
124
+ );
125
  }
126
 
127
  /**
134
  $general_settings_help = '<h2>' . esc_html__( 'General Settings', 'gdpr' ) . '</h2>' .
135
  '<p>' . esc_html__( 'This plugin needs to know your privacy policy page to track updates to it and ask users to re-consent to your new terms.', 'gdpr' ) . '</p>' .
136
  '<p>' . esc_html__( 'When sending a data breach notification to your users, we need to throttle the emails because of server limitations. This is an hourly limit. Check with your hosting provider before changing this value.', 'gdpr' ) . '</p>';
137
+ get_current_screen()->add_help_tab(
138
+ array(
139
+ 'id' => 'general',
140
+ 'title' => esc_html__( 'General Settings', 'gdpr' ),
141
+ 'content' => $general_settings_help,
142
+ )
143
+ );
144
 
145
+ $cookies_settings_help = sprintf(
146
+ '<h2>' . esc_html__( 'Cookie Management', 'gdpr' ) . '</h2>' .
147
  '<p>' . esc_html__( 'Fill out every information you can about the cookies your site uses. Set the cookies that you set under Cookies Used and cookies used and set by third parties under the Third party domains.', 'gdpr' ) . '</p>' .
148
  /* translators: the function */
149
  '<p>' . esc_html__( 'You must ask your developer to wrap the code that sets the cookies with our helper function %s.', 'gdpr' ) . '</p>' .
150
  '<p>' . esc_html__( 'Some services like Google Analytics provide a way to opt out from their code with an extra parameter to their snippet.', 'gdpr' ) . '</p>' .
151
  '<h3>' . esc_html__( 'External Links', 'gdpr' ) . '</h3>' .
152
  '<ul>' .
153
+ '<li><a href="https://codex.wordpress.org/WordPress_Cookies" title="' . esc_attr__( 'WordPress cookies', 'gdpr' ) . '" target="_blank">' . esc_html__( 'WordPress cookies', 'gdpr' ) . '</a></li>' .
154
  '</ul>',
155
  '<code>is_allowed_cookie( $cookie_name )</code>'
156
  );
157
+ get_current_screen()->add_help_tab(
158
+ array(
159
+ 'id' => 'cookies',
160
+ 'title' => esc_html__( 'Cookie Management', 'gdpr' ),
161
+ 'content' => $cookies_settings_help,
162
+ )
163
+ );
164
 
165
+ $consent_settings_help = sprintf(
166
+ '<h2>' . esc_html__( 'Consent Management ( Coming Soon )', 'gdpr' ) . '</h2>' .
167
  '<p>' . esc_html__( 'All consents are disabled by default. On first registration, your users will need to consent to your privacy policy. Depending on your privacy policy you should register multiple types of consent on this page and allow them to be toggled on/off.', 'gdpr' ) . '</p>' .
168
  /* translators: the function */
169
  '<p>' . esc_html__( 'If you have an optional consent type, you must have a developer wrap the functionality in our helper function %s.', 'gdpr' ) . '</p>' .
170
  '<p><strong>' . esc_html__( 'i.e.', 'gdpr' ) . '</strong><br />' . esc_html__( 'You registered email marketing as an optional consent but the user did not actively opt into it on their profile page. You should have your email capture form wrapped in our helper function to block registration or better yet, not even display the email capture form. Same goes for blocking adding the user to your mailing system on registration if consent is not given.', 'gdpr' ) . '</p>' .
171
  '<h3>' . esc_html__( 'External Links', 'gdpr' ) . '</h3>' .
172
  '<ul>' .
173
+ '<li><a href="https://gdpr-info.eu/art-7-gdpr/" title="' . esc_attr__( 'Article 7 - Conditions for consent', 'gdpr' ) . '" target="_blank">' . esc_html__( 'Article 7 - Conditions for consent', 'gdpr' ) . '</a></li>' .
174
+ '<li><a href="https://gdpr-info.eu/art-8-gdpr/" title="' . esc_attr__( "Article 8 - conditions applicable to child's consent in relation to information society services", 'gdpr' ) . '" target="_blank">' . esc_html__( "Article 8 - conditions applicable to child's consent in relation to information society services", 'gdpr' ) . '</a></li>' .
175
+ '<li><a href="https://gdpr-info.eu/recitals/no-42/" title="' . esc_attr__( 'Recital 42 - Burden of proof and requirements for consent', 'gdpr' ) . '" target="_blank">' . esc_html__( 'Recital 42 - Burden of proof and requirements for consent', 'gdpr' ) . '</a></li>' .
176
+ '<li><a href="https://gdpr-info.eu/recitals/no-43/" title="' . esc_attr__( 'Recital 43 - Freely Given consent', 'gdpr' ) . '" target="_blank">' . esc_html__( 'Recital 43 - Freely Given consent', 'gdpr' ) . '</a></li>' .
177
  '</ul>',
178
  '<code>have_consent( $consent_id )</code>'
179
  );
180
 
181
+ get_current_screen()->add_help_tab(
182
+ array(
183
+ 'id' => 'consents',
184
+ 'title' => esc_html__( 'Consent Management', 'gdpr' ),
185
+ 'content' => $consent_settings_help,
186
+ )
187
+ );
188
  }
189
 
190
  /**
203
  '<p>' . esc_html__( 'Some plugins also capture data and send it to their servers. Such practice is not allowed for plugins hosted on wordpress.org plugin repository. In case this is a Premium plugin, you should have been given the option to choose which type of data you want to send.', 'gdpr' ) . '</p>' .
204
  '<p>' . esc_html__( 'Use this tool to identify plugins or themes sending potential personal data outside of your server and take action if necessary.', 'gdpr' ) . '</p>' .
205
  '<p>' . esc_html__( 'All information on this page is automatically deleted every 12 hours so this doesn\'t grow too large and slow your site.' ) . '</p>';
206
+ get_current_screen()->add_help_tab(
207
+ array(
208
+ 'id' => 'overview',
209
+ 'title' => esc_html__( 'Overview', 'gdpr' ),
210
+ 'content' => $telemetry_help,
211
+ )
212
+ );
213
  }
214
  }
includes/class-gdpr-requests.php CHANGED
@@ -75,17 +75,17 @@ class GDPR_Requests {
75
  * @return array The allowed request types.
76
  */
77
  protected function get_allowed_types() {
78
- return self::$allowed_types;
79
- }
80
-
81
- /**
82
- * Checks if the user has any content published on the site. Including comments.
83
- * @since 1.0.0
84
- * @author Fernando Claussen <fernandoclaussen@gmail.com>
85
- * @static
86
- * @param WP_User/int $user The user object or the user ID.
87
- * @return bool Whether the user has content or not.
88
- */
89
  static function user_has_content( $user ) {
90
  if ( ! $user instanceof WP_User ) {
91
  if ( ! is_int( $user ) ) {
@@ -96,18 +96,20 @@ class GDPR_Requests {
96
 
97
  $post_types = get_post_types( array( 'public' => true ) );
98
  foreach ( $post_types as $pt ) {
99
- $post_count = count_user_posts( $user->ID, $pt);
100
  if ( $post_count > 0 ) {
101
  return true;
102
  }
103
  }
104
 
105
- $comments = get_comments( array(
106
- 'author_email' => $user->user_email,
107
- 'include_unapproved' => true,
108
- 'number' => 1,
109
- 'count' => true,
110
- ) );
 
 
111
 
112
  if ( $comments ) {
113
  return true;
@@ -127,8 +129,8 @@ class GDPR_Requests {
127
  * @return bool Whether the user was removed from the requests list.
128
  */
129
  protected function remove_from_requests( $index ) {
130
- $requests = ( array ) get_option( 'gdpr_requests', array() );
131
- $index = sanitize_text_field( wp_unslash( $index ) );
132
 
133
  if ( array_key_exists( $index, $requests ) ) {
134
  unset( $requests[ $index ] );
@@ -149,16 +151,16 @@ class GDPR_Requests {
149
  * @return bool Whether the request was confirmed or not.
150
  */
151
  protected function confirm_request( $key ) {
152
- $key = sanitize_text_field( wp_unslash( $key ) );
153
- $requests = ( array ) get_option( 'gdpr_requests', array() );
154
 
155
  if ( empty( $requests ) || ! isset( $requests[ $key ] ) ) {
156
  return false;
157
  }
158
 
159
  $requests[ $key ]['confirmed'] = true;
160
- $type = $requests[ $key ]['type'];
161
- $email = $requests[ $key ]['email'];
162
 
163
  $user = get_user_by( 'email', $email );
164
 
@@ -166,8 +168,19 @@ class GDPR_Requests {
166
  $meta_key = self::$plugin_name . "_{$type}_key";
167
  update_option( 'gdpr_requests', $requests );
168
  delete_user_meta( $user->ID, $meta_key );
169
- if ( $time = wp_next_scheduled( 'clean_gdpr_user_request_key', array( 'user_id' => $user->ID, 'meta_key' => $meta_key ) ) ) {
170
- wp_unschedule_event( $time, 'clean_gdpr_user_request_key', array( 'user_id' => $user->ID, 'meta_key' => $meta_key ) );
 
 
 
 
 
 
 
 
 
 
 
171
  }
172
  }
173
 
@@ -182,8 +195,8 @@ class GDPR_Requests {
182
  * @param string $key The request key.
183
  */
184
  function clean_requests( $key ) {
185
- $key = sanitize_text_field( $key );
186
- $requests = ( array ) get_option( 'gdpr_requests', array() );
187
 
188
  if ( array_key_exists( $key, $requests ) ) {
189
  if ( ! $requests[ $key ]['confirmed'] ) {
@@ -201,7 +214,7 @@ class GDPR_Requests {
201
  * @param string $meta_key The user meta key.
202
  */
203
  function clean_user_request_key( $user_id, $meta_key ) {
204
- $user_id = ( int ) $user_id;
205
  $meta_key = sanitize_text_field( $meta_key );
206
 
207
  $meta = get_user_meta( $user_id, $meta_key, true );
@@ -225,23 +238,23 @@ class GDPR_Requests {
225
  * @param string $confirmed If the request is confirmed or not.
226
  */
227
  protected function add_to_requests( $email, $type, $data = null, $confirmed = false ) {
228
- $requests = ( array ) get_option( 'gdpr_requests', array() );
229
 
230
  $email = sanitize_email( $email );
231
- $type = sanitize_text_field( wp_unslash( $type ) );
232
- $data = sanitize_textarea_field( wp_unslash( $data ) );
233
 
234
- if ( ! in_array( $type, self::$allowed_types ) ) {
235
  return false;
236
  }
237
 
238
- $key = wp_generate_password( 20, false );
239
  $requests[ $key ] = array(
240
  'email' => $email,
241
- 'date' => date( "F j, Y" ),
242
  'type' => $type,
243
  'data' => $data,
244
- 'confirmed' => $confirmed
245
  );
246
 
247
  /**
@@ -251,10 +264,26 @@ class GDPR_Requests {
251
  if ( $user instanceof WP_User ) {
252
  $meta_key = self::$plugin_name . '_' . $type . '_key';
253
  update_user_meta( $user->ID, $meta_key, $key );
254
- if ( $time = wp_next_scheduled( 'clean_gdpr_user_request_key', array( 'user_id' => $user->ID, 'meta_key' => $meta_key ) ) ) {
255
- wp_unschedule_event( $time, 'clean_gdpr_user_request_key', array( 'user_id' => $user->ID, 'meta_key' => $meta_key ) );
 
 
 
 
 
 
 
 
 
 
 
256
  }
257
- wp_schedule_single_event( time() + 2 * DAY_IN_SECONDS, 'clean_gdpr_user_request_key', array( 'user_id' => $user->ID, 'meta_key' => $meta_key ) );
 
 
 
 
 
258
  }
259
 
260
  update_option( 'gdpr_requests', $requests );
75
  * @return array The allowed request types.
76
  */
77
  protected function get_allowed_types() {
78
+ return self::$allowed_types;
79
+ }
80
+
81
+ /**
82
+ * Checks if the user has any content published on the site. Including comments.
83
+ * @since 1.0.0
84
+ * @author Fernando Claussen <fernandoclaussen@gmail.com>
85
+ * @static
86
+ * @param WP_User/int $user The user object or the user ID.
87
+ * @return bool Whether the user has content or not.
88
+ */
89
  static function user_has_content( $user ) {
90
  if ( ! $user instanceof WP_User ) {
91
  if ( ! is_int( $user ) ) {
96
 
97
  $post_types = get_post_types( array( 'public' => true ) );
98
  foreach ( $post_types as $pt ) {
99
+ $post_count = count_user_posts( $user->ID, $pt );
100
  if ( $post_count > 0 ) {
101
  return true;
102
  }
103
  }
104
 
105
+ $comments = get_comments(
106
+ array(
107
+ 'author_email' => $user->user_email,
108
+ 'include_unapproved' => true,
109
+ 'number' => 1,
110
+ 'count' => true,
111
+ )
112
+ );
113
 
114
  if ( $comments ) {
115
  return true;
129
  * @return bool Whether the user was removed from the requests list.
130
  */
131
  protected function remove_from_requests( $index ) {
132
+ $requests = (array) get_option( 'gdpr_requests', array() );
133
+ $index = sanitize_text_field( wp_unslash( $index ) );
134
 
135
  if ( array_key_exists( $index, $requests ) ) {
136
  unset( $requests[ $index ] );
151
  * @return bool Whether the request was confirmed or not.
152
  */
153
  protected function confirm_request( $key ) {
154
+ $key = sanitize_text_field( wp_unslash( $key ) );
155
+ $requests = (array) get_option( 'gdpr_requests', array() );
156
 
157
  if ( empty( $requests ) || ! isset( $requests[ $key ] ) ) {
158
  return false;
159
  }
160
 
161
  $requests[ $key ]['confirmed'] = true;
162
+ $type = $requests[ $key ]['type'];
163
+ $email = $requests[ $key ]['email'];
164
 
165
  $user = get_user_by( 'email', $email );
166
 
168
  $meta_key = self::$plugin_name . "_{$type}_key";
169
  update_option( 'gdpr_requests', $requests );
170
  delete_user_meta( $user->ID, $meta_key );
171
+ $time = wp_next_scheduled(
172
+ 'clean_gdpr_user_request_key', array(
173
+ 'user_id' => $user->ID,
174
+ 'meta_key' => $meta_key,
175
+ )
176
+ );
177
+ if ( $time ) {
178
+ wp_unschedule_event(
179
+ $time, 'clean_gdpr_user_request_key', array(
180
+ 'user_id' => $user->ID,
181
+ 'meta_key' => $meta_key,
182
+ )
183
+ );
184
  }
185
  }
186
 
195
  * @param string $key The request key.
196
  */
197
  function clean_requests( $key ) {
198
+ $key = sanitize_text_field( $key );
199
+ $requests = (array) get_option( 'gdpr_requests', array() );
200
 
201
  if ( array_key_exists( $key, $requests ) ) {
202
  if ( ! $requests[ $key ]['confirmed'] ) {
214
  * @param string $meta_key The user meta key.
215
  */
216
  function clean_user_request_key( $user_id, $meta_key ) {
217
+ $user_id = (int) $user_id;
218
  $meta_key = sanitize_text_field( $meta_key );
219
 
220
  $meta = get_user_meta( $user_id, $meta_key, true );
238
  * @param string $confirmed If the request is confirmed or not.
239
  */
240
  protected function add_to_requests( $email, $type, $data = null, $confirmed = false ) {
241
+ $requests = (array) get_option( 'gdpr_requests', array() );
242
 
243
  $email = sanitize_email( $email );
244
+ $type = sanitize_text_field( wp_unslash( $type ) );
245
+ $data = sanitize_textarea_field( wp_unslash( $data ) );
246
 
247
+ if ( ! in_array( $type, self::$allowed_types, true ) ) {
248
  return false;
249
  }
250
 
251
+ $key = wp_generate_password( 20, false );
252
  $requests[ $key ] = array(
253
  'email' => $email,
254
+ 'date' => date( 'F j, Y' ),
255
  'type' => $type,
256
  'data' => $data,
257
+ 'confirmed' => $confirmed,
258
  );
259
 
260
  /**
264
  if ( $user instanceof WP_User ) {
265
  $meta_key = self::$plugin_name . '_' . $type . '_key';
266
  update_user_meta( $user->ID, $meta_key, $key );
267
+ $time = wp_next_scheduled(
268
+ 'clean_gdpr_user_request_key', array(
269
+ 'user_id' => $user->ID,
270
+ 'meta_key' => $meta_key,
271
+ )
272
+ );
273
+ if ( $time ) {
274
+ wp_unschedule_event(
275
+ $time, 'clean_gdpr_user_request_key', array(
276
+ 'user_id' => $user->ID,
277
+ 'meta_key' => $meta_key,
278
+ )
279
+ );
280
  }
281
+ wp_schedule_single_event(
282
+ time() + 2 * DAY_IN_SECONDS, 'clean_gdpr_user_request_key', array(
283
+ 'user_id' => $user->ID,
284
+ 'meta_key' => $meta_key,
285
+ )
286
+ );
287
  }
288
 
289
  update_option( 'gdpr_requests', $requests );
includes/class-gdpr.php CHANGED
@@ -73,7 +73,7 @@ class GDPR {
73
  $this->define_admin_hooks();
74
  $this->define_public_hooks();
75
 
76
- if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) OR ( defined( 'DOING_CRON' ) && DOING_CRON ) OR ( defined( 'DOING_AJAX' ) && DOING_AJAX ) OR ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) ) {
77
  return;
78
  }
79
  }
@@ -169,13 +169,13 @@ class GDPR {
169
  */
170
  private function define_admin_hooks() {
171
 
172
- $plugin_admin = new GDPR_Admin( $this->get_plugin_name(), $this->get_version() );
173
- $requests_admin = new GDPR_Requests_Admin( $this->get_plugin_name(), $this->get_version() );
174
- $telemetry = new GDPR_Telemetry( $this->get_plugin_name(), $this->get_version() );
175
- $requests = new GDPR_Requests( $this->get_plugin_name(), $this->get_version() );
176
- $plugin_emails = new GDPR_Email();
177
  $woo_add_to_registration = get_option( 'gdpr_add_consent_checkboxes_registration', false );
178
- $woo_add_to_checkout = get_option( 'gdpr_add_consent_checkboxes_checkout', false );
179
 
180
  add_filter( 'nonce_user_logged_out', array( $this, 'woo_nonce_fix' ), 100, 2 );
181
  add_action( 'plugins_loaded', array( $this, 'set_locale' ) );
@@ -258,20 +258,20 @@ class GDPR {
258
  $plugin_public = new GDPR_Public( $this->get_plugin_name(), $this->get_version() );
259
  $requests_public = new GDPR_Requests_Public( $this->get_plugin_name(), $this->get_version() );
260
 
261
- add_action( 'wp_enqueue_scripts', array( $plugin_public, 'enqueue_styles' ) );
262
- add_action( 'wp_enqueue_scripts', array( $plugin_public, 'enqueue_scripts' ) );
263
- add_action( 'init', array( $plugin_public, 'set_plugin_cookies' ) );
264
- add_action( 'wp_footer', array( $plugin_public, 'overlay' ) );
265
- add_action( 'wp_footer', array( $plugin_public, 'privacy_bar' ) );
266
- add_action( 'wp_footer', array( $plugin_public, 'is_consent_needed' ) );
267
- add_action( 'wp_footer', array( $plugin_public, 'privacy_preferences_modal' ) );
268
- add_action( 'wp_footer', array( $plugin_public, 'confirmation_screens' ) );
269
- add_action( 'wp_ajax_disagree_with_terms', array( $plugin_public, 'logout' ) );
270
- add_action( 'wp_ajax_agree_with_terms', array( $plugin_public, 'agree_with_terms' ) );
271
- add_action( 'wp_ajax_gdpr_update_privacy_preferences', array( $plugin_public, 'update_privacy_preferences' ) );
272
- add_action( 'wp_ajax_nopriv_gdpr_update_privacy_preferences', array( $plugin_public, 'update_privacy_preferences' ) );
273
- add_action( 'wp_ajax_agree_with_new_policies', array( $plugin_public, 'agree_with_new_policies' ) );
274
- add_action( 'wp_ajax_nopriv_agree_with_new_policies', array( $plugin_public, 'agree_with_new_policies' ) );
275
 
276
  add_action( 'wp', array( $requests_public, 'request_confirmed' ) );
277
  add_action( 'wp_ajax_gdpr_send_request_email', array( $requests_public, 'send_request_email' ) );
@@ -286,7 +286,7 @@ class GDPR {
286
  */
287
  public static function similar_in_array( $needle, $haystack ) {
288
  foreach ( $haystack as $value ) {
289
- if( stripos( strtolower($value) , strtolower($needle) ) !== false ) {
290
  return true;
291
  }
292
  }
@@ -305,13 +305,13 @@ class GDPR {
305
 
306
  if ( isset( $_POST['user_consents'] ) ) {
307
 
308
- $consents = array_map( 'sanitize_text_field', array_keys( $_POST['user_consents'] ) );
309
  foreach ( $consents as $consent ) {
310
  /* translators: Name of consent */
311
  GDPR_Audit_Log::log( $user_id, sprintf( esc_html__( 'User gave explicit consent to %s', 'gdpr' ), $consent ) );
312
  add_user_meta( $user_id, 'gdpr_consents', $consent );
313
  }
314
- setcookie( "gdpr[consent_types]", json_encode( $consents ), time() + YEAR_IN_SECONDS, "/" );
315
  }
316
  }
317
 
@@ -322,27 +322,29 @@ class GDPR {
322
  */
323
  public static function get_consent_checkboxes( $consent_key = false ) {
324
  $consent_types = get_option( 'gdpr_consent_types', array() );
325
- $sent_extras = ( isset( $_POST['user_consents'] ) ) ? $_POST['user_consents'] : array();
326
- $allowed_html = array(
327
  'a' => array(
328
- 'href' => true,
329
- 'title' => true,
330
  'target' => true,
331
  ),
332
  );
333
 
334
  if ( $consent_key ) {
335
- $consent_types = array_filter( $consent_types, function( $key ) use ( $consent_key ) {
336
- return $key === $consent_key;
337
- }, ARRAY_FILTER_USE_KEY );
 
 
338
  }
339
 
340
  ob_start();
341
  foreach ( $consent_types as $key => $consent ) {
342
  $required = ( isset( $consent['policy-page'] ) && $consent['policy-page'] ) ? 'required' : '';
343
- $checked = ( isset( $sent_extras[ $key ] ) ) ? checked( $sent_extras[ $key ], 1, false ) : '';
344
  echo '<p>' .
345
- '<input type="checkbox" name="user_consents[' . esc_attr( $key ) . ']" id="' . esc_attr( $key ) . '-consent" value="1" ' . $required . ' ' . $checked . '>' .
346
  '<label for="' . esc_attr( $key ) . '-consent">' . wp_kses( $consent['registration'], $allowed_html ) . '</label>' .
347
  '</p>';
348
  }
@@ -356,7 +358,7 @@ class GDPR {
356
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
357
  */
358
  public static function consent_checkboxes( $consent_key = false ) {
359
- echo self::get_consent_checkboxes( $consent_key );
360
  }
361
 
362
  /**
@@ -414,10 +416,12 @@ class GDPR {
414
  }
415
 
416
  $usermeta = self::get_user_meta( $user->ID );
417
- $comments = get_comments( array(
418
- 'author_email' => $user->user_email,
419
- 'include_unapproved' => true,
420
- ) );
 
 
421
  $user_consents = get_user_meta( $user->ID, 'gdpr_consents' );
422
  $extra_content = apply_filters( 'gdpr_export_data_extra_tables', '', $email );
423
 
@@ -440,13 +444,13 @@ class GDPR {
440
  if ( ! empty( $comments ) ) {
441
  foreach ( $comments as $k => $v ) {
442
  $comments_array[ $k ] = array(
443
- 'comment_author' => $v->comment_author,
444
  'comment_author_email' => $v->comment_author_email,
445
- 'comment_author_url' => $v->comment_author_url,
446
- 'comment_author_IP' => $v->comment_author_IP,
447
- 'comment_date' => $v->comment_date,
448
- 'comment_agent' => $v->comment_agent,
449
- 'comment_content' => $v->comment_content,
450
  );
451
  }
452
  }
@@ -478,8 +482,8 @@ class GDPR {
478
  break;
479
 
480
  default: // XML
481
- $dom = new DomDocument( '1.0', 'ISO-8859-1' );
482
- $data_wrapper = $dom->createElement( 'Data' );
483
  $dom->appendChild( $data_wrapper );
484
  $personal_info = $dom->createElement( 'Personal_Information' );
485
  $data_wrapper->appendChild( $personal_info );
@@ -520,7 +524,7 @@ class GDPR {
520
  $data_wrapper->appendChild( $meta_data );
521
 
522
  foreach ( $usermeta as $k => $v ) {
523
- $k = is_numeric( substr( $k, 0, 1 ) ) ? '_' . $k : $k;
524
  $key = $dom->createElement( htmlspecialchars( $k ) );
525
  $meta_data->appendChild( $key );
526
  foreach ( $v as $value ) {
@@ -534,7 +538,7 @@ class GDPR {
534
  foreach ( $extra_content['content'] as $key => $obj ) {
535
  $item = $extra->appendChild( $dom->createElement( 'item' ) );
536
  foreach ( $obj as $k => $value ) {
537
- $item->appendChild( $dom->createElement( $k, ( is_object( $value ) || is_array( $value ) ) ? serialize( (array) $value ) : $value ) );
538
  }
539
  }
540
  }
@@ -555,12 +559,12 @@ class GDPR {
555
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
556
  */
557
  function export_data() {
558
- if ( ! isset( $_POST['nonce'], $_POST['email'], $_POST['type'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'gdpr-export-data' ) ) {
559
  wp_send_json_error();
560
  }
561
 
562
- $type = sanitize_text_field( wp_unslash( $_POST['type'] ) );
563
- $email = sanitize_email( $_POST['email'] );
564
  $user = get_user_by( 'email', $email );
565
 
566
  if ( ! $user instanceof WP_User ) {
@@ -585,16 +589,16 @@ class GDPR {
585
  */
586
  public static function save_consent( $user_id, $consent ) {
587
  $registered_consent = get_option( 'gdpr_consent_types', array() );
588
- $consent_ids = array_keys( $registered_consent );
589
- $user = get_user_by( 'ID', $user_id );
590
- $consent = sanitize_text_field( wp_unslash( $consent ) );
591
 
592
  if ( $user ) {
593
  $user_consent = get_user_meta( $user_id, 'gdpr_consents' );
594
- if ( in_array( $consent, $consent_ids ) && ! in_array( $consent, $user_consent ) ) {
595
  add_user_meta( $user_id, 'gdpr_consents', $consent );
596
  $user_consent[] = $consent;
597
- setcookie( "gdpr[consent_types]", json_encode( $user_consent ), time() + YEAR_IN_SECONDS, "/" );
598
  return true;
599
  }
600
  }
@@ -617,11 +621,11 @@ class GDPR {
617
  $user_consent = get_user_meta( $user_id, 'gdpr_consents' );
618
 
619
  $consent = sanitize_text_field( wp_unslash( $consent ) );
620
- $key = array_search( $consent, $user_consent );
621
  if ( false !== $key ) {
622
  delete_user_meta( $user_id, 'gdpr_consents', $consent );
623
  unset( $user_consent[ $key ] );
624
- setcookie( "gdpr[consent_types]", json_encode( $user_consent ), time() + YEAR_IN_SECONDS, "/" );
625
  return true;
626
  }
627
  }
73
  $this->define_admin_hooks();
74
  $this->define_public_hooks();
75
 
76
+ if ( ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) or ( defined( 'DOING_CRON' ) && DOING_CRON ) or ( defined( 'DOING_AJAX' ) && DOING_AJAX ) or ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) ) {
77
  return;
78
  }
79
  }
169
  */
170
  private function define_admin_hooks() {
171
 
172
+ $plugin_admin = new GDPR_Admin( $this->get_plugin_name(), $this->get_version() );
173
+ $requests_admin = new GDPR_Requests_Admin( $this->get_plugin_name(), $this->get_version() );
174
+ $telemetry = new GDPR_Telemetry( $this->get_plugin_name(), $this->get_version() );
175
+ $requests = new GDPR_Requests( $this->get_plugin_name(), $this->get_version() );
176
+ $plugin_emails = new GDPR_Email();
177
  $woo_add_to_registration = get_option( 'gdpr_add_consent_checkboxes_registration', false );
178
+ $woo_add_to_checkout = get_option( 'gdpr_add_consent_checkboxes_checkout', false );
179
 
180
  add_filter( 'nonce_user_logged_out', array( $this, 'woo_nonce_fix' ), 100, 2 );
181
  add_action( 'plugins_loaded', array( $this, 'set_locale' ) );
258
  $plugin_public = new GDPR_Public( $this->get_plugin_name(), $this->get_version() );
259
  $requests_public = new GDPR_Requests_Public( $this->get_plugin_name(), $this->get_version() );
260
 
261
+ add_action( 'wp_enqueue_scripts', array( $plugin_public, 'enqueue_styles' ) );
262
+ add_action( 'wp_enqueue_scripts', array( $plugin_public, 'enqueue_scripts' ) );
263
+ add_action( 'init', array( $plugin_public, 'set_plugin_cookies' ) );
264
+ add_action( 'wp_footer', array( $plugin_public, 'overlay' ) );
265
+ add_action( 'wp_footer', array( $plugin_public, 'privacy_bar' ) );
266
+ add_action( 'wp_footer', array( $plugin_public, 'is_consent_needed' ) );
267
+ add_action( 'wp_footer', array( $plugin_public, 'privacy_preferences_modal' ) );
268
+ add_action( 'wp_footer', array( $plugin_public, 'confirmation_screens' ) );
269
+ add_action( 'wp_ajax_disagree_with_terms', array( $plugin_public, 'logout' ) );
270
+ add_action( 'wp_ajax_agree_with_terms', array( $plugin_public, 'agree_with_terms' ) );
271
+ add_action( 'wp_ajax_gdpr_update_privacy_preferences', array( $plugin_public, 'update_privacy_preferences' ) );
272
+ add_action( 'wp_ajax_nopriv_gdpr_update_privacy_preferences', array( $plugin_public, 'update_privacy_preferences' ) );
273
+ add_action( 'wp_ajax_agree_with_new_policies', array( $plugin_public, 'agree_with_new_policies' ) );
274
+ add_action( 'wp_ajax_nopriv_agree_with_new_policies', array( $plugin_public, 'agree_with_new_policies' ) );
275
 
276
  add_action( 'wp', array( $requests_public, 'request_confirmed' ) );
277
  add_action( 'wp_ajax_gdpr_send_request_email', array( $requests_public, 'send_request_email' ) );
286
  */
287
  public static function similar_in_array( $needle, $haystack ) {
288
  foreach ( $haystack as $value ) {
289
+ if ( stripos( strtolower( $value ), strtolower( $needle ) ) !== false ) {
290
  return true;
291
  }
292
  }
305
 
306
  if ( isset( $_POST['user_consents'] ) ) {
307
 
308
+ $consents = array_map( 'sanitize_text_field', array_keys( sanitize_text_field( wp_unslash( $_POST['user_consents'] ) ) ) ); // WPCS: Input var ok, CSRF ok.
309
  foreach ( $consents as $consent ) {
310
  /* translators: Name of consent */
311
  GDPR_Audit_Log::log( $user_id, sprintf( esc_html__( 'User gave explicit consent to %s', 'gdpr' ), $consent ) );
312
  add_user_meta( $user_id, 'gdpr_consents', $consent );
313
  }
314
+ setcookie( 'gdpr[consent_types]', json_encode( $consents ), time() + YEAR_IN_SECONDS, '/' );
315
  }
316
  }
317
 
322
  */
323
  public static function get_consent_checkboxes( $consent_key = false ) {
324
  $consent_types = get_option( 'gdpr_consent_types', array() );
325
+ $sent_extras = ( isset( $_POST['user_consents'] ) ) ? sanitize_text_field( wp_unslash( $_POST['user_consents'] ) ) : array(); // WPCS: Input var ok, CSRF ok.
326
+ $allowed_html = array(
327
  'a' => array(
328
+ 'href' => true,
329
+ 'title' => true,
330
  'target' => true,
331
  ),
332
  );
333
 
334
  if ( $consent_key ) {
335
+ $consent_types = array_filter(
336
+ $consent_types, function( $key ) use ( $consent_key ) {
337
+ return $key === $consent_key;
338
+ }, ARRAY_FILTER_USE_KEY
339
+ );
340
  }
341
 
342
  ob_start();
343
  foreach ( $consent_types as $key => $consent ) {
344
  $required = ( isset( $consent['policy-page'] ) && $consent['policy-page'] ) ? 'required' : '';
345
+ $checked = ( isset( $sent_extras[ $key ] ) ) ? checked( $sent_extras[ $key ], 1, false ) : '';
346
  echo '<p>' .
347
+ '<input type="checkbox" name="user_consents[' . esc_attr( $key ) . ']" id="' . esc_attr( $key ) . '-consent" value="1" ' . esc_html( $required ) . ' ' . esc_html( $checked ) . '>' .
348
  '<label for="' . esc_attr( $key ) . '-consent">' . wp_kses( $consent['registration'], $allowed_html ) . '</label>' .
349
  '</p>';
350
  }
358
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
359
  */
360
  public static function consent_checkboxes( $consent_key = false ) {
361
+ echo self::get_consent_checkboxes( $consent_key ); // WPCS: XSS ok.
362
  }
363
 
364
  /**
416
  }
417
 
418
  $usermeta = self::get_user_meta( $user->ID );
419
+ $comments = get_comments(
420
+ array(
421
+ 'author_email' => $user->user_email,
422
+ 'include_unapproved' => true,
423
+ )
424
+ );
425
  $user_consents = get_user_meta( $user->ID, 'gdpr_consents' );
426
  $extra_content = apply_filters( 'gdpr_export_data_extra_tables', '', $email );
427
 
444
  if ( ! empty( $comments ) ) {
445
  foreach ( $comments as $k => $v ) {
446
  $comments_array[ $k ] = array(
447
+ 'comment_author' => $v->comment_author,
448
  'comment_author_email' => $v->comment_author_email,
449
+ 'comment_author_url' => $v->comment_author_url,
450
+ 'comment_author_IP' => $v->comment_author_IP,
451
+ 'comment_date' => $v->comment_date,
452
+ 'comment_agent' => $v->comment_agent,
453
+ 'comment_content' => $v->comment_content,
454
  );
455
  }
456
  }
482
  break;
483
 
484
  default: // XML
485
+ $dom = new DomDocument( '1.0', 'ISO-8859-1' );
486
+ $data_wrapper = $dom->createElement( 'Data' );
487
  $dom->appendChild( $data_wrapper );
488
  $personal_info = $dom->createElement( 'Personal_Information' );
489
  $data_wrapper->appendChild( $personal_info );
524
  $data_wrapper->appendChild( $meta_data );
525
 
526
  foreach ( $usermeta as $k => $v ) {
527
+ $k = is_numeric( substr( $k, 0, 1 ) ) ? '_' . $k : $k;
528
  $key = $dom->createElement( htmlspecialchars( $k ) );
529
  $meta_data->appendChild( $key );
530
  foreach ( $v as $value ) {
538
  foreach ( $extra_content['content'] as $key => $obj ) {
539
  $item = $extra->appendChild( $dom->createElement( 'item' ) );
540
  foreach ( $obj as $k => $value ) {
541
+ $item->appendChild( $dom->createElement( $k, ( is_object( $value ) || is_array( $value ) ) ? json_encode( (array) $value ) : $value ) );
542
  }
543
  }
544
  }
559
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
560
  */
561
  function export_data() {
562
+ if ( ! isset( $_POST['nonce'], $_POST['email'], $_POST['type'] ) || ! wp_verify_nonce( sanitize_key( wp_unslash( $_POST['nonce'] ) ), 'gdpr-export-data' ) ) { // WPCS: Input var ok.
563
  wp_send_json_error();
564
  }
565
 
566
+ $type = sanitize_text_field( wp_unslash( $_POST['type'] ) ); // WPCS: Input var ok.
567
+ $email = sanitize_email( wp_unslash( $_POST['email'] ) ); // WPCS: Input var ok.
568
  $user = get_user_by( 'email', $email );
569
 
570
  if ( ! $user instanceof WP_User ) {
589
  */
590
  public static function save_consent( $user_id, $consent ) {
591
  $registered_consent = get_option( 'gdpr_consent_types', array() );
592
+ $consent_ids = array_keys( $registered_consent );
593
+ $user = get_user_by( 'ID', $user_id );
594
+ $consent = sanitize_text_field( wp_unslash( $consent ) );
595
 
596
  if ( $user ) {
597
  $user_consent = get_user_meta( $user_id, 'gdpr_consents' );
598
+ if ( in_array( $consent, $consent_ids, true ) && ! in_array( $consent, $user_consent, true ) ) {
599
  add_user_meta( $user_id, 'gdpr_consents', $consent );
600
  $user_consent[] = $consent;
601
+ setcookie( 'gdpr[consent_types]', json_encode( $user_consent ), time() + YEAR_IN_SECONDS, '/' );
602
  return true;
603
  }
604
  }
621
  $user_consent = get_user_meta( $user_id, 'gdpr_consents' );
622
 
623
  $consent = sanitize_text_field( wp_unslash( $consent ) );
624
+ $key = array_search( $consent, $user_consent, true );
625
  if ( false !== $key ) {
626
  delete_user_meta( $user_id, 'gdpr_consents', $consent );
627
  unset( $user_consent[ $key ] );
628
+ setcookie( 'gdpr[consent_types]', json_encode( $user_consent ), time() + YEAR_IN_SECONDS, '/' );
629
  return true;
630
  }
631
  }
includes/helper-functions.php CHANGED
@@ -22,9 +22,11 @@ function gdpr_preferences( $text ) {
22
  }
23
 
24
  function gdpr_preferences_shortcode( $atts ) {
25
- $atts = shortcode_atts( array(
26
- 'text' => esc_html__( 'Privacy Preferences', 'gdpr' ),
27
- ), $atts, 'gdpr_preferences' );
 
 
28
 
29
  ob_start();
30
  gdpr_preferences( $atts['text'] );
@@ -37,10 +39,11 @@ add_shortcode( 'gdpr_preferences', 'gdpr_preferences_shortcode' );
37
  * Load the request forms.
38
  * @since 1.0.0
39
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
40
- * @param string $type The type of request.
 
41
  */
42
- function gdpr_request_form( $type ) {
43
- echo GDPR_Requests_Public::request_form( $type );
44
  }
45
 
46
  /**
@@ -50,19 +53,24 @@ function gdpr_request_form( $type ) {
50
  * @param string $atts Shortcode attributes.
51
  */
52
  function gdpr_request_form_shortcode( $atts ) {
53
- $atts = shortcode_atts( array(
54
- 'type' => '',
55
- ), $atts, 'gdpr_request_form' );
56
-
57
- return GDPR_Requests_Public::request_form( $atts['type'] );
 
 
 
58
  }
59
 
60
  add_shortcode( 'gdpr_request_form', 'gdpr_request_form_shortcode' );
61
 
62
  function gdpr_get_consent_checkboxes( $atts ) {
63
- $atts = shortcode_atts( array(
64
- 'id' => false,
65
- ), $atts, 'gdpr_consent_checkboxes' );
 
 
66
 
67
  return GDPR::get_consent_checkboxes( $atts['id'] );
68
  }
@@ -76,10 +84,10 @@ function gdpr_get_consent_checkboxes( $atts ) {
76
  */
77
  function is_allowed_cookie( $cookie_name ) {
78
  if ( isset( $_COOKIE['gdpr']['allowed_cookies'] ) ) {
79
- $allowed_cookies = json_decode( wp_unslash( $_COOKIE['gdpr']['allowed_cookies'] ), true );
80
- $name = preg_quote( $cookie_name, '~' );
81
- $result = preg_grep( '~' . $name . '~', $allowed_cookies );
82
- if ( in_array( $cookie_name, $allowed_cookies ) || ! empty( $result ) ) {
83
  return true;
84
  }
85
  }
@@ -93,7 +101,7 @@ function gdpr_deprecated_function( $function, $version, $replacement = null ) {
93
  $log_string = "The {$function} function is deprecated since version {$version}.";
94
  $log_string .= $replacement ? " Replace with {$replacement}." : '';
95
  } else {
96
- _deprecated_function( $function, $version, $replacement );
97
  }
98
  }
99
 
@@ -112,14 +120,14 @@ function have_consent( $consent ) {
112
  function has_consent( $consent ) {
113
 
114
  if ( is_user_logged_in() ) {
115
- $user = wp_get_current_user();
116
  $consents = (array) get_user_meta( $user->ID, 'gdpr_consents' );
117
- } else if ( isset( $_COOKIE['gdpr']['consent_types'] ) && ! empty( $_COOKIE['gdpr']['consent_types'] ) ) {
118
- $consents = array_map( 'sanitize_text_field', (array) json_decode( wp_unslash( $_COOKIE['gdpr']['consent_types'] ) ) );
119
  }
120
 
121
  if ( isset( $consents ) && ! empty( $consents ) ) {
122
- if ( in_array( $consent, $consents ) ) {
123
  return true;
124
  }
125
  }
@@ -128,5 +136,5 @@ function has_consent( $consent ) {
128
  }
129
 
130
  function is_dnt() {
131
- return ( isset( $_SERVER['HTTP_DNT'] ) && $_SERVER['HTTP_DNT'] === '1' );
132
  }
22
  }
23
 
24
  function gdpr_preferences_shortcode( $atts ) {
25
+ $atts = shortcode_atts(
26
+ array(
27
+ 'text' => esc_html__( 'Privacy Preferences', 'gdpr' ),
28
+ ), $atts, 'gdpr_preferences'
29
+ );
30
 
31
  ob_start();
32
  gdpr_preferences( $atts['text'] );
39
  * Load the request forms.
40
  * @since 1.0.0
41
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
42
+ * @param string $type The type of request.
43
+ * @param string $button_text The submit button text.
44
  */
45
+ function gdpr_request_form( $type, $button_text = '' ) {
46
+ echo GDPR_Requests_Public::request_form( $type, $button_text ); // WPCS: XSS ok.
47
  }
48
 
49
  /**
53
  * @param string $atts Shortcode attributes.
54
  */
55
  function gdpr_request_form_shortcode( $atts ) {
56
+ $atts = shortcode_atts(
57
+ array(
58
+ 'type' => '',
59
+ 'text' => '',
60
+ ), $atts, 'gdpr_request_form'
61
+ );
62
+
63
+ return GDPR_Requests_Public::request_form( $atts['type'], $atts['text'] );
64
  }
65
 
66
  add_shortcode( 'gdpr_request_form', 'gdpr_request_form_shortcode' );
67
 
68
  function gdpr_get_consent_checkboxes( $atts ) {
69
+ $atts = shortcode_atts(
70
+ array(
71
+ 'id' => false,
72
+ ), $atts, 'gdpr_consent_checkboxes'
73
+ );
74
 
75
  return GDPR::get_consent_checkboxes( $atts['id'] );
76
  }
84
  */
85
  function is_allowed_cookie( $cookie_name ) {
86
  if ( isset( $_COOKIE['gdpr']['allowed_cookies'] ) ) {
87
+ $allowed_cookies = array_map( 'sanitize_text_field', json_decode( wp_unslash( $_COOKIE['gdpr']['allowed_cookies'] ), true ) ); // WPCS: Input var ok, sanitization ok.
88
+ $name = preg_quote( $cookie_name, '~' );
89
+ $result = preg_grep( '~' . $name . '~', $allowed_cookies );
90
+ if ( in_array( $cookie_name, $allowed_cookies, true ) || ! empty( $result ) ) {
91
  return true;
92
  }
93
  }
101
  $log_string = "The {$function} function is deprecated since version {$version}.";
102
  $log_string .= $replacement ? " Replace with {$replacement}." : '';
103
  } else {
104
+ _deprecated_function( esc_html( $function ), esc_html( $version ), esc_html( $replacement ) );
105
  }
106
  }
107
 
120
  function has_consent( $consent ) {
121
 
122
  if ( is_user_logged_in() ) {
123
+ $user = wp_get_current_user();
124
  $consents = (array) get_user_meta( $user->ID, 'gdpr_consents' );
125
+ } elseif ( isset( $_COOKIE['gdpr']['consent_types'] ) && ! empty( $_COOKIE['gdpr']['consent_types'] ) ) { // WPCS: Input var ok.
126
+ $consents = array_map( 'sanitize_text_field', (array) json_decode( wp_unslash( $_COOKIE['gdpr']['consent_types'] ) ) ); // WPCS: Input var ok, sanitization ok.
127
  }
128
 
129
  if ( isset( $consents ) && ! empty( $consents ) ) {
130
+ if ( in_array( $consent, $consents, true ) ) {
131
  return true;
132
  }
133
  }
136
  }
137
 
138
  function is_dnt() {
139
+ return ( isset( $_SERVER['HTTP_DNT'] ) && '1' === $_SERVER['HTTP_DNT'] ); // WPCS: Input var ok.
140
  }
languages/gdpr.pot CHANGED
@@ -13,23 +13,23 @@ msgstr ""
13
  "X-Poedit-SourceCharset: UTF-8\n"
14
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
 
16
- #: admin/class-gdpr-admin.php:100, admin/class-gdpr-admin.php:111
17
  msgid "GDPR"
18
  msgstr ""
19
 
20
- #: admin/class-gdpr-admin.php:118, admin/partials/requests.php:18
21
  msgid "Requests"
22
  msgstr ""
23
 
24
- #: admin/class-gdpr-admin.php:124, admin/partials/tools.php:44
25
  msgid "Tools"
26
  msgstr ""
27
 
28
- #: admin/class-gdpr-admin.php:130
29
  msgid "Settings"
30
  msgstr ""
31
 
32
- #: admin/class-gdpr-admin.php:296, includes/class-gdpr-help.php:38, includes/class-gdpr-help.php:43, admin/partials/requests.php:32
33
  msgid "Rectify Data"
34
  msgstr ""
35
 
@@ -37,208 +37,208 @@ msgstr ""
37
  msgid "Complaint"
38
  msgstr ""
39
 
40
- #: admin/class-gdpr-admin.php:304, includes/class-gdpr-help.php:56
41
  msgid "Erasure"
42
  msgstr ""
43
 
44
- #: admin/class-gdpr-admin.php:321, includes/class-gdpr-help.php:81, includes/class-gdpr-help.php:85, admin/partials/tools.php:55
45
  msgid "Access Data"
46
  msgstr ""
47
 
48
- #: admin/class-gdpr-admin.php:322, includes/class-gdpr-help.php:95, admin/partials/tools.php:72
49
  msgid "Data Breach"
50
  msgstr ""
51
 
52
- #: admin/class-gdpr-admin.php:323, includes/class-gdpr-help.php:99, includes/class-gdpr-help.php:106, admin/partials/tools.php:117
53
  msgid "Audit Log"
54
  msgstr ""
55
 
56
- #: admin/class-gdpr-admin.php:395
57
  msgid "Consent Given"
58
  msgstr ""
59
 
60
- #: admin/class-gdpr-admin.php:399
61
  msgid "Consent ID"
62
  msgstr ""
63
 
64
- #: admin/class-gdpr-admin.php:411, admin/partials/requests.php:275
65
  msgid "Comments"
66
  msgstr ""
67
 
68
- #: admin/class-gdpr-admin.php:416
69
  msgid "Comment Field"
70
  msgstr ""
71
 
72
- #: admin/class-gdpr-admin.php:417
73
  msgid "Comment Data"
74
  msgstr ""
75
 
76
- #: admin/class-gdpr-admin.php:453
77
  msgid "Metadata"
78
  msgstr ""
79
 
80
- #: admin/class-gdpr-admin.php:457
81
  msgid "Name"
82
  msgstr ""
83
 
84
- #: admin/class-gdpr-admin.php:458
85
  msgid "Value"
86
  msgstr ""
87
 
88
- #: admin/class-gdpr-admin.php:507
89
  msgid "No logs found for this email."
90
  msgstr ""
91
 
92
- #: admin/class-gdpr-admin.php:519
93
  msgid "Review your settings"
94
  msgstr ""
95
 
96
- #: admin/class-gdpr-admin.php:520
97
  msgid "We have added a few new options which must be reviewed before continuing to use the plugin."
98
  msgstr ""
99
 
100
- #: admin/class-gdpr-admin.php:521
101
  msgid "For cookies, we have added a status which allows you to set them as ON, OFF or Required. For consents, we moved the policy selector into each consent. All policies can now be tracked through this."
102
  msgstr ""
103
 
104
- #: admin/class-gdpr-admin.php:522
105
  msgid "Please keep in mind the plugin might not work as intended until these settings are reviewed."
106
  msgstr ""
107
 
108
- #: admin/class-gdpr-admin.php:557
109
  msgid "Your %s page has been updated."
110
  msgstr ""
111
 
112
- #: admin/class-gdpr-admin.php:559
113
  msgid "In case this was not a small typo fix, you must ask users for explicit consent again."
114
  msgstr ""
115
 
116
- #: admin/class-gdpr-admin.php:568
117
  msgid "Ask for consent"
118
  msgstr ""
119
 
120
- #: admin/class-gdpr-admin.php:577
121
  msgid "Ignore"
122
  msgstr ""
123
 
124
- #: admin/class-gdpr-admin.php:592, admin/class-gdpr-admin.php:731, admin/class-gdpr-admin.php:796, public/class-gdpr-public.php:198, public/class-gdpr-public.php:295, public/class-gdpr-public.php:354
125
  msgid "We could not verify the the security token. Please try again."
126
  msgstr ""
127
 
128
- #: admin/class-gdpr-admin.php:604
129
  msgid "One or more required fields are missing. Please try again."
130
  msgstr ""
131
 
132
- #: admin/class-gdpr-admin.php:651
133
  msgid "Data breach notification has been initialized. An email confirmation has been sent to the website controller."
134
  msgstr ""
135
 
136
- #: admin/class-gdpr-admin.php:714
137
  msgid "ERROR"
138
  msgstr ""
139
 
140
- #: admin/class-gdpr-admin.php:716
141
  msgid "is a required consent"
142
  msgstr ""
143
 
144
  #. translators: 1: The name of the policy that was updated.
145
- #: admin/class-gdpr-admin.php:749
146
  msgid "%1$s has been updated. Removing the %1$s consent and requesting new consent."
147
  msgstr ""
148
 
149
- #: admin/class-gdpr-admin.php:819, includes/class-gdpr-help.php:161, public/partials/privacy-preferences-modal.php:32, public/partials/privacy-preferences-modal.php:63
150
  msgid "Consent Management"
151
  msgstr ""
152
 
153
- #: admin/class-gdpr-admin.php:856
154
  msgid "Profile Updated. These are the user consents after the save:"
155
  msgstr ""
156
 
157
- #: admin/class-gdpr-admin.php:929, admin/partials/settings.php:332
158
  msgid "Consents"
159
  msgstr ""
160
 
161
- #: admin/class-gdpr-requests-admin.php:30, admin/class-gdpr-requests-admin.php:155, admin/class-gdpr-requests-admin.php:203, admin/class-gdpr-requests-admin.php:240
162
  msgid "We could not verify the user email or the security token. Please try again."
163
  msgstr ""
164
 
165
- #: admin/class-gdpr-requests-admin.php:37, admin/class-gdpr-requests-admin.php:286, admin/class-gdpr-requests-admin.php:331, public/class-gdpr-requests-public.php:121, public/partials/confirmation-screens.php:37
166
  msgid "User not found."
167
  msgstr ""
168
 
169
- #: admin/class-gdpr-requests-admin.php:57
170
  msgid "User %s is the only admin of the site. It cannot be deleted."
171
  msgstr ""
172
 
173
- #: admin/class-gdpr-requests-admin.php:78, admin/class-gdpr-requests-admin.php:117
174
  msgid "User added to the deletion requests list by admin."
175
  msgstr ""
176
 
177
- #: admin/class-gdpr-requests-admin.php:80, admin/class-gdpr-requests-admin.php:119
178
  msgid "User %s was added to the deletion table."
179
  msgstr ""
180
 
181
- #: admin/class-gdpr-requests-admin.php:101
182
  msgid "User already placed a deletion request."
183
  msgstr ""
184
 
185
- #: admin/class-gdpr-requests-admin.php:141, admin/class-gdpr-requests-admin.php:189
186
  msgid "We could not verify the type of request you want to cancel."
187
  msgstr ""
188
 
189
  #. translators: The type of request
190
- #: admin/class-gdpr-requests-admin.php:149, admin/class-gdpr-requests-admin.php:197
191
  msgid "Type of request '%s' is not an allowed type."
192
  msgstr ""
193
 
194
  #. translators: The type of request i.e 'delete'
195
- #: admin/class-gdpr-requests-admin.php:164
196
  msgid "User was removed from the %s request list by admin."
197
  msgstr ""
198
 
199
- #: admin/class-gdpr-requests-admin.php:167
200
  msgid "User %s was removed from this request table."
201
  msgstr ""
202
 
203
  #. translators: User email
204
- #: admin/class-gdpr-requests-admin.php:216
205
  msgid "User %s request was marked as resolved by admin."
206
  msgstr ""
207
 
208
- #: admin/class-gdpr-requests-admin.php:218
209
  msgid "Request was resolved. User %s has been notified."
210
  msgstr ""
211
 
212
- #: admin/class-gdpr-requests-admin.php:251, public/class-gdpr-requests-public.php:44
213
  msgid "User was removed from the site."
214
  msgstr ""
215
 
216
- #: admin/class-gdpr-requests-admin.php:256
217
  msgid "User %s was deleted from the site."
218
  msgstr ""
219
 
220
- #: admin/class-gdpr-requests-admin.php:278, admin/class-gdpr-requests-admin.php:317, public/class-gdpr-requests-public.php:82
221
  msgid "We could not verify the security token. Please try again."
222
  msgstr ""
223
 
224
- #: admin/class-gdpr-requests-admin.php:302
225
  msgid "Guest"
226
  msgstr ""
227
 
228
- #: admin/class-gdpr-requests-admin.php:306
229
  msgid "User comments were anonymized."
230
  msgstr ""
231
 
232
- #: admin/class-gdpr-requests-admin.php:321
233
  msgid "Essential data missing. Please try again."
234
  msgstr ""
235
 
236
  #. translators: 1: The post type, 2: The user the posts were reassigned to
237
- #: admin/class-gdpr-requests-admin.php:352
238
- msgid "User %s were reassigned to %s."
239
  msgstr ""
240
 
241
- #: admin/class-gdpr-requests-admin.php:356
242
  msgid "Something went wrong. Please try again."
243
  msgstr ""
244
 
@@ -258,100 +258,100 @@ msgstr ""
258
  msgid "Search in destination"
259
  msgstr ""
260
 
261
- #: admin/class-gdpr-telemetry.php:185
262
  msgid "Delete all"
263
  msgstr ""
264
 
265
- #: admin/class-gdpr-telemetry.php:197
266
  msgid "Destination"
267
  msgstr ""
268
 
269
- #: admin/class-gdpr-telemetry.php:198
270
  msgid "File"
271
  msgstr ""
272
 
273
- #: admin/class-gdpr-telemetry.php:199
274
  msgid "Code"
275
  msgstr ""
276
 
277
- #: admin/class-gdpr-telemetry.php:200
278
  msgid "Time"
279
  msgstr ""
280
 
281
- #: admin/class-gdpr-telemetry.php:201
282
  msgid "Data"
283
  msgstr ""
284
 
285
- #: admin/class-gdpr-telemetry.php:343
286
  msgid "Show"
287
  msgstr ""
288
 
289
- #: includes/class-gdpr-email.php:158
290
  msgid "Data breach notification sent to user."
291
  msgstr ""
292
 
293
  #. translators: email content
294
- #: includes/class-gdpr-email.php:160
295
  msgid "Email content: %s"
296
  msgstr ""
297
 
298
  #. translators: nature of the data breach
299
- #: includes/class-gdpr-email.php:162
300
  msgid "Nature of data breach: %s"
301
  msgstr ""
302
 
303
  #. translators: data protection officer contact information
304
- #: includes/class-gdpr-email.php:164
305
  msgid "Data protection officer contact: %s"
306
  msgstr ""
307
 
308
  #. translators: likely consequences
309
- #: includes/class-gdpr-email.php:166
310
  msgid "Likely consequences of breach: %s"
311
  msgstr ""
312
 
313
  #. translators: measures taken
314
- #: includes/class-gdpr-email.php:168
315
  msgid "Measures taken or proposed to be taken: %s"
316
  msgstr ""
317
 
318
- #: includes/class-gdpr-email.php:197
319
  msgid "GDPR Notification: There is a new request waiting to be reviewed."
320
  msgstr ""
321
 
322
- #: includes/class-gdpr-email.php:198
323
  msgid "Someone requested to close your account."
324
  msgstr ""
325
 
326
- #: includes/class-gdpr-email.php:199
327
  msgid "Your account has been closed."
328
  msgstr ""
329
 
330
- #: includes/class-gdpr-email.php:200
331
  msgid "Someone requested that we rectify data of your account."
332
  msgstr ""
333
 
334
- #: includes/class-gdpr-email.php:201, includes/class-gdpr-email.php:203, includes/class-gdpr-email.php:205
335
  msgid "Your request has been completed."
336
  msgstr ""
337
 
338
- #: includes/class-gdpr-email.php:202
339
  msgid "Someone made complaint on behalf of your account."
340
  msgstr ""
341
 
342
- #: includes/class-gdpr-email.php:204
343
  msgid "Someone requested to download your data."
344
  msgstr ""
345
 
346
- #: includes/class-gdpr-email.php:206
347
  msgid "Someone requested to send a data breach notification."
348
  msgstr ""
349
 
350
- #: includes/class-gdpr-email.php:207
351
  msgid "Data Breach Notification."
352
  msgstr ""
353
 
354
- #: includes/class-gdpr-help.php:30, includes/class-gdpr-help.php:34, includes/class-gdpr-help.php:73, includes/class-gdpr-help.php:77, includes/class-gdpr-help.php:177, includes/class-gdpr-help.php:184
355
  msgid "Overview"
356
  msgstr ""
357
 
@@ -359,163 +359,163 @@ msgstr ""
359
  msgid "This page has multiple request tables. Users can request multiple things like getting deleted from the site or having their data rectified. All requests will come to these tables."
360
  msgstr ""
361
 
362
- #: includes/class-gdpr-help.php:39
363
  msgid "Users may request to have their data rectified. They can place a request somewhere on your site and those requests will show up here."
364
  msgstr ""
365
 
366
- #: includes/class-gdpr-help.php:40
367
  msgid "When you complete the request, mark it as resolved and the requester will get a notification email confirming that their request was resolved."
368
  msgstr ""
369
 
370
- #: includes/class-gdpr-help.php:47, includes/class-gdpr-help.php:52, admin/partials/requests.php:89
371
  msgid "Complaints"
372
  msgstr ""
373
 
374
- #: includes/class-gdpr-help.php:48
375
  msgid "Users may complain about something that happened. They can place a complaint somewhere on your site and those complaints will show up here."
376
  msgstr ""
377
 
378
- #: includes/class-gdpr-help.php:49
379
  msgid "When you resolve the problem, mark it as resolved and the requester will get a notification email confirming that his complaint was resolved."
380
  msgstr ""
381
 
382
- #: includes/class-gdpr-help.php:57
383
  msgid "Users may request to be deleted from the site. If they don't have any content published on the site (including comments) they will be removed from the site automatically. Otherwise, they will show up at this review table where you can reassign or delete their published content and anonymize his comments."
384
  msgstr ""
385
 
386
- #: includes/class-gdpr-help.php:58
387
  msgid "User may request their data to be deleted. The controller has, according to GDPR, 30 days to fulfill the request. On some occasions, you can ask to extend this time limit. When the request has been resolved the user will receive a notification that their account has been closed."
388
  msgstr ""
389
 
390
- #: includes/class-gdpr-help.php:61
391
  msgid "Erasures"
392
  msgstr ""
393
 
394
- #: includes/class-gdpr-help.php:74
395
  msgid "We added tools to make your life easier when you need to perform administrative tasks like notify all your users of a possible data breach."
396
  msgstr ""
397
 
398
- #: includes/class-gdpr-help.php:82
399
  msgid "Use this page to look for all known data about a user. You can look it up using the user's email address and are able to download it in XML and JSON formats."
400
  msgstr ""
401
 
402
- #: includes/class-gdpr-help.php:89
403
  msgid "Data Breach Notification"
404
  msgstr ""
405
 
406
- #: includes/class-gdpr-help.php:90
407
  msgid "Use this carefully."
408
  msgstr ""
409
 
410
- #: includes/class-gdpr-help.php:91
411
  msgid "This will send a mass email to all your users with the information provided on these fields. This email is throttled based on the hourly limit set on the plugin settings page. "
412
  msgstr ""
413
 
414
- #: includes/class-gdpr-help.php:92
415
  msgid "Only use this tool if you believe your site has been compromised and that your user's personal data might have been leaked."
416
  msgstr ""
417
 
418
- #: includes/class-gdpr-help.php:100
419
  msgid "We do not log any of the user's personal data."
420
  msgstr ""
421
 
422
- #: includes/class-gdpr-help.php:101
423
  msgid "All logs are encrypted before saving to the database. An encrypted log file is created whenever a user gets removed from the site."
424
  msgstr ""
425
 
426
- #: includes/class-gdpr-help.php:102
427
  msgid "This tool will keep a record of some actions such as changing consent preferences, placing a request, data breach notifications received, etc…"
428
  msgstr ""
429
 
430
- #: includes/class-gdpr-help.php:103
431
  msgid "The only way to read the logs is to search for the user email. If the data subject is not a registered site user anymore, you need to ask for the 6 digit token that was provided during deletion. That will allow this tool to look for a log file with his information."
432
  msgstr ""
433
 
434
- #: includes/class-gdpr-help.php:118, includes/class-gdpr-help.php:123
435
  msgid "General Settings"
436
  msgstr ""
437
 
438
- #: includes/class-gdpr-help.php:119
439
  msgid "This plugin needs to know your privacy policy page to track updates to it and ask users to re-consent to your new terms."
440
  msgstr ""
441
 
442
- #: includes/class-gdpr-help.php:120
443
  msgid "When sending a data breach notification to your users, we need to throttle the emails because of server limitations. This is an hourly limit. Check with your hosting provider before changing this value."
444
  msgstr ""
445
 
446
- #: includes/class-gdpr-help.php:127, includes/class-gdpr-help.php:140
447
  msgid "Cookie Management"
448
  msgstr ""
449
 
450
- #: includes/class-gdpr-help.php:128
451
  msgid "Fill out every information you can about the cookies your site uses. Set the cookies that you set under Cookies Used and cookies used and set by third parties under the Third party domains."
452
  msgstr ""
453
 
454
- #: includes/class-gdpr-help.php:130
455
  msgid "You must ask your developer to wrap the code that sets the cookies with our helper function %s."
456
  msgstr ""
457
 
458
- #: includes/class-gdpr-help.php:131
459
  msgid "Some services like Google Analytics provide a way to opt out from their code with an extra parameter to their snippet."
460
  msgstr ""
461
 
462
- #: includes/class-gdpr-help.php:132, includes/class-gdpr-help.php:149
463
  msgid "External Links"
464
  msgstr ""
465
 
466
- #: includes/class-gdpr-help.php:134, includes/class-gdpr-help.php:134
467
  msgid "WordPress cookies"
468
  msgstr ""
469
 
470
- #: includes/class-gdpr-help.php:144
471
  msgid "Consent Management ( Coming Soon )"
472
  msgstr ""
473
 
474
- #: includes/class-gdpr-help.php:145
475
  msgid "All consents are disabled by default. On first registration, your users will need to consent to your privacy policy. Depending on your privacy policy you should register multiple types of consent on this page and allow them to be toggled on/off."
476
  msgstr ""
477
 
478
- #: includes/class-gdpr-help.php:147
479
  msgid "If you have an optional consent type, you must have a developer wrap the functionality in our helper function %s."
480
  msgstr ""
481
 
482
- #: includes/class-gdpr-help.php:148
483
  msgid "i.e."
484
  msgstr ""
485
 
486
- #: includes/class-gdpr-help.php:148
487
  msgid "You registered email marketing as an optional consent but the user did not actively opt into it on their profile page. You should have your email capture form wrapped in our helper function to block registration or better yet, not even display the email capture form. Same goes for blocking adding the user to your mailing system on registration if consent is not given."
488
  msgstr ""
489
 
490
- #: includes/class-gdpr-help.php:151, includes/class-gdpr-help.php:151
491
  msgid "Article 7 - Conditions for consent"
492
  msgstr ""
493
 
494
- #: includes/class-gdpr-help.php:152, includes/class-gdpr-help.php:152
495
  msgid "Article 8 - conditions applicable to child's consent in relation to information society services"
496
  msgstr ""
497
 
498
- #: includes/class-gdpr-help.php:153, includes/class-gdpr-help.php:153
499
  msgid "Recital 42 - Burden of proof and requirements for consent"
500
  msgstr ""
501
 
502
- #: includes/class-gdpr-help.php:154, includes/class-gdpr-help.php:154
503
  msgid "Recital 43 - Freely Given consent"
504
  msgstr ""
505
 
506
- #: includes/class-gdpr-help.php:178
507
  msgid "This is all data that are being sent outside of your site. WordPress send some data to it's servers to be able to do automatic updates. You can reduce the amount of data being sent using filters."
508
  msgstr ""
509
 
510
- #: includes/class-gdpr-help.php:179
511
  msgid "Some plugins also capture data and send it to their servers. Such practice is not allowed for plugins hosted on wordpress.org plugin repository. In case this is a Premium plugin, you should have been given the option to choose which type of data you want to send."
512
  msgstr ""
513
 
514
- #: includes/class-gdpr-help.php:180
515
  msgid "Use this tool to identify plugins or themes sending potential personal data outside of your server and take action if necessary."
516
  msgstr ""
517
 
518
- #: includes/class-gdpr-requests.php:214
519
  msgid "User request expired. Removing %s user_meta."
520
  msgstr ""
521
 
@@ -528,176 +528,176 @@ msgstr ""
528
  msgid "User gave explicit consent to %s"
529
  msgstr ""
530
 
531
- #: includes/helper-functions.php:26, public/partials/privacy-bar.php:38
532
  msgid "Privacy Preferences"
533
  msgstr ""
534
 
535
- #: public/class-gdpr-public.php:125
536
  msgid "Aborting"
537
  msgstr ""
538
 
539
- #: public/class-gdpr-public.php:126
540
  msgid "Continue"
541
  msgstr ""
542
 
543
- #: public/class-gdpr-public.php:127
544
  msgid "Cancel"
545
  msgstr ""
546
 
547
- #: public/class-gdpr-public.php:128, public/partials/confirmation-screens.php:61
548
  msgid "OK"
549
  msgstr ""
550
 
551
- #: public/class-gdpr-public.php:145, public/partials/reconsent-bar.php:31
552
  msgid "I Agree"
553
  msgstr ""
554
 
555
- #: public/class-gdpr-public.php:198, public/class-gdpr-public.php:354, public/class-gdpr-requests-public.php:78, public/class-gdpr-requests-public.php:82, public/class-gdpr-requests-public.php:92, public/class-gdpr-requests-public.php:105, public/class-gdpr-requests-public.php:121, public/class-gdpr-requests-public.php:144, public/class-gdpr-requests-public.php:152, public/class-gdpr-requests-public.php:198, public/partials/confirmation-screens.php:32, public/partials/confirmation-screens.php:36, public/partials/confirmation-screens.php:40, public/partials/confirmation-screens.php:44
556
  msgid "Error!"
557
  msgstr ""
558
 
559
- #: public/class-gdpr-public.php:234
560
  msgid "User updated their privacy preferences. These are the new approved cookies and consent preferences:"
561
  msgstr ""
562
 
563
- #: public/class-gdpr-public.php:361
564
  msgid "User provided new consent for %1$s."
565
  msgstr ""
566
 
567
- #: public/class-gdpr-requests-public.php:78
568
  msgid "Invalid type of request. Please try again."
569
  msgstr ""
570
 
571
- #: public/class-gdpr-requests-public.php:92, public/class-gdpr-requests-public.php:105
572
  msgid "Please verify that you are not a robot."
573
  msgstr ""
574
 
575
- #: public/class-gdpr-requests-public.php:144
576
  msgid "We can't delete this user."
577
  msgstr ""
578
 
579
- #: public/class-gdpr-requests-public.php:152
580
  msgid "Required information is missing from the form."
581
  msgstr ""
582
 
583
- #: public/class-gdpr-requests-public.php:196
584
  msgid "Email confirmation"
585
  msgstr ""
586
 
587
- #: public/class-gdpr-requests-public.php:196
588
  msgid "We've sent you a confirmation email."
589
  msgstr ""
590
 
591
- #: public/class-gdpr-requests-public.php:198
592
  msgid "There was a problem with your request. Please try again later."
593
  msgstr ""
594
 
595
- #: public/class-gdpr-requests-public.php:275
596
  msgid "User confirmed a request to be deleted."
597
  msgstr ""
598
 
599
- #: public/class-gdpr-requests-public.php:277
600
  msgid "Content was found for that user."
601
  msgstr ""
602
 
603
- #: public/class-gdpr-requests-public.php:279
604
  msgid "User added to the erasure review table."
605
  msgstr ""
606
 
607
- #: public/class-gdpr-requests-public.php:313
608
  msgid "User placed a request for rectification or a complaint."
609
  msgstr ""
610
 
611
  #. translators: File format. Can be XML or JSON
612
- #: public/class-gdpr-requests-public.php:330
613
  msgid "User downloaded all their data in %s format."
614
  msgstr ""
615
 
616
- #: admin/partials/requests.php:36, admin/partials/requests.php:79, admin/partials/requests.php:93, admin/partials/requests.php:136, admin/partials/requests.php:163, admin/partials/requests.php:313
617
  msgid "Email"
618
  msgstr ""
619
 
620
- #: admin/partials/requests.php:37, admin/partials/requests.php:80, admin/partials/requests.php:164, admin/partials/requests.php:314
621
  msgid "Date of Request"
622
  msgstr ""
623
 
624
- #: admin/partials/requests.php:38, admin/partials/requests.php:81, admin/partials/requests.php:95, admin/partials/requests.php:138
625
  msgid "Information"
626
  msgstr ""
627
 
628
- #: admin/partials/requests.php:39, admin/partials/requests.php:82, admin/partials/requests.php:96, admin/partials/requests.php:139, admin/partials/requests.php:166, admin/partials/requests.php:316
629
  msgid "Actions"
630
  msgstr ""
631
 
632
- #: admin/partials/requests.php:56, admin/partials/requests.php:113, admin/partials/requests.php:197
633
  msgid "Cancel Request"
634
  msgstr ""
635
 
636
- #: admin/partials/requests.php:64, admin/partials/requests.php:121
637
  msgid "Mark as Resolved"
638
  msgstr ""
639
 
640
- #: admin/partials/requests.php:72, admin/partials/requests.php:129, admin/partials/requests.php:306
641
  msgid "No pending requests"
642
  msgstr ""
643
 
644
- #: admin/partials/requests.php:94, admin/partials/requests.php:137
645
  msgid "Date of Complaint"
646
  msgstr ""
647
 
648
- #: admin/partials/requests.php:146
649
  msgid "Right to erasure"
650
  msgstr ""
651
 
652
- #: admin/partials/requests.php:153
653
  msgid "Manually add a user"
654
  msgstr ""
655
 
656
- #: admin/partials/requests.php:155, admin/partials/tools.php:63, admin/partials/tools.php:125
657
  msgid "email@domain.com"
658
  msgstr ""
659
 
660
- #: admin/partials/requests.php:156, public/partials/complaint-form.php:11, public/partials/rectify-form.php:10
661
  msgid "Submit"
662
  msgstr ""
663
 
664
- #: admin/partials/requests.php:165, admin/partials/requests.php:180, admin/partials/requests.php:217, admin/partials/requests.php:315
665
  msgid "Review"
666
  msgstr ""
667
 
668
- #: admin/partials/requests.php:182
669
  msgid "No content to review"
670
  msgstr ""
671
 
672
- #: admin/partials/requests.php:204
673
  msgid "Delete User"
674
  msgstr ""
675
 
676
- #: admin/partials/requests.php:215
677
  msgid "Content Type"
678
  msgstr ""
679
 
680
- #: admin/partials/requests.php:216
681
  msgid "Count"
682
  msgstr ""
683
 
684
- #: admin/partials/requests.php:218, admin/partials/requests.php:257
685
  msgid "Reassign"
686
  msgstr ""
687
 
688
- #: admin/partials/requests.php:219
689
  msgid "Action"
690
  msgstr ""
691
 
692
- #: admin/partials/requests.php:259, admin/partials/requests.php:286
693
  msgid "Resolved"
694
  msgstr ""
695
 
696
- #: admin/partials/requests.php:277
697
  msgid "View Comments"
698
  msgstr ""
699
 
700
- #: admin/partials/requests.php:284
701
  msgid "Anonymize"
702
  msgstr ""
703
 
@@ -813,227 +813,231 @@ msgstr ""
813
  msgid "To prevent spam attacks, you have the option to enable reCAPTCHA. Configure below your keys to make it work with our request forms."
814
  msgstr ""
815
 
816
- #: admin/partials/settings.php:133
817
  msgid "You can find the necessary information %s."
818
  msgstr ""
819
 
820
- #: admin/partials/settings.php:134
821
  msgid "here"
822
  msgstr ""
823
 
824
- #: admin/partials/settings.php:140
825
  msgid "Enable reCAPTCHA"
826
  msgstr ""
827
 
828
- #: admin/partials/settings.php:149
829
  msgid "Site Key"
830
  msgstr ""
831
 
832
- #: admin/partials/settings.php:158
833
  msgid "Secret Key"
834
  msgstr ""
835
 
836
- #: admin/partials/settings.php:169
837
  msgid "WooCommerce"
838
  msgstr ""
839
 
840
- #: admin/partials/settings.php:174
841
  msgid "Add consent checkboxes to the registration page"
842
  msgstr ""
843
 
844
- #: admin/partials/settings.php:183
845
  msgid "Add consent checkboxes to the checkout registration form"
846
  msgstr ""
847
 
848
- #: admin/partials/settings.php:195
849
  msgid "Cookies"
850
  msgstr ""
851
 
852
- #: admin/partials/settings.php:196
853
  msgid "Category name"
854
  msgstr ""
855
 
856
- #: admin/partials/settings.php:197
857
- msgid "Add tab"
858
  msgstr ""
859
 
860
- #: admin/partials/settings.php:201
861
  msgid "Remove this tab."
862
  msgstr ""
863
 
864
- #: admin/partials/settings.php:207, admin/partials/templates/tmpl-cookies.php:9
865
  msgid "Category Name"
866
  msgstr ""
867
 
868
- #: admin/partials/settings.php:208, admin/partials/settings.php:209
869
  msgid "Change this value if you want to name it something different."
870
  msgstr ""
871
 
872
- #: admin/partials/settings.php:221, admin/partials/templates/tmpl-cookies.php:23
873
  msgid "Status"
874
  msgstr ""
875
 
876
- #: admin/partials/settings.php:222, admin/partials/settings.php:223
877
  msgid "Required cookies are cookies that cannot be opted out of and need to be created for the site to function properly. The ON status means that the cookie preference for this category will be enabled by default. The OFF status means the user needs to manually turn these cookies on to opt into these cookies."
878
  msgstr ""
879
 
880
- #: admin/partials/settings.php:231, public/partials/privacy-preferences-modal.php:73, public/partials/privacy-preferences-modal.php:120, admin/partials/templates/tmpl-cookies.php:33
881
  msgid "Required"
882
  msgstr ""
883
 
884
- #: admin/partials/settings.php:232, admin/partials/templates/tmpl-cookies.php:34
885
  msgid "ON"
886
  msgstr ""
887
 
888
- #: admin/partials/settings.php:233, admin/partials/templates/tmpl-cookies.php:35
889
  msgid "OFF"
890
  msgstr ""
891
 
892
- #: admin/partials/settings.php:240, admin/partials/settings.php:293, admin/partials/templates/tmpl-cookies.php:42, admin/partials/templates/tmpl-cookies.php:99
893
  msgid "Cookies used"
894
  msgstr ""
895
 
896
- #: admin/partials/settings.php:241, admin/partials/settings.php:242
897
  msgid "A comma-separated list of cookies that your site is using that fit this category."
898
  msgstr ""
899
 
900
- #: admin/partials/settings.php:250, admin/partials/templates/tmpl-cookies.php:52, admin/partials/templates/tmpl-cookies.php:103
901
  msgid "Comma separated list."
902
  msgstr ""
903
 
904
- #: admin/partials/settings.php:256, admin/partials/templates/tmpl-cookies.php:58
905
  msgid "How are these used"
906
  msgstr ""
907
 
908
- #: admin/partials/settings.php:257, admin/partials/settings.php:258
909
  msgid "A brief explanation of why you are requesting to use these cookies, what they are for, and how you process them."
910
  msgstr ""
911
 
912
- #: admin/partials/settings.php:268, admin/partials/templates/tmpl-cookies.php:70
913
  msgid "Third party domain"
914
  msgstr ""
915
 
916
- #: admin/partials/settings.php:269, admin/partials/settings.php:270
917
  msgid "E.g. facebook.com"
918
  msgstr ""
919
 
920
- #: admin/partials/settings.php:277, admin/partials/templates/tmpl-cookies.php:79
 
 
 
 
921
  msgid "Add"
922
  msgstr ""
923
 
924
- #: admin/partials/settings.php:279, admin/partials/templates/tmpl-cookies.php:81
925
  msgid "Cookies that are set by a third party, like facebook.com."
926
  msgstr ""
927
 
928
- #: admin/partials/settings.php:287, admin/partials/templates/tmpl-cookies.php:94
929
  msgid "Remove this domain."
930
  msgstr ""
931
 
932
- #: admin/partials/settings.php:294, admin/partials/settings.php:295
933
  msgid "A comma separated list of cookies that your site is using from this third-party provider."
934
  msgstr ""
935
 
936
- #: admin/partials/settings.php:307
937
  msgid "Opt Out Link"
938
  msgstr ""
939
 
940
- #: admin/partials/settings.php:308, admin/partials/settings.php:309
941
  msgid "Add a link with the third-party instructions on how to opt out of their cookies."
942
  msgstr ""
943
 
944
- #: admin/partials/settings.php:317, admin/partials/templates/tmpl-cookies.php:111
945
  msgid "Url with instructions on how to opt out."
946
  msgstr ""
947
 
948
- #: admin/partials/settings.php:333
949
  msgid "E.g. Privacy Policy or Cookie Policy"
950
  msgstr ""
951
 
952
- #: admin/partials/settings.php:334
953
  msgid "Add consent"
954
  msgstr ""
955
 
956
- #: admin/partials/settings.php:339, admin/partials/templates/tmpl-consents.php:3
957
  msgid "Unregister this consent."
958
  msgstr ""
959
 
960
- #: admin/partials/settings.php:346, admin/partials/templates/tmpl-consents.php:10
961
  msgid "Policy Page"
962
  msgstr ""
963
 
964
- #: admin/partials/settings.php:347, admin/partials/settings.php:348, admin/partials/templates/tmpl-consents.php:11, admin/partials/templates/tmpl-consents.php:12
965
  msgid "This page will be tracked for changes and you will be prompted to ask users to re-consent to the new policy. Selecting a page will make this consent required."
966
  msgstr ""
967
 
968
- #: admin/partials/settings.php:365, admin/partials/templates/tmpl-consents.php:29
969
  msgid "Long description"
970
  msgstr ""
971
 
972
- #: admin/partials/settings.php:366, admin/partials/settings.php:367, admin/partials/templates/tmpl-consents.php:30, admin/partials/templates/tmpl-consents.php:31
973
  msgid "This will show up at the privacy preferences center, under the name of the consent."
974
  msgstr ""
975
 
976
- #: admin/partials/settings.php:377, admin/partials/templates/tmpl-consents.php:41
977
  msgid "Short description"
978
  msgstr ""
979
 
980
- #: admin/partials/settings.php:378, admin/partials/settings.php:379, admin/partials/templates/tmpl-consents.php:42, admin/partials/templates/tmpl-consents.php:43
981
  msgid "This will show up at registration forms next to checkboxes."
982
  msgstr ""
983
 
984
- #: admin/partials/tools.php:32
985
  msgid "Data Breach confirmed. Preparing bulk emails."
986
  msgstr ""
987
 
988
- #: admin/partials/tools.php:61, admin/partials/tools.php:123
989
  msgid "Search by email"
990
  msgstr ""
991
 
992
- #: admin/partials/tools.php:64, admin/partials/tools.php:127
993
  msgid "Search"
994
  msgstr ""
995
 
996
- #: admin/partials/tools.php:78
997
  msgid "Email content"
998
  msgstr ""
999
 
1000
- #: admin/partials/tools.php:81
1001
  msgid "The content that the end user will see before the below information."
1002
  msgstr ""
1003
 
1004
- #: admin/partials/tools.php:85
1005
  msgid "Nature of the personal data breach"
1006
  msgstr ""
1007
 
1008
- #: admin/partials/tools.php:88
1009
  msgid "Describe the nature of the personal data breach including where possible, the categories and the approximate number of data subjects concerned and the categories and the approximate number of personal data records concerned."
1010
  msgstr ""
1011
 
1012
- #: admin/partials/tools.php:92
1013
  msgid "Name and contact details of the data protection officer"
1014
  msgstr ""
1015
 
1016
- #: admin/partials/tools.php:95
1017
  msgid "Communicate the name and contact details of the data protection officer or another point of contact where more information can be obtained."
1018
  msgstr ""
1019
 
1020
- #: admin/partials/tools.php:99
1021
  msgid "Likely consequences of the personal data breach"
1022
  msgstr ""
1023
 
1024
- #: admin/partials/tools.php:105
1025
  msgid "Measures taken or proposed to be taken"
1026
  msgstr ""
1027
 
1028
- #: admin/partials/tools.php:108
1029
  msgid "Describe the measures taken or proposed to be taken by the controller to address the personal data breach, including, where appropriate, measures to mitigate its possible adverse effects."
1030
  msgstr ""
1031
 
1032
- #: admin/partials/tools.php:112
1033
  msgid "Send confirmation email"
1034
  msgstr ""
1035
 
1036
- #: admin/partials/tools.php:126
1037
  msgid "6 digit token (optional)"
1038
  msgstr ""
1039
 
@@ -1041,35 +1045,31 @@ msgstr ""
1041
  msgid "Type your complaint here"
1042
  msgstr ""
1043
 
1044
- #: public/partials/confirmation-screens.php:20
1045
  msgid "Your account"
1046
  msgstr ""
1047
 
1048
- #: public/partials/confirmation-screens.php:22
1049
  msgid "Your account has been closed. We are sorry to see you go."
1050
  msgstr ""
1051
 
1052
- #: public/partials/confirmation-screens.php:24
1053
  msgid "Your request has been received and is being reviewed. You will receive an email when we are done."
1054
  msgstr ""
1055
 
1056
- #: public/partials/confirmation-screens.php:28
1057
  msgid "Request Received"
1058
  msgstr ""
1059
 
1060
- #: public/partials/confirmation-screens.php:29
1061
  msgid "Your request has been received. We will be in touch soon."
1062
  msgstr ""
1063
 
1064
- #: public/partials/confirmation-screens.php:33
1065
- msgid "Malformed request confirmation link!"
1066
- msgstr ""
1067
-
1068
- #: public/partials/confirmation-screens.php:41
1069
  msgid "We could not confirm the request key. It may be expired."
1070
  msgstr ""
1071
 
1072
- #: public/partials/confirmation-screens.php:45
1073
  msgid "The key used does not match the request key we have stored."
1074
  msgstr ""
1075
 
@@ -1093,20 +1093,20 @@ msgstr ""
1093
  msgid "Cookie Settings"
1094
  msgstr ""
1095
 
1096
- #: public/partials/privacy-preferences-modal.php:101
1097
  msgid "Cookies Used"
1098
  msgstr ""
1099
 
1100
- #: public/partials/privacy-preferences-modal.php:139
1101
  msgid "Opt Out"
1102
  msgstr ""
1103
 
1104
- #: public/partials/privacy-preferences-modal.php:154
1105
  msgid "Save Preferences"
1106
  msgstr ""
1107
 
1108
  #: public/partials/reconsent-bar.php:18
1109
- msgid "Some of our policies have been updated. Please make sure to select the \"View\" link next each item in order to view changes before agreeing."
1110
  msgstr ""
1111
 
1112
  #: public/partials/reconsent-bar.php:26
@@ -1125,17 +1125,17 @@ msgid ""
1125
  "--------------------------------------------------------\n"
1126
  "Request\n"
1127
  "--------------------------------------------------------\n"
1128
- "%s\n"
1129
  "\n"
1130
  "\n"
1131
  "\n"
1132
  "\n"
1133
- "To confirm this request, click here: %s\n"
1134
  "\n"
1135
  "\n"
1136
  "\n"
1137
  "---------------------------------------------------------------------------------\n"
1138
- "If that wasn't you, reset your password: %s\n"
1139
  ""
1140
  msgstr ""
1141
 
@@ -1147,56 +1147,56 @@ msgstr ""
1147
 
1148
  #: templates/email/data-breach-notification.php:4
1149
  msgid ""
1150
- "%s\n"
1151
  "\n"
1152
  "--------------------------------------------------------\n"
1153
  "Nature of the personal data breach:\n"
1154
  "--------------------------------------------------------\n"
1155
- "%s\n"
1156
  "\n"
1157
  "--------------------------------------------------------\n"
1158
  "Name and contact details of the data protection officer:\n"
1159
  "--------------------------------------------------------\n"
1160
- "%s\n"
1161
  "\n"
1162
  "--------------------------------------------------------\n"
1163
  "Likely consequences of the personal data breach:\n"
1164
  "--------------------------------------------------------\n"
1165
- "%s\n"
1166
  "\n"
1167
  "--------------------------------------------------------\n"
1168
  "Measures taken or proposed to be taken:\n"
1169
  "--------------------------------------------------------\n"
1170
- "%s\n"
1171
  ""
1172
  msgstr ""
1173
 
1174
  #: templates/email/data-breach-request.php:4
1175
  msgid ""
1176
- "A request to send a mass email notification to all users regarding a data breach has been made by %s.\n"
1177
  "\n"
1178
  "--------------------------------------------------------\n"
1179
  "Nature of the personal data breach:\n"
1180
  "--------------------------------------------------------\n"
1181
- "%s\n"
1182
  "\n"
1183
  "--------------------------------------------------------\n"
1184
  "Name and contact details of the data protection officer:\n"
1185
  "--------------------------------------------------------\n"
1186
- "%s\n"
1187
  "\n"
1188
  "--------------------------------------------------------\n"
1189
  "Likely consequences of the personal data breach:\n"
1190
  "--------------------------------------------------------\n"
1191
- "%s\n"
1192
  "\n"
1193
  "--------------------------------------------------------\n"
1194
  "Measures taken or proposed to be taken:\n"
1195
  "--------------------------------------------------------\n"
1196
- "%s\n"
1197
  "\n"
1198
  "\n"
1199
- "To confirm this request, click here: %s\n"
1200
  "\n"
1201
  "---------------------------------------------------------------------------------\n"
1202
  "If that is not intended, have the person who requested it change their password.\n"
@@ -1213,12 +1213,12 @@ msgid ""
1213
  "\n"
1214
  "\n"
1215
  "\n"
1216
- "To confirm this request, click here: %s\n"
1217
  "\n"
1218
  "\n"
1219
  "\n"
1220
  "---------------------------------------------------------------------------------\n"
1221
- "If that wasn't you, reset your password: %s\n"
1222
  ""
1223
  msgstr ""
1224
 
@@ -1238,13 +1238,13 @@ msgid ""
1238
  "Someone requested to download your data from our site.\n"
1239
  "By clicking confirm we will redirect you back to our site where a download will begin.\n"
1240
  "\n"
1241
- "To download it in a XML format, click here: %s\n"
1242
- "To download it in a JSON format, click here: %s\n"
1243
  "\n"
1244
  "\n"
1245
  "\n"
1246
  "---------------------------------------------------------------------------------\n"
1247
- "If that wasn't you, reset your password: %s\n"
1248
  ""
1249
  msgstr ""
1250
 
@@ -1263,17 +1263,17 @@ msgid ""
1263
  "--------------------------------------------------------\n"
1264
  "Request\n"
1265
  "--------------------------------------------------------\n"
1266
- "%s\n"
1267
  "\n"
1268
  "\n"
1269
  "\n"
1270
  "\n"
1271
- "To confirm this request, click here: %s\n"
1272
  "\n"
1273
  "\n"
1274
  "\n"
1275
  "---------------------------------------------------------------------------------\n"
1276
- "If that wasn't you, reset your password: %s\n"
1277
  ""
1278
  msgstr ""
1279
 
@@ -1291,10 +1291,6 @@ msgstr ""
1291
  msgid "Required cookies are cookies that cannot be opt out. They need to be created for the site to function properly. Status ON means that the cookie will be set after agreement. Status OFF means the user needs to check the checkbox to activate this category."
1292
  msgstr ""
1293
 
1294
- #: admin/partials/templates/tmpl-cookies.php:43, admin/partials/templates/tmpl-cookies.php:44
1295
- msgid "A comma separated list of cookies that your site is using that fit this category."
1296
- msgstr ""
1297
-
1298
  #: admin/partials/templates/tmpl-cookies.php:59, admin/partials/templates/tmpl-cookies.php:60
1299
  msgid "A brief explanation on why you are requesting to use these cookies, what they are for and how you process them."
1300
  msgstr ""
@@ -1303,10 +1299,6 @@ msgstr ""
1303
  msgid "E.g. youtube.com"
1304
  msgstr ""
1305
 
1306
- #: admin/partials/templates/tmpl-cookies.php:78
1307
- msgid "domain.com"
1308
- msgstr ""
1309
-
1310
  #: admin/partials/templates/tmpl-cookies.php:107
1311
  msgid "How to Opt Out"
1312
  msgstr ""
13
  "X-Poedit-SourceCharset: UTF-8\n"
14
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
 
16
+ #: admin/class-gdpr-admin.php:100, admin/class-gdpr-admin.php:113
17
  msgid "GDPR"
18
  msgstr ""
19
 
20
+ #: admin/class-gdpr-admin.php:120, admin/partials/requests.php:18
21
  msgid "Requests"
22
  msgstr ""
23
 
24
+ #: admin/class-gdpr-admin.php:126, admin/partials/tools.php:42
25
  msgid "Tools"
26
  msgstr ""
27
 
28
+ #: admin/class-gdpr-admin.php:132
29
  msgid "Settings"
30
  msgstr ""
31
 
32
+ #: admin/class-gdpr-admin.php:296, includes/class-gdpr-help.php:40, includes/class-gdpr-help.php:46, admin/partials/requests.php:32
33
  msgid "Rectify Data"
34
  msgstr ""
35
 
37
  msgid "Complaint"
38
  msgstr ""
39
 
40
+ #: admin/class-gdpr-admin.php:304, includes/class-gdpr-help.php:62
41
  msgid "Erasure"
42
  msgstr ""
43
 
44
+ #: admin/class-gdpr-admin.php:321, includes/class-gdpr-help.php:91, includes/class-gdpr-help.php:96, admin/partials/tools.php:53
45
  msgid "Access Data"
46
  msgstr ""
47
 
48
+ #: admin/class-gdpr-admin.php:322, includes/class-gdpr-help.php:108, admin/partials/tools.php:70
49
  msgid "Data Breach"
50
  msgstr ""
51
 
52
+ #: admin/class-gdpr-admin.php:323, includes/class-gdpr-help.php:113, includes/class-gdpr-help.php:121, admin/partials/tools.php:115
53
  msgid "Audit Log"
54
  msgstr ""
55
 
56
+ #: admin/class-gdpr-admin.php:397
57
  msgid "Consent Given"
58
  msgstr ""
59
 
60
+ #: admin/class-gdpr-admin.php:401
61
  msgid "Consent ID"
62
  msgstr ""
63
 
64
+ #: admin/class-gdpr-admin.php:413, admin/partials/requests.php:285
65
  msgid "Comments"
66
  msgstr ""
67
 
68
+ #: admin/class-gdpr-admin.php:418
69
  msgid "Comment Field"
70
  msgstr ""
71
 
72
+ #: admin/class-gdpr-admin.php:419
73
  msgid "Comment Data"
74
  msgstr ""
75
 
76
+ #: admin/class-gdpr-admin.php:455
77
  msgid "Metadata"
78
  msgstr ""
79
 
80
+ #: admin/class-gdpr-admin.php:459
81
  msgid "Name"
82
  msgstr ""
83
 
84
+ #: admin/class-gdpr-admin.php:460
85
  msgid "Value"
86
  msgstr ""
87
 
88
+ #: admin/class-gdpr-admin.php:514
89
  msgid "No logs found for this email."
90
  msgstr ""
91
 
92
+ #: admin/class-gdpr-admin.php:526
93
  msgid "Review your settings"
94
  msgstr ""
95
 
96
+ #: admin/class-gdpr-admin.php:527
97
  msgid "We have added a few new options which must be reviewed before continuing to use the plugin."
98
  msgstr ""
99
 
100
+ #: admin/class-gdpr-admin.php:528
101
  msgid "For cookies, we have added a status which allows you to set them as ON, OFF or Required. For consents, we moved the policy selector into each consent. All policies can now be tracked through this."
102
  msgstr ""
103
 
104
+ #: admin/class-gdpr-admin.php:529
105
  msgid "Please keep in mind the plugin might not work as intended until these settings are reviewed."
106
  msgstr ""
107
 
108
+ #: admin/class-gdpr-admin.php:564
109
  msgid "Your %s page has been updated."
110
  msgstr ""
111
 
112
+ #: admin/class-gdpr-admin.php:566
113
  msgid "In case this was not a small typo fix, you must ask users for explicit consent again."
114
  msgstr ""
115
 
116
+ #: admin/class-gdpr-admin.php:575
117
  msgid "Ask for consent"
118
  msgstr ""
119
 
120
+ #: admin/class-gdpr-admin.php:584
121
  msgid "Ignore"
122
  msgstr ""
123
 
124
+ #: admin/class-gdpr-admin.php:599, admin/class-gdpr-admin.php:743, admin/class-gdpr-admin.php:814, public/class-gdpr-public.php:203, public/class-gdpr-public.php:305, public/class-gdpr-public.php:368
125
  msgid "We could not verify the the security token. Please try again."
126
  msgstr ""
127
 
128
+ #: admin/class-gdpr-admin.php:611
129
  msgid "One or more required fields are missing. Please try again."
130
  msgstr ""
131
 
132
+ #: admin/class-gdpr-admin.php:661
133
  msgid "Data breach notification has been initialized. An email confirmation has been sent to the website controller."
134
  msgstr ""
135
 
136
+ #: admin/class-gdpr-admin.php:725
137
  msgid "ERROR"
138
  msgstr ""
139
 
140
+ #: admin/class-gdpr-admin.php:727
141
  msgid "is a required consent"
142
  msgstr ""
143
 
144
  #. translators: 1: The name of the policy that was updated.
145
+ #: admin/class-gdpr-admin.php:763
146
  msgid "%1$s has been updated. Removing the %1$s consent and requesting new consent."
147
  msgstr ""
148
 
149
+ #: admin/class-gdpr-admin.php:837, includes/class-gdpr-help.php:184, public/partials/privacy-preferences-modal.php:32, public/partials/privacy-preferences-modal.php:65
150
  msgid "Consent Management"
151
  msgstr ""
152
 
153
+ #: admin/class-gdpr-admin.php:874
154
  msgid "Profile Updated. These are the user consents after the save:"
155
  msgstr ""
156
 
157
+ #: admin/class-gdpr-admin.php:953, admin/partials/settings.php:335
158
  msgid "Consents"
159
  msgstr ""
160
 
161
+ #: admin/class-gdpr-requests-admin.php:30, admin/class-gdpr-requests-admin.php:159, admin/class-gdpr-requests-admin.php:207, admin/class-gdpr-requests-admin.php:243
162
  msgid "We could not verify the user email or the security token. Please try again."
163
  msgstr ""
164
 
165
+ #: admin/class-gdpr-requests-admin.php:37, admin/class-gdpr-requests-admin.php:289, admin/class-gdpr-requests-admin.php:336, public/class-gdpr-requests-public.php:146, public/partials/confirmation-screens.php:34
166
  msgid "User not found."
167
  msgstr ""
168
 
169
+ #: admin/class-gdpr-requests-admin.php:59
170
  msgid "User %s is the only admin of the site. It cannot be deleted."
171
  msgstr ""
172
 
173
+ #: admin/class-gdpr-requests-admin.php:80, admin/class-gdpr-requests-admin.php:121
174
  msgid "User added to the deletion requests list by admin."
175
  msgstr ""
176
 
177
+ #: admin/class-gdpr-requests-admin.php:82, admin/class-gdpr-requests-admin.php:123
178
  msgid "User %s was added to the deletion table."
179
  msgstr ""
180
 
181
+ #: admin/class-gdpr-requests-admin.php:105
182
  msgid "User already placed a deletion request."
183
  msgstr ""
184
 
185
+ #: admin/class-gdpr-requests-admin.php:145, admin/class-gdpr-requests-admin.php:193
186
  msgid "We could not verify the type of request you want to cancel."
187
  msgstr ""
188
 
189
  #. translators: The type of request
190
+ #: admin/class-gdpr-requests-admin.php:153, admin/class-gdpr-requests-admin.php:201
191
  msgid "Type of request '%s' is not an allowed type."
192
  msgstr ""
193
 
194
  #. translators: The type of request i.e 'delete'
195
+ #: admin/class-gdpr-requests-admin.php:168
196
  msgid "User was removed from the %s request list by admin."
197
  msgstr ""
198
 
199
+ #: admin/class-gdpr-requests-admin.php:171
200
  msgid "User %s was removed from this request table."
201
  msgstr ""
202
 
203
  #. translators: User email
204
+ #: admin/class-gdpr-requests-admin.php:219
205
  msgid "User %s request was marked as resolved by admin."
206
  msgstr ""
207
 
208
+ #: admin/class-gdpr-requests-admin.php:221
209
  msgid "Request was resolved. User %s has been notified."
210
  msgstr ""
211
 
212
+ #: admin/class-gdpr-requests-admin.php:254, public/class-gdpr-requests-public.php:44
213
  msgid "User was removed from the site."
214
  msgstr ""
215
 
216
+ #: admin/class-gdpr-requests-admin.php:259
217
  msgid "User %s was deleted from the site."
218
  msgstr ""
219
 
220
+ #: admin/class-gdpr-requests-admin.php:281, admin/class-gdpr-requests-admin.php:322, public/class-gdpr-requests-public.php:82
221
  msgid "We could not verify the security token. Please try again."
222
  msgstr ""
223
 
224
+ #: admin/class-gdpr-requests-admin.php:307
225
  msgid "Guest"
226
  msgstr ""
227
 
228
+ #: admin/class-gdpr-requests-admin.php:311
229
  msgid "User comments were anonymized."
230
  msgstr ""
231
 
232
+ #: admin/class-gdpr-requests-admin.php:326
233
  msgid "Essential data missing. Please try again."
234
  msgstr ""
235
 
236
  #. translators: 1: The post type, 2: The user the posts were reassigned to
237
+ #: admin/class-gdpr-requests-admin.php:359
238
+ msgid "User %1$s were reassigned to %2$s."
239
  msgstr ""
240
 
241
+ #: admin/class-gdpr-requests-admin.php:363
242
  msgid "Something went wrong. Please try again."
243
  msgstr ""
244
 
258
  msgid "Search in destination"
259
  msgstr ""
260
 
261
+ #: admin/class-gdpr-telemetry.php:187
262
  msgid "Delete all"
263
  msgstr ""
264
 
265
+ #: admin/class-gdpr-telemetry.php:199
266
  msgid "Destination"
267
  msgstr ""
268
 
269
+ #: admin/class-gdpr-telemetry.php:200
270
  msgid "File"
271
  msgstr ""
272
 
273
+ #: admin/class-gdpr-telemetry.php:201
274
  msgid "Code"
275
  msgstr ""
276
 
277
+ #: admin/class-gdpr-telemetry.php:202
278
  msgid "Time"
279
  msgstr ""
280
 
281
+ #: admin/class-gdpr-telemetry.php:203
282
  msgid "Data"
283
  msgstr ""
284
 
285
+ #: admin/class-gdpr-telemetry.php:345
286
  msgid "Show"
287
  msgstr ""
288
 
289
+ #: includes/class-gdpr-email.php:162
290
  msgid "Data breach notification sent to user."
291
  msgstr ""
292
 
293
  #. translators: email content
294
+ #: includes/class-gdpr-email.php:164
295
  msgid "Email content: %s"
296
  msgstr ""
297
 
298
  #. translators: nature of the data breach
299
+ #: includes/class-gdpr-email.php:166
300
  msgid "Nature of data breach: %s"
301
  msgstr ""
302
 
303
  #. translators: data protection officer contact information
304
+ #: includes/class-gdpr-email.php:168
305
  msgid "Data protection officer contact: %s"
306
  msgstr ""
307
 
308
  #. translators: likely consequences
309
+ #: includes/class-gdpr-email.php:170
310
  msgid "Likely consequences of breach: %s"
311
  msgstr ""
312
 
313
  #. translators: measures taken
314
+ #: includes/class-gdpr-email.php:172
315
  msgid "Measures taken or proposed to be taken: %s"
316
  msgstr ""
317
 
318
+ #: includes/class-gdpr-email.php:203
319
  msgid "GDPR Notification: There is a new request waiting to be reviewed."
320
  msgstr ""
321
 
322
+ #: includes/class-gdpr-email.php:204
323
  msgid "Someone requested to close your account."
324
  msgstr ""
325
 
326
+ #: includes/class-gdpr-email.php:205
327
  msgid "Your account has been closed."
328
  msgstr ""
329
 
330
+ #: includes/class-gdpr-email.php:206
331
  msgid "Someone requested that we rectify data of your account."
332
  msgstr ""
333
 
334
+ #: includes/class-gdpr-email.php:207, includes/class-gdpr-email.php:209, includes/class-gdpr-email.php:211
335
  msgid "Your request has been completed."
336
  msgstr ""
337
 
338
+ #: includes/class-gdpr-email.php:208
339
  msgid "Someone made complaint on behalf of your account."
340
  msgstr ""
341
 
342
+ #: includes/class-gdpr-email.php:210
343
  msgid "Someone requested to download your data."
344
  msgstr ""
345
 
346
+ #: includes/class-gdpr-email.php:212
347
  msgid "Someone requested to send a data breach notification."
348
  msgstr ""
349
 
350
+ #: includes/class-gdpr-email.php:213
351
  msgid "Data Breach Notification."
352
  msgstr ""
353
 
354
+ #: includes/class-gdpr-help.php:30, includes/class-gdpr-help.php:35, includes/class-gdpr-help.php:81, includes/class-gdpr-help.php:86, includes/class-gdpr-help.php:201, includes/class-gdpr-help.php:209
355
  msgid "Overview"
356
  msgstr ""
357
 
359
  msgid "This page has multiple request tables. Users can request multiple things like getting deleted from the site or having their data rectified. All requests will come to these tables."
360
  msgstr ""
361
 
362
+ #: includes/class-gdpr-help.php:41
363
  msgid "Users may request to have their data rectified. They can place a request somewhere on your site and those requests will show up here."
364
  msgstr ""
365
 
366
+ #: includes/class-gdpr-help.php:42
367
  msgid "When you complete the request, mark it as resolved and the requester will get a notification email confirming that their request was resolved."
368
  msgstr ""
369
 
370
+ #: includes/class-gdpr-help.php:51, includes/class-gdpr-help.php:57, admin/partials/requests.php:98
371
  msgid "Complaints"
372
  msgstr ""
373
 
374
+ #: includes/class-gdpr-help.php:52
375
  msgid "Users may complain about something that happened. They can place a complaint somewhere on your site and those complaints will show up here."
376
  msgstr ""
377
 
378
+ #: includes/class-gdpr-help.php:53
379
  msgid "When you resolve the problem, mark it as resolved and the requester will get a notification email confirming that his complaint was resolved."
380
  msgstr ""
381
 
382
+ #: includes/class-gdpr-help.php:63
383
  msgid "Users may request to be deleted from the site. If they don't have any content published on the site (including comments) they will be removed from the site automatically. Otherwise, they will show up at this review table where you can reassign or delete their published content and anonymize his comments."
384
  msgstr ""
385
 
386
+ #: includes/class-gdpr-help.php:64
387
  msgid "User may request their data to be deleted. The controller has, according to GDPR, 30 days to fulfill the request. On some occasions, you can ask to extend this time limit. When the request has been resolved the user will receive a notification that their account has been closed."
388
  msgstr ""
389
 
390
+ #: includes/class-gdpr-help.php:68
391
  msgid "Erasures"
392
  msgstr ""
393
 
394
+ #: includes/class-gdpr-help.php:82
395
  msgid "We added tools to make your life easier when you need to perform administrative tasks like notify all your users of a possible data breach."
396
  msgstr ""
397
 
398
+ #: includes/class-gdpr-help.php:92
399
  msgid "Use this page to look for all known data about a user. You can look it up using the user's email address and are able to download it in XML and JSON formats."
400
  msgstr ""
401
 
402
+ #: includes/class-gdpr-help.php:101
403
  msgid "Data Breach Notification"
404
  msgstr ""
405
 
406
+ #: includes/class-gdpr-help.php:102
407
  msgid "Use this carefully."
408
  msgstr ""
409
 
410
+ #: includes/class-gdpr-help.php:103
411
  msgid "This will send a mass email to all your users with the information provided on these fields. This email is throttled based on the hourly limit set on the plugin settings page. "
412
  msgstr ""
413
 
414
+ #: includes/class-gdpr-help.php:104
415
  msgid "Only use this tool if you believe your site has been compromised and that your user's personal data might have been leaked."
416
  msgstr ""
417
 
418
+ #: includes/class-gdpr-help.php:114
419
  msgid "We do not log any of the user's personal data."
420
  msgstr ""
421
 
422
+ #: includes/class-gdpr-help.php:115
423
  msgid "All logs are encrypted before saving to the database. An encrypted log file is created whenever a user gets removed from the site."
424
  msgstr ""
425
 
426
+ #: includes/class-gdpr-help.php:116
427
  msgid "This tool will keep a record of some actions such as changing consent preferences, placing a request, data breach notifications received, etc…"
428
  msgstr ""
429
 
430
+ #: includes/class-gdpr-help.php:117
431
  msgid "The only way to read the logs is to search for the user email. If the data subject is not a registered site user anymore, you need to ask for the 6 digit token that was provided during deletion. That will allow this tool to look for a log file with his information."
432
  msgstr ""
433
 
434
+ #: includes/class-gdpr-help.php:134, includes/class-gdpr-help.php:140
435
  msgid "General Settings"
436
  msgstr ""
437
 
438
+ #: includes/class-gdpr-help.php:135
439
  msgid "This plugin needs to know your privacy policy page to track updates to it and ask users to re-consent to your new terms."
440
  msgstr ""
441
 
442
+ #: includes/class-gdpr-help.php:136
443
  msgid "When sending a data breach notification to your users, we need to throttle the emails because of server limitations. This is an hourly limit. Check with your hosting provider before changing this value."
444
  msgstr ""
445
 
446
+ #: includes/class-gdpr-help.php:146, includes/class-gdpr-help.php:160
447
  msgid "Cookie Management"
448
  msgstr ""
449
 
450
+ #: includes/class-gdpr-help.php:147
451
  msgid "Fill out every information you can about the cookies your site uses. Set the cookies that you set under Cookies Used and cookies used and set by third parties under the Third party domains."
452
  msgstr ""
453
 
454
+ #: includes/class-gdpr-help.php:149
455
  msgid "You must ask your developer to wrap the code that sets the cookies with our helper function %s."
456
  msgstr ""
457
 
458
+ #: includes/class-gdpr-help.php:150
459
  msgid "Some services like Google Analytics provide a way to opt out from their code with an extra parameter to their snippet."
460
  msgstr ""
461
 
462
+ #: includes/class-gdpr-help.php:151, includes/class-gdpr-help.php:171
463
  msgid "External Links"
464
  msgstr ""
465
 
466
+ #: includes/class-gdpr-help.php:153, includes/class-gdpr-help.php:153
467
  msgid "WordPress cookies"
468
  msgstr ""
469
 
470
+ #: includes/class-gdpr-help.php:166
471
  msgid "Consent Management ( Coming Soon )"
472
  msgstr ""
473
 
474
+ #: includes/class-gdpr-help.php:167
475
  msgid "All consents are disabled by default. On first registration, your users will need to consent to your privacy policy. Depending on your privacy policy you should register multiple types of consent on this page and allow them to be toggled on/off."
476
  msgstr ""
477
 
478
+ #: includes/class-gdpr-help.php:169
479
  msgid "If you have an optional consent type, you must have a developer wrap the functionality in our helper function %s."
480
  msgstr ""
481
 
482
+ #: includes/class-gdpr-help.php:170
483
  msgid "i.e."
484
  msgstr ""
485
 
486
+ #: includes/class-gdpr-help.php:170
487
  msgid "You registered email marketing as an optional consent but the user did not actively opt into it on their profile page. You should have your email capture form wrapped in our helper function to block registration or better yet, not even display the email capture form. Same goes for blocking adding the user to your mailing system on registration if consent is not given."
488
  msgstr ""
489
 
490
+ #: includes/class-gdpr-help.php:173, includes/class-gdpr-help.php:173
491
  msgid "Article 7 - Conditions for consent"
492
  msgstr ""
493
 
494
+ #: includes/class-gdpr-help.php:174, includes/class-gdpr-help.php:174
495
  msgid "Article 8 - conditions applicable to child's consent in relation to information society services"
496
  msgstr ""
497
 
498
+ #: includes/class-gdpr-help.php:175, includes/class-gdpr-help.php:175
499
  msgid "Recital 42 - Burden of proof and requirements for consent"
500
  msgstr ""
501
 
502
+ #: includes/class-gdpr-help.php:176, includes/class-gdpr-help.php:176
503
  msgid "Recital 43 - Freely Given consent"
504
  msgstr ""
505
 
506
+ #: includes/class-gdpr-help.php:202
507
  msgid "This is all data that are being sent outside of your site. WordPress send some data to it's servers to be able to do automatic updates. You can reduce the amount of data being sent using filters."
508
  msgstr ""
509
 
510
+ #: includes/class-gdpr-help.php:203
511
  msgid "Some plugins also capture data and send it to their servers. Such practice is not allowed for plugins hosted on wordpress.org plugin repository. In case this is a Premium plugin, you should have been given the option to choose which type of data you want to send."
512
  msgstr ""
513
 
514
+ #: includes/class-gdpr-help.php:204
515
  msgid "Use this tool to identify plugins or themes sending potential personal data outside of your server and take action if necessary."
516
  msgstr ""
517
 
518
+ #: includes/class-gdpr-requests.php:227
519
  msgid "User request expired. Removing %s user_meta."
520
  msgstr ""
521
 
528
  msgid "User gave explicit consent to %s"
529
  msgstr ""
530
 
531
+ #: includes/helper-functions.php:27, public/partials/privacy-bar.php:38
532
  msgid "Privacy Preferences"
533
  msgstr ""
534
 
535
+ #: public/class-gdpr-public.php:126
536
  msgid "Aborting"
537
  msgstr ""
538
 
539
+ #: public/class-gdpr-public.php:127
540
  msgid "Continue"
541
  msgstr ""
542
 
543
+ #: public/class-gdpr-public.php:128
544
  msgid "Cancel"
545
  msgstr ""
546
 
547
+ #: public/class-gdpr-public.php:129, public/partials/confirmation-screens.php:58
548
  msgid "OK"
549
  msgstr ""
550
 
551
+ #: public/class-gdpr-public.php:147, public/partials/reconsent-bar.php:31
552
  msgid "I Agree"
553
  msgstr ""
554
 
555
+ #: public/class-gdpr-public.php:202, public/class-gdpr-public.php:367, public/class-gdpr-requests-public.php:81, public/class-gdpr-requests-public.php:90, public/class-gdpr-requests-public.php:105, public/class-gdpr-requests-public.php:125, public/class-gdpr-requests-public.php:145, public/class-gdpr-requests-public.php:175, public/class-gdpr-requests-public.php:188, public/class-gdpr-requests-public.php:243, public/partials/confirmation-screens.php:33, public/partials/confirmation-screens.php:37, public/partials/confirmation-screens.php:41
556
  msgid "Error!"
557
  msgstr ""
558
 
559
+ #: public/class-gdpr-public.php:241
560
  msgid "User updated their privacy preferences. These are the new approved cookies and consent preferences:"
561
  msgstr ""
562
 
563
+ #: public/class-gdpr-public.php:377
564
  msgid "User provided new consent for %1$s."
565
  msgstr ""
566
 
567
+ #: public/class-gdpr-requests-public.php:91
568
  msgid "Invalid type of request. Please try again."
569
  msgstr ""
570
 
571
+ #: public/class-gdpr-requests-public.php:106, public/class-gdpr-requests-public.php:126
572
  msgid "Please verify that you are not a robot."
573
  msgstr ""
574
 
575
+ #: public/class-gdpr-requests-public.php:176
576
  msgid "We can't delete this user."
577
  msgstr ""
578
 
579
+ #: public/class-gdpr-requests-public.php:189
580
  msgid "Required information is missing from the form."
581
  msgstr ""
582
 
583
+ #: public/class-gdpr-requests-public.php:236
584
  msgid "Email confirmation"
585
  msgstr ""
586
 
587
+ #: public/class-gdpr-requests-public.php:237
588
  msgid "We've sent you a confirmation email."
589
  msgstr ""
590
 
591
+ #: public/class-gdpr-requests-public.php:244
592
  msgid "There was a problem with your request. Please try again later."
593
  msgstr ""
594
 
595
+ #: public/class-gdpr-requests-public.php:323
596
  msgid "User confirmed a request to be deleted."
597
  msgstr ""
598
 
599
+ #: public/class-gdpr-requests-public.php:325
600
  msgid "Content was found for that user."
601
  msgstr ""
602
 
603
+ #: public/class-gdpr-requests-public.php:327
604
  msgid "User added to the erasure review table."
605
  msgstr ""
606
 
607
+ #: public/class-gdpr-requests-public.php:361
608
  msgid "User placed a request for rectification or a complaint."
609
  msgstr ""
610
 
611
  #. translators: File format. Can be XML or JSON
612
+ #: public/class-gdpr-requests-public.php:378
613
  msgid "User downloaded all their data in %s format."
614
  msgstr ""
615
 
616
+ #: admin/partials/requests.php:36, admin/partials/requests.php:88, admin/partials/requests.php:102, admin/partials/requests.php:145, admin/partials/requests.php:172, admin/partials/requests.php:323
617
  msgid "Email"
618
  msgstr ""
619
 
620
+ #: admin/partials/requests.php:37, admin/partials/requests.php:89, admin/partials/requests.php:173, admin/partials/requests.php:324
621
  msgid "Date of Request"
622
  msgstr ""
623
 
624
+ #: admin/partials/requests.php:38, admin/partials/requests.php:90, admin/partials/requests.php:104, admin/partials/requests.php:147
625
  msgid "Information"
626
  msgstr ""
627
 
628
+ #: admin/partials/requests.php:39, admin/partials/requests.php:91, admin/partials/requests.php:105, admin/partials/requests.php:148, admin/partials/requests.php:175, admin/partials/requests.php:326
629
  msgid "Actions"
630
  msgstr ""
631
 
632
+ #: admin/partials/requests.php:65, admin/partials/requests.php:122, admin/partials/requests.php:205
633
  msgid "Cancel Request"
634
  msgstr ""
635
 
636
+ #: admin/partials/requests.php:73, admin/partials/requests.php:130
637
  msgid "Mark as Resolved"
638
  msgstr ""
639
 
640
+ #: admin/partials/requests.php:81, admin/partials/requests.php:138, admin/partials/requests.php:316
641
  msgid "No pending requests"
642
  msgstr ""
643
 
644
+ #: admin/partials/requests.php:103, admin/partials/requests.php:146
645
  msgid "Date of Complaint"
646
  msgstr ""
647
 
648
+ #: admin/partials/requests.php:155
649
  msgid "Right to erasure"
650
  msgstr ""
651
 
652
+ #: admin/partials/requests.php:162
653
  msgid "Manually add a user"
654
  msgstr ""
655
 
656
+ #: admin/partials/requests.php:164, admin/partials/tools.php:61, admin/partials/tools.php:123, public/partials/complaint-form.php:6, public/partials/delete-form.php:19, public/partials/export-data-form.php:6, public/partials/rectify-form.php:6
657
  msgid "email@domain.com"
658
  msgstr ""
659
 
660
+ #: admin/partials/requests.php:165, public/partials/complaint-form.php:11, public/partials/rectify-form.php:10
661
  msgid "Submit"
662
  msgstr ""
663
 
664
+ #: admin/partials/requests.php:174, admin/partials/requests.php:189, admin/partials/requests.php:225, admin/partials/requests.php:325
665
  msgid "Review"
666
  msgstr ""
667
 
668
+ #: admin/partials/requests.php:191
669
  msgid "No content to review"
670
  msgstr ""
671
 
672
+ #: admin/partials/requests.php:212
673
  msgid "Delete User"
674
  msgstr ""
675
 
676
+ #: admin/partials/requests.php:223
677
  msgid "Content Type"
678
  msgstr ""
679
 
680
+ #: admin/partials/requests.php:224
681
  msgid "Count"
682
  msgstr ""
683
 
684
+ #: admin/partials/requests.php:226, admin/partials/requests.php:265
685
  msgid "Reassign"
686
  msgstr ""
687
 
688
+ #: admin/partials/requests.php:227
689
  msgid "Action"
690
  msgstr ""
691
 
692
+ #: admin/partials/requests.php:267, admin/partials/requests.php:296
693
  msgid "Resolved"
694
  msgstr ""
695
 
696
+ #: admin/partials/requests.php:287
697
  msgid "View Comments"
698
  msgstr ""
699
 
700
+ #: admin/partials/requests.php:294
701
  msgid "Anonymize"
702
  msgstr ""
703
 
813
  msgid "To prevent spam attacks, you have the option to enable reCAPTCHA. Configure below your keys to make it work with our request forms."
814
  msgstr ""
815
 
816
+ #: admin/partials/settings.php:134
817
  msgid "You can find the necessary information %s."
818
  msgstr ""
819
 
820
+ #: admin/partials/settings.php:135
821
  msgid "here"
822
  msgstr ""
823
 
824
+ #: admin/partials/settings.php:143
825
  msgid "Enable reCAPTCHA"
826
  msgstr ""
827
 
828
+ #: admin/partials/settings.php:152
829
  msgid "Site Key"
830
  msgstr ""
831
 
832
+ #: admin/partials/settings.php:161
833
  msgid "Secret Key"
834
  msgstr ""
835
 
836
+ #: admin/partials/settings.php:172
837
  msgid "WooCommerce"
838
  msgstr ""
839
 
840
+ #: admin/partials/settings.php:177
841
  msgid "Add consent checkboxes to the registration page"
842
  msgstr ""
843
 
844
+ #: admin/partials/settings.php:186
845
  msgid "Add consent checkboxes to the checkout registration form"
846
  msgstr ""
847
 
848
+ #: admin/partials/settings.php:198
849
  msgid "Cookies"
850
  msgstr ""
851
 
852
+ #: admin/partials/settings.php:199
853
  msgid "Category name"
854
  msgstr ""
855
 
856
+ #: admin/partials/settings.php:200
857
+ msgid "Add cookie category"
858
  msgstr ""
859
 
860
+ #: admin/partials/settings.php:204
861
  msgid "Remove this tab."
862
  msgstr ""
863
 
864
+ #: admin/partials/settings.php:210, admin/partials/templates/tmpl-cookies.php:9
865
  msgid "Category Name"
866
  msgstr ""
867
 
868
+ #: admin/partials/settings.php:211, admin/partials/settings.php:212
869
  msgid "Change this value if you want to name it something different."
870
  msgstr ""
871
 
872
+ #: admin/partials/settings.php:224, admin/partials/templates/tmpl-cookies.php:23
873
  msgid "Status"
874
  msgstr ""
875
 
876
+ #: admin/partials/settings.php:225, admin/partials/settings.php:226
877
  msgid "Required cookies are cookies that cannot be opted out of and need to be created for the site to function properly. The ON status means that the cookie preference for this category will be enabled by default. The OFF status means the user needs to manually turn these cookies on to opt into these cookies."
878
  msgstr ""
879
 
880
+ #: admin/partials/settings.php:234, public/partials/privacy-preferences-modal.php:75, public/partials/privacy-preferences-modal.php:122, admin/partials/templates/tmpl-cookies.php:33
881
  msgid "Required"
882
  msgstr ""
883
 
884
+ #: admin/partials/settings.php:235, admin/partials/templates/tmpl-cookies.php:34
885
  msgid "ON"
886
  msgstr ""
887
 
888
+ #: admin/partials/settings.php:236, admin/partials/templates/tmpl-cookies.php:35
889
  msgid "OFF"
890
  msgstr ""
891
 
892
+ #: admin/partials/settings.php:243, admin/partials/settings.php:296, admin/partials/templates/tmpl-cookies.php:42, admin/partials/templates/tmpl-cookies.php:99
893
  msgid "Cookies used"
894
  msgstr ""
895
 
896
+ #: admin/partials/settings.php:244, admin/partials/settings.php:245, admin/partials/templates/tmpl-cookies.php:43, admin/partials/templates/tmpl-cookies.php:44
897
  msgid "A comma-separated list of cookies that your site is using that fit this category."
898
  msgstr ""
899
 
900
+ #: admin/partials/settings.php:253, admin/partials/templates/tmpl-cookies.php:52, admin/partials/templates/tmpl-cookies.php:103
901
  msgid "Comma separated list."
902
  msgstr ""
903
 
904
+ #: admin/partials/settings.php:259, admin/partials/templates/tmpl-cookies.php:58
905
  msgid "How are these used"
906
  msgstr ""
907
 
908
+ #: admin/partials/settings.php:260, admin/partials/settings.php:261
909
  msgid "A brief explanation of why you are requesting to use these cookies, what they are for, and how you process them."
910
  msgstr ""
911
 
912
+ #: admin/partials/settings.php:271, admin/partials/templates/tmpl-cookies.php:70
913
  msgid "Third party domain"
914
  msgstr ""
915
 
916
+ #: admin/partials/settings.php:272, admin/partials/settings.php:273
917
  msgid "E.g. facebook.com"
918
  msgstr ""
919
 
920
+ #: admin/partials/settings.php:279, admin/partials/templates/tmpl-cookies.php:78
921
+ msgid "domain.com"
922
+ msgstr ""
923
+
924
+ #: admin/partials/settings.php:280, admin/partials/templates/tmpl-cookies.php:79
925
  msgid "Add"
926
  msgstr ""
927
 
928
+ #: admin/partials/settings.php:282, admin/partials/templates/tmpl-cookies.php:81
929
  msgid "Cookies that are set by a third party, like facebook.com."
930
  msgstr ""
931
 
932
+ #: admin/partials/settings.php:290, admin/partials/templates/tmpl-cookies.php:94
933
  msgid "Remove this domain."
934
  msgstr ""
935
 
936
+ #: admin/partials/settings.php:297, admin/partials/settings.php:298
937
  msgid "A comma separated list of cookies that your site is using from this third-party provider."
938
  msgstr ""
939
 
940
+ #: admin/partials/settings.php:310
941
  msgid "Opt Out Link"
942
  msgstr ""
943
 
944
+ #: admin/partials/settings.php:311, admin/partials/settings.php:312
945
  msgid "Add a link with the third-party instructions on how to opt out of their cookies."
946
  msgstr ""
947
 
948
+ #: admin/partials/settings.php:320, admin/partials/templates/tmpl-cookies.php:111
949
  msgid "Url with instructions on how to opt out."
950
  msgstr ""
951
 
952
+ #: admin/partials/settings.php:336
953
  msgid "E.g. Privacy Policy or Cookie Policy"
954
  msgstr ""
955
 
956
+ #: admin/partials/settings.php:337
957
  msgid "Add consent"
958
  msgstr ""
959
 
960
+ #: admin/partials/settings.php:342, admin/partials/templates/tmpl-consents.php:3
961
  msgid "Unregister this consent."
962
  msgstr ""
963
 
964
+ #: admin/partials/settings.php:349, admin/partials/templates/tmpl-consents.php:10
965
  msgid "Policy Page"
966
  msgstr ""
967
 
968
+ #: admin/partials/settings.php:350, admin/partials/settings.php:351, admin/partials/templates/tmpl-consents.php:11, admin/partials/templates/tmpl-consents.php:12
969
  msgid "This page will be tracked for changes and you will be prompted to ask users to re-consent to the new policy. Selecting a page will make this consent required."
970
  msgstr ""
971
 
972
+ #: admin/partials/settings.php:368, admin/partials/templates/tmpl-consents.php:29
973
  msgid "Long description"
974
  msgstr ""
975
 
976
+ #: admin/partials/settings.php:369, admin/partials/settings.php:370, admin/partials/templates/tmpl-consents.php:30, admin/partials/templates/tmpl-consents.php:31
977
  msgid "This will show up at the privacy preferences center, under the name of the consent."
978
  msgstr ""
979
 
980
+ #: admin/partials/settings.php:380, admin/partials/templates/tmpl-consents.php:41
981
  msgid "Short description"
982
  msgstr ""
983
 
984
+ #: admin/partials/settings.php:381, admin/partials/settings.php:382, admin/partials/templates/tmpl-consents.php:42, admin/partials/templates/tmpl-consents.php:43
985
  msgid "This will show up at registration forms next to checkboxes."
986
  msgstr ""
987
 
988
+ #: admin/partials/tools.php:33
989
  msgid "Data Breach confirmed. Preparing bulk emails."
990
  msgstr ""
991
 
992
+ #: admin/partials/tools.php:59, admin/partials/tools.php:121
993
  msgid "Search by email"
994
  msgstr ""
995
 
996
+ #: admin/partials/tools.php:62, admin/partials/tools.php:125
997
  msgid "Search"
998
  msgstr ""
999
 
1000
+ #: admin/partials/tools.php:76
1001
  msgid "Email content"
1002
  msgstr ""
1003
 
1004
+ #: admin/partials/tools.php:79
1005
  msgid "The content that the end user will see before the below information."
1006
  msgstr ""
1007
 
1008
+ #: admin/partials/tools.php:83
1009
  msgid "Nature of the personal data breach"
1010
  msgstr ""
1011
 
1012
+ #: admin/partials/tools.php:86
1013
  msgid "Describe the nature of the personal data breach including where possible, the categories and the approximate number of data subjects concerned and the categories and the approximate number of personal data records concerned."
1014
  msgstr ""
1015
 
1016
+ #: admin/partials/tools.php:90
1017
  msgid "Name and contact details of the data protection officer"
1018
  msgstr ""
1019
 
1020
+ #: admin/partials/tools.php:93
1021
  msgid "Communicate the name and contact details of the data protection officer or another point of contact where more information can be obtained."
1022
  msgstr ""
1023
 
1024
+ #: admin/partials/tools.php:97
1025
  msgid "Likely consequences of the personal data breach"
1026
  msgstr ""
1027
 
1028
+ #: admin/partials/tools.php:103
1029
  msgid "Measures taken or proposed to be taken"
1030
  msgstr ""
1031
 
1032
+ #: admin/partials/tools.php:106
1033
  msgid "Describe the measures taken or proposed to be taken by the controller to address the personal data breach, including, where appropriate, measures to mitigate its possible adverse effects."
1034
  msgstr ""
1035
 
1036
+ #: admin/partials/tools.php:110
1037
  msgid "Send confirmation email"
1038
  msgstr ""
1039
 
1040
+ #: admin/partials/tools.php:124
1041
  msgid "6 digit token (optional)"
1042
  msgstr ""
1043
 
1045
  msgid "Type your complaint here"
1046
  msgstr ""
1047
 
1048
+ #: public/partials/confirmation-screens.php:21
1049
  msgid "Your account"
1050
  msgstr ""
1051
 
1052
+ #: public/partials/confirmation-screens.php:23
1053
  msgid "Your account has been closed. We are sorry to see you go."
1054
  msgstr ""
1055
 
1056
+ #: public/partials/confirmation-screens.php:25
1057
  msgid "Your request has been received and is being reviewed. You will receive an email when we are done."
1058
  msgstr ""
1059
 
1060
+ #: public/partials/confirmation-screens.php:29
1061
  msgid "Request Received"
1062
  msgstr ""
1063
 
1064
+ #: public/partials/confirmation-screens.php:30
1065
  msgid "Your request has been received. We will be in touch soon."
1066
  msgstr ""
1067
 
1068
+ #: public/partials/confirmation-screens.php:38
 
 
 
 
1069
  msgid "We could not confirm the request key. It may be expired."
1070
  msgstr ""
1071
 
1072
+ #: public/partials/confirmation-screens.php:42
1073
  msgid "The key used does not match the request key we have stored."
1074
  msgstr ""
1075
 
1093
  msgid "Cookie Settings"
1094
  msgstr ""
1095
 
1096
+ #: public/partials/privacy-preferences-modal.php:103
1097
  msgid "Cookies Used"
1098
  msgstr ""
1099
 
1100
+ #: public/partials/privacy-preferences-modal.php:141
1101
  msgid "Opt Out"
1102
  msgstr ""
1103
 
1104
+ #: public/partials/privacy-preferences-modal.php:156
1105
  msgid "Save Preferences"
1106
  msgstr ""
1107
 
1108
  #: public/partials/reconsent-bar.php:18
1109
+ msgid "Some of our policies have been updated. Please make sure to select the \"View\" link next to each item in order to view changes before agreeing."
1110
  msgstr ""
1111
 
1112
  #: public/partials/reconsent-bar.php:26
1125
  "--------------------------------------------------------\n"
1126
  "Request\n"
1127
  "--------------------------------------------------------\n"
1128
+ "%1$s\n"
1129
  "\n"
1130
  "\n"
1131
  "\n"
1132
  "\n"
1133
+ "To confirm this request, click here: %2$s\n"
1134
  "\n"
1135
  "\n"
1136
  "\n"
1137
  "---------------------------------------------------------------------------------\n"
1138
+ "If that wasn't you, reset your password: %3$s\n"
1139
  ""
1140
  msgstr ""
1141
 
1147
 
1148
  #: templates/email/data-breach-notification.php:4
1149
  msgid ""
1150
+ "%1$s\n"
1151
  "\n"
1152
  "--------------------------------------------------------\n"
1153
  "Nature of the personal data breach:\n"
1154
  "--------------------------------------------------------\n"
1155
+ "%2$s\n"
1156
  "\n"
1157
  "--------------------------------------------------------\n"
1158
  "Name and contact details of the data protection officer:\n"
1159
  "--------------------------------------------------------\n"
1160
+ "%3$s\n"
1161
  "\n"
1162
  "--------------------------------------------------------\n"
1163
  "Likely consequences of the personal data breach:\n"
1164
  "--------------------------------------------------------\n"
1165
+ "%4$s\n"
1166
  "\n"
1167
  "--------------------------------------------------------\n"
1168
  "Measures taken or proposed to be taken:\n"
1169
  "--------------------------------------------------------\n"
1170
+ "%5$s\n"
1171
  ""
1172
  msgstr ""
1173
 
1174
  #: templates/email/data-breach-request.php:4
1175
  msgid ""
1176
+ "A request to send a mass email notification to all users regarding a data breach has been made by %1$s.\n"
1177
  "\n"
1178
  "--------------------------------------------------------\n"
1179
  "Nature of the personal data breach:\n"
1180
  "--------------------------------------------------------\n"
1181
+ "%2$s\n"
1182
  "\n"
1183
  "--------------------------------------------------------\n"
1184
  "Name and contact details of the data protection officer:\n"
1185
  "--------------------------------------------------------\n"
1186
+ "%3$s\n"
1187
  "\n"
1188
  "--------------------------------------------------------\n"
1189
  "Likely consequences of the personal data breach:\n"
1190
  "--------------------------------------------------------\n"
1191
+ "%4$s\n"
1192
  "\n"
1193
  "--------------------------------------------------------\n"
1194
  "Measures taken or proposed to be taken:\n"
1195
  "--------------------------------------------------------\n"
1196
+ "%5$s\n"
1197
  "\n"
1198
  "\n"
1199
+ "To confirm this request, click here: %6$s\n"
1200
  "\n"
1201
  "---------------------------------------------------------------------------------\n"
1202
  "If that is not intended, have the person who requested it change their password.\n"
1213
  "\n"
1214
  "\n"
1215
  "\n"
1216
+ "To confirm this request, click here: %1$s\n"
1217
  "\n"
1218
  "\n"
1219
  "\n"
1220
  "---------------------------------------------------------------------------------\n"
1221
+ "If that wasn't you, reset your password: %2$s\n"
1222
  ""
1223
  msgstr ""
1224
 
1238
  "Someone requested to download your data from our site.\n"
1239
  "By clicking confirm we will redirect you back to our site where a download will begin.\n"
1240
  "\n"
1241
+ "To download it in a XML format, click here: %1$s\n"
1242
+ "To download it in a JSON format, click here: %2$s\n"
1243
  "\n"
1244
  "\n"
1245
  "\n"
1246
  "---------------------------------------------------------------------------------\n"
1247
+ "If that wasn't you, reset your password: %3$s\n"
1248
  ""
1249
  msgstr ""
1250
 
1263
  "--------------------------------------------------------\n"
1264
  "Request\n"
1265
  "--------------------------------------------------------\n"
1266
+ "%1$s\n"
1267
  "\n"
1268
  "\n"
1269
  "\n"
1270
  "\n"
1271
+ "To confirm this request, click here: %2$s\n"
1272
  "\n"
1273
  "\n"
1274
  "\n"
1275
  "---------------------------------------------------------------------------------\n"
1276
+ "If that wasn't you, reset your password: %3$s\n"
1277
  ""
1278
  msgstr ""
1279
 
1291
  msgid "Required cookies are cookies that cannot be opt out. They need to be created for the site to function properly. Status ON means that the cookie will be set after agreement. Status OFF means the user needs to check the checkbox to activate this category."
1292
  msgstr ""
1293
 
 
 
 
 
1294
  #: admin/partials/templates/tmpl-cookies.php:59, admin/partials/templates/tmpl-cookies.php:60
1295
  msgid "A brief explanation on why you are requesting to use these cookies, what they are for and how you process them."
1296
  msgstr ""
1299
  msgid "E.g. youtube.com"
1300
  msgstr ""
1301
 
 
 
 
 
1302
  #: admin/partials/templates/tmpl-cookies.php:107
1303
  msgid "How to Opt Out"
1304
  msgstr ""
public/class-gdpr-public.php CHANGED
@@ -60,12 +60,12 @@ class GDPR_Public {
60
  * @param string $version The version of this plugin.
61
  */
62
  public function __construct( $plugin_name, $version ) {
63
- $this->plugin_name = $plugin_name;
64
- $this->version = $version;
65
  $this->allowed_html = array(
66
  'a' => array(
67
- 'href' => true,
68
- 'title' => true,
69
  'target' => true,
70
  ),
71
  );
@@ -80,11 +80,11 @@ class GDPR_Public {
80
  public static function add_recaptcha() {
81
  $use_recaptcha = get_option( 'gdpr_use_recaptcha', false );
82
  if ( $use_recaptcha ) {
83
- $site_key = get_option( 'gdpr_recaptcha_site_key', '' );
84
  $secret_key = get_option( 'gdpr_recaptcha_secret_key', '' );
85
 
86
  if ( $site_key && $secret_key ) {
87
- echo '<div class="g-recaptcha" data-sitekey="' . $site_key . '"></div>';
88
  }
89
  }
90
  }
@@ -111,7 +111,7 @@ class GDPR_Public {
111
  public function enqueue_scripts() {
112
  $use_recaptcha = get_option( 'gdpr_use_recaptcha', false );
113
  if ( $use_recaptcha ) {
114
- $site_key = get_option( 'gdpr_recaptcha_site_key', '' );
115
  $secret_key = get_option( 'gdpr_recaptcha_secret_key', '' );
116
 
117
  if ( $site_key && $secret_key ) {
@@ -119,17 +119,19 @@ class GDPR_Public {
119
  }
120
  }
121
  wp_enqueue_script( $this->plugin_name, plugin_dir_url( dirname( __FILE__ ) ) . 'assets/js/gdpr-public.js', array( 'jquery' ), $this->version, false );
122
- wp_localize_script( $this->plugin_name, 'GDPR', array(
123
- 'ajaxurl' => admin_url( 'admin-ajax.php' ),
124
- 'i18n' => array(
125
- 'aborting' => esc_html__( 'Aborting', 'gdpr' ),
126
- 'continue' => esc_html__( 'Continue', 'gdpr' ),
127
- 'cancel' => esc_html__( 'Cancel', 'gdpr' ),
128
- 'ok' => esc_html__( 'OK', 'gdpr' ),
129
- ),
130
- 'is_user_logged_in' => is_user_logged_in(),
131
- 'refresh' => get_option( 'gdpr_refresh_after_preferences_update', true ),
132
- ) );
 
 
133
  }
134
 
135
  /**
@@ -160,10 +162,10 @@ class GDPR_Public {
160
  */
161
  public function privacy_preferences_modal() {
162
  $cookie_privacy_excerpt = get_option( 'gdpr_cookie_privacy_excerpt', '' );
163
- $consent_types = get_option( 'gdpr_consent_types', array() );
164
- $approved_cookies = isset( $_COOKIE['gdpr']['allowed_cookies'] ) ? json_decode( wp_unslash( $_COOKIE['gdpr']['allowed_cookies'] ) ) : array();
165
- $user_consents = isset( $_COOKIE['gdpr']['consent_types'] ) ? json_decode( wp_unslash( $_COOKIE['gdpr']['consent_types'] ) ) : array();
166
- $tabs = get_option( 'gdpr_cookie_popup_content', array() );
167
 
168
  include plugin_dir_path( __FILE__ ) . 'partials/privacy-preferences-modal.php';
169
  }
@@ -194,18 +196,23 @@ class GDPR_Public {
194
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
195
  */
196
  public function update_privacy_preferences() {
197
- if ( ! isset( $_POST['update-privacy-preferences-nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['update-privacy-preferences-nonce'] ), 'gdpr-update-privacy-preferences' ) ) {
198
- wp_send_json_error( array( 'title' => esc_html__( 'Error!', 'gdpr' ), 'content' => esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ) ) );
 
 
 
 
 
199
  }
200
- $consents = isset( $_POST['user_consents'] ) ? array_map( 'sanitize_text_field', (array) $_POST['user_consents'] ) : array();
201
- $cookies = isset( $_POST['approved_cookies'] ) ? array_map( 'sanitize_text_field', (array) $_POST['approved_cookies'] ) : array();
202
- $all_cookies = isset( $_POST['all_cookies'] ) ? array_map( 'sanitize_text_field', (array) json_decode( wp_unslash( $_POST['all_cookies'] ) ) ) : array();
203
 
204
  $approved_cookies = array();
205
  if ( ! empty( $cookies ) ) {
206
- foreach ( $cookies as $cookieArr ) {
207
- $cookieArr = json_decode( wp_unslash( $cookieArr ) );
208
- foreach ( $cookieArr as $cookie ) {
209
  $approved_cookies[] = $cookie;
210
  }
211
  }
@@ -213,19 +220,19 @@ class GDPR_Public {
213
 
214
  $cookies_to_remove = array_diff( $all_cookies, $approved_cookies );
215
 
216
- $cookies_as_json = json_encode( $approved_cookies );
217
  $consents_as_json = json_encode( $consents );
218
 
219
- setcookie( "gdpr[allowed_cookies]", $cookies_as_json, time() + YEAR_IN_SECONDS, "/" );
220
- setcookie( "gdpr[consent_types]", $consents_as_json, time() + YEAR_IN_SECONDS, "/" );
221
 
222
  foreach ( $cookies_to_remove as $cookie ) {
223
- if ( GDPR::similar_in_array( $cookie, array_keys( $_COOKIE ) ) ) {
224
  $domain = get_site_url();
225
  $domain = wp_parse_url( $domain, PHP_URL_HOST );
226
- unset( $_COOKIE[ $cookie ] );
227
- setcookie( $cookie, NULL, -1, "/", $domain );
228
- setcookie( $cookie, NULL, -1, "/", '.' . $domain );
229
  }
230
  }
231
 
@@ -246,7 +253,6 @@ class GDPR_Public {
246
  GDPR_Audit_Log::log( $user->ID, 'Cookie: ' . $cookie );
247
  }
248
  }
249
-
250
  }
251
 
252
  wp_send_json_success();
@@ -263,20 +269,24 @@ class GDPR_Public {
263
  if ( empty( $consents ) || ! is_array( $consents ) ) {
264
  return;
265
  }
266
- $required_consents = array_filter( $consents, function( $consent ) {
267
- return ! empty( $consent['policy-page'] );
268
- } );
 
 
269
 
270
  if ( ! $required_consents || ! is_user_logged_in() ) {
271
  return;
272
  }
273
 
274
- $user = wp_get_current_user();
275
  $user_consents = get_user_meta( $user->ID, 'gdpr_consents' );
276
 
277
- $updated_consents = array_filter( $required_consents, function( $consent, $consent_id ) use ( $user_consents ) {
278
- return ! in_array( $consent_id, $user_consents );
279
- }, ARRAY_FILTER_USE_BOTH );
 
 
280
 
281
  if ( empty( $updated_consents ) ) {
282
  return;
@@ -291,7 +301,7 @@ class GDPR_Public {
291
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
292
  */
293
  public function logout() {
294
- if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'gdpr-user_disagree_with_terms' ) ) {
295
  wp_send_json_error( esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ) );
296
  }
297
 
@@ -302,35 +312,36 @@ class GDPR_Public {
302
  public function set_plugin_cookies() {
303
  $user_id = get_current_user_id();
304
 
305
- if ( ! isset( $_COOKIE['gdpr']['consent_types'] ) ) {
306
  if ( ! $user_id ) {
307
- setcookie( 'gdpr[consent_types]', '[]', time() + YEAR_IN_SECONDS, "/" );
308
  } else {
309
  $user_consents = get_user_meta( $user_id, 'gdpr_consents' );
310
- setcookie( "gdpr[consent_types]", json_encode( $user_consents ), time() + YEAR_IN_SECONDS, "/" );
311
  }
312
  } else {
313
  if ( $user_id ) {
314
- $user_consents = (array) get_user_meta( $user_id, 'gdpr_consents' );
315
- $cookie_consents = (array) json_decode( wp_unslash( $_COOKIE['gdpr']['consent_types'] ) );
316
 
317
  $intersect = array_intersect( $user_consents, $cookie_consents );
318
- $diff = array_merge( array_diff( $user_consents, $intersect ), array_diff( $cookie_consents, $intersect ) );
319
 
320
  if ( ! empty( $diff ) ) {
321
- setcookie( "gdpr[consent_types]", json_encode( $user_consents ), time() + YEAR_IN_SECONDS, "/" );
322
  }
323
  }
324
  }
325
 
326
-
327
- if ( ! isset( $_COOKIE['gdpr']['allowed_cookies'] ) ) {
328
  $registered_cookies = get_option( 'gdpr_cookie_popup_content', array() );
329
- $cookies = array();
330
  if ( ! empty( $registered_cookies ) ) {
331
- $required_cookies = array_filter( $registered_cookies, function( $item ) {
332
- return 'required' === $item['status'];
333
- });
 
 
334
  if ( ! empty( $required_cookies ) ) {
335
  foreach ( $required_cookies as $category ) {
336
  $cookies_used = explode( ',', $category['cookies_used'] );
@@ -342,19 +353,24 @@ class GDPR_Public {
342
  }
343
 
344
  if ( ! empty( $cookies ) ) {
345
- setcookie( "gdpr[allowed_cookies]", json_encode( $cookies ), time() + YEAR_IN_SECONDS, "/" );
346
  } else {
347
- setcookie( "gdpr[allowed_cookies]", '[]', time() + YEAR_IN_SECONDS, "/" );
348
  }
349
  }
350
  }
351
 
352
  public function agree_with_new_policies() {
353
- if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['nonce'] ), 'gdpr-agree-with-new-policies' ) ) {
354
- wp_send_json_error( array( 'title' => esc_html__( 'Error!', 'gdpr' ), 'content' => esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ) ) );
 
 
 
 
 
355
  }
356
- $consents = isset( $_POST['consents'] ) ? array_map( 'sanitize_text_field', (array) $_POST['consents'] ) : array();
357
- $user_id = get_current_user_id();
358
 
359
  foreach ( $consents as $consent ) {
360
  add_user_meta( $user_id, 'gdpr_consents', $consent );
60
  * @param string $version The version of this plugin.
61
  */
62
  public function __construct( $plugin_name, $version ) {
63
+ $this->plugin_name = $plugin_name;
64
+ $this->version = $version;
65
  $this->allowed_html = array(
66
  'a' => array(
67
+ 'href' => true,
68
+ 'title' => true,
69
  'target' => true,
70
  ),
71
  );
80
  public static function add_recaptcha() {
81
  $use_recaptcha = get_option( 'gdpr_use_recaptcha', false );
82
  if ( $use_recaptcha ) {
83
+ $site_key = get_option( 'gdpr_recaptcha_site_key', '' );
84
  $secret_key = get_option( 'gdpr_recaptcha_secret_key', '' );
85
 
86
  if ( $site_key && $secret_key ) {
87
+ echo '<div class="g-recaptcha" data-sitekey="' . esc_attr( $site_key ) . '"></div>';
88
  }
89
  }
90
  }
111
  public function enqueue_scripts() {
112
  $use_recaptcha = get_option( 'gdpr_use_recaptcha', false );
113
  if ( $use_recaptcha ) {
114
+ $site_key = get_option( 'gdpr_recaptcha_site_key', '' );
115
  $secret_key = get_option( 'gdpr_recaptcha_secret_key', '' );
116
 
117
  if ( $site_key && $secret_key ) {
119
  }
120
  }
121
  wp_enqueue_script( $this->plugin_name, plugin_dir_url( dirname( __FILE__ ) ) . 'assets/js/gdpr-public.js', array( 'jquery' ), $this->version, false );
122
+ wp_localize_script(
123
+ $this->plugin_name, 'GDPR', array(
124
+ 'ajaxurl' => admin_url( 'admin-ajax.php' ),
125
+ 'i18n' => array(
126
+ 'aborting' => esc_html__( 'Aborting', 'gdpr' ),
127
+ 'continue' => esc_html__( 'Continue', 'gdpr' ),
128
+ 'cancel' => esc_html__( 'Cancel', 'gdpr' ),
129
+ 'ok' => esc_html__( 'OK', 'gdpr' ),
130
+ ),
131
+ 'is_user_logged_in' => is_user_logged_in(),
132
+ 'refresh' => get_option( 'gdpr_refresh_after_preferences_update', true ),
133
+ )
134
+ );
135
  }
136
 
137
  /**
162
  */
163
  public function privacy_preferences_modal() {
164
  $cookie_privacy_excerpt = get_option( 'gdpr_cookie_privacy_excerpt', '' );
165
+ $consent_types = get_option( 'gdpr_consent_types', array() );
166
+ $approved_cookies = isset( $_COOKIE['gdpr']['allowed_cookies'] ) ? json_decode( wp_unslash( $_COOKIE['gdpr']['allowed_cookies'] ) ) : array(); // WPCS: Input var ok, sanitization ok..
167
+ $user_consents = isset( $_COOKIE['gdpr']['consent_types'] ) ? json_decode( wp_unslash( $_COOKIE['gdpr']['consent_types'] ) ) : array(); // WPCS: Input var ok, sanitization ok.
168
+ $tabs = get_option( 'gdpr_cookie_popup_content', array() );
169
 
170
  include plugin_dir_path( __FILE__ ) . 'partials/privacy-preferences-modal.php';
171
  }
196
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
197
  */
198
  public function update_privacy_preferences() {
199
+ if ( ! isset( $_POST['update-privacy-preferences-nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['update-privacy-preferences-nonce'] ), 'gdpr-update-privacy-preferences' ) ) { // WPCS: Input var ok.
200
+ wp_send_json_error(
201
+ array(
202
+ 'title' => esc_html__( 'Error!', 'gdpr' ),
203
+ 'content' => esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ),
204
+ )
205
+ );
206
  }
207
+ $consents = isset( $_POST['user_consents'] ) ? array_map( 'sanitize_text_field', (array) wp_unslash( $_POST['user_consents'] ) ) : array(); // WPCS: Input var ok.
208
+ $cookies = isset( $_POST['approved_cookies'] ) ? array_map( 'sanitize_text_field', (array) wp_unslash( $_POST['approved_cookies'] ) ) : array(); // WPCS: Input var ok.
209
+ $all_cookies = isset( $_POST['all_cookies'] ) ? array_map( 'sanitize_text_field', (array) json_decode( wp_unslash( $_POST['all_cookies'] ) ) ) : array(); // WPCS: Input var ok, sanitization ok.
210
 
211
  $approved_cookies = array();
212
  if ( ! empty( $cookies ) ) {
213
+ foreach ( $cookies as $cookie_array ) {
214
+ $cookie_array = json_decode( wp_unslash( $cookie_array ) );
215
+ foreach ( $cookie_array as $cookie ) {
216
  $approved_cookies[] = $cookie;
217
  }
218
  }
220
 
221
  $cookies_to_remove = array_diff( $all_cookies, $approved_cookies );
222
 
223
+ $cookies_as_json = json_encode( $approved_cookies );
224
  $consents_as_json = json_encode( $consents );
225
 
226
+ setcookie( 'gdpr[allowed_cookies]', $cookies_as_json, time() + YEAR_IN_SECONDS, '/' );
227
+ setcookie( 'gdpr[consent_types]', $consents_as_json, time() + YEAR_IN_SECONDS, '/' );
228
 
229
  foreach ( $cookies_to_remove as $cookie ) {
230
+ if ( GDPR::similar_in_array( $cookie, array_keys( $_COOKIE ) ) ) { // WPCS: Input var ok.
231
  $domain = get_site_url();
232
  $domain = wp_parse_url( $domain, PHP_URL_HOST );
233
+ unset( $_COOKIE[ $cookie ] ); // WPCS: Input var ok.
234
+ setcookie( $cookie, null, -1, '/', $domain );
235
+ setcookie( $cookie, null, -1, '/', '.' . $domain );
236
  }
237
  }
238
 
253
  GDPR_Audit_Log::log( $user->ID, 'Cookie: ' . $cookie );
254
  }
255
  }
 
256
  }
257
 
258
  wp_send_json_success();
269
  if ( empty( $consents ) || ! is_array( $consents ) ) {
270
  return;
271
  }
272
+ $required_consents = array_filter(
273
+ $consents, function( $consent ) {
274
+ return ! empty( $consent['policy-page'] );
275
+ }
276
+ );
277
 
278
  if ( ! $required_consents || ! is_user_logged_in() ) {
279
  return;
280
  }
281
 
282
+ $user = wp_get_current_user();
283
  $user_consents = get_user_meta( $user->ID, 'gdpr_consents' );
284
 
285
+ $updated_consents = array_filter(
286
+ $required_consents, function( $consent, $consent_id ) use ( $user_consents ) {
287
+ return ! in_array( $consent_id, $user_consents, true );
288
+ }, ARRAY_FILTER_USE_BOTH
289
+ );
290
 
291
  if ( empty( $updated_consents ) ) {
292
  return;
301
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
302
  */
303
  public function logout() {
304
+ if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_POST['nonce'] ) ), 'gdpr-user_disagree_with_terms' ) ) { // WPCS: Input var ok.
305
  wp_send_json_error( esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ) );
306
  }
307
 
312
  public function set_plugin_cookies() {
313
  $user_id = get_current_user_id();
314
 
315
+ if ( ! isset( $_COOKIE['gdpr']['consent_types'] ) ) { // WPCS: Input var ok.
316
  if ( ! $user_id ) {
317
+ setcookie( 'gdpr[consent_types]', '[]', time() + YEAR_IN_SECONDS, '/' );
318
  } else {
319
  $user_consents = get_user_meta( $user_id, 'gdpr_consents' );
320
+ setcookie( 'gdpr[consent_types]', json_encode( $user_consents ), time() + YEAR_IN_SECONDS, '/' );
321
  }
322
  } else {
323
  if ( $user_id ) {
324
+ $user_consents = (array) get_user_meta( $user_id, 'gdpr_consents' );
325
+ $cookie_consents = (array) json_decode( wp_unslash( $_COOKIE['gdpr']['consent_types'] ) ); // WPCS: Input var ok, sanitization ok.
326
 
327
  $intersect = array_intersect( $user_consents, $cookie_consents );
328
+ $diff = array_merge( array_diff( $user_consents, $intersect ), array_diff( $cookie_consents, $intersect ) );
329
 
330
  if ( ! empty( $diff ) ) {
331
+ setcookie( 'gdpr[consent_types]', json_encode( $user_consents ), time() + YEAR_IN_SECONDS, '/' );
332
  }
333
  }
334
  }
335
 
336
+ if ( ! isset( $_COOKIE['gdpr']['allowed_cookies'] ) ) { // WPCS: Input var ok.
 
337
  $registered_cookies = get_option( 'gdpr_cookie_popup_content', array() );
338
+ $cookies = array();
339
  if ( ! empty( $registered_cookies ) ) {
340
+ $required_cookies = array_filter(
341
+ $registered_cookies, function( $item ) {
342
+ return 'required' === $item['status'];
343
+ }
344
+ );
345
  if ( ! empty( $required_cookies ) ) {
346
  foreach ( $required_cookies as $category ) {
347
  $cookies_used = explode( ',', $category['cookies_used'] );
353
  }
354
 
355
  if ( ! empty( $cookies ) ) {
356
+ setcookie( 'gdpr[allowed_cookies]', json_encode( $cookies ), time() + YEAR_IN_SECONDS, '/' );
357
  } else {
358
+ setcookie( 'gdpr[allowed_cookies]', '[]', time() + YEAR_IN_SECONDS, '/' );
359
  }
360
  }
361
  }
362
 
363
  public function agree_with_new_policies() {
364
+ if ( ! isset( $_POST['nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['nonce'] ), 'gdpr-agree-with-new-policies' ) ) { // WPCS: Input var ok.
365
+ wp_send_json_error(
366
+ array(
367
+ 'title' => esc_html__( 'Error!', 'gdpr' ),
368
+ 'content' => esc_html__( 'We could not verify the the security token. Please try again.', 'gdpr' ),
369
+ )
370
+ );
371
  }
372
+ $consents = isset( $_POST['consents'] ) ? array_map( 'sanitize_text_field', (array) wp_unslash( $_POST['consents'] ) ) : array(); // WPCS: Input var ok.
373
+ $user_id = get_current_user_id();
374
 
375
  foreach ( $consents as $consent ) {
376
  add_user_meta( $user_id, 'gdpr_consents', $consent );
public/class-gdpr-requests-public.php CHANGED
@@ -54,11 +54,12 @@ class GDPR_Requests_Public extends GDPR_Requests {
54
  * @since 1.0.0
55
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
56
  * @static
57
- * @param string $type The type of request to display the correct form.
 
58
  * @return mixed Print the form html.
59
  */
60
- public static function request_form( $type ) {
61
- if ( ! in_array( $type, parent::$allowed_types ) ) {
62
  return;
63
  }
64
 
@@ -74,61 +75,87 @@ class GDPR_Requests_Public extends GDPR_Requests {
74
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
75
  */
76
  public function send_request_email() {
77
- if ( ! isset( $_POST['type'] ) || ! in_array( $_POST['type'], parent::$allowed_types ) ) {
78
- wp_send_json_error( array( 'title' => esc_html__( 'Error!', 'gdpr' ), 'content' => esc_html__( 'Invalid type of request. Please try again.', 'gdpr' ) ) );
 
 
 
 
 
79
  }
80
 
81
- if ( ! isset( $_POST['gdpr_request_nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['gdpr_request_nonce'] ), 'gdpr-add-to-requests' ) ) {
82
- wp_send_json_error( array( 'title' => esc_html__( 'Error!', 'gdpr' ), 'content' => esc_html__( 'We could not verify the security token. Please try again.', 'gdpr' ) ) );
 
 
 
 
 
83
  }
84
 
85
  $use_recaptcha = get_option( 'gdpr_use_recaptcha', false );
86
  if ( $use_recaptcha ) {
87
- $site_key = get_option( 'gdpr_recaptcha_site_key', '' );
88
  $secret_key = get_option( 'gdpr_recaptcha_secret_key', '' );
89
 
90
  if ( $site_key && $secret_key ) {
91
- if ( ! isset( $_POST['g-recaptcha-response'] ) || ! $_POST['g-recaptcha-response'] ) {
92
- wp_send_json_error( array( 'title' => esc_html__( 'Error!', 'gdpr' ), 'content' => esc_html__( 'Please verify that you are not a robot.', 'gdpr' ) ) );
 
 
 
 
 
93
  }
94
 
95
- $response = wp_remote_post( 'https://www.google.com/recaptcha/api/siteverify', array(
96
- 'body' => array(
97
- 'secret' => $secret_key,
98
- 'response' => $_POST['g-recaptcha-response'],
99
- ),
100
- ) );
 
 
101
 
102
  $recaptcha_result = wp_remote_retrieve_body( $response );
103
  $recaptcha_result = json_decode( $recaptcha_result );
104
  if ( ! $recaptcha_result || ! $recaptcha_result->success ) {
105
- wp_send_json_error( array( 'title' => esc_html__( 'Error!', 'gdpr' ), 'content' => esc_html__( 'Please verify that you are not a robot.', 'gdpr' ) ) );
 
 
 
 
 
106
  }
107
-
108
  }
109
  }
110
 
111
- $type = sanitize_text_field( wp_unslash( $_POST['type'] ) );
112
- $data = isset( $_POST['data'] ) ? sanitize_textarea_field( $_POST['data'] ) : '';
113
 
114
  if ( is_user_logged_in() ) {
115
  $user = wp_get_current_user();
116
  } else {
117
- $user = isset( $_POST['user_email'] ) ? get_user_by( 'email', sanitize_email( $_POST['user_email'] ) ) : null;
118
  }
119
 
120
  if ( ! $user instanceof WP_User ) {
121
- wp_send_json_error( array( 'title' => esc_html__( 'Error!', 'gdpr' ), 'content' => esc_html__( 'User not found.', 'gdpr' ) ) );
 
 
 
 
 
122
  }
123
 
124
  $email_args = array(
125
  'forgot_password_url' => add_query_arg(
126
- array(
127
- 'action' => 'rp',
128
- 'key' => get_password_reset_key( $user ),
129
- 'login' => $user->user_login,
130
- ),
131
- wp_login_url()
132
  ),
133
  );
134
 
@@ -136,12 +163,19 @@ class GDPR_Requests_Public extends GDPR_Requests {
136
 
137
  switch ( $type ) {
138
  case 'delete':
139
- if ( in_array( 'administrator', $user->roles ) ) {
140
- $admins_query = new WP_User_Query( array(
141
- 'role' => 'Administrator',
142
- ) );
 
 
143
  if ( 1 === $admins_query->get_total() ) {
144
- wp_send_json_error( array( 'title' => esc_html__( 'Error!', 'gdpr' ), 'content' => esc_html__( 'We can\'t delete this user.', 'gdpr' ) ) );
 
 
 
 
 
145
  }
146
  }
147
  break;
@@ -149,7 +183,12 @@ class GDPR_Requests_Public extends GDPR_Requests {
149
  case 'rectify':
150
  case 'complaint':
151
  if ( ! $data ) {
152
- wp_send_json_error( array( 'title' => esc_html__( 'Error!', 'gdpr' ), 'content' => esc_html__( 'Required information is missing from the form.', 'gdpr' ) ) );
 
 
 
 
 
153
  }
154
  $email_args['data'] = $data;
155
  break;
@@ -158,44 +197,53 @@ class GDPR_Requests_Public extends GDPR_Requests {
158
  $key = parent::add_to_requests( $user->user_email, $type, $data );
159
 
160
  if ( 'export-data' !== $type ) {
161
- $email_args['confirm_url'] = add_query_arg(
162
- array(
163
- 'type' => $type,
164
- 'key' => $key,
165
- 'email' => $user->user_email,
166
- ),
167
- home_url()
168
- );
169
  } else {
170
- $email_args['confirm_url_xml'] = add_query_arg(
171
- array(
172
- 'type' => $type,
173
- 'key' => $key,
174
- 'email' => $user->user_email,
175
- 'format' => 'xml',
176
- ),
177
- home_url()
178
- );
179
  $email_args['confirm_url_json'] = add_query_arg(
180
- array(
181
- 'type' => $type,
182
- 'key' => $key,
183
- 'email' => $user->user_email,
184
- 'format' => 'json',
185
- ),
186
- home_url()
187
- );
188
  }
189
 
190
-
191
  if ( GDPR_Email::send(
192
  $user->user_email,
193
  "{$type}-request",
194
  $email_args
195
  ) ) {
196
- wp_send_json_success( array( 'title' => esc_html__( 'Email confirmation', 'gdpr' ), 'content' => esc_html__( 'We\'ve sent you a confirmation email.', 'gdpr' ) ) );
 
 
 
 
 
197
  } else {
198
- wp_send_json_error( array( 'title' => esc_html__( 'Error!', 'gdpr' ), 'content' => esc_html__( 'There was a problem with your request. Please try again later.', 'gdpr' ) ) );
 
 
 
 
 
199
  }
200
  }
201
 
@@ -206,13 +254,13 @@ class GDPR_Requests_Public extends GDPR_Requests {
206
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
207
  */
208
  public function request_confirmed() {
209
- if ( is_admin() || ! isset( $_GET['type'], $_GET['key'], $_GET['email'] ) ) {
210
  return;
211
  }
212
 
213
- $type = sanitize_text_field( wp_unslash( $_GET['type'] ) );
214
- $key = sanitize_text_field( wp_unslash( $_GET['key'] ) );
215
- $email = sanitize_email( $_GET['email'] );
216
  $notification_email = sanitize_email( apply_filters( 'gdpr_admin_notification_email', get_option( 'admin_email' ) ) );
217
 
218
  $user = get_user_by( 'email', $email );
@@ -222,7 +270,7 @@ class GDPR_Requests_Public extends GDPR_Requests {
222
  add_query_arg(
223
  array(
224
  'user-not-found' => 1,
225
- 'notify' => 1,
226
  ),
227
  home_url()
228
  )
@@ -238,7 +286,7 @@ class GDPR_Requests_Public extends GDPR_Requests {
238
  add_query_arg(
239
  array(
240
  'request-key-not-found' => 1,
241
- 'notify' => 1,
242
  ),
243
  home_url()
244
  )
@@ -253,7 +301,7 @@ class GDPR_Requests_Public extends GDPR_Requests {
253
  add_query_arg(
254
  array(
255
  'request-key-not-match' => 1,
256
- 'notify' => 1,
257
  ),
258
  home_url()
259
  )
@@ -262,12 +310,12 @@ class GDPR_Requests_Public extends GDPR_Requests {
262
  exit;
263
  } else {
264
  $notification_email_args = array(
265
- 'type' => $type,
266
  'review_url' => add_query_arg( array( 'page' => 'gdpr-requests#' . $type ), admin_url() ),
267
  );
268
  switch ( $type ) {
269
  case 'delete':
270
- $found_posts = parent::user_has_content( $user );
271
  $needs_review = get_option( 'gdpr_deletion_needs_review', true );
272
  if ( $found_posts || $needs_review ) {
273
  parent::confirm_request( $key );
@@ -282,7 +330,7 @@ class GDPR_Requests_Public extends GDPR_Requests {
282
  add_query_arg(
283
  array(
284
  'user-deleted' => 0,
285
- 'notify' => 1,
286
  ),
287
  home_url()
288
  )
@@ -296,7 +344,7 @@ class GDPR_Requests_Public extends GDPR_Requests {
296
  add_query_arg(
297
  array(
298
  'user-deleted' => 1,
299
- 'notify' => 1,
300
  ),
301
  home_url()
302
  )
@@ -316,7 +364,7 @@ class GDPR_Requests_Public extends GDPR_Requests {
316
  add_query_arg(
317
  array(
318
  'request-confirmed' => 1,
319
- 'notify' => 1,
320
  ),
321
  home_url()
322
  )
@@ -325,7 +373,7 @@ class GDPR_Requests_Public extends GDPR_Requests {
325
  exit;
326
  break;
327
  case 'export-data':
328
- $format = isset( $_GET['format'] ) ? sanitize_text_field( wp_unslash( $_GET['format'] ) ) : 'xml';
329
  /* translators: File format. Can be XML or JSON */
330
  GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'User downloaded all their data in %s format.', 'gdpr' ), $format ) );
331
  $this->file_export_data( $user->user_email, $format, $key );
@@ -349,10 +397,10 @@ class GDPR_Requests_Public extends GDPR_Requests {
349
  $export = GDPR::generate_export( $email, $format );
350
  if ( $export ) {
351
  parent::remove_from_requests( $key );
352
- header('Content-Type: application/octet-stream');
353
- header('Content-Description: File Transfer');
354
- header('Content-Disposition: attachment; filename=' . $email . '.' . $format);
355
- echo $export;
356
  }
357
  die();
358
  }
54
  * @since 1.0.0
55
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
56
  * @static
57
+ * @param string $type The type of request to display the correct form.
58
+ * @param string $button_text The submit button text.
59
  * @return mixed Print the form html.
60
  */
61
+ public static function request_form( $type, $submit_button_text = '' ) {
62
+ if ( ! in_array( $type, parent::$allowed_types, true ) ) {
63
  return;
64
  }
65
 
75
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
76
  */
77
  public function send_request_email() {
78
+ if ( ! isset( $_POST['gdpr_request_nonce'] ) || ! wp_verify_nonce( sanitize_key( $_POST['gdpr_request_nonce'] ), 'gdpr-add-to-requests' ) ) { // WPCS: Input var ok.
79
+ wp_send_json_error(
80
+ array(
81
+ 'title' => esc_html__( 'Error!', 'gdpr' ),
82
+ 'content' => esc_html__( 'We could not verify the security token. Please try again.', 'gdpr' ),
83
+ )
84
+ );
85
  }
86
 
87
+ if ( ! isset( $_POST['type'] ) || ! in_array( sanitize_text_field( wp_unslash( $_POST['type'] ) ), parent::$allowed_types, true ) ) { // WPCS: Input var ok.
88
+ wp_send_json_error(
89
+ array(
90
+ 'title' => esc_html__( 'Error!', 'gdpr' ),
91
+ 'content' => esc_html__( 'Invalid type of request. Please try again.', 'gdpr' ),
92
+ )
93
+ );
94
  }
95
 
96
  $use_recaptcha = get_option( 'gdpr_use_recaptcha', false );
97
  if ( $use_recaptcha ) {
98
+ $site_key = get_option( 'gdpr_recaptcha_site_key', '' );
99
  $secret_key = get_option( 'gdpr_recaptcha_secret_key', '' );
100
 
101
  if ( $site_key && $secret_key ) {
102
+ if ( ! isset( $_POST['g-recaptcha-response'] ) || ! sanitize_text_field( wp_unslash( $_POST['g-recaptcha-response'] ) ) ) { // WPCS: Input var ok.
103
+ wp_send_json_error(
104
+ array(
105
+ 'title' => esc_html__( 'Error!', 'gdpr' ),
106
+ 'content' => esc_html__( 'Please verify that you are not a robot.', 'gdpr' ),
107
+ )
108
+ );
109
  }
110
 
111
+ $response = wp_remote_post(
112
+ 'https://www.google.com/recaptcha/api/siteverify', array(
113
+ 'body' => array(
114
+ 'secret' => $secret_key,
115
+ 'response' => sanitize_text_field( wp_unslash( $_POST['g-recaptcha-response'] ) ), // WPCS: Input var ok.
116
+ ),
117
+ )
118
+ );
119
 
120
  $recaptcha_result = wp_remote_retrieve_body( $response );
121
  $recaptcha_result = json_decode( $recaptcha_result );
122
  if ( ! $recaptcha_result || ! $recaptcha_result->success ) {
123
+ wp_send_json_error(
124
+ array(
125
+ 'title' => esc_html__( 'Error!', 'gdpr' ),
126
+ 'content' => esc_html__( 'Please verify that you are not a robot.', 'gdpr' ),
127
+ )
128
+ );
129
  }
 
130
  }
131
  }
132
 
133
+ $type = sanitize_text_field( wp_unslash( $_POST['type'] ) ); // WPCS: Input var ok.
134
+ $data = isset( $_POST['data'] ) ? sanitize_textarea_field( wp_unslash( $_POST['data'] ) ) : ''; // WPCS: Input var ok.
135
 
136
  if ( is_user_logged_in() ) {
137
  $user = wp_get_current_user();
138
  } else {
139
+ $user = isset( $_POST['user_email'] ) ? get_user_by( 'email', sanitize_email( wp_unslash( $_POST['user_email'] ) ) ) : null; // WPCS: Input var ok.
140
  }
141
 
142
  if ( ! $user instanceof WP_User ) {
143
+ wp_send_json_error(
144
+ array(
145
+ 'title' => esc_html__( 'Error!', 'gdpr' ),
146
+ 'content' => esc_html__( 'User not found.', 'gdpr' ),
147
+ )
148
+ );
149
  }
150
 
151
  $email_args = array(
152
  'forgot_password_url' => add_query_arg(
153
+ array(
154
+ 'action' => 'rp',
155
+ 'key' => get_password_reset_key( $user ),
156
+ 'login' => $user->user_login,
157
+ ),
158
+ wp_login_url()
159
  ),
160
  );
161
 
163
 
164
  switch ( $type ) {
165
  case 'delete':
166
+ if ( in_array( 'administrator', $user->roles, true ) ) {
167
+ $admins_query = new WP_User_Query(
168
+ array(
169
+ 'role' => 'Administrator',
170
+ )
171
+ );
172
  if ( 1 === $admins_query->get_total() ) {
173
+ wp_send_json_error(
174
+ array(
175
+ 'title' => esc_html__( 'Error!', 'gdpr' ),
176
+ 'content' => esc_html__( 'We can\'t delete this user.', 'gdpr' ),
177
+ )
178
+ );
179
  }
180
  }
181
  break;
183
  case 'rectify':
184
  case 'complaint':
185
  if ( ! $data ) {
186
+ wp_send_json_error(
187
+ array(
188
+ 'title' => esc_html__( 'Error!', 'gdpr' ),
189
+ 'content' => esc_html__( 'Required information is missing from the form.', 'gdpr' ),
190
+ )
191
+ );
192
  }
193
  $email_args['data'] = $data;
194
  break;
197
  $key = parent::add_to_requests( $user->user_email, $type, $data );
198
 
199
  if ( 'export-data' !== $type ) {
200
+ $email_args['confirm_url'] = add_query_arg(
201
+ array(
202
+ 'type' => $type,
203
+ 'key' => $key,
204
+ 'email' => $user->user_email,
205
+ ),
206
+ home_url()
207
+ );
208
  } else {
209
+ $email_args['confirm_url_xml'] = add_query_arg(
210
+ array(
211
+ 'type' => $type,
212
+ 'key' => $key,
213
+ 'email' => $user->user_email,
214
+ 'format' => 'xml',
215
+ ),
216
+ home_url()
217
+ );
218
  $email_args['confirm_url_json'] = add_query_arg(
219
+ array(
220
+ 'type' => $type,
221
+ 'key' => $key,
222
+ 'email' => $user->user_email,
223
+ 'format' => 'json',
224
+ ),
225
+ home_url()
226
+ );
227
  }
228
 
 
229
  if ( GDPR_Email::send(
230
  $user->user_email,
231
  "{$type}-request",
232
  $email_args
233
  ) ) {
234
+ wp_send_json_success(
235
+ array(
236
+ 'title' => esc_html__( 'Email confirmation', 'gdpr' ),
237
+ 'content' => esc_html__( 'We\'ve sent you a confirmation email.', 'gdpr' ),
238
+ )
239
+ );
240
  } else {
241
+ wp_send_json_error(
242
+ array(
243
+ 'title' => esc_html__( 'Error!', 'gdpr' ),
244
+ 'content' => esc_html__( 'There was a problem with your request. Please try again later.', 'gdpr' ),
245
+ )
246
+ );
247
  }
248
  }
249
 
254
  * @author Fernando Claussen <fernandoclaussen@gmail.com>
255
  */
256
  public function request_confirmed() {
257
+ if ( is_admin() || ! isset( $_GET['type'], $_GET['key'], $_GET['email'] ) ) { // WPCS: Input var ok CSRF ok.
258
  return;
259
  }
260
 
261
+ $type = sanitize_text_field( wp_unslash( $_GET['type'] ) ); // WPCS: Input var ok, CSRF ok.
262
+ $key = sanitize_text_field( wp_unslash( $_GET['key'] ) ); // WPCS: Input var ok, CSRF ok.
263
+ $email = sanitize_email( wp_unslash( $_GET['email'] ) ); // WPCS: Input var ok, CSRF ok.
264
  $notification_email = sanitize_email( apply_filters( 'gdpr_admin_notification_email', get_option( 'admin_email' ) ) );
265
 
266
  $user = get_user_by( 'email', $email );
270
  add_query_arg(
271
  array(
272
  'user-not-found' => 1,
273
+ 'notify' => 1,
274
  ),
275
  home_url()
276
  )
286
  add_query_arg(
287
  array(
288
  'request-key-not-found' => 1,
289
+ 'notify' => 1,
290
  ),
291
  home_url()
292
  )
301
  add_query_arg(
302
  array(
303
  'request-key-not-match' => 1,
304
+ 'notify' => 1,
305
  ),
306
  home_url()
307
  )
310
  exit;
311
  } else {
312
  $notification_email_args = array(
313
+ 'type' => $type,
314
  'review_url' => add_query_arg( array( 'page' => 'gdpr-requests#' . $type ), admin_url() ),
315
  );
316
  switch ( $type ) {
317
  case 'delete':
318
+ $found_posts = parent::user_has_content( $user );
319
  $needs_review = get_option( 'gdpr_deletion_needs_review', true );
320
  if ( $found_posts || $needs_review ) {
321
  parent::confirm_request( $key );
330
  add_query_arg(
331
  array(
332
  'user-deleted' => 0,
333
+ 'notify' => 1,
334
  ),
335
  home_url()
336
  )
344
  add_query_arg(
345
  array(
346
  'user-deleted' => 1,
347
+ 'notify' => 1,
348
  ),
349
  home_url()
350
  )
364
  add_query_arg(
365
  array(
366
  'request-confirmed' => 1,
367
+ 'notify' => 1,
368
  ),
369
  home_url()
370
  )
373
  exit;
374
  break;
375
  case 'export-data':
376
+ $format = isset( $_GET['format'] ) ? sanitize_text_field( wp_unslash( $_GET['format'] ) ) : 'xml'; // WPCS: Input var ok, CSRF ok.
377
  /* translators: File format. Can be XML or JSON */
378
  GDPR_Audit_Log::log( $user->ID, sprintf( esc_html__( 'User downloaded all their data in %s format.', 'gdpr' ), $format ) );
379
  $this->file_export_data( $user->user_email, $format, $key );
397
  $export = GDPR::generate_export( $email, $format );
398
  if ( $export ) {
399
  parent::remove_from_requests( $key );
400
+ header( 'Content-Type: application/octet-stream' );
401
+ header( 'Content-Description: File Transfer' );
402
+ header( 'Content-Disposition: attachment; filename=' . $email . '.' . $format );
403
+ echo $export; // WPCS: XSS ok.
404
  }
405
  die();
406
  }
public/partials/complaint-form.php CHANGED
@@ -2,12 +2,12 @@
2
  <?php wp_nonce_field( 'gdpr-add-to-requests', 'gdpr_request_nonce' ); ?>
3
  <input type="hidden" name="action" value="gdpr_send_request_email">
4
  <input type="hidden" name="type" value="complaint">
5
- <?php if ( ! is_user_logged_in() ): ?>
6
- <input type="email" name="user_email" placeholder="user@domain.com" required>
7
  <?php endif ?>
8
- <textarea name="data" rows="5" required placeholder="<?php echo esc_attr__( 'Type your complaint here', 'gdpr' ); ?>"></textarea>
9
 
10
  <?php GDPR_Public::add_recaptcha(); ?>
11
- <?php $submit_button_text = apply_filters( "gdpr_complaint_request_form_submit_text", esc_attr__( 'Submit', 'gdpr' ) ); ?>
12
  <input type="submit" value="<?php echo esc_attr( $submit_button_text ); ?>">
13
  </form>
2
  <?php wp_nonce_field( 'gdpr-add-to-requests', 'gdpr_request_nonce' ); ?>
3
  <input type="hidden" name="action" value="gdpr_send_request_email">
4
  <input type="hidden" name="type" value="complaint">
5
+ <?php if ( ! is_user_logged_in() ) : ?>
6
+ <input type="email" name="user_email" placeholder="<?php esc_attr_e( 'email@domain.com', 'gdpr' ); ?>" required>
7
  <?php endif ?>
8
+ <textarea name="data" rows="5" required placeholder="<?php esc_attr_e( 'Type your complaint here', 'gdpr' ); ?>"></textarea>
9
 
10
  <?php GDPR_Public::add_recaptcha(); ?>
11
+ <?php $submit_button_text = ( $submit_button_text ?: esc_attr__( 'Submit', 'gdpr' ) ); ?>
12
  <input type="submit" value="<?php echo esc_attr( $submit_button_text ); ?>">
13
  </form>
public/partials/confirmation-screens.php CHANGED
@@ -13,34 +13,31 @@
13
 
14
  <?php
15
  $title = '';
16
- $text = '';
17
- if ( isset( $_GET['notify'] ) && $_GET['notify'] ) : ?>
 
18
  <?php
19
- if ( isset( $_GET['user-deleted'] ) ) {
20
  $title = __( 'Your account', 'gdpr' );
21
- if ( $_GET['user-deleted'] ) {
22
  $text = __( 'Your account has been closed. We are sorry to see you go.', 'gdpr' );
23
  } else {
24
  $text = __( 'Your request has been received and is being reviewed. You will receive an email when we are done.', 'gdpr' );
25
  }
26
  }
27
- if ( isset( $_GET['request-confirmed'] ) && $_GET['request-confirmed'] ) {
28
  $title = __( 'Request Received', 'gdpr' );
29
  $text = __( 'Your request has been received. We will be in touch soon.', 'gdpr' );
30
  }
31
- if ( isset( $_GET['malformed-confirmation-link'] ) && $_GET['malformed-confirmation-link'] ) {
32
- $title = __( 'Error!', 'gdpr' );
33
- $text = __( 'Malformed request confirmation link!', 'gdpr' );
34
- }
35
- if ( isset( $_GET['user-not-found'] ) && $_GET['user-not-found'] ) {
36
  $title = __( 'Error!', 'gdpr' );
37
  $text = __( 'User not found.', 'gdpr' );
38
  }
39
- if ( isset( $_GET['request-key-not-found'] ) && $_GET['request-key-not-found'] ) {
40
  $title = __( 'Error!', 'gdpr' );
41
  $text = __( 'We could not confirm the request key. It may be expired.', 'gdpr' );
42
  }
43
- if ( isset( $_GET['request-key-not-match'] ) && $_GET['request-key-not-match'] ) {
44
  $title = __( 'Error!', 'gdpr' );
45
  $text = __( 'The key used does not match the request key we have stored.', 'gdpr' );
46
  }
@@ -58,7 +55,7 @@ if ( isset( $_GET['notify'] ) && $_GET['notify'] ) : ?>
58
  <p><?php echo esc_html( $text ); ?></p>
59
  </div>
60
  <footer>
61
- <button class="gdpr-ok"><?php esc_html_e( 'OK', 'gdpr' ) ?></button>
62
  </footer>
63
  </div>
64
  </div>
13
 
14
  <?php
15
  $title = '';
16
+ $text = '';
17
+ if ( isset( $_GET['notify'] ) && absint( $_GET['notify'] ) ) : // WPCS: Input var ok, CSRF ok.
18
+ ?>
19
  <?php
20
+ if ( isset( $_GET['user-deleted'] ) ) { // WPCS: Input var ok, CSRF ok.
21
  $title = __( 'Your account', 'gdpr' );
22
+ if ( absint( $_GET['user-deleted'] ) ) { // WPCS: Input var ok, CSRF ok.
23
  $text = __( 'Your account has been closed. We are sorry to see you go.', 'gdpr' );
24
  } else {
25
  $text = __( 'Your request has been received and is being reviewed. You will receive an email when we are done.', 'gdpr' );
26
  }
27
  }
28
+ if ( isset( $_GET['request-confirmed'] ) && absint( $_GET['request-confirmed'] ) ) { // WPCS: Input var ok, CSRF ok.
29
  $title = __( 'Request Received', 'gdpr' );
30
  $text = __( 'Your request has been received. We will be in touch soon.', 'gdpr' );
31
  }
32
+ if ( isset( $_GET['user-not-found'] ) && absint( $_GET['user-not-found'] ) ) { // WPCS: Input var ok CSRF ok.
 
 
 
 
33
  $title = __( 'Error!', 'gdpr' );
34
  $text = __( 'User not found.', 'gdpr' );
35
  }
36
+ if ( isset( $_GET['request-key-not-found'] ) && absint( $_GET['request-key-not-found'] ) ) { // WPCS: Input var ok, CSRF ok.
37
  $title = __( 'Error!', 'gdpr' );
38
  $text = __( 'We could not confirm the request key. It may be expired.', 'gdpr' );
39
  }
40
+ if ( isset( $_GET['request-key-not-match'] ) && absint( $_GET['request-key-not-match'] ) ) { // WPCS: Input var ok, CSRF ok.
41
  $title = __( 'Error!', 'gdpr' );
42
  $text = __( 'The key used does not match the request key we have stored.', 'gdpr' );
43
  }
55
  <p><?php echo esc_html( $text ); ?></p>
56
  </div>
57
  <footer>
58
+ <button class="gdpr-ok"><?php esc_html_e( 'OK', 'gdpr' ); ?></button>
59
  </footer>
60
  </div>
61
  </div>
public/partials/delete-form.php CHANGED
@@ -15,10 +15,10 @@
15
  <?php wp_nonce_field( 'gdpr-add-to-requests', 'gdpr_request_nonce' ); ?>
16
  <input type="hidden" name="action" value="gdpr_send_request_email">
17
  <input type="hidden" name="type" value="delete">
18
- <?php if ( ! is_user_logged_in() ): ?>
19
- <input type="email" name="user_email" placeholder="user@domain.com" required>
20
  <?php endif ?>
21
  <?php GDPR_Public::add_recaptcha(); ?>
22
- <?php $submit_button_text = apply_filters( "gdpr_delete_request_form_submit_text", esc_attr__( 'Close my account', 'gdpr' ) ); ?>
23
  <input type="submit" value="<?php echo esc_attr( $submit_button_text ); ?>">
24
  </form>
15
  <?php wp_nonce_field( 'gdpr-add-to-requests', 'gdpr_request_nonce' ); ?>
16
  <input type="hidden" name="action" value="gdpr_send_request_email">
17
  <input type="hidden" name="type" value="delete">
18
+ <?php if ( ! is_user_logged_in() ) : ?>
19
+ <input type="email" name="user_email" placeholder="<?php esc_attr_e( 'email@domain.com', 'gdpr' ); ?>" required>
20
  <?php endif ?>
21
  <?php GDPR_Public::add_recaptcha(); ?>
22
+ <?php $submit_button_text = ( $submit_button_text ?: esc_attr__( 'Close my account', 'gdpr' ) ); ?>
23
  <input type="submit" value="<?php echo esc_attr( $submit_button_text ); ?>">
24
  </form>
public/partials/export-data-form.php CHANGED
@@ -2,10 +2,10 @@
2
  <?php wp_nonce_field( 'gdpr-add-to-requests', 'gdpr_request_nonce' ); ?>
3
  <input type="hidden" name="action" value="gdpr_send_request_email">
4
  <input type="hidden" name="type" value="export-data">
5
- <?php if ( ! is_user_logged_in() ): ?>
6
- <input type="email" name="user_email" placeholder="user@domain.com" required>
7
  <?php endif ?>
8
  <?php GDPR_Public::add_recaptcha(); ?>
9
- <?php $submit_button_text = apply_filters( "gdpr_export_data_request_form_submit_text", esc_attr__( 'Download my data', 'gdpr' ) ); ?>
10
  <input type="submit" value="<?php echo esc_attr( $submit_button_text ); ?>">
11
  </form>
2
  <?php wp_nonce_field( 'gdpr-add-to-requests', 'gdpr_request_nonce' ); ?>
3
  <input type="hidden" name="action" value="gdpr_send_request_email">
4
  <input type="hidden" name="type" value="export-data">
5
+ <?php if ( ! is_user_logged_in() ) : ?>
6
+ <input type="email" name="user_email" placeholder="<?php esc_attr_e( 'email@domain.com', 'gdpr' ); ?>" required>
7
  <?php endif ?>
8
  <?php GDPR_Public::add_recaptcha(); ?>
9
+ <?php $submit_button_text = ( $submit_button_text ?: esc_attr__( 'Download my data', 'gdpr' ) ); ?>
10
  <input type="submit" value="<?php echo esc_attr( $submit_button_text ); ?>">
11
  </form>
public/partials/privacy-bar.php CHANGED
@@ -19,7 +19,7 @@
19
  </div>
20
  <div class="gdpr-right">
21
  <ul class="gdpr-cookie-categories">
22
- <?php if ( $show_cookie_cat_checkboxes ): ?>
23
  <?php foreach ( $registered_cookies as $cookie_cat_id => $cookie_cat ) : ?>
24
  <?php
25
  $enabled = ( 'off' === $cookie_cat['status'] ) ? false : true;
19
  </div>
20
  <div class="gdpr-right">
21
  <ul class="gdpr-cookie-categories">
22
+ <?php if ( $show_cookie_cat_checkboxes ) : ?>
23
  <?php foreach ( $registered_cookies as $cookie_cat_id => $cookie_cat ) : ?>
24
  <?php
25
  $enabled = ( 'off' === $cookie_cat['status'] ) ? false : true;
public/partials/privacy-preferences-modal.php CHANGED
@@ -31,7 +31,7 @@
31
  <ul class="">
32
  <li><button type="button" class="gdpr-tab-button gdpr-active" data-target="gdpr-consent-management"><?php esc_html_e( 'Consent Management', 'gdpr' ); ?></button></li>
33
  <?php reset( $tabs ); ?>
34
- <?php if ( ! empty( $tabs ) ): ?>
35
  <li><button type="button" class="gdpr-tab-button gdpr-cookie-settings" data-target="<?php echo esc_attr( key( $tabs ) ); ?>"><?php esc_html_e( 'Cookie Settings', 'gdpr' ); ?></button>
36
  <ul class="gdpr-subtabs">
37
  <?php
@@ -47,11 +47,13 @@
47
  <?php endif ?>
48
  </ul>
49
  <ul class="gdpr-policies">
50
- <?php if ( ! empty( $consent_types ) ): ?>
51
  <?php foreach ( $consent_types as $consent_key => $type ) : ?>
52
- <?php if ( ! $type['policy-page'] ) {
 
53
  continue;
54
- } ?>
 
55
  <li><a href="<?php echo esc_url( get_permalink( $type['policy-page'] ) ); ?>" target="_blank"><?php echo esc_html( $type['name'] ); ?></a></li>
56
  <?php endforeach; ?>
57
  <?php endif; ?>
@@ -64,7 +66,7 @@
64
  </header>
65
  <div class="gdpr-info">
66
  <p><?php echo nl2br( esc_html( $cookie_privacy_excerpt ) ); ?></p>
67
- <?php if ( ! empty( $consent_types ) ): ?>
68
  <?php foreach ( $consent_types as $consent_key => $type ) : ?>
69
  <div class="gdpr-cookies-used">
70
  <div class="gdpr-cookie-title">
@@ -94,21 +96,21 @@
94
  <h4><?php echo esc_html( $tab['name'] ); ?></h4>
95
  </header><!-- /header -->
96
  <div class="gdpr-info">
97
- <p><?php echo nl2br( $tab['how_we_use'] ); ?></p>
98
  <?php if ( isset( $tab['cookies_used'] ) && $tab['cookies_used'] ) : ?>
99
  <div class="gdpr-cookies-used">
100
  <div class="gdpr-cookie-title">
101
  <p><?php esc_html_e( 'Cookies Used', 'gdpr' ); ?></p>
102
  <?php
103
- $site_cookies = array();
104
- $enabled = ( 'off' === $tab['status'] ) ? false : true;
105
- $cookies_used = explode( ',', $tab['cookies_used'] );
106
- $approved_cookies = isset( $_COOKIE['gdpr']['allowed_cookies'] ) ? json_decode( wp_unslash( $_COOKIE['gdpr']['allowed_cookies'] ) ) : array();
107
  foreach ( $cookies_used as $cookie ) {
108
  $site_cookies[] = trim( $cookie );
109
- $all_cookies[] = trim( $cookie );
110
- if ( ! empty( $approved_cookies ) ) {
111
- if ( in_array( trim( $cookie ), $approved_cookies ) ) {
112
  $enabled = true;
113
  } else {
114
  $enabled = false;
@@ -118,10 +120,10 @@
118
  ?>
119
  <?php if ( 'required' === $tab['status'] ) : ?>
120
  <span class="gdpr-always-active"><?php esc_html_e( 'Required', 'gdpr' ); ?></span>
121
- <input type="hidden" name="approved_cookies[]" value="<?php echo esc_attr( json_encode( $site_cookies ) ) ?>">
122
- <?php else: ?>
123
  <label class="gdpr-switch">
124
- <input type="checkbox" class="gdpr-cookie-category" data-category="<?php echo esc_attr( $key ); ?>" name="approved_cookies[]" value="<?php echo esc_attr( json_encode( $site_cookies ) ) ?>" <?php checked( $enabled, true ); ?>>
125
  <span class="gdpr-slider round"></span>
126
  </label>
127
  <?php endif; ?>
31
  <ul class="">
32
  <li><button type="button" class="gdpr-tab-button gdpr-active" data-target="gdpr-consent-management"><?php esc_html_e( 'Consent Management', 'gdpr' ); ?></button></li>
33
  <?php reset( $tabs ); ?>
34
+ <?php if ( ! empty( $tabs ) ) : ?>
35
  <li><button type="button" class="gdpr-tab-button gdpr-cookie-settings" data-target="<?php echo esc_attr( key( $tabs ) ); ?>"><?php esc_html_e( 'Cookie Settings', 'gdpr' ); ?></button>
36
  <ul class="gdpr-subtabs">
37
  <?php
47
  <?php endif ?>
48
  </ul>
49
  <ul class="gdpr-policies">
50
+ <?php if ( ! empty( $consent_types ) ) : ?>
51
  <?php foreach ( $consent_types as $consent_key => $type ) : ?>
52
+ <?php
53
+ if ( ! $type['policy-page'] ) {
54
  continue;
55
+ }
56
+ ?>
57
  <li><a href="<?php echo esc_url( get_permalink( $type['policy-page'] ) ); ?>" target="_blank"><?php echo esc_html( $type['name'] ); ?></a></li>
58
  <?php endforeach; ?>
59
  <?php endif; ?>
66
  </header>
67
  <div class="gdpr-info">
68
  <p><?php echo nl2br( esc_html( $cookie_privacy_excerpt ) ); ?></p>
69
+ <?php if ( ! empty( $consent_types ) ) : ?>
70
  <?php foreach ( $consent_types as $consent_key => $type ) : ?>
71
  <div class="gdpr-cookies-used">
72
  <div class="gdpr-cookie-title">
96
  <h4><?php echo esc_html( $tab['name'] ); ?></h4>
97
  </header><!-- /header -->
98
  <div class="gdpr-info">
99
+ <p><?php echo nl2br( wp_kses_post( $tab['how_we_use'] ) ); ?></p>
100
  <?php if ( isset( $tab['cookies_used'] ) && $tab['cookies_used'] ) : ?>
101
  <div class="gdpr-cookies-used">
102
  <div class="gdpr-cookie-title">
103
  <p><?php esc_html_e( 'Cookies Used', 'gdpr' ); ?></p>
104
  <?php
105
+ $site_cookies = array();
106
+ $enabled = ( 'off' === $tab['status'] ) ? false : true;
107
+ $cookies_used = explode( ',', $tab['cookies_used'] );
108
+ $approved_cookies = isset( $_COOKIE['gdpr']['allowed_cookies'] ) ? json_decode( sanitize_text_field( wp_unslash( $_COOKIE['gdpr']['allowed_cookies'] ) ) ) : array(); // WPCS: input var ok.
109
  foreach ( $cookies_used as $cookie ) {
110
  $site_cookies[] = trim( $cookie );
111
+ $all_cookies[] = trim( $cookie );
112
+ if ( ! empty( $approved_cookies ) && isset( $_COOKIE['gdpr']['privacy_bar'] ) ) {
113
+ if ( in_array( trim( $cookie ), $approved_cookies, true ) ) {
114
  $enabled = true;
115
  } else {
116
  $enabled = false;
120
  ?>
121
  <?php if ( 'required' === $tab['status'] ) : ?>
122
  <span class="gdpr-always-active"><?php esc_html_e( 'Required', 'gdpr' ); ?></span>
123
+ <input type="hidden" name="approved_cookies[]" value="<?php echo esc_attr( json_encode( $site_cookies ) ); ?>">
124
+ <?php else : ?>
125
  <label class="gdpr-switch">
126
+ <input type="checkbox" class="gdpr-cookie-category" data-category="<?php echo esc_attr( $key ); ?>" name="approved_cookies[]" value="<?php echo esc_attr( json_encode( $site_cookies ) ); ?>" <?php checked( $enabled, true ); ?>>
127
  <span class="gdpr-slider round"></span>
128
  </label>
129
  <?php endif; ?>
public/partials/reconsent-bar.php CHANGED
@@ -15,7 +15,7 @@
15
  <div class="gdpr gdpr-reconsent-bar" style="display:none;">
16
  <div class="gdpr-wrapper">
17
  <div class="gdpr-content">
18
- <p><?php esc_html_e( 'Some of our policies have been updated. Please make sure to select the "View" link next each item in order to view changes before agreeing.', 'gdpr' ); ?></p>
19
  </div>
20
  <div class="gdpr-right">
21
  <ul class="gdpr-policy-list">
@@ -23,7 +23,7 @@
23
  <li class="gdpr-policy-list-item">
24
  <input type="hidden" value="<?php echo esc_attr( $consent_id ); ?>" checked>
25
  <label><?php echo esc_html( $consent['name'] ); ?></label>
26
- <a class="gdpr-policy-link" href="<?php echo esc_url( get_permalink( $consent['policy-page'] ) ); ?>" target="_blank">[<?php esc_html_e( 'View', 'gdpr' ) ?>]</a>
27
  </li>
28
  <?php endforeach ?>
29
  </ul>
15
  <div class="gdpr gdpr-reconsent-bar" style="display:none;">
16
  <div class="gdpr-wrapper">
17
  <div class="gdpr-content">
18
+ <p><?php esc_html_e( 'Some of our policies have been updated. Please make sure to select the "View" link next to each item in order to view changes before agreeing.', 'gdpr' ); ?></p>
19
  </div>
20
  <div class="gdpr-right">
21
  <ul class="gdpr-policy-list">
23
  <li class="gdpr-policy-list-item">
24
  <input type="hidden" value="<?php echo esc_attr( $consent_id ); ?>" checked>
25
  <label><?php echo esc_html( $consent['name'] ); ?></label>
26
+ <a class="gdpr-policy-link" href="<?php echo esc_url( get_permalink( $consent['policy-page'] ) ); ?>" target="_blank">[<?php esc_html_e( 'View', 'gdpr' ); ?>]</a>
27
  </li>
28
  <?php endforeach ?>
29
  </ul>
public/partials/rectify-form.php CHANGED
@@ -2,11 +2,11 @@
2
  <?php wp_nonce_field( 'gdpr-add-to-requests', 'gdpr_request_nonce' ); ?>
3
  <input type="hidden" name="action" value="gdpr_send_request_email">
4
  <input type="hidden" name="type" value="rectify">
5
- <?php if ( ! is_user_logged_in() ): ?>
6
- <input type="email" name="user_email" placeholder="user@domain.com" required>
7
  <?php endif ?>
8
- <textarea name="data" rows="5" required placeholder="<?php echo esc_attr__( 'Type your rectification request here', 'gdpr' ); ?>"></textarea>
9
  <?php GDPR_Public::add_recaptcha(); ?>
10
- <?php $submit_button_text = apply_filters( "gdpr_rectify_request_form_submit_text", esc_attr__( 'Submit', 'gdpr' ) ); ?>
11
  <input type="submit" value="<?php echo esc_attr( $submit_button_text ); ?>">
12
  </form>
2
  <?php wp_nonce_field( 'gdpr-add-to-requests', 'gdpr_request_nonce' ); ?>
3
  <input type="hidden" name="action" value="gdpr_send_request_email">
4
  <input type="hidden" name="type" value="rectify">
5
+ <?php if ( ! is_user_logged_in() ) : ?>
6
+ <input type="email" name="user_email" placeholder="<?php esc_attr_e( 'email@domain.com', 'gdpr' ); ?>" required>
7
  <?php endif ?>
8
+ <textarea name="data" rows="5" required placeholder="<?php esc_attr_e( 'Type your rectification request here', 'gdpr' ); ?>"></textarea>
9
  <?php GDPR_Public::add_recaptcha(); ?>
10
+ <?php $submit_button_text = ( $submit_button_text ?: esc_attr__( 'Submit', 'gdpr' ) ); ?>
11
  <input type="submit" value="<?php echo esc_attr( $submit_button_text ); ?>">
12
  </form>
templates/email/complaint-request.php CHANGED
@@ -1,26 +1,26 @@
1
  <?php
2
  echo sprintf(
3
- /* translators: 1: The complaint content, 2: confirmation link, 3: reset password link */
4
- esc_html__(
5
  'Someone placed a complaint on your behalf on our site.
6
  By clicking confirm a request will be made and we will do our best to fulfil it.
7
 
8
  --------------------------------------------------------
9
  Request
10
  --------------------------------------------------------
11
- %s
12
 
13
 
14
 
15
 
16
- To confirm this request, click here: %s
17
 
18
 
19
 
20
  ---------------------------------------------------------------------------------
21
- If that wasn\'t you, reset your password: %s
22
  ', 'gdpr' ),
23
- esc_html( $args['data'] ),
24
- esc_url_raw( $args['confirm_url'] ),
25
- esc_url_raw( $args['forgot_password_url'] )
26
  );
1
  <?php
2
  echo sprintf(
3
+ /* translators: 1: The complaint content, 2: confirmation link, 3: reset password link */
4
+ esc_html__(
5
  'Someone placed a complaint on your behalf on our site.
6
  By clicking confirm a request will be made and we will do our best to fulfil it.
7
 
8
  --------------------------------------------------------
9
  Request
10
  --------------------------------------------------------
11
+ %1$s
12
 
13
 
14
 
15
 
16
+ To confirm this request, click here: %2$s
17
 
18
 
19
 
20
  ---------------------------------------------------------------------------------
21
+ If that wasn\'t you, reset your password: %3$s
22
  ', 'gdpr' ),
23
+ esc_html( $args['data'] ),
24
+ esc_url_raw( $args['confirm_url'] ),
25
+ esc_url_raw( $args['forgot_password_url'] )
26
  );
templates/email/data-breach-notification.php CHANGED
@@ -2,27 +2,27 @@
2
  echo sprintf(
3
  /* translators: 1: Email content, 2: Nature of data breach, 3: Contact details for data protection officer, 4: Likely consequences of breach, 5: Measures taken */
4
  esc_html__(
5
- '%s
6
 
7
  --------------------------------------------------------
8
  Nature of the personal data breach:
9
  --------------------------------------------------------
10
- %s
11
 
12
  --------------------------------------------------------
13
  Name and contact details of the data protection officer:
14
  --------------------------------------------------------
15
- %s
16
 
17
  --------------------------------------------------------
18
  Likely consequences of the personal data breach:
19
  --------------------------------------------------------
20
- %s
21
 
22
  --------------------------------------------------------
23
  Measures taken or proposed to be taken:
24
  --------------------------------------------------------
25
- %s
26
  ', 'gdpr' ),
27
  esc_html( $args['content'] ),
28
  esc_html( $args['nature'] ),
@@ -31,4 +31,3 @@ Measures taken or proposed to be taken:
31
  esc_html( $args['measures'] ),
32
  esc_url_raw( $args['confirm_url'] )
33
  );
34
- ?>
2
  echo sprintf(
3
  /* translators: 1: Email content, 2: Nature of data breach, 3: Contact details for data protection officer, 4: Likely consequences of breach, 5: Measures taken */
4
  esc_html__(
5
+ '%1$s
6
 
7
  --------------------------------------------------------
8
  Nature of the personal data breach:
9
  --------------------------------------------------------
10
+ %2$s
11
 
12
  --------------------------------------------------------
13
  Name and contact details of the data protection officer:
14
  --------------------------------------------------------
15
+ %3$s
16
 
17
  --------------------------------------------------------
18
  Likely consequences of the personal data breach:
19
  --------------------------------------------------------
20
+ %4$s
21
 
22
  --------------------------------------------------------
23
  Measures taken or proposed to be taken:
24
  --------------------------------------------------------
25
+ %5$s
26
  ', 'gdpr' ),
27
  esc_html( $args['content'] ),
28
  esc_html( $args['nature'] ),
31
  esc_html( $args['measures'] ),
32
  esc_url_raw( $args['confirm_url'] )
33
  );
 
templates/email/data-breach-request.php CHANGED
@@ -2,30 +2,30 @@
2
  echo sprintf(
3
  /* translators: 1: User who requested the notification, 2: Nature of data breach, 3: Contact details for data protection officer, 4: Likely consequences of breach, 5: Measures taken, 6: Confirmation link */
4
  esc_html__(
5
- 'A request to send a mass email notification to all users regarding a data breach has been made by %s.
6
 
7
  --------------------------------------------------------
8
  Nature of the personal data breach:
9
  --------------------------------------------------------
10
- %s
11
 
12
  --------------------------------------------------------
13
  Name and contact details of the data protection officer:
14
  --------------------------------------------------------
15
- %s
16
 
17
  --------------------------------------------------------
18
  Likely consequences of the personal data breach:
19
  --------------------------------------------------------
20
- %s
21
 
22
  --------------------------------------------------------
23
  Measures taken or proposed to be taken:
24
  --------------------------------------------------------
25
- %s
26
 
27
 
28
- To confirm this request, click here: %s
29
 
30
  ---------------------------------------------------------------------------------
31
  If that is not intended, have the person who requested it change their password.
@@ -38,4 +38,3 @@ If that is not intended, have the person who requested it change their password.
38
  esc_html( $args['measures'] ),
39
  esc_url_raw( $args['confirm_url'] )
40
  );
41
- ?>
2
  echo sprintf(
3
  /* translators: 1: User who requested the notification, 2: Nature of data breach, 3: Contact details for data protection officer, 4: Likely consequences of breach, 5: Measures taken, 6: Confirmation link */
4
  esc_html__(
5
+ 'A request to send a mass email notification to all users regarding a data breach has been made by %1$s.
6
 
7
  --------------------------------------------------------
8
  Nature of the personal data breach:
9
  --------------------------------------------------------
10
+ %2$s
11
 
12
  --------------------------------------------------------
13
  Name and contact details of the data protection officer:
14
  --------------------------------------------------------
15
+ %3$s
16
 
17
  --------------------------------------------------------
18
  Likely consequences of the personal data breach:
19
  --------------------------------------------------------
20
+ %4$s
21
 
22
  --------------------------------------------------------
23
  Measures taken or proposed to be taken:
24
  --------------------------------------------------------
25
+ %5$s
26
 
27
 
28
+ To confirm this request, click here: %6$s
29
 
30
  ---------------------------------------------------------------------------------
31
  If that is not intended, have the person who requested it change their password.
38
  esc_html( $args['measures'] ),
39
  esc_url_raw( $args['confirm_url'] )
40
  );
 
templates/email/delete-request.php CHANGED
@@ -1,7 +1,7 @@
1
  <?php
2
  echo sprintf(
3
- /* translators: 1: Confirmation link, 2: Reset password link */
4
- esc_html__(
5
  'Someone placed a request for your information to be removed from our site.
6
  By clicking confirm your account will be removed from our site and all data we collected
7
  over time will be erased from our database. It will be impossible for us to retrieve that
@@ -9,13 +9,13 @@ information in the future.
9
 
10
 
11
 
12
- To confirm this request, click here: %s
13
 
14
 
15
 
16
  ---------------------------------------------------------------------------------
17
- If that wasn\'t you, reset your password: %s
18
  ', 'gdpr' ),
19
- esc_url_raw( $args['confirm_url'] ),
20
- esc_url_raw( $args['forgot_password_url'] )
21
  );
1
  <?php
2
  echo sprintf(
3
+ /* translators: 1: Confirmation link, 2: Reset password link */
4
+ esc_html__(
5
  'Someone placed a request for your information to be removed from our site.
6
  By clicking confirm your account will be removed from our site and all data we collected
7
  over time will be erased from our database. It will be impossible for us to retrieve that
9
 
10
 
11
 
12
+ To confirm this request, click here: %1$s
13
 
14
 
15
 
16
  ---------------------------------------------------------------------------------
17
+ If that wasn\'t you, reset your password: %2$s
18
  ', 'gdpr' ),
19
+ esc_url_raw( $args['confirm_url'] ),
20
+ esc_url_raw( $args['forgot_password_url'] )
21
  );
templates/email/delete-resolved.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  echo sprintf(
4
  /* translators: 6-digit token for audit log */
5
- esc_html__(
6
  'Your account has been closed.
7
 
8
  We no longer hold any information about you.
@@ -10,5 +10,5 @@ If you ever need to make a complaint you can email us and we will try to help yo
10
  To be able to make a complaint you will be requested to provide your email address and the token below.
11
 
12
  %s', 'gdpr' ),
13
- $args['token']
14
  );
2
 
3
  echo sprintf(
4
  /* translators: 6-digit token for audit log */
5
+ esc_html__(
6
  'Your account has been closed.
7
 
8
  We no longer hold any information about you.
10
  To be able to make a complaint you will be requested to provide your email address and the token below.
11
 
12
  %s', 'gdpr' ),
13
+ esc_html( $args['token'] )
14
  );
templates/email/export-data-request.php CHANGED
@@ -1,19 +1,19 @@
1
  <?php
2
  echo sprintf(
3
- /* translators: 1: XML download link, 2: JSON download link, 3: reset password link */
4
- esc_html__(
5
  'Someone requested to download your data from our site.
6
  By clicking confirm we will redirect you back to our site where a download will begin.
7
 
8
- To download it in a XML format, click here: %s
9
- To download it in a JSON format, click here: %s
10
 
11
 
12
 
13
  ---------------------------------------------------------------------------------
14
- If that wasn\'t you, reset your password: %s
15
  ', 'gdpr' ),
16
- esc_url_raw( $args['confirm_url_xml'] ),
17
- esc_url_raw( $args['confirm_url_json'] ),
18
- esc_url_raw( $args['forgot_password_url'] )
19
  );
1
  <?php
2
  echo sprintf(
3
+ /* translators: 1: XML download link, 2: JSON download link, 3: reset password link */
4
+ esc_html__(
5
  'Someone requested to download your data from our site.
6
  By clicking confirm we will redirect you back to our site where a download will begin.
7
 
8
+ To download it in a XML format, click here: %1$s
9
+ To download it in a JSON format, click here: %2$s
10
 
11
 
12
 
13
  ---------------------------------------------------------------------------------
14
+ If that wasn\'t you, reset your password: %3$s
15
  ', 'gdpr' ),
16
+ esc_url_raw( $args['confirm_url_xml'] ),
17
+ esc_url_raw( $args['confirm_url_json'] ),
18
+ esc_url_raw( $args['forgot_password_url'] )
19
  );
templates/email/new-request.php CHANGED
@@ -2,10 +2,10 @@
2
 
3
  echo sprintf(
4
  /* translators: 1: The type of request. 2: Link to where the request can be reviewed. */
5
- esc_html__(
6
  'There is a new %1$s request waiting for review.
7
 
8
  Review your requests: %2$s', 'gdpr' ),
9
- esc_html( $args['type'] ),
10
- esc_url_raw( $args['review_url'] )
11
  );
2
 
3
  echo sprintf(
4
  /* translators: 1: The type of request. 2: Link to where the request can be reviewed. */
5
+ esc_html__(
6
  'There is a new %1$s request waiting for review.
7
 
8
  Review your requests: %2$s', 'gdpr' ),
9
+ esc_html( $args['type'] ),
10
+ esc_url_raw( $args['review_url'] )
11
  );
templates/email/rectify-request.php CHANGED
@@ -1,26 +1,26 @@
1
  <?php
2
  echo sprintf(
3
- /* translators: 1: The request content, 2: confirmation link, 3: reset password link */
4
- esc_html__(
5
  'Someone placed a request for your information to be rectified on our site.
6
  By clicking confirm a request will be made and we will do our best to fulfil it.
7
 
8
  --------------------------------------------------------
9
  Request
10
  --------------------------------------------------------
11
- %s
12
 
13
 
14
 
15
 
16
- To confirm this request, click here: %s
17
 
18
 
19
 
20
  ---------------------------------------------------------------------------------
21
- If that wasn\'t you, reset your password: %s
22
  ', 'gdpr' ),
23
- esc_html( $args['data'] ),
24
- esc_url_raw( $args['confirm_url'] ),
25
- esc_url_raw( $args['forgot_password_url'] )
26
  );
1
  <?php
2
  echo sprintf(
3
+ /* translators: 1: The request content, 2: confirmation link, 3: reset password link */
4
+ esc_html__(
5
  'Someone placed a request for your information to be rectified on our site.
6
  By clicking confirm a request will be made and we will do our best to fulfil it.
7
 
8
  --------------------------------------------------------
9
  Request
10
  --------------------------------------------------------
11
+ %1$s
12
 
13
 
14
 
15
 
16
+ To confirm this request, click here: %2$s
17
 
18
 
19
 
20
  ---------------------------------------------------------------------------------
21
+ If that wasn\'t you, reset your password: %3$s
22
  ', 'gdpr' ),
23
+ esc_html( $args['data'] ),
24
+ esc_url_raw( $args['confirm_url'] ),
25
+ esc_url_raw( $args['forgot_password_url'] )
26
  );