The GDPR Framework By Data443 - Version 1.0.5

Version Description

  • Add Spanish support (Thanks @elarequi!)
  • Lower required PHP version to 5.6.0
  • Re-add container alias for DataSubjectManager
  • Fix for installer giving the option to add links to footer for unsupported themes
  • Fix PHP notice in WPML module
Download this release

Release Info

Developer indrek_k
Plugin Icon 128x128 The GDPR Framework By Data443
Version 1.0.5
Comparing to
See all releases

Code changes from version 1.0.4 to 1.0.5

Files changed (141) hide show
  1. assets/conditional-show.js +102 -102
  2. assets/gdpr-admin.css +362 -362
  3. assets/gdpr-admin.js +102 -102
  4. assets/gdpr-installer.css +550 -550
  5. assets/gdpr-installer.js +58 -58
  6. assets/gdpr-rhino.svg +42 -42
  7. assets/privacy-tools.css +30 -30
  8. bootstrap.php +53 -71
  9. gdpr-framework.php +95 -73
  10. languages/gdpr-framework-de_DE.mo +0 -0
  11. languages/gdpr-framework-de_DE.po +1306 -0
  12. languages/gdpr-framework-es_ES.mo +0 -0
  13. languages/gdpr-framework-es_ES.po +1750 -0
  14. languages/gdpr-framework.pot +1284 -1284
  15. license.txt +198 -198
  16. readme.txt +91 -85
  17. src/Admin/AdminError.php +16 -16
  18. src/Admin/AdminHelper.php +57 -57
  19. src/Admin/AdminNotice.php +41 -41
  20. src/Admin/AdminTab.php +157 -157
  21. src/Admin/AdminTabGeneral.php +277 -277
  22. src/Admin/Modal.php +41 -41
  23. src/Admin/WordpressAdmin.php +156 -156
  24. src/Admin/WordpressAdminPage.php +147 -147
  25. src/Components/Consent/AdminTabConsent.php +181 -181
  26. src/Components/Consent/ConsentManager.php +317 -317
  27. src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php +436 -436
  28. src/Components/PrivacyPolicy/PolicyGenerator.php +44 -44
  29. src/Components/PrivacyPolicy/PrivacyPolicy.php +92 -92
  30. src/Components/PrivacyToolsPage/PrivacyToolsPage.php +14 -14
  31. src/Components/PrivacyToolsPage/PrivacyToolsPageController.php +278 -278
  32. src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php +45 -45
  33. src/Components/Support/AdminTabSupport.php +34 -34
  34. src/Components/Support/Support.php +18 -18
  35. src/Components/WordpressComments/WordpressComments.php +172 -172
  36. src/Components/WordpressUser/Controllers/DashboardDataPageController.php +197 -197
  37. src/Components/WordpressUser/Controllers/DashboardProfilePageController.php +123 -123
  38. src/Components/WordpressUser/DataManager.php +151 -151
  39. src/Components/WordpressUser/RegistrationForm.php +50 -50
  40. src/Components/WordpressUser/WordpressUser.php +111 -111
  41. src/DataSubject/AdminTabDataSubject.php +126 -126
  42. src/DataSubject/DataExporter.php +138 -138
  43. src/DataSubject/DataRepository.php +191 -191
  44. src/DataSubject/DataSubjectAdmin.php +17 -17
  45. src/DataSubject/DataSubjectAuthenticator.php +130 -130
  46. src/DataSubject/DataSubjectIdentificator.php +184 -184
  47. src/Helpers.php +170 -170
  48. src/Installer/Installer.php +303 -303
  49. src/Installer/InstallerStep.php +200 -200
  50. src/Installer/Steps/ConfigurationPages.php +61 -61
  51. src/Installer/Steps/ConfigurationSettings.php +71 -71
  52. src/Installer/Steps/Consent.php +30 -30
  53. src/Installer/Steps/Integrations.php +47 -48
  54. src/Installer/Steps/PolicyContents.php +31 -31
  55. src/Installer/Steps/PolicySettings.php +215 -215
  56. src/Modules/ContactForm7/ContactForm7.php +108 -108
  57. src/Modules/WPML/WPML.php +153 -153
  58. src/Router.php +166 -166
  59. src/Setup.php +94 -93
  60. src/SetupAdmin.php +62 -62
  61. src/Updater/Updater.php +47 -0
  62. src/View.php +64 -64
  63. vendor/autoload.php +1 -1
  64. vendor/composer/autoload_real.php +7 -7
  65. vendor/composer/autoload_static.php +3 -3
  66. views/admin/consent.php +105 -105
  67. views/admin/data-subjects/search-form.php +18 -18
  68. views/admin/data-subjects/search-results.php +33 -33
  69. views/admin/general/delete-action-email.php +7 -7
  70. views/admin/general/delete-action-reassign.php +11 -11
  71. views/admin/general/delete-action.php +2 -2
  72. views/admin/general/description-data-page.php +3 -3
  73. views/admin/general/description-delete-action.php +3 -3
  74. views/admin/general/description-export-action.php +3 -3
  75. views/admin/general/description-terms-page.php +3 -3
  76. views/admin/general/enable.php +13 -13
  77. views/admin/general/export-action-email.php +7 -7
  78. views/admin/general/stylesheet.php +10 -10
  79. views/admin/general/theme-compatibility.php +10 -10
  80. views/admin/modals/footer.php +6 -6
  81. views/admin/modals/header.php +5 -5
  82. views/admin/modals/test.php +8 -8
  83. views/admin/notices/disclaimer.php +16 -16
  84. views/admin/notices/error.php +3 -3
  85. views/admin/notices/header.php +4 -4
  86. views/admin/notices/help.php +3 -3
  87. views/admin/notices/helper-autoinstall.php +10 -10
  88. views/admin/notices/helper-policy.php +9 -9
  89. views/admin/notices/helper-tools.php +10 -10
  90. views/admin/privacy-policy/description-policy-page.php +3 -3
  91. views/admin/privacy-policy/dpa.php +2 -2
  92. views/admin/privacy-policy/generated.php +21 -21
  93. views/admin/privacy-policy/header.php +3 -3
  94. views/admin/settings-page.php +46 -46
  95. views/admin/support/contents.php +62 -62
  96. views/admin/wizard-buttons.php +5 -5
  97. views/email/action-export.php +9 -9
  98. views/email/action-forget.php +13 -13
  99. views/email/identify-data-subject.php +11 -11
  100. views/email/no-data.php +6 -6
  101. views/email/request-export.php +14 -14
  102. views/email/request-forget.php +14 -14
  103. views/global/country-options.php +23 -23
  104. views/global/delete-action.php +20 -20
  105. views/global/export-action.php +14 -14
  106. views/global/html-data.php +38 -38
  107. views/installer/continue-notice.php +10 -10
  108. views/installer/footer.php +41 -41
  109. views/installer/header.php +64 -64
  110. views/installer/steps/configuration-pages.php +37 -37
  111. views/installer/steps/configuration-settings.php +87 -87
  112. views/installer/steps/consent.php +87 -87
  113. views/installer/steps/disclaimer.php +21 -21
  114. views/installer/steps/finish.php +69 -69
  115. views/installer/steps/integrations.php +52 -52
  116. views/installer/steps/policy-contents.php +25 -25
  117. views/installer/steps/policy-settings.php +185 -185
  118. views/installer/steps/welcome.php +18 -18
  119. views/installer/welcome-notice.php +16 -16
  120. views/modules/contact-form-7/content-privacy.php +5 -5
  121. views/modules/contact-form-7/generator-privacy.php +17 -17
  122. views/modules/wordpress-comments/terms-checkbox.php +20 -20
  123. views/modules/wordpress-user/dashboard/data-page/form-consent.php +39 -39
  124. views/modules/wordpress-user/dashboard/data-page/form-delete.php +30 -30
  125. views/modules/wordpress-user/dashboard/data-page/header.php +3 -3
  126. views/modules/wordpress-user/dashboard/form-export.php +24 -24
  127. views/modules/wordpress-user/dashboard/profile-page/form-delete.php +29 -29
  128. views/modules/wordpress-user/dashboard/profile-page/header.php +8 -8
  129. views/modules/wordpress-user/dashboard/profile-page/table-consent.php +18 -18
  130. views/modules/wordpress-user/registration-terms-checkbox.php +21 -21
  131. views/policy/policy.php +283 -283
  132. views/privacy-tools/form-consent.php +39 -39
  133. views/privacy-tools/form-delete.php +18 -18
  134. views/privacy-tools/form-export.php +26 -26
  135. views/privacy-tools/form-identify.php +30 -28
  136. views/privacy-tools/notice-admin-role.php +6 -6
  137. views/privacy-tools/notices.php +25 -25
  138. views/privacy-tools/privacy-tools.php +13 -13
  139. views/themes/storefront/footer.php +8 -8
  140. views/themes/twentyseventeen/footer.php +9 -9
  141. views/themes/twentysixteen/footer.php +12 -12
assets/conditional-show.js CHANGED
@@ -1,102 +1,102 @@
1
- jQuery(function ($) {
2
-
3
- var trigger = function () {
4
- $('.js-gdpr-conditional').each(function () {
5
- conditionalShow($(this));
6
- });
7
- };
8
-
9
- var conditionalShow = function ($el) {
10
- var type = $el.prop('tagName');
11
- if ('SELECT' === type) {
12
- conditionalShowSelect($el);
13
- } else if ('INPUT' === type) {
14
- if ('checkbox' === $el.attr('type')) {
15
- conditionalShowCheckbox($el);
16
- } else if ('radio' === $el.attr('type')) {
17
- conditionalShowRadio($el);
18
- } else {
19
- console.log('Unknown element type: ' + type);
20
- }
21
- } else {
22
- console.log('Unknown element type: ' + type);
23
- }
24
- };
25
-
26
- var conditionalShowSelect = function ($el) {
27
- $targets = [];
28
- $el.find('option').each(function () {
29
- if ($(this).data('show')) {
30
- $targets.push($(this).data('show'));
31
- }
32
- });
33
-
34
- $.each($targets, function (i, e) {
35
- $(e).hide();
36
- });
37
-
38
- if ($el.is(':visible')) {
39
- $el.find('option:selected').each(function () {
40
- if ($(this).data('show')) {
41
- $($(this).data('show')).show();
42
- }
43
- });
44
- }
45
- }
46
-
47
- var conditionalShowCheckbox = function ($el) {
48
- if ($el.is(':checked') && $el.is(':visible')) {
49
- if ($el.data('show')) {
50
- if (isChange) {
51
- $($el.data('show')).addClass('slidePadding').slideDown();
52
- } else {
53
- $($el.data('show')).show();
54
- }
55
- }
56
- } else {
57
- if ($el.data('show')) {
58
- if (isChange) {
59
- $($el.data('show')).addClass('slidePadding').slideUp();
60
- } else {
61
- $($el.data('show')).hide();
62
- }
63
- }
64
- }
65
- };
66
-
67
- var conditionalShowRadio = function ($el) {
68
- $el.closest('fieldset').find('input[type=radio]').each(function (i, el) {
69
- if ($(el).is(':checked') && $el.is(':visible')) {
70
- if ($(el).data('show')) {
71
- if (isChange) {
72
- $($(el).data('show')).addClass('slidePadding').slideDown();
73
- } else {
74
- $($(el).data('show')).show();
75
- }
76
- }
77
- } else {
78
- if ($(el).data('show')) {
79
- if (isChange) {
80
- $($(el).data('show')).addClass('slidePadding').slideUp();
81
- } else {
82
- $($(el).data('show')).hide();
83
- }
84
- }
85
- }
86
- });
87
- };
88
-
89
- var isChange = false;
90
-
91
- $('.js-gdpr-conditional').each(function () {
92
- $(this).on('change', function () {
93
- isChange = true;
94
- conditionalShow($(this));
95
-
96
- // Hacky solution for 2nd layer of nested items
97
- trigger();
98
- });
99
- conditionalShow($(this));
100
- });
101
-
102
- });
1
+ jQuery(function ($) {
2
+
3
+ var trigger = function () {
4
+ $('.js-gdpr-conditional').each(function () {
5
+ conditionalShow($(this));
6
+ });
7
+ };
8
+
9
+ var conditionalShow = function ($el) {
10
+ var type = $el.prop('tagName');
11
+ if ('SELECT' === type) {
12
+ conditionalShowSelect($el);
13
+ } else if ('INPUT' === type) {
14
+ if ('checkbox' === $el.attr('type')) {
15
+ conditionalShowCheckbox($el);
16
+ } else if ('radio' === $el.attr('type')) {
17
+ conditionalShowRadio($el);
18
+ } else {
19
+ console.log('Unknown element type: ' + type);
20
+ }
21
+ } else {
22
+ console.log('Unknown element type: ' + type);
23
+ }
24
+ };
25
+
26
+ var conditionalShowSelect = function ($el) {
27
+ $targets = [];
28
+ $el.find('option').each(function () {
29
+ if ($(this).data('show')) {
30
+ $targets.push($(this).data('show'));
31
+ }
32
+ });
33
+
34
+ $.each($targets, function (i, e) {
35
+ $(e).hide();
36
+ });
37
+
38
+ if ($el.is(':visible')) {
39
+ $el.find('option:selected').each(function () {
40
+ if ($(this).data('show')) {
41
+ $($(this).data('show')).show();
42
+ }
43
+ });
44
+ }
45
+ }
46
+
47
+ var conditionalShowCheckbox = function ($el) {
48
+ if ($el.is(':checked') && $el.is(':visible')) {
49
+ if ($el.data('show')) {
50
+ if (isChange) {
51
+ $($el.data('show')).addClass('slidePadding').slideDown();
52
+ } else {
53
+ $($el.data('show')).show();
54
+ }
55
+ }
56
+ } else {
57
+ if ($el.data('show')) {
58
+ if (isChange) {
59
+ $($el.data('show')).addClass('slidePadding').slideUp();
60
+ } else {
61
+ $($el.data('show')).hide();
62
+ }
63
+ }
64
+ }
65
+ };
66
+
67
+ var conditionalShowRadio = function ($el) {
68
+ $el.closest('fieldset').find('input[type=radio]').each(function (i, el) {
69
+ if ($(el).is(':checked') && $el.is(':visible')) {
70
+ if ($(el).data('show')) {
71
+ if (isChange) {
72
+ $($(el).data('show')).addClass('slidePadding').slideDown();
73
+ } else {
74
+ $($(el).data('show')).show();
75
+ }
76
+ }
77
+ } else {
78
+ if ($(el).data('show')) {
79
+ if (isChange) {
80
+ $($(el).data('show')).addClass('slidePadding').slideUp();
81
+ } else {
82
+ $($(el).data('show')).hide();
83
+ }
84
+ }
85
+ }
86
+ });
87
+ };
88
+
89
+ var isChange = false;
90
+
91
+ $('.js-gdpr-conditional').each(function () {
92
+ $(this).on('change', function () {
93
+ isChange = true;
94
+ conditionalShow($(this));
95
+
96
+ // Hacky solution for 2nd layer of nested items
97
+ trigger();
98
+ });
99
+ conditionalShow($(this));
100
+ });
101
+
102
+ });
assets/gdpr-admin.css CHANGED
@@ -1,362 +1,362 @@
1
- /** Admin notice **/
2
- .notice-gdpr {
3
- border-left-color: #0095a8;
4
- overflow: hidden;
5
- }
6
-
7
- .notice-gdpr img {
8
- width: 100px;
9
- margin: 25px 0;
10
- float: left;
11
- }
12
-
13
- .notice-gdpr .gdpr-content {
14
- float: left;
15
- width: calc(100% - 120px);
16
- padding-left: 20px;
17
- padding-bottom: 15px;
18
- }
19
-
20
- /** Modal window **/
21
- .gdpr-modal {
22
- max-width: 1200px;
23
- }
24
-
25
- .gdpr-modal li {
26
- list-style-type: disc;
27
- margin-left: 20px;
28
- }
29
-
30
- .gdpr-modal-footer {
31
- background: #fcfcfc;
32
- border-top: 1px solid #dfdfdf;
33
- padding: 10px 0;
34
- }
35
-
36
- /** General **/
37
- .gdpr-framework-wrap table {
38
- table-layout: fixed;
39
- border-spacing: 0;
40
- }
41
-
42
- .gdpr-framework-wrap input {
43
- margin: 0;
44
- }
45
-
46
- .gdpr-framework-wrap .gdpr-select {
47
- width: 300px;
48
- max-width: 90%;
49
- height: 32px;
50
- border-color: #ddd;
51
- background-color: #fff;
52
- border: 1px solid #aaa;
53
- border-radius: 4px;
54
- box-sizing: border-box;
55
- cursor: pointer;
56
- display: block;
57
- padding: 0 6px;
58
- color: #666;
59
- }
60
-
61
- .gdpr-framework-wrap .select2-container {
62
- display: block;
63
- width: 300px;
64
- max-width: 100%;
65
-
66
- }
67
-
68
- .gdpr-framework-wrap .select2-container--default .select2-selection--single .select2-selection__arrow,
69
- .gdpr-framework-wrap .select2-container--default .select2-selection--single {
70
- height: 32px !important;
71
- }
72
-
73
- .gdpr-framework-wrap .select2-container--default .select2-selection--single .select2-selection__arrow b {
74
- border-width: 6px 3px 0 3px;
75
- margin-left: -2px;
76
- margin-top: -3px;
77
- border-color: #666 transparent transparent transparent;
78
- }
79
-
80
- .gdpr-framework-wrap .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
81
- border-color: transparent transparent #666 transparent;
82
- border-width: 0 3px 6px 3px;
83
- }
84
-
85
- .gdpr-framework-wrap input {
86
- border-radius: 4px;
87
- border: 1px solid #aaa;
88
- box-shadow: none;
89
- height: 32px;
90
- line-height: 28px;
91
- min-width: 300px;
92
- max-width: 100%;
93
- }
94
-
95
- .gdpr-framework-wrap textarea {
96
- border-radius: 4px;
97
- border: 1px solid #aaa;
98
- box-shadow: none;
99
- height: 32px;
100
- line-height: 28px;
101
- }
102
-
103
- .gdpr-framework-wrap .select2-container input {
104
- min-width: 0;
105
- }
106
-
107
- .gdpr-framework-wrap input[type=checkbox] {
108
- line-height: initial;
109
- height: 16px;
110
- min-width: 0;
111
- }
112
-
113
- .gdpr-framework-wrap input[type=submit] {
114
- min-width: 0;
115
- }
116
-
117
- .gdpr-framework-wrap input[type=button] {
118
- min-width: 0;
119
- }
120
-
121
- .gdpr-framework-wrap .wp-editor-wrap {
122
- width: 720px;
123
- max-width: 100%;
124
- }
125
-
126
- .gdpr-framework-wrap .nav-tab-highlight {
127
- background: #ffa200;
128
- color: #fff;
129
- font-weight: 700;
130
- border-bottom: 1px solid #ccc;
131
- }
132
-
133
- .gdpr-framework-wrap .nav-tab-highlight:hover {
134
- background: #ffc35c;
135
- color: #fff;
136
- }
137
-
138
- .gdpr-framework-wrap .nav-tab-highlight:focus {
139
- box-shadow: 0 0 2px 1px #5b9cd9;
140
- }
141
-
142
- /* Consent tables */
143
- .gdpr-framework-wrap .gdpr-consent,
144
- .gdpr-framework-wrap .gdpr-consent-admin {
145
- table-layout: auto;
146
- }
147
-
148
- .gdpr-consent-user {
149
- border-collapse: collapse;
150
- }
151
-
152
- .gdpr-consent-user th {
153
- padding-bottom: 10px;
154
- }
155
-
156
- .gdpr-consent-user td,
157
- .gdpr-consent-user th {
158
- border: 1px solid #ccc;
159
- }
160
-
161
- .gdpr-consent-user tr:first-child th {
162
- border: 0;
163
- }
164
-
165
- .gdpr-consent th {
166
- text-align: left;
167
- }
168
-
169
- .gdpr-consent td {
170
- padding-right: 16px;
171
- }
172
-
173
- .gdpr-consent-admin th {
174
- text-align: left;
175
- padding-bottom: 16px;
176
- }
177
-
178
- .gdpr-consent-admin + .button {
179
- margin-top: 16px;
180
- }
181
-
182
- .gdpr-consent-admin td {
183
- padding-right: 16px;
184
- vertical-align: top;
185
- padding-bottom: 20px;
186
- }
187
-
188
- .gdpr-framework-wrap .gdpr-consent-admin input {
189
- min-width: 0;
190
- }
191
-
192
- .gdpr-consent-table-desc {
193
- width: 450px;
194
- }
195
-
196
- .gdpr-consent-table-input {
197
- width: 200px;
198
- }
199
-
200
- .gdpr-consent-table-input input {
201
- width: 100%;
202
- }
203
-
204
- .gdpr-consent-table-desc textarea {
205
- width: 100%;
206
- min-height: 100px;
207
- }
208
-
209
- .gdpr-consent-add-button {
210
- text-align: right;
211
- width: 1051px;
212
- }
213
-
214
- .gdpr-consent-user {
215
- table-layout: auto;
216
- }
217
-
218
- .gdpr-consent-user td {
219
- padding: 15px;
220
- }
221
-
222
- .gdpr-consent-user-title {
223
- width: 200px;
224
- }
225
-
226
- .gdpr-consent-user-desc {
227
- width: 450px;
228
- }
229
-
230
- /* support page */
231
- .gdpr-framework-wrap .align-center {
232
- text-align: center;
233
- }
234
-
235
- .gdpr-framework-wrap .section {
236
- margin: 25px 0;
237
- max-width: 720px;
238
- }
239
-
240
- .gdpr-framework-wrap .row {
241
- box-sizing: border-box;
242
- display: -webkit-box;
243
- display: -ms-flexbox;
244
- display: flex;
245
- -ms-flex-wrap: wrap;
246
- flex-wrap: wrap;
247
- margin-right: -8px;
248
- margin-left: -8px;
249
- -webkit-box-pack: center !important;
250
- -ms-flex-pack: center !important;
251
- justify-content: center !important;
252
- }
253
-
254
- .gdpr-framework-wrap .col {
255
- box-sizing: border-box;
256
- position: relative;
257
- width: 100%;
258
- min-height: 1px;
259
- padding-right: 8px;
260
- padding-left: 8px;
261
- margin-bottom: 15px;
262
- }
263
-
264
- @media (min-width: 576px) {
265
- .gdpr-framework-wrap .col {
266
- -webkit-box-flex: 0;
267
- -ms-flex: 0 0 50%;
268
- flex: 0 0 50%;
269
- max-width: 50%;
270
- }
271
- }
272
-
273
- @media (min-width: 768px) {
274
- .gdpr-framework-wrap .col {
275
- -webkit-box-flex: 0;
276
- -ms-flex: 0 0 33.33333%;
277
- flex: 0 0 33.33333%;
278
- max-width: 33.33333%;
279
- }
280
- }
281
-
282
- .gdpr-framework-wrap .col .button {
283
- display: block;
284
- text-align: center;
285
- }
286
-
287
- .gdpr-framework-wrap .col_image {
288
- background-position: center;
289
- background-repeat: no-repeat;
290
- background-size: cover;
291
- border-radius: 6px;
292
- background-color: #e5e5e5;
293
- padding-bottom: 60%;
294
- margin-bottom: 15px;
295
- position: relative;
296
- }
297
-
298
- .gdpr-framework-wrap .col_image:after {
299
- content: '';
300
- position: absolute;
301
- top: 0;
302
- left: 0;
303
- width: 100%;
304
- height: 100%;
305
- background-color: #ffa200;
306
- opacity: .15;
307
- }
308
-
309
- .gdpr-framework-wrap .col .button {
310
- font-size: 14px;
311
- line-height: 28px;
312
- padding: 4px 15px;
313
- height: auto;
314
- border: 1px solid #ccc;
315
- box-shadow: 0 1px 0 #ccc;
316
- -webkit-box-shadow: 0 1px 1px #ccc;
317
- transition: .1s;
318
- }
319
-
320
- .gdpr-framework-wrap .col .button:hover {
321
- box-shadow: 0 1px 1px #ccc;
322
- -webkit-box-shadow: 0 1px 1px #ccc;
323
- border: 1px solid #ccc;
324
- background: #fff;
325
- }
326
-
327
- .gdpr-framework-wrap .col .button:focus {
328
- box-shadow: 0 0 2px 1px #5b9cd9;
329
- }
330
-
331
- .gdpr-framework-wrap .col .button-primary {
332
- background-color: #ffa200;
333
- border-color: #ffa200;
334
- color: #fff;
335
- text-shadow: none;
336
- -webkit-box-shadow: 0 1px 1px #ccc;
337
- box-shadow: 0 1px 1px #ccc;
338
- }
339
-
340
- .gdpr-framework-wrap .col .button-primary:hover {
341
- background: #ffc35c;
342
- border-color: #ffc35c;
343
- color: #fff;
344
- }
345
-
346
- .gdpr-framework-wrap .col .button-primary:active,
347
- .gdpr-framework-wrap .col .button-primary:focus {
348
- background-color: #ffa200;
349
- border-color: #ccc;
350
- color: #fff;
351
- box-shadow: 0 0 2px 1px #5b9cd9;
352
- }
353
-
354
- .gdpr-framework-wrap .col p {
355
- font-size: 14px;
356
- line-height: 26px;
357
- color: #555;
358
- }
359
-
360
- .gdpr-framework-wrap .col p:last-child {
361
- margin-bottom: 0;
362
- }
1
+ /** Admin notice **/
2
+ .notice-gdpr {
3
+ border-left-color: #0095a8;
4
+ overflow: hidden;
5
+ }
6
+
7
+ .notice-gdpr img {
8
+ width: 100px;
9
+ margin: 25px 0;
10
+ float: left;
11
+ }
12
+
13
+ .notice-gdpr .gdpr-content {
14
+ float: left;
15
+ width: calc(100% - 120px);
16
+ padding-left: 20px;
17
+ padding-bottom: 15px;
18
+ }
19
+
20
+ /** Modal window **/
21
+ .gdpr-modal {
22
+ max-width: 1200px;
23
+ }
24
+
25
+ .gdpr-modal li {
26
+ list-style-type: disc;
27
+ margin-left: 20px;
28
+ }
29
+
30
+ .gdpr-modal-footer {
31
+ background: #fcfcfc;
32
+ border-top: 1px solid #dfdfdf;
33
+ padding: 10px 0;
34
+ }
35
+
36
+ /** General **/
37
+ .gdpr-framework-wrap table {
38
+ table-layout: fixed;
39
+ border-spacing: 0;
40
+ }
41
+
42
+ .gdpr-framework-wrap input {
43
+ margin: 0;
44
+ }
45
+
46
+ .gdpr-framework-wrap .gdpr-select {
47
+ width: 300px;
48
+ max-width: 90%;
49
+ height: 32px;
50
+ border-color: #ddd;
51
+ background-color: #fff;
52
+ border: 1px solid #aaa;
53
+ border-radius: 4px;
54
+ box-sizing: border-box;
55
+ cursor: pointer;
56
+ display: block;
57
+ padding: 0 6px;
58
+ color: #666;
59
+ }
60
+
61
+ .gdpr-framework-wrap .select2-container {
62
+ display: block;
63
+ width: 300px;
64
+ max-width: 100%;
65
+
66
+ }
67
+
68
+ .gdpr-framework-wrap .select2-container--default .select2-selection--single .select2-selection__arrow,
69
+ .gdpr-framework-wrap .select2-container--default .select2-selection--single {
70
+ height: 32px !important;
71
+ }
72
+
73
+ .gdpr-framework-wrap .select2-container--default .select2-selection--single .select2-selection__arrow b {
74
+ border-width: 6px 3px 0 3px;
75
+ margin-left: -2px;
76
+ margin-top: -3px;
77
+ border-color: #666 transparent transparent transparent;
78
+ }
79
+
80
+ .gdpr-framework-wrap .select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b {
81
+ border-color: transparent transparent #666 transparent;
82
+ border-width: 0 3px 6px 3px;
83
+ }
84
+
85
+ .gdpr-framework-wrap input {
86
+ border-radius: 4px;
87
+ border: 1px solid #aaa;
88
+ box-shadow: none;
89
+ height: 32px;
90
+ line-height: 28px;
91
+ min-width: 300px;
92
+ max-width: 100%;
93
+ }
94
+
95
+ .gdpr-framework-wrap textarea {
96
+ border-radius: 4px;
97
+ border: 1px solid #aaa;
98
+ box-shadow: none;
99
+ height: 32px;
100
+ line-height: 28px;
101
+ }
102
+
103
+ .gdpr-framework-wrap .select2-container input {
104
+ min-width: 0;
105
+ }
106
+
107
+ .gdpr-framework-wrap input[type=checkbox] {
108
+ line-height: initial;
109
+ height: 16px;
110
+ min-width: 0;
111
+ }
112
+
113
+ .gdpr-framework-wrap input[type=submit] {
114
+ min-width: 0;
115
+ }
116
+
117
+ .gdpr-framework-wrap input[type=button] {
118
+ min-width: 0;
119
+ }
120
+
121
+ .gdpr-framework-wrap .wp-editor-wrap {
122
+ width: 720px;
123
+ max-width: 100%;
124
+ }
125
+
126
+ .gdpr-framework-wrap .nav-tab-highlight {
127
+ background: #ffa200;
128
+ color: #fff;
129
+ font-weight: 700;
130
+ border-bottom: 1px solid #ccc;
131
+ }
132
+
133
+ .gdpr-framework-wrap .nav-tab-highlight:hover {
134
+ background: #ffc35c;
135
+ color: #fff;
136
+ }
137
+
138
+ .gdpr-framework-wrap .nav-tab-highlight:focus {
139
+ box-shadow: 0 0 2px 1px #5b9cd9;
140
+ }
141
+
142
+ /* Consent tables */
143
+ .gdpr-framework-wrap .gdpr-consent,
144
+ .gdpr-framework-wrap .gdpr-consent-admin {
145
+ table-layout: auto;
146
+ }
147
+
148
+ .gdpr-consent-user {
149
+ border-collapse: collapse;
150
+ }
151
+
152
+ .gdpr-consent-user th {
153
+ padding-bottom: 10px;
154
+ }
155
+
156
+ .gdpr-consent-user td,
157
+ .gdpr-consent-user th {
158
+ border: 1px solid #ccc;
159
+ }
160
+
161
+ .gdpr-consent-user tr:first-child th {
162
+ border: 0;
163
+ }
164
+
165
+ .gdpr-consent th {
166
+ text-align: left;
167
+ }
168
+
169
+ .gdpr-consent td {
170
+ padding-right: 16px;
171
+ }
172
+
173
+ .gdpr-consent-admin th {
174
+ text-align: left;
175
+ padding-bottom: 16px;
176
+ }
177
+
178
+ .gdpr-consent-admin + .button {
179
+ margin-top: 16px;
180
+ }
181
+
182
+ .gdpr-consent-admin td {
183
+ padding-right: 16px;
184
+ vertical-align: top;
185
+ padding-bottom: 20px;
186
+ }
187
+
188
+ .gdpr-framework-wrap .gdpr-consent-admin input {
189
+ min-width: 0;
190
+ }
191
+
192
+ .gdpr-consent-table-desc {
193
+ width: 450px;
194
+ }
195
+
196
+ .gdpr-consent-table-input {
197
+ width: 200px;
198
+ }
199
+
200
+ .gdpr-consent-table-input input {
201
+ width: 100%;
202
+ }
203
+
204
+ .gdpr-consent-table-desc textarea {
205
+ width: 100%;
206
+ min-height: 100px;
207
+ }
208
+
209
+ .gdpr-consent-add-button {
210
+ text-align: right;
211
+ width: 1051px;
212
+ }
213
+
214
+ .gdpr-consent-user {
215
+ table-layout: auto;
216
+ }
217
+
218
+ .gdpr-consent-user td {
219
+ padding: 15px;
220
+ }
221
+
222
+ .gdpr-consent-user-title {
223
+ width: 200px;
224
+ }
225
+
226
+ .gdpr-consent-user-desc {
227
+ width: 450px;
228
+ }
229
+
230
+ /* support page */
231
+ .gdpr-framework-wrap .align-center {
232
+ text-align: center;
233
+ }
234
+
235
+ .gdpr-framework-wrap .section {
236
+ margin: 25px 0;
237
+ max-width: 720px;
238
+ }
239
+
240
+ .gdpr-framework-wrap .row {
241
+ box-sizing: border-box;
242
+ display: -webkit-box;
243
+ display: -ms-flexbox;
244
+ display: flex;
245
+ -ms-flex-wrap: wrap;
246
+ flex-wrap: wrap;
247
+ margin-right: -8px;
248
+ margin-left: -8px;
249
+ -webkit-box-pack: center !important;
250
+ -ms-flex-pack: center !important;
251
+ justify-content: center !important;
252
+ }
253
+
254
+ .gdpr-framework-wrap .col {
255
+ box-sizing: border-box;
256
+ position: relative;
257
+ width: 100%;
258
+ min-height: 1px;
259
+ padding-right: 8px;
260
+ padding-left: 8px;
261
+ margin-bottom: 15px;
262
+ }
263
+
264
+ @media (min-width: 576px) {
265
+ .gdpr-framework-wrap .col {
266
+ -webkit-box-flex: 0;
267
+ -ms-flex: 0 0 50%;
268
+ flex: 0 0 50%;
269
+ max-width: 50%;
270
+ }
271
+ }
272
+
273
+ @media (min-width: 768px) {
274
+ .gdpr-framework-wrap .col {
275
+ -webkit-box-flex: 0;
276
+ -ms-flex: 0 0 33.33333%;
277
+ flex: 0 0 33.33333%;
278
+ max-width: 33.33333%;
279
+ }
280
+ }
281
+
282
+ .gdpr-framework-wrap .col .button {
283
+ display: block;
284
+ text-align: center;
285
+ }
286
+
287
+ .gdpr-framework-wrap .col_image {
288
+ background-position: center;
289
+ background-repeat: no-repeat;
290
+ background-size: cover;
291
+ border-radius: 6px;
292
+ background-color: #e5e5e5;
293
+ padding-bottom: 60%;
294
+ margin-bottom: 15px;
295
+ position: relative;
296
+ }
297
+
298
+ .gdpr-framework-wrap .col_image:after {
299
+ content: '';
300
+ position: absolute;
301
+ top: 0;
302
+ left: 0;
303
+ width: 100%;
304
+ height: 100%;
305
+ background-color: #ffa200;
306
+ opacity: .15;
307
+ }
308
+
309
+ .gdpr-framework-wrap .col .button {
310
+ font-size: 14px;
311
+ line-height: 28px;
312
+ padding: 4px 15px;
313
+ height: auto;
314
+ border: 1px solid #ccc;
315
+ box-shadow: 0 1px 0 #ccc;
316
+ -webkit-box-shadow: 0 1px 1px #ccc;
317
+ transition: .1s;
318
+ }
319
+
320
+ .gdpr-framework-wrap .col .button:hover {
321
+ box-shadow: 0 1px 1px #ccc;
322
+ -webkit-box-shadow: 0 1px 1px #ccc;
323
+ border: 1px solid #ccc;
324
+ background: #fff;
325
+ }
326
+
327
+ .gdpr-framework-wrap .col .button:focus {
328
+ box-shadow: 0 0 2px 1px #5b9cd9;
329
+ }
330
+
331
+ .gdpr-framework-wrap .col .button-primary {
332
+ background-color: #ffa200;
333
+ border-color: #ffa200;
334
+ color: #fff;
335
+ text-shadow: none;
336
+ -webkit-box-shadow: 0 1px 1px #ccc;
337
+ box-shadow: 0 1px 1px #ccc;
338
+ }
339
+
340
+ .gdpr-framework-wrap .col .button-primary:hover {
341
+ background: #ffc35c;
342
+ border-color: #ffc35c;
343
+ color: #fff;
344
+ }
345
+
346
+ .gdpr-framework-wrap .col .button-primary:active,
347
+ .gdpr-framework-wrap .col .button-primary:focus {
348
+ background-color: #ffa200;
349
+ border-color: #ccc;
350
+ color: #fff;
351
+ box-shadow: 0 0 2px 1px #5b9cd9;
352
+ }
353
+
354
+ .gdpr-framework-wrap .col p {
355
+ font-size: 14px;
356
+ line-height: 26px;
357
+ color: #555;
358
+ }
359
+
360
+ .gdpr-framework-wrap .col p:last-child {
361
+ margin-bottom: 0;
362
+ }
assets/gdpr-admin.js CHANGED
@@ -1,102 +1,102 @@
1
- jQuery(function ($) {
2
-
3
- // Handler to open the modal dialog
4
- $(document).on('click', '.gdpr-open-modal', function (e) {
5
- $($(this).data('gdpr-modal-target')).dialog('open');
6
- e.preventDefault();
7
- });
8
-
9
- // Initialize all modals on page
10
- $('.gdpr-modal').each(function (i, e) {
11
- var $base = $(this);
12
-
13
- $base.dialog({
14
- title: $base.data('gdpr-title'),
15
- dialogClass: 'wp-dialog',
16
- autoOpen: false,
17
- draggable: false,
18
- width: 'auto',
19
- modal: true,
20
- resizable: false,
21
- closeOnEscape: true,
22
- position: {
23
- my: "center",
24
- at: "center",
25
- of: window
26
- },
27
- create: function () {
28
- // style fix for WordPress admin
29
- $('.ui-dialog-titlebar-close').addClass('ui-button');
30
- },
31
- open: function () {
32
- // Bind a click on the overlay to close the dialog
33
- $('.ui-widget-overlay').bind('click', function () {
34
- $base.dialog('close');
35
- });
36
-
37
- // Bind a custom close button to close the dialog
38
- $base.find('.gdpr-close-modal').bind('click', function (e) {
39
- $base.dialog('close');
40
- e.preventDefault();
41
- });
42
-
43
- // Fix overlay CSS issues in admin
44
- $('.wp-dialog').css('z-index', 9999);
45
- $('.ui-widget-overlay').css('z-index', 9998);
46
- },
47
- close: function () {
48
- $('.wp-dialog').css('z-index', 101);
49
- $('.ui-widget-overlay').css('z-index', 100);
50
- }
51
- });
52
- });
53
-
54
- /**
55
- * https://github.com/DubFriend/jquery.repeater
56
- */
57
- $('.js-gdpr-repeater').each(function () {
58
- var $repeater = $(this).repeater({
59
- isFirstItemUndeletable: true
60
- });
61
-
62
- if (typeof window.repeaterData[$(this).data('name')] !== undefined) {
63
- $repeater.setList(window.repeaterData[$(this).data('name')]);
64
- }
65
- });
66
-
67
- /**
68
- * Init select2
69
- */
70
- $('.js-gdpr-select2').select2({
71
- width: 'style'
72
- });
73
-
74
- /**
75
- * Auto-fill DPA info
76
- */
77
- $('.js-gdpr-country-selector').on('change', function () {
78
- var dpaData, $website, $email, $phone;
79
- var countryCode = $(this).val();
80
-
81
- if (!window.gdprDpaData[countryCode]) {
82
- return;
83
- }
84
-
85
- dpaData = window.gdprDpaData[countryCode];
86
-
87
- $website = $('#gdpr_dpa_website');
88
- if ('' === $website.data('set')) {
89
- $website.val(dpaData['website']);
90
- }
91
-
92
- $email = $('#gdpr_dpa_email');
93
- if ('' === $email.data('set')) {
94
- $email.val(dpaData['email']);
95
- }
96
-
97
- $phone = $('#gdpr_dpa_phone');
98
- if ('' === $phone.data('set')) {
99
- $phone.val(dpaData['phone']);
100
- }
101
- });
102
- });
1
+ jQuery(function ($) {
2
+
3
+ // Handler to open the modal dialog
4
+ $(document).on('click', '.gdpr-open-modal', function (e) {
5
+ $($(this).data('gdpr-modal-target')).dialog('open');
6
+ e.preventDefault();
7
+ });
8
+
9
+ // Initialize all modals on page
10
+ $('.gdpr-modal').each(function (i, e) {
11
+ var $base = $(this);
12
+
13
+ $base.dialog({
14
+ title: $base.data('gdpr-title'),
15
+ dialogClass: 'wp-dialog',
16
+ autoOpen: false,
17
+ draggable: false,
18
+ width: 'auto',
19
+ modal: true,
20
+ resizable: false,
21
+ closeOnEscape: true,
22
+ position: {
23
+ my: "center",
24
+ at: "center",
25
+ of: window
26
+ },
27
+ create: function () {
28
+ // style fix for WordPress admin
29
+ $('.ui-dialog-titlebar-close').addClass('ui-button');
30
+ },
31
+ open: function () {
32
+ // Bind a click on the overlay to close the dialog
33
+ $('.ui-widget-overlay').bind('click', function () {
34
+ $base.dialog('close');
35
+ });
36
+
37
+ // Bind a custom close button to close the dialog
38
+ $base.find('.gdpr-close-modal').bind('click', function (e) {
39
+ $base.dialog('close');
40
+ e.preventDefault();
41
+ });
42
+
43
+ // Fix overlay CSS issues in admin
44
+ $('.wp-dialog').css('z-index', 9999);
45
+ $('.ui-widget-overlay').css('z-index', 9998);
46
+ },
47
+ close: function () {
48
+ $('.wp-dialog').css('z-index', 101);
49
+ $('.ui-widget-overlay').css('z-index', 100);
50
+ }
51
+ });
52
+ });
53
+
54
+ /**
55
+ * https://github.com/DubFriend/jquery.repeater
56
+ */
57
+ $('.js-gdpr-repeater').each(function () {
58
+ var $repeater = $(this).repeater({
59
+ isFirstItemUndeletable: true
60
+ });
61
+
62
+ if (typeof window.repeaterData[$(this).data('name')] !== undefined) {
63
+ $repeater.setList(window.repeaterData[$(this).data('name')]);
64
+ }
65
+ });
66
+
67
+ /**
68
+ * Init select2
69
+ */
70
+ $('.js-gdpr-select2').select2({
71
+ width: 'style'
72
+ });
73
+
74
+ /**
75
+ * Auto-fill DPA info
76
+ */
77
+ $('.js-gdpr-country-selector').on('change', function () {
78
+ var dpaData, $website, $email, $phone;
79
+ var countryCode = $(this).val();
80
+
81
+ if (!window.gdprDpaData[countryCode]) {
82
+ return;
83
+ }
84
+
85
+ dpaData = window.gdprDpaData[countryCode];
86
+
87
+ $website = $('#gdpr_dpa_website');
88
+ if ('' === $website.data('set')) {
89
+ $website.val(dpaData['website']);
90
+ }
91
+
92
+ $email = $('#gdpr_dpa_email');
93
+ if ('' === $email.data('set')) {
94
+ $email.val(dpaData['email']);
95
+ }
96
+
97
+ $phone = $('#gdpr_dpa_phone');
98
+ if ('' === $phone.data('set')) {
99
+ $phone.val(dpaData['phone']);
100
+ }
101
+ });
102
+ });
assets/gdpr-installer.css CHANGED
@@ -1,550 +1,550 @@
1
- .gdpr-installer-container {
2
- max-width: 720px;
3
- margin: 30px auto;
4
- font-size: 14px;
5
- }
6
-
7
- .gdpr-step-button-prev {
8
- display: block;
9
- float: left;
10
- }
11
-
12
- .gdpr-step-button-next {
13
- display: block;
14
- float: right;
15
- }
16
-
17
- .gdpr-header {
18
- margin: 0 auto 30px;
19
- overflow: hidden;
20
- padding: 0 16px;
21
- text-align: center;
22
- }
23
-
24
- .gdpr-header_left {
25
- float: left;
26
- width: 100%;
27
- }
28
-
29
- .gdpr-header_right {
30
- float: left;
31
- width: 100%;
32
- }
33
-
34
- @media (min-width: 576px) {
35
- .gdpr-header {
36
- text-align: left;
37
- }
38
-
39
- .gdpr-header_left {
40
- width: 175px;
41
- padding-right: 15px;
42
- padding-top: 25px;
43
- }
44
-
45
- .gdpr-header_right {
46
- width: calc(100% - 235px);
47
- }
48
- }
49
-
50
- @media (min-width: 768px) {
51
- .gdpr-header {
52
- padding: 0;
53
- }
54
- }
55
-
56
- .gdpr-logo {
57
- width: 100px;
58
- }
59
-
60
- .gdpr-header h1 {
61
- font-size: 1.8em;
62
- line-height: normal;
63
- margin-top: 15px;
64
- margin-bottom: 20px;
65
- font-weight: 700;
66
- }
67
-
68
- .gdpr-header h2 {
69
- float: left;
70
- }
71
-
72
- .gdpr-installer .gdpr-content {
73
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .13);
74
- box-shadow: 0 1px 3px rgba(0, 0, 0, .13);
75
- padding: 16px;
76
- margin: 0 0 20px;
77
- background: #fff;
78
- overflow: hidden;
79
- zoom: 1;
80
- }
81
-
82
- .gdpr-installer .spacer {
83
- margin-top: 2em;
84
- }
85
-
86
- .gdpr-installer .gdpr-content p {
87
- font-size: 14px;
88
- line-height: 26px;
89
- color: #555;
90
- }
91
-
92
- .gdpr-installer .gdpr-content p:last-child {
93
- margin-bottom: 0;
94
- }
95
-
96
- .gdpr-content a {
97
- color: #0095a7;
98
- font-weight: 700;
99
- text-decoration: none;
100
- box-shadow: none;
101
- }
102
-
103
- .gdpr-content a:hover,
104
- .gdpr-content a:focus {
105
- outline: none;
106
- text-decoration: none;
107
- color: #000;
108
- }
109
-
110
- .gdpr-installer .gdpr-content li {
111
- margin-left: 20px;
112
- list-style-type: disc;
113
- }
114
-
115
- .gdpr-installer .gdpr-content select {
116
- height: 32px;
117
- border-color: #ddd;
118
- background-color: #fff;
119
- border: 1px solid #aaa;
120
- border-radius: 4px;
121
- box-sizing: border-box;
122
- cursor: pointer;
123
- display: block;
124
- padding: 0 6px;
125
- color: #666;
126
- }
127
-
128
- .select2-container .select2-selection--single {
129
- height: 32px !important;
130
- }
131
-
132
- .gdpr-installer .gdpr-content h1 {
133
- font-weight: 700;
134
- line-height: normal;
135
- }
136
-
137
- .gdpr-installer .gdpr-content h2 {
138
- font-size: 22px;
139
- line-height: 32px;
140
- font-weight: 700;
141
- }
142
-
143
- .gdpr-installer .gdpr-content h3 {
144
- font-size: 18px;
145
- line-height: 22px;
146
- font-weight: 700;
147
- }
148
-
149
- .wp-core-ui .button {
150
- font-size: 14px;
151
- line-height: 28px;
152
- padding: 4px 15px;
153
- height: auto;
154
- border: 1px solid #ccc;
155
- box-shadow: 0 1px 0 #ccc;
156
- -webkit-box-shadow: 0 1px 1px #ccc;
157
- transition: .1s;
158
- }
159
-
160
- .wp-core-ui .button:hover {
161
- box-shadow: 0 1px 1px #ccc;
162
- -webkit-box-shadow: 0 1px 1px #ccc;
163
- border: 1px solid #ccc;
164
- background: #fff;
165
- }
166
-
167
- .wp-core-ui .button:focus {
168
- box-shadow: 0 0 2px 1px #5b9cd9;
169
- }
170
-
171
- .wp-core-ui .button-gdpr {
172
- background: #0095a8;
173
- border-color: #0095a8;
174
- -webkit-box-shadow: 0 1px 1px #ccc;
175
- box-shadow: 0 1px 1px #ccc;
176
- color: #fff;
177
- text-decoration: none;
178
- transition: .1s;
179
- }
180
-
181
- .wp-core-ui .button-gdpr:hover {
182
- background: #79c2cb;
183
- border-color: #79c2cb;
184
- color: #fff;
185
- }
186
-
187
- .wp-core-ui .button-gdpr:active,
188
- .wp-core-ui .button-gdpr:focus {
189
- background: #0095a8;
190
- border-color: #ccc;
191
- color: #fff;
192
- box-shadow: 0 0 2px 1px #5b9cd9;
193
- }
194
-
195
- .wp-core-ui .button-primary {
196
- background-color: #ffa200;
197
- border-color: #ffa200;
198
- color: #fff;
199
- text-shadow: none;
200
- -webkit-box-shadow: 0 1px 1px #ccc;
201
- box-shadow: 0 1px 1px #ccc;
202
- }
203
-
204
- .wp-core-ui .button-primary:hover {
205
- background: #ffc35c;
206
- border-color: #ffc35c;
207
- color: #fff;
208
- }
209
-
210
- .wp-core-ui .button-primary:active,
211
- .wp-core-ui .button-primary:focus {
212
- background-color: #ffa200;
213
- border-color: #ccc;
214
- color: #fff;
215
- box-shadow: 0 0 2px 1px #5b9cd9;
216
- }
217
-
218
- .wp-core-ui.gdpr-installer .button-right {
219
- float: right;
220
- }
221
-
222
- .wp-core-ui .button.button-gdpr-large {
223
- font-size: 14px;
224
- padding: 4px 15px;
225
- height: auto;
226
- }
227
-
228
- .gdpr-footer-links {
229
- text-align: center;
230
- }
231
-
232
- .wp-core-ui .button-center {
233
- display: block;
234
- margin: 25px auto 10px;
235
- }
236
-
237
- .gdpr-installer label {
238
- color: #666;
239
- font-size: 14px;
240
- font-weight: 500;
241
- margin-bottom: .5em;
242
- margin-top: 1em;
243
- display: block;
244
- cursor: pointer;
245
- }
246
-
247
- .gdpr-installer input[type=text],
248
- .gdpr-installer input[type=email] {
249
- border: 1px solid #aaa;
250
- border-color: #ddd;
251
- border-radius: 4px;
252
- height: 30px;
253
- width: calc(100% - 8px - 24px - 2px);
254
- padding-left: 8px;
255
- padding-right: 24px;
256
- color: #444;
257
- background-color: #fff;
258
- display: inline-block;
259
- }
260
-
261
- .gdpr-installer input + em {
262
- display: block;
263
- margin-top: 5px;
264
- }
265
-
266
- .gdpr-installer .select2 + em {
267
- display: block;
268
- margin-top: 5px;
269
- }
270
-
271
- .gdpr-installer textarea {
272
- width: calc(100% - 8px - 24px - 2px);
273
- height: 80px;
274
- }
275
-
276
- .gdpr-installer .select2-container {
277
- display: block;
278
- width: 300px;
279
- max-width: 100%;
280
- }
281
-
282
- .gdpr-select {
283
- width: 300px;
284
- max-width: 100%;
285
- }
286
-
287
- .hidden {
288
- display: none;
289
- }
290
-
291
- .gdpr-installer fieldset {
292
- margin: -20px 0 0 0;
293
- }
294
-
295
- .wp-core-ui .button-side {
296
- min-width: 220px;
297
- text-align: center;
298
- margin-right: 15px;
299
- }
300
-
301
- .align-center {
302
- text-align: center;
303
- }
304
-
305
- .section {
306
- margin: 25px 0;
307
- }
308
-
309
- .row {
310
- box-sizing: border-box;
311
- display: -webkit-box;
312
- display: -ms-flexbox;
313
- display: flex;
314
- -ms-flex-wrap: wrap;
315
- flex-wrap: wrap;
316
- margin-right: -8px;
317
- margin-left: -8px;
318
- -webkit-box-pack: center !important;
319
- -ms-flex-pack: center !important;
320
- justify-content: center !important;
321
- }
322
-
323
- .col {
324
- box-sizing: border-box;
325
- position: relative;
326
- width: 100%;
327
- min-height: 1px;
328
- padding-right: 8px;
329
- padding-left: 8px;
330
- margin-bottom: 15px;
331
- }
332
-
333
- @media (min-width: 576px) {
334
- .col {
335
- -webkit-box-flex: 0;
336
- -ms-flex: 0 0 50%;
337
- flex: 0 0 50%;
338
- max-width: 50%;
339
- }
340
- }
341
-
342
- @media (min-width: 768px) {
343
- .col {
344
- -webkit-box-flex: 0;
345
- -ms-flex: 0 0 33.33333%;
346
- flex: 0 0 33.33333%;
347
- max-width: 33.33333%;
348
- }
349
- }
350
-
351
- .wp-core-ui .col .button {
352
- display: block;
353
- text-align: center;
354
- }
355
-
356
- .col_image {
357
- background-position: center;
358
- background-repeat: no-repeat;
359
- background-size: cover;
360
- border-radius: 6px;
361
- background-color: #e5e5e5;
362
- padding-bottom: 60%;
363
- margin-bottom: 15px;
364
- position: relative;
365
- }
366
-
367
- .col_image:after {
368
- content: '';
369
- position: absolute;
370
- top: 0;
371
- left: 0;
372
- width: 100%;
373
- height: 100%;
374
- background-color: #ffa200;
375
- opacity: .15;
376
- }
377
-
378
- /* jQuery UI hacks */
379
- .ui-tabs {
380
- position: relative;
381
- padding: .2em;
382
- }
383
-
384
- .ui-tabs-nav {
385
- margin: 0;
386
- padding: .2em .2em 0;
387
- }
388
-
389
- .ui-helper-clearfix {
390
- min-height: 0;
391
- }
392
-
393
- .ui-helper-reset {
394
- margin: 0;
395
- padding: 0;
396
- border: 0;
397
- outline: 0;
398
- line-height: 1.3;
399
- text-decoration: none;
400
- font-size: 100%;
401
- list-style: none;
402
- }
403
-
404
- .ui-helper-clearfix:before, .ui-helper-clearfix:after {
405
- content: "";
406
- display: table;
407
- border-collapse: collapse;
408
- }
409
-
410
- .ui-helper-clearfix:after {
411
- clear: both;
412
- }
413
-
414
- .ui-tabs .ui-tabs-nav li {
415
- list-style: none;
416
- float: left;
417
- position: relative;
418
- top: 0;
419
- margin: 1px .2em 0 0;
420
- border-bottom-width: 0;
421
- padding: 0;
422
- white-space: nowrap;
423
- background: #eee;
424
- }
425
-
426
- .ui-tabs .ui-tabs-nav .ui-tabs-anchor {
427
- float: left;
428
- padding: .5em 1em;
429
- text-decoration: none;
430
- }
431
-
432
- .ui-tabs .ui-tabs-nav li.ui-tabs-active {
433
- background: #fff;
434
- }
435
-
436
- .handle {
437
- cursor: move;
438
- }
439
-
440
- .gdpr-table {
441
- width: 100%;
442
- }
443
-
444
- .gdpr-footer-links {
445
- padding-bottom: 50px;
446
- }
447
-
448
- .slidePadding {
449
- display: block;
450
- padding-top: 1px;
451
- padding-bottom: 1px;
452
- }
453
-
454
- .gdpr-installer p.error {
455
- font-size: 16px;
456
- font-weight: 700;
457
- color: #e34639;
458
- }
459
-
460
- /* gdpr-breadcrumbs */
461
- .gdpr-breadcrumbs {
462
- margin-bottom: 22px;
463
- }
464
-
465
- .gdpr-breadcrumbs:after {
466
- display: block;
467
- clear: both;
468
- content: '';
469
- }
470
-
471
- .gdpr-breadcrumbs_unit {
472
- box-sizing: border-box;
473
- float: left;
474
- width: 50%;
475
- font-size: 14px;
476
- line-height: 26px;
477
- padding-right: 15px;
478
- }
479
-
480
- .gdpr-breadcrumbs_unit:nth-child(3),
481
- .gdpr-breadcrumbs_unit:nth-child(4) {
482
- margin-top: 10px;
483
- }
484
-
485
- .gdpr-breadcrumbs_item {
486
- background-color: #dddddd;
487
- padding: 2px 0;
488
- text-align: center;
489
- position: relative;
490
- color: #555555;
491
- padding-left: 8px;
492
- }
493
-
494
- .gdpr-breadcrumbs_item:after {
495
- position: absolute;
496
- right: -15px;
497
- top: 0;
498
- content: '';
499
- width: 0;
500
- height: 0;
501
- border-style: solid;
502
- border-width: 15px 0 15px 15px;
503
- border-color: transparent transparent transparent #dddddd;
504
- }
505
-
506
- .gdpr-breadcrumbs_item:before {
507
- position: absolute;
508
- left: 0;
509
- top: 0;
510
- content: '';
511
- width: 0;
512
- height: 0;
513
- border-style: solid;
514
- border-width: 15px 0 15px 15px;
515
- border-color: transparent transparent transparent #f1f1f1;
516
- }
517
-
518
- .gdpr-breadcrumbs_unit.active .gdpr-breadcrumbs_item {
519
- background-color: #0095a8;
520
- color: #fff;
521
- font-weight: 700;
522
- }
523
-
524
- .gdpr-breadcrumbs_unit.active .gdpr-breadcrumbs_item:after {
525
- border-color: transparent transparent transparent #0095a8;
526
- }
527
-
528
- .gdpr-breadcrumbs_unit:first-child .gdpr-breadcrumbs_item:before,
529
- .gdpr-breadcrumbs_unit:last-child .gdpr-breadcrumbs_item:after {
530
- display: none;
531
- }
532
-
533
- .gdpr-breadcrumbs_unit:last-child {
534
- padding: 0;
535
- }
536
-
537
- .gdpr-breadcrumbs_unit:last-child .gdpr-breadcrumbs_item {
538
- padding-left: 0;
539
- }
540
-
541
- @media (min-width: 576px) {
542
- .gdpr-breadcrumbs_unit {
543
- width: 25%;
544
- }
545
-
546
- .gdpr-breadcrumbs_unit:nth-child(3),
547
- .gdpr-breadcrumbs_unit:nth-child(4) {
548
- margin-top: 0;
549
- }
550
- }
1
+ .gdpr-installer-container {
2
+ max-width: 720px;
3
+ margin: 30px auto;
4
+ font-size: 14px;
5
+ }
6
+
7
+ .gdpr-step-button-prev {
8
+ display: block;
9
+ float: left;
10
+ }
11
+
12
+ .gdpr-step-button-next {
13
+ display: block;
14
+ float: right;
15
+ }
16
+
17
+ .gdpr-header {
18
+ margin: 0 auto 30px;
19
+ overflow: hidden;
20
+ padding: 0 16px;
21
+ text-align: center;
22
+ }
23
+
24
+ .gdpr-header_left {
25
+ float: left;
26
+ width: 100%;
27
+ }
28
+
29
+ .gdpr-header_right {
30
+ float: left;
31
+ width: 100%;
32
+ }
33
+
34
+ @media (min-width: 576px) {
35
+ .gdpr-header {
36
+ text-align: left;
37
+ }
38
+
39
+ .gdpr-header_left {
40
+ width: 175px;
41
+ padding-right: 15px;
42
+ padding-top: 25px;
43
+ }
44
+
45
+ .gdpr-header_right {
46
+ width: calc(100% - 235px);
47
+ }
48
+ }
49
+
50
+ @media (min-width: 768px) {
51
+ .gdpr-header {
52
+ padding: 0;
53
+ }
54
+ }
55
+
56
+ .gdpr-logo {
57
+ width: 100px;
58
+ }
59
+
60
+ .gdpr-header h1 {
61
+ font-size: 1.8em;
62
+ line-height: normal;
63
+ margin-top: 15px;
64
+ margin-bottom: 20px;
65
+ font-weight: 700;
66
+ }
67
+
68
+ .gdpr-header h2 {
69
+ float: left;
70
+ }
71
+
72
+ .gdpr-installer .gdpr-content {
73
+ -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .13);
74
+ box-shadow: 0 1px 3px rgba(0, 0, 0, .13);
75
+ padding: 16px;
76
+ margin: 0 0 20px;
77
+ background: #fff;
78
+ overflow: hidden;
79
+ zoom: 1;
80
+ }
81
+
82
+ .gdpr-installer .spacer {
83
+ margin-top: 2em;
84
+ }
85
+
86
+ .gdpr-installer .gdpr-content p {
87
+ font-size: 14px;
88
+ line-height: 26px;
89
+ color: #555;
90
+ }
91
+
92
+ .gdpr-installer .gdpr-content p:last-child {
93
+ margin-bottom: 0;
94
+ }
95
+
96
+ .gdpr-content a {
97
+ color: #0095a7;
98
+ font-weight: 700;
99
+ text-decoration: none;
100
+ box-shadow: none;
101
+ }
102
+
103
+ .gdpr-content a:hover,
104
+ .gdpr-content a:focus {
105
+ outline: none;
106
+ text-decoration: none;
107
+ color: #000;
108
+ }
109
+
110
+ .gdpr-installer .gdpr-content li {
111
+ margin-left: 20px;
112
+ list-style-type: disc;
113
+ }
114
+
115
+ .gdpr-installer .gdpr-content select {
116
+ height: 32px;
117
+ border-color: #ddd;
118
+ background-color: #fff;
119
+ border: 1px solid #aaa;
120
+ border-radius: 4px;
121
+ box-sizing: border-box;
122
+ cursor: pointer;
123
+ display: block;
124
+ padding: 0 6px;
125
+ color: #666;
126
+ }
127
+
128
+ .select2-container .select2-selection--single {
129
+ height: 32px !important;
130
+ }
131
+
132
+ .gdpr-installer .gdpr-content h1 {
133
+ font-weight: 700;
134
+ line-height: normal;
135
+ }
136
+
137
+ .gdpr-installer .gdpr-content h2 {
138
+ font-size: 22px;
139
+ line-height: 32px;
140
+ font-weight: 700;
141
+ }
142
+
143
+ .gdpr-installer .gdpr-content h3 {
144
+ font-size: 18px;
145
+ line-height: 22px;
146
+ font-weight: 700;
147
+ }
148
+
149
+ .wp-core-ui .button {
150
+ font-size: 14px;
151
+ line-height: 28px;
152
+ padding: 4px 15px;
153
+ height: auto;
154
+ border: 1px solid #ccc;
155
+ box-shadow: 0 1px 0 #ccc;
156
+ -webkit-box-shadow: 0 1px 1px #ccc;
157
+ transition: .1s;
158
+ }
159
+
160
+ .wp-core-ui .button:hover {
161
+ box-shadow: 0 1px 1px #ccc;
162
+ -webkit-box-shadow: 0 1px 1px #ccc;
163
+ border: 1px solid #ccc;
164
+ background: #fff;
165
+ }
166
+
167
+ .wp-core-ui .button:focus {
168
+ box-shadow: 0 0 2px 1px #5b9cd9;
169
+ }
170
+
171
+ .wp-core-ui .button-gdpr {
172
+ background: #0095a8;
173
+ border-color: #0095a8;
174
+ -webkit-box-shadow: 0 1px 1px #ccc;
175
+ box-shadow: 0 1px 1px #ccc;
176
+ color: #fff;
177
+ text-decoration: none;
178
+ transition: .1s;
179
+ }
180
+
181
+ .wp-core-ui .button-gdpr:hover {
182
+ background: #79c2cb;
183
+ border-color: #79c2cb;
184
+ color: #fff;
185
+ }
186
+
187
+ .wp-core-ui .button-gdpr:active,
188
+ .wp-core-ui .button-gdpr:focus {
189
+ background: #0095a8;
190
+ border-color: #ccc;
191
+ color: #fff;
192
+ box-shadow: 0 0 2px 1px #5b9cd9;
193
+ }
194
+
195
+ .wp-core-ui .button-primary {
196
+ background-color: #ffa200;
197
+ border-color: #ffa200;
198
+ color: #fff;
199
+ text-shadow: none;
200
+ -webkit-box-shadow: 0 1px 1px #ccc;
201
+ box-shadow: 0 1px 1px #ccc;
202
+ }
203
+
204
+ .wp-core-ui .button-primary:hover {
205
+ background: #ffc35c;
206
+ border-color: #ffc35c;
207
+ color: #fff;
208
+ }
209
+
210
+ .wp-core-ui .button-primary:active,
211
+ .wp-core-ui .button-primary:focus {
212
+ background-color: #ffa200;
213
+ border-color: #ccc;
214
+ color: #fff;
215
+ box-shadow: 0 0 2px 1px #5b9cd9;
216
+ }
217
+
218
+ .wp-core-ui.gdpr-installer .button-right {
219
+ float: right;
220
+ }
221
+
222
+ .wp-core-ui .button.button-gdpr-large {
223
+ font-size: 14px;
224
+ padding: 4px 15px;
225
+ height: auto;
226
+ }
227
+
228
+ .gdpr-footer-links {
229
+ text-align: center;
230
+ }
231
+
232
+ .wp-core-ui .button-center {
233
+ display: block;
234
+ margin: 25px auto 10px;
235
+ }
236
+
237
+ .gdpr-installer label {
238
+ color: #666;
239
+ font-size: 14px;
240
+ font-weight: 500;
241
+ margin-bottom: .5em;
242
+ margin-top: 1em;
243
+ display: block;
244
+ cursor: pointer;
245
+ }
246
+
247
+ .gdpr-installer input[type=text],
248
+ .gdpr-installer input[type=email] {
249
+ border: 1px solid #aaa;
250
+ border-color: #ddd;
251
+ border-radius: 4px;
252
+ height: 30px;
253
+ width: calc(100% - 8px - 24px - 2px);
254
+ padding-left: 8px;
255
+ padding-right: 24px;
256
+ color: #444;
257
+ background-color: #fff;
258
+ display: inline-block;
259
+ }
260
+
261
+ .gdpr-installer input + em {
262
+ display: block;
263
+ margin-top: 5px;
264
+ }
265
+
266
+ .gdpr-installer .select2 + em {
267
+ display: block;
268
+ margin-top: 5px;
269
+ }
270
+
271
+ .gdpr-installer textarea {
272
+ width: calc(100% - 8px - 24px - 2px);
273
+ height: 80px;
274
+ }
275
+
276
+ .gdpr-installer .select2-container {
277
+ display: block;
278
+ width: 300px;
279
+ max-width: 100%;
280
+ }
281
+
282
+ .gdpr-select {
283
+ width: 300px;
284
+ max-width: 100%;
285
+ }
286
+
287
+ .hidden {
288
+ display: none;
289
+ }
290
+
291
+ .gdpr-installer fieldset {
292
+ margin: -20px 0 0 0;
293
+ }
294
+
295
+ .wp-core-ui .button-side {
296
+ min-width: 220px;
297
+ text-align: center;
298
+ margin-right: 15px;
299
+ }
300
+
301
+ .align-center {
302
+ text-align: center;
303
+ }
304
+
305
+ .section {
306
+ margin: 25px 0;
307
+ }
308
+
309
+ .row {
310
+ box-sizing: border-box;
311
+ display: -webkit-box;
312
+ display: -ms-flexbox;
313
+ display: flex;
314
+ -ms-flex-wrap: wrap;
315
+ flex-wrap: wrap;
316
+ margin-right: -8px;
317
+ margin-left: -8px;
318
+ -webkit-box-pack: center !important;
319
+ -ms-flex-pack: center !important;
320
+ justify-content: center !important;
321
+ }
322
+
323
+ .col {
324
+ box-sizing: border-box;
325
+ position: relative;
326
+ width: 100%;
327
+ min-height: 1px;
328
+ padding-right: 8px;
329
+ padding-left: 8px;
330
+ margin-bottom: 15px;
331
+ }
332
+
333
+ @media (min-width: 576px) {
334
+ .col {
335
+ -webkit-box-flex: 0;
336
+ -ms-flex: 0 0 50%;
337
+ flex: 0 0 50%;
338
+ max-width: 50%;
339
+ }
340
+ }
341
+
342
+ @media (min-width: 768px) {
343
+ .col {
344
+ -webkit-box-flex: 0;
345
+ -ms-flex: 0 0 33.33333%;
346
+ flex: 0 0 33.33333%;
347
+ max-width: 33.33333%;
348
+ }
349
+ }
350
+
351
+ .wp-core-ui .col .button {
352
+ display: block;
353
+ text-align: center;
354
+ }
355
+
356
+ .col_image {
357
+ background-position: center;
358
+ background-repeat: no-repeat;
359
+ background-size: cover;
360
+ border-radius: 6px;
361
+ background-color: #e5e5e5;
362
+ padding-bottom: 60%;
363
+ margin-bottom: 15px;
364
+ position: relative;
365
+ }
366
+
367
+ .col_image:after {
368
+ content: '';
369
+ position: absolute;
370
+ top: 0;
371
+ left: 0;
372
+ width: 100%;
373
+ height: 100%;
374
+ background-color: #ffa200;
375
+ opacity: .15;
376
+ }
377
+
378
+ /* jQuery UI hacks */
379
+ .ui-tabs {
380
+ position: relative;
381
+ padding: .2em;
382
+ }
383
+
384
+ .ui-tabs-nav {
385
+ margin: 0;
386
+ padding: .2em .2em 0;
387
+ }
388
+
389
+ .ui-helper-clearfix {
390
+ min-height: 0;
391
+ }
392
+
393
+ .ui-helper-reset {
394
+ margin: 0;
395
+ padding: 0;
396
+ border: 0;
397
+ outline: 0;
398
+ line-height: 1.3;
399
+ text-decoration: none;
400
+ font-size: 100%;
401
+ list-style: none;
402
+ }
403
+
404
+ .ui-helper-clearfix:before, .ui-helper-clearfix:after {
405
+ content: "";
406
+ display: table;
407
+ border-collapse: collapse;
408
+ }
409
+
410
+ .ui-helper-clearfix:after {
411
+ clear: both;
412
+ }
413
+
414
+ .ui-tabs .ui-tabs-nav li {
415
+ list-style: none;
416
+ float: left;
417
+ position: relative;
418
+ top: 0;
419
+ margin: 1px .2em 0 0;
420
+ border-bottom-width: 0;
421
+ padding: 0;
422
+ white-space: nowrap;
423
+ background: #eee;
424
+ }
425
+
426
+ .ui-tabs .ui-tabs-nav .ui-tabs-anchor {
427
+ float: left;
428
+ padding: .5em 1em;
429
+ text-decoration: none;
430
+ }
431
+
432
+ .ui-tabs .ui-tabs-nav li.ui-tabs-active {
433
+ background: #fff;
434
+ }
435
+
436
+ .handle {
437
+ cursor: move;
438
+ }
439
+
440
+ .gdpr-table {
441
+ width: 100%;
442
+ }
443
+
444
+ .gdpr-footer-links {
445
+ padding-bottom: 50px;
446
+ }
447
+
448
+ .slidePadding {
449
+ display: block;
450
+ padding-top: 1px;
451
+ padding-bottom: 1px;
452
+ }
453
+
454
+ .gdpr-installer p.error {
455
+ font-size: 16px;
456
+ font-weight: 700;
457
+ color: #e34639;
458
+ }
459
+
460
+ /* gdpr-breadcrumbs */
461
+ .gdpr-breadcrumbs {
462
+ margin-bottom: 22px;
463
+ }
464
+
465
+ .gdpr-breadcrumbs:after {
466
+ display: block;
467
+ clear: both;
468
+ content: '';
469
+ }
470
+
471
+ .gdpr-breadcrumbs_unit {
472
+ box-sizing: border-box;
473
+ float: left;
474
+ width: 50%;
475
+ font-size: 14px;
476
+ line-height: 26px;
477
+ padding-right: 15px;
478
+ }
479
+
480
+ .gdpr-breadcrumbs_unit:nth-child(3),
481
+ .gdpr-breadcrumbs_unit:nth-child(4) {
482
+ margin-top: 10px;
483
+ }
484
+
485
+ .gdpr-breadcrumbs_item {
486
+ background-color: #dddddd;
487
+ padding: 2px 0;
488
+ text-align: center;
489
+ position: relative;
490
+ color: #555555;
491
+ padding-left: 8px;
492
+ }
493
+
494
+ .gdpr-breadcrumbs_item:after {
495
+ position: absolute;
496
+ right: -15px;
497
+ top: 0;
498
+ content: '';
499
+ width: 0;
500
+ height: 0;
501
+ border-style: solid;
502
+ border-width: 15px 0 15px 15px;
503
+ border-color: transparent transparent transparent #dddddd;
504
+ }
505
+
506
+ .gdpr-breadcrumbs_item:before {
507
+ position: absolute;
508
+ left: 0;
509
+ top: 0;
510
+ content: '';
511
+ width: 0;
512
+ height: 0;
513
+ border-style: solid;
514
+ border-width: 15px 0 15px 15px;
515
+ border-color: transparent transparent transparent #f1f1f1;
516
+ }
517
+
518
+ .gdpr-breadcrumbs_unit.active .gdpr-breadcrumbs_item {
519
+ background-color: #0095a8;
520
+ color: #fff;
521
+ font-weight: 700;
522
+ }
523
+
524
+ .gdpr-breadcrumbs_unit.active .gdpr-breadcrumbs_item:after {
525
+ border-color: transparent transparent transparent #0095a8;
526
+ }
527
+
528
+ .gdpr-breadcrumbs_unit:first-child .gdpr-breadcrumbs_item:before,
529
+ .gdpr-breadcrumbs_unit:last-child .gdpr-breadcrumbs_item:after {
530
+ display: none;
531
+ }
532
+
533
+ .gdpr-breadcrumbs_unit:last-child {
534
+ padding: 0;
535
+ }
536
+
537
+ .gdpr-breadcrumbs_unit:last-child .gdpr-breadcrumbs_item {
538
+ padding-left: 0;
539
+ }
540
+
541
+ @media (min-width: 576px) {
542
+ .gdpr-breadcrumbs_unit {
543
+ width: 25%;
544
+ }
545
+
546
+ .gdpr-breadcrumbs_unit:nth-child(3),
547
+ .gdpr-breadcrumbs_unit:nth-child(4) {
548
+ margin-top: 0;
549
+ }
550
+ }
assets/gdpr-installer.js CHANGED
@@ -1,58 +1,58 @@
1
- jQuery(function ($) {
2
-
3
- /**
4
- * Init select2
5
- */
6
- $('.js-gdpr-select2').select2({
7
- width: 'style'
8
- });
9
-
10
- $('#tabs').tabs();
11
-
12
- $(".sortable").sortable();
13
-
14
- /**
15
- * https://github.com/DubFriend/jquery.repeater
16
- */
17
- $repeater = $('.js-gdpr-repeater');
18
- if ($repeater.length) {
19
- $repeater.repeater({
20
- ready: function (setIndexes) {
21
- $(".sortable").on('sortupdate', setIndexes);
22
- }
23
- });
24
-
25
- if (typeof window.gdprConsentTypes !== undefined) {
26
- $repeater.setList(window.gdprConsentTypes);
27
- }
28
- }
29
-
30
- /**
31
- * Auto-fill DPA info
32
- */
33
- $('.js-gdpr-country-selector').on('change', function () {
34
- var dpaData, $website, $email, $phone;
35
- var countryCode = $(this).val();
36
-
37
- if (!window.gdprDpaData[countryCode]) {
38
- return;
39
- }
40
-
41
- dpaData = window.gdprDpaData[countryCode];
42
-
43
- $website = $('#gdpr_dpa_website');
44
- if ('' === $website.data('set')) {
45
- $website.val(dpaData['website']);
46
- }
47
-
48
- $email = $('#gdpr_dpa_email');
49
- if ('' === $email.data('set')) {
50
- $email.val(dpaData['email']);
51
- }
52
-
53
- $phone = $('#gdpr_dpa_phone');
54
- if ('' === $phone.data('set')) {
55
- $phone.val(dpaData['phone']);
56
- }
57
- });
58
- });
1
+ jQuery(function ($) {
2
+
3
+ /**
4
+ * Init select2
5
+ */
6
+ $('.js-gdpr-select2').select2({
7
+ width: 'style'
8
+ });
9
+
10
+ $('#tabs').tabs();
11
+
12
+ $(".sortable").sortable();
13
+
14
+ /**
15
+ * https://github.com/DubFriend/jquery.repeater
16
+ */
17
+ $repeater = $('.js-gdpr-repeater');
18
+ if ($repeater.length) {
19
+ $repeater.repeater({
20
+ ready: function (setIndexes) {
21
+ $(".sortable").on('sortupdate', setIndexes);
22
+ }
23
+ });
24
+
25
+ if (typeof window.gdprConsentTypes !== undefined) {
26
+ $repeater.setList(window.gdprConsentTypes);
27
+ }
28
+ }
29
+
30
+ /**
31
+ * Auto-fill DPA info
32
+ */
33
+ $('.js-gdpr-country-selector').on('change', function () {
34
+ var dpaData, $website, $email, $phone;
35
+ var countryCode = $(this).val();
36
+
37
+ if (!window.gdprDpaData[countryCode]) {
38
+ return;
39
+ }
40
+
41
+ dpaData = window.gdprDpaData[countryCode];
42
+
43
+ $website = $('#gdpr_dpa_website');
44
+ if ('' === $website.data('set')) {
45
+ $website.val(dpaData['website']);
46
+ }
47
+
48
+ $email = $('#gdpr_dpa_email');
49
+ if ('' === $email.data('set')) {
50
+ $email.val(dpaData['email']);
51
+ }
52
+
53
+ $phone = $('#gdpr_dpa_phone');
54
+ if ('' === $phone.data('set')) {
55
+ $phone.val(dpaData['phone']);
56
+ }
57
+ });
58
+ });
assets/gdpr-rhino.svg CHANGED
@@ -1,42 +1,42 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
- <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
- viewBox="0 0 200 184.16" enable-background="new 0 0 200 184.16" xml:space="preserve">
5
- <path fill="#0095A8" d="M68.231,30.327l0.963,0.557l0.48-1.003c2.165-4.529,7.729-7.769,16.538-9.631
6
- c7.685-1.624,14.921-1.569,15.224-1.572l2.189,0.018l-0.753,2.055c-0.159,0.435-3.964,10.733-9.364,18.982l-0.795,1.215l1.41,0.346
7
- c0.189,0.047,10.648,2.551,24.498,2.551c11.416,0,25.137-1.703,37.298-7.886l0.839-0.427l-0.351-0.874
8
- c-2.805-6.968-9.737-13.46-20.045-18.775h-0.001c-14.728-7.591-34.4-11.771-55.393-11.771c-14.106,0-27.88,1.921-39.835,5.555
9
- l-1.864,0.567l1.519,1.219C49.318,18.297,59.321,25.176,68.231,30.327z"/>
10
- <path fill="#0095A8" d="M43.688,144.994l-0.763,0.659l0.643,0.775c10.468,12.634,22.864,23.576,36.845,32.524l0.554,0.354
11
- l0.554-0.355c16.89-10.809,31.363-24.421,43.019-40.458c1.847-2.542,3.687-5.243,5.467-8.029l0.694-1.086l-1.213-0.436
12
- C88.19,114.118,58.004,132.637,43.688,144.994z"/>
13
- <path fill="#FFA200" d="M188.447,29.518l-1.785-4.136l-0.187,4.501c-0.127,3.055-0.367,6.079-0.714,8.99
14
- c-1.792,15.057-6.219,26.337-13.159,33.528c-6.032,6.251-13.877,9.226-23.271,8.822c-0.952-0.064-9.353-0.788-11.247-6.271
15
- c-1.457-4.214,1.406-9.483,8.753-16.11c9.307-8.394,15.282-16.207,18.266-23.883l1.416-3.641l-3.025,2.472
16
- c-6.804,5.562-18.86,12.356-37.652,13.132c-6.599,0.268-23.328,0.448-36.131-3.678l-2.078-0.67l1.326-1.734
17
- c4.231-5.538,7.811-13.361,9.568-17.531l0.643-1.526l-1.653,0.1c-5.844,0.354-23.189,1.406-25.986,13.83l-2.015-1.114
18
- c-15.573-8.61-28.39-18.81-33.177-22.796l-0.457-0.381l-0.558,0.207c-3.508,1.298-6.787,2.73-9.748,4.256
19
- c-13.84,7.135-21.463,16.3-21.463,25.808c0,0.228,0.113,23.103,9.867,51.417c5.736,16.65,13.638,31.952,23.486,45.481
20
- c0.835,1.147,1.745,2.354,2.863,3.798l0.663,0.856l0.821-0.706c17.757-15.277,55.164-36.702,106.178-8.553l0.483,0.266l0.489-0.255
21
- c5.617-2.93,34.134-19.045,43.894-48.605C198.522,68.234,197.038,49.436,188.447,29.518z"/>
22
- <circle fill="#1F1F1F" cx="113.832" cy="74.693" r="5.619"/>
23
- <path fill="#1F1F1F" d="M185.298,21.712c-1.757,8.569-3.513,36.397-15.654,47.833c-5.179,5.366-11.962,7.914-20.098,7.571
24
- c-2.04-0.14-6.484-0.559-7.574-3.508c-0.384-1.11-0.409-4.47,7.621-11.712c0,0,22.418-17.262,17.92-35.129
25
- c-2.391,2.179-4.928,4.074-7.563,5.728c-3.331-7.659-10.772-14.631-21.704-20.267C122.947,4.343,102.606,0,80.968,0
26
- C59.33,0,38.99,4.343,23.691,12.229C8.413,20.105,0,30.568,0,41.692c0,0.235,0.115,23.8,10.092,52.757
27
- c5.868,17.037,13.96,32.703,24.048,46.562c12.275,16.862,27.571,31.093,45.463,42.295l1.365,0.854l1.365-0.854
28
- c17.929-11.228,33.25-25.491,45.536-42.396c2.123-2.92,4.186-5.982,6.158-9.109c4.267,1.772,8.645,3.896,13.135,6.43l1.151,0.65
29
- l1.198-0.557c1.456-0.678,35.789-16.997,47.239-51.598C203.77,65.507,199.18,34.458,185.298,21.712z M135.89,16.798
30
- c10.121,5.219,16.848,11.504,19.563,18.245c-26.884,13.67-61.084,5.254-61.084,5.254c5.462-8.345,9.289-18.701,9.468-19.191
31
- l1.255-3.425l-3.648-0.03c-0.313-0.003-7.702-0.043-15.445,1.594c-9.158,1.936-14.94,5.356-17.253,10.194
32
- c-9.919-5.735-19.809-12.765-27.313-18.785c11.811-3.591,25.364-5.511,39.535-5.511C101.802,5.141,121.306,9.282,135.89,16.798z
33
- M123.709,137.888c-11.584,15.938-25.959,29.456-42.741,40.197c-13.937-8.919-26.209-19.762-36.608-32.313
34
- c14.376-12.409,44.108-30.461,84.781-15.862C127.393,132.646,125.574,135.323,123.709,137.888z M191.881,85.069
35
- c-9.592,29.05-37.389,44.883-43.393,48.015c-51.928-28.655-90.002-6.247-107.345,8.674c-0.964-1.244-1.917-2.498-2.845-3.774
36
- c-9.788-13.445-17.643-28.657-23.345-45.211C5.278,64.692,5.141,41.918,5.141,41.692c0-9.103,7.424-17.944,20.905-24.894
37
- c3.009-1.55,6.238-2.949,9.634-4.206c8.144,6.78,20.398,15.752,33.337,22.906l3.278,1.813c1.478-11.925,16.557-13.873,25.283-14.402
38
- c-1.852,4.394-5.332,11.933-9.437,17.306l-2.209,2.891l3.463,1.117c12.994,4.186,29.847,3.997,36.488,3.727
39
- c19.412-0.801,31.493-7.83,38.261-13.363c-2.078,5.345-6.463,13.09-17.996,23.492c-7.687,6.934-10.642,12.563-9.036,17.21
40
- c2.111,6.105,11.069,6.888,12.15,6.961c9.72,0.41,17.836-2.664,24.08-9.134c7.099-7.356,11.62-18.836,13.44-34.12
41
- c0.389-3.264,0.607-6.338,0.72-9.069C195.997,49.619,197.475,68.127,191.881,85.069z"/>
42
- </svg>
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <!-- Generator: Adobe Illustrator 21.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
+ <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
+ viewBox="0 0 200 184.16" enable-background="new 0 0 200 184.16" xml:space="preserve">
5
+ <path fill="#0095A8" d="M68.231,30.327l0.963,0.557l0.48-1.003c2.165-4.529,7.729-7.769,16.538-9.631
6
+ c7.685-1.624,14.921-1.569,15.224-1.572l2.189,0.018l-0.753,2.055c-0.159,0.435-3.964,10.733-9.364,18.982l-0.795,1.215l1.41,0.346
7
+ c0.189,0.047,10.648,2.551,24.498,2.551c11.416,0,25.137-1.703,37.298-7.886l0.839-0.427l-0.351-0.874
8
+ c-2.805-6.968-9.737-13.46-20.045-18.775h-0.001c-14.728-7.591-34.4-11.771-55.393-11.771c-14.106,0-27.88,1.921-39.835,5.555
9
+ l-1.864,0.567l1.519,1.219C49.318,18.297,59.321,25.176,68.231,30.327z"/>
10
+ <path fill="#0095A8" d="M43.688,144.994l-0.763,0.659l0.643,0.775c10.468,12.634,22.864,23.576,36.845,32.524l0.554,0.354
11
+ l0.554-0.355c16.89-10.809,31.363-24.421,43.019-40.458c1.847-2.542,3.687-5.243,5.467-8.029l0.694-1.086l-1.213-0.436
12
+ C88.19,114.118,58.004,132.637,43.688,144.994z"/>
13
+ <path fill="#FFA200" d="M188.447,29.518l-1.785-4.136l-0.187,4.501c-0.127,3.055-0.367,6.079-0.714,8.99
14
+ c-1.792,15.057-6.219,26.337-13.159,33.528c-6.032,6.251-13.877,9.226-23.271,8.822c-0.952-0.064-9.353-0.788-11.247-6.271
15
+ c-1.457-4.214,1.406-9.483,8.753-16.11c9.307-8.394,15.282-16.207,18.266-23.883l1.416-3.641l-3.025,2.472
16
+ c-6.804,5.562-18.86,12.356-37.652,13.132c-6.599,0.268-23.328,0.448-36.131-3.678l-2.078-0.67l1.326-1.734
17
+ c4.231-5.538,7.811-13.361,9.568-17.531l0.643-1.526l-1.653,0.1c-5.844,0.354-23.189,1.406-25.986,13.83l-2.015-1.114
18
+ c-15.573-8.61-28.39-18.81-33.177-22.796l-0.457-0.381l-0.558,0.207c-3.508,1.298-6.787,2.73-9.748,4.256
19
+ c-13.84,7.135-21.463,16.3-21.463,25.808c0,0.228,0.113,23.103,9.867,51.417c5.736,16.65,13.638,31.952,23.486,45.481
20
+ c0.835,1.147,1.745,2.354,2.863,3.798l0.663,0.856l0.821-0.706c17.757-15.277,55.164-36.702,106.178-8.553l0.483,0.266l0.489-0.255
21
+ c5.617-2.93,34.134-19.045,43.894-48.605C198.522,68.234,197.038,49.436,188.447,29.518z"/>
22
+ <circle fill="#1F1F1F" cx="113.832" cy="74.693" r="5.619"/>
23
+ <path fill="#1F1F1F" d="M185.298,21.712c-1.757,8.569-3.513,36.397-15.654,47.833c-5.179,5.366-11.962,7.914-20.098,7.571
24
+ c-2.04-0.14-6.484-0.559-7.574-3.508c-0.384-1.11-0.409-4.47,7.621-11.712c0,0,22.418-17.262,17.92-35.129
25
+ c-2.391,2.179-4.928,4.074-7.563,5.728c-3.331-7.659-10.772-14.631-21.704-20.267C122.947,4.343,102.606,0,80.968,0
26
+ C59.33,0,38.99,4.343,23.691,12.229C8.413,20.105,0,30.568,0,41.692c0,0.235,0.115,23.8,10.092,52.757
27
+ c5.868,17.037,13.96,32.703,24.048,46.562c12.275,16.862,27.571,31.093,45.463,42.295l1.365,0.854l1.365-0.854
28
+ c17.929-11.228,33.25-25.491,45.536-42.396c2.123-2.92,4.186-5.982,6.158-9.109c4.267,1.772,8.645,3.896,13.135,6.43l1.151,0.65
29
+ l1.198-0.557c1.456-0.678,35.789-16.997,47.239-51.598C203.77,65.507,199.18,34.458,185.298,21.712z M135.89,16.798
30
+ c10.121,5.219,16.848,11.504,19.563,18.245c-26.884,13.67-61.084,5.254-61.084,5.254c5.462-8.345,9.289-18.701,9.468-19.191
31
+ l1.255-3.425l-3.648-0.03c-0.313-0.003-7.702-0.043-15.445,1.594c-9.158,1.936-14.94,5.356-17.253,10.194
32
+ c-9.919-5.735-19.809-12.765-27.313-18.785c11.811-3.591,25.364-5.511,39.535-5.511C101.802,5.141,121.306,9.282,135.89,16.798z
33
+ M123.709,137.888c-11.584,15.938-25.959,29.456-42.741,40.197c-13.937-8.919-26.209-19.762-36.608-32.313
34
+ c14.376-12.409,44.108-30.461,84.781-15.862C127.393,132.646,125.574,135.323,123.709,137.888z M191.881,85.069
35
+ c-9.592,29.05-37.389,44.883-43.393,48.015c-51.928-28.655-90.002-6.247-107.345,8.674c-0.964-1.244-1.917-2.498-2.845-3.774
36
+ c-9.788-13.445-17.643-28.657-23.345-45.211C5.278,64.692,5.141,41.918,5.141,41.692c0-9.103,7.424-17.944,20.905-24.894
37
+ c3.009-1.55,6.238-2.949,9.634-4.206c8.144,6.78,20.398,15.752,33.337,22.906l3.278,1.813c1.478-11.925,16.557-13.873,25.283-14.402
38
+ c-1.852,4.394-5.332,11.933-9.437,17.306l-2.209,2.891l3.463,1.117c12.994,4.186,29.847,3.997,36.488,3.727
39
+ c19.412-0.801,31.493-7.83,38.261-13.363c-2.078,5.345-6.463,13.09-17.996,23.492c-7.687,6.934-10.642,12.563-9.036,17.21
40
+ c2.111,6.105,11.069,6.888,12.15,6.961c9.72,0.41,17.836-2.664,24.08-9.134c7.099-7.356,11.62-18.836,13.44-34.12
41
+ c0.389-3.264,0.607-6.338,0.72-9.069C195.997,49.619,197.475,68.127,191.881,85.069z"/>
42
+ </svg>
assets/privacy-tools.css CHANGED
@@ -1,30 +1,30 @@
1
- .gdpr-framework-privacy-tools .gdpr-notice {
2
- padding: 10px 20px;
3
- border: 1px solid #666;
4
- }
5
-
6
- .gdpr-framework-privacy-tools .gdpr-consent td {
7
- padding: 0.6em;
8
- }
9
-
10
- .gdpr-framework-privacy-tools .gdpr-consent td:first-child {
11
- padding-left: 0;
12
- }
13
-
14
- .gdpr-framework-privacy-tools .gdpr-consent td:last-child {
15
- padding-right: 0;
16
- }
17
-
18
- .gdpr-framework-privacy-tools .gdpr-download-button,
19
- .gdpr-framework-privacy-tools .gdpr-export-button,
20
- .gdpr-framework-privacy-tools .gdpr-delete-button {
21
- display: inline-block;
22
- margin-right: 10px;
23
- margin-bottom: 20px;
24
- }
25
-
26
- .gdpr-framework-privacy-tools .gdpr-download-button input.button,
27
- .gdpr-framework-privacy-tools .gdpr-export-button input.button,
28
- .gdpr-framework-privacy-tools .gdpr-delete-button input.button {
29
- min-width: 200px;
30
- }
1
+ .gdpr-framework-privacy-tools .gdpr-notice {
2
+ padding: 10px 20px;
3
+ border: 1px solid #666;
4
+ }
5
+
6
+ .gdpr-framework-privacy-tools .gdpr-consent td {
7
+ padding: 0.6em;
8
+ }
9
+
10
+ .gdpr-framework-privacy-tools .gdpr-consent td:first-child {
11
+ padding-left: 0;
12
+ }
13
+
14
+ .gdpr-framework-privacy-tools .gdpr-consent td:last-child {
15
+ padding-right: 0;
16
+ }
17
+
18
+ .gdpr-framework-privacy-tools .gdpr-download-button,
19
+ .gdpr-framework-privacy-tools .gdpr-export-button,
20
+ .gdpr-framework-privacy-tools .gdpr-delete-button {
21
+ display: inline-block;
22
+ margin-right: 10px;
23
+ margin-bottom: 20px;
24
+ }
25
+
26
+ .gdpr-framework-privacy-tools .gdpr-download-button input.button,
27
+ .gdpr-framework-privacy-tools .gdpr-export-button input.button,
28
+ .gdpr-framework-privacy-tools .gdpr-delete-button input.button {
29
+ min-width: 200px;
30
+ }
bootstrap.php CHANGED
@@ -1,71 +1,53 @@
1
- <?php
2
- /**
3
- * Set up config object, store plugin URL and path there
4
- * along with various other items
5
- */
6
-
7
- \Codelight\GDPR\Container::getInstance()->bindIf('config', function () {
8
- return new \Codelight\GDPR\Config([
9
- 'plugin' => [
10
- 'url' => plugin_dir_url(__FILE__),
11
- 'path' => plugin_dir_path(__FILE__),
12
- 'template_path' => plugin_dir_path(__FILE__) . 'views/',
13
- ],
14
- 'help' => [
15
- 'url' => 'https://codelight.eu/wordpress-gdpr-framework/',
16
- ],
17
- ]);
18
- }, true);
19
-
20
- /**
21
- * Set up the application container
22
- *
23
- * @param string $abstract
24
- * @param array $parameters
25
- * @param Codelight\GDPR\Container $container
26
- *
27
- * @return Codelight\GDPR\Container|mixed
28
- */
29
- function gdpr($abstract = null, $parameters = [], Codelight\GDPR\Container $container = null)
30
- {
31
- $container = $container ?: Codelight\GDPR\Container::getInstance();
32
-
33
- if ( ! $abstract) {
34
- return $container;
35
- }
36
-
37
- return $container->bound($abstract)
38
- ? $container->makeWith($abstract, $parameters)
39
- : $container->makeWith("gdpr.{$abstract}", $parameters);
40
- }
41
-
42
- /**
43
- * Start the plugin on plugins_loaded at priority 0.
44
- */
45
- add_action('plugins_loaded', function () use ($gdpr_error) {
46
-
47
- load_plugin_textdomain('gdpr-framework', false, basename( dirname( __FILE__ ) ) . '/languages/');
48
-
49
- new \Codelight\GDPR\Setup();
50
-
51
- }, 0);
52
-
53
- /**
54
- * Install the database table and custom role
55
- */
56
- register_activation_hook(__FILE__, function () {
57
- $model = new \Codelight\GDPR\Components\Consent\UserConsentModel();
58
- $model->createTable();
59
-
60
- if (apply_filters('gdpr/data-subject/anonymize/change_role', true) && ! get_role('anonymous')) {
61
-
62
- add_role(
63
- 'anonymous',
64
- _x('Anonymous', '(Admin)', 'gdpr-framework'),
65
- []
66
- );
67
- }
68
-
69
- update_option('gdpr_enable_stylesheet', true);
70
- update_option('gdpr_enable', true);
71
- });
1
+ <?php
2
+ /**
3
+ * Set up config object, store plugin URL and path there
4
+ * along with various other items
5
+ */
6
+
7
+ \Codelight\GDPR\Container::getInstance()->bindIf('config', function () {
8
+ return new \Codelight\GDPR\Config([
9
+ 'plugin' => [
10
+ 'url' => plugin_dir_url(__FILE__),
11
+ 'path' => plugin_dir_path(__FILE__),
12
+ 'template_path' => plugin_dir_path(__FILE__) . 'views/',
13
+ ],
14
+ 'help' => [
15
+ 'url' => 'https://codelight.eu/wordpress-gdpr-framework/',
16
+ ],
17
+ ]);
18
+ }, true);
19
+
20
+ /**
21
+ * Set up the application container
22
+ *
23
+ * @param string $abstract
24
+ * @param array $parameters
25
+ * @param Codelight\GDPR\Container $container
26
+ *
27
+ * @return Codelight\GDPR\Container|mixed
28
+ */
29
+ function gdpr($abstract = null, $parameters = [], Codelight\GDPR\Container $container = null)
30
+ {
31
+ $container = $container ?: Codelight\GDPR\Container::getInstance();
32
+
33
+ if ( ! $abstract) {
34
+ return $container;
35
+ }
36
+
37
+ return $container->bound($abstract)
38
+ ? $container->makeWith($abstract, $parameters)
39
+ : $container->makeWith("gdpr.{$abstract}", $parameters);
40
+ }
41
+
42
+ /**
43
+ * Start the plugin on plugins_loaded at priority 0.
44
+ */
45
+ add_action('plugins_loaded', function () use ($gdpr_error) {
46
+
47
+ load_plugin_textdomain('gdpr-framework', false, basename( dirname( __FILE__ ) ) . '/languages/');
48
+
49
+ new \Codelight\GDPR\Updater\Updater();
50
+
51
+ new \Codelight\GDPR\Setup();
52
+
53
+ }, 0);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
gdpr-framework.php CHANGED
@@ -1,73 +1,95 @@
1
- <?php
2
-
3
- /**
4
- * Plugin Name: The GDPR Framework
5
- * Plugin URI: https://codelight.eu/wordpress-gdpr-framework/
6
- * Description: Tools to help make your website GDPR-compliant. Fully documented, extendable and developer-friendly.
7
- * Version: 1.0.4
8
- * Author: Codelight
9
- * Author URI: https://codelight.eu/
10
- * Text Domain: gdpr
11
- * Domain Path: /languages
12
- */
13
-
14
- if (!defined('WPINC')) {
15
- die;
16
- }
17
-
18
- /**
19
- * Helper function for prettying up errors
20
- *
21
- * @param string $message
22
- * @param string $subtitle
23
- * @param string $title
24
- */
25
- $gdpr_error = function($message, $subtitle = '', $title = '') {
26
- $title = $title ?: _x('WordPress GDPR &rsaquo; Error', '(Admin)', 'gdpr-framework');
27
- $message = "<h1>{$title}<br><small>{$subtitle}</small></h1><p>{$message}</p>";
28
- wp_die($message, $title);
29
- };
30
-
31
- /**
32
- * Ensure compatible version of PHP is used
33
- */
34
- if (version_compare(phpversion(), '5.6.33', '<')) {
35
- $gdpr_error(
36
- _x('You must be using PHP 5.6.33 or greater.', '(Admin)', 'gdpr-framework'),
37
- _x('Invalid PHP version', '(Admin)', 'gdpr-framework')
38
- );
39
- }
40
-
41
- /**
42
- * Ensure compatible version of WordPress is used
43
- */
44
- if (version_compare(get_bloginfo('version'), '4.3', '<')) {
45
- $gdpr_error(
46
- _x('You must be using WordPress 4.3.0 or greater.', '(Admin)', 'gdpr-framework'),
47
- _x('Invalid WordPress version', '(Admin)', 'gdpr-framework')
48
- );
49
- }
50
-
51
- /**
52
- * Load dependencies
53
- */
54
- if (!class_exists('\Codelight\GDPR\Container')) {
55
-
56
- if (!file_exists($composer = __DIR__ . '/vendor/autoload.php')) {
57
- $gdpr_error(
58
- _x(
59
- 'You appear to be running a development version of GDPR. You must run <code>composer install</code> from the plugin directory.',
60
- '(Admin)',
61
- 'gdpr-framework'
62
- ),
63
- _x(
64
- 'Autoloader not found.',
65
- '(Admin)',
66
- 'gdpr-framework'
67
- )
68
- );
69
- }
70
- require_once $composer;
71
- }
72
-
73
- require_once('bootstrap.php');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ /**
4
+ * Plugin Name: The GDPR Framework
5
+ * Plugin URI: https://codelight.eu/wordpress-gdpr-framework/
6
+ * Description: Tools to help make your website GDPR-compliant. Fully documented, extendable and developer-friendly.
7
+ * Version: 1.0.5
8
+ * Author: Codelight
9
+ * Author URI: https://codelight.eu/
10
+ * Text Domain: gdpr-framework
11
+ * Domain Path: /languages
12
+ */
13
+
14
+ if (!defined('WPINC')) {
15
+ die;
16
+ }
17
+
18
+ define('GDPR_FRAMEWORK_VERSION', '1.0.5');
19
+
20
+ /**
21
+ * Helper function for prettying up errors
22
+ *
23
+ * @param string $message
24
+ * @param string $subtitle
25
+ * @param string $title
26
+ */
27
+ $gdpr_error = function($message, $subtitle = '', $title = '') {
28
+ $title = $title ?: _x('WordPress GDPR &rsaquo; Error', '(Admin)', 'gdpr-framework');
29
+ $message = "<h1>{$title}<br><small>{$subtitle}</small></h1><p>{$message}</p>";
30
+ wp_die($message, $title);
31
+ };
32
+
33
+ /**
34
+ * Ensure compatible version of PHP is used
35
+ */
36
+ if (version_compare(phpversion(), '5.6.0', '<')) {
37
+ $gdpr_error(
38
+ _x('You must be using PHP 5.6.0 or greater.', '(Admin)', 'gdpr-framework'),
39
+ _x('Invalid PHP version', '(Admin)', 'gdpr-framework')
40
+ );
41
+ }
42
+
43
+ /**
44
+ * Ensure compatible version of WordPress is used
45
+ */
46
+ if (version_compare(get_bloginfo('version'), '4.3', '<')) {
47
+ $gdpr_error(
48
+ _x('You must be using WordPress 4.3.0 or greater.', '(Admin)', 'gdpr-framework'),
49
+ _x('Invalid WordPress version', '(Admin)', 'gdpr-framework')
50
+ );
51
+ }
52
+
53
+ /**
54
+ * Load dependencies
55
+ */
56
+ if (!class_exists('\Codelight\GDPR\Container')) {
57
+
58
+ if (!file_exists($composer = __DIR__ . '/vendor/autoload.php')) {
59
+ $gdpr_error(
60
+ _x(
61
+ 'You appear to be running a development version of GDPR. You must run <code>composer install</code> from the plugin directory.',
62
+ '(Admin)',
63
+ 'gdpr-framework'
64
+ ),
65
+ _x(
66
+ 'Autoloader not found.',
67
+ '(Admin)',
68
+ 'gdpr-framework'
69
+ )
70
+ );
71
+ }
72
+ require_once $composer;
73
+ }
74
+
75
+ /**
76
+ * Install the database table and custom role
77
+ */
78
+ register_activation_hook(__FILE__, function () {
79
+ $model = new \Codelight\GDPR\Components\Consent\UserConsentModel();
80
+ $model->createTable();
81
+
82
+ if (apply_filters('gdpr/data-subject/anonymize/change_role', true) && ! get_role('anonymous')) {
83
+
84
+ add_role(
85
+ 'anonymous',
86
+ _x('Anonymous', '(Admin)', 'gdpr-framework'),
87
+ array()
88
+ );
89
+ }
90
+
91
+ update_option('gdpr_enable_stylesheet', true);
92
+ update_option('gdpr_enable', true);
93
+ });
94
+
95
+ require_once('bootstrap.php');
languages/gdpr-framework-de_DE.mo ADDED
Binary file
languages/gdpr-framework-de_DE.po ADDED
@@ -0,0 +1,1306 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR Codelight
3
+ # This file is distributed under the same license as the The GDPR Framework package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: The GDPR Framework 1.0\n"
9
+ "Report-Msgid-Bugs-To: gdpr@codelight.eu\n"
10
+ "POT-Creation-Date: 2018-04-16 10:50+0000\n"
11
+ "PO-Revision-Date: 2018-04-21 17:26+0200\n"
12
+ "Language-Team: \n"
13
+ "MIME-Version: 1.0\n"
14
+ "Content-Type: text/plain; charset=UTF-8\n"
15
+ "Content-Transfer-Encoding: 8bit\n"
16
+ "X-Generator: Poedit 2.0.6\n"
17
+ "Last-Translator: Torsten Meyer <contact@knodderdachs.de>\n"
18
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
19
+ "Language: de_DE\n"
20
+
21
+ #: gdpr-framework.php:26
22
+ msgctxt "(Admin)"
23
+ msgid "WordPress GDPR &rsaquo; Error"
24
+ msgstr ""
25
+
26
+ #: gdpr-framework.php:35
27
+ msgctxt "(Admin)"
28
+ msgid "Invalid PHP version"
29
+ msgstr ""
30
+
31
+ #: gdpr-framework.php:35
32
+ msgctxt "(Admin)"
33
+ msgid "You must be using PHP 5.6.33 or greater."
34
+ msgstr ""
35
+
36
+ #: gdpr-framework.php:42
37
+ msgctxt "(Admin)"
38
+ msgid "Invalid WordPress version"
39
+ msgstr ""
40
+
41
+ #: gdpr-framework.php:42
42
+ msgctxt "(Admin)"
43
+ msgid "You must be using WordPress 4.3.0 or greater."
44
+ msgstr ""
45
+
46
+ #: gdpr-framework.php:52
47
+ msgctxt "(Admin)"
48
+ msgid ""
49
+ "You appear to be running a development version of GDPR. You must run "
50
+ "<code>composer install</code> from the plugin directory."
51
+ msgstr ""
52
+
53
+ #: gdpr-framework.php:53
54
+ msgctxt "(Admin)"
55
+ msgid "Autoloader not found."
56
+ msgstr ""
57
+
58
+ #: gdpr-framework.php:115
59
+ msgctxt "(Admin)"
60
+ msgid "Anonymous"
61
+ msgstr ""
62
+
63
+ #: src/Admin/AdminTab.php:115
64
+ msgctxt "(Admin)"
65
+ msgid "Save"
66
+ msgstr ""
67
+
68
+ #: src/Admin/AdminTab.php:151
69
+ msgctxt "(Admin)"
70
+ msgid "Policy generated!"
71
+ msgstr ""
72
+
73
+ #: src/Admin/AdminTabGeneral.php:11
74
+ msgctxt "(Admin)"
75
+ msgid "General"
76
+ msgstr ""
77
+
78
+ #: src/Admin/AdminTabGeneral.php:38
79
+ msgctxt "(Admin)"
80
+ msgid "General Settings"
81
+ msgstr ""
82
+
83
+ #: src/Admin/AdminTabGeneral.php:43
84
+ msgctxt "(Admin)"
85
+ msgid "Enable Privacy Tools"
86
+ msgstr ""
87
+
88
+ #: src/Admin/AdminTabGeneral.php:53
89
+ msgctxt "(Admin)"
90
+ msgid "Pages"
91
+ msgstr ""
92
+
93
+ #: src/Admin/AdminTabGeneral.php:58 src/Admin/WordpressAdmin.php:151
94
+ msgctxt "(Admin)"
95
+ msgid "Privacy Tools Page"
96
+ msgstr ""
97
+
98
+ #: src/Admin/AdminTabGeneral.php:65 src/Admin/WordpressAdmin.php:147
99
+ msgctxt "(Admin)"
100
+ msgid "Privacy Policy Page"
101
+ msgstr ""
102
+
103
+ #: src/Admin/AdminTabGeneral.php:72
104
+ msgctxt "(Admin)"
105
+ msgid "Terms & Conditions Page"
106
+ msgstr ""
107
+
108
+ #: src/Admin/AdminTabGeneral.php:82
109
+ msgctxt "(Admin)"
110
+ msgid "View & Export Data"
111
+ msgstr ""
112
+
113
+ #: src/Admin/AdminTabGeneral.php:87
114
+ msgctxt "(Admin)"
115
+ msgid "Export action"
116
+ msgstr ""
117
+
118
+ #: src/Admin/AdminTabGeneral.php:94 src/Admin/AdminTabGeneral.php:133
119
+ msgctxt "(Admin)"
120
+ msgid "Email to notify"
121
+ msgstr ""
122
+
123
+ #: src/Admin/AdminTabGeneral.php:105
124
+ msgctxt "(Admin)"
125
+ msgid "Delete & Anonymize Data"
126
+ msgstr ""
127
+
128
+ #: src/Admin/AdminTabGeneral.php:110
129
+ msgctxt "(Admin)"
130
+ msgid "Delete action"
131
+ msgstr ""
132
+
133
+ #: src/Admin/AdminTabGeneral.php:117
134
+ msgctxt "(Admin)"
135
+ msgid "Delete or reassign content?"
136
+ msgstr ""
137
+
138
+ #: src/Admin/AdminTabGeneral.php:125
139
+ msgctxt "(Admin)"
140
+ msgid "Reassign content to"
141
+ msgstr ""
142
+
143
+ #: src/Admin/AdminTabGeneral.php:145
144
+ msgctxt "(Admin)"
145
+ msgid "Styling"
146
+ msgstr ""
147
+
148
+ #: src/Admin/AdminTabGeneral.php:150
149
+ msgctxt "(Admin)"
150
+ msgid "Enable basic styling on Privacy Tools page"
151
+ msgstr ""
152
+
153
+ #: src/Admin/AdminTabGeneral.php:162
154
+ msgctxt "(Admin)"
155
+ msgid "Compatibility"
156
+ msgstr ""
157
+
158
+ #: src/Admin/AdminTabGeneral.php:167
159
+ msgctxt "(Admin)"
160
+ msgid "Enable automatic theme compatibility"
161
+ msgstr ""
162
+
163
+ #: src/Admin/AdminTabGeneral.php:184 src/Admin/AdminTabGeneral.php:200
164
+ #: src/Admin/AdminTabGeneral.php:213 src/Admin/AdminTabGeneral.php:252
165
+ #: views/installer/steps/configuration-settings.php:62
166
+ msgctxt "(Admin)"
167
+ msgid "&mdash; Select &mdash;"
168
+ msgstr ""
169
+
170
+ #: src/Admin/WordpressAdmin.php:65
171
+ msgctxt "(Admin)"
172
+ msgid "Privacy & GDPR Settings"
173
+ msgstr ""
174
+
175
+ #: src/Admin/WordpressAdmin.php:66
176
+ msgctxt "(Admin)"
177
+ msgid "Privacy"
178
+ msgstr ""
179
+
180
+ #: src/Components/Consent/AdminTabConsent.php:30
181
+ #: src/Components/Consent/AdminTabConsent.php:49
182
+ msgctxt "(Admin)"
183
+ msgid "Consent"
184
+ msgstr ""
185
+
186
+ #: src/Components/Consent/AdminTabConsent.php:157
187
+ msgctxt "(Admin)"
188
+ msgid "Consent slug is a required field!"
189
+ msgstr ""
190
+
191
+ #: src/Components/Consent/AdminTabConsent.php:162
192
+ msgctxt "(Admin)"
193
+ msgid ""
194
+ "You may only use alphanumeric characters, dash and underscore in the consent "
195
+ "slug field."
196
+ msgstr ""
197
+
198
+ #: src/Components/Consent/AdminTabConsent.php:167
199
+ msgctxt "(Admin)"
200
+ msgid "Consent title is a required field!"
201
+ msgstr ""
202
+
203
+ #: src/Components/Consent/ConsentManager.php:46
204
+ #: views/modules/contact-form-7/content-privacy.php:2
205
+ #: views/modules/wordpress-comments/terms-checkbox.php:14
206
+ #: views/modules/wordpress-user/registration-terms-checkbox.php:15
207
+ #, php-format
208
+ msgid "I accept the %sPrivacy Policy%s"
209
+ msgstr "Ich stimme der %sDatenschutzerklärung%s zu"
210
+
211
+ #: src/Components/Consent/ConsentManager.php:50
212
+ #: src/Components/Consent/ConsentManager.php:69
213
+ msgctxt "(Admin)"
214
+ msgid ""
215
+ "This consent is not visible by default. If someone wishes to withdraw it, "
216
+ "they should simply request to delete all their data."
217
+ msgstr ""
218
+
219
+ #: src/Components/Consent/ConsentManager.php:65
220
+ #, php-format
221
+ msgid "I accept the %sTerms & Conditions%s"
222
+ msgstr "Ich akzeptiere die %sAllgemeinen Geschäftsbestimmungen%s"
223
+
224
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:19
225
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:61
226
+ #: views/admin/privacy-policy/generated.php:1 views/installer/header.php:41
227
+ msgctxt "(Admin)"
228
+ msgid "Privacy Policy"
229
+ msgstr ""
230
+
231
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:70
232
+ msgctxt "(Admin)"
233
+ msgid "Company information"
234
+ msgstr ""
235
+
236
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:75
237
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:209
238
+ msgctxt "(Admin)"
239
+ msgid "Company Name"
240
+ msgstr ""
241
+
242
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:82
243
+ msgctxt "(Admin)"
244
+ msgid "Company Email"
245
+ msgstr ""
246
+
247
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:89
248
+ msgctxt "(Admin)"
249
+ msgid "Company Location"
250
+ msgstr ""
251
+
252
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:105
253
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:245
254
+ msgctxt "(Admin)"
255
+ msgid "Representative Contact Name"
256
+ msgstr ""
257
+
258
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:112
259
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:252
260
+ msgctxt "(Admin)"
261
+ msgid "Representative Contact Email"
262
+ msgstr ""
263
+
264
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:119
265
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:259
266
+ msgctxt "(Admin)"
267
+ msgid "Representative Contact Phone"
268
+ msgstr ""
269
+
270
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:135
271
+ msgctxt "(Admin)"
272
+ msgid "Data Protection Authority"
273
+ msgstr ""
274
+
275
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:141
276
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:286
277
+ msgctxt "(Admin)"
278
+ msgid "Data Protection Authority Website"
279
+ msgstr ""
280
+
281
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:148
282
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:293
283
+ msgctxt "(Admin)"
284
+ msgid "Data Protection Authority Email"
285
+ msgstr ""
286
+
287
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:155
288
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:300
289
+ msgctxt "(Admin)"
290
+ msgid "Data Protection Authority Phone"
291
+ msgstr ""
292
+
293
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:165
294
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:175
295
+ msgctxt "(Admin)"
296
+ msgid "Data Protection Officer"
297
+ msgstr ""
298
+
299
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:168
300
+ msgctxt "(Admin)"
301
+ msgid "Knowledge base: Do I need to appoint a Data Protection Officer?"
302
+ msgstr ""
303
+
304
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:182
305
+ msgctxt "(Admin)"
306
+ msgid "Data Protection Officer Name"
307
+ msgstr ""
308
+
309
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:190
310
+ msgctxt "(Admin)"
311
+ msgid "Data Protection Officer Email"
312
+ msgstr ""
313
+
314
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:216
315
+ msgctxt "(Admin)"
316
+ msgid "Contact Email"
317
+ msgstr ""
318
+
319
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:235
320
+ msgctxt "(Admin)"
321
+ msgid "Representative Contact"
322
+ msgstr ""
323
+
324
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:238
325
+ msgctxt "(Admin)"
326
+ msgid "Knowledge base: Do I need to appoint an EU-based representative?"
327
+ msgstr ""
328
+
329
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:317
330
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:324
331
+ msgctxt "(Admin)"
332
+ msgid "DPO Name"
333
+ msgstr ""
334
+
335
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:420
336
+ msgctxt "(Admin)"
337
+ msgid "Save & Generate Policy"
338
+ msgstr ""
339
+
340
+ #: src/Components/PrivacyPolicy/PrivacyPolicy.php:82
341
+ #: src/Installer/Installer.php:271 src/Installer/Steps/PolicySettings.php:199
342
+ #: views/themes/storefront/footer.php:3
343
+ #: views/themes/twentyseventeen/footer.php:3
344
+ #: views/themes/twentysixteen/footer.php:4
345
+ msgid "Privacy Policy"
346
+ msgstr "Datenschutzerklärung"
347
+
348
+ #: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:19
349
+ msgid "This page is currently disabled."
350
+ msgstr "Diese Seite ist zur Zeit deaktiviert."
351
+
352
+ #: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:35
353
+ #: src/Installer/Installer.php:279
354
+ #: src/Installer/Steps/ConfigurationPages.php:55
355
+ #: views/themes/storefront/footer.php:7
356
+ #: views/themes/twentyseventeen/footer.php:7
357
+ #: views/themes/twentysixteen/footer.php:9
358
+ msgid "Privacy Tools"
359
+ msgstr "Privatsphäre Tools"
360
+
361
+ #: src/Components/Support/AdminTabSupport.php:13
362
+ #: src/Components/Support/AdminTabSupport.php:20
363
+ msgctxt "(Admin)"
364
+ msgid "Support"
365
+ msgstr ""
366
+
367
+ #: src/Components/WordpressComments/WordpressComments.php:90
368
+ #, php-format
369
+ msgid ""
370
+ "%sERROR:%s You need to accept the terms and conditions to post a comment."
371
+ msgstr ""
372
+ "%sFEHLER:%s Du musst die AGB akzeptieren, um einen Kommentar schreiben zu "
373
+ "dürfen."
374
+
375
+ #: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:54
376
+ #: views/privacy-tools/notices.php:19
377
+ msgid "We have received your request and will reply within 30 days."
378
+ msgstr ""
379
+ "Wir haben Ihre Anfrage erhalten und werden innerhalb von 30 Tagen antworten."
380
+
381
+ #: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:59
382
+ #: views/privacy-tools/notices.php:15
383
+ msgid "Consent withdrawn."
384
+ msgstr "Zustimmung widerrufen."
385
+
386
+ #: src/Components/WordpressUser/RegistrationForm.php:42
387
+ msgid "<strong>ERROR</strong>: You must accept the terms and conditions."
388
+ msgstr "<strong>FEHLER</strong>: Du musst die AGB akzeptieren."
389
+
390
+ #: src/Components/WordpressUser/WordpressUser.php:63
391
+ #: src/Components/WordpressUser/WordpressUser.php:64
392
+ #: views/modules/wordpress-user/dashboard/data-page/header.php:2
393
+ msgctxt "(Admin)"
394
+ msgid "Privacy Tools"
395
+ msgstr ""
396
+
397
+ #: src/DataSubject/AdminTabDataSubject.php:27
398
+ #: src/DataSubject/AdminTabDataSubject.php:41
399
+ msgctxt "(Admin)"
400
+ msgid "Data Subjects"
401
+ msgstr ""
402
+
403
+ #: src/DataSubject/DataRepository.php:143
404
+ msgid "Data exported"
405
+ msgstr "Daten exportiert"
406
+
407
+ #: src/DataSubject/DataRepository.php:158
408
+ msgid "Data export request"
409
+ msgstr "Datenexport angefragt"
410
+
411
+ #: src/DataSubject/DataRepository.php:171
412
+ msgid "Data removed"
413
+ msgstr "Daten entfernt"
414
+
415
+ #: src/DataSubject/DataRepository.php:186
416
+ msgid "Data removal request"
417
+ msgstr "Datenlöschung angefragt"
418
+
419
+ #: src/DataSubject/DataSubjectIdentificator.php:65
420
+ #: src/DataSubject/DataSubjectIdentificator.php:82
421
+ msgid "Your personal data on"
422
+ msgstr "Ihre persönlichen Daten auf"
423
+
424
+ #: src/Helpers.php:27
425
+ msgctxt "(Admin)"
426
+ msgid "Austria"
427
+ msgstr ""
428
+
429
+ #: src/Helpers.php:28
430
+ msgctxt "(Admin)"
431
+ msgid "Belgium"
432
+ msgstr ""
433
+
434
+ #: src/Helpers.php:29
435
+ msgctxt "(Admin)"
436
+ msgid "Bulgaria"
437
+ msgstr ""
438
+
439
+ #: src/Helpers.php:30
440
+ msgctxt "(Admin)"
441
+ msgid "Croatia"
442
+ msgstr ""
443
+
444
+ #: src/Helpers.php:31
445
+ msgctxt "(Admin)"
446
+ msgid "Cyprus"
447
+ msgstr ""
448
+
449
+ #: src/Helpers.php:32
450
+ msgctxt "(Admin)"
451
+ msgid "Czech Republic"
452
+ msgstr ""
453
+
454
+ #: src/Helpers.php:33
455
+ msgctxt "(Admin)"
456
+ msgid "Denmark"
457
+ msgstr ""
458
+
459
+ #: src/Helpers.php:34
460
+ msgctxt "(Admin)"
461
+ msgid "Estonia"
462
+ msgstr ""
463
+
464
+ #: src/Helpers.php:35
465
+ msgctxt "(Admin)"
466
+ msgid "Finland"
467
+ msgstr ""
468
+
469
+ #: src/Helpers.php:36
470
+ msgctxt "(Admin)"
471
+ msgid "France"
472
+ msgstr ""
473
+
474
+ #: src/Helpers.php:37
475
+ msgctxt "(Admin)"
476
+ msgid "Germany"
477
+ msgstr ""
478
+
479
+ #: src/Helpers.php:38
480
+ msgctxt "(Admin)"
481
+ msgid "Greece"
482
+ msgstr ""
483
+
484
+ #: src/Helpers.php:39
485
+ msgctxt "(Admin)"
486
+ msgid "Hungary"
487
+ msgstr ""
488
+
489
+ #: src/Helpers.php:40
490
+ msgctxt "(Admin)"
491
+ msgid "Ireland"
492
+ msgstr ""
493
+
494
+ #: src/Helpers.php:41
495
+ msgctxt "(Admin)"
496
+ msgid "Italy"
497
+ msgstr ""
498
+
499
+ #: src/Helpers.php:42
500
+ msgctxt "(Admin)"
501
+ msgid "Latvia"
502
+ msgstr ""
503
+
504
+ #: src/Helpers.php:43
505
+ msgctxt "(Admin)"
506
+ msgid "Lithuania"
507
+ msgstr ""
508
+
509
+ #: src/Helpers.php:44
510
+ msgctxt "(Admin)"
511
+ msgid "Luxembourg"
512
+ msgstr ""
513
+
514
+ #: src/Helpers.php:45
515
+ msgctxt "(Admin)"
516
+ msgid "Malta"
517
+ msgstr ""
518
+
519
+ #: src/Helpers.php:46
520
+ msgctxt "(Admin)"
521
+ msgid "Netherlands"
522
+ msgstr ""
523
+
524
+ #: src/Helpers.php:47
525
+ msgctxt "(Admin)"
526
+ msgid "Poland"
527
+ msgstr ""
528
+
529
+ #: src/Helpers.php:48
530
+ msgctxt "(Admin)"
531
+ msgid "Portugal"
532
+ msgstr ""
533
+
534
+ #: src/Helpers.php:49
535
+ msgctxt "(Admin)"
536
+ msgid "Romania"
537
+ msgstr ""
538
+
539
+ #: src/Helpers.php:50
540
+ msgctxt "(Admin)"
541
+ msgid "Slovakia"
542
+ msgstr ""
543
+
544
+ #: src/Helpers.php:51
545
+ msgctxt "(Admin)"
546
+ msgid "Slovenia"
547
+ msgstr ""
548
+
549
+ #: src/Helpers.php:52
550
+ msgctxt "(Admin)"
551
+ msgid "Spain"
552
+ msgstr ""
553
+
554
+ #: src/Helpers.php:53
555
+ msgctxt "(Admin)"
556
+ msgid "Sweden"
557
+ msgstr ""
558
+
559
+ #: src/Helpers.php:54
560
+ msgctxt "(Admin)"
561
+ msgid "United Kingdom"
562
+ msgstr ""
563
+
564
+ #: src/Helpers.php:69
565
+ msgctxt "(Admin)"
566
+ msgid "Iceland"
567
+ msgstr ""
568
+
569
+ #: src/Helpers.php:70
570
+ msgctxt "(Admin)"
571
+ msgid "Norway"
572
+ msgstr ""
573
+
574
+ #: src/Helpers.php:71
575
+ msgctxt "(Admin)"
576
+ msgid "Liechtenstein"
577
+ msgstr ""
578
+
579
+ #: src/Helpers.php:72
580
+ msgctxt "(Admin)"
581
+ msgid "Switzerland"
582
+ msgstr ""
583
+
584
+ #: src/Helpers.php:73
585
+ msgctxt "(Admin)"
586
+ msgid "United States"
587
+ msgstr ""
588
+
589
+ #: src/Helpers.php:74
590
+ msgctxt "(Admin)"
591
+ msgid "Rest of the world"
592
+ msgstr ""
593
+
594
+ #: src/Helpers.php:145
595
+ msgid "An error has occurred. Please contact the site administrator."
596
+ msgstr ""
597
+ "Es ist ein Fehler aufgetreten. Bitte setzen Sie sich mit dem Website "
598
+ "Administrator in Verbindung."
599
+
600
+ #: src/Installer/Installer.php:135
601
+ msgctxt "(Admin)"
602
+ msgid "Setup Wizard"
603
+ msgstr ""
604
+
605
+ #: src/Installer/Steps/ConfigurationPages.php:23
606
+ #: src/Installer/Steps/PolicySettings.php:23
607
+ #: src/Installer/Steps/PolicySettings.php:48
608
+ msgctxt "(Admin)"
609
+ msgid "&mdash; Create a new page &mdash;"
610
+ msgstr ""
611
+
612
+ #: src/Installer/Steps/PolicySettings.php:38
613
+ msgctxt "(Admin)"
614
+ msgid ""
615
+ "We have automatically selected your WooCommerce Terms & Conditions page."
616
+ msgstr ""
617
+
618
+ #: src/Modules/ContactForm7/ContactForm7.php:35
619
+ msgctxt "(Admin)"
620
+ msgid "gdpr terms txt"
621
+ msgstr ""
622
+
623
+ #: src/Router.php:80 src/Router.php:92 src/Router.php:125 src/Router.php:141
624
+ #, php-format
625
+ msgid "Nonce error for action \"%s\". Please go back and try again!"
626
+ msgstr ""
627
+ "Nonce Fehler für Aktion \"%s\". Bitte gehen Sie zurück und versuchen Sie es "
628
+ "erneut!"
629
+
630
+ #: src/Router.php:149
631
+ msgctxt "(Admin)"
632
+ msgid "You do not have the required permissions to perform this action!"
633
+ msgstr ""
634
+
635
+ #: views/admin/consent.php:3
636
+ msgctxt "(Admin)"
637
+ msgid "Default consent types"
638
+ msgstr ""
639
+
640
+ #: views/admin/consent.php:4
641
+ msgctxt "(Admin)"
642
+ msgid ""
643
+ "These are the consent types that have been automatically registered by the "
644
+ "framework or a plugin."
645
+ msgstr ""
646
+
647
+ #: views/admin/consent.php:7 views/admin/consent.php:52
648
+ msgctxt "(Admin)"
649
+ msgid "Slug"
650
+ msgstr ""
651
+
652
+ #: views/admin/consent.php:8 views/admin/consent.php:38
653
+ #: views/admin/consent.php:60
654
+ msgctxt "(Admin)"
655
+ msgid "Title"
656
+ msgstr ""
657
+
658
+ #: views/admin/consent.php:9 views/admin/consent.php:41
659
+ #: views/admin/consent.php:63
660
+ msgctxt "(Admin)"
661
+ msgid "Description"
662
+ msgstr ""
663
+
664
+ #: views/admin/consent.php:10
665
+ msgctxt "(Admin)"
666
+ msgid "Visibility"
667
+ msgstr ""
668
+
669
+ #: views/admin/consent.php:18
670
+ msgctxt "(Admin)"
671
+ msgid "Visible"
672
+ msgstr ""
673
+
674
+ #: views/admin/consent.php:20
675
+ msgctxt "(Admin)"
676
+ msgid "Hidden"
677
+ msgstr ""
678
+
679
+ #: views/admin/consent.php:29
680
+ msgctxt "(Admin)"
681
+ msgid "Custom consent types"
682
+ msgstr ""
683
+
684
+ #: views/admin/consent.php:30
685
+ msgctxt "(Admin)"
686
+ msgid ""
687
+ "Here you can add custom consent types to track. They will not be used "
688
+ "anywhere by default - you will need to build an integration for each of them."
689
+ msgstr ""
690
+
691
+ #: views/admin/consent.php:35
692
+ msgctxt "(Admin)"
693
+ msgid "Machine-readable slug"
694
+ msgstr ""
695
+
696
+ #: views/admin/consent.php:44 views/admin/consent.php:68
697
+ msgctxt "(Admin)"
698
+ msgid "Visible?"
699
+ msgstr ""
700
+
701
+ #: views/admin/consent.php:72
702
+ msgctxt "(Admin)"
703
+ msgid "Remove"
704
+ msgstr ""
705
+
706
+ #: views/admin/consent.php:93
707
+ msgctxt "(Admin)"
708
+ msgid "Additional info"
709
+ msgstr ""
710
+
711
+ #: views/admin/consent.php:95
712
+ msgctxt "(Admin)"
713
+ msgid ""
714
+ "This text will be displayed to your data subjects on the Privacy Tools page."
715
+ msgstr ""
716
+
717
+ #: views/admin/data-subjects/search-form.php:2
718
+ msgctxt "(Admin)"
719
+ msgid ""
720
+ "On this page, you can find which data subjects personal data you are storing "
721
+ "and download, export or delete it."
722
+ msgstr ""
723
+
724
+ #: views/admin/data-subjects/search-form.php:10
725
+ msgctxt "(Admin)"
726
+ msgid "Find data subject by email"
727
+ msgstr ""
728
+
729
+ #: views/admin/data-subjects/search-form.php:11
730
+ msgctxt "(Admin)"
731
+ msgid "Email address"
732
+ msgstr ""
733
+
734
+ #: views/admin/data-subjects/search-form.php:16
735
+ msgctxt "(Admin)"
736
+ msgid "Search"
737
+ msgstr ""
738
+
739
+ #: views/admin/data-subjects/search-results.php:7
740
+ msgctxt "(Admin)"
741
+ msgid "Username"
742
+ msgstr ""
743
+
744
+ #: views/admin/data-subjects/search-results.php:12
745
+ msgctxt "(Admin)"
746
+ msgid "is not a registered user."
747
+ msgstr ""
748
+
749
+ #: views/admin/data-subjects/search-results.php:16
750
+ msgctxt "(Admin)"
751
+ msgid "Download data (html)"
752
+ msgstr ""
753
+
754
+ #: views/admin/data-subjects/search-results.php:17
755
+ msgctxt "(Admin)"
756
+ msgid "Export data (json)"
757
+ msgstr ""
758
+
759
+ #: views/admin/data-subjects/search-results.php:21
760
+ msgctxt "(Admin)"
761
+ msgid ""
762
+ "This user has admin capabilities. Deleting data via this interface is "
763
+ "disabled."
764
+ msgstr ""
765
+
766
+ #: views/admin/data-subjects/search-results.php:24
767
+ msgctxt "(Admin)"
768
+ msgid "Anonymize data"
769
+ msgstr ""
770
+
771
+ #: views/admin/data-subjects/search-results.php:25
772
+ msgctxt "(Admin)"
773
+ msgid "Delete data"
774
+ msgstr ""
775
+
776
+ #: views/admin/data-subjects/search-results.php:29
777
+ msgctxt "(Admin)"
778
+ msgid "No data found!"
779
+ msgstr ""
780
+
781
+ #: views/admin/general/delete-action-email.php:5
782
+ #: views/admin/general/export-action-email.php:5
783
+ #: views/installer/steps/configuration-settings.php:29
784
+ #: views/installer/steps/configuration-settings.php:79
785
+ msgid "Email address"
786
+ msgstr "E-Mail Adresse"
787
+
788
+ #: views/admin/general/delete-action-reassign.php:3
789
+ #: views/installer/steps/configuration-settings.php:50
790
+ msgctxt "(Admin)"
791
+ msgid "Delete content"
792
+ msgstr ""
793
+
794
+ #: views/admin/general/delete-action-reassign.php:6
795
+ #: views/installer/steps/configuration-settings.php:53
796
+ msgctxt "(Admin)"
797
+ msgid "Reassign content to a user"
798
+ msgstr ""
799
+
800
+ #: views/admin/general/delete-action-reassign.php:10
801
+ msgctxt "(Admin)"
802
+ msgid ""
803
+ "If the user has submitted any content on your site, should it be deleted or "
804
+ "reassigned to another user?"
805
+ msgstr ""
806
+
807
+ #: views/admin/general/description-data-page.php:2
808
+ msgctxt "(Admin)"
809
+ msgid ""
810
+ "Select the page where users can go to control their data. This page must "
811
+ "contain the [gdpr_privacy_tools] shortcode."
812
+ msgstr ""
813
+
814
+ #: views/admin/general/enable.php:9
815
+ msgctxt "(Admin)"
816
+ msgid "Enable the view, export and forget functionality for users and visitors"
817
+ msgstr ""
818
+
819
+ #: views/admin/general/enable.php:12
820
+ msgctxt "(Admin)"
821
+ msgid ""
822
+ "Enable the Privacy Tools page on front-end and dashboard. This allows "
823
+ "visitors to request viewing and deleting their personal data and withdraw "
824
+ "consents."
825
+ msgstr ""
826
+
827
+ #: views/admin/general/theme-compatibility.php:9
828
+ #: views/installer/steps/integrations.php:21
829
+ msgctxt "(Admin)"
830
+ msgid ""
831
+ "Automatically add Privacy Policy and Privacy Tools links to your site footer."
832
+ msgstr ""
833
+
834
+ #: views/admin/notices/header.php:4 views/admin/settings-page.php:3
835
+ #: views/installer/header.php:23
836
+ msgctxt "(Admin)"
837
+ msgid "The GDPR Framework"
838
+ msgstr ""
839
+
840
+ #: views/admin/notices/helper-autoinstall.php:2
841
+ msgctxt "(Admin)"
842
+ msgid ""
843
+ "A Privacy Policy page has been created, but it is empty. You can generate a "
844
+ "policy template on this page."
845
+ msgstr ""
846
+
847
+ #: views/admin/notices/helper-policy.php:2
848
+ msgctxt "(Admin)"
849
+ msgid ""
850
+ "Heads up - your Privacy Policy still requires some attention. Find the "
851
+ "places marked with [TODO] and replace them with real content!"
852
+ msgstr ""
853
+
854
+ #: views/admin/notices/helper-tools.php:2
855
+ msgctxt "(Admin)"
856
+ msgid "The contents of this page should contain the [gdpr_tools] shortcode."
857
+ msgstr ""
858
+
859
+ #: views/admin/privacy-policy/description-policy-page.php:2
860
+ msgctxt "(Admin)"
861
+ msgid "Select the page which will contain your Privacy Policy"
862
+ msgstr ""
863
+
864
+ #: views/admin/privacy-policy/generated.php:3
865
+ msgctxt "(Admin)"
866
+ msgid "Your Privacy Policy has been generated."
867
+ msgstr ""
868
+
869
+ #: views/admin/privacy-policy/generated.php:20
870
+ msgctxt "(Admin)"
871
+ msgid "&laquo; Back"
872
+ msgstr ""
873
+
874
+ #: views/admin/privacy-policy/header.php:2
875
+ msgctxt "(Admin)"
876
+ msgid ""
877
+ "This page allows you to generate a Privacy Policy based on the information "
878
+ "you entered below."
879
+ msgstr ""
880
+
881
+ #: views/admin/settings-page.php:31
882
+ #, php-format
883
+ msgctxt "(Admin)"
884
+ msgid "The GDPR Framework. Built with &#9829; by %sCodelight%s."
885
+ msgstr ""
886
+
887
+ #: views/admin/support/contents.php:5 views/installer/steps/finish.php:10
888
+ msgctxt "(Admin)"
889
+ msgid "Need more info?"
890
+ msgstr ""
891
+
892
+ #: views/admin/support/contents.php:11 views/installer/steps/finish.php:16
893
+ msgctxt "(Admin)"
894
+ msgid "Site Owner's guide to GDPR"
895
+ msgstr ""
896
+
897
+ #: views/admin/support/contents.php:14 views/installer/steps/finish.php:19
898
+ msgctxt "(Admin)"
899
+ msgid "Read the full guide on GDPR compliance."
900
+ msgstr ""
901
+
902
+ #: views/admin/support/contents.php:20 views/installer/steps/finish.php:25
903
+ msgctxt "(Admin)"
904
+ msgid "Knowledge base"
905
+ msgstr ""
906
+
907
+ #: views/admin/support/contents.php:23 views/installer/steps/finish.php:28
908
+ msgctxt "(Admin)"
909
+ msgid "Check out the knowledge base for common questions and answers."
910
+ msgstr ""
911
+
912
+ #: views/admin/support/contents.php:29 views/installer/steps/finish.php:34
913
+ msgctxt "(Admin)"
914
+ msgid "Developer's guide to GDPR"
915
+ msgstr ""
916
+
917
+ #: views/admin/support/contents.php:32 views/installer/steps/finish.php:37
918
+ msgctxt "(Admin)"
919
+ msgid "We have a thorough guide to help making custom sites compliant."
920
+ msgstr ""
921
+
922
+ #: views/admin/support/contents.php:40 views/installer/steps/finish.php:45
923
+ msgctxt "(Admin)"
924
+ msgid "Need help?"
925
+ msgstr ""
926
+
927
+ #: views/admin/support/contents.php:46 views/installer/steps/finish.php:51
928
+ msgctxt "(Admin)"
929
+ msgid "Submit a support request"
930
+ msgstr ""
931
+
932
+ #: views/admin/support/contents.php:49 views/installer/steps/finish.php:54
933
+ msgctxt "(Admin)"
934
+ msgid ""
935
+ "Found a bug or problem with the plugin? Post in the wordpress.org support "
936
+ "forum."
937
+ msgstr ""
938
+
939
+ #: views/admin/support/contents.php:55 views/installer/steps/finish.php:60
940
+ msgctxt "(Admin)"
941
+ msgid "Request a consultation"
942
+ msgstr ""
943
+
944
+ #: views/admin/support/contents.php:58 views/installer/steps/finish.php:63
945
+ msgctxt "(Admin)"
946
+ msgid ""
947
+ "Need development or legal assistance in making your site compliant? We can "
948
+ "help!"
949
+ msgstr ""
950
+
951
+ #: views/admin/wizard-buttons.php:2
952
+ msgctxt "(Admin)"
953
+ msgid "Restart setup wizard"
954
+ msgstr ""
955
+
956
+ #: views/email/action-export.php:8 views/email/action-forget.php:12
957
+ msgctxt "(Admin)"
958
+ msgid ""
959
+ "This email is just for your information. You don't need to take any action"
960
+ msgstr ""
961
+
962
+ #: views/email/action-forget.php:8
963
+ msgctxt "(Admin)"
964
+ msgid "The data subject had a user account on your website."
965
+ msgstr ""
966
+
967
+ #: views/email/identify-data-subject.php:2
968
+ msgid "Someone has requested access to your data on"
969
+ msgstr "Jemand hat Zugriff auf Ihre Daten angefordert auf "
970
+
971
+ #: views/email/identify-data-subject.php:3
972
+ msgid "If this was a mistake, just ignore this email and nothing will happen."
973
+ msgstr ""
974
+ "Falls dies ein Fehler war, ignorieren Sie diese E-Mail und es wird nichts "
975
+ "passieren."
976
+
977
+ #: views/email/identify-data-subject.php:4
978
+ msgid "To manage your data, visit the following address:"
979
+ msgstr "Um Ihre Daten zu verwalten, besuchen Sie diese Adresse:"
980
+
981
+ #: views/email/identify-data-subject.php:10
982
+ msgid "This link is valid for 15 minutes."
983
+ msgstr "Der Link ist 15 Minuten lang gültig."
984
+
985
+ #: views/email/no-data.php:2
986
+ msgid "Someone has requested information about your personal data on"
987
+ msgstr "Jemand hat Zugriff auf Ihre persönlichen Daten angefordert auf"
988
+
989
+ #: views/email/no-data.php:3
990
+ msgid "None of your personal data is stored on"
991
+ msgstr "Es sind keinerlei persönliche Daten von Ihnen gespeichert auf"
992
+
993
+ #: views/email/no-data.php:5
994
+ msgid ""
995
+ "If this was a mistake or you did not request this email, just ignore it and "
996
+ "nothing will happen."
997
+ msgstr ""
998
+ "Falls dies ein Fehler war oder Sie diese E-Mail nicht anfordert haben, "
999
+ "ignorieren Sie sie und es wird nichts passieren."
1000
+
1001
+ #: views/email/request-export.php:13 views/email/request-forget.php:13
1002
+ msgctxt "(Admin)"
1003
+ msgid "As a reminder: according to GDPR, you have 30 days to comply."
1004
+ msgstr ""
1005
+
1006
+ #: views/global/delete-action.php:2
1007
+ msgctxt "(Admin)"
1008
+ msgid "Automatically anonymize data"
1009
+ msgstr ""
1010
+
1011
+ #: views/global/delete-action.php:5
1012
+ msgctxt "(Admin)"
1013
+ msgid "Automatically delete data"
1014
+ msgstr ""
1015
+
1016
+ #: views/global/delete-action.php:9
1017
+ msgctxt "(Admin)"
1018
+ msgid "Automatically anonymize data and notify me via email"
1019
+ msgstr ""
1020
+
1021
+ #: views/global/delete-action.php:13
1022
+ msgctxt "(Admin)"
1023
+ msgid "Automatically delete data and notify me via email"
1024
+ msgstr ""
1025
+
1026
+ #: views/global/delete-action.php:16 views/global/export-action.php:10
1027
+ msgctxt "(Admin)"
1028
+ msgid "Only notify me via email"
1029
+ msgstr ""
1030
+
1031
+ #: views/global/export-action.php:2
1032
+ msgctxt "(Admin)"
1033
+ msgid "Automatically download data"
1034
+ msgstr ""
1035
+
1036
+ #: views/global/export-action.php:6
1037
+ msgctxt "(Admin)"
1038
+ msgid "Automatically download data and notify me via email"
1039
+ msgstr ""
1040
+
1041
+ #: views/installer/continue-notice.php:2
1042
+ msgctxt "(Admin)"
1043
+ msgid "The The GDPR Framework setup has not been finalized yet."
1044
+ msgstr ""
1045
+
1046
+ #: views/installer/continue-notice.php:3
1047
+ msgctxt "(Admin)"
1048
+ msgid "You can continue the setup at any time."
1049
+ msgstr ""
1050
+
1051
+ #: views/installer/continue-notice.php:6
1052
+ msgctxt "(Admin)"
1053
+ msgid "Continue the setup wizard"
1054
+ msgstr ""
1055
+
1056
+ #: views/installer/continue-notice.php:9
1057
+ msgctxt "(Admin)"
1058
+ msgid "Hide this message"
1059
+ msgstr ""
1060
+
1061
+ #: views/installer/footer.php:7
1062
+ msgid "Back"
1063
+ msgstr "Zurück"
1064
+
1065
+ #: views/installer/header.php:26
1066
+ msgctxt "(Admin)"
1067
+ msgid "I need help"
1068
+ msgstr ""
1069
+
1070
+ #: views/installer/header.php:29
1071
+ msgctxt "(Admin)"
1072
+ msgid "Developer Docs"
1073
+ msgstr ""
1074
+
1075
+ #: views/installer/header.php:36
1076
+ msgctxt "(Admin)"
1077
+ msgid "Configuration"
1078
+ msgstr ""
1079
+
1080
+ #: views/installer/header.php:46
1081
+ msgctxt "(Admin)"
1082
+ msgid "Forms & Consent"
1083
+ msgstr ""
1084
+
1085
+ #: views/installer/header.php:51
1086
+ msgctxt "(Admin)"
1087
+ msgid "Integrations"
1088
+ msgstr ""
1089
+
1090
+ #: views/installer/steps/configuration-settings.php:23
1091
+ #: views/installer/steps/configuration-settings.php:73
1092
+ msgctxt "(Admin)"
1093
+ msgid "Enter the email address to notify"
1094
+ msgstr ""
1095
+
1096
+ #: views/installer/steps/disclaimer.php:21
1097
+ msgctxt "(Admin)"
1098
+ msgid "I accept"
1099
+ msgstr ""
1100
+
1101
+ #: views/installer/welcome-notice.php:7
1102
+ msgctxt "(Admin)"
1103
+ msgid "Run the setup wizard"
1104
+ msgstr ""
1105
+
1106
+ #: views/installer/welcome-notice.php:11
1107
+ msgctxt "(Admin)"
1108
+ msgid "Auto-install pages"
1109
+ msgstr ""
1110
+
1111
+ #: views/installer/welcome-notice.php:15
1112
+ msgctxt "(Admin)"
1113
+ msgid "Skip and install manually"
1114
+ msgstr ""
1115
+
1116
+ #: views/modules/contact-form-7/generator-privacy.php:6
1117
+ msgctxt "(Admin)"
1118
+ msgid ""
1119
+ "This tag generates the default text for Terms & Conditions and/or Privacy "
1120
+ "Policy checkbox."
1121
+ msgstr ""
1122
+
1123
+ #: views/modules/contact-form-7/generator-privacy.php:15
1124
+ msgid "Insert"
1125
+ msgstr "Einfügen"
1126
+
1127
+ #: views/modules/wordpress-comments/terms-checkbox.php:6
1128
+ #: views/modules/wordpress-user/registration-terms-checkbox.php:7
1129
+ #, php-format
1130
+ msgid "I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s"
1131
+ msgstr "Ich akzeptiere die %sAGB%s und die %sDatenschutzerklärung%s"
1132
+
1133
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:3
1134
+ msgid "Manage consents"
1135
+ msgstr "Zustimmungen verwalten"
1136
+
1137
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:6
1138
+ #: views/privacy-tools/form-consent.php:6
1139
+ msgid "Here you can withdraw any consents you have given."
1140
+ msgstr "Hier können Sie Ihre Zustimmungen, die Sie gegeben haben, verwalten."
1141
+
1142
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:8
1143
+ #: views/privacy-tools/form-consent.php:9
1144
+ msgid "Consent types"
1145
+ msgstr "Zustimmungsarten"
1146
+
1147
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:23
1148
+ #: views/privacy-tools/form-consent.php:24
1149
+ msgid "Withdraw"
1150
+ msgstr "Widerrufen"
1151
+
1152
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:5
1153
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:5
1154
+ msgctxt "(Admin)"
1155
+ msgid "Delete this user and all data"
1156
+ msgstr ""
1157
+
1158
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:11
1159
+ msgctxt "(Admin)"
1160
+ msgid "Delete my data"
1161
+ msgstr ""
1162
+
1163
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:15
1164
+ #: views/privacy-tools/form-delete.php:13
1165
+ msgid "Delete all data we have gathered about you."
1166
+ msgstr "Alle Daten, die wir über Sie gesammelt haben, widerrufen."
1167
+
1168
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:16
1169
+ #: views/privacy-tools/form-delete.php:14
1170
+ msgid "If you have a user account on our site, it will also be deleted."
1171
+ msgstr ""
1172
+ "Sollten Sie einen Benutzerkonto auf unserer Website haben, wird dieser "
1173
+ "ebenfalls gelöscht."
1174
+
1175
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:17
1176
+ #: views/privacy-tools/form-delete.php:15
1177
+ msgid "Be careful - this action is permanent and CANNOT be undone."
1178
+ msgstr ""
1179
+ "Seien Sie vorsichtig - diese Aktion ist dauerhaft und KANN NICHT rückgängig "
1180
+ "gemacht werden."
1181
+
1182
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:22
1183
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:23
1184
+ msgctxt "(Admin)"
1185
+ msgid ""
1186
+ "You seem to have an administrator or equivalent role, so deleting/"
1187
+ "anonymizing via this page is disabled."
1188
+ msgstr ""
1189
+
1190
+ #: views/modules/wordpress-user/dashboard/form-export.php:7
1191
+ #: views/privacy-tools/form-export.php:1
1192
+ msgid "Download your data"
1193
+ msgstr "Ihre Daten herunterladen"
1194
+
1195
+ #: views/modules/wordpress-user/dashboard/form-export.php:12
1196
+ #: views/privacy-tools/form-export.php:13
1197
+ msgid "Download as table"
1198
+ msgstr "Download als Tabelle"
1199
+
1200
+ #: views/modules/wordpress-user/dashboard/form-export.php:15
1201
+ #: views/privacy-tools/form-export.php:22
1202
+ msgid "Export as JSON"
1203
+ msgstr "Export als JSON"
1204
+
1205
+ #: views/modules/wordpress-user/dashboard/form-export.php:19
1206
+ #: views/privacy-tools/form-export.php:4
1207
+ msgid "You can download all your data formatted as a table for viewing."
1208
+ msgstr ""
1209
+ "Sie können alle Ihre Daten als eine Tabelle formatiert zur Ansicht "
1210
+ "herunterladen."
1211
+
1212
+ #: views/modules/wordpress-user/dashboard/form-export.php:20
1213
+ #: views/privacy-tools/form-export.php:5
1214
+ msgid "Alternatively, you can export it in machine-readable JSON format."
1215
+ msgstr "Alternativ können Sie sie im maschinenlesbaren JSON-Format exportieren"
1216
+
1217
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:11
1218
+ msgctxt "(Admin)"
1219
+ msgid "Delete user and all data"
1220
+ msgstr ""
1221
+
1222
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:14
1223
+ msgctxt "(Admin)"
1224
+ msgid "Anonymize user and all data"
1225
+ msgstr ""
1226
+
1227
+ #: views/modules/wordpress-user/dashboard/profile-page/header.php:2
1228
+ msgctxt "(Admin)"
1229
+ msgid "GDPR Data"
1230
+ msgstr ""
1231
+
1232
+ #: views/modules/wordpress-user/dashboard/profile-page/header.php:6
1233
+ msgctxt "(Admin)"
1234
+ msgid "This user has been anonymized."
1235
+ msgstr ""
1236
+
1237
+ #: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:4
1238
+ msgctxt "(Admin)"
1239
+ msgid "Consents given"
1240
+ msgstr ""
1241
+
1242
+ #: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:17
1243
+ msgctxt "(Admin)"
1244
+ msgid "No consents given"
1245
+ msgstr ""
1246
+
1247
+ #: views/privacy-tools/form-consent.php:2
1248
+ msgid "Consent"
1249
+ msgstr "Zustimmung"
1250
+
1251
+ #: views/privacy-tools/form-delete.php:1
1252
+ #: views/privacy-tools/notice-admin-role.php:1
1253
+ msgid "Delete my user and data"
1254
+ msgstr "Meinen Benutzer und Daten löschen"
1255
+
1256
+ #: views/privacy-tools/form-delete.php:7
1257
+ msgid "Delete my data"
1258
+ msgstr "Meine Daten löschen"
1259
+
1260
+ #: views/privacy-tools/form-identify.php:8
1261
+ msgid "Back to Privacy Tools"
1262
+ msgstr "Zurück zu Privatsphäre Tools"
1263
+
1264
+ #: views/privacy-tools/form-identify.php:14
1265
+ msgid "Identify yourself!"
1266
+ msgstr "Bitte identifizieren Sie sich."
1267
+
1268
+ #: views/privacy-tools/form-identify.php:17
1269
+ #: views/privacy-tools/form-identify.php:20
1270
+ msgid "Enter your email address"
1271
+ msgstr "Geben Sie Ihre E-Mail Adresse ein"
1272
+
1273
+ #: views/privacy-tools/form-identify.php:23
1274
+ msgid "Send email"
1275
+ msgstr "E-Mail senden"
1276
+
1277
+ #: views/privacy-tools/notice-admin-role.php:4
1278
+ msgctxt "(Admin)"
1279
+ msgid "Data deletion is disabled for administrative accounts."
1280
+ msgstr ""
1281
+
1282
+ #: views/privacy-tools/notices.php:3
1283
+ msgid ""
1284
+ "We will send you an email with the link to access your data. Please check "
1285
+ "your spam folder as well!"
1286
+ msgstr ""
1287
+ "Wir senden Ihnen eine E-Mail mit einem Link, um an Ihre Daten zu gelangen. "
1288
+ "Bitte überprüfen Sie auch Ihren Spam-Ordner."
1289
+
1290
+ #: views/privacy-tools/notices.php:7
1291
+ msgid "The email you entered does not appear to be a valid email."
1292
+ msgstr ""
1293
+ "Die angegebene E-Mail Adresse scheint keine richtige E-Mail Adresse zu sein."
1294
+
1295
+ #: views/privacy-tools/notices.php:11
1296
+ msgid "Sorry - the link seems to have expired. Please try again!"
1297
+ msgstr ""
1298
+ "Sorry - der Link scheint abgelaufen zu sein. Bitte versuchen Sie es erneut."
1299
+
1300
+ #: views/privacy-tools/notices.php:23
1301
+ msgid "Your personal data has been removed!"
1302
+ msgstr "Ihre persönlichen Daten wurden entfernt."
1303
+
1304
+ #: views/privacy-tools/privacy-tools.php:5
1305
+ msgid "You are identified as"
1306
+ msgstr "Du wurdest identifiziert als"
languages/gdpr-framework-es_ES.mo ADDED
Binary file
languages/gdpr-framework-es_ES.po ADDED
@@ -0,0 +1,1750 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Translation of Plugins - WP GDPR - Stable (latest release) in Spanish (Spain)
2
+ # This file is distributed under the same license as the Plugins - WP GDPR - Stable (latest release) package.
3
+ msgid ""
4
+ msgstr ""
5
+ "Project-Id-Version: The GDPR Framework en español\n"
6
+ "POT-Creation-Date: 2018-04-18 09:35+0200\n"
7
+ "PO-Revision-Date: 2018-04-18 09:40+0200\n"
8
+ "Last-Translator: PNTE <blogs@educacion.navarra.es>\n"
9
+ "Language-Team: PNTE <blogs@educacion.navarra.es>\n"
10
+ "Language: es_ES\n"
11
+ "MIME-Version: 1.0\n"
12
+ "Content-Type: text/plain; charset=UTF-8\n"
13
+ "Content-Transfer-Encoding: 8bit\n"
14
+ "Plural-Forms: nplurals=2; plural=(n != 1);\n"
15
+ "X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;"
16
+ "_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2;_ex:1,2c;"
17
+ "esc_attr__;esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c\n"
18
+ "X-Generator: Poedit 2.0.6\n"
19
+ "X-Poedit-SourceCharset: UTF-8\n"
20
+ "X-Poedit-Basepath: ..\n"
21
+ "X-Poedit-SearchPath-0: .\n"
22
+
23
+ #: bootstrap.php:60
24
+ msgctxt "(Admin)"
25
+ msgid "Anonymous"
26
+ msgstr "Anónimo"
27
+
28
+ #: gdpr-framework.php:26
29
+ msgctxt "(Admin)"
30
+ msgid "WordPress GDPR &rsaquo; Error"
31
+ msgstr "WordPress GDPR &rsaquo; Error"
32
+
33
+ #: gdpr-framework.php:36
34
+ msgctxt "(Admin)"
35
+ msgid "You must be using PHP 5.6.33 or greater."
36
+ msgstr "Debes utilizar la versión 5.6.33 de PHP o superior."
37
+
38
+ #: gdpr-framework.php:37
39
+ msgctxt "(Admin)"
40
+ msgid "Invalid PHP version"
41
+ msgstr "Versión de PHP no válida"
42
+
43
+ #: gdpr-framework.php:46
44
+ msgctxt "(Admin)"
45
+ msgid "You must be using WordPress 4.3.0 or greater."
46
+ msgstr "Debes utilizar la versión 4.3.0 de WordPress o superior."
47
+
48
+ #: gdpr-framework.php:47
49
+ msgctxt "(Admin)"
50
+ msgid "Invalid WordPress version"
51
+ msgstr "Versión de WordPress no válida"
52
+
53
+ #: gdpr-framework.php:59
54
+ msgctxt "(Admin)"
55
+ msgid ""
56
+ "You appear to be running a development version of GDPR. You must run "
57
+ "<code>composer install</code> from the plugin directory."
58
+ msgstr ""
59
+ "Parece que estás ejecutando una versión de desarrollo del plugin GDPR. Debes "
60
+ "ejecutar <code>composer install</code> desde el directorio del plugin."
61
+
62
+ #: gdpr-framework.php:64
63
+ msgctxt "(Admin)"
64
+ msgid "Autoloader not found."
65
+ msgstr "No se ha encontrado el autocargador."
66
+
67
+ #: src/Admin/AdminTab.php:115
68
+ msgctxt "(Admin)"
69
+ msgid "Save"
70
+ msgstr "Guardar"
71
+
72
+ #: src/Admin/AdminTab.php:151
73
+ msgctxt "(Admin)"
74
+ msgid "Policy generated!"
75
+ msgstr "La política ha sido generada."
76
+
77
+ #: src/Admin/AdminTabGeneral.php:11
78
+ msgctxt "(Admin)"
79
+ msgid "General"
80
+ msgstr "General"
81
+
82
+ #: src/Admin/AdminTabGeneral.php:38
83
+ msgctxt "(Admin)"
84
+ msgid "General Settings"
85
+ msgstr "Configuración general"
86
+
87
+ #: src/Admin/AdminTabGeneral.php:43
88
+ msgctxt "(Admin)"
89
+ msgid "Enable Privacy Tools"
90
+ msgstr "Activar las herramientas de privacidad"
91
+
92
+ #: src/Admin/AdminTabGeneral.php:53
93
+ msgctxt "(Admin)"
94
+ msgid "Pages"
95
+ msgstr "Páginas"
96
+
97
+ #: src/Admin/AdminTabGeneral.php:58 src/Admin/WordpressAdmin.php:151
98
+ msgctxt "(Admin)"
99
+ msgid "Privacy Tools Page"
100
+ msgstr "Página de herramienta de privacidad"
101
+
102
+ #: src/Admin/AdminTabGeneral.php:65 src/Admin/WordpressAdmin.php:147
103
+ msgctxt "(Admin)"
104
+ msgid "Privacy Policy Page"
105
+ msgstr "Página de política de privacidad"
106
+
107
+ #: src/Admin/AdminTabGeneral.php:72
108
+ msgctxt "(Admin)"
109
+ msgid "Terms & Conditions Page"
110
+ msgstr "Página de términos y condiciones"
111
+
112
+ #: src/Admin/AdminTabGeneral.php:82
113
+ msgctxt "(Admin)"
114
+ msgid "View & Export Data"
115
+ msgstr "Ver y exportar los datos"
116
+
117
+ #: src/Admin/AdminTabGeneral.php:87
118
+ msgctxt "(Admin)"
119
+ msgid "Export action"
120
+ msgstr "Acción de exportación"
121
+
122
+ #: src/Admin/AdminTabGeneral.php:94 src/Admin/AdminTabGeneral.php:133
123
+ msgctxt "(Admin)"
124
+ msgid "Email to notify"
125
+ msgstr "Email para notificar"
126
+
127
+ #: src/Admin/AdminTabGeneral.php:105
128
+ msgctxt "(Admin)"
129
+ msgid "Delete & Anonymize Data"
130
+ msgstr "Borrar y anonimizar los datos"
131
+
132
+ #: src/Admin/AdminTabGeneral.php:110
133
+ msgctxt "(Admin)"
134
+ msgid "Delete action"
135
+ msgstr "Acción de borrado"
136
+
137
+ #: src/Admin/AdminTabGeneral.php:117
138
+ msgctxt "(Admin)"
139
+ msgid "Delete or reassign content?"
140
+ msgstr "¿Borrar o reasignar el contenido?"
141
+
142
+ #: src/Admin/AdminTabGeneral.php:125
143
+ msgctxt "(Admin)"
144
+ msgid "Reassign content to"
145
+ msgstr "Reasignar el contenido a"
146
+
147
+ #: src/Admin/AdminTabGeneral.php:145
148
+ msgctxt "(Admin)"
149
+ msgid "Styling"
150
+ msgstr "Estilos"
151
+
152
+ #: src/Admin/AdminTabGeneral.php:150
153
+ msgctxt "(Admin)"
154
+ msgid "Enable basic styling on Privacy Tools page"
155
+ msgstr "Activar los estilos básicos en la página de herramientas de privacidad"
156
+
157
+ #: src/Admin/AdminTabGeneral.php:162
158
+ msgctxt "(Admin)"
159
+ msgid "Compatibility"
160
+ msgstr "Compatibilidad"
161
+
162
+ #: src/Admin/AdminTabGeneral.php:167
163
+ msgctxt "(Admin)"
164
+ msgid "Enable automatic theme compatibility"
165
+ msgstr "Activar la compatibilidad automática del tema"
166
+
167
+ #: src/Admin/AdminTabGeneral.php:184 src/Admin/AdminTabGeneral.php:200
168
+ #: src/Admin/AdminTabGeneral.php:213 src/Admin/AdminTabGeneral.php:252
169
+ #: views/installer/steps/configuration-settings.php:62
170
+ msgctxt "(Admin)"
171
+ msgid "&mdash; Select &mdash;"
172
+ msgstr "&mdash; Seleccionar &mdash;"
173
+
174
+ #: src/Admin/WordpressAdmin.php:65
175
+ msgctxt "(Admin)"
176
+ msgid "Privacy & GDPR Settings"
177
+ msgstr "Configuración de la privacidad y el RGPD"
178
+
179
+ #: src/Admin/WordpressAdmin.php:66
180
+ msgctxt "(Admin)"
181
+ msgid "Privacy"
182
+ msgstr "Privacidad"
183
+
184
+ #: src/Components/Consent/AdminTabConsent.php:30
185
+ #: src/Components/Consent/AdminTabConsent.php:49
186
+ msgctxt "(Admin)"
187
+ msgid "Consent"
188
+ msgstr "Consentimiento"
189
+
190
+ #: src/Components/Consent/AdminTabConsent.php:157
191
+ msgctxt "(Admin)"
192
+ msgid "Consent slug is a required field!"
193
+ msgstr "El slug del consentimiento es un campo obligatorio."
194
+
195
+ #: src/Components/Consent/AdminTabConsent.php:162
196
+ msgctxt "(Admin)"
197
+ msgid ""
198
+ "You may only use alphanumeric characters, dash and underscore in the consent "
199
+ "slug field."
200
+ msgstr ""
201
+ "Solo puedes utilizar caracteres alfanuméricos, guiones y guiones bajos en el "
202
+ "campo del slug de consentimiento."
203
+
204
+ #: src/Components/Consent/AdminTabConsent.php:167
205
+ msgctxt "(Admin)"
206
+ msgid "Consent title is a required field!"
207
+ msgstr "El título del consentimiento es un campo obligatorio."
208
+
209
+ #: src/Components/Consent/AdminTabConsent.php:179
210
+ msgid ""
211
+ "To use this website, you accepted our Privacy Policy. If you wish to "
212
+ "withdraw your acceptance, please use the \"Delete my data\" button below."
213
+ msgstr ""
214
+ "Para utilizar este sitio web, has tenido que aceptar nuestra política de "
215
+ "privacidad. Si quieres retirar tu aceptación, por favor utiliza el botón "
216
+ "\"Borrar mis datos\", que aparece a continuación."
217
+
218
+ #: src/Components/Consent/ConsentManager.php:46
219
+ #: views/modules/contact-form-7/content-privacy.php:2
220
+ #: views/modules/wordpress-comments/terms-checkbox.php:14
221
+ #: views/modules/wordpress-user/registration-terms-checkbox.php:15
222
+ #, php-format
223
+ msgid "I accept the %sPrivacy Policy%s"
224
+ msgstr "Acepto la %sPolítica de privacidad%s"
225
+
226
+ #: src/Components/Consent/ConsentManager.php:50
227
+ #: src/Components/Consent/ConsentManager.php:69
228
+ msgctxt "(Admin)"
229
+ msgid ""
230
+ "This consent is not visible by default. If someone wishes to withdraw it, "
231
+ "they should simply request to delete all their data."
232
+ msgstr ""
233
+ "Este consentimiento no es visible por defecto. Si alguien desea retirarlo, "
234
+ "simplemente debe solicitar que se borren todos sus datos."
235
+
236
+ #: src/Components/Consent/ConsentManager.php:65
237
+ #, php-format
238
+ msgid "I accept the %sTerms & Conditions%s"
239
+ msgstr "Acepto los %sTérminos y condiciones%s"
240
+
241
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:19
242
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:61
243
+ #: views/admin/privacy-policy/generated.php:1 views/installer/header.php:41
244
+ msgctxt "(Admin)"
245
+ msgid "Privacy Policy"
246
+ msgstr "Política de privacidad"
247
+
248
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:70
249
+ msgctxt "(Admin)"
250
+ msgid "Company information"
251
+ msgstr "Información de la compañía"
252
+
253
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:75
254
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:209
255
+ msgctxt "(Admin)"
256
+ msgid "Company Name"
257
+ msgstr "Nombre de la compañía"
258
+
259
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:82
260
+ msgctxt "(Admin)"
261
+ msgid "Company Email"
262
+ msgstr "Email de la compañía"
263
+
264
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:89
265
+ msgctxt "(Admin)"
266
+ msgid "Company Location"
267
+ msgstr "Ubicación de la compañía"
268
+
269
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:105
270
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:245
271
+ msgctxt "(Admin)"
272
+ msgid "Representative Contact Name"
273
+ msgstr "Nombre del representante para contacto"
274
+
275
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:112
276
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:252
277
+ msgctxt "(Admin)"
278
+ msgid "Representative Contact Email"
279
+ msgstr "Email del representante para contacto"
280
+
281
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:119
282
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:259
283
+ msgctxt "(Admin)"
284
+ msgid "Representative Contact Phone"
285
+ msgstr "Teléfono del representante para contacto"
286
+
287
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:135
288
+ msgctxt "(Admin)"
289
+ msgid "Data Protection Authority"
290
+ msgstr "Autoridad de protección de datos"
291
+
292
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:141
293
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:286
294
+ msgctxt "(Admin)"
295
+ msgid "Data Protection Authority Website"
296
+ msgstr "Sitio web de la autoridad de protección de datos"
297
+
298
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:148
299
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:293
300
+ msgctxt "(Admin)"
301
+ msgid "Data Protection Authority Email"
302
+ msgstr "Email de la autoridad de protección de datos"
303
+
304
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:155
305
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:300
306
+ msgctxt "(Admin)"
307
+ msgid "Data Protection Authority Phone"
308
+ msgstr "Teléfono de la autoridad de protección de datos"
309
+
310
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:165
311
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:175
312
+ msgctxt "(Admin)"
313
+ msgid "Data Protection Officer"
314
+ msgstr "Responsable de protección de datos"
315
+
316
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:168
317
+ msgctxt "(Admin)"
318
+ msgid "Knowledge base: Do I need to appoint a Data Protection Officer?"
319
+ msgstr ""
320
+ "Base de conocimiento: ¿tengo que nombrar a un responsable de protección de "
321
+ "datos?"
322
+
323
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:182
324
+ msgctxt "(Admin)"
325
+ msgid "Data Protection Officer Name"
326
+ msgstr "Nombre del responsable de protección de datos"
327
+
328
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:190
329
+ msgctxt "(Admin)"
330
+ msgid "Data Protection Officer Email"
331
+ msgstr "Email del responsable de protección de datos"
332
+
333
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:216
334
+ msgctxt "(Admin)"
335
+ msgid "Contact Email"
336
+ msgstr "Email de contacto"
337
+
338
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:235
339
+ msgctxt "(Admin)"
340
+ msgid "Representative Contact"
341
+ msgstr "Contacto con el representante"
342
+
343
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:238
344
+ msgctxt "(Admin)"
345
+ msgid "Knowledge base: Do I need to appoint an EU-based representative?"
346
+ msgstr ""
347
+ "Base de conocimiento: ¿tengo que nombrar a un representante basado en la "
348
+ "Unión Europea?"
349
+
350
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:317
351
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:324
352
+ msgctxt "(Admin)"
353
+ msgid "DPO Name"
354
+ msgstr "Nombre del DPO (Responsable de Protección de Datos)"
355
+
356
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:420
357
+ msgctxt "(Admin)"
358
+ msgid "Save & Generate Policy"
359
+ msgstr "Guardar y generar la política"
360
+
361
+ #: src/Components/PrivacyPolicy/PrivacyPolicy.php:82
362
+ #: src/Installer/Installer.php:271 src/Installer/Steps/PolicySettings.php:199
363
+ #: views/themes/storefront/footer.php:3
364
+ #: views/themes/twentyseventeen/footer.php:3
365
+ #: views/themes/twentysixteen/footer.php:4
366
+ msgid "Privacy Policy"
367
+ msgstr "Política de privacidad"
368
+
369
+ #: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:19
370
+ msgid "This page is currently disabled."
371
+ msgstr "Esta página se encuentra desactivada en este momento."
372
+
373
+ #: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:35
374
+ #: src/Installer/Installer.php:279
375
+ #: src/Installer/Steps/ConfigurationPages.php:55
376
+ #: views/themes/storefront/footer.php:7
377
+ #: views/themes/twentyseventeen/footer.php:7
378
+ #: views/themes/twentysixteen/footer.php:9
379
+ msgid "Privacy Tools"
380
+ msgstr "Herramientas de privacidad"
381
+
382
+ #: src/Components/Support/AdminTabSupport.php:13
383
+ #: src/Components/Support/AdminTabSupport.php:20
384
+ msgctxt "(Admin)"
385
+ msgid "Support"
386
+ msgstr "Soporte"
387
+
388
+ #: src/Components/WordpressComments/WordpressComments.php:90
389
+ #, php-format
390
+ msgid ""
391
+ "%sERROR:%s You need to accept the terms and conditions to post a comment."
392
+ msgstr ""
393
+ "%sERROR:%s para publicar un comentario, debes aceptar los términos y "
394
+ "condiciones."
395
+
396
+ #: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:54
397
+ #: views/privacy-tools/notices.php:19
398
+ msgid "We have received your request and will reply within 30 days."
399
+ msgstr "Hemos recibido tu solicitud y la responderemos en 30 días."
400
+
401
+ #: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:59
402
+ #: views/privacy-tools/notices.php:15
403
+ msgid "Consent withdrawn."
404
+ msgstr "El consentimiento ha sido retirado."
405
+
406
+ #: src/Components/WordpressUser/RegistrationForm.php:42
407
+ msgid "<strong>ERROR</strong>: You must accept the terms and conditions."
408
+ msgstr "<strong>ERROR</strong>: debes aceptar los términos y condiciones."
409
+
410
+ #: src/Components/WordpressUser/WordpressUser.php:63
411
+ #: src/Components/WordpressUser/WordpressUser.php:64
412
+ #: views/modules/wordpress-user/dashboard/data-page/header.php:2
413
+ msgctxt "(Admin)"
414
+ msgid "Privacy Tools"
415
+ msgstr "Herramientas de privacidad"
416
+
417
+ #: src/DataSubject/AdminTabDataSubject.php:27
418
+ #: src/DataSubject/AdminTabDataSubject.php:41
419
+ msgctxt "(Admin)"
420
+ msgid "Data Subjects"
421
+ msgstr "Datos personales"
422
+
423
+ #: src/DataSubject/DataRepository.php:143
424
+ msgid "Data exported"
425
+ msgstr "Los datos han sido exportados"
426
+
427
+ #: src/DataSubject/DataRepository.php:158
428
+ msgid "Data export request"
429
+ msgstr "Petición de exportación de datos"
430
+
431
+ #: src/DataSubject/DataRepository.php:171
432
+ msgid "Data removed"
433
+ msgstr "Los datos han sido eliminados"
434
+
435
+ #: src/DataSubject/DataRepository.php:186
436
+ msgid "Data removal request"
437
+ msgstr "Petición de solicitud de datos"
438
+
439
+ #: src/DataSubject/DataSubjectIdentificator.php:65
440
+ #: src/DataSubject/DataSubjectIdentificator.php:82
441
+ msgid "Your personal data on"
442
+ msgstr "Tus datos personales en"
443
+
444
+ #: src/Helpers.php:27
445
+ msgctxt "(Admin)"
446
+ msgid "Austria"
447
+ msgstr "Austria"
448
+
449
+ #: src/Helpers.php:28
450
+ msgctxt "(Admin)"
451
+ msgid "Belgium"
452
+ msgstr "Bélgica"
453
+
454
+ #: src/Helpers.php:29
455
+ msgctxt "(Admin)"
456
+ msgid "Bulgaria"
457
+ msgstr "Bulgaria"
458
+
459
+ #: src/Helpers.php:30
460
+ msgctxt "(Admin)"
461
+ msgid "Croatia"
462
+ msgstr "Croacia"
463
+
464
+ #: src/Helpers.php:31
465
+ msgctxt "(Admin)"
466
+ msgid "Cyprus"
467
+ msgstr "Chipre"
468
+
469
+ #: src/Helpers.php:32
470
+ msgctxt "(Admin)"
471
+ msgid "Czech Republic"
472
+ msgstr "República Checa"
473
+
474
+ #: src/Helpers.php:33
475
+ msgctxt "(Admin)"
476
+ msgid "Denmark"
477
+ msgstr "Dinamarca"
478
+
479
+ #: src/Helpers.php:34
480
+ msgctxt "(Admin)"
481
+ msgid "Estonia"
482
+ msgstr "Estonia"
483
+
484
+ #: src/Helpers.php:35
485
+ msgctxt "(Admin)"
486
+ msgid "Finland"
487
+ msgstr "Finlandia"
488
+
489
+ #: src/Helpers.php:36
490
+ msgctxt "(Admin)"
491
+ msgid "France"
492
+ msgstr "Francia"
493
+
494
+ #: src/Helpers.php:37
495
+ msgctxt "(Admin)"
496
+ msgid "Germany"
497
+ msgstr "Alemania"
498
+
499
+ #: src/Helpers.php:38
500
+ msgctxt "(Admin)"
501
+ msgid "Greece"
502
+ msgstr "Grecia"
503
+
504
+ #: src/Helpers.php:39
505
+ msgctxt "(Admin)"
506
+ msgid "Hungary"
507
+ msgstr "Hungría"
508
+
509
+ #: src/Helpers.php:40
510
+ msgctxt "(Admin)"
511
+ msgid "Ireland"
512
+ msgstr "Irlanda"
513
+
514
+ #: src/Helpers.php:41
515
+ msgctxt "(Admin)"
516
+ msgid "Italy"
517
+ msgstr "Italia"
518
+
519
+ #: src/Helpers.php:42
520
+ msgctxt "(Admin)"
521
+ msgid "Latvia"
522
+ msgstr "Letonia"
523
+
524
+ #: src/Helpers.php:43
525
+ msgctxt "(Admin)"
526
+ msgid "Lithuania"
527
+ msgstr "Lituania"
528
+
529
+ #: src/Helpers.php:44
530
+ msgctxt "(Admin)"
531
+ msgid "Luxembourg"
532
+ msgstr "Luxemburgo"
533
+
534
+ #: src/Helpers.php:45
535
+ msgctxt "(Admin)"
536
+ msgid "Malta"
537
+ msgstr "Malta"
538
+
539
+ #: src/Helpers.php:46
540
+ msgctxt "(Admin)"
541
+ msgid "Netherlands"
542
+ msgstr "Países Bajos"
543
+
544
+ #: src/Helpers.php:47
545
+ msgctxt "(Admin)"
546
+ msgid "Poland"
547
+ msgstr "Polonia"
548
+
549
+ #: src/Helpers.php:48
550
+ msgctxt "(Admin)"
551
+ msgid "Portugal"
552
+ msgstr "Portugal"
553
+
554
+ #: src/Helpers.php:49
555
+ msgctxt "(Admin)"
556
+ msgid "Romania"
557
+ msgstr "Rumanía"
558
+
559
+ #: src/Helpers.php:50
560
+ msgctxt "(Admin)"
561
+ msgid "Slovakia"
562
+ msgstr "Eslovaquia"
563
+
564
+ #: src/Helpers.php:51
565
+ msgctxt "(Admin)"
566
+ msgid "Slovenia"
567
+ msgstr "Eslovenia"
568
+
569
+ #: src/Helpers.php:52
570
+ msgctxt "(Admin)"
571
+ msgid "Spain"
572
+ msgstr "España"
573
+
574
+ #: src/Helpers.php:53
575
+ msgctxt "(Admin)"
576
+ msgid "Sweden"
577
+ msgstr "Suecia"
578
+
579
+ #: src/Helpers.php:54
580
+ msgctxt "(Admin)"
581
+ msgid "United Kingdom"
582
+ msgstr "Reino Unido"
583
+
584
+ #: src/Helpers.php:69
585
+ msgctxt "(Admin)"
586
+ msgid "Iceland"
587
+ msgstr "Islandia"
588
+
589
+ #: src/Helpers.php:70
590
+ msgctxt "(Admin)"
591
+ msgid "Norway"
592
+ msgstr "Noruega"
593
+
594
+ #: src/Helpers.php:71
595
+ msgctxt "(Admin)"
596
+ msgid "Liechtenstein"
597
+ msgstr "Liechtenstein"
598
+
599
+ #: src/Helpers.php:72
600
+ msgctxt "(Admin)"
601
+ msgid "Switzerland"
602
+ msgstr "Suiza"
603
+
604
+ #: src/Helpers.php:73
605
+ msgctxt "(Admin)"
606
+ msgid "United States"
607
+ msgstr "Estados Unidos"
608
+
609
+ #: src/Helpers.php:74
610
+ msgctxt "(Admin)"
611
+ msgid "Rest of the world"
612
+ msgstr "Resto del mundo"
613
+
614
+ #: src/Helpers.php:145
615
+ msgid "An error has occurred. Please contact the site administrator."
616
+ msgstr ""
617
+ "Se ha producido un error. Por favor, ponte en contacto con el administrador "
618
+ "del sitio."
619
+
620
+ #: src/Installer/Installer.php:135
621
+ msgctxt "(Admin)"
622
+ msgid "Setup Wizard"
623
+ msgstr "Asistente de configuración"
624
+
625
+ #: src/Installer/Steps/ConfigurationPages.php:23
626
+ #: src/Installer/Steps/PolicySettings.php:23
627
+ #: src/Installer/Steps/PolicySettings.php:48
628
+ msgctxt "(Admin)"
629
+ msgid "&mdash; Create a new page &mdash;"
630
+ msgstr "&mdash; Crear una nueva página &mdash;"
631
+
632
+ #: src/Installer/Steps/PolicySettings.php:38
633
+ msgctxt "(Admin)"
634
+ msgid ""
635
+ "We have automatically selected your WooCommerce Terms & Conditions page."
636
+ msgstr ""
637
+ "Hemos seleccionado automáticamente tu página de términos y condiciones de "
638
+ "WooCommerce."
639
+
640
+ #: src/Modules/ContactForm7/ContactForm7.php:35
641
+ msgctxt "(Admin)"
642
+ msgid "gdpr terms txt"
643
+ msgstr "gdpr terms txt"
644
+
645
+ #: src/Router.php:80 src/Router.php:92 src/Router.php:125 src/Router.php:141
646
+ #, php-format
647
+ msgid "Nonce error for action \"%s\". Please go back and try again!"
648
+ msgstr ""
649
+ "Error del nonce correspondiente a la acción \"%s\". Por favor, vuelve atrás "
650
+ "e inténtalo de nuevo."
651
+
652
+ #: src/Router.php:149
653
+ msgctxt "(Admin)"
654
+ msgid "You do not have the required permissions to perform this action!"
655
+ msgstr "No tienes los permisos necesarios para llevar a cabo esta acción."
656
+
657
+ #: views/admin/consent.php:3
658
+ msgctxt "(Admin)"
659
+ msgid "Default consent types"
660
+ msgstr "Tipos de consentimiento por defecto"
661
+
662
+ #: views/admin/consent.php:4
663
+ msgctxt "(Admin)"
664
+ msgid ""
665
+ "These are the consent types that have been automatically registered by the "
666
+ "framework or a plugin."
667
+ msgstr ""
668
+ "Estos son los tipos de consentimiento por defecto que han sido registrados "
669
+ "automáticamente por el framework o un plugin."
670
+
671
+ #: views/admin/consent.php:7 views/admin/consent.php:52
672
+ msgctxt "(Admin)"
673
+ msgid "Slug"
674
+ msgstr "Slug"
675
+
676
+ #: views/admin/consent.php:8 views/admin/consent.php:38
677
+ #: views/admin/consent.php:60
678
+ msgctxt "(Admin)"
679
+ msgid "Title"
680
+ msgstr "Título"
681
+
682
+ #: views/admin/consent.php:9 views/admin/consent.php:41
683
+ #: views/admin/consent.php:63
684
+ msgctxt "(Admin)"
685
+ msgid "Description"
686
+ msgstr "Descripción"
687
+
688
+ #: views/admin/consent.php:10
689
+ msgctxt "(Admin)"
690
+ msgid "Visibility"
691
+ msgstr "Visibilidad"
692
+
693
+ #: views/admin/consent.php:18
694
+ msgctxt "(Admin)"
695
+ msgid "Visible"
696
+ msgstr "Visible"
697
+
698
+ #: views/admin/consent.php:20
699
+ msgctxt "(Admin)"
700
+ msgid "Hidden"
701
+ msgstr "Oculto"
702
+
703
+ #: views/admin/consent.php:29
704
+ msgctxt "(Admin)"
705
+ msgid "Custom consent types"
706
+ msgstr "Tipos de consentimiento personalizados"
707
+
708
+ #: views/admin/consent.php:30
709
+ msgctxt "(Admin)"
710
+ msgid ""
711
+ "Here you can add custom consent types to track. They will not be used "
712
+ "anywhere by default - you will need to build an integration for each of them."
713
+ msgstr ""
714
+ "Desde aquí puedes añadir tipos de consentimiento personalizados. No se "
715
+ "utilizarán en ningún lugar por defecto, así que tendrás que construir una "
716
+ "integración para cada uno de elloss"
717
+
718
+ #: views/admin/consent.php:35
719
+ msgctxt "(Admin)"
720
+ msgid "Machine-readable slug"
721
+ msgstr "Slug legible por máquinas"
722
+
723
+ #: views/admin/consent.php:44 views/admin/consent.php:68
724
+ msgctxt "(Admin)"
725
+ msgid "Visible?"
726
+ msgstr "¿Visible?"
727
+
728
+ #: views/admin/consent.php:72
729
+ msgctxt "(Admin)"
730
+ msgid "Remove"
731
+ msgstr "Eliminar"
732
+
733
+ #: views/admin/consent.php:93
734
+ msgctxt "(Admin)"
735
+ msgid "Additional info"
736
+ msgstr "Información adicional"
737
+
738
+ #: views/admin/consent.php:95
739
+ msgctxt "(Admin)"
740
+ msgid ""
741
+ "This text will be displayed to your data subjects on the Privacy Tools page."
742
+ msgstr ""
743
+ "Este texto se mostrará a todas las personas, en la página de herramientas de "
744
+ "privacidad."
745
+
746
+ #: views/admin/data-subjects/search-form.php:2
747
+ msgctxt "(Admin)"
748
+ msgid ""
749
+ "On this page, you can find which data subjects personal data you are storing "
750
+ "and download, export or delete it."
751
+ msgstr ""
752
+ "En esta página puedes averiguar qué datos personales estás almacenando, y "
753
+ "también puedes descargarlos, exportarlos o borrarlos."
754
+
755
+ #: views/admin/data-subjects/search-form.php:10
756
+ msgctxt "(Admin)"
757
+ msgid "Find data subject by email"
758
+ msgstr "Encontrar datos personales por email"
759
+
760
+ #: views/admin/data-subjects/search-form.php:11
761
+ msgctxt "(Admin)"
762
+ msgid "Email address"
763
+ msgstr "Dirección de email"
764
+
765
+ #: views/admin/data-subjects/search-form.php:16
766
+ msgctxt "(Admin)"
767
+ msgid "Search"
768
+ msgstr "Buscar"
769
+
770
+ #: views/admin/data-subjects/search-results.php:7
771
+ msgctxt "(Admin)"
772
+ msgid "Username"
773
+ msgstr "Nombre de usuario"
774
+
775
+ #: views/admin/data-subjects/search-results.php:12
776
+ msgctxt "(Admin)"
777
+ msgid "is not a registered user."
778
+ msgstr "no es un usuario registrado."
779
+
780
+ #: views/admin/data-subjects/search-results.php:16
781
+ msgctxt "(Admin)"
782
+ msgid "Download data (html)"
783
+ msgstr "Descargar los datos (HTML)"
784
+
785
+ #: views/admin/data-subjects/search-results.php:17
786
+ msgctxt "(Admin)"
787
+ msgid "Export data (json)"
788
+ msgstr "Exportar los datos (JSON)"
789
+
790
+ #: views/admin/data-subjects/search-results.php:21
791
+ msgctxt "(Admin)"
792
+ msgid ""
793
+ "This user has admin capabilities. Deleting data via this interface is "
794
+ "disabled."
795
+ msgstr ""
796
+ "Este usuario tiene capacidades de administrador. Se ha desactivado la "
797
+ "posibilidad de borrar sus datos mediante este interfaz."
798
+
799
+ #: views/admin/data-subjects/search-results.php:24
800
+ msgctxt "(Admin)"
801
+ msgid "Anonymize data"
802
+ msgstr "Anonimizar los datos"
803
+
804
+ #: views/admin/data-subjects/search-results.php:25
805
+ msgctxt "(Admin)"
806
+ msgid "Delete data"
807
+ msgstr "Borrar los datos"
808
+
809
+ #: views/admin/data-subjects/search-results.php:29
810
+ msgctxt "(Admin)"
811
+ msgid "No data found!"
812
+ msgstr "No se ha encontrado ningún dato."
813
+
814
+ #: views/admin/general/delete-action-email.php:5
815
+ #: views/admin/general/export-action-email.php:5
816
+ #: views/installer/steps/configuration-settings.php:29
817
+ #: views/installer/steps/configuration-settings.php:79
818
+ msgid "Email address"
819
+ msgstr "Dirección de email"
820
+
821
+ #: views/admin/general/delete-action-reassign.php:3
822
+ #: views/installer/steps/configuration-settings.php:50
823
+ msgctxt "(Admin)"
824
+ msgid "Delete content"
825
+ msgstr "Borrar el contenido"
826
+
827
+ #: views/admin/general/delete-action-reassign.php:6
828
+ #: views/installer/steps/configuration-settings.php:53
829
+ msgctxt "(Admin)"
830
+ msgid "Reassign content to a user"
831
+ msgstr "Reasignar el contenido a un usuario"
832
+
833
+ #: views/admin/general/delete-action-reassign.php:10
834
+ msgctxt "(Admin)"
835
+ msgid ""
836
+ "If the user has submitted any content on your site, should it be deleted or "
837
+ "reassigned to another user?"
838
+ msgstr ""
839
+ "Si el usuario ha enviado cualquier contenido al sitio, debe borrarse o "
840
+ "reasignarse a otro usuario?"
841
+
842
+ #: views/admin/general/description-data-page.php:2
843
+ msgctxt "(Admin)"
844
+ msgid ""
845
+ "Select the page where users can go to control their data. This page must "
846
+ "contain the [gdpr_privacy_tools] shortcode."
847
+ msgstr ""
848
+ "Selecciona la página a la que los usuarios pueden ir para controlar sus "
849
+ "datos. Esta página debe contener el shortcode [gdpr_privacy_tools]."
850
+
851
+ #: views/admin/general/description-delete-action.php:2
852
+ msgctxt "(Admin)"
853
+ msgid "What should happen if a data subject requests deleting their data."
854
+ msgstr "¿Qué debe ocurrir si una persona solicita el borrado de sus datos?"
855
+
856
+ #: views/admin/general/description-export-action.php:2
857
+ msgctxt "(Admin)"
858
+ msgid ""
859
+ "What should happen if a data subject requests viewing or exporting their "
860
+ "data."
861
+ msgstr "¿Qué debe ocurrir si una persona solicita ver o exportar sus datos?"
862
+
863
+ #: views/admin/general/description-terms-page.php:2
864
+ msgctxt "(Admin)"
865
+ msgid "Optional. Select the page which contains your Terms & Conditions"
866
+ msgstr ""
867
+ "Opcional. Selecciona la página que contiene tus términos y condiciones."
868
+
869
+ #: views/admin/general/enable.php:9
870
+ msgctxt "(Admin)"
871
+ msgid "Enable the view, export and forget functionality for users and visitors"
872
+ msgstr ""
873
+ "Activar las funcionalidades de visualización, exportación y olvido para los "
874
+ "usuarios y visitantes"
875
+
876
+ #: views/admin/general/enable.php:12
877
+ msgctxt "(Admin)"
878
+ msgid ""
879
+ "Enable the Privacy Tools page on front-end and dashboard. This allows "
880
+ "visitors to request viewing and deleting their personal data and withdraw "
881
+ "consents."
882
+ msgstr ""
883
+ "Activa la página de herramientas de privacidad en el frontend y en el "
884
+ "escritorio. Esto permite que los visitantes soliciten ver y borrar sus datos "
885
+ "peronales, así como retirar su consentimiento."
886
+
887
+ #: views/admin/general/stylesheet.php:9
888
+ msgctxt "(Admin)"
889
+ msgid "Enable basic styling for Privacy Tools page."
890
+ msgstr ""
891
+ "Activar los estilos básicos de la página de herramientas de privacidad."
892
+
893
+ #: views/admin/general/theme-compatibility.php:9
894
+ #: views/installer/steps/integrations.php:21
895
+ msgctxt "(Admin)"
896
+ msgid ""
897
+ "Automatically add Privacy Policy and Privacy Tools links to your site footer."
898
+ msgstr ""
899
+ "Añadir automáticamente los enlaces de política de privacidad y herramientas "
900
+ "de privacidad al pie de página del sitio."
901
+
902
+ #: views/admin/notices/header.php:4 views/admin/settings-page.php:3
903
+ #: views/installer/header.php:23
904
+ msgctxt "(Admin)"
905
+ msgid "The GDPR Framework"
906
+ msgstr "The GDPR Framework"
907
+
908
+ #: views/admin/notices/helper-autoinstall.php:2
909
+ msgctxt "(Admin)"
910
+ msgid ""
911
+ "A Privacy Policy page has been created, but it is empty. You can generate a "
912
+ "policy template on this page."
913
+ msgstr ""
914
+ "Se ha creado una política de privacidad, pero está vacía. Puedes generar una "
915
+ "plantilla de política de privacidad desde esta página."
916
+
917
+ #: views/admin/notices/helper-policy.php:2
918
+ msgctxt "(Admin)"
919
+ msgid ""
920
+ "Heads up - your Privacy Policy still requires some attention. Find the "
921
+ "places marked with [TODO] and replace them with real content!"
922
+ msgstr ""
923
+ "Atención: tu página de política de privacidad todavía requiere atención. "
924
+ "Encuentra los lugares marcados con [TODO] y sustitúyelos por contenido real."
925
+
926
+ #: views/admin/notices/helper-tools.php:2
927
+ msgctxt "(Admin)"
928
+ msgid "The contents of this page should contain the [gdpr_tools] shortcode."
929
+ msgstr "El contenido de esta página debe incluir el shortcode [gdpr_tools]."
930
+
931
+ #: views/admin/privacy-policy/description-policy-page.php:2
932
+ msgctxt "(Admin)"
933
+ msgid "Select the page which will contain your Privacy Policy"
934
+ msgstr "Selecciona la página que contendrá tu política de privacidad."
935
+
936
+ #: views/admin/privacy-policy/generated.php:3
937
+ msgctxt "(Admin)"
938
+ msgid "Your Privacy Policy has been generated."
939
+ msgstr "Se ha generado tu página de política de privacidad."
940
+
941
+ #: views/admin/privacy-policy/generated.php:20
942
+ msgctxt "(Admin)"
943
+ msgid "&laquo; Back"
944
+ msgstr "&laquo; Volver atrás"
945
+
946
+ #: views/admin/privacy-policy/header.php:2
947
+ msgctxt "(Admin)"
948
+ msgid ""
949
+ "This page allows you to generate a Privacy Policy based on the information "
950
+ "you entered below."
951
+ msgstr ""
952
+ "Esta página te permite generar una política de privacidad basada en la "
953
+ "información que introduzcas a continuación."
954
+
955
+ #: views/admin/settings-page.php:8
956
+ msgctxt "(Admin)"
957
+ msgid "GDPR settings saved!"
958
+ msgstr "La configuración de RGPD ha sido guardada."
959
+
960
+ #: views/admin/settings-page.php:31
961
+ #, php-format
962
+ msgctxt "(Admin)"
963
+ msgid "The GDPR Framework. Built with &#9829; by %sCodelight%s."
964
+ msgstr "The GDPR Framework. Elaborado con &#9829; por %sCodelight%s."
965
+
966
+ #: views/admin/settings-page.php:39
967
+ #, php-format
968
+ msgctxt "(Admin)"
969
+ msgid "Support our development efforts with a %s5-star rating%s."
970
+ msgstr ""
971
+ "Da tu apoyo a nuestros esfuerzos de desarrollo, con una %svaloración de 5 "
972
+ "estrellas%s."
973
+
974
+ #: views/admin/support/contents.php:5 views/installer/steps/finish.php:10
975
+ msgctxt "(Admin)"
976
+ msgid "Need more info?"
977
+ msgstr "¿Necesitas más información?"
978
+
979
+ #: views/admin/support/contents.php:11 views/installer/steps/finish.php:16
980
+ msgctxt "(Admin)"
981
+ msgid "Site Owner's guide to GDPR"
982
+ msgstr "Guía para propietarios de sitios sobre el RGPD"
983
+
984
+ #: views/admin/support/contents.php:14 views/installer/steps/finish.php:19
985
+ msgctxt "(Admin)"
986
+ msgid "Read the full guide on GDPR compliance."
987
+ msgstr "Lee la guía completa sobre el cumplimiento del RGPD."
988
+
989
+ #: views/admin/support/contents.php:20 views/installer/steps/finish.php:25
990
+ msgctxt "(Admin)"
991
+ msgid "Knowledge base"
992
+ msgstr "Base de conocimiento"
993
+
994
+ #: views/admin/support/contents.php:23 views/installer/steps/finish.php:28
995
+ msgctxt "(Admin)"
996
+ msgid "Check out the knowledge base for common questions and answers."
997
+ msgstr ""
998
+ "Consulta nuestra base de conocimiento para encontrar las preguntas más "
999
+ "frecuentes y sus respuestas."
1000
+
1001
+ #: views/admin/support/contents.php:29 views/installer/steps/finish.php:34
1002
+ msgctxt "(Admin)"
1003
+ msgid "Developer's guide to GDPR"
1004
+ msgstr "Guía para desarrolladores sobre el RGPD"
1005
+
1006
+ #: views/admin/support/contents.php:32 views/installer/steps/finish.php:37
1007
+ msgctxt "(Admin)"
1008
+ msgid "We have a thorough guide to help making custom sites compliant."
1009
+ msgstr ""
1010
+ "Tenemos una guía exhaustiva para ayudarte a personalizar tus sitios para que "
1011
+ "cumplan el RGPD."
1012
+
1013
+ #: views/admin/support/contents.php:40 views/installer/steps/finish.php:45
1014
+ msgctxt "(Admin)"
1015
+ msgid "Need help?"
1016
+ msgstr "¿Necesitas ayuda?"
1017
+
1018
+ #: views/admin/support/contents.php:46 views/installer/steps/finish.php:51
1019
+ msgctxt "(Admin)"
1020
+ msgid "Submit a support request"
1021
+ msgstr "Envía una petición de soporte"
1022
+
1023
+ #: views/admin/support/contents.php:49 views/installer/steps/finish.php:54
1024
+ msgctxt "(Admin)"
1025
+ msgid ""
1026
+ "Found a bug or problem with the plugin? Post in the wordpress.org support "
1027
+ "forum."
1028
+ msgstr ""
1029
+ "¿Has encontrado un fallo o un problema con el plugin? Comunícalo en el foro "
1030
+ "de soporte de wordpress.org."
1031
+
1032
+ #: views/admin/support/contents.php:55 views/installer/steps/finish.php:60
1033
+ msgctxt "(Admin)"
1034
+ msgid "Request a consultation"
1035
+ msgstr "Solicita una consulta"
1036
+
1037
+ #: views/admin/support/contents.php:58 views/installer/steps/finish.php:63
1038
+ msgctxt "(Admin)"
1039
+ msgid ""
1040
+ "Need development or legal assistance in making your site compliant? We can "
1041
+ "help!"
1042
+ msgstr ""
1043
+ "¿Necesitas desarrollo o asistencia legal para hacer que tu sitio cumpla con "
1044
+ "el RGPD? ¡Podemos ayudarte!"
1045
+
1046
+ #: views/admin/wizard-buttons.php:2
1047
+ msgctxt "(Admin)"
1048
+ msgid "Restart setup wizard"
1049
+ msgstr "Reiniciar el asistente de configuración"
1050
+
1051
+ #: views/email/action-export.php:8 views/email/action-forget.php:12
1052
+ msgctxt "(Admin)"
1053
+ msgid ""
1054
+ "This email is just for your information. You don't need to take any action"
1055
+ msgstr ""
1056
+ "Este email es solo para tu información. No tienes que llevar a cabo ninguna "
1057
+ "acción."
1058
+
1059
+ #: views/email/action-forget.php:8
1060
+ msgctxt "(Admin)"
1061
+ msgid "The data subject had a user account on your website."
1062
+ msgstr "La persona tiene una cuenta de usuario en tu sitio web."
1063
+
1064
+ #: views/email/identify-data-subject.php:2
1065
+ msgid "Someone has requested access to your data on"
1066
+ msgstr "Alguien ha solicitado acceder a tus datos en"
1067
+
1068
+ #: views/email/identify-data-subject.php:3
1069
+ msgid "If this was a mistake, just ignore this email and nothing will happen."
1070
+ msgstr ""
1071
+ "Si se trata de un error, basta con que ignores este email, y no ocurrirá "
1072
+ "nada."
1073
+
1074
+ #: views/email/identify-data-subject.php:4
1075
+ msgid "To manage your data, visit the following address:"
1076
+ msgstr "Para gestionar tus datos, visita la siguiente dirección:"
1077
+
1078
+ #: views/email/identify-data-subject.php:10
1079
+ msgid "This link is valid for 15 minutes."
1080
+ msgstr "Este enlace es válido durante 15 minutos."
1081
+
1082
+ #: views/email/no-data.php:2
1083
+ msgid "Someone has requested information about your personal data on"
1084
+ msgstr "Alguien ha solicitado información sobre tus datos personales en"
1085
+
1086
+ #: views/email/no-data.php:3
1087
+ msgid "None of your personal data is stored on"
1088
+ msgstr "Ninguno de tus datos personales está almacenado en"
1089
+
1090
+ #: views/email/no-data.php:5
1091
+ msgid ""
1092
+ "If this was a mistake or you did not request this email, just ignore it and "
1093
+ "nothing will happen."
1094
+ msgstr ""
1095
+ "Si se trata de un error, o no has solicitado este email, basta con que lo "
1096
+ "ignores, y no ocurrirá nada."
1097
+
1098
+ #: views/email/request-export.php:13 views/email/request-forget.php:13
1099
+ msgctxt "(Admin)"
1100
+ msgid "As a reminder: according to GDPR, you have 30 days to comply."
1101
+ msgstr ""
1102
+ "Como recordatorio, y de acuerdo con el RGPD, tienes 30 días para cumplirlo."
1103
+
1104
+ #: views/global/delete-action.php:2
1105
+ msgctxt "(Admin)"
1106
+ msgid "Automatically anonymize data"
1107
+ msgstr "Anonimizar los datos de forma automática"
1108
+
1109
+ #: views/global/delete-action.php:5
1110
+ msgctxt "(Admin)"
1111
+ msgid "Automatically delete data"
1112
+ msgstr "Borrar los datos de forma automática"
1113
+
1114
+ #: views/global/delete-action.php:9
1115
+ msgctxt "(Admin)"
1116
+ msgid "Automatically anonymize data and notify me via email"
1117
+ msgstr "Anonimizar automáticamente los datos y avisar por email"
1118
+
1119
+ #: views/global/delete-action.php:13
1120
+ msgctxt "(Admin)"
1121
+ msgid "Automatically delete data and notify me via email"
1122
+ msgstr "Borrar automáticamente los datos y avisar por email"
1123
+
1124
+ #: views/global/delete-action.php:16 views/global/export-action.php:10
1125
+ msgctxt "(Admin)"
1126
+ msgid "Only notify me via email"
1127
+ msgstr "Solo avisar por email"
1128
+
1129
+ #: views/global/export-action.php:2
1130
+ msgctxt "(Admin)"
1131
+ msgid "Automatically download data"
1132
+ msgstr "Descargar automáticamente los datos"
1133
+
1134
+ #: views/global/export-action.php:6
1135
+ msgctxt "(Admin)"
1136
+ msgid "Automatically download data and notify me via email"
1137
+ msgstr "Descargar automáticamente los datos y avisar por email"
1138
+
1139
+ #: views/installer/continue-notice.php:2
1140
+ msgctxt "(Admin)"
1141
+ msgid "The The GDPR Framework setup has not been finalized yet."
1142
+ msgstr ""
1143
+ "La configuración del plugin The GDPR Framework todavía no ha finalizado."
1144
+
1145
+ #: views/installer/continue-notice.php:3
1146
+ msgctxt "(Admin)"
1147
+ msgid "You can continue the setup at any time."
1148
+ msgstr "Puedes continuar con la configuración en cualquier momento."
1149
+
1150
+ #: views/installer/continue-notice.php:6
1151
+ msgctxt "(Admin)"
1152
+ msgid "Continue the setup wizard"
1153
+ msgstr "Continuar con el asistente de configuración"
1154
+
1155
+ #: views/installer/continue-notice.php:9
1156
+ msgctxt "(Admin)"
1157
+ msgid "Hide this message"
1158
+ msgstr "Ocultar este mensaje"
1159
+
1160
+ #: views/installer/footer.php:7
1161
+ msgid "Back"
1162
+ msgstr "Volver atrás"
1163
+
1164
+ #: views/installer/header.php:7
1165
+ msgctxt "(Admin)"
1166
+ msgid "WordPress GDPR &rsaquo; Setup Wizard"
1167
+ msgstr "WordPress GDPR &rsaquo; Asistente de configuración"
1168
+
1169
+ #: views/installer/header.php:26
1170
+ msgctxt "(Admin)"
1171
+ msgid "I need help"
1172
+ msgstr "Necesito ayuda"
1173
+
1174
+ #: views/installer/header.php:29
1175
+ msgctxt "(Admin)"
1176
+ msgid "Developer Docs"
1177
+ msgstr "Documentos para desarrolladores"
1178
+
1179
+ #: views/installer/header.php:36
1180
+ msgctxt "(Admin)"
1181
+ msgid "Configuration"
1182
+ msgstr "Configuración"
1183
+
1184
+ #: views/installer/header.php:46
1185
+ msgctxt "(Admin)"
1186
+ msgid "Forms & Consent"
1187
+ msgstr "Formularios y consentimiento"
1188
+
1189
+ #: views/installer/header.php:51
1190
+ msgctxt "(Admin)"
1191
+ msgid "Integrations"
1192
+ msgstr "Integraciones"
1193
+
1194
+ #: views/installer/steps/configuration-settings.php:23
1195
+ #: views/installer/steps/configuration-settings.php:73
1196
+ msgctxt "(Admin)"
1197
+ msgid "Enter the email address to notify"
1198
+ msgstr "Escribe la dirección de email para notificaciones"
1199
+
1200
+ #: views/installer/steps/disclaimer.php:21
1201
+ msgctxt "(Admin)"
1202
+ msgid "I accept"
1203
+ msgstr "Acepto"
1204
+
1205
+ #: views/installer/welcome-notice.php:7
1206
+ msgctxt "(Admin)"
1207
+ msgid "Run the setup wizard"
1208
+ msgstr "Ejecutar el asistente de configuración"
1209
+
1210
+ #: views/installer/welcome-notice.php:11
1211
+ msgctxt "(Admin)"
1212
+ msgid "Auto-install pages"
1213
+ msgstr "Instalar automáticamente las páginas"
1214
+
1215
+ #: views/installer/welcome-notice.php:15
1216
+ msgctxt "(Admin)"
1217
+ msgid "Skip and install manually"
1218
+ msgstr "Omitir e instalar de forma manual"
1219
+
1220
+ #: views/modules/contact-form-7/generator-privacy.php:6
1221
+ msgctxt "(Admin)"
1222
+ msgid ""
1223
+ "This tag generates the default text for Terms & Conditions and/or Privacy "
1224
+ "Policy checkbox."
1225
+ msgstr ""
1226
+ "Esta etiqueta genera el texto por defecto para las casillas de \"Términos y "
1227
+ "condiciones\" y/o \"Política de privacidad\"."
1228
+
1229
+ #: views/modules/contact-form-7/generator-privacy.php:15
1230
+ msgid "Insert"
1231
+ msgstr "Insertar"
1232
+
1233
+ #: views/modules/wordpress-comments/terms-checkbox.php:6
1234
+ #: views/modules/wordpress-user/registration-terms-checkbox.php:7
1235
+ #, php-format
1236
+ msgid "I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s"
1237
+ msgstr "Acepto los %sTérminos y condiciones%s y la %sPolítica de privacidad%s"
1238
+
1239
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:3
1240
+ #: views/privacy-tools/form-consent.php:2
1241
+ msgid "Consent"
1242
+ msgstr "Consentimiento"
1243
+
1244
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:6
1245
+ #: views/privacy-tools/form-consent.php:6
1246
+ msgid "Here you can withdraw any consents you have given."
1247
+ msgstr "Desde aquí puedes retirar cualquier consentimiento que hayas otorgado."
1248
+
1249
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:8
1250
+ msgid "Consents"
1251
+ msgstr "Consentimientos"
1252
+
1253
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:23
1254
+ #: views/privacy-tools/form-consent.php:24
1255
+ msgid "Withdraw"
1256
+ msgstr "Retirar"
1257
+
1258
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:5
1259
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:5
1260
+ msgctxt "(Admin)"
1261
+ msgid "Delete this user and all data"
1262
+ msgstr "Borrar este usuario y todos sus datos"
1263
+
1264
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:11
1265
+ msgctxt "(Admin)"
1266
+ msgid "Delete my data"
1267
+ msgstr "Borrar mis datos"
1268
+
1269
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:15
1270
+ #: views/privacy-tools/form-delete.php:13
1271
+ msgid "Delete all data we have gathered about you."
1272
+ msgstr "Borrar todos los datos que hemos recopilado sobre ti."
1273
+
1274
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:16
1275
+ #: views/privacy-tools/form-delete.php:14
1276
+ msgid "If you have a user account on our site, it will also be deleted."
1277
+ msgstr "Si tienes una cuenta en este sitio, también será eliminada."
1278
+
1279
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:17
1280
+ #: views/privacy-tools/form-delete.php:15
1281
+ msgid "Be careful - this action is permanent and CANNOT be undone."
1282
+ msgstr "Ten cuidado, ya que esta acción es permanente y NO tiene vuelta atrás."
1283
+
1284
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:22
1285
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:23
1286
+ msgctxt "(Admin)"
1287
+ msgid ""
1288
+ "You seem to have an administrator or equivalent role, so deleting/"
1289
+ "anonymizing via this page is disabled."
1290
+ msgstr ""
1291
+ "Parece que tienes el rol de administrador o equivalente; por tanto, el "
1292
+ "borrado o anonimizado mediante esta página ha sido desactivado."
1293
+
1294
+ #: views/modules/wordpress-user/dashboard/form-export.php:7
1295
+ #: views/privacy-tools/form-export.php:1
1296
+ msgid "Download your data"
1297
+ msgstr "Descarga tus datos"
1298
+
1299
+ #: views/modules/wordpress-user/dashboard/form-export.php:12
1300
+ #: views/privacy-tools/form-export.php:13
1301
+ msgid "Download as table"
1302
+ msgstr "Descargar como una tabla"
1303
+
1304
+ #: views/modules/wordpress-user/dashboard/form-export.php:15
1305
+ #: views/privacy-tools/form-export.php:22
1306
+ msgid "Export as JSON"
1307
+ msgstr "Exportar como JSON"
1308
+
1309
+ #: views/modules/wordpress-user/dashboard/form-export.php:19
1310
+ #: views/privacy-tools/form-export.php:4
1311
+ msgid "You can download all your data formatted as a table for viewing."
1312
+ msgstr ""
1313
+ "Puedes descargar todos tus datos formateados como una tabla para verlos "
1314
+ "mejor."
1315
+
1316
+ #: views/modules/wordpress-user/dashboard/form-export.php:20
1317
+ #: views/privacy-tools/form-export.php:5
1318
+ msgid "Alternatively, you can export it in machine-readable JSON format."
1319
+ msgstr ""
1320
+ "También puedes exportar los datos en formato JSON, legible por máquinas."
1321
+
1322
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:11
1323
+ msgctxt "(Admin)"
1324
+ msgid "Delete user and all data"
1325
+ msgstr "Borrar el usuario y todos sus datos"
1326
+
1327
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:14
1328
+ msgctxt "(Admin)"
1329
+ msgid "Anonymize user and all data"
1330
+ msgstr "Anonimizar al usuario y todos los datos"
1331
+
1332
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:18
1333
+ msgctxt "gdpr-framework"
1334
+ msgid "Be careful - this action is permanent and CANNOT be undone."
1335
+ msgstr "Ten cuidado, ya que esta acción es permanente y NO tiene vuelta atrás."
1336
+
1337
+ #: views/modules/wordpress-user/dashboard/profile-page/header.php:2
1338
+ msgctxt "(Admin)"
1339
+ msgid "GDPR Data"
1340
+ msgstr "Datos del RGPD"
1341
+
1342
+ #: views/modules/wordpress-user/dashboard/profile-page/header.php:6
1343
+ msgctxt "(Admin)"
1344
+ msgid "This user has been anonymized."
1345
+ msgstr "Este usuario ha sido anonimizado."
1346
+
1347
+ #: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:4
1348
+ msgctxt "(Admin)"
1349
+ msgid "Consents given"
1350
+ msgstr "Consentimientos otorgados"
1351
+
1352
+ #: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:17
1353
+ msgctxt "(Admin)"
1354
+ msgid "No consents given"
1355
+ msgstr "No se ha otorgado ningún consentimiento"
1356
+
1357
+ #: views/privacy-tools/form-consent.php:9
1358
+ msgid "Consent types"
1359
+ msgstr "Tipos de consentimiento"
1360
+
1361
+ #: views/privacy-tools/form-delete.php:1
1362
+ #: views/privacy-tools/notice-admin-role.php:1
1363
+ msgid "Delete my user and data"
1364
+ msgstr "Borrar mi usuario y mis datos"
1365
+
1366
+ #: views/privacy-tools/form-delete.php:7
1367
+ msgid "Delete my data"
1368
+ msgstr "Borrar mis datos"
1369
+
1370
+ #: views/privacy-tools/form-identify.php:8
1371
+ msgid "Back to front page"
1372
+ msgstr "Volver a la página de inicio"
1373
+
1374
+ #: views/privacy-tools/form-identify.php:14
1375
+ msgid "Identify yourself!"
1376
+ msgstr "Identifícate a ti mismo"
1377
+
1378
+ #: views/privacy-tools/form-identify.php:17
1379
+ #: views/privacy-tools/form-identify.php:20
1380
+ msgid "Enter your email address"
1381
+ msgstr "Escribe tu dirección de email"
1382
+
1383
+ #: views/privacy-tools/form-identify.php:23
1384
+ msgid "Send email"
1385
+ msgstr "Enviar el email"
1386
+
1387
+ #: views/privacy-tools/notice-admin-role.php:4
1388
+ msgctxt "(Admin)"
1389
+ msgid "Data deletion is disabled for administrative accounts."
1390
+ msgstr ""
1391
+ "El borrado de los datos está desactivado para las cuentas de administradores."
1392
+
1393
+ #: views/privacy-tools/notices.php:3
1394
+ msgid ""
1395
+ "We will send you an email with the link to access your data. Please check "
1396
+ "your spam folder as well!"
1397
+ msgstr ""
1398
+ "Te enviaremos un email con un enlace para que puedas acceder a tus datos. "
1399
+ "Por favor, comprueba también la carpeta de spam."
1400
+
1401
+ #: views/privacy-tools/notices.php:7
1402
+ msgid "The email you entered does not appear to be a valid email."
1403
+ msgstr "El email que has introducido no parece ser un email válido."
1404
+
1405
+ #: views/privacy-tools/notices.php:11
1406
+ msgid "Sorry - the link seems to have expired. Please try again!"
1407
+ msgstr ""
1408
+ "Lo sentimos, pero el enlace ha expirado. Por favor, inténtalo de nuevo."
1409
+
1410
+ #: views/privacy-tools/notices.php:23
1411
+ msgid "Your personal data has been removed!"
1412
+ msgstr "Tus datos personales han sido eliminados."
1413
+
1414
+ #: views/privacy-tools/privacy-tools.php:5
1415
+ msgid "You are identified as"
1416
+ msgstr "Has sido identificado como"
1417
+
1418
+ #~ msgid "Manage consents"
1419
+ #~ msgstr "Gestionar los consentimientos"
1420
+
1421
+ #~ msgid "Back to Privacy Tools"
1422
+ #~ msgstr "Volver a las herramientas de privacidad"
1423
+
1424
+ #~ msgid ""
1425
+ #~ "Generate the default text for your Privacy Policy acceptance checkbox. "
1426
+ #~ "For more details, see %s."
1427
+ #~ msgstr ""
1428
+ #~ "Generar el texto por defecto para tu casilla de aceptación de la política "
1429
+ #~ "de privacidad. Para saber más detalles, consulta %s."
1430
+
1431
+ #~ msgid "https://TODO"
1432
+ #~ msgstr "https://porhacer"
1433
+
1434
+ #~ msgid "GDPR Terms"
1435
+ #~ msgstr "Términos del RGPD"
1436
+
1437
+ #~ msgid "GDPR - Request personal data"
1438
+ #~ msgstr "RGPD - Solicitud de datos personales"
1439
+
1440
+ #~ msgid ""
1441
+ #~ "This form collects your name, email and content so that we can keep track "
1442
+ #~ "of the comments placed on the website. For more info check our privacy "
1443
+ #~ "policy where you'll get more info on where, how and why we store your "
1444
+ #~ "data."
1445
+ #~ msgstr ""
1446
+ #~ "Este formulario recopila tu nombre, tu email y el contenido del "
1447
+ #~ "comentario, con el objetivo de hacer seguimiento de los comentarios "
1448
+ #~ "publicados en el sitio web. Si quieres más detalles, consulta nuestra "
1449
+ #~ "página de política de privacidad, en la que encontrarás más información "
1450
+ #~ "sobre dónde, cómo y por qué almacenamos tus datos."
1451
+
1452
+ #~ msgid ""
1453
+ #~ "<strong>ERROR</strong>: please fill the required fields (GDPR checkbox)."
1454
+ #~ msgstr ""
1455
+ #~ "<strong>ERROR</strong>: por favor, rellena los campos solicitados "
1456
+ #~ "(casilla de verificación del RGPD)"
1457
+
1458
+ #~ msgid "Something went wrong."
1459
+ #~ msgstr "Algo ha salido mal"
1460
+
1461
+ #~ msgid "Comment is changed"
1462
+ #~ msgstr "El comentario ha cambiado"
1463
+
1464
+ #~ msgid "email"
1465
+ #~ msgstr "Email"
1466
+
1467
+ #~ msgid "comment"
1468
+ #~ msgstr "Comentario"
1469
+
1470
+ #~ msgid "website"
1471
+ #~ msgstr "Sitio web"
1472
+
1473
+ #~ msgid "comment date"
1474
+ #~ msgstr "Fecha del comentario"
1475
+
1476
+ #~ msgid "author email"
1477
+ #~ msgstr "Email del autor"
1478
+
1479
+ #~ msgid "author name"
1480
+ #~ msgstr "Nombre del autor"
1481
+
1482
+ #~ msgid "post ID"
1483
+ #~ msgstr "ID de la entrada"
1484
+
1485
+ #~ msgid "delete"
1486
+ #~ msgstr "Borrar"
1487
+
1488
+ #~ msgid "The site administrator received your request. Thank You."
1489
+ #~ msgstr ""
1490
+ #~ "El administrador del sitio ha recibido tu solicitud. Muchas gracias."
1491
+
1492
+ #~ msgid "New delete request"
1493
+ #~ msgstr "Nueva solicitud de borrado"
1494
+
1495
+ #~ msgid "Comments deleted"
1496
+ #~ msgstr "Comentarios borrados"
1497
+
1498
+ #~ msgid "Comments are anonymous"
1499
+ #~ msgstr "Los comentarios son anónimos"
1500
+
1501
+ #~ msgid "We confirm Your data deletion request"
1502
+ #~ msgstr "Confirmamos que has solicitado el borrado de tus datos"
1503
+
1504
+ #~ msgid "Comment author"
1505
+ #~ msgstr "Autor del comentario"
1506
+
1507
+ #~ msgid "content"
1508
+ #~ msgstr "Contenido"
1509
+
1510
+ #~ msgid "Request send"
1511
+ #~ msgstr "Solicitud enviada"
1512
+
1513
+ #~ msgid "Checkbox GDPR is required"
1514
+ #~ msgstr ""
1515
+ #~ "Para el cumplimiento del RGPD, es obligatoria la casilla de verificación"
1516
+
1517
+ #~ msgid "I agree"
1518
+ #~ msgstr "Estoy de acuerdo"
1519
+
1520
+ #~ msgid ""
1521
+ #~ "I consent to having %s collect my email so that they can send me my "
1522
+ #~ "requested info.\n"
1523
+ #~ " For more info check our privacy policy where you'll get more "
1524
+ #~ "info on where, how and why we store your data."
1525
+ #~ msgstr ""
1526
+ #~ "Doy mi consentimiento a que <em>%s</em> recopile mi dirección de email, a "
1527
+ #~ "fin de que se me pueda enviar la información solicitada.<br /><br />\n"
1528
+ #~ "Si quieres más detalles, consulta nuestra página de política de "
1529
+ #~ "privacidad, en la que encontrarás más información sobre dónde, cómo y por "
1530
+ #~ "qué almacenamos tus datos."
1531
+
1532
+ #~ msgid "Don't show comments"
1533
+ #~ msgstr "No mostrar los comentarios"
1534
+
1535
+ #~ msgid "id"
1536
+ #~ msgstr "ID"
1537
+
1538
+ #~ msgid "requested at"
1539
+ #~ msgstr "Fecha de la solicitud"
1540
+
1541
+ #~ msgid "status"
1542
+ #~ msgstr "Estado"
1543
+
1544
+ #~ msgid "language"
1545
+ #~ msgstr "Idioma"
1546
+
1547
+ #~ msgid "comments"
1548
+ #~ msgstr "Comentarios"
1549
+
1550
+ #~ msgid "gravity form entries"
1551
+ #~ msgstr "Entradas de Gravity Forms"
1552
+
1553
+ #~ msgid "cfdb7 db entries"
1554
+ #~ msgstr "Entradas de CFDB7 DB"
1555
+
1556
+ #~ msgid "woocommerce"
1557
+ #~ msgstr "WooCommerce"
1558
+
1559
+ #~ msgid "waiting for email"
1560
+ #~ msgstr "En espera de email"
1561
+
1562
+ #~ msgid "email sent"
1563
+ #~ msgstr "Email enviado"
1564
+
1565
+ #~ msgid "url is visited"
1566
+ #~ msgstr "URL visitada"
1567
+
1568
+ #~ msgid "data(ID)"
1569
+ #~ msgstr "ID del dato"
1570
+
1571
+ #~ msgid "type"
1572
+ #~ msgstr "Tipo"
1573
+
1574
+ #~ msgid "select"
1575
+ #~ msgstr "Seleccionar"
1576
+
1577
+ #~ msgid "waiting to process"
1578
+ #~ msgstr "En espera de ser procesado"
1579
+
1580
+ #~ msgid "deleted"
1581
+ #~ msgstr "Borrado"
1582
+
1583
+ #~ msgid "processed"
1584
+ #~ msgstr "Procesado"
1585
+
1586
+ #~ msgid "Plugin name"
1587
+ #~ msgstr "Nombre del plugin"
1588
+
1589
+ #~ msgid "Plugin status"
1590
+ #~ msgstr "Estado del plugin"
1591
+
1592
+ #~ msgid "Personal data"
1593
+ #~ msgstr "Datos personales"
1594
+
1595
+ #~ msgid "WP-GDPR add-on status"
1596
+ #~ msgstr "Estado del complemento WP-GDPR"
1597
+
1598
+ #~ msgid "Request add-on for your plugin"
1599
+ #~ msgstr "Complemento de solicitud para tu plugin"
1600
+
1601
+ #~ msgid "Email"
1602
+ #~ msgstr "Email"
1603
+
1604
+ #~ msgid ""
1605
+ #~ "This form collects your email so that we can keep you updated about your "
1606
+ #~ "request. Check out our %s for more information."
1607
+ #~ msgstr ""
1608
+ #~ "Este formulario recopila tu dirección de email, a fin de que podamos "
1609
+ #~ "mantenerte informado sobre tu solicitud. Si quieres más información, "
1610
+ #~ "consulta nuestra página de %s."
1611
+
1612
+ #~ msgid "I consent to having WP-GDPR collect my email when provided."
1613
+ #~ msgstr ""
1614
+ #~ "Doy mi consentimiento a que el plugin WP-GDPR recopile mi email cuando se "
1615
+ #~ "lo proporcione."
1616
+
1617
+ #~ msgid "submit"
1618
+ #~ msgstr "Enviar"
1619
+
1620
+ #~ msgid "Requests"
1621
+ #~ msgstr "Solicitudes"
1622
+
1623
+ #~ msgid "Add-ons"
1624
+ #~ msgstr "Complemento"
1625
+
1626
+ #~ msgid "Help Center"
1627
+ #~ msgstr "Centro de ayuda"
1628
+
1629
+ #~ msgid "Your data request"
1630
+ #~ msgstr "Tu solicitud de datos"
1631
+
1632
+ #~ msgid "Make personal data anonymous"
1633
+ #~ msgstr "Hacer que los datos personales sean anónimos"
1634
+
1635
+ #~ msgid "Dear Sir / Madam"
1636
+ #~ msgstr "Estimado señor / Estimada señora"
1637
+
1638
+ #~ msgid "Website:"
1639
+ #~ msgstr "Sitio web:"
1640
+
1641
+ #~ msgid "Date of request:"
1642
+ #~ msgstr "Fecha de la solicitud"
1643
+
1644
+ #~ msgid "Your requests is approved and data was successfully deleted today."
1645
+ #~ msgstr ""
1646
+ #~ "Tu solicitud ha sido aprobada, y los datos han sido eliminados "
1647
+ #~ "correctamente hoy."
1648
+
1649
+ #~ msgid "Thanks for contacting us."
1650
+ #~ msgstr "Gracias por ponerte en contacto con nosotros"
1651
+
1652
+ #~ msgid "List of processed data"
1653
+ #~ msgstr "Lista de datos procesados"
1654
+
1655
+ #~ msgid "Request to delete personal data"
1656
+ #~ msgstr "Solicitud para borrar datos personales"
1657
+
1658
+ #~ msgid "asked to delete his/her personal data."
1659
+ #~ msgstr "Ha solicitado el borrado de sus datos personales."
1660
+
1661
+ #~ msgid "Check all requests"
1662
+ #~ msgstr "Comprobar todas las solicitudes"
1663
+
1664
+ #~ msgid "List of users that requested for information"
1665
+ #~ msgstr "Lista de los usuarios que han solicitado información"
1666
+
1667
+ #~ msgid "List of delete requests"
1668
+ #~ msgstr "Lista de solicitudes de borrado"
1669
+
1670
+ #~ msgid "Help"
1671
+ #~ msgstr "Ayuda"
1672
+
1673
+ #~ msgid "Center"
1674
+ #~ msgstr "Centro"
1675
+
1676
+ #~ msgid "List of plugins that store data of users"
1677
+ #~ msgstr "Lista de los plugins que almacenan datos de usuarios"
1678
+
1679
+ #~ msgid "Update settings"
1680
+ #~ msgstr "Actualizar la configuración"
1681
+
1682
+ #~ msgid "WP GDPR"
1683
+ #~ msgstr "WP GDPR"
1684
+
1685
+ #~ msgid "Miscellaneous:"
1686
+ #~ msgstr "Miscelánea:"
1687
+
1688
+ #~ msgid "Add-on Licensing:"
1689
+ #~ msgstr "Licencia del complemento:"
1690
+
1691
+ #~ msgid "Settings for"
1692
+ #~ msgstr "Configuración de"
1693
+
1694
+ #~ msgid "WordPress comments"
1695
+ #~ msgstr "Comentarios de WordPress"
1696
+
1697
+ #~ msgid "Privacy policy text"
1698
+ #~ msgstr "Texto de la política de privacidad"
1699
+
1700
+ #~ msgid "Privacy policy checkbox"
1701
+ #~ msgstr "Casilla de verificación de la política de privacidad"
1702
+
1703
+ #~ msgid "Personal Data Request Page"
1704
+ #~ msgstr "Página de solicitud de datos personales"
1705
+
1706
+ #~ msgid "Update privacy policy settings"
1707
+ #~ msgstr "Actualizar la configuración de la política de privacidad"
1708
+
1709
+ #~ msgid "Send delete request"
1710
+ #~ msgstr "Enviar una solicitud de borrado"
1711
+
1712
+ #~ msgid "Resend emails"
1713
+ #~ msgstr "Volver a enviar los emails"
1714
+
1715
+ #~ msgid ""
1716
+ #~ "You asked to access your personal data. By clicking on the button you can "
1717
+ #~ "view or delete your comments created on the website:"
1718
+ #~ msgstr ""
1719
+ #~ "Has solicitado acceder a tus datos personales. Al hacer clic en el botón, "
1720
+ #~ "podrás ver o borrar los comentarios que has creado en este sitio web:"
1721
+
1722
+ #~ msgid "Submit"
1723
+ #~ msgstr "Enviar"
1724
+
1725
+ #~ msgid "Warning:"
1726
+ #~ msgstr "Advertencia:"
1727
+
1728
+ #~ msgid "This link will become deprecated after 48 hours."
1729
+ #~ msgstr "este enlace estará obsoleto en 48 horas"
1730
+
1731
+ #~ msgid "View Comments"
1732
+ #~ msgstr "Ver los comentarios"
1733
+
1734
+ #~ msgid "All comments added by email address"
1735
+ #~ msgstr "Todos los comentarios añadidos por direcciones de email"
1736
+
1737
+ #~ msgid "List of data requests"
1738
+ #~ msgstr "Lista de peticiones de datos"
1739
+
1740
+ #~ msgid "List of plugins"
1741
+ #~ msgstr "Lista de plugins"
1742
+
1743
+ #~ msgid "On this page will come info and help for the plugin"
1744
+ #~ msgstr "En esta página aparecerá la información y ayuda del plugin"
1745
+
1746
+ #~ msgid "Settings:"
1747
+ #~ msgstr "Configuración"
1748
+
1749
+ #~ msgid "Settings for comment forms"
1750
+ #~ msgstr "Configuración de los formularios de comentarios"
languages/gdpr-framework.pot CHANGED
@@ -1,1284 +1,1284 @@
1
- # SOME DESCRIPTIVE TITLE.
2
- # Copyright (C) YEAR Codelight
3
- # This file is distributed under the same license as the The GDPR Framework package.
4
- # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
- #
6
- #, fuzzy
7
- msgid ""
8
- msgstr ""
9
- "Project-Id-Version: The GDPR Framework 1.0\n"
10
- "Report-Msgid-Bugs-To: gdpr@codelight.eu\n"
11
- "POT-Creation-Date: 2018-04-16 10:50+0000\n"
12
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
- "Language-Team: LANGUAGE <LL@li.org>\n"
15
- "Language: \n"
16
- "MIME-Version: 1.0\n"
17
- "Content-Type: text/plain; charset=CHARSET\n"
18
- "Content-Transfer-Encoding: 8bit\n"
19
-
20
- #: gdpr-framework.php:26
21
- msgctxt "(Admin)"
22
- msgid "WordPress GDPR &rsaquo; Error"
23
- msgstr ""
24
-
25
- #: gdpr-framework.php:35
26
- msgctxt "(Admin)"
27
- msgid "Invalid PHP version"
28
- msgstr ""
29
-
30
- #: gdpr-framework.php:35
31
- msgctxt "(Admin)"
32
- msgid "You must be using PHP 5.6.33 or greater."
33
- msgstr ""
34
-
35
- #: gdpr-framework.php:42
36
- msgctxt "(Admin)"
37
- msgid "Invalid WordPress version"
38
- msgstr ""
39
-
40
- #: gdpr-framework.php:42
41
- msgctxt "(Admin)"
42
- msgid "You must be using WordPress 4.3.0 or greater."
43
- msgstr ""
44
-
45
- #: gdpr-framework.php:52
46
- msgctxt "(Admin)"
47
- msgid ""
48
- "You appear to be running a development version of GDPR. You must run "
49
- "<code>composer install</code> from the plugin directory."
50
- msgstr ""
51
-
52
- #: gdpr-framework.php:53
53
- msgctxt "(Admin)"
54
- msgid "Autoloader not found."
55
- msgstr ""
56
-
57
- #: gdpr-framework.php:115
58
- msgctxt "(Admin)"
59
- msgid "Anonymous"
60
- msgstr ""
61
-
62
- #: src/Admin/AdminTab.php:115
63
- msgctxt "(Admin)"
64
- msgid "Save"
65
- msgstr ""
66
-
67
- #: src/Admin/AdminTab.php:151
68
- msgctxt "(Admin)"
69
- msgid "Policy generated!"
70
- msgstr ""
71
-
72
- #: src/Admin/AdminTabGeneral.php:11
73
- msgctxt "(Admin)"
74
- msgid "General"
75
- msgstr ""
76
-
77
- #: src/Admin/AdminTabGeneral.php:38
78
- msgctxt "(Admin)"
79
- msgid "General Settings"
80
- msgstr ""
81
-
82
- #: src/Admin/AdminTabGeneral.php:43
83
- msgctxt "(Admin)"
84
- msgid "Enable Privacy Tools"
85
- msgstr ""
86
-
87
- #: src/Admin/AdminTabGeneral.php:53
88
- msgctxt "(Admin)"
89
- msgid "Pages"
90
- msgstr ""
91
-
92
- #: src/Admin/AdminTabGeneral.php:58 src/Admin/WordpressAdmin.php:151
93
- msgctxt "(Admin)"
94
- msgid "Privacy Tools Page"
95
- msgstr ""
96
-
97
- #: src/Admin/AdminTabGeneral.php:65 src/Admin/WordpressAdmin.php:147
98
- msgctxt "(Admin)"
99
- msgid "Privacy Policy Page"
100
- msgstr ""
101
-
102
- #: src/Admin/AdminTabGeneral.php:72
103
- msgctxt "(Admin)"
104
- msgid "Terms & Conditions Page"
105
- msgstr ""
106
-
107
- #: src/Admin/AdminTabGeneral.php:82
108
- msgctxt "(Admin)"
109
- msgid "View & Export Data"
110
- msgstr ""
111
-
112
- #: src/Admin/AdminTabGeneral.php:87
113
- msgctxt "(Admin)"
114
- msgid "Export action"
115
- msgstr ""
116
-
117
- #: src/Admin/AdminTabGeneral.php:94 src/Admin/AdminTabGeneral.php:133
118
- msgctxt "(Admin)"
119
- msgid "Email to notify"
120
- msgstr ""
121
-
122
- #: src/Admin/AdminTabGeneral.php:105
123
- msgctxt "(Admin)"
124
- msgid "Delete & Anonymize Data"
125
- msgstr ""
126
-
127
- #: src/Admin/AdminTabGeneral.php:110
128
- msgctxt "(Admin)"
129
- msgid "Delete action"
130
- msgstr ""
131
-
132
- #: src/Admin/AdminTabGeneral.php:117
133
- msgctxt "(Admin)"
134
- msgid "Delete or reassign content?"
135
- msgstr ""
136
-
137
- #: src/Admin/AdminTabGeneral.php:125
138
- msgctxt "(Admin)"
139
- msgid "Reassign content to"
140
- msgstr ""
141
-
142
- #: src/Admin/AdminTabGeneral.php:145
143
- msgctxt "(Admin)"
144
- msgid "Styling"
145
- msgstr ""
146
-
147
- #: src/Admin/AdminTabGeneral.php:150
148
- msgctxt "(Admin)"
149
- msgid "Enable basic styling on Privacy Tools page"
150
- msgstr ""
151
-
152
- #: src/Admin/AdminTabGeneral.php:162
153
- msgctxt "(Admin)"
154
- msgid "Compatibility"
155
- msgstr ""
156
-
157
- #: src/Admin/AdminTabGeneral.php:167
158
- msgctxt "(Admin)"
159
- msgid "Enable automatic theme compatibility"
160
- msgstr ""
161
-
162
- #: src/Admin/AdminTabGeneral.php:184 src/Admin/AdminTabGeneral.php:200
163
- #: src/Admin/AdminTabGeneral.php:213 src/Admin/AdminTabGeneral.php:252
164
- #: views/installer/steps/configuration-settings.php:62
165
- msgctxt "(Admin)"
166
- msgid "&mdash; Select &mdash;"
167
- msgstr ""
168
-
169
- #: src/Admin/WordpressAdmin.php:65
170
- msgctxt "(Admin)"
171
- msgid "Privacy & GDPR Settings"
172
- msgstr ""
173
-
174
- #: src/Admin/WordpressAdmin.php:66
175
- msgctxt "(Admin)"
176
- msgid "Privacy"
177
- msgstr ""
178
-
179
- #: src/Components/Consent/AdminTabConsent.php:30
180
- #: src/Components/Consent/AdminTabConsent.php:49
181
- msgctxt "(Admin)"
182
- msgid "Consent"
183
- msgstr ""
184
-
185
- #: src/Components/Consent/AdminTabConsent.php:157
186
- msgctxt "(Admin)"
187
- msgid "Consent slug is a required field!"
188
- msgstr ""
189
-
190
- #: src/Components/Consent/AdminTabConsent.php:162
191
- msgctxt "(Admin)"
192
- msgid ""
193
- "You may only use alphanumeric characters, dash and underscore in the consent "
194
- "slug field."
195
- msgstr ""
196
-
197
- #: src/Components/Consent/AdminTabConsent.php:167
198
- msgctxt "(Admin)"
199
- msgid "Consent title is a required field!"
200
- msgstr ""
201
-
202
- #: src/Components/Consent/ConsentManager.php:46
203
- #: views/modules/contact-form-7/content-privacy.php:2
204
- #: views/modules/wordpress-comments/terms-checkbox.php:14
205
- #: views/modules/wordpress-user/registration-terms-checkbox.php:15
206
- #, php-format
207
- msgid "I accept the %sPrivacy Policy%s"
208
- msgstr ""
209
-
210
- #: src/Components/Consent/ConsentManager.php:50
211
- #: src/Components/Consent/ConsentManager.php:69
212
- msgctxt "(Admin)"
213
- msgid ""
214
- "This consent is not visible by default. If someone wishes to withdraw it, "
215
- "they should simply request to delete all their data."
216
- msgstr ""
217
-
218
- #: src/Components/Consent/ConsentManager.php:65
219
- #, php-format
220
- msgid "I accept the %sTerms & Conditions%s"
221
- msgstr ""
222
-
223
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:19
224
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:61
225
- #: views/admin/privacy-policy/generated.php:1 views/installer/header.php:41
226
- msgctxt "(Admin)"
227
- msgid "Privacy Policy"
228
- msgstr ""
229
-
230
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:70
231
- msgctxt "(Admin)"
232
- msgid "Company information"
233
- msgstr ""
234
-
235
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:75
236
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:209
237
- msgctxt "(Admin)"
238
- msgid "Company Name"
239
- msgstr ""
240
-
241
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:82
242
- msgctxt "(Admin)"
243
- msgid "Company Email"
244
- msgstr ""
245
-
246
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:89
247
- msgctxt "(Admin)"
248
- msgid "Company Location"
249
- msgstr ""
250
-
251
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:105
252
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:245
253
- msgctxt "(Admin)"
254
- msgid "Representative Contact Name"
255
- msgstr ""
256
-
257
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:112
258
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:252
259
- msgctxt "(Admin)"
260
- msgid "Representative Contact Email"
261
- msgstr ""
262
-
263
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:119
264
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:259
265
- msgctxt "(Admin)"
266
- msgid "Representative Contact Phone"
267
- msgstr ""
268
-
269
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:135
270
- msgctxt "(Admin)"
271
- msgid "Data Protection Authority"
272
- msgstr ""
273
-
274
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:141
275
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:286
276
- msgctxt "(Admin)"
277
- msgid "Data Protection Authority Website"
278
- msgstr ""
279
-
280
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:148
281
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:293
282
- msgctxt "(Admin)"
283
- msgid "Data Protection Authority Email"
284
- msgstr ""
285
-
286
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:155
287
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:300
288
- msgctxt "(Admin)"
289
- msgid "Data Protection Authority Phone"
290
- msgstr ""
291
-
292
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:165
293
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:175
294
- msgctxt "(Admin)"
295
- msgid "Data Protection Officer"
296
- msgstr ""
297
-
298
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:168
299
- msgctxt "(Admin)"
300
- msgid "Knowledge base: Do I need to appoint a Data Protection Officer?"
301
- msgstr ""
302
-
303
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:182
304
- msgctxt "(Admin)"
305
- msgid "Data Protection Officer Name"
306
- msgstr ""
307
-
308
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:190
309
- msgctxt "(Admin)"
310
- msgid "Data Protection Officer Email"
311
- msgstr ""
312
-
313
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:216
314
- msgctxt "(Admin)"
315
- msgid "Contact Email"
316
- msgstr ""
317
-
318
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:235
319
- msgctxt "(Admin)"
320
- msgid "Representative Contact"
321
- msgstr ""
322
-
323
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:238
324
- msgctxt "(Admin)"
325
- msgid "Knowledge base: Do I need to appoint an EU-based representative?"
326
- msgstr ""
327
-
328
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:317
329
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:324
330
- msgctxt "(Admin)"
331
- msgid "DPO Name"
332
- msgstr ""
333
-
334
- #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:420
335
- msgctxt "(Admin)"
336
- msgid "Save & Generate Policy"
337
- msgstr ""
338
-
339
- #: src/Components/PrivacyPolicy/PrivacyPolicy.php:82
340
- #: src/Installer/Installer.php:271 src/Installer/Steps/PolicySettings.php:199
341
- #: views/themes/storefront/footer.php:3
342
- #: views/themes/twentyseventeen/footer.php:3
343
- #: views/themes/twentysixteen/footer.php:4
344
- msgid "Privacy Policy"
345
- msgstr ""
346
-
347
- #: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:19
348
- msgid "This page is currently disabled."
349
- msgstr ""
350
-
351
- #: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:35
352
- #: src/Installer/Installer.php:279
353
- #: src/Installer/Steps/ConfigurationPages.php:55
354
- #: views/themes/storefront/footer.php:7
355
- #: views/themes/twentyseventeen/footer.php:7
356
- #: views/themes/twentysixteen/footer.php:9
357
- msgid "Privacy Tools"
358
- msgstr ""
359
-
360
- #: src/Components/Support/AdminTabSupport.php:13
361
- #: src/Components/Support/AdminTabSupport.php:20
362
- msgctxt "(Admin)"
363
- msgid "Support"
364
- msgstr ""
365
-
366
- #: src/Components/WordpressComments/WordpressComments.php:90
367
- #, php-format
368
- msgid ""
369
- "%sERROR:%s You need to accept the terms and conditions to post a comment."
370
- msgstr ""
371
-
372
- #: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:54
373
- #: views/privacy-tools/notices.php:19
374
- msgid "We have received your request and will reply within 30 days."
375
- msgstr ""
376
-
377
- #: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:59
378
- #: views/privacy-tools/notices.php:15
379
- msgid "Consent withdrawn."
380
- msgstr ""
381
-
382
- #: src/Components/WordpressUser/RegistrationForm.php:42
383
- msgid "<strong>ERROR</strong>: You must accept the terms and conditions."
384
- msgstr ""
385
-
386
- #: src/Components/WordpressUser/WordpressUser.php:63
387
- #: src/Components/WordpressUser/WordpressUser.php:64
388
- #: views/modules/wordpress-user/dashboard/data-page/header.php:2
389
- msgctxt "(Admin)"
390
- msgid "Privacy Tools"
391
- msgstr ""
392
-
393
- #: src/DataSubject/AdminTabDataSubject.php:27
394
- #: src/DataSubject/AdminTabDataSubject.php:41
395
- msgctxt "(Admin)"
396
- msgid "Data Subjects"
397
- msgstr ""
398
-
399
- #: src/DataSubject/DataRepository.php:143
400
- msgid "Data exported"
401
- msgstr ""
402
-
403
- #: src/DataSubject/DataRepository.php:158
404
- msgid "Data export request"
405
- msgstr ""
406
-
407
- #: src/DataSubject/DataRepository.php:171
408
- msgid "Data removed"
409
- msgstr ""
410
-
411
- #: src/DataSubject/DataRepository.php:186
412
- msgid "Data removal request"
413
- msgstr ""
414
-
415
- #: src/DataSubject/DataSubjectIdentificator.php:65
416
- #: src/DataSubject/DataSubjectIdentificator.php:82
417
- msgid "Your personal data on"
418
- msgstr ""
419
-
420
- #: src/Helpers.php:27
421
- msgctxt "(Admin)"
422
- msgid "Austria"
423
- msgstr ""
424
-
425
- #: src/Helpers.php:28
426
- msgctxt "(Admin)"
427
- msgid "Belgium"
428
- msgstr ""
429
-
430
- #: src/Helpers.php:29
431
- msgctxt "(Admin)"
432
- msgid "Bulgaria"
433
- msgstr ""
434
-
435
- #: src/Helpers.php:30
436
- msgctxt "(Admin)"
437
- msgid "Croatia"
438
- msgstr ""
439
-
440
- #: src/Helpers.php:31
441
- msgctxt "(Admin)"
442
- msgid "Cyprus"
443
- msgstr ""
444
-
445
- #: src/Helpers.php:32
446
- msgctxt "(Admin)"
447
- msgid "Czech Republic"
448
- msgstr ""
449
-
450
- #: src/Helpers.php:33
451
- msgctxt "(Admin)"
452
- msgid "Denmark"
453
- msgstr ""
454
-
455
- #: src/Helpers.php:34
456
- msgctxt "(Admin)"
457
- msgid "Estonia"
458
- msgstr ""
459
-
460
- #: src/Helpers.php:35
461
- msgctxt "(Admin)"
462
- msgid "Finland"
463
- msgstr ""
464
-
465
- #: src/Helpers.php:36
466
- msgctxt "(Admin)"
467
- msgid "France"
468
- msgstr ""
469
-
470
- #: src/Helpers.php:37
471
- msgctxt "(Admin)"
472
- msgid "Germany"
473
- msgstr ""
474
-
475
- #: src/Helpers.php:38
476
- msgctxt "(Admin)"
477
- msgid "Greece"
478
- msgstr ""
479
-
480
- #: src/Helpers.php:39
481
- msgctxt "(Admin)"
482
- msgid "Hungary"
483
- msgstr ""
484
-
485
- #: src/Helpers.php:40
486
- msgctxt "(Admin)"
487
- msgid "Ireland"
488
- msgstr ""
489
-
490
- #: src/Helpers.php:41
491
- msgctxt "(Admin)"
492
- msgid "Italy"
493
- msgstr ""
494
-
495
- #: src/Helpers.php:42
496
- msgctxt "(Admin)"
497
- msgid "Latvia"
498
- msgstr ""
499
-
500
- #: src/Helpers.php:43
501
- msgctxt "(Admin)"
502
- msgid "Lithuania"
503
- msgstr ""
504
-
505
- #: src/Helpers.php:44
506
- msgctxt "(Admin)"
507
- msgid "Luxembourg"
508
- msgstr ""
509
-
510
- #: src/Helpers.php:45
511
- msgctxt "(Admin)"
512
- msgid "Malta"
513
- msgstr ""
514
-
515
- #: src/Helpers.php:46
516
- msgctxt "(Admin)"
517
- msgid "Netherlands"
518
- msgstr ""
519
-
520
- #: src/Helpers.php:47
521
- msgctxt "(Admin)"
522
- msgid "Poland"
523
- msgstr ""
524
-
525
- #: src/Helpers.php:48
526
- msgctxt "(Admin)"
527
- msgid "Portugal"
528
- msgstr ""
529
-
530
- #: src/Helpers.php:49
531
- msgctxt "(Admin)"
532
- msgid "Romania"
533
- msgstr ""
534
-
535
- #: src/Helpers.php:50
536
- msgctxt "(Admin)"
537
- msgid "Slovakia"
538
- msgstr ""
539
-
540
- #: src/Helpers.php:51
541
- msgctxt "(Admin)"
542
- msgid "Slovenia"
543
- msgstr ""
544
-
545
- #: src/Helpers.php:52
546
- msgctxt "(Admin)"
547
- msgid "Spain"
548
- msgstr ""
549
-
550
- #: src/Helpers.php:53
551
- msgctxt "(Admin)"
552
- msgid "Sweden"
553
- msgstr ""
554
-
555
- #: src/Helpers.php:54
556
- msgctxt "(Admin)"
557
- msgid "United Kingdom"
558
- msgstr ""
559
-
560
- #: src/Helpers.php:69
561
- msgctxt "(Admin)"
562
- msgid "Iceland"
563
- msgstr ""
564
-
565
- #: src/Helpers.php:70
566
- msgctxt "(Admin)"
567
- msgid "Norway"
568
- msgstr ""
569
-
570
- #: src/Helpers.php:71
571
- msgctxt "(Admin)"
572
- msgid "Liechtenstein"
573
- msgstr ""
574
-
575
- #: src/Helpers.php:72
576
- msgctxt "(Admin)"
577
- msgid "Switzerland"
578
- msgstr ""
579
-
580
- #: src/Helpers.php:73
581
- msgctxt "(Admin)"
582
- msgid "United States"
583
- msgstr ""
584
-
585
- #: src/Helpers.php:74
586
- msgctxt "(Admin)"
587
- msgid "Rest of the world"
588
- msgstr ""
589
-
590
- #: src/Helpers.php:145
591
- msgid "An error has occurred. Please contact the site administrator."
592
- msgstr ""
593
-
594
- #: src/Installer/Installer.php:135
595
- msgctxt "(Admin)"
596
- msgid "Setup Wizard"
597
- msgstr ""
598
-
599
- #: src/Installer/Steps/ConfigurationPages.php:23
600
- #: src/Installer/Steps/PolicySettings.php:23
601
- #: src/Installer/Steps/PolicySettings.php:48
602
- msgctxt "(Admin)"
603
- msgid "&mdash; Create a new page &mdash;"
604
- msgstr ""
605
-
606
- #: src/Installer/Steps/PolicySettings.php:38
607
- msgctxt "(Admin)"
608
- msgid ""
609
- "We have automatically selected your WooCommerce Terms & Conditions page."
610
- msgstr ""
611
-
612
- #: src/Modules/ContactForm7/ContactForm7.php:35
613
- msgctxt "(Admin)"
614
- msgid "gdpr terms txt"
615
- msgstr ""
616
-
617
- #: src/Router.php:80 src/Router.php:92 src/Router.php:125 src/Router.php:141
618
- #, php-format
619
- msgid "Nonce error for action \"%s\". Please go back and try again!"
620
- msgstr ""
621
-
622
- #: src/Router.php:149
623
- msgctxt "(Admin)"
624
- msgid "You do not have the required permissions to perform this action!"
625
- msgstr ""
626
-
627
- #: views/admin/consent.php:3
628
- msgctxt "(Admin)"
629
- msgid "Default consent types"
630
- msgstr ""
631
-
632
- #: views/admin/consent.php:4
633
- msgctxt "(Admin)"
634
- msgid ""
635
- "These are the consent types that have been automatically registered by the "
636
- "framework or a plugin."
637
- msgstr ""
638
-
639
- #: views/admin/consent.php:7 views/admin/consent.php:52
640
- msgctxt "(Admin)"
641
- msgid "Slug"
642
- msgstr ""
643
-
644
- #: views/admin/consent.php:8 views/admin/consent.php:38
645
- #: views/admin/consent.php:60
646
- msgctxt "(Admin)"
647
- msgid "Title"
648
- msgstr ""
649
-
650
- #: views/admin/consent.php:9 views/admin/consent.php:41
651
- #: views/admin/consent.php:63
652
- msgctxt "(Admin)"
653
- msgid "Description"
654
- msgstr ""
655
-
656
- #: views/admin/consent.php:10
657
- msgctxt "(Admin)"
658
- msgid "Visibility"
659
- msgstr ""
660
-
661
- #: views/admin/consent.php:18
662
- msgctxt "(Admin)"
663
- msgid "Visible"
664
- msgstr ""
665
-
666
- #: views/admin/consent.php:20
667
- msgctxt "(Admin)"
668
- msgid "Hidden"
669
- msgstr ""
670
-
671
- #: views/admin/consent.php:29
672
- msgctxt "(Admin)"
673
- msgid "Custom consent types"
674
- msgstr ""
675
-
676
- #: views/admin/consent.php:30
677
- msgctxt "(Admin)"
678
- msgid ""
679
- "Here you can add custom consent types to track. They will not be used "
680
- "anywhere by default - you will need to build an integration for each of them."
681
- msgstr ""
682
-
683
- #: views/admin/consent.php:35
684
- msgctxt "(Admin)"
685
- msgid "Machine-readable slug"
686
- msgstr ""
687
-
688
- #: views/admin/consent.php:44 views/admin/consent.php:68
689
- msgctxt "(Admin)"
690
- msgid "Visible?"
691
- msgstr ""
692
-
693
- #: views/admin/consent.php:72
694
- msgctxt "(Admin)"
695
- msgid "Remove"
696
- msgstr ""
697
-
698
- #: views/admin/consent.php:93
699
- msgctxt "(Admin)"
700
- msgid "Additional info"
701
- msgstr ""
702
-
703
- #: views/admin/consent.php:95
704
- msgctxt "(Admin)"
705
- msgid ""
706
- "This text will be displayed to your data subjects on the Privacy Tools page."
707
- msgstr ""
708
-
709
- #: views/admin/data-subjects/search-form.php:2
710
- msgctxt "(Admin)"
711
- msgid ""
712
- "On this page, you can find which data subjects personal data you are storing "
713
- "and download, export or delete it."
714
- msgstr ""
715
-
716
- #: views/admin/data-subjects/search-form.php:10
717
- msgctxt "(Admin)"
718
- msgid "Find data subject by email"
719
- msgstr ""
720
-
721
- #: views/admin/data-subjects/search-form.php:11
722
- msgctxt "(Admin)"
723
- msgid "Email address"
724
- msgstr ""
725
-
726
- #: views/admin/data-subjects/search-form.php:16
727
- msgctxt "(Admin)"
728
- msgid "Search"
729
- msgstr ""
730
-
731
- #: views/admin/data-subjects/search-results.php:7
732
- msgctxt "(Admin)"
733
- msgid "Username"
734
- msgstr ""
735
-
736
- #: views/admin/data-subjects/search-results.php:12
737
- msgctxt "(Admin)"
738
- msgid "is not a registered user."
739
- msgstr ""
740
-
741
- #: views/admin/data-subjects/search-results.php:16
742
- msgctxt "(Admin)"
743
- msgid "Download data (html)"
744
- msgstr ""
745
-
746
- #: views/admin/data-subjects/search-results.php:17
747
- msgctxt "(Admin)"
748
- msgid "Export data (json)"
749
- msgstr ""
750
-
751
- #: views/admin/data-subjects/search-results.php:21
752
- msgctxt "(Admin)"
753
- msgid ""
754
- "This user has admin capabilities. Deleting data via this interface is "
755
- "disabled."
756
- msgstr ""
757
-
758
- #: views/admin/data-subjects/search-results.php:24
759
- msgctxt "(Admin)"
760
- msgid "Anonymize data"
761
- msgstr ""
762
-
763
- #: views/admin/data-subjects/search-results.php:25
764
- msgctxt "(Admin)"
765
- msgid "Delete data"
766
- msgstr ""
767
-
768
- #: views/admin/data-subjects/search-results.php:29
769
- msgctxt "(Admin)"
770
- msgid "No data found!"
771
- msgstr ""
772
-
773
- #: views/admin/general/delete-action-email.php:5
774
- #: views/admin/general/export-action-email.php:5
775
- #: views/installer/steps/configuration-settings.php:29
776
- #: views/installer/steps/configuration-settings.php:79
777
- msgid "Email address"
778
- msgstr ""
779
-
780
- #: views/admin/general/delete-action-reassign.php:3
781
- #: views/installer/steps/configuration-settings.php:50
782
- msgctxt "(Admin)"
783
- msgid "Delete content"
784
- msgstr ""
785
-
786
- #: views/admin/general/delete-action-reassign.php:6
787
- #: views/installer/steps/configuration-settings.php:53
788
- msgctxt "(Admin)"
789
- msgid "Reassign content to a user"
790
- msgstr ""
791
-
792
- #: views/admin/general/delete-action-reassign.php:10
793
- msgctxt "(Admin)"
794
- msgid ""
795
- "If the user has submitted any content on your site, should it be deleted or "
796
- "reassigned to another user?"
797
- msgstr ""
798
-
799
- #: views/admin/general/description-data-page.php:2
800
- msgctxt "(Admin)"
801
- msgid ""
802
- "Select the page where users can go to control their data. This page must "
803
- "contain the [gdpr_privacy_tools] shortcode."
804
- msgstr ""
805
-
806
- #: views/admin/general/enable.php:9
807
- msgctxt "(Admin)"
808
- msgid "Enable the view, export and forget functionality for users and visitors"
809
- msgstr ""
810
-
811
- #: views/admin/general/enable.php:12
812
- msgctxt "(Admin)"
813
- msgid ""
814
- "Enable the Privacy Tools page on front-end and dashboard. This allows "
815
- "visitors to request viewing and deleting their personal data and withdraw "
816
- "consents."
817
- msgstr ""
818
-
819
- #: views/admin/general/theme-compatibility.php:9
820
- #: views/installer/steps/integrations.php:21
821
- msgctxt "(Admin)"
822
- msgid ""
823
- "Automatically add Privacy Policy and Privacy Tools links to your site footer."
824
- msgstr ""
825
-
826
- #: views/admin/notices/header.php:4 views/admin/settings-page.php:3
827
- #: views/installer/header.php:23
828
- msgctxt "(Admin)"
829
- msgid "The GDPR Framework"
830
- msgstr ""
831
-
832
- #: views/admin/notices/helper-autoinstall.php:2
833
- msgctxt "(Admin)"
834
- msgid ""
835
- "A Privacy Policy page has been created, but it is empty. You can generate a "
836
- "policy template on this page."
837
- msgstr ""
838
-
839
- #: views/admin/notices/helper-policy.php:2
840
- msgctxt "(Admin)"
841
- msgid ""
842
- "Heads up - your Privacy Policy still requires some attention. Find the "
843
- "places marked with [TODO] and replace them with real content!"
844
- msgstr ""
845
-
846
- #: views/admin/notices/helper-tools.php:2
847
- msgctxt "(Admin)"
848
- msgid "The contents of this page should contain the [gdpr_tools] shortcode."
849
- msgstr ""
850
-
851
- #: views/admin/privacy-policy/description-policy-page.php:2
852
- msgctxt "(Admin)"
853
- msgid "Select the page which will contain your Privacy Policy"
854
- msgstr ""
855
-
856
- #: views/admin/privacy-policy/generated.php:3
857
- msgctxt "(Admin)"
858
- msgid "Your Privacy Policy has been generated."
859
- msgstr ""
860
-
861
- #: views/admin/privacy-policy/generated.php:20
862
- msgctxt "(Admin)"
863
- msgid "&laquo; Back"
864
- msgstr ""
865
-
866
- #: views/admin/privacy-policy/header.php:2
867
- msgctxt "(Admin)"
868
- msgid ""
869
- "This page allows you to generate a Privacy Policy based on the information "
870
- "you entered below."
871
- msgstr ""
872
-
873
- #: views/admin/settings-page.php:31
874
- #, php-format
875
- msgctxt "(Admin)"
876
- msgid "The GDPR Framework. Built with &#9829; by %sCodelight%s."
877
- msgstr ""
878
-
879
- #: views/admin/support/contents.php:5 views/installer/steps/finish.php:10
880
- msgctxt "(Admin)"
881
- msgid "Need more info?"
882
- msgstr ""
883
-
884
- #: views/admin/support/contents.php:11 views/installer/steps/finish.php:16
885
- msgctxt "(Admin)"
886
- msgid "Site Owner's guide to GDPR"
887
- msgstr ""
888
-
889
- #: views/admin/support/contents.php:14 views/installer/steps/finish.php:19
890
- msgctxt "(Admin)"
891
- msgid "Read the full guide on GDPR compliance."
892
- msgstr ""
893
-
894
- #: views/admin/support/contents.php:20 views/installer/steps/finish.php:25
895
- msgctxt "(Admin)"
896
- msgid "Knowledge base"
897
- msgstr ""
898
-
899
- #: views/admin/support/contents.php:23 views/installer/steps/finish.php:28
900
- msgctxt "(Admin)"
901
- msgid "Check out the knowledge base for common questions and answers."
902
- msgstr ""
903
-
904
- #: views/admin/support/contents.php:29 views/installer/steps/finish.php:34
905
- msgctxt "(Admin)"
906
- msgid "Developer's guide to GDPR"
907
- msgstr ""
908
-
909
- #: views/admin/support/contents.php:32 views/installer/steps/finish.php:37
910
- msgctxt "(Admin)"
911
- msgid "We have a thorough guide to help making custom sites compliant."
912
- msgstr ""
913
-
914
- #: views/admin/support/contents.php:40 views/installer/steps/finish.php:45
915
- msgctxt "(Admin)"
916
- msgid "Need help?"
917
- msgstr ""
918
-
919
- #: views/admin/support/contents.php:46 views/installer/steps/finish.php:51
920
- msgctxt "(Admin)"
921
- msgid "Submit a support request"
922
- msgstr ""
923
-
924
- #: views/admin/support/contents.php:49 views/installer/steps/finish.php:54
925
- msgctxt "(Admin)"
926
- msgid ""
927
- "Found a bug or problem with the plugin? Post in the wordpress.org support "
928
- "forum."
929
- msgstr ""
930
-
931
- #: views/admin/support/contents.php:55 views/installer/steps/finish.php:60
932
- msgctxt "(Admin)"
933
- msgid "Request a consultation"
934
- msgstr ""
935
-
936
- #: views/admin/support/contents.php:58 views/installer/steps/finish.php:63
937
- msgctxt "(Admin)"
938
- msgid ""
939
- "Need development or legal assistance in making your site compliant? We can "
940
- "help!"
941
- msgstr ""
942
-
943
- #: views/admin/wizard-buttons.php:2
944
- msgctxt "(Admin)"
945
- msgid "Restart setup wizard"
946
- msgstr ""
947
-
948
- #: views/email/action-export.php:8 views/email/action-forget.php:12
949
- msgctxt "(Admin)"
950
- msgid ""
951
- "This email is just for your information. You don't need to take any action"
952
- msgstr ""
953
-
954
- #: views/email/action-forget.php:8
955
- msgctxt "(Admin)"
956
- msgid "The data subject had a user account on your website."
957
- msgstr ""
958
-
959
- #: views/email/identify-data-subject.php:2
960
- msgid "Someone has requested access to your data on"
961
- msgstr ""
962
-
963
- #: views/email/identify-data-subject.php:3
964
- msgid "If this was a mistake, just ignore this email and nothing will happen."
965
- msgstr ""
966
-
967
- #: views/email/identify-data-subject.php:4
968
- msgid "To manage your data, visit the following address:"
969
- msgstr ""
970
-
971
- #: views/email/identify-data-subject.php:10
972
- msgid "This link is valid for 15 minutes."
973
- msgstr ""
974
-
975
- #: views/email/no-data.php:2
976
- msgid "Someone has requested information about your personal data on"
977
- msgstr ""
978
-
979
- #: views/email/no-data.php:3
980
- msgid "None of your personal data is stored on"
981
- msgstr ""
982
-
983
- #: views/email/no-data.php:5
984
- msgid ""
985
- "If this was a mistake or you did not request this email, just ignore it and "
986
- "nothing will happen."
987
- msgstr ""
988
-
989
- #: views/email/request-export.php:13 views/email/request-forget.php:13
990
- msgctxt "(Admin)"
991
- msgid "As a reminder: according to GDPR, you have 30 days to comply."
992
- msgstr ""
993
-
994
- #: views/global/delete-action.php:2
995
- msgctxt "(Admin)"
996
- msgid "Automatically anonymize data"
997
- msgstr ""
998
-
999
- #: views/global/delete-action.php:5
1000
- msgctxt "(Admin)"
1001
- msgid "Automatically delete data"
1002
- msgstr ""
1003
-
1004
- #: views/global/delete-action.php:9
1005
- msgctxt "(Admin)"
1006
- msgid "Automatically anonymize data and notify me via email"
1007
- msgstr ""
1008
-
1009
- #: views/global/delete-action.php:13
1010
- msgctxt "(Admin)"
1011
- msgid "Automatically delete data and notify me via email"
1012
- msgstr ""
1013
-
1014
- #: views/global/delete-action.php:16 views/global/export-action.php:10
1015
- msgctxt "(Admin)"
1016
- msgid "Only notify me via email"
1017
- msgstr ""
1018
-
1019
- #: views/global/export-action.php:2
1020
- msgctxt "(Admin)"
1021
- msgid "Automatically download data"
1022
- msgstr ""
1023
-
1024
- #: views/global/export-action.php:6
1025
- msgctxt "(Admin)"
1026
- msgid "Automatically download data and notify me via email"
1027
- msgstr ""
1028
-
1029
- #: views/installer/continue-notice.php:2
1030
- msgctxt "(Admin)"
1031
- msgid "The The GDPR Framework setup has not been finalized yet."
1032
- msgstr ""
1033
-
1034
- #: views/installer/continue-notice.php:3
1035
- msgctxt "(Admin)"
1036
- msgid "You can continue the setup at any time."
1037
- msgstr ""
1038
-
1039
- #: views/installer/continue-notice.php:6
1040
- msgctxt "(Admin)"
1041
- msgid "Continue the setup wizard"
1042
- msgstr ""
1043
-
1044
- #: views/installer/continue-notice.php:9
1045
- msgctxt "(Admin)"
1046
- msgid "Hide this message"
1047
- msgstr ""
1048
-
1049
- #: views/installer/footer.php:7
1050
- msgid "Back"
1051
- msgstr ""
1052
-
1053
- #: views/installer/header.php:26
1054
- msgctxt "(Admin)"
1055
- msgid "I need help"
1056
- msgstr ""
1057
-
1058
- #: views/installer/header.php:29
1059
- msgctxt "(Admin)"
1060
- msgid "Developer Docs"
1061
- msgstr ""
1062
-
1063
- #: views/installer/header.php:36
1064
- msgctxt "(Admin)"
1065
- msgid "Configuration"
1066
- msgstr ""
1067
-
1068
- #: views/installer/header.php:46
1069
- msgctxt "(Admin)"
1070
- msgid "Forms & Consent"
1071
- msgstr ""
1072
-
1073
- #: views/installer/header.php:51
1074
- msgctxt "(Admin)"
1075
- msgid "Integrations"
1076
- msgstr ""
1077
-
1078
- #: views/installer/steps/configuration-settings.php:23
1079
- #: views/installer/steps/configuration-settings.php:73
1080
- msgctxt "(Admin)"
1081
- msgid "Enter the email address to notify"
1082
- msgstr ""
1083
-
1084
- #: views/installer/steps/disclaimer.php:21
1085
- msgctxt "(Admin)"
1086
- msgid "I accept"
1087
- msgstr ""
1088
-
1089
- #: views/installer/welcome-notice.php:7
1090
- msgctxt "(Admin)"
1091
- msgid "Run the setup wizard"
1092
- msgstr ""
1093
-
1094
- #: views/installer/welcome-notice.php:11
1095
- msgctxt "(Admin)"
1096
- msgid "Auto-install pages"
1097
- msgstr ""
1098
-
1099
- #: views/installer/welcome-notice.php:15
1100
- msgctxt "(Admin)"
1101
- msgid "Skip and install manually"
1102
- msgstr ""
1103
-
1104
- #: views/modules/contact-form-7/generator-privacy.php:6
1105
- msgctxt "(Admin)"
1106
- msgid ""
1107
- "This tag generates the default text for Terms & Conditions and/or Privacy "
1108
- "Policy checkbox."
1109
- msgstr ""
1110
-
1111
- #: views/modules/contact-form-7/generator-privacy.php:15
1112
- msgid "Insert"
1113
- msgstr ""
1114
-
1115
- #: views/modules/wordpress-comments/terms-checkbox.php:6
1116
- #: views/modules/wordpress-user/registration-terms-checkbox.php:7
1117
- #, php-format
1118
- msgid "I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s"
1119
- msgstr ""
1120
-
1121
- #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:3
1122
- msgid "Manage consents"
1123
- msgstr ""
1124
-
1125
- #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:6
1126
- #: views/privacy-tools/form-consent.php:6
1127
- msgid "Here you can withdraw any consents you have given."
1128
- msgstr ""
1129
-
1130
- #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:8
1131
- #: views/privacy-tools/form-consent.php:9
1132
- msgid "Consent types"
1133
- msgstr ""
1134
-
1135
- #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:23
1136
- #: views/privacy-tools/form-consent.php:24
1137
- msgid "Withdraw"
1138
- msgstr ""
1139
-
1140
- #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:5
1141
- #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:5
1142
- msgctxt "(Admin)"
1143
- msgid "Delete this user and all data"
1144
- msgstr ""
1145
-
1146
- #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:11
1147
- msgctxt "(Admin)"
1148
- msgid "Delete my data"
1149
- msgstr ""
1150
-
1151
- #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:15
1152
- #: views/privacy-tools/form-delete.php:13
1153
- msgid "Delete all data we have gathered about you."
1154
- msgstr ""
1155
-
1156
- #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:16
1157
- #: views/privacy-tools/form-delete.php:14
1158
- msgid "If you have a user account on our site, it will also be deleted."
1159
- msgstr ""
1160
-
1161
- #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:17
1162
- #: views/privacy-tools/form-delete.php:15
1163
- msgid "Be careful - this action is permanent and CANNOT be undone."
1164
- msgstr ""
1165
-
1166
- #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:22
1167
- #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:23
1168
- msgctxt "(Admin)"
1169
- msgid ""
1170
- "You seem to have an administrator or equivalent role, so deleting/"
1171
- "anonymizing via this page is disabled."
1172
- msgstr ""
1173
-
1174
- #: views/modules/wordpress-user/dashboard/form-export.php:7
1175
- #: views/privacy-tools/form-export.php:1
1176
- msgid "Download your data"
1177
- msgstr ""
1178
-
1179
- #: views/modules/wordpress-user/dashboard/form-export.php:12
1180
- #: views/privacy-tools/form-export.php:13
1181
- msgid "Download as table"
1182
- msgstr ""
1183
-
1184
- #: views/modules/wordpress-user/dashboard/form-export.php:15
1185
- #: views/privacy-tools/form-export.php:22
1186
- msgid "Export as JSON"
1187
- msgstr ""
1188
-
1189
- #: views/modules/wordpress-user/dashboard/form-export.php:19
1190
- #: views/privacy-tools/form-export.php:4
1191
- msgid "You can download all your data formatted as a table for viewing."
1192
- msgstr ""
1193
-
1194
- #: views/modules/wordpress-user/dashboard/form-export.php:20
1195
- #: views/privacy-tools/form-export.php:5
1196
- msgid "Alternatively, you can export it in machine-readable JSON format."
1197
- msgstr ""
1198
-
1199
- #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:11
1200
- msgctxt "(Admin)"
1201
- msgid "Delete user and all data"
1202
- msgstr ""
1203
-
1204
- #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:14
1205
- msgctxt "(Admin)"
1206
- msgid "Anonymize user and all data"
1207
- msgstr ""
1208
-
1209
- #: views/modules/wordpress-user/dashboard/profile-page/header.php:2
1210
- msgctxt "(Admin)"
1211
- msgid "GDPR Data"
1212
- msgstr ""
1213
-
1214
- #: views/modules/wordpress-user/dashboard/profile-page/header.php:6
1215
- msgctxt "(Admin)"
1216
- msgid "This user has been anonymized."
1217
- msgstr ""
1218
-
1219
- #: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:4
1220
- msgctxt "(Admin)"
1221
- msgid "Consents given"
1222
- msgstr ""
1223
-
1224
- #: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:17
1225
- msgctxt "(Admin)"
1226
- msgid "No consents given"
1227
- msgstr ""
1228
-
1229
- #: views/privacy-tools/form-consent.php:2
1230
- msgid "Consent"
1231
- msgstr ""
1232
-
1233
- #: views/privacy-tools/form-delete.php:1
1234
- #: views/privacy-tools/notice-admin-role.php:1
1235
- msgid "Delete my user and data"
1236
- msgstr ""
1237
-
1238
- #: views/privacy-tools/form-delete.php:7
1239
- msgid "Delete my data"
1240
- msgstr ""
1241
-
1242
- #: views/privacy-tools/form-identify.php:8
1243
- msgid "Back to Privacy Tools"
1244
- msgstr ""
1245
-
1246
- #: views/privacy-tools/form-identify.php:14
1247
- msgid "Identify yourself!"
1248
- msgstr ""
1249
-
1250
- #: views/privacy-tools/form-identify.php:17
1251
- #: views/privacy-tools/form-identify.php:20
1252
- msgid "Enter your email address"
1253
- msgstr ""
1254
-
1255
- #: views/privacy-tools/form-identify.php:23
1256
- msgid "Send email"
1257
- msgstr ""
1258
-
1259
- #: views/privacy-tools/notice-admin-role.php:4
1260
- msgctxt "(Admin)"
1261
- msgid "Data deletion is disabled for administrative accounts."
1262
- msgstr ""
1263
-
1264
- #: views/privacy-tools/notices.php:3
1265
- msgid ""
1266
- "We will send you an email with the link to access your data. Please check "
1267
- "your spam folder as well!"
1268
- msgstr ""
1269
-
1270
- #: views/privacy-tools/notices.php:7
1271
- msgid "The email you entered does not appear to be a valid email."
1272
- msgstr ""
1273
-
1274
- #: views/privacy-tools/notices.php:11
1275
- msgid "Sorry - the link seems to have expired. Please try again!"
1276
- msgstr ""
1277
-
1278
- #: views/privacy-tools/notices.php:23
1279
- msgid "Your personal data has been removed!"
1280
- msgstr ""
1281
-
1282
- #: views/privacy-tools/privacy-tools.php:5
1283
- msgid "You are identified as"
1284
- msgstr ""
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR Codelight
3
+ # This file is distributed under the same license as the The GDPR Framework package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ #, fuzzy
7
+ msgid ""
8
+ msgstr ""
9
+ "Project-Id-Version: The GDPR Framework 1.0\n"
10
+ "Report-Msgid-Bugs-To: gdpr@codelight.eu\n"
11
+ "POT-Creation-Date: 2018-04-16 10:50+0000\n"
12
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
+ "Language-Team: LANGUAGE <LL@li.org>\n"
15
+ "Language: \n"
16
+ "MIME-Version: 1.0\n"
17
+ "Content-Type: text/plain; charset=CHARSET\n"
18
+ "Content-Transfer-Encoding: 8bit\n"
19
+
20
+ #: gdpr-framework.php:26
21
+ msgctxt "(Admin)"
22
+ msgid "WordPress GDPR &rsaquo; Error"
23
+ msgstr ""
24
+
25
+ #: gdpr-framework.php:35
26
+ msgctxt "(Admin)"
27
+ msgid "Invalid PHP version"
28
+ msgstr ""
29
+
30
+ #: gdpr-framework.php:35
31
+ msgctxt "(Admin)"
32
+ msgid "You must be using PHP 5.6.33 or greater."
33
+ msgstr ""
34
+
35
+ #: gdpr-framework.php:42
36
+ msgctxt "(Admin)"
37
+ msgid "Invalid WordPress version"
38
+ msgstr ""
39
+
40
+ #: gdpr-framework.php:42
41
+ msgctxt "(Admin)"
42
+ msgid "You must be using WordPress 4.3.0 or greater."
43
+ msgstr ""
44
+
45
+ #: gdpr-framework.php:52
46
+ msgctxt "(Admin)"
47
+ msgid ""
48
+ "You appear to be running a development version of GDPR. You must run "
49
+ "<code>composer install</code> from the plugin directory."
50
+ msgstr ""
51
+
52
+ #: gdpr-framework.php:53
53
+ msgctxt "(Admin)"
54
+ msgid "Autoloader not found."
55
+ msgstr ""
56
+
57
+ #: gdpr-framework.php:115
58
+ msgctxt "(Admin)"
59
+ msgid "Anonymous"
60
+ msgstr ""
61
+
62
+ #: src/Admin/AdminTab.php:115
63
+ msgctxt "(Admin)"
64
+ msgid "Save"
65
+ msgstr ""
66
+
67
+ #: src/Admin/AdminTab.php:151
68
+ msgctxt "(Admin)"
69
+ msgid "Policy generated!"
70
+ msgstr ""
71
+
72
+ #: src/Admin/AdminTabGeneral.php:11
73
+ msgctxt "(Admin)"
74
+ msgid "General"
75
+ msgstr ""
76
+
77
+ #: src/Admin/AdminTabGeneral.php:38
78
+ msgctxt "(Admin)"
79
+ msgid "General Settings"
80
+ msgstr ""
81
+
82
+ #: src/Admin/AdminTabGeneral.php:43
83
+ msgctxt "(Admin)"
84
+ msgid "Enable Privacy Tools"
85
+ msgstr ""
86
+
87
+ #: src/Admin/AdminTabGeneral.php:53
88
+ msgctxt "(Admin)"
89
+ msgid "Pages"
90
+ msgstr ""
91
+
92
+ #: src/Admin/AdminTabGeneral.php:58 src/Admin/WordpressAdmin.php:151
93
+ msgctxt "(Admin)"
94
+ msgid "Privacy Tools Page"
95
+ msgstr ""
96
+
97
+ #: src/Admin/AdminTabGeneral.php:65 src/Admin/WordpressAdmin.php:147
98
+ msgctxt "(Admin)"
99
+ msgid "Privacy Policy Page"
100
+ msgstr ""
101
+
102
+ #: src/Admin/AdminTabGeneral.php:72
103
+ msgctxt "(Admin)"
104
+ msgid "Terms & Conditions Page"
105
+ msgstr ""
106
+
107
+ #: src/Admin/AdminTabGeneral.php:82
108
+ msgctxt "(Admin)"
109
+ msgid "View & Export Data"
110
+ msgstr ""
111
+
112
+ #: src/Admin/AdminTabGeneral.php:87
113
+ msgctxt "(Admin)"
114
+ msgid "Export action"
115
+ msgstr ""
116
+
117
+ #: src/Admin/AdminTabGeneral.php:94 src/Admin/AdminTabGeneral.php:133
118
+ msgctxt "(Admin)"
119
+ msgid "Email to notify"
120
+ msgstr ""
121
+
122
+ #: src/Admin/AdminTabGeneral.php:105
123
+ msgctxt "(Admin)"
124
+ msgid "Delete & Anonymize Data"
125
+ msgstr ""
126
+
127
+ #: src/Admin/AdminTabGeneral.php:110
128
+ msgctxt "(Admin)"
129
+ msgid "Delete action"
130
+ msgstr ""
131
+
132
+ #: src/Admin/AdminTabGeneral.php:117
133
+ msgctxt "(Admin)"
134
+ msgid "Delete or reassign content?"
135
+ msgstr ""
136
+
137
+ #: src/Admin/AdminTabGeneral.php:125
138
+ msgctxt "(Admin)"
139
+ msgid "Reassign content to"
140
+ msgstr ""
141
+
142
+ #: src/Admin/AdminTabGeneral.php:145
143
+ msgctxt "(Admin)"
144
+ msgid "Styling"
145
+ msgstr ""
146
+
147
+ #: src/Admin/AdminTabGeneral.php:150
148
+ msgctxt "(Admin)"
149
+ msgid "Enable basic styling on Privacy Tools page"
150
+ msgstr ""
151
+
152
+ #: src/Admin/AdminTabGeneral.php:162
153
+ msgctxt "(Admin)"
154
+ msgid "Compatibility"
155
+ msgstr ""
156
+
157
+ #: src/Admin/AdminTabGeneral.php:167
158
+ msgctxt "(Admin)"
159
+ msgid "Enable automatic theme compatibility"
160
+ msgstr ""
161
+
162
+ #: src/Admin/AdminTabGeneral.php:184 src/Admin/AdminTabGeneral.php:200
163
+ #: src/Admin/AdminTabGeneral.php:213 src/Admin/AdminTabGeneral.php:252
164
+ #: views/installer/steps/configuration-settings.php:62
165
+ msgctxt "(Admin)"
166
+ msgid "&mdash; Select &mdash;"
167
+ msgstr ""
168
+
169
+ #: src/Admin/WordpressAdmin.php:65
170
+ msgctxt "(Admin)"
171
+ msgid "Privacy & GDPR Settings"
172
+ msgstr ""
173
+
174
+ #: src/Admin/WordpressAdmin.php:66
175
+ msgctxt "(Admin)"
176
+ msgid "Privacy"
177
+ msgstr ""
178
+
179
+ #: src/Components/Consent/AdminTabConsent.php:30
180
+ #: src/Components/Consent/AdminTabConsent.php:49
181
+ msgctxt "(Admin)"
182
+ msgid "Consent"
183
+ msgstr ""
184
+
185
+ #: src/Components/Consent/AdminTabConsent.php:157
186
+ msgctxt "(Admin)"
187
+ msgid "Consent slug is a required field!"
188
+ msgstr ""
189
+
190
+ #: src/Components/Consent/AdminTabConsent.php:162
191
+ msgctxt "(Admin)"
192
+ msgid ""
193
+ "You may only use alphanumeric characters, dash and underscore in the consent "
194
+ "slug field."
195
+ msgstr ""
196
+
197
+ #: src/Components/Consent/AdminTabConsent.php:167
198
+ msgctxt "(Admin)"
199
+ msgid "Consent title is a required field!"
200
+ msgstr ""
201
+
202
+ #: src/Components/Consent/ConsentManager.php:46
203
+ #: views/modules/contact-form-7/content-privacy.php:2
204
+ #: views/modules/wordpress-comments/terms-checkbox.php:14
205
+ #: views/modules/wordpress-user/registration-terms-checkbox.php:15
206
+ #, php-format
207
+ msgid "I accept the %sPrivacy Policy%s"
208
+ msgstr ""
209
+
210
+ #: src/Components/Consent/ConsentManager.php:50
211
+ #: src/Components/Consent/ConsentManager.php:69
212
+ msgctxt "(Admin)"
213
+ msgid ""
214
+ "This consent is not visible by default. If someone wishes to withdraw it, "
215
+ "they should simply request to delete all their data."
216
+ msgstr ""
217
+
218
+ #: src/Components/Consent/ConsentManager.php:65
219
+ #, php-format
220
+ msgid "I accept the %sTerms & Conditions%s"
221
+ msgstr ""
222
+
223
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:19
224
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:61
225
+ #: views/admin/privacy-policy/generated.php:1 views/installer/header.php:41
226
+ msgctxt "(Admin)"
227
+ msgid "Privacy Policy"
228
+ msgstr ""
229
+
230
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:70
231
+ msgctxt "(Admin)"
232
+ msgid "Company information"
233
+ msgstr ""
234
+
235
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:75
236
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:209
237
+ msgctxt "(Admin)"
238
+ msgid "Company Name"
239
+ msgstr ""
240
+
241
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:82
242
+ msgctxt "(Admin)"
243
+ msgid "Company Email"
244
+ msgstr ""
245
+
246
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:89
247
+ msgctxt "(Admin)"
248
+ msgid "Company Location"
249
+ msgstr ""
250
+
251
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:105
252
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:245
253
+ msgctxt "(Admin)"
254
+ msgid "Representative Contact Name"
255
+ msgstr ""
256
+
257
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:112
258
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:252
259
+ msgctxt "(Admin)"
260
+ msgid "Representative Contact Email"
261
+ msgstr ""
262
+
263
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:119
264
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:259
265
+ msgctxt "(Admin)"
266
+ msgid "Representative Contact Phone"
267
+ msgstr ""
268
+
269
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:135
270
+ msgctxt "(Admin)"
271
+ msgid "Data Protection Authority"
272
+ msgstr ""
273
+
274
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:141
275
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:286
276
+ msgctxt "(Admin)"
277
+ msgid "Data Protection Authority Website"
278
+ msgstr ""
279
+
280
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:148
281
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:293
282
+ msgctxt "(Admin)"
283
+ msgid "Data Protection Authority Email"
284
+ msgstr ""
285
+
286
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:155
287
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:300
288
+ msgctxt "(Admin)"
289
+ msgid "Data Protection Authority Phone"
290
+ msgstr ""
291
+
292
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:165
293
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:175
294
+ msgctxt "(Admin)"
295
+ msgid "Data Protection Officer"
296
+ msgstr ""
297
+
298
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:168
299
+ msgctxt "(Admin)"
300
+ msgid "Knowledge base: Do I need to appoint a Data Protection Officer?"
301
+ msgstr ""
302
+
303
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:182
304
+ msgctxt "(Admin)"
305
+ msgid "Data Protection Officer Name"
306
+ msgstr ""
307
+
308
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:190
309
+ msgctxt "(Admin)"
310
+ msgid "Data Protection Officer Email"
311
+ msgstr ""
312
+
313
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:216
314
+ msgctxt "(Admin)"
315
+ msgid "Contact Email"
316
+ msgstr ""
317
+
318
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:235
319
+ msgctxt "(Admin)"
320
+ msgid "Representative Contact"
321
+ msgstr ""
322
+
323
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:238
324
+ msgctxt "(Admin)"
325
+ msgid "Knowledge base: Do I need to appoint an EU-based representative?"
326
+ msgstr ""
327
+
328
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:317
329
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:324
330
+ msgctxt "(Admin)"
331
+ msgid "DPO Name"
332
+ msgstr ""
333
+
334
+ #: src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php:420
335
+ msgctxt "(Admin)"
336
+ msgid "Save & Generate Policy"
337
+ msgstr ""
338
+
339
+ #: src/Components/PrivacyPolicy/PrivacyPolicy.php:82
340
+ #: src/Installer/Installer.php:271 src/Installer/Steps/PolicySettings.php:199
341
+ #: views/themes/storefront/footer.php:3
342
+ #: views/themes/twentyseventeen/footer.php:3
343
+ #: views/themes/twentysixteen/footer.php:4
344
+ msgid "Privacy Policy"
345
+ msgstr ""
346
+
347
+ #: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:19
348
+ msgid "This page is currently disabled."
349
+ msgstr ""
350
+
351
+ #: src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php:35
352
+ #: src/Installer/Installer.php:279
353
+ #: src/Installer/Steps/ConfigurationPages.php:55
354
+ #: views/themes/storefront/footer.php:7
355
+ #: views/themes/twentyseventeen/footer.php:7
356
+ #: views/themes/twentysixteen/footer.php:9
357
+ msgid "Privacy Tools"
358
+ msgstr ""
359
+
360
+ #: src/Components/Support/AdminTabSupport.php:13
361
+ #: src/Components/Support/AdminTabSupport.php:20
362
+ msgctxt "(Admin)"
363
+ msgid "Support"
364
+ msgstr ""
365
+
366
+ #: src/Components/WordpressComments/WordpressComments.php:90
367
+ #, php-format
368
+ msgid ""
369
+ "%sERROR:%s You need to accept the terms and conditions to post a comment."
370
+ msgstr ""
371
+
372
+ #: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:54
373
+ #: views/privacy-tools/notices.php:19
374
+ msgid "We have received your request and will reply within 30 days."
375
+ msgstr ""
376
+
377
+ #: src/Components/WordpressUser/Controllers/DashboardDataPageController.php:59
378
+ #: views/privacy-tools/notices.php:15
379
+ msgid "Consent withdrawn."
380
+ msgstr ""
381
+
382
+ #: src/Components/WordpressUser/RegistrationForm.php:42
383
+ msgid "<strong>ERROR</strong>: You must accept the terms and conditions."
384
+ msgstr ""
385
+
386
+ #: src/Components/WordpressUser/WordpressUser.php:63
387
+ #: src/Components/WordpressUser/WordpressUser.php:64
388
+ #: views/modules/wordpress-user/dashboard/data-page/header.php:2
389
+ msgctxt "(Admin)"
390
+ msgid "Privacy Tools"
391
+ msgstr ""
392
+
393
+ #: src/DataSubject/AdminTabDataSubject.php:27
394
+ #: src/DataSubject/AdminTabDataSubject.php:41
395
+ msgctxt "(Admin)"
396
+ msgid "Data Subjects"
397
+ msgstr ""
398
+
399
+ #: src/DataSubject/DataRepository.php:143
400
+ msgid "Data exported"
401
+ msgstr ""
402
+
403
+ #: src/DataSubject/DataRepository.php:158
404
+ msgid "Data export request"
405
+ msgstr ""
406
+
407
+ #: src/DataSubject/DataRepository.php:171
408
+ msgid "Data removed"
409
+ msgstr ""
410
+
411
+ #: src/DataSubject/DataRepository.php:186
412
+ msgid "Data removal request"
413
+ msgstr ""
414
+
415
+ #: src/DataSubject/DataSubjectIdentificator.php:65
416
+ #: src/DataSubject/DataSubjectIdentificator.php:82
417
+ msgid "Your personal data on"
418
+ msgstr ""
419
+
420
+ #: src/Helpers.php:27
421
+ msgctxt "(Admin)"
422
+ msgid "Austria"
423
+ msgstr ""
424
+
425
+ #: src/Helpers.php:28
426
+ msgctxt "(Admin)"
427
+ msgid "Belgium"
428
+ msgstr ""
429
+
430
+ #: src/Helpers.php:29
431
+ msgctxt "(Admin)"
432
+ msgid "Bulgaria"
433
+ msgstr ""
434
+
435
+ #: src/Helpers.php:30
436
+ msgctxt "(Admin)"
437
+ msgid "Croatia"
438
+ msgstr ""
439
+
440
+ #: src/Helpers.php:31
441
+ msgctxt "(Admin)"
442
+ msgid "Cyprus"
443
+ msgstr ""
444
+
445
+ #: src/Helpers.php:32
446
+ msgctxt "(Admin)"
447
+ msgid "Czech Republic"
448
+ msgstr ""
449
+
450
+ #: src/Helpers.php:33
451
+ msgctxt "(Admin)"
452
+ msgid "Denmark"
453
+ msgstr ""
454
+
455
+ #: src/Helpers.php:34
456
+ msgctxt "(Admin)"
457
+ msgid "Estonia"
458
+ msgstr ""
459
+
460
+ #: src/Helpers.php:35
461
+ msgctxt "(Admin)"
462
+ msgid "Finland"
463
+ msgstr ""
464
+
465
+ #: src/Helpers.php:36
466
+ msgctxt "(Admin)"
467
+ msgid "France"
468
+ msgstr ""
469
+
470
+ #: src/Helpers.php:37
471
+ msgctxt "(Admin)"
472
+ msgid "Germany"
473
+ msgstr ""
474
+
475
+ #: src/Helpers.php:38
476
+ msgctxt "(Admin)"
477
+ msgid "Greece"
478
+ msgstr ""
479
+
480
+ #: src/Helpers.php:39
481
+ msgctxt "(Admin)"
482
+ msgid "Hungary"
483
+ msgstr ""
484
+
485
+ #: src/Helpers.php:40
486
+ msgctxt "(Admin)"
487
+ msgid "Ireland"
488
+ msgstr ""
489
+
490
+ #: src/Helpers.php:41
491
+ msgctxt "(Admin)"
492
+ msgid "Italy"
493
+ msgstr ""
494
+
495
+ #: src/Helpers.php:42
496
+ msgctxt "(Admin)"
497
+ msgid "Latvia"
498
+ msgstr ""
499
+
500
+ #: src/Helpers.php:43
501
+ msgctxt "(Admin)"
502
+ msgid "Lithuania"
503
+ msgstr ""
504
+
505
+ #: src/Helpers.php:44
506
+ msgctxt "(Admin)"
507
+ msgid "Luxembourg"
508
+ msgstr ""
509
+
510
+ #: src/Helpers.php:45
511
+ msgctxt "(Admin)"
512
+ msgid "Malta"
513
+ msgstr ""
514
+
515
+ #: src/Helpers.php:46
516
+ msgctxt "(Admin)"
517
+ msgid "Netherlands"
518
+ msgstr ""
519
+
520
+ #: src/Helpers.php:47
521
+ msgctxt "(Admin)"
522
+ msgid "Poland"
523
+ msgstr ""
524
+
525
+ #: src/Helpers.php:48
526
+ msgctxt "(Admin)"
527
+ msgid "Portugal"
528
+ msgstr ""
529
+
530
+ #: src/Helpers.php:49
531
+ msgctxt "(Admin)"
532
+ msgid "Romania"
533
+ msgstr ""
534
+
535
+ #: src/Helpers.php:50
536
+ msgctxt "(Admin)"
537
+ msgid "Slovakia"
538
+ msgstr ""
539
+
540
+ #: src/Helpers.php:51
541
+ msgctxt "(Admin)"
542
+ msgid "Slovenia"
543
+ msgstr ""
544
+
545
+ #: src/Helpers.php:52
546
+ msgctxt "(Admin)"
547
+ msgid "Spain"
548
+ msgstr ""
549
+
550
+ #: src/Helpers.php:53
551
+ msgctxt "(Admin)"
552
+ msgid "Sweden"
553
+ msgstr ""
554
+
555
+ #: src/Helpers.php:54
556
+ msgctxt "(Admin)"
557
+ msgid "United Kingdom"
558
+ msgstr ""
559
+
560
+ #: src/Helpers.php:69
561
+ msgctxt "(Admin)"
562
+ msgid "Iceland"
563
+ msgstr ""
564
+
565
+ #: src/Helpers.php:70
566
+ msgctxt "(Admin)"
567
+ msgid "Norway"
568
+ msgstr ""
569
+
570
+ #: src/Helpers.php:71
571
+ msgctxt "(Admin)"
572
+ msgid "Liechtenstein"
573
+ msgstr ""
574
+
575
+ #: src/Helpers.php:72
576
+ msgctxt "(Admin)"
577
+ msgid "Switzerland"
578
+ msgstr ""
579
+
580
+ #: src/Helpers.php:73
581
+ msgctxt "(Admin)"
582
+ msgid "United States"
583
+ msgstr ""
584
+
585
+ #: src/Helpers.php:74
586
+ msgctxt "(Admin)"
587
+ msgid "Rest of the world"
588
+ msgstr ""
589
+
590
+ #: src/Helpers.php:145
591
+ msgid "An error has occurred. Please contact the site administrator."
592
+ msgstr ""
593
+
594
+ #: src/Installer/Installer.php:135
595
+ msgctxt "(Admin)"
596
+ msgid "Setup Wizard"
597
+ msgstr ""
598
+
599
+ #: src/Installer/Steps/ConfigurationPages.php:23
600
+ #: src/Installer/Steps/PolicySettings.php:23
601
+ #: src/Installer/Steps/PolicySettings.php:48
602
+ msgctxt "(Admin)"
603
+ msgid "&mdash; Create a new page &mdash;"
604
+ msgstr ""
605
+
606
+ #: src/Installer/Steps/PolicySettings.php:38
607
+ msgctxt "(Admin)"
608
+ msgid ""
609
+ "We have automatically selected your WooCommerce Terms & Conditions page."
610
+ msgstr ""
611
+
612
+ #: src/Modules/ContactForm7/ContactForm7.php:35
613
+ msgctxt "(Admin)"
614
+ msgid "gdpr terms txt"
615
+ msgstr ""
616
+
617
+ #: src/Router.php:80 src/Router.php:92 src/Router.php:125 src/Router.php:141
618
+ #, php-format
619
+ msgid "Nonce error for action \"%s\". Please go back and try again!"
620
+ msgstr ""
621
+
622
+ #: src/Router.php:149
623
+ msgctxt "(Admin)"
624
+ msgid "You do not have the required permissions to perform this action!"
625
+ msgstr ""
626
+
627
+ #: views/admin/consent.php:3
628
+ msgctxt "(Admin)"
629
+ msgid "Default consent types"
630
+ msgstr ""
631
+
632
+ #: views/admin/consent.php:4
633
+ msgctxt "(Admin)"
634
+ msgid ""
635
+ "These are the consent types that have been automatically registered by the "
636
+ "framework or a plugin."
637
+ msgstr ""
638
+
639
+ #: views/admin/consent.php:7 views/admin/consent.php:52
640
+ msgctxt "(Admin)"
641
+ msgid "Slug"
642
+ msgstr ""
643
+
644
+ #: views/admin/consent.php:8 views/admin/consent.php:38
645
+ #: views/admin/consent.php:60
646
+ msgctxt "(Admin)"
647
+ msgid "Title"
648
+ msgstr ""
649
+
650
+ #: views/admin/consent.php:9 views/admin/consent.php:41
651
+ #: views/admin/consent.php:63
652
+ msgctxt "(Admin)"
653
+ msgid "Description"
654
+ msgstr ""
655
+
656
+ #: views/admin/consent.php:10
657
+ msgctxt "(Admin)"
658
+ msgid "Visibility"
659
+ msgstr ""
660
+
661
+ #: views/admin/consent.php:18
662
+ msgctxt "(Admin)"
663
+ msgid "Visible"
664
+ msgstr ""
665
+
666
+ #: views/admin/consent.php:20
667
+ msgctxt "(Admin)"
668
+ msgid "Hidden"
669
+ msgstr ""
670
+
671
+ #: views/admin/consent.php:29
672
+ msgctxt "(Admin)"
673
+ msgid "Custom consent types"
674
+ msgstr ""
675
+
676
+ #: views/admin/consent.php:30
677
+ msgctxt "(Admin)"
678
+ msgid ""
679
+ "Here you can add custom consent types to track. They will not be used "
680
+ "anywhere by default - you will need to build an integration for each of them."
681
+ msgstr ""
682
+
683
+ #: views/admin/consent.php:35
684
+ msgctxt "(Admin)"
685
+ msgid "Machine-readable slug"
686
+ msgstr ""
687
+
688
+ #: views/admin/consent.php:44 views/admin/consent.php:68
689
+ msgctxt "(Admin)"
690
+ msgid "Visible?"
691
+ msgstr ""
692
+
693
+ #: views/admin/consent.php:72
694
+ msgctxt "(Admin)"
695
+ msgid "Remove"
696
+ msgstr ""
697
+
698
+ #: views/admin/consent.php:93
699
+ msgctxt "(Admin)"
700
+ msgid "Additional info"
701
+ msgstr ""
702
+
703
+ #: views/admin/consent.php:95
704
+ msgctxt "(Admin)"
705
+ msgid ""
706
+ "This text will be displayed to your data subjects on the Privacy Tools page."
707
+ msgstr ""
708
+
709
+ #: views/admin/data-subjects/search-form.php:2
710
+ msgctxt "(Admin)"
711
+ msgid ""
712
+ "On this page, you can find which data subjects personal data you are storing "
713
+ "and download, export or delete it."
714
+ msgstr ""
715
+
716
+ #: views/admin/data-subjects/search-form.php:10
717
+ msgctxt "(Admin)"
718
+ msgid "Find data subject by email"
719
+ msgstr ""
720
+
721
+ #: views/admin/data-subjects/search-form.php:11
722
+ msgctxt "(Admin)"
723
+ msgid "Email address"
724
+ msgstr ""
725
+
726
+ #: views/admin/data-subjects/search-form.php:16
727
+ msgctxt "(Admin)"
728
+ msgid "Search"
729
+ msgstr ""
730
+
731
+ #: views/admin/data-subjects/search-results.php:7
732
+ msgctxt "(Admin)"
733
+ msgid "Username"
734
+ msgstr ""
735
+
736
+ #: views/admin/data-subjects/search-results.php:12
737
+ msgctxt "(Admin)"
738
+ msgid "is not a registered user."
739
+ msgstr ""
740
+
741
+ #: views/admin/data-subjects/search-results.php:16
742
+ msgctxt "(Admin)"
743
+ msgid "Download data (html)"
744
+ msgstr ""
745
+
746
+ #: views/admin/data-subjects/search-results.php:17
747
+ msgctxt "(Admin)"
748
+ msgid "Export data (json)"
749
+ msgstr ""
750
+
751
+ #: views/admin/data-subjects/search-results.php:21
752
+ msgctxt "(Admin)"
753
+ msgid ""
754
+ "This user has admin capabilities. Deleting data via this interface is "
755
+ "disabled."
756
+ msgstr ""
757
+
758
+ #: views/admin/data-subjects/search-results.php:24
759
+ msgctxt "(Admin)"
760
+ msgid "Anonymize data"
761
+ msgstr ""
762
+
763
+ #: views/admin/data-subjects/search-results.php:25
764
+ msgctxt "(Admin)"
765
+ msgid "Delete data"
766
+ msgstr ""
767
+
768
+ #: views/admin/data-subjects/search-results.php:29
769
+ msgctxt "(Admin)"
770
+ msgid "No data found!"
771
+ msgstr ""
772
+
773
+ #: views/admin/general/delete-action-email.php:5
774
+ #: views/admin/general/export-action-email.php:5
775
+ #: views/installer/steps/configuration-settings.php:29
776
+ #: views/installer/steps/configuration-settings.php:79
777
+ msgid "Email address"
778
+ msgstr ""
779
+
780
+ #: views/admin/general/delete-action-reassign.php:3
781
+ #: views/installer/steps/configuration-settings.php:50
782
+ msgctxt "(Admin)"
783
+ msgid "Delete content"
784
+ msgstr ""
785
+
786
+ #: views/admin/general/delete-action-reassign.php:6
787
+ #: views/installer/steps/configuration-settings.php:53
788
+ msgctxt "(Admin)"
789
+ msgid "Reassign content to a user"
790
+ msgstr ""
791
+
792
+ #: views/admin/general/delete-action-reassign.php:10
793
+ msgctxt "(Admin)"
794
+ msgid ""
795
+ "If the user has submitted any content on your site, should it be deleted or "
796
+ "reassigned to another user?"
797
+ msgstr ""
798
+
799
+ #: views/admin/general/description-data-page.php:2
800
+ msgctxt "(Admin)"
801
+ msgid ""
802
+ "Select the page where users can go to control their data. This page must "
803
+ "contain the [gdpr_privacy_tools] shortcode."
804
+ msgstr ""
805
+
806
+ #: views/admin/general/enable.php:9
807
+ msgctxt "(Admin)"
808
+ msgid "Enable the view, export and forget functionality for users and visitors"
809
+ msgstr ""
810
+
811
+ #: views/admin/general/enable.php:12
812
+ msgctxt "(Admin)"
813
+ msgid ""
814
+ "Enable the Privacy Tools page on front-end and dashboard. This allows "
815
+ "visitors to request viewing and deleting their personal data and withdraw "
816
+ "consents."
817
+ msgstr ""
818
+
819
+ #: views/admin/general/theme-compatibility.php:9
820
+ #: views/installer/steps/integrations.php:21
821
+ msgctxt "(Admin)"
822
+ msgid ""
823
+ "Automatically add Privacy Policy and Privacy Tools links to your site footer."
824
+ msgstr ""
825
+
826
+ #: views/admin/notices/header.php:4 views/admin/settings-page.php:3
827
+ #: views/installer/header.php:23
828
+ msgctxt "(Admin)"
829
+ msgid "The GDPR Framework"
830
+ msgstr ""
831
+
832
+ #: views/admin/notices/helper-autoinstall.php:2
833
+ msgctxt "(Admin)"
834
+ msgid ""
835
+ "A Privacy Policy page has been created, but it is empty. You can generate a "
836
+ "policy template on this page."
837
+ msgstr ""
838
+
839
+ #: views/admin/notices/helper-policy.php:2
840
+ msgctxt "(Admin)"
841
+ msgid ""
842
+ "Heads up - your Privacy Policy still requires some attention. Find the "
843
+ "places marked with [TODO] and replace them with real content!"
844
+ msgstr ""
845
+
846
+ #: views/admin/notices/helper-tools.php:2
847
+ msgctxt "(Admin)"
848
+ msgid "The contents of this page should contain the [gdpr_tools] shortcode."
849
+ msgstr ""
850
+
851
+ #: views/admin/privacy-policy/description-policy-page.php:2
852
+ msgctxt "(Admin)"
853
+ msgid "Select the page which will contain your Privacy Policy"
854
+ msgstr ""
855
+
856
+ #: views/admin/privacy-policy/generated.php:3
857
+ msgctxt "(Admin)"
858
+ msgid "Your Privacy Policy has been generated."
859
+ msgstr ""
860
+
861
+ #: views/admin/privacy-policy/generated.php:20
862
+ msgctxt "(Admin)"
863
+ msgid "&laquo; Back"
864
+ msgstr ""
865
+
866
+ #: views/admin/privacy-policy/header.php:2
867
+ msgctxt "(Admin)"
868
+ msgid ""
869
+ "This page allows you to generate a Privacy Policy based on the information "
870
+ "you entered below."
871
+ msgstr ""
872
+
873
+ #: views/admin/settings-page.php:31
874
+ #, php-format
875
+ msgctxt "(Admin)"
876
+ msgid "The GDPR Framework. Built with &#9829; by %sCodelight%s."
877
+ msgstr ""
878
+
879
+ #: views/admin/support/contents.php:5 views/installer/steps/finish.php:10
880
+ msgctxt "(Admin)"
881
+ msgid "Need more info?"
882
+ msgstr ""
883
+
884
+ #: views/admin/support/contents.php:11 views/installer/steps/finish.php:16
885
+ msgctxt "(Admin)"
886
+ msgid "Site Owner's guide to GDPR"
887
+ msgstr ""
888
+
889
+ #: views/admin/support/contents.php:14 views/installer/steps/finish.php:19
890
+ msgctxt "(Admin)"
891
+ msgid "Read the full guide on GDPR compliance."
892
+ msgstr ""
893
+
894
+ #: views/admin/support/contents.php:20 views/installer/steps/finish.php:25
895
+ msgctxt "(Admin)"
896
+ msgid "Knowledge base"
897
+ msgstr ""
898
+
899
+ #: views/admin/support/contents.php:23 views/installer/steps/finish.php:28
900
+ msgctxt "(Admin)"
901
+ msgid "Check out the knowledge base for common questions and answers."
902
+ msgstr ""
903
+
904
+ #: views/admin/support/contents.php:29 views/installer/steps/finish.php:34
905
+ msgctxt "(Admin)"
906
+ msgid "Developer's guide to GDPR"
907
+ msgstr ""
908
+
909
+ #: views/admin/support/contents.php:32 views/installer/steps/finish.php:37
910
+ msgctxt "(Admin)"
911
+ msgid "We have a thorough guide to help making custom sites compliant."
912
+ msgstr ""
913
+
914
+ #: views/admin/support/contents.php:40 views/installer/steps/finish.php:45
915
+ msgctxt "(Admin)"
916
+ msgid "Need help?"
917
+ msgstr ""
918
+
919
+ #: views/admin/support/contents.php:46 views/installer/steps/finish.php:51
920
+ msgctxt "(Admin)"
921
+ msgid "Submit a support request"
922
+ msgstr ""
923
+
924
+ #: views/admin/support/contents.php:49 views/installer/steps/finish.php:54
925
+ msgctxt "(Admin)"
926
+ msgid ""
927
+ "Found a bug or problem with the plugin? Post in the wordpress.org support "
928
+ "forum."
929
+ msgstr ""
930
+
931
+ #: views/admin/support/contents.php:55 views/installer/steps/finish.php:60
932
+ msgctxt "(Admin)"
933
+ msgid "Request a consultation"
934
+ msgstr ""
935
+
936
+ #: views/admin/support/contents.php:58 views/installer/steps/finish.php:63
937
+ msgctxt "(Admin)"
938
+ msgid ""
939
+ "Need development or legal assistance in making your site compliant? We can "
940
+ "help!"
941
+ msgstr ""
942
+
943
+ #: views/admin/wizard-buttons.php:2
944
+ msgctxt "(Admin)"
945
+ msgid "Restart setup wizard"
946
+ msgstr ""
947
+
948
+ #: views/email/action-export.php:8 views/email/action-forget.php:12
949
+ msgctxt "(Admin)"
950
+ msgid ""
951
+ "This email is just for your information. You don't need to take any action"
952
+ msgstr ""
953
+
954
+ #: views/email/action-forget.php:8
955
+ msgctxt "(Admin)"
956
+ msgid "The data subject had a user account on your website."
957
+ msgstr ""
958
+
959
+ #: views/email/identify-data-subject.php:2
960
+ msgid "Someone has requested access to your data on"
961
+ msgstr ""
962
+
963
+ #: views/email/identify-data-subject.php:3
964
+ msgid "If this was a mistake, just ignore this email and nothing will happen."
965
+ msgstr ""
966
+
967
+ #: views/email/identify-data-subject.php:4
968
+ msgid "To manage your data, visit the following address:"
969
+ msgstr ""
970
+
971
+ #: views/email/identify-data-subject.php:10
972
+ msgid "This link is valid for 15 minutes."
973
+ msgstr ""
974
+
975
+ #: views/email/no-data.php:2
976
+ msgid "Someone has requested information about your personal data on"
977
+ msgstr ""
978
+
979
+ #: views/email/no-data.php:3
980
+ msgid "None of your personal data is stored on"
981
+ msgstr ""
982
+
983
+ #: views/email/no-data.php:5
984
+ msgid ""
985
+ "If this was a mistake or you did not request this email, just ignore it and "
986
+ "nothing will happen."
987
+ msgstr ""
988
+
989
+ #: views/email/request-export.php:13 views/email/request-forget.php:13
990
+ msgctxt "(Admin)"
991
+ msgid "As a reminder: according to GDPR, you have 30 days to comply."
992
+ msgstr ""
993
+
994
+ #: views/global/delete-action.php:2
995
+ msgctxt "(Admin)"
996
+ msgid "Automatically anonymize data"
997
+ msgstr ""
998
+
999
+ #: views/global/delete-action.php:5
1000
+ msgctxt "(Admin)"
1001
+ msgid "Automatically delete data"
1002
+ msgstr ""
1003
+
1004
+ #: views/global/delete-action.php:9
1005
+ msgctxt "(Admin)"
1006
+ msgid "Automatically anonymize data and notify me via email"
1007
+ msgstr ""
1008
+
1009
+ #: views/global/delete-action.php:13
1010
+ msgctxt "(Admin)"
1011
+ msgid "Automatically delete data and notify me via email"
1012
+ msgstr ""
1013
+
1014
+ #: views/global/delete-action.php:16 views/global/export-action.php:10
1015
+ msgctxt "(Admin)"
1016
+ msgid "Only notify me via email"
1017
+ msgstr ""
1018
+
1019
+ #: views/global/export-action.php:2
1020
+ msgctxt "(Admin)"
1021
+ msgid "Automatically download data"
1022
+ msgstr ""
1023
+
1024
+ #: views/global/export-action.php:6
1025
+ msgctxt "(Admin)"
1026
+ msgid "Automatically download data and notify me via email"
1027
+ msgstr ""
1028
+
1029
+ #: views/installer/continue-notice.php:2
1030
+ msgctxt "(Admin)"
1031
+ msgid "The The GDPR Framework setup has not been finalized yet."
1032
+ msgstr ""
1033
+
1034
+ #: views/installer/continue-notice.php:3
1035
+ msgctxt "(Admin)"
1036
+ msgid "You can continue the setup at any time."
1037
+ msgstr ""
1038
+
1039
+ #: views/installer/continue-notice.php:6
1040
+ msgctxt "(Admin)"
1041
+ msgid "Continue the setup wizard"
1042
+ msgstr ""
1043
+
1044
+ #: views/installer/continue-notice.php:9
1045
+ msgctxt "(Admin)"
1046
+ msgid "Hide this message"
1047
+ msgstr ""
1048
+
1049
+ #: views/installer/footer.php:7
1050
+ msgid "Back"
1051
+ msgstr ""
1052
+
1053
+ #: views/installer/header.php:26
1054
+ msgctxt "(Admin)"
1055
+ msgid "I need help"
1056
+ msgstr ""
1057
+
1058
+ #: views/installer/header.php:29
1059
+ msgctxt "(Admin)"
1060
+ msgid "Developer Docs"
1061
+ msgstr ""
1062
+
1063
+ #: views/installer/header.php:36
1064
+ msgctxt "(Admin)"
1065
+ msgid "Configuration"
1066
+ msgstr ""
1067
+
1068
+ #: views/installer/header.php:46
1069
+ msgctxt "(Admin)"
1070
+ msgid "Forms & Consent"
1071
+ msgstr ""
1072
+
1073
+ #: views/installer/header.php:51
1074
+ msgctxt "(Admin)"
1075
+ msgid "Integrations"
1076
+ msgstr ""
1077
+
1078
+ #: views/installer/steps/configuration-settings.php:23
1079
+ #: views/installer/steps/configuration-settings.php:73
1080
+ msgctxt "(Admin)"
1081
+ msgid "Enter the email address to notify"
1082
+ msgstr ""
1083
+
1084
+ #: views/installer/steps/disclaimer.php:21
1085
+ msgctxt "(Admin)"
1086
+ msgid "I accept"
1087
+ msgstr ""
1088
+
1089
+ #: views/installer/welcome-notice.php:7
1090
+ msgctxt "(Admin)"
1091
+ msgid "Run the setup wizard"
1092
+ msgstr ""
1093
+
1094
+ #: views/installer/welcome-notice.php:11
1095
+ msgctxt "(Admin)"
1096
+ msgid "Auto-install pages"
1097
+ msgstr ""
1098
+
1099
+ #: views/installer/welcome-notice.php:15
1100
+ msgctxt "(Admin)"
1101
+ msgid "Skip and install manually"
1102
+ msgstr ""
1103
+
1104
+ #: views/modules/contact-form-7/generator-privacy.php:6
1105
+ msgctxt "(Admin)"
1106
+ msgid ""
1107
+ "This tag generates the default text for Terms & Conditions and/or Privacy "
1108
+ "Policy checkbox."
1109
+ msgstr ""
1110
+
1111
+ #: views/modules/contact-form-7/generator-privacy.php:15
1112
+ msgid "Insert"
1113
+ msgstr ""
1114
+
1115
+ #: views/modules/wordpress-comments/terms-checkbox.php:6
1116
+ #: views/modules/wordpress-user/registration-terms-checkbox.php:7
1117
+ #, php-format
1118
+ msgid "I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s"
1119
+ msgstr ""
1120
+
1121
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:3
1122
+ msgid "Manage consents"
1123
+ msgstr ""
1124
+
1125
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:6
1126
+ #: views/privacy-tools/form-consent.php:6
1127
+ msgid "Here you can withdraw any consents you have given."
1128
+ msgstr ""
1129
+
1130
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:8
1131
+ #: views/privacy-tools/form-consent.php:9
1132
+ msgid "Consent types"
1133
+ msgstr ""
1134
+
1135
+ #: views/modules/wordpress-user/dashboard/data-page/form-consent.php:23
1136
+ #: views/privacy-tools/form-consent.php:24
1137
+ msgid "Withdraw"
1138
+ msgstr ""
1139
+
1140
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:5
1141
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:5
1142
+ msgctxt "(Admin)"
1143
+ msgid "Delete this user and all data"
1144
+ msgstr ""
1145
+
1146
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:11
1147
+ msgctxt "(Admin)"
1148
+ msgid "Delete my data"
1149
+ msgstr ""
1150
+
1151
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:15
1152
+ #: views/privacy-tools/form-delete.php:13
1153
+ msgid "Delete all data we have gathered about you."
1154
+ msgstr ""
1155
+
1156
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:16
1157
+ #: views/privacy-tools/form-delete.php:14
1158
+ msgid "If you have a user account on our site, it will also be deleted."
1159
+ msgstr ""
1160
+
1161
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:17
1162
+ #: views/privacy-tools/form-delete.php:15
1163
+ msgid "Be careful - this action is permanent and CANNOT be undone."
1164
+ msgstr ""
1165
+
1166
+ #: views/modules/wordpress-user/dashboard/data-page/form-delete.php:22
1167
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:23
1168
+ msgctxt "(Admin)"
1169
+ msgid ""
1170
+ "You seem to have an administrator or equivalent role, so deleting/"
1171
+ "anonymizing via this page is disabled."
1172
+ msgstr ""
1173
+
1174
+ #: views/modules/wordpress-user/dashboard/form-export.php:7
1175
+ #: views/privacy-tools/form-export.php:1
1176
+ msgid "Download your data"
1177
+ msgstr ""
1178
+
1179
+ #: views/modules/wordpress-user/dashboard/form-export.php:12
1180
+ #: views/privacy-tools/form-export.php:13
1181
+ msgid "Download as table"
1182
+ msgstr ""
1183
+
1184
+ #: views/modules/wordpress-user/dashboard/form-export.php:15
1185
+ #: views/privacy-tools/form-export.php:22
1186
+ msgid "Export as JSON"
1187
+ msgstr ""
1188
+
1189
+ #: views/modules/wordpress-user/dashboard/form-export.php:19
1190
+ #: views/privacy-tools/form-export.php:4
1191
+ msgid "You can download all your data formatted as a table for viewing."
1192
+ msgstr ""
1193
+
1194
+ #: views/modules/wordpress-user/dashboard/form-export.php:20
1195
+ #: views/privacy-tools/form-export.php:5
1196
+ msgid "Alternatively, you can export it in machine-readable JSON format."
1197
+ msgstr ""
1198
+
1199
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:11
1200
+ msgctxt "(Admin)"
1201
+ msgid "Delete user and all data"
1202
+ msgstr ""
1203
+
1204
+ #: views/modules/wordpress-user/dashboard/profile-page/form-delete.php:14
1205
+ msgctxt "(Admin)"
1206
+ msgid "Anonymize user and all data"
1207
+ msgstr ""
1208
+
1209
+ #: views/modules/wordpress-user/dashboard/profile-page/header.php:2
1210
+ msgctxt "(Admin)"
1211
+ msgid "GDPR Data"
1212
+ msgstr ""
1213
+
1214
+ #: views/modules/wordpress-user/dashboard/profile-page/header.php:6
1215
+ msgctxt "(Admin)"
1216
+ msgid "This user has been anonymized."
1217
+ msgstr ""
1218
+
1219
+ #: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:4
1220
+ msgctxt "(Admin)"
1221
+ msgid "Consents given"
1222
+ msgstr ""
1223
+
1224
+ #: views/modules/wordpress-user/dashboard/profile-page/table-consent.php:17
1225
+ msgctxt "(Admin)"
1226
+ msgid "No consents given"
1227
+ msgstr ""
1228
+
1229
+ #: views/privacy-tools/form-consent.php:2
1230
+ msgid "Consent"
1231
+ msgstr ""
1232
+
1233
+ #: views/privacy-tools/form-delete.php:1
1234
+ #: views/privacy-tools/notice-admin-role.php:1
1235
+ msgid "Delete my user and data"
1236
+ msgstr ""
1237
+
1238
+ #: views/privacy-tools/form-delete.php:7
1239
+ msgid "Delete my data"
1240
+ msgstr ""
1241
+
1242
+ #: views/privacy-tools/form-identify.php:8
1243
+ msgid "Back to Privacy Tools"
1244
+ msgstr ""
1245
+
1246
+ #: views/privacy-tools/form-identify.php:14
1247
+ msgid "Identify yourself!"
1248
+ msgstr ""
1249
+
1250
+ #: views/privacy-tools/form-identify.php:17
1251
+ #: views/privacy-tools/form-identify.php:20
1252
+ msgid "Enter your email address"
1253
+ msgstr ""
1254
+
1255
+ #: views/privacy-tools/form-identify.php:23
1256
+ msgid "Send email"
1257
+ msgstr ""
1258
+
1259
+ #: views/privacy-tools/notice-admin-role.php:4
1260
+ msgctxt "(Admin)"
1261
+ msgid "Data deletion is disabled for administrative accounts."
1262
+ msgstr ""
1263
+
1264
+ #: views/privacy-tools/notices.php:3
1265
+ msgid ""
1266
+ "We will send you an email with the link to access your data. Please check "
1267
+ "your spam folder as well!"
1268
+ msgstr ""
1269
+
1270
+ #: views/privacy-tools/notices.php:7
1271
+ msgid "The email you entered does not appear to be a valid email."
1272
+ msgstr ""
1273
+
1274
+ #: views/privacy-tools/notices.php:11
1275
+ msgid "Sorry - the link seems to have expired. Please try again!"
1276
+ msgstr ""
1277
+
1278
+ #: views/privacy-tools/notices.php:23
1279
+ msgid "Your personal data has been removed!"
1280
+ msgstr ""
1281
+
1282
+ #: views/privacy-tools/privacy-tools.php:5
1283
+ msgid "You are identified as"
1284
+ msgstr ""
license.txt CHANGED
@@ -1,199 +1,199 @@
1
- This program is free software: you can redistribute it and/or modify
2
- it under the terms of the GNU General Public License as published by
3
- the Free Software Foundation, either version 3 of the License, or
4
- (at your option) any later version.
5
-
6
- This program is distributed in the hope that it will be useful,
7
- but WITHOUT ANY WARRANTY; without even the implied warranty of
8
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9
- GNU General Public License for more details.
10
-
11
- You should have received a copy of the GNU General Public License
12
- along with this program. If not, see <http://www.gnu.org/licenses/>.
13
-
14
-
15
- GNU GENERAL PUBLIC LICENSE
16
- Version 3, 29 June 2007
17
-
18
- Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>
19
-
20
- Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
21
-
22
- Preamble
23
- The GNU General Public License is a free, copyleft license for software and other kinds of works.
24
-
25
- The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
26
-
27
- When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
28
-
29
- To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
30
-
31
- For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
32
-
33
- Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
34
-
35
- For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
36
-
37
- Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
38
-
39
- Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
40
-
41
- The precise terms and conditions for copying, distribution and modification follow.
42
-
43
- TERMS AND CONDITIONS
44
- 0. Definitions.
45
- “This License” refers to version 3 of the GNU General Public License.
46
-
47
- “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
48
-
49
- “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
50
-
51
- To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
52
-
53
- A “covered work” means either the unmodified Program or a work based on the Program.
54
-
55
- To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
56
-
57
- To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
58
-
59
- An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
60
-
61
- 1. Source Code.
62
- The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
63
-
64
- A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
65
-
66
- The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
67
-
68
- The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
69
-
70
- The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
71
-
72
- The Corresponding Source for a work in source code form is that same work.
73
-
74
- 2. Basic Permissions.
75
- All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
76
-
77
- You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
78
-
79
- Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
80
-
81
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
82
- No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
83
-
84
- When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
85
-
86
- 4. Conveying Verbatim Copies.
87
- You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
88
-
89
- You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
90
-
91
- 5. Conveying Modified Source Versions.
92
- You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
93
-
94
- a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
95
- b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
96
- c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
97
- d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
98
- A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
99
-
100
- 6. Conveying Non-Source Forms.
101
- You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
102
-
103
- a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
104
- b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
105
- c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
106
- d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
107
- e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
108
- A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
109
-
110
- A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
111
-
112
- “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
113
-
114
- If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
115
-
116
- The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
117
-
118
- Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
119
-
120
- 7. Additional Terms.
121
- “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
122
-
123
- When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
124
-
125
- Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
126
-
127
- a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
128
- b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
129
- c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
130
- d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
131
- e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
132
- f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
133
- All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
134
-
135
- If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
136
-
137
- Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
138
-
139
- 8. Termination.
140
- You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
141
-
142
- However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
143
-
144
- Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
145
-
146
- Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
147
-
148
- 9. Acceptance Not Required for Having Copies.
149
- You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
150
-
151
- 10. Automatic Licensing of Downstream Recipients.
152
- Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
153
-
154
- An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
155
-
156
- You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
157
-
158
- 11. Patents.
159
- A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
160
-
161
- A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
162
-
163
- Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
164
-
165
- In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
166
-
167
- If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
168
-
169
- If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
170
-
171
- A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
172
-
173
- Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
174
-
175
- 12. No Surrender of Others' Freedom.
176
- If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
177
-
178
- 13. Use with the GNU Affero General Public License.
179
- Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
180
-
181
- 14. Revised Versions of this License.
182
- The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
183
-
184
- Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
185
-
186
- If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
187
-
188
- Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
189
-
190
- 15. Disclaimer of Warranty.
191
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
192
-
193
- 16. Limitation of Liability.
194
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
195
-
196
- 17. Interpretation of Sections 15 and 16.
197
- If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
198
-
199
  END OF TERMS AND CONDITIONS
1
+ This program is free software: you can redistribute it and/or modify
2
+ it under the terms of the GNU General Public License as published by
3
+ the Free Software Foundation, either version 3 of the License, or
4
+ (at your option) any later version.
5
+
6
+ This program is distributed in the hope that it will be useful,
7
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
8
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9
+ GNU General Public License for more details.
10
+
11
+ You should have received a copy of the GNU General Public License
12
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
13
+
14
+
15
+ GNU GENERAL PUBLIC LICENSE
16
+ Version 3, 29 June 2007
17
+
18
+ Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>
19
+
20
+ Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.
21
+
22
+ Preamble
23
+ The GNU General Public License is a free, copyleft license for software and other kinds of works.
24
+
25
+ The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.
26
+
27
+ When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.
28
+
29
+ To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.
30
+
31
+ For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
32
+
33
+ Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.
34
+
35
+ For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.
36
+
37
+ Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.
38
+
39
+ Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.
40
+
41
+ The precise terms and conditions for copying, distribution and modification follow.
42
+
43
+ TERMS AND CONDITIONS
44
+ 0. Definitions.
45
+ “This License” refers to version 3 of the GNU General Public License.
46
+
47
+ “Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.
48
+
49
+ “The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.
50
+
51
+ To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.
52
+
53
+ A “covered work” means either the unmodified Program or a work based on the Program.
54
+
55
+ To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.
56
+
57
+ To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.
58
+
59
+ An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.
60
+
61
+ 1. Source Code.
62
+ The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.
63
+
64
+ A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.
65
+
66
+ The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.
67
+
68
+ The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.
69
+
70
+ The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.
71
+
72
+ The Corresponding Source for a work in source code form is that same work.
73
+
74
+ 2. Basic Permissions.
75
+ All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.
76
+
77
+ You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.
78
+
79
+ Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.
80
+
81
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
82
+ No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.
83
+
84
+ When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.
85
+
86
+ 4. Conveying Verbatim Copies.
87
+ You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.
88
+
89
+ You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.
90
+
91
+ 5. Conveying Modified Source Versions.
92
+ You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:
93
+
94
+ a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
95
+ b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
96
+ c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
97
+ d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.
98
+ A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.
99
+
100
+ 6. Conveying Non-Source Forms.
101
+ You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:
102
+
103
+ a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
104
+ b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
105
+ c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
106
+ d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
107
+ e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.
108
+ A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.
109
+
110
+ A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.
111
+
112
+ “Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.
113
+
114
+ If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).
115
+
116
+ The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.
117
+
118
+ Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.
119
+
120
+ 7. Additional Terms.
121
+ “Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.
122
+
123
+ When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.
124
+
125
+ Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:
126
+
127
+ a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
128
+ b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
129
+ c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
130
+ d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
131
+ e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
132
+ f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.
133
+ All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.
134
+
135
+ If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.
136
+
137
+ Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.
138
+
139
+ 8. Termination.
140
+ You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).
141
+
142
+ However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.
143
+
144
+ Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.
145
+
146
+ Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.
147
+
148
+ 9. Acceptance Not Required for Having Copies.
149
+ You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.
150
+
151
+ 10. Automatic Licensing of Downstream Recipients.
152
+ Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.
153
+
154
+ An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.
155
+
156
+ You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.
157
+
158
+ 11. Patents.
159
+ A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.
160
+
161
+ A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.
162
+
163
+ Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.
164
+
165
+ In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.
166
+
167
+ If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.
168
+
169
+ If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.
170
+
171
+ A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.
172
+
173
+ Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.
174
+
175
+ 12. No Surrender of Others' Freedom.
176
+ If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.
177
+
178
+ 13. Use with the GNU Affero General Public License.
179
+ Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.
180
+
181
+ 14. Revised Versions of this License.
182
+ The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
183
+
184
+ Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.
185
+
186
+ If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.
187
+
188
+ Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.
189
+
190
+ 15. Disclaimer of Warranty.
191
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
192
+
193
+ 16. Limitation of Liability.
194
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
195
+
196
+ 17. Interpretation of Sections 15 and 16.
197
+ If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.
198
+
199
  END OF TERMS AND CONDITIONS
readme.txt CHANGED
@@ -1,85 +1,91 @@
1
-
2
- === The GDPR Framework ===
3
- Contributors: codelight
4
- Tags: gdpr
5
- Requires at least: 4.7
6
- Tested up to: 4.9.4
7
- Requires PHP: 5.6.33
8
- Stable tag: 1.0.4
9
- License: GPLv3
10
- License URI: https://www.gnu.org/licenses/gpl-3.0.en.html
11
-
12
- Easy to use tools to help make your website GDPR-compliant. Fully documented, extendable and developer-friendly.
13
-
14
- == Description ==
15
-
16
- Easy to use tools to help make your website GDPR-compliant.
17
-
18
- GDPR is a whopping 88 pages of legal text. Becoming compliant takes a lot more than just adding a couple of checkboxes to your forms! But worry not, we’ve got it covered. With help from [Triniti](https://triniti.eu), one of the top business and IT law firms in Europe, we’ve put together this plugin and written a thorough guide for making WordPress sites compliant with minimal effort.
19
-
20
- You don't need to drown your customers in pointless acceptance checkboxes if you know what you're doing!
21
-
22
- ## Disclaimer
23
- Using The GDPR Framework does NOT guarantee compliance to GDPR. This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package. Compliance to GDPR is risk-based ongoing process that involves your whole business. Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
24
-
25
- ### Documentation
26
- Full documentation: [The WordPress Site Owner's Guide to GDPR](https://codelight.eu/wordpress-gdpr-framework/wordpress-site-owners-guide-to-gdpr/)
27
- For developers: [Developer Docs](https://codelight.eu/wordpress-gdpr-framework/developer-docs/)
28
-
29
- ### Features
30
- &#9745; Allow both users and visitors without an account to view, export and delete their personal data;
31
- &#9745; Configure the plugin to delete or anonymize personal data automatically or send a notification and allow admins to do it manually;
32
- &#9745; Track, manage and withdraw consent;
33
- &#9745; Generate a GDPR-compatible Privacy Policy template for your site;
34
- &#9745; Comes with a helpful installation wizard to get you started quickly;
35
- &#9745; Fully documented;
36
- &#9745; Developer-friendly. Everything can be extended, every feature and template can be overridden.
37
-
38
- We're just getting started. There's lots more to come!
39
-
40
- ### Plugin support:
41
- The GDPR Framework currently works with the following plugins
42
- &#9745; Contact Form 7
43
- &#9745; Gravity Forms - [Download the GDPR add-on](https://wordpress.org/plugins/gdpr-for-gravity-forms/)
44
- &#9745; WPML
45
-
46
- Coming in April 2018:
47
- &#9744; Formidable Forms (Release: 21.04)
48
- &#9744; Ninja Forms (Release: 25.04)
49
- &#9744; Contact Form 7 Flamingo
50
- &#9744; WP Rocket
51
-
52
- Still free and open-source.
53
-
54
- Other integrations coming soon:
55
- &#9744; WP Migrate DB
56
- &#9744; WooCommerce (postponed until the launch of their own compliance toolkit)
57
- &#9744; Easy Digital Downloads
58
-
59
- We're happy to add support for other major plugins as well. If you have a request, get in touch!
60
-
61
- == Changelog ==
62
-
63
- = 1.0.4 =
64
- * Fix translations, for real this time
65
- * Add French translations (Thanks @datagitateur!)
66
- * Fix PHP warning if WPML is activated
67
- * Add filter around $headers array for all outgoing emails sent via this plugin
68
-
69
- = 1.0.3 =
70
- * Change text domain to 'gdpr-framework' to avoid conflict with other plugins
71
- * Add Portuguese translation (Thanks @kativiti!)
72
- * Add partial Estonian translation
73
-
74
- = 1.0.2 =
75
- * Fix T&C and Privacy Policy URLs on registration and comments forms
76
- * Add basic styling and separate stylesheet for Privacy Tools page
77
- * Allow disabling styles for Privacy Tools page via admin
78
- * Add confirmation notice on deleting data via front-end Privacy Tools
79
- * Change strings with 'gdpr-admin' domain back to 'gdpr'. Add context to all admin strings.
80
-
81
- = 1.0.1 =
82
- * Fix PHP notice on Privacy Tools frontend page if logged in as admin
83
-
84
- = 1.0.0 =
85
- * Initial release
 
 
 
 
 
 
1
+
2
+ === The GDPR Framework ===
3
+ Contributors: codelight
4
+ Tags: gdpr
5
+ Requires at least: 4.7
6
+ Tested up to: 4.9.5
7
+ Requires PHP: 5.6.33
8
+ Stable tag: 1.0.5
9
+ License: GPLv3
10
+ License URI: https://www.gnu.org/licenses/gpl-3.0.en.html
11
+
12
+ Easy to use tools to help make your website GDPR-compliant. Fully documented, extendable and developer-friendly.
13
+
14
+ == Description ==
15
+
16
+ Easy to use tools to help make your website GDPR-compliant.
17
+
18
+ GDPR is a whopping 88 pages of legal text. Becoming compliant takes a lot more than just adding a couple of checkboxes to your forms! But worry not, we’ve got it covered. With help from [Triniti](https://triniti.eu), one of the top business and IT law firms in Europe, we’ve put together this plugin and written a thorough guide for making WordPress sites compliant with minimal effort.
19
+
20
+ You don't need to drown your customers in pointless acceptance checkboxes if you know what you're doing!
21
+
22
+ ## Disclaimer
23
+ Using The GDPR Framework does NOT guarantee compliance to GDPR. This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package. Compliance to GDPR is risk-based ongoing process that involves your whole business. Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
24
+
25
+ ### Documentation
26
+ Full documentation: [The WordPress Site Owner's Guide to GDPR](https://codelight.eu/wordpress-gdpr-framework/wordpress-site-owners-guide-to-gdpr/)
27
+ For developers: [Developer Docs](https://codelight.eu/wordpress-gdpr-framework/developer-docs/)
28
+
29
+ ### Features
30
+ &#9745; Allow both users and visitors without an account to view, export and delete their personal data;
31
+ &#9745; Configure the plugin to delete or anonymize personal data automatically or send a notification and allow admins to do it manually;
32
+ &#9745; Track, manage and withdraw consent;
33
+ &#9745; Generate a GDPR-compatible Privacy Policy template for your site;
34
+ &#9745; Comes with a helpful installation wizard to get you started quickly;
35
+ &#9745; Fully documented;
36
+ &#9745; Developer-friendly. Everything can be extended, every feature and template can be overridden.
37
+
38
+ We're just getting started. There's lots more to come!
39
+
40
+ ### Plugin support:
41
+ The GDPR Framework currently works with the following plugins
42
+ &#9745; Contact Form 7
43
+ &#9745; Gravity Forms - [Download the GDPR add-on](https://wordpress.org/plugins/gdpr-for-gravity-forms/)
44
+ &#9745; Formidable Forms - [Download the GDPR add-on](https://wordpress.org/plugins/gdpr-for-formidable-forms/)
45
+ &#9745; WPML
46
+
47
+ Coming in April 2018:
48
+ &#9744; Ninja Forms
49
+ &#9744; Contact Form 7 Flamingo
50
+
51
+ Still free and open-source.
52
+
53
+ Other integrations coming soon:
54
+ &#9744; WP Migrate DB
55
+ &#9744; WooCommerce (postponed until the launch of their own compliance toolkit)
56
+ &#9744; Easy Digital Downloads
57
+
58
+ We're happy to add support for other major plugins as well. If you have a request, get in touch!
59
+
60
+ == Changelog ==
61
+
62
+ = 1.0.5 =
63
+ * Add Spanish support (Thanks @elarequi!)
64
+ * Lower required PHP version to 5.6.0
65
+ * Re-add container alias for DataSubjectManager
66
+ * Fix for installer giving the option to add links to footer for unsupported themes
67
+ * Fix PHP notice in WPML module
68
+
69
+ = 1.0.4 =
70
+ * Fix translations, for real this time
71
+ * Add French translations (Thanks @datagitateur!)
72
+ * Fix PHP warning if WPML is activated
73
+ * Add filter around $headers array for all outgoing emails sent via this plugin
74
+
75
+ = 1.0.3 =
76
+ * Change text domain to 'gdpr-framework' to avoid conflict with other plugins
77
+ * Add Portuguese translation (Thanks @kativiti!)
78
+ * Add partial Estonian translation
79
+
80
+ = 1.0.2 =
81
+ * Fix T&C and Privacy Policy URLs on registration and comments forms
82
+ * Add basic styling and separate stylesheet for Privacy Tools page
83
+ * Allow disabling styles for Privacy Tools page via admin
84
+ * Add confirmation notice on deleting data via front-end Privacy Tools
85
+ * Change strings with 'gdpr-admin' domain back to 'gdpr'. Add context to all admin strings.
86
+
87
+ = 1.0.1 =
88
+ * Fix PHP notice on Privacy Tools frontend page if logged in as admin
89
+
90
+ = 1.0.0 =
91
+ * Initial release
src/Admin/AdminError.php CHANGED
@@ -1,17 +1,17 @@
1
- <?php
2
-
3
-
4
- namespace Codelight\GDPR\Admin;
5
-
6
-
7
- class AdminError extends AdminNotice
8
- {
9
- public function render()
10
- {
11
- if (!$this->template) {
12
- trigger_error('Template not set for admin notice!', E_USER_ERROR);
13
- }
14
-
15
- echo gdpr('view')->render($this->template, $this->data);
16
- }
17
  }
1
+ <?php
2
+
3
+
4
+ namespace Codelight\GDPR\Admin;
5
+
6
+
7
+ class AdminError extends AdminNotice
8
+ {
9
+ public function render()
10
+ {
11
+ if (!$this->template) {
12
+ trigger_error('Template not set for admin notice!', E_USER_ERROR);
13
+ }
14
+
15
+ echo gdpr('view')->render($this->template, $this->data);
16
+ }
17
  }
src/Admin/AdminHelper.php CHANGED
@@ -1,57 +1,57 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Admin;
4
-
5
- class AdminHelper
6
- {
7
- public function __construct()
8
- {
9
- $this->toolsHelper();
10
- $this->autoinstallHelper();
11
- $this->policyHelper();
12
- }
13
-
14
- protected function toolsHelper()
15
- {
16
- $toolsPage = gdpr('options')->get('tools_page');
17
-
18
- // Display the notice only on Tools page
19
- if (!$toolsPage || !isset($_GET['post']) || $_GET['post'] !== $toolsPage) {
20
- return;
21
- }
22
-
23
- $post = get_post($toolsPage);
24
- $helpUrl = gdpr('helpers')->docs();
25
-
26
- if (!stristr($post->post_content, '[gdpr_privacy_tools]')) {
27
- gdpr('admin-notice')->add('admin/notices/helper-tools', compact('helpUrl'));
28
- }
29
- }
30
-
31
- protected function autoinstallHelper()
32
- {
33
- if (!isset($_GET['gdpr-notice']) || empty($_GET['gdpr-notice']) || 'autoinstall' !== $_GET['gdpr-notice']) {
34
- return;
35
- }
36
-
37
- $helpUrl = gdpr('helpers')->docs();
38
- gdpr('admin-notice')->add('admin/notices/helper-autoinstall', compact('helpUrl'));
39
- }
40
-
41
- protected function policyHelper()
42
- {
43
- $policyPage = gdpr('options')->get('policy_page');
44
-
45
- // Display the notice only on Policy page
46
- if (!$policyPage || !isset($_GET['post']) || $_GET['post'] !== $policyPage) {
47
- return;
48
- }
49
-
50
- $post = get_post($policyPage);
51
- $helpUrl = gdpr('helpers')->docs();
52
-
53
- if (stristr($post->post_content, '[TODO]')) {
54
- gdpr('admin-notice')->add('admin/notices/helper-policy', compact('helpUrl'));
55
- }
56
- }
57
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Admin;
4
+
5
+ class AdminHelper
6
+ {
7
+ public function __construct()
8
+ {
9
+ $this->toolsHelper();
10
+ $this->autoinstallHelper();
11
+ $this->policyHelper();
12
+ }
13
+
14
+ protected function toolsHelper()
15
+ {
16
+ $toolsPage = gdpr('options')->get('tools_page');
17
+
18
+ // Display the notice only on Tools page
19
+ if (!$toolsPage || !isset($_GET['post']) || $_GET['post'] !== $toolsPage) {
20
+ return;
21
+ }
22
+
23
+ $post = get_post($toolsPage);
24
+ $helpUrl = gdpr('helpers')->docs();
25
+
26
+ if (!stristr($post->post_content, '[gdpr_privacy_tools]')) {
27
+ gdpr('admin-notice')->add('admin/notices/helper-tools', compact('helpUrl'));
28
+ }
29
+ }
30
+
31
+ protected function autoinstallHelper()
32
+ {
33
+ if (!isset($_GET['gdpr-notice']) || empty($_GET['gdpr-notice']) || 'autoinstall' !== $_GET['gdpr-notice']) {
34
+ return;
35
+ }
36
+
37
+ $helpUrl = gdpr('helpers')->docs();
38
+ gdpr('admin-notice')->add('admin/notices/helper-autoinstall', compact('helpUrl'));
39
+ }
40
+
41
+ protected function policyHelper()
42
+ {
43
+ $policyPage = gdpr('options')->get('policy_page');
44
+
45
+ // Display the notice only on Policy page
46
+ if (!$policyPage || !isset($_GET['post']) || $_GET['post'] !== $policyPage) {
47
+ return;
48
+ }
49
+
50
+ $post = get_post($policyPage);
51
+ $helpUrl = gdpr('helpers')->docs();
52
+
53
+ if (stristr($post->post_content, '[TODO]')) {
54
+ gdpr('admin-notice')->add('admin/notices/helper-policy', compact('helpUrl'));
55
+ }
56
+ }
57
+ }
src/Admin/AdminNotice.php CHANGED
@@ -1,41 +1,41 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Admin;
4
-
5
- class AdminNotice
6
- {
7
- protected $template;
8
-
9
- protected $data;
10
-
11
- /**
12
- * todo: replace with a proper factory pattern via gdpr()?
13
- *
14
- * AdminNotice constructor.
15
- */
16
- public function __construct()
17
- {
18
- if (did_action('admin_notices')) {
19
- trigger_error('AdminNotice class called incorrectly - admin_notices action has already ran!', E_USER_ERROR);
20
- }
21
-
22
- add_action('admin_notices', [$this, 'render'], 9999);
23
- }
24
-
25
- public function add($template, $data = [])
26
- {
27
- $this->template = $template;
28
- $this->data = $data;
29
- }
30
-
31
- public function render()
32
- {
33
- if (!$this->template) {
34
- trigger_error('Template not set for admin notice!', E_USER_ERROR);
35
- }
36
-
37
- echo gdpr('view')->render('admin/notices/header');
38
- echo gdpr('view')->render($this->template, $this->data);
39
- echo gdpr('view')->render('admin/notices/footer');
40
- }
41
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Admin;
4
+
5
+ class AdminNotice
6
+ {
7
+ protected $template;
8
+
9
+ protected $data;
10
+
11
+ /**
12
+ * todo: replace with a proper factory pattern via gdpr()?
13
+ *
14
+ * AdminNotice constructor.
15
+ */
16
+ public function __construct()
17
+ {
18
+ if (did_action('admin_notices')) {
19
+ trigger_error('AdminNotice class called incorrectly - admin_notices action has already ran!', E_USER_ERROR);
20
+ }
21
+
22
+ add_action('admin_notices', [$this, 'render'], 9999);
23
+ }
24
+
25
+ public function add($template, $data = [])
26
+ {
27
+ $this->template = $template;
28
+ $this->data = $data;
29
+ }
30
+
31
+ public function render()
32
+ {
33
+ if (!$this->template) {
34
+ trigger_error('Template not set for admin notice!', E_USER_ERROR);
35
+ }
36
+
37
+ echo gdpr('view')->render('admin/notices/header');
38
+ echo gdpr('view')->render($this->template, $this->data);
39
+ echo gdpr('view')->render('admin/notices/footer');
40
+ }
41
+ }
src/Admin/AdminTab.php CHANGED
@@ -1,157 +1,157 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Admin;
4
-
5
- /**
6
- * Base class for admin tabs. Extend this.
7
- *
8
- * Class AdminTab
9
- *
10
- * @package Codelight\GDPR\Admin
11
- */
12
- abstract class AdminTab implements AdminTabInterface
13
- {
14
- /* @var string */
15
- protected $slug;
16
-
17
- /* @var string */
18
- protected $title;
19
-
20
- /**
21
- * @return string
22
- */
23
- public function getSlug()
24
- {
25
- return $this->slug;
26
- }
27
-
28
- /**
29
- * @return string
30
- */
31
- public function getTitle()
32
- {
33
- return $this->title;
34
- }
35
-
36
- /**
37
- * @return string
38
- */
39
- public function getOptionsGroupName()
40
- {
41
- return 'gdpr_' . $this->getSlug();
42
- }
43
-
44
- /**
45
- * Register a setting on the admin page
46
- *
47
- * @param $optionName
48
- * @param string $args
49
- */
50
- public function registerSetting($optionName, $args = [])
51
- {
52
- register_setting($this->getOptionsGroupName(), $optionName, $args);
53
- }
54
-
55
- /**
56
- * Register a section on the admin page
57
- *
58
- * @param $name
59
- * @param $callback
60
- */
61
- public function registerSettingSection($id, $title, $callback = null)
62
- {
63
- add_settings_section(
64
- $id,
65
- $title,
66
- $callback,
67
- $this->getOptionsGroupName()
68
- );
69
- }
70
-
71
- /**
72
- * Register a setting field on the admin page
73
- *
74
- * @param $id
75
- * @param $title
76
- * @param $callback
77
- */
78
- public function registerSettingField($id, $title, $callback = null, $section = '', $args = [])
79
- {
80
- add_settings_field(
81
- $id,
82
- $title,
83
- $callback,
84
- $this->getOptionsGroupName(),
85
- $section,
86
- $args
87
- );
88
- }
89
-
90
- /**
91
- * Render the contents including settings fields, sections and submit button.
92
- * Trigger hooks for rendering content before and after the settings fields.
93
- *
94
- * @return string
95
- */
96
- public function renderContents()
97
- {
98
- ob_start();
99
-
100
- do_action("gdpr/tabs/{$this->getSlug()}/before", $this);
101
- settings_fields($this->getOptionsGroupName());
102
- do_settings_sections($this->getOptionsGroupName());
103
- do_action("gdpr/tabs/{$this->getSlug()}/after", $this);
104
-
105
- $this->renderSubmitButton();
106
-
107
- return ob_get_clean();
108
- }
109
-
110
- /**
111
- * Render WP's default submit button
112
- */
113
- public function renderSubmitButton()
114
- {
115
- submit_button(_x('Save', '(Admin)', 'gdpr-framework'));
116
- }
117
-
118
- /**
119
- * Enqueue scripts, run the child class init function, trigger action for adding custom stuff
120
- */
121
- public function setup()
122
- {
123
- // Automatically run the 'enqueue' method if it exists
124
- if (method_exists($this, 'enqueue')) {
125
- add_action('admin_enqueue_scripts', [$this, 'enqueue']);
126
- }
127
-
128
- $this->init();
129
-
130
- // This hook can be used for registering custom settings
131
- do_action("gdpr/tabs/{$this->getSlug()}/init", $this);
132
-
133
- // Render the admin notices
134
- add_action('admin_notices', [$this, 'renderAdminNotices']);
135
- }
136
-
137
- /**
138
- * Render success notices via admin_notice action
139
- */
140
- public function renderAdminNotices()
141
- {
142
- if ('tools_page_privacy' !== get_current_screen()->base) {
143
- return;
144
- }
145
-
146
- if (!isset($_REQUEST['gdpr_notice'])) {
147
- return;
148
- }
149
-
150
- if ('policy_generated' === $_REQUEST['gdpr_notice']) {
151
- $message = _x('Policy generated!', '(Admin)', 'gdpr-framework');
152
- $class = 'notice notice-success';
153
- }
154
-
155
- echo gdpr('view')->render('admin/notice', compact('message', 'class'));
156
- }
157
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Admin;
4
+
5
+ /**
6
+ * Base class for admin tabs. Extend this.
7
+ *
8
+ * Class AdminTab
9
+ *
10
+ * @package Codelight\GDPR\Admin
11
+ */
12
+ abstract class AdminTab implements AdminTabInterface
13
+ {
14
+ /* @var string */
15
+ protected $slug;
16
+
17
+ /* @var string */
18
+ protected $title;
19
+
20
+ /**
21
+ * @return string
22
+ */
23
+ public function getSlug()
24
+ {
25
+ return $this->slug;
26
+ }
27
+
28
+ /**
29
+ * @return string
30
+ */
31
+ public function getTitle()
32
+ {
33
+ return $this->title;
34
+ }
35
+
36
+ /**
37
+ * @return string
38
+ */
39
+ public function getOptionsGroupName()
40
+ {
41
+ return 'gdpr_' . $this->getSlug();
42
+ }
43
+
44
+ /**
45
+ * Register a setting on the admin page
46
+ *
47
+ * @param $optionName
48
+ * @param string $args
49
+ */
50
+ public function registerSetting($optionName, $args = [])
51
+ {
52
+ register_setting($this->getOptionsGroupName(), $optionName, $args);
53
+ }
54
+
55
+ /**
56
+ * Register a section on the admin page
57
+ *
58
+ * @param $name
59
+ * @param $callback
60
+ */
61
+ public function registerSettingSection($id, $title, $callback = null)
62
+ {
63
+ add_settings_section(
64
+ $id,
65
+ $title,
66
+ $callback,
67
+ $this->getOptionsGroupName()
68
+ );
69
+ }
70
+
71
+ /**
72
+ * Register a setting field on the admin page
73
+ *
74
+ * @param $id
75
+ * @param $title
76
+ * @param $callback
77
+ */
78
+ public function registerSettingField($id, $title, $callback = null, $section = '', $args = [])
79
+ {
80
+ add_settings_field(
81
+ $id,
82
+ $title,
83
+ $callback,
84
+ $this->getOptionsGroupName(),
85
+ $section,
86
+ $args
87
+ );
88
+ }
89
+
90
+ /**
91
+ * Render the contents including settings fields, sections and submit button.
92
+ * Trigger hooks for rendering content before and after the settings fields.
93
+ *
94
+ * @return string
95
+ */
96
+ public function renderContents()
97
+ {
98
+ ob_start();
99
+
100
+ do_action("gdpr/tabs/{$this->getSlug()}/before", $this);
101
+ settings_fields($this->getOptionsGroupName());
102
+ do_settings_sections($this->getOptionsGroupName());
103
+ do_action("gdpr/tabs/{$this->getSlug()}/after", $this);
104
+
105
+ $this->renderSubmitButton();
106
+
107
+ return ob_get_clean();
108
+ }
109
+
110
+ /**
111
+ * Render WP's default submit button
112
+ */
113
+ public function renderSubmitButton()
114
+ {
115
+ submit_button(_x('Save', '(Admin)', 'gdpr-framework'));
116
+ }
117
+
118
+ /**
119
+ * Enqueue scripts, run the child class init function, trigger action for adding custom stuff
120
+ */
121
+ public function setup()
122
+ {
123
+ // Automatically run the 'enqueue' method if it exists
124
+ if (method_exists($this, 'enqueue')) {
125
+ add_action('admin_enqueue_scripts', [$this, 'enqueue']);
126
+ }
127
+
128
+ $this->init();
129
+
130
+ // This hook can be used for registering custom settings
131
+ do_action("gdpr/tabs/{$this->getSlug()}/init", $this);
132
+
133
+ // Render the admin notices
134
+ add_action('admin_notices', [$this, 'renderAdminNotices']);
135
+ }
136
+
137
+ /**
138
+ * Render success notices via admin_notice action
139
+ */
140
+ public function renderAdminNotices()
141
+ {
142
+ if ('tools_page_privacy' !== get_current_screen()->base) {
143
+ return;
144
+ }
145
+
146
+ if (!isset($_REQUEST['gdpr_notice'])) {
147
+ return;
148
+ }
149
+
150
+ if ('policy_generated' === $_REQUEST['gdpr_notice']) {
151
+ $message = _x('Policy generated!', '(Admin)', 'gdpr-framework');
152
+ $class = 'notice notice-success';
153
+ }
154
+
155
+ echo gdpr('view')->render('admin/notice', compact('message', 'class'));
156
+ }
157
+ }
src/Admin/AdminTabGeneral.php CHANGED
@@ -1,277 +1,277 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Admin;
4
-
5
- class AdminTabGeneral extends AdminTab
6
- {
7
- protected $slug = 'general';
8
-
9
- public function __construct()
10
- {
11
- $this->title = _x('General', '(Admin)', 'gdpr-framework');
12
-
13
- $this->registerSetting('gdpr_enable');
14
-
15
- $this->registerSetting('gdpr_tools_page');
16
- $this->registerSetting('gdpr_policy_page');
17
- $this->registerSetting('gdpr_terms_page');
18
-
19
- $this->registerSetting('gdpr_export_action');
20
- $this->registerSetting('gdpr_export_action_email');
21
-
22
- $this->registerSetting('gdpr_delete_action');
23
- $this->registerSetting('gdpr_delete_action_reassign');
24
- $this->registerSetting('gdpr_delete_action_reassign_user');
25
- $this->registerSetting('gdpr_delete_action_email');
26
-
27
- $this->registerSetting('gdpr_enable_stylesheet');
28
- $this->registerSetting('gdpr_enable_theme_compatibility');
29
- }
30
-
31
- public function init()
32
- {
33
- /**
34
- * General
35
- */
36
- $this->registerSettingSection(
37
- 'gdpr_section_general',
38
- _x('General Settings', '(Admin)', 'gdpr-framework')
39
- );
40
-
41
- $this->registerSettingField(
42
- 'gdpr_enable',
43
- _x('Enable Privacy Tools', '(Admin)', 'gdpr-framework'),
44
- [$this, 'renderEnableCheckbox'],
45
- 'gdpr_section_general'
46
- );
47
-
48
- /**
49
- * GDPR system pages
50
- */
51
- $this->registerSettingSection(
52
- 'gdpr_section_pages',
53
- _x('Pages', '(Admin)', 'gdpr-framework')
54
- );
55
-
56
- $this->registerSettingField(
57
- 'gdpr_tools_page',
58
- _x('Privacy Tools Page', '(Admin)', 'gdpr-framework') . '*',
59
- [$this, 'renderPrivacyToolsPageSelector'],
60
- 'gdpr_section_pages'
61
- );
62
-
63
- $this->registerSettingField(
64
- 'gdpr_policy_page',
65
- _x('Privacy Policy Page', '(Admin)', 'gdpr-framework') . '*',
66
- [$this, 'renderPolicyPageSelector'],
67
- 'gdpr_section_pages'
68
- );
69
-
70
- $this->registerSettingField(
71
- 'gdpr_terms_page',
72
- _x('Terms & Conditions Page', '(Admin)', 'gdpr-framework'),
73
- [$this, 'renderTermsPageSelector'],
74
- 'gdpr_section_pages'
75
- );
76
-
77
- /**
78
- * View & Export
79
- */
80
- $this->registerSettingSection(
81
- 'gdpr_section_export',
82
- _x('View & Export Data', '(Admin)', 'gdpr-framework')
83
- );
84
-
85
- $this->registerSettingField(
86
- 'gdpr_export_action',
87
- _x('Export action', '(Admin)', 'gdpr-framework'),
88
- [$this, 'renderExportActionSelector'],
89
- 'gdpr_section_export'
90
- );
91
-
92
- $this->registerSettingField(
93
- 'gdpr_export_action_email',
94
- _x('Email to notify', '(Admin)', 'gdpr-framework'),
95
- [$this, 'renderExportActionEmail'],
96
- 'gdpr_section_export',
97
- ['class' => 'js-gdpr-export-action-email hidden']
98
- );
99
-
100
- /**
101
- * Delete data
102
- */
103
- $this->registerSettingSection(
104
- 'gdpr_section_delete',
105
- _x('Delete & Anonymize Data', '(Admin)', 'gdpr-framework')
106
- );
107
-
108
- $this->registerSettingField(
109
- 'gdpr_delete_action',
110
- _x('Delete action', '(Admin)', 'gdpr-framework'),
111
- [$this, 'renderDeleteActionSelector'],
112
- 'gdpr_section_delete'
113
- );
114
-
115
- $this->registerSettingField(
116
- 'gdpr_delete_action_reassign',
117
- _x('Delete or reassign content?', '(Admin)', 'gdpr-framework'),
118
- [$this, 'renderDeleteActionReassign'],
119
- 'gdpr_section_delete',
120
- ['class' => 'js-gdpr-delete-action-reassign hidden']
121
- );
122
-
123
- $this->registerSettingField(
124
- 'gdpr_delete_action_reassign_user',
125
- _x('Reassign content to', '(Admin)', 'gdpr-framework'),
126
- [$this, 'renderDeleteActionReassignUser'],
127
- 'gdpr_section_delete',
128
- ['class' => 'js-gdpr-delete-action-reassign-user hidden']
129
- );
130
-
131
- $this->registerSettingField(
132
- 'gdpr_delete_action_email',
133
- _x('Email to notify', '(Admin)', 'gdpr-framework'),
134
- [$this, 'renderDeleteActionEmail'],
135
- 'gdpr_section_delete',
136
- ['class' => 'js-gdpr-delete-action-email hidden']
137
- );
138
-
139
- /**
140
- * Stylesheet
141
- */
142
-
143
- $this->registerSettingSection(
144
- 'gdpr_section_stylesheet',
145
- _x('Styling', '(Admin)', 'gdpr-framework')
146
- );
147
-
148
- $this->registerSettingField(
149
- 'gdpr_enable_theme_compatibility',
150
- _x('Enable basic styling on Privacy Tools page', '(Admin)', 'gdpr-framework'),
151
- [$this, 'renderStylesheetSelector'],
152
- 'gdpr_section_stylesheet'
153
- );
154
-
155
- if (gdpr('themes')->isCurrentThemeSupported()) {
156
-
157
- /**
158
- * Compatibility settings
159
- */
160
- $this->registerSettingSection(
161
- 'gdpr_section_compatibility',
162
- _x('Compatibility', '(Admin)', 'gdpr-framework')
163
- );
164
-
165
- $this->registerSettingField(
166
- 'gdpr_enable_theme_compatibility',
167
- _x('Enable automatic theme compatibility', '(Admin)', 'gdpr-framework'),
168
- [$this, 'renderThemeCompatibilitySelector'],
169
- 'gdpr_section_compatibility'
170
- );
171
- }
172
- }
173
-
174
- public function renderEnableCheckbox()
175
- {
176
- $enabled = gdpr('options')->get('enable');
177
- echo gdpr('view')->render('admin/general/enable', compact('enabled'));
178
- }
179
-
180
- public function renderPrivacyToolsPageSelector()
181
- {
182
- wp_dropdown_pages([
183
- 'name' => 'gdpr_tools_page',
184
- 'show_option_none' => _x('&mdash; Select &mdash;', '(Admin)', 'gdpr-framework'),
185
- 'option_none_value' => '0',
186
- 'selected' => gdpr('options')->get('tools_page'),
187
- 'class' => 'js-gdpr-select2 gdpr-select',
188
- 'post_status' => 'publish,draft',
189
- ]);
190
- echo gdpr('view')->render('admin/general/description-data-page');
191
- }
192
-
193
- /**
194
- * Render the GDPR policy page selector dropdown
195
- */
196
- public function renderPolicyPageSelector()
197
- {
198
- wp_dropdown_pages([
199
- 'name' => 'gdpr_policy_page',
200
- 'show_option_none' => _x('&mdash; Select &mdash;', '(Admin)', 'gdpr-framework'),
201
- 'option_none_value' => '0',
202
- 'selected' => gdpr('options')->get('policy_page'),
203
- 'class' => 'js-gdpr-select2 gdpr-select',
204
- 'post_status' => 'publish,draft',
205
- ]);
206
- echo gdpr('view')->render('admin/privacy-policy/description-policy-page');
207
- }
208
-
209
- public function renderTermsPageSelector()
210
- {
211
- wp_dropdown_pages([
212
- 'name' => 'gdpr_terms_page',
213
- 'show_option_none' => _x('&mdash; Select &mdash;', '(Admin)', 'gdpr-framework'),
214
- 'option_none_value' => '0',
215
- 'selected' => gdpr('options')->get('terms_page'),
216
- 'class' => 'js-gdpr-select2 gdpr-select',
217
- 'post_status' => 'publish,draft',
218
- ]);
219
- echo gdpr('view')->render('admin/general/description-terms-page');
220
- }
221
-
222
- public function renderExportActionSelector()
223
- {
224
- $exportAction = gdpr('options')->get('export_action');
225
- echo gdpr('view')->render('admin/general/export-action', compact('exportAction'));
226
- echo gdpr('view')->render('admin/general/description-export-action');
227
- }
228
-
229
- public function renderExportActionEmail()
230
- {
231
- $exportActionEmail = gdpr('options')->get('export_action_email');
232
- echo gdpr('view')->render('admin/general/export-action-email', compact('exportActionEmail'));
233
- }
234
-
235
- public function renderDeleteActionSelector()
236
- {
237
- $deleteAction = gdpr('options')->get('delete_action');
238
- echo gdpr('view')->render('admin/general/delete-action', compact('deleteAction'));
239
- echo gdpr('view')->render('admin/general/description-delete-action');
240
- }
241
-
242
- public function renderDeleteActionReassign()
243
- {
244
- $reassign = gdpr('options')->get('delete_action_reassign');
245
- echo gdpr('view')->render('admin/general/delete-action-reassign', compact('reassign'));
246
- }
247
-
248
- public function renderDeleteActionReassignUser()
249
- {
250
- wp_dropdown_users([
251
- 'name' => 'gdpr_delete_action_reassign_user',
252
- 'show_option_none' => _x('&mdash; Select &mdash;', '(Admin)', 'gdpr-framework'),
253
- 'option_none_value' => '0',
254
- 'selected' => gdpr('options')->get('delete_action_reassign_user'),
255
- 'class' => 'js-gdpr-select2 gdpr-select',
256
- 'role__in' => apply_filters('gdpr/options/reassign/roles', ['administrator', 'editor']),
257
- ]);
258
- }
259
-
260
- public function renderDeleteActionEmail()
261
- {
262
- $deleteActionEmail = gdpr('options')->get('delete_action_email');
263
- echo gdpr('view')->render('admin/general/delete-action-email', compact('deleteActionEmail'));
264
- }
265
-
266
- public function renderStylesheetSelector()
267
- {
268
- $enabled = gdpr('options')->get('enable_stylesheet');
269
- echo gdpr('view')->render('admin/general/stylesheet', compact('enabled'));
270
- }
271
-
272
- public function renderThemeCompatibilitySelector()
273
- {
274
- $enabled = gdpr('options')->get('enable_theme_compatibility');
275
- echo gdpr('view')->render('admin/general/theme-compatibility', compact('enabled'));
276
- }
277
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Admin;
4
+
5
+ class AdminTabGeneral extends AdminTab
6
+ {
7
+ protected $slug = 'general';
8
+
9
+ public function __construct()
10
+ {
11
+ $this->title = _x('General', '(Admin)', 'gdpr-framework');
12
+
13
+ $this->registerSetting('gdpr_enable');
14
+
15
+ $this->registerSetting('gdpr_tools_page');
16
+ $this->registerSetting('gdpr_policy_page');
17
+ $this->registerSetting('gdpr_terms_page');
18
+
19
+ $this->registerSetting('gdpr_export_action');
20
+ $this->registerSetting('gdpr_export_action_email');
21
+
22
+ $this->registerSetting('gdpr_delete_action');
23
+ $this->registerSetting('gdpr_delete_action_reassign');
24
+ $this->registerSetting('gdpr_delete_action_reassign_user');
25
+ $this->registerSetting('gdpr_delete_action_email');
26
+
27
+ $this->registerSetting('gdpr_enable_stylesheet');
28
+ $this->registerSetting('gdpr_enable_theme_compatibility');
29
+ }
30
+
31
+ public function init()
32
+ {
33
+ /**
34
+ * General
35
+ */
36
+ $this->registerSettingSection(
37
+ 'gdpr_section_general',
38
+ _x('General Settings', '(Admin)', 'gdpr-framework')
39
+ );
40
+
41
+ $this->registerSettingField(
42
+ 'gdpr_enable',
43
+ _x('Enable Privacy Tools', '(Admin)', 'gdpr-framework'),
44
+ [$this, 'renderEnableCheckbox'],
45
+ 'gdpr_section_general'
46
+ );
47
+
48
+ /**
49
+ * GDPR system pages
50
+ */
51
+ $this->registerSettingSection(
52
+ 'gdpr_section_pages',
53
+ _x('Pages', '(Admin)', 'gdpr-framework')
54
+ );
55
+
56
+ $this->registerSettingField(
57
+ 'gdpr_tools_page',
58
+ _x('Privacy Tools Page', '(Admin)', 'gdpr-framework') . '*',
59
+ [$this, 'renderPrivacyToolsPageSelector'],
60
+ 'gdpr_section_pages'
61
+ );
62
+
63
+ $this->registerSettingField(
64
+ 'gdpr_policy_page',
65
+ _x('Privacy Policy Page', '(Admin)', 'gdpr-framework') . '*',
66
+ [$this, 'renderPolicyPageSelector'],
67
+ 'gdpr_section_pages'
68
+ );
69
+
70
+ $this->registerSettingField(
71
+ 'gdpr_terms_page',
72
+ _x('Terms & Conditions Page', '(Admin)', 'gdpr-framework'),
73
+ [$this, 'renderTermsPageSelector'],
74
+ 'gdpr_section_pages'
75
+ );
76
+
77
+ /**
78
+ * View & Export
79
+ */
80
+ $this->registerSettingSection(
81
+ 'gdpr_section_export',
82
+ _x('View & Export Data', '(Admin)', 'gdpr-framework')
83
+ );
84
+
85
+ $this->registerSettingField(
86
+ 'gdpr_export_action',
87
+ _x('Export action', '(Admin)', 'gdpr-framework'),
88
+ [$this, 'renderExportActionSelector'],
89
+ 'gdpr_section_export'
90
+ );
91
+
92
+ $this->registerSettingField(
93
+ 'gdpr_export_action_email',
94
+ _x('Email to notify', '(Admin)', 'gdpr-framework'),
95
+ [$this, 'renderExportActionEmail'],
96
+ 'gdpr_section_export',
97
+ ['class' => 'js-gdpr-export-action-email hidden']
98
+ );
99
+
100
+ /**
101
+ * Delete data
102
+ */
103
+ $this->registerSettingSection(
104
+ 'gdpr_section_delete',
105
+ _x('Delete & Anonymize Data', '(Admin)', 'gdpr-framework')
106
+ );
107
+
108
+ $this->registerSettingField(
109
+ 'gdpr_delete_action',
110
+ _x('Delete action', '(Admin)', 'gdpr-framework'),
111
+ [$this, 'renderDeleteActionSelector'],
112
+ 'gdpr_section_delete'
113
+ );
114
+
115
+ $this->registerSettingField(
116
+ 'gdpr_delete_action_reassign',
117
+ _x('Delete or reassign content?', '(Admin)', 'gdpr-framework'),
118
+ [$this, 'renderDeleteActionReassign'],
119
+ 'gdpr_section_delete',
120
+ ['class' => 'js-gdpr-delete-action-reassign hidden']
121
+ );
122
+
123
+ $this->registerSettingField(
124
+ 'gdpr_delete_action_reassign_user',
125
+ _x('Reassign content to', '(Admin)', 'gdpr-framework'),
126
+ [$this, 'renderDeleteActionReassignUser'],
127
+ 'gdpr_section_delete',
128
+ ['class' => 'js-gdpr-delete-action-reassign-user hidden']
129
+ );
130
+
131
+ $this->registerSettingField(
132
+ 'gdpr_delete_action_email',
133
+ _x('Email to notify', '(Admin)', 'gdpr-framework'),
134
+ [$this, 'renderDeleteActionEmail'],
135
+ 'gdpr_section_delete',
136
+ ['class' => 'js-gdpr-delete-action-email hidden']
137
+ );
138
+
139
+ /**
140
+ * Stylesheet
141
+ */
142
+
143
+ $this->registerSettingSection(
144
+ 'gdpr_section_stylesheet',
145
+ _x('Styling', '(Admin)', 'gdpr-framework')
146
+ );
147
+
148
+ $this->registerSettingField(
149
+ 'gdpr_enable_theme_compatibility',
150
+ _x('Enable basic styling on Privacy Tools page', '(Admin)', 'gdpr-framework'),
151
+ [$this, 'renderStylesheetSelector'],
152
+ 'gdpr_section_stylesheet'
153
+ );
154
+
155
+ if (gdpr('themes')->isCurrentThemeSupported()) {
156
+
157
+ /**
158
+ * Compatibility settings
159
+ */
160
+ $this->registerSettingSection(
161
+ 'gdpr_section_compatibility',
162
+ _x('Compatibility', '(Admin)', 'gdpr-framework')
163
+ );
164
+
165
+ $this->registerSettingField(
166
+ 'gdpr_enable_theme_compatibility',
167
+ _x('Enable automatic theme compatibility', '(Admin)', 'gdpr-framework'),
168
+ [$this, 'renderThemeCompatibilitySelector'],
169
+ 'gdpr_section_compatibility'
170
+ );
171
+ }
172
+ }
173
+
174
+ public function renderEnableCheckbox()
175
+ {
176
+ $enabled = gdpr('options')->get('enable');
177
+ echo gdpr('view')->render('admin/general/enable', compact('enabled'));
178
+ }
179
+
180
+ public function renderPrivacyToolsPageSelector()
181
+ {
182
+ wp_dropdown_pages([
183
+ 'name' => 'gdpr_tools_page',
184
+ 'show_option_none' => _x('&mdash; Select &mdash;', '(Admin)', 'gdpr-framework'),
185
+ 'option_none_value' => '0',
186
+ 'selected' => gdpr('options')->get('tools_page'),
187
+ 'class' => 'js-gdpr-select2 gdpr-select',
188
+ 'post_status' => 'publish,draft',
189
+ ]);
190
+ echo gdpr('view')->render('admin/general/description-data-page');
191
+ }
192
+
193
+ /**
194
+ * Render the GDPR policy page selector dropdown
195
+ */
196
+ public function renderPolicyPageSelector()
197
+ {
198
+ wp_dropdown_pages([
199
+ 'name' => 'gdpr_policy_page',
200
+ 'show_option_none' => _x('&mdash; Select &mdash;', '(Admin)', 'gdpr-framework'),
201
+ 'option_none_value' => '0',
202
+ 'selected' => gdpr('options')->get('policy_page'),
203
+ 'class' => 'js-gdpr-select2 gdpr-select',
204
+ 'post_status' => 'publish,draft',
205
+ ]);
206
+ echo gdpr('view')->render('admin/privacy-policy/description-policy-page');
207
+ }
208
+
209
+ public function renderTermsPageSelector()
210
+ {
211
+ wp_dropdown_pages([
212
+ 'name' => 'gdpr_terms_page',
213
+ 'show_option_none' => _x('&mdash; Select &mdash;', '(Admin)', 'gdpr-framework'),
214
+ 'option_none_value' => '0',
215
+ 'selected' => gdpr('options')->get('terms_page'),
216
+ 'class' => 'js-gdpr-select2 gdpr-select',
217
+ 'post_status' => 'publish,draft',
218
+ ]);
219
+ echo gdpr('view')->render('admin/general/description-terms-page');
220
+ }
221
+
222
+ public function renderExportActionSelector()
223
+ {
224
+ $exportAction = gdpr('options')->get('export_action');
225
+ echo gdpr('view')->render('admin/general/export-action', compact('exportAction'));
226
+ echo gdpr('view')->render('admin/general/description-export-action');
227
+ }
228
+
229
+ public function renderExportActionEmail()
230
+ {
231
+ $exportActionEmail = gdpr('options')->get('export_action_email');
232
+ echo gdpr('view')->render('admin/general/export-action-email', compact('exportActionEmail'));
233
+ }
234
+
235
+ public function renderDeleteActionSelector()
236
+ {
237
+ $deleteAction = gdpr('options')->get('delete_action');
238
+ echo gdpr('view')->render('admin/general/delete-action', compact('deleteAction'));
239
+ echo gdpr('view')->render('admin/general/description-delete-action');
240
+ }
241
+
242
+ public function renderDeleteActionReassign()
243
+ {
244
+ $reassign = gdpr('options')->get('delete_action_reassign');
245
+ echo gdpr('view')->render('admin/general/delete-action-reassign', compact('reassign'));
246
+ }
247
+
248
+ public function renderDeleteActionReassignUser()
249
+ {
250
+ wp_dropdown_users([
251
+ 'name' => 'gdpr_delete_action_reassign_user',
252
+ 'show_option_none' => _x('&mdash; Select &mdash;', '(Admin)', 'gdpr-framework'),
253
+ 'option_none_value' => '0',
254
+ 'selected' => gdpr('options')->get('delete_action_reassign_user'),
255
+ 'class' => 'js-gdpr-select2 gdpr-select',
256
+ 'role__in' => apply_filters('gdpr/options/reassign/roles', ['administrator', 'editor']),
257
+ ]);
258
+ }
259
+
260
+ public function renderDeleteActionEmail()
261
+ {
262
+ $deleteActionEmail = gdpr('options')->get('delete_action_email');
263
+ echo gdpr('view')->render('admin/general/delete-action-email', compact('deleteActionEmail'));
264
+ }
265
+
266
+ public function renderStylesheetSelector()
267
+ {
268
+ $enabled = gdpr('options')->get('enable_stylesheet');
269
+ echo gdpr('view')->render('admin/general/stylesheet', compact('enabled'));
270
+ }
271
+
272
+ public function renderThemeCompatibilitySelector()
273
+ {
274
+ $enabled = gdpr('options')->get('enable_theme_compatibility');
275
+ echo gdpr('view')->render('admin/general/theme-compatibility', compact('enabled'));
276
+ }
277
+ }
src/Admin/Modal.php CHANGED
@@ -1,41 +1,41 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Admin;
4
-
5
- class Modal
6
- {
7
- protected $id;
8
-
9
- protected $template;
10
-
11
- protected $data;
12
-
13
- /**
14
- * todo: replace with a proper factory pattern via gdpr()?
15
- *
16
- * AdminNotice constructor.
17
- */
18
- public function __construct()
19
- {
20
- add_action('admin_footer', [$this, 'render']);
21
- }
22
-
23
- public function add($id, $template, $data = [])
24
- {
25
- $this->id = $id;
26
- $this->template = $template;
27
- $this->data = $data;
28
- $this->data['id'] = $this->id;
29
- }
30
-
31
- public function render()
32
- {
33
- if (!$this->template) {
34
- trigger_error('Template not set for admin notice!', E_USER_ERROR);
35
- }
36
-
37
- echo gdpr('view')->render('admin/modals/header', $this->data);
38
- echo gdpr('view')->render($this->template, $this->data);
39
- echo gdpr('view')->render('admin/modals/footer', $this->data);
40
- }
41
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Admin;
4
+
5
+ class Modal
6
+ {
7
+ protected $id;
8
+
9
+ protected $template;
10
+
11
+ protected $data;
12
+
13
+ /**
14
+ * todo: replace with a proper factory pattern via gdpr()?
15
+ *
16
+ * AdminNotice constructor.
17
+ */
18
+ public function __construct()
19
+ {
20
+ add_action('admin_footer', [$this, 'render']);
21
+ }
22
+
23
+ public function add($id, $template, $data = [])
24
+ {
25
+ $this->id = $id;
26
+ $this->template = $template;
27
+ $this->data = $data;
28
+ $this->data['id'] = $this->id;
29
+ }
30
+
31
+ public function render()
32
+ {
33
+ if (!$this->template) {
34
+ trigger_error('Template not set for admin notice!', E_USER_ERROR);
35
+ }
36
+
37
+ echo gdpr('view')->render('admin/modals/header', $this->data);
38
+ echo gdpr('view')->render($this->template, $this->data);
39
+ echo gdpr('view')->render('admin/modals/footer', $this->data);
40
+ }
41
+ }
src/Admin/WordpressAdmin.php CHANGED
@@ -1,156 +1,156 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Admin;
4
-
5
- /**
6
- * Handles general admin functionality
7
- *
8
- * Class WordpressAdmin
9
- *
10
- * @package Codelight\GDPR\Admin
11
- */
12
- class WordpressAdmin
13
- {
14
- public function __construct(WordpressAdminPage $adminPage)
15
- {
16
- $this->adminPage = $adminPage;
17
-
18
- // Register the AdminTabGeneral class in our container
19
- gdpr()->bind(AdminTabGeneral::class);
20
-
21
- // Allow turning off helpers
22
- if (apply_filters('gdpr/admin/helpers/enabled', true)) {
23
- gdpr()->make(AdminHelper::class);
24
- }
25
-
26
- $this->setup();
27
-
28
- }
29
-
30
- /**
31
- * Set up hooks
32
- */
33
- protected function setup()
34
- {
35
- // Register the main GDPR options page
36
- add_action('admin_menu', [$this, 'registerGDPROptionsPage']);
37
-
38
- // Register General admin tab
39
- add_filter('gdpr/admin/tabs', [$this, 'registerAdminTabGeneral'], 0);
40
-
41
- // Enqueue assets
42
- add_action('admin_enqueue_scripts', [$this, 'enqueue']);
43
-
44
- // Register post states
45
- add_filter('display_post_states', [$this, 'registerPostStates'], 10, 2);
46
-
47
- // Show help notice
48
- add_action('current_screen', [$this, 'maybeShowHelpNotice'], 999);
49
- }
50
-
51
-
52
- public function maybeShowHelpNotice()
53
- {
54
- if ('tools_page_privacy' === get_current_screen()->base) {
55
- gdpr('admin-notice')->add('admin/notices/help');
56
- }
57
- }
58
-
59
- /**
60
- * Register the GDPR options page in WP admin
61
- */
62
- public function registerGDPROptionsPage()
63
- {
64
- add_management_page(
65
- _x('Privacy & GDPR Settings', '(Admin)', 'gdpr-framework'),
66
- _x('Privacy', '(Admin)', 'gdpr-framework'),
67
- 'manage_options',
68
- 'privacy',
69
- [$this->adminPage, 'renderPage']
70
- );
71
- }
72
-
73
- /**
74
- * Register General admin tab
75
- *
76
- * @param $tabs
77
- * @return array
78
- */
79
- public function registerAdminTabGeneral($tabs)
80
- {
81
- $tabs['general'] = gdpr(AdminTabGeneral::class);
82
-
83
- return $tabs;
84
- }
85
-
86
- /**
87
- * Enqueue all admin scripts and styles
88
- */
89
- public function enqueue()
90
- {
91
- /**
92
- * General admin styles
93
- */
94
- wp_enqueue_style(
95
- 'gdpr-admin',
96
- gdpr('config')->get('plugin.url') . 'assets/gdpr-admin.css'
97
- );
98
-
99
-
100
-
101
- /**
102
- * jQuery UI dialog for modals
103
- */
104
- wp_enqueue_style('wp-jquery-ui-dialog');
105
- wp_enqueue_script(
106
- 'gdpr-admin',
107
- gdpr('config')->get('plugin.url') . 'assets/gdpr-admin.js',
108
- ['jquery-ui-dialog']
109
- );
110
-
111
- /**
112
- * jQuery Repeater
113
- */
114
- wp_enqueue_script(
115
- 'jquery-repeater',
116
- gdpr('config')->get('plugin.url') . 'assets/jquery.repeater.min.js',
117
- ['jquery']
118
- );
119
-
120
- /**
121
- * Select2
122
- */
123
- wp_enqueue_style(
124
- 'select2css',
125
- '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css'
126
- );
127
-
128
- wp_enqueue_script(
129
- 'select2',
130
- '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.min.js',
131
- ['jquery']
132
- );
133
-
134
- wp_enqueue_script(
135
- 'conditional-show',
136
- gdpr('config')->get('plugin.url') . 'assets/conditional-show.js',
137
- ['jquery']
138
- );
139
- }
140
-
141
- /**
142
- * Add a new Post State for our super important system pages
143
- */
144
- public function registerPostStates($postStates, $post)
145
- {
146
- if (gdpr('options')->get('policy_page') == $post->ID) {
147
- $postStates['gdpr_policy_page'] = _x('Privacy Policy Page', '(Admin)', 'gdpr-framework');
148
- }
149
-
150
- if (gdpr('options')->get('tools_page') == $post->ID) {
151
- $postStates['gdpr_tools_page'] = _x('Privacy Tools Page', '(Admin)', 'gdpr-framework');
152
- }
153
-
154
- return $postStates;
155
- }
156
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Admin;
4
+
5
+ /**
6
+ * Handles general admin functionality
7
+ *
8
+ * Class WordpressAdmin
9
+ *
10
+ * @package Codelight\GDPR\Admin
11
+ */
12
+ class WordpressAdmin
13
+ {
14
+ public function __construct(WordpressAdminPage $adminPage)
15
+ {
16
+ $this->adminPage = $adminPage;
17
+
18
+ // Register the AdminTabGeneral class in our container
19
+ gdpr()->bind(AdminTabGeneral::class);
20
+
21
+ // Allow turning off helpers
22
+ if (apply_filters('gdpr/admin/helpers/enabled', true)) {
23
+ gdpr()->make(AdminHelper::class);
24
+ }
25
+
26
+ $this->setup();
27
+
28
+ }
29
+
30
+ /**
31
+ * Set up hooks
32
+ */
33
+ protected function setup()
34
+ {
35
+ // Register the main GDPR options page
36
+ add_action('admin_menu', [$this, 'registerGDPROptionsPage']);
37
+
38
+ // Register General admin tab
39
+ add_filter('gdpr/admin/tabs', [$this, 'registerAdminTabGeneral'], 0);
40
+
41
+ // Enqueue assets
42
+ add_action('admin_enqueue_scripts', [$this, 'enqueue']);
43
+
44
+ // Register post states
45
+ add_filter('display_post_states', [$this, 'registerPostStates'], 10, 2);
46
+
47
+ // Show help notice
48
+ add_action('current_screen', [$this, 'maybeShowHelpNotice'], 999);
49
+ }
50
+
51
+
52
+ public function maybeShowHelpNotice()
53
+ {
54
+ if ('tools_page_privacy' === get_current_screen()->base) {
55
+ gdpr('admin-notice')->add('admin/notices/help');
56
+ }
57
+ }
58
+
59
+ /**
60
+ * Register the GDPR options page in WP admin
61
+ */
62
+ public function registerGDPROptionsPage()
63
+ {
64
+ add_management_page(
65
+ _x('Privacy & GDPR Settings', '(Admin)', 'gdpr-framework'),
66
+ _x('Privacy', '(Admin)', 'gdpr-framework'),
67
+ 'manage_options',
68
+ 'privacy',
69
+ [$this->adminPage, 'renderPage']
70
+ );
71
+ }
72
+
73
+ /**
74
+ * Register General admin tab
75
+ *
76
+ * @param $tabs
77
+ * @return array
78
+ */
79
+ public function registerAdminTabGeneral($tabs)
80
+ {
81
+ $tabs['general'] = gdpr(AdminTabGeneral::class);
82
+
83
+ return $tabs;
84
+ }
85
+
86
+ /**
87
+ * Enqueue all admin scripts and styles
88
+ */
89
+ public function enqueue()
90
+ {
91
+ /**
92
+ * General admin styles
93
+ */
94
+ wp_enqueue_style(
95
+ 'gdpr-admin',
96
+ gdpr('config')->get('plugin.url') . 'assets/gdpr-admin.css'
97
+ );
98
+
99
+
100
+
101
+ /**
102
+ * jQuery UI dialog for modals
103
+ */
104
+ wp_enqueue_style('wp-jquery-ui-dialog');
105
+ wp_enqueue_script(
106
+ 'gdpr-admin',
107
+ gdpr('config')->get('plugin.url') . 'assets/gdpr-admin.js',
108
+ ['jquery-ui-dialog']
109
+ );
110
+
111
+ /**
112
+ * jQuery Repeater
113
+ */
114
+ wp_enqueue_script(
115
+ 'jquery-repeater',
116
+ gdpr('config')->get('plugin.url') . 'assets/jquery.repeater.min.js',
117
+ ['jquery']
118
+ );
119
+
120
+ /**
121
+ * Select2
122
+ */
123
+ wp_enqueue_style(
124
+ 'select2css',
125
+ '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css'
126
+ );
127
+
128
+ wp_enqueue_script(
129
+ 'select2',
130
+ '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.min.js',
131
+ ['jquery']
132
+ );
133
+
134
+ wp_enqueue_script(
135
+ 'conditional-show',
136
+ gdpr('config')->get('plugin.url') . 'assets/conditional-show.js',
137
+ ['jquery']
138
+ );
139
+ }
140
+
141
+ /**
142
+ * Add a new Post State for our super important system pages
143
+ */
144
+ public function registerPostStates($postStates, $post)
145
+ {
146
+ if (gdpr('options')->get('policy_page') == $post->ID) {
147
+ $postStates['gdpr_policy_page'] = _x('Privacy Policy Page', '(Admin)', 'gdpr-framework');
148
+ }
149
+
150
+ if (gdpr('options')->get('tools_page') == $post->ID) {
151
+ $postStates['gdpr_tools_page'] = _x('Privacy Tools Page', '(Admin)', 'gdpr-framework');
152
+ }
153
+
154
+ return $postStates;
155
+ }
156
+ }
src/Admin/WordpressAdminPage.php CHANGED
@@ -1,147 +1,147 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Admin;
4
-
5
- /**
6
- * Handle registering and rendering the GDPR admin page contents
7
- *
8
- * Class WordpressAdminPage
9
- *
10
- * @package Codelight\GDPR\Admin
11
- */
12
- class WordpressAdminPage
13
- {
14
- protected $slug = 'gdpr';
15
-
16
- protected $tabs = [];
17
-
18
- public function __construct()
19
- {
20
- $this->setup();
21
- }
22
-
23
- protected function setup()
24
- {
25
- // Register the tabs
26
- add_action('admin_init', [$this, 'registerTabs']);
27
-
28
- // todo
29
- //if (gdpr('options')->get('plugin_disclaimer_accepted')) {
30
- // Initialize the active tab
31
- add_action('admin_init', [$this, 'initActiveTab']);
32
- //}
33
-
34
- // todo
35
- // gdpr('admin-modal')->add('gdpr-test', 'admin/modals/test', ['title' => 'Test modal']);
36
- }
37
-
38
- /**
39
- * Render the main GDPR options page
40
- */
41
- public function renderPage()
42
- {
43
- $tabs = $this->getNavigationData();
44
- $currentTabContents = $this->getActiveTab()->renderContents();
45
- $signature = apply_filters('gdpr/admin/show_signature', true);
46
- echo gdpr('view')->render('admin/settings-page', compact('tabs', 'currentTabContents', 'signature'));
47
- }
48
-
49
- /**
50
- * Allow modules to add tabs
51
- */
52
- public function registerTabs()
53
- {
54
- $this->tabs = apply_filters('gdpr/admin/tabs', []);
55
- }
56
-
57
- /**
58
- * Get the active tab or the first tab if none are active
59
- *
60
- * @return AdminTabInterface
61
- */
62
- public function getActiveTab()
63
- {
64
- foreach ($this->tabs as $tab) {
65
- if (isset($_GET['gdpr-tab']) && $_GET['gdpr-tab'] === $tab->getSlug()) {
66
- return $tab;
67
- }
68
- }
69
-
70
- return reset($this->tabs);
71
- }
72
-
73
- /**
74
- * Check if the given tab is active
75
- *
76
- * @param $slug
77
- * @return bool
78
- */
79
- public function isTabActive($slug)
80
- {
81
- $activeTab = $this->getActiveTab();
82
- if ($activeTab->getSlug() === $slug) {
83
- return true;
84
- }
85
-
86
- // Hacky: if no tab set, the first tab is active
87
- if (!isset($_GET['gdpr-tab'])) {
88
- $firstTab = reset($this->tabs);
89
- if ($firstTab->getSlug() === $slug) {
90
- return true;
91
- }
92
- }
93
-
94
- return false;
95
- }
96
-
97
- /**
98
- * Initialize the active tab
99
- */
100
- public function initActiveTab()
101
- {
102
- $activeTab = $this->getActiveTab();
103
- $activeTab->setup();
104
- }
105
-
106
- /**
107
- * Get the tabbed navigation for GDPR options page
108
- *
109
- * @return array
110
- */
111
- public function getNavigationData()
112
- {
113
- if (!count($this->tabs)) {
114
- return [];
115
- }
116
-
117
- $navigation = [];
118
-
119
- foreach ($this->tabs as $tab) {
120
- /* @var $tab AdminTabInterface */
121
- $navigation[$tab->getSlug()] = [
122
- 'slug' => $tab->getSlug(),
123
- 'url' => $this->getTabUrl($tab->getSlug()),
124
- 'title' => $tab->getTitle(),
125
- 'active' => false,
126
- ];
127
-
128
- if ($this->isTabActive($tab->getSlug())) {
129
- $navigation[$tab->getSlug()]['active'] = true;
130
- }
131
- }
132
-
133
- return $navigation;
134
- }
135
-
136
-
137
- /**
138
- * todo: move to helper?
139
- *
140
- * @param $slug
141
- * @return string
142
- */
143
- public function getTabUrl($slug)
144
- {
145
- return admin_url('tools.php?page=privacy&gdpr-tab=' . $slug);
146
- }
147
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Admin;
4
+
5
+ /**
6
+ * Handle registering and rendering the GDPR admin page contents
7
+ *
8
+ * Class WordpressAdminPage
9
+ *
10
+ * @package Codelight\GDPR\Admin
11
+ */
12
+ class WordpressAdminPage
13
+ {
14
+ protected $slug = 'gdpr';
15
+
16
+ protected $tabs = [];
17
+
18
+ public function __construct()
19
+ {
20
+ $this->setup();
21
+ }
22
+
23
+ protected function setup()
24
+ {
25
+ // Register the tabs
26
+ add_action('admin_init', [$this, 'registerTabs']);
27
+
28
+ // todo
29
+ //if (gdpr('options')->get('plugin_disclaimer_accepted')) {
30
+ // Initialize the active tab
31
+ add_action('admin_init', [$this, 'initActiveTab']);
32
+ //}
33
+
34
+ // todo
35
+ // gdpr('admin-modal')->add('gdpr-test', 'admin/modals/test', ['title' => 'Test modal']);
36
+ }
37
+
38
+ /**
39
+ * Render the main GDPR options page
40
+ */
41
+ public function renderPage()
42
+ {
43
+ $tabs = $this->getNavigationData();
44
+ $currentTabContents = $this->getActiveTab()->renderContents();
45
+ $signature = apply_filters('gdpr/admin/show_signature', true);
46
+ echo gdpr('view')->render('admin/settings-page', compact('tabs', 'currentTabContents', 'signature'));
47
+ }
48
+
49
+ /**
50
+ * Allow modules to add tabs
51
+ */
52
+ public function registerTabs()
53
+ {
54
+ $this->tabs = apply_filters('gdpr/admin/tabs', []);
55
+ }
56
+
57
+ /**
58
+ * Get the active tab or the first tab if none are active
59
+ *
60
+ * @return AdminTabInterface
61
+ */
62
+ public function getActiveTab()
63
+ {
64
+ foreach ($this->tabs as $tab) {
65
+ if (isset($_GET['gdpr-tab']) && $_GET['gdpr-tab'] === $tab->getSlug()) {
66
+ return $tab;
67
+ }
68
+ }
69
+
70
+ return reset($this->tabs);
71
+ }
72
+
73
+ /**
74
+ * Check if the given tab is active
75
+ *
76
+ * @param $slug
77
+ * @return bool
78
+ */
79
+ public function isTabActive($slug)
80
+ {
81
+ $activeTab = $this->getActiveTab();
82
+ if ($activeTab->getSlug() === $slug) {
83
+ return true;
84
+ }
85
+
86
+ // Hacky: if no tab set, the first tab is active
87
+ if (!isset($_GET['gdpr-tab'])) {
88
+ $firstTab = reset($this->tabs);
89
+ if ($firstTab->getSlug() === $slug) {
90
+ return true;
91
+ }
92
+ }
93
+
94
+ return false;
95
+ }
96
+
97
+ /**
98
+ * Initialize the active tab
99
+ */
100
+ public function initActiveTab()
101
+ {
102
+ $activeTab = $this->getActiveTab();
103
+ $activeTab->setup();
104
+ }
105
+
106
+ /**
107
+ * Get the tabbed navigation for GDPR options page
108
+ *
109
+ * @return array
110
+ */
111
+ public function getNavigationData()
112
+ {
113
+ if (!count($this->tabs)) {
114
+ return [];
115
+ }
116
+
117
+ $navigation = [];
118
+
119
+ foreach ($this->tabs as $tab) {
120
+ /* @var $tab AdminTabInterface */
121
+ $navigation[$tab->getSlug()] = [
122
+ 'slug' => $tab->getSlug(),
123
+ 'url' => $this->getTabUrl($tab->getSlug()),
124
+ 'title' => $tab->getTitle(),
125
+ 'active' => false,
126
+ ];
127
+
128
+ if ($this->isTabActive($tab->getSlug())) {
129
+ $navigation[$tab->getSlug()]['active'] = true;
130
+ }
131
+ }
132
+
133
+ return $navigation;
134
+ }
135
+
136
+
137
+ /**
138
+ * todo: move to helper?
139
+ *
140
+ * @param $slug
141
+ * @return string
142
+ */
143
+ public function getTabUrl($slug)
144
+ {
145
+ return admin_url('tools.php?page=privacy&gdpr-tab=' . $slug);
146
+ }
147
+ }
src/Components/Consent/AdminTabConsent.php CHANGED
@@ -1,181 +1,181 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\Consent;
4
-
5
- use Codelight\GDPR\Admin\AdminTab;
6
-
7
- /**
8
- * Handle rendering and saving the Consent tab on GDPR Options page
9
- *
10
- * Class AdminTabConsent
11
- * @package Codelight\GDPR\Components\Consent
12
- */
13
- class AdminTabConsent extends AdminTab
14
- {
15
- /* @var string */
16
- protected $slug = 'consent';
17
-
18
- /* @var ConsentManager */
19
- protected $consentManager;
20
-
21
- /**
22
- * AdminTabConsent constructor.
23
- *
24
- * @param ConsentManager $consentManager
25
- */
26
- public function __construct(ConsentManager $consentManager)
27
- {
28
- $this->consentManager = $consentManager;
29
-
30
- $this->title = _x('Consent', '(Admin)', 'gdpr-framework');
31
-
32
- // If we don't register the settings, WP will not allow this page to be submitted
33
- $this->registerSetting('consent_types');
34
- $this->registerSetting('consent_info');
35
-
36
- $this->renderErrors();
37
-
38
- // Register handler for this action
39
- add_action('gdpr/admin/action/update_consent_data', [$this, 'updateConsentData']);
40
- }
41
-
42
- /**
43
- * Initialize tab contents and register hooks
44
- */
45
- public function init()
46
- {
47
- $this->registerSettingSection(
48
- 'gdpr_section_consent',
49
- _x('Consent', '(Admin)', 'gdpr-framework'),
50
- [$this, 'renderConsentForm']
51
- );
52
- }
53
-
54
- /**
55
- * Render the contents of the registered section
56
- */
57
- public function renderConsentForm()
58
- {
59
- $consentInfo = gdpr('options')->get('consent_info');
60
-
61
- if (is_null($consentInfo)) {
62
- $consentInfo = $this->getDefaultConsentInfo();
63
- } elseif (!$consentInfo) {
64
- $consentInfo = '';
65
- }
66
-
67
- $nonce = wp_create_nonce("gdpr/admin/action/update_consent_data");
68
- $defaultConsentTypes = $this->consentManager->getDefaultConsentTypes();
69
- $customConsentTypes = $this->consentManager->getCustomConsentTypes();
70
-
71
- // todo: move to a filter
72
- if (defined('ICL_LANGUAGE_CODE')) {
73
- $prefix = ICL_LANGUAGE_CODE . '_';
74
- } else {
75
- $prefix = '';
76
- }
77
-
78
- echo gdpr('view')->render('admin/consent', compact('nonce', 'customConsentTypes', 'defaultConsentTypes', 'consentInfo', 'prefix'));
79
- }
80
-
81
- /**
82
- * Save the submitted consent types
83
- */
84
- public function updateConsentData()
85
- {
86
- // Update additional information
87
- if (isset($_POST['gdpr_consent_info'])) {
88
- gdpr('options')->set('consent_info', wp_unslash($_POST['gdpr_consent_info']));
89
- }
90
-
91
- // Update consent types
92
- if (isset($_POST['gdpr_consent_types']) && is_array($_POST['gdpr_consent_types'])) {
93
- $consentTypes = $_POST['gdpr_consent_types'];
94
- } else {
95
- $consentTypes = [];
96
- }
97
-
98
- // Strip slashes which WP adds automatically
99
- if (count($consentTypes)) {
100
- foreach ($consentTypes as &$type) {
101
- foreach ($type as $key => $item) {
102
- if (is_array($item)) {
103
- $type[$key] = array_map('wp_unslash', $item);
104
- } else {
105
- $type[$key] = wp_unslash($item);
106
- }
107
-
108
- if ('visible' === $key) {
109
- $type[$key] = 1;
110
- }
111
- }
112
- }
113
- }
114
-
115
- $errors = [];
116
-
117
- if (!empty($consentTypes)) {
118
- $errors = $this->validate($consentTypes);
119
- }
120
-
121
- if (!count($errors)) {
122
- $this->consentManager->saveCustomConsentTypes($consentTypes);
123
- } else {
124
- $errorQuery = http_build_query($errors);
125
- wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=consent&') . $errorQuery);
126
- exit;
127
- }
128
- }
129
-
130
- protected function validate($consentTypes)
131
- {
132
- $errors = [];
133
-
134
- foreach ($consentTypes as $consentType) {
135
- if (empty($consentType['slug'])) {
136
- $errors['errors[]'] = 'slug-empty';
137
- }
138
-
139
- if (!preg_match('/^[A-Za-z0-9_-]+$/', $consentType['slug'])) {
140
- $errors['errors[]'] = 'slug-invalid';
141
- }
142
-
143
- if (empty($consentType['title'])) {
144
- $errors['errors[]'] = 'title-empty';
145
- }
146
- }
147
-
148
- return $errors;
149
- }
150
-
151
- public function renderErrors()
152
- {
153
- if (isset($_GET['errors']) && count($_GET['errors'])) {
154
-
155
- foreach ($_GET['errors'] as $error) {
156
- if ('slug-empty' === $error) {
157
- $message = _x("Consent slug is a required field!", '(Admin)', 'gdpr-framework');
158
- gdpr('admin-error')->add('admin/notices/error', compact('message'));
159
- }
160
-
161
- if ('slug-invalid' === $error) {
162
- $message = _x("You may only use alphanumeric characters, dash and underscore in the consent slug field.", '(Admin)', 'gdpr-framework');
163
- gdpr('admin-error')->add('admin/notices/error', compact('message'));
164
- }
165
-
166
- if ('title-empty' === $error) {
167
- $message = _x("Consent title is a required field!", '(Admin)', 'gdpr-framework');
168
- gdpr('admin-error')->add('admin/notices/error', compact('message'));
169
- }
170
- }
171
- }
172
- }
173
-
174
- /**
175
- * @return string
176
- */
177
- public function getDefaultConsentInfo()
178
- {
179
- return __('To use this website, you accepted our Privacy Policy. If you wish to withdraw your acceptance, please use the "Delete my data" button below.', 'gdpr-framework');
180
- }
181
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\Consent;
4
+
5
+ use Codelight\GDPR\Admin\AdminTab;
6
+
7
+ /**
8
+ * Handle rendering and saving the Consent tab on GDPR Options page
9
+ *
10
+ * Class AdminTabConsent
11
+ * @package Codelight\GDPR\Components\Consent
12
+ */
13
+ class AdminTabConsent extends AdminTab
14
+ {
15
+ /* @var string */
16
+ protected $slug = 'consent';
17
+
18
+ /* @var ConsentManager */
19
+ protected $consentManager;
20
+
21
+ /**
22
+ * AdminTabConsent constructor.
23
+ *
24
+ * @param ConsentManager $consentManager
25
+ */
26
+ public function __construct(ConsentManager $consentManager)
27
+ {
28
+ $this->consentManager = $consentManager;
29
+
30
+ $this->title = _x('Consent', '(Admin)', 'gdpr-framework');
31
+
32
+ // If we don't register the settings, WP will not allow this page to be submitted
33
+ $this->registerSetting('consent_types');
34
+ $this->registerSetting('consent_info');
35
+
36
+ $this->renderErrors();
37
+
38
+ // Register handler for this action
39
+ add_action('gdpr/admin/action/update_consent_data', [$this, 'updateConsentData']);
40
+ }
41
+
42
+ /**
43
+ * Initialize tab contents and register hooks
44
+ */
45
+ public function init()
46
+ {
47
+ $this->registerSettingSection(
48
+ 'gdpr_section_consent',
49
+ _x('Consent', '(Admin)', 'gdpr-framework'),
50
+ [$this, 'renderConsentForm']
51
+ );
52
+ }
53
+
54
+ /**
55
+ * Render the contents of the registered section
56
+ */
57
+ public function renderConsentForm()
58
+ {
59
+ $consentInfo = gdpr('options')->get('consent_info');
60
+
61
+ if (is_null($consentInfo)) {
62
+ $consentInfo = $this->getDefaultConsentInfo();
63
+ } elseif (!$consentInfo) {
64
+ $consentInfo = '';
65
+ }
66
+
67
+ $nonce = wp_create_nonce("gdpr/admin/action/update_consent_data");
68
+ $defaultConsentTypes = $this->consentManager->getDefaultConsentTypes();
69
+ $customConsentTypes = $this->consentManager->getCustomConsentTypes();
70
+
71
+ // todo: move to a filter
72
+ if (defined('ICL_LANGUAGE_CODE')) {
73
+ $prefix = ICL_LANGUAGE_CODE . '_';
74
+ } else {
75
+ $prefix = '';
76
+ }
77
+
78
+ echo gdpr('view')->render('admin/consent', compact('nonce', 'customConsentTypes', 'defaultConsentTypes', 'consentInfo', 'prefix'));
79
+ }
80
+
81
+ /**
82
+ * Save the submitted consent types
83
+ */
84
+ public function updateConsentData()
85
+ {
86
+ // Update additional information
87
+ if (isset($_POST['gdpr_consent_info'])) {
88
+ gdpr('options')->set('consent_info', wp_unslash($_POST['gdpr_consent_info']));
89
+ }
90
+
91
+ // Update consent types
92
+ if (isset($_POST['gdpr_consent_types']) && is_array($_POST['gdpr_consent_types'])) {
93
+ $consentTypes = $_POST['gdpr_consent_types'];
94
+ } else {
95
+ $consentTypes = [];
96
+ }
97
+
98
+ // Strip slashes which WP adds automatically
99
+ if (count($consentTypes)) {
100
+ foreach ($consentTypes as &$type) {
101
+ foreach ($type as $key => $item) {
102
+ if (is_array($item)) {
103
+ $type[$key] = array_map('wp_unslash', $item);
104
+ } else {
105
+ $type[$key] = wp_unslash($item);
106
+ }
107
+
108
+ if ('visible' === $key) {
109
+ $type[$key] = 1;
110
+ }
111
+ }
112
+ }
113
+ }
114
+
115
+ $errors = [];
116
+
117
+ if (!empty($consentTypes)) {
118
+ $errors = $this->validate($consentTypes);
119
+ }
120
+
121
+ if (!count($errors)) {
122
+ $this->consentManager->saveCustomConsentTypes($consentTypes);
123
+ } else {
124
+ $errorQuery = http_build_query($errors);
125
+ wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=consent&') . $errorQuery);
126
+ exit;
127
+ }
128
+ }
129
+
130
+ protected function validate($consentTypes)
131
+ {
132
+ $errors = [];
133
+
134
+ foreach ($consentTypes as $consentType) {
135
+ if (empty($consentType['slug'])) {
136
+ $errors['errors[]'] = 'slug-empty';
137
+ }
138
+
139
+ if (!preg_match('/^[A-Za-z0-9_-]+$/', $consentType['slug'])) {
140
+ $errors['errors[]'] = 'slug-invalid';
141
+ }
142
+
143
+ if (empty($consentType['title'])) {
144
+ $errors['errors[]'] = 'title-empty';
145
+ }
146
+ }
147
+
148
+ return $errors;
149
+ }
150
+
151
+ public function renderErrors()
152
+ {
153
+ if (isset($_GET['errors']) && count($_GET['errors'])) {
154
+
155
+ foreach ($_GET['errors'] as $error) {
156
+ if ('slug-empty' === $error) {
157
+ $message = _x("Consent slug is a required field!", '(Admin)', 'gdpr-framework');
158
+ gdpr('admin-error')->add('admin/notices/error', compact('message'));
159
+ }
160
+
161
+ if ('slug-invalid' === $error) {
162
+ $message = _x("You may only use alphanumeric characters, dash and underscore in the consent slug field.", '(Admin)', 'gdpr-framework');
163
+ gdpr('admin-error')->add('admin/notices/error', compact('message'));
164
+ }
165
+
166
+ if ('title-empty' === $error) {
167
+ $message = _x("Consent title is a required field!", '(Admin)', 'gdpr-framework');
168
+ gdpr('admin-error')->add('admin/notices/error', compact('message'));
169
+ }
170
+ }
171
+ }
172
+ }
173
+
174
+ /**
175
+ * @return string
176
+ */
177
+ public function getDefaultConsentInfo()
178
+ {
179
+ return __('To use this website, you accepted our Privacy Policy. If you wish to withdraw your acceptance, please use the "Delete my data" button below.', 'gdpr-framework');
180
+ }
181
+ }
src/Components/Consent/ConsentManager.php CHANGED
@@ -1,317 +1,317 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\Consent;
4
-
5
- /**
6
- * Handles getting, saving and removing consent based on a whitelist
7
- *
8
- * Class ConsentManager
9
- *
10
- * @package Codelight\GDPR\Components\Consent
11
- */
12
- class ConsentManager
13
- {
14
- /* @var UserConsentModel */
15
- protected $model;
16
-
17
- /* @var array */
18
- protected $defaultConsentTypes = [];
19
-
20
- /* @var array */
21
- protected $customConsentTypes = [];
22
-
23
- /**
24
- * ConsentManager constructor.
25
- *
26
- * @param UserConsentModel $model
27
- */
28
- public function __construct(UserConsentModel $model)
29
- {
30
- $this->model = $model;
31
-
32
- add_action('init', [$this, 'registerCustomConsentTypes'], 0);
33
- add_action('init', [$this, 'registerDefaultConsentTypes'], 0);
34
-
35
- add_action('gdpr/data-subject/delete', [$this, 'delete']);
36
- add_action('gdpr/data-subject/anonymize', [$this, 'anonymize'], 10, 2);
37
- }
38
-
39
- public function registerDefaultConsentTypes()
40
- {
41
- $policyPageUrl = get_permalink(gdpr('options')->get('policy_page'));
42
-
43
- gdpr('consent')->register(
44
- 'privacy-policy',
45
- sprintf(
46
- __('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
47
- "<a href='{$policyPageUrl}' target='_blank'>",
48
- "</a>"
49
- ),
50
- _x('This consent is not visible by default. If someone wishes to withdraw it, they should simply request to delete all their data.', '(Admin)', 'gdpr-framework'),
51
- false
52
- );
53
-
54
- $termsPage = gdpr('options')->get('terms_page');
55
- if ($termsPage) {
56
- $termsPageUrl = get_permalink($termsPage);
57
- } else {
58
- $termsPageUrl = false;
59
- }
60
-
61
- if ($termsPageUrl) {
62
- gdpr('consent')->register(
63
- 'terms-conditions',
64
- sprintf(
65
- __('I accept the %sTerms & Conditions%s', 'gdpr-framework'),
66
- "<a href='{$termsPageUrl}' target='_blank'>",
67
- "</a>"
68
- ),
69
- _x('This consent is not visible by default. If someone wishes to withdraw it, they should simply request to delete all their data.', '(Admin)', 'gdpr-framework'),
70
- false
71
- );
72
- }
73
- }
74
-
75
- /**
76
- * Get a list of all registered consent types
77
- *
78
- * @return array
79
- */
80
- public function getConsentTypes()
81
- {
82
- return apply_filters('gdpr/consent/types', $this->getDefaultConsentTypes() + $this->getCustomConsentTypes());
83
- }
84
-
85
- /**
86
- * Get all consent types registered by external sources, i.e. not stored in the database
87
- *
88
- * @return array
89
- */
90
- public function getDefaultConsentTypes()
91
- {
92
- return apply_filters('gdpr/consent/types/default', $this->defaultConsentTypes);
93
- }
94
-
95
- /**
96
- * Get all consent types registered by the admin, i.e. stored in the database
97
- *
98
- * @return array
99
- */
100
- public function getCustomConsentTypes()
101
- {
102
- return apply_filters('gdpr/consent/types/custom', $this->customConsentTypes);
103
- }
104
-
105
- /**
106
- * Register a *default* consent in the list of valid consents
107
- *
108
- * @param $consent
109
- */
110
- public function register($slug, $title, $description, $visible = true)
111
- {
112
- $this->defaultConsentTypes[$slug] = [
113
- 'slug' => $slug,
114
- 'title' => $title,
115
- 'description' => $description,
116
- 'visible' => $visible,
117
- ];
118
- }
119
-
120
- /**
121
- * Register consent types saved via WP admin
122
- */
123
- public function registerCustomConsentTypes()
124
- {
125
- $savedConsentTypes = gdpr('options')->get('consent_types');
126
-
127
- if (is_array($savedConsentTypes) && count($savedConsentTypes)) {
128
- foreach ($savedConsentTypes as $consentType) {
129
- $this->customConsentTypes[$consentType['slug']] = [
130
- 'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
131
- 'title' => isset($consentType['title']) ? $consentType['title'] : '',
132
- 'description' => isset($consentType['description']) ? $consentType['description'] : '',
133
- 'visible' => isset($consentType['visible']) ? $consentType['visible'] : '',
134
- ];
135
- }
136
- }
137
- }
138
-
139
- /**
140
- * Save the given consent types to database
141
- *
142
- * @param $consentTypes
143
- */
144
- public function saveCustomConsentTypes($consentTypes)
145
- {
146
- // Todo: validate to make sure something broken is not saved to DB
147
- gdpr('options')->set('consent_types', $consentTypes);
148
- }
149
-
150
- /**
151
- * Check if a consent is valid so that we don't write random stuff in the database by accident
152
- *
153
- * @param $consent
154
- * @return bool
155
- */
156
- public function isRegisteredConsent($consent)
157
- {
158
- return isset($this->getConsentTypes()[$consent]);
159
- }
160
-
161
- /**
162
- * Check if the given consent is valid. If not, throw error.
163
- *
164
- * @param $consent
165
- */
166
- protected function validateConsent($consent)
167
- {
168
- if (!$this->isRegisteredConsent($consent)) {
169
- wp_die("Not a valid consent: " . esc_html($consent));
170
- }
171
- }
172
-
173
- /**
174
- * Set a consent as 'given' for the data subject
175
- *
176
- * @param $email
177
- * @param $consent
178
- */
179
- public function giveConsent($email, $consent)
180
- {
181
- $this->validateConsent($consent);
182
-
183
- $validation = apply_filters('gdpr/consent/give', true, $email, $consent);
184
-
185
- // If the data subject has already given this consent, do nothing
186
- if ($this->model->given($email, $consent) || !$validation) {
187
- return;
188
- }
189
-
190
- $this->model->give($email, $consent);
191
- do_action('gdpr/consent/given', $email, $consent);
192
- }
193
-
194
- /**
195
- * Set a consent as withdrawn for the data subject
196
- *
197
- * @param $email
198
- * @param $consent
199
- */
200
- public function withdrawConsent($email, $consent)
201
- {
202
- $this->validateConsent($consent);
203
-
204
- $validation = apply_filters('gdpr/consent/withdraw', true, $email, $consent);
205
-
206
- // If the consent has never been given or if data subject has already withdrawn this consent, do nothing
207
- if (!$this->model->exists($email, $consent) || $this->model->withdrawn($email, $consent) || !$validation) {
208
- return;
209
- }
210
-
211
- $this->model->withdraw($email, $consent);
212
- do_action('gdpr/consent/withdrawn', $email, $consent, 'withdrawn');
213
- }
214
-
215
- /**
216
- * Remove consent given by subject
217
- *
218
- * @param $email
219
- * @param $consent
220
- */
221
- public function deleteConsent($email, $consent)
222
- {
223
- $this->validateConsent($consent);
224
-
225
- if ($this->model->given($email, $consent)) {
226
- do_action('gdpr/consent/withdrawn', $email, $consent, 'deleted');
227
- }
228
-
229
- $this->model->delete($email, $consent);
230
- }
231
-
232
- /**
233
- * Withdraw and anonymize a consent
234
- *
235
- * @param $email
236
- * @param $consent
237
- * @param $anonymizedId
238
- */
239
- public function anonymizeConsent($email, $consent, $anonymizedId)
240
- {
241
- $this->validateConsent($consent);
242
-
243
- if ($this->model->given($email, $consent)) {
244
- do_action('gdpr/consent/withdrawn', $email, $consent, 'anonymized');
245
- }
246
-
247
- $this->model->anonymize($email, $consent, $anonymizedId);
248
- }
249
-
250
- /**
251
- * Get all consent given by subject
252
- *
253
- * @param $email
254
- */
255
- public function getAllConsents($email)
256
- {
257
- return $this->model->getAll($email);
258
- }
259
-
260
- /**
261
- * Get the registered consent types and add 'given' field depending
262
- * on whether or not the user has given this particular consent
263
- *
264
- * @param $dataSubjectConsents
265
- * @return array
266
- */
267
- public function getConsentData($dataSubjectConsents)
268
- {
269
- $consentTypes = $this->getConsentTypes();
270
- $consents = [];
271
-
272
- foreach ($consentTypes as $slug => $consentType) {
273
- if (in_array($slug, $dataSubjectConsents)) {
274
- $consents[$slug] = $consentType;
275
- }
276
- }
277
-
278
- return $consents;
279
- }
280
-
281
- /**
282
- * Return a list of all data subjects who have given a particular consent
283
- *
284
- * @param $consent
285
- */
286
- public function getAllDataSubjectsByConsent($consent)
287
- {
288
- // Todo
289
- }
290
-
291
- /**
292
- * Withdraw and delete all consents given by a data subject
293
- *
294
- * @param $email
295
- */
296
- public function delete($email)
297
- {
298
- $consents = $this->getAllConsents($email);
299
- foreach ($consents as $consent) {
300
- $this->deleteConsent($email, $consent);
301
- }
302
- }
303
-
304
- /**
305
- * Withdraw and anonymize all consents given by a data subject
306
- *
307
- * @param $email
308
- * @param $anonymizedId
309
- */
310
- public function anonymize($email, $anonymizedId)
311
- {
312
- $consents = $this->getAllConsents($email);
313
- foreach ($consents as $consent) {
314
- $this->anonymizeConsent($email, $consent, $anonymizedId);
315
- }
316
- }
317
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\Consent;
4
+
5
+ /**
6
+ * Handles getting, saving and removing consent based on a whitelist
7
+ *
8
+ * Class ConsentManager
9
+ *
10
+ * @package Codelight\GDPR\Components\Consent
11
+ */
12
+ class ConsentManager
13
+ {
14
+ /* @var UserConsentModel */
15
+ protected $model;
16
+
17
+ /* @var array */
18
+ protected $defaultConsentTypes = [];
19
+
20
+ /* @var array */
21
+ protected $customConsentTypes = [];
22
+
23
+ /**
24
+ * ConsentManager constructor.
25
+ *
26
+ * @param UserConsentModel $model
27
+ */
28
+ public function __construct(UserConsentModel $model)
29
+ {
30
+ $this->model = $model;
31
+
32
+ add_action('init', [$this, 'registerCustomConsentTypes'], 0);
33
+ add_action('init', [$this, 'registerDefaultConsentTypes'], 0);
34
+
35
+ add_action('gdpr/data-subject/delete', [$this, 'delete']);
36
+ add_action('gdpr/data-subject/anonymize', [$this, 'anonymize'], 10, 2);
37
+ }
38
+
39
+ public function registerDefaultConsentTypes()
40
+ {
41
+ $policyPageUrl = get_permalink(gdpr('options')->get('policy_page'));
42
+
43
+ gdpr('consent')->register(
44
+ 'privacy-policy',
45
+ sprintf(
46
+ __('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
47
+ "<a href='{$policyPageUrl}' target='_blank'>",
48
+ "</a>"
49
+ ),
50
+ _x('This consent is not visible by default. If someone wishes to withdraw it, they should simply request to delete all their data.', '(Admin)', 'gdpr-framework'),
51
+ false
52
+ );
53
+
54
+ $termsPage = gdpr('options')->get('terms_page');
55
+ if ($termsPage) {
56
+ $termsPageUrl = get_permalink($termsPage);
57
+ } else {
58
+ $termsPageUrl = false;
59
+ }
60
+
61
+ if ($termsPageUrl) {
62
+ gdpr('consent')->register(
63
+ 'terms-conditions',
64
+ sprintf(
65
+ __('I accept the %sTerms & Conditions%s', 'gdpr-framework'),
66
+ "<a href='{$termsPageUrl}' target='_blank'>",
67
+ "</a>"
68
+ ),
69
+ _x('This consent is not visible by default. If someone wishes to withdraw it, they should simply request to delete all their data.', '(Admin)', 'gdpr-framework'),
70
+ false
71
+ );
72
+ }
73
+ }
74
+
75
+ /**
76
+ * Get a list of all registered consent types
77
+ *
78
+ * @return array
79
+ */
80
+ public function getConsentTypes()
81
+ {
82
+ return apply_filters('gdpr/consent/types', $this->getDefaultConsentTypes() + $this->getCustomConsentTypes());
83
+ }
84
+
85
+ /**
86
+ * Get all consent types registered by external sources, i.e. not stored in the database
87
+ *
88
+ * @return array
89
+ */
90
+ public function getDefaultConsentTypes()
91
+ {
92
+ return apply_filters('gdpr/consent/types/default', $this->defaultConsentTypes);
93
+ }
94
+
95
+ /**
96
+ * Get all consent types registered by the admin, i.e. stored in the database
97
+ *
98
+ * @return array
99
+ */
100
+ public function getCustomConsentTypes()
101
+ {
102
+ return apply_filters('gdpr/consent/types/custom', $this->customConsentTypes);
103
+ }
104
+
105
+ /**
106
+ * Register a *default* consent in the list of valid consents
107
+ *
108
+ * @param $consent
109
+ */
110
+ public function register($slug, $title, $description, $visible = true)
111
+ {
112
+ $this->defaultConsentTypes[$slug] = [
113
+ 'slug' => $slug,
114
+ 'title' => $title,
115
+ 'description' => $description,
116
+ 'visible' => $visible,
117
+ ];
118
+ }
119
+
120
+ /**
121
+ * Register consent types saved via WP admin
122
+ */
123
+ public function registerCustomConsentTypes()
124
+ {
125
+ $savedConsentTypes = gdpr('options')->get('consent_types');
126
+
127
+ if (is_array($savedConsentTypes) && count($savedConsentTypes)) {
128
+ foreach ($savedConsentTypes as $consentType) {
129
+ $this->customConsentTypes[$consentType['slug']] = [
130
+ 'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
131
+ 'title' => isset($consentType['title']) ? $consentType['title'] : '',
132
+ 'description' => isset($consentType['description']) ? $consentType['description'] : '',
133
+ 'visible' => isset($consentType['visible']) ? $consentType['visible'] : '',
134
+ ];
135
+ }
136
+ }
137
+ }
138
+
139
+ /**
140
+ * Save the given consent types to database
141
+ *
142
+ * @param $consentTypes
143
+ */
144
+ public function saveCustomConsentTypes($consentTypes)
145
+ {
146
+ // Todo: validate to make sure something broken is not saved to DB
147
+ gdpr('options')->set('consent_types', $consentTypes);
148
+ }
149
+
150
+ /**
151
+ * Check if a consent is valid so that we don't write random stuff in the database by accident
152
+ *
153
+ * @param $consent
154
+ * @return bool
155
+ */
156
+ public function isRegisteredConsent($consent)
157
+ {
158
+ return isset($this->getConsentTypes()[$consent]);
159
+ }
160
+
161
+ /**
162
+ * Check if the given consent is valid. If not, throw error.
163
+ *
164
+ * @param $consent
165
+ */
166
+ protected function validateConsent($consent)
167
+ {
168
+ if (!$this->isRegisteredConsent($consent)) {
169
+ wp_die("Not a valid consent: " . esc_html($consent));
170
+ }
171
+ }
172
+
173
+ /**
174
+ * Set a consent as 'given' for the data subject
175
+ *
176
+ * @param $email
177
+ * @param $consent
178
+ */
179
+ public function giveConsent($email, $consent)
180
+ {
181
+ $this->validateConsent($consent);
182
+
183
+ $validation = apply_filters('gdpr/consent/give', true, $email, $consent);
184
+
185
+ // If the data subject has already given this consent, do nothing
186
+ if ($this->model->given($email, $consent) || !$validation) {
187
+ return;
188
+ }
189
+
190
+ $this->model->give($email, $consent);
191
+ do_action('gdpr/consent/given', $email, $consent);
192
+ }
193
+
194
+ /**
195
+ * Set a consent as withdrawn for the data subject
196
+ *
197
+ * @param $email
198
+ * @param $consent
199
+ */
200
+ public function withdrawConsent($email, $consent)
201
+ {
202
+ $this->validateConsent($consent);
203
+
204
+ $validation = apply_filters('gdpr/consent/withdraw', true, $email, $consent);
205
+
206
+ // If the consent has never been given or if data subject has already withdrawn this consent, do nothing
207
+ if (!$this->model->exists($email, $consent) || $this->model->withdrawn($email, $consent) || !$validation) {
208
+ return;
209
+ }
210
+
211
+ $this->model->withdraw($email, $consent);
212
+ do_action('gdpr/consent/withdrawn', $email, $consent, 'withdrawn');
213
+ }
214
+
215
+ /**
216
+ * Remove consent given by subject
217
+ *
218
+ * @param $email
219
+ * @param $consent
220
+ */
221
+ public function deleteConsent($email, $consent)
222
+ {
223
+ $this->validateConsent($consent);
224
+
225
+ if ($this->model->given($email, $consent)) {
226
+ do_action('gdpr/consent/withdrawn', $email, $consent, 'deleted');
227
+ }
228
+
229
+ $this->model->delete($email, $consent);
230
+ }
231
+
232
+ /**
233
+ * Withdraw and anonymize a consent
234
+ *
235
+ * @param $email
236
+ * @param $consent
237
+ * @param $anonymizedId
238
+ */
239
+ public function anonymizeConsent($email, $consent, $anonymizedId)
240
+ {
241
+ $this->validateConsent($consent);
242
+
243
+ if ($this->model->given($email, $consent)) {
244
+ do_action('gdpr/consent/withdrawn', $email, $consent, 'anonymized');
245
+ }
246
+
247
+ $this->model->anonymize($email, $consent, $anonymizedId);
248
+ }
249
+
250
+ /**
251
+ * Get all consent given by subject
252
+ *
253
+ * @param $email
254
+ */
255
+ public function getAllConsents($email)
256
+ {
257
+ return $this->model->getAll($email);
258
+ }
259
+
260
+ /**
261
+ * Get the registered consent types and add 'given' field depending
262
+ * on whether or not the user has given this particular consent
263
+ *
264
+ * @param $dataSubjectConsents
265
+ * @return array
266
+ */
267
+ public function getConsentData($dataSubjectConsents)
268
+ {
269
+ $consentTypes = $this->getConsentTypes();
270
+ $consents = [];
271
+
272
+ foreach ($consentTypes as $slug => $consentType) {
273
+ if (in_array($slug, $dataSubjectConsents)) {
274
+ $consents[$slug] = $consentType;
275
+ }
276
+ }
277
+
278
+ return $consents;
279
+ }
280
+
281
+ /**
282
+ * Return a list of all data subjects who have given a particular consent
283
+ *
284
+ * @param $consent
285
+ */
286
+ public function getAllDataSubjectsByConsent($consent)
287
+ {
288
+ // Todo
289
+ }
290
+
291
+ /**
292
+ * Withdraw and delete all consents given by a data subject
293
+ *
294
+ * @param $email
295
+ */
296
+ public function delete($email)
297
+ {
298
+ $consents = $this->getAllConsents($email);
299
+ foreach ($consents as $consent) {
300
+ $this->deleteConsent($email, $consent);
301
+ }
302
+ }
303
+
304
+ /**
305
+ * Withdraw and anonymize all consents given by a data subject
306
+ *
307
+ * @param $email
308
+ * @param $anonymizedId
309
+ */
310
+ public function anonymize($email, $anonymizedId)
311
+ {
312
+ $consents = $this->getAllConsents($email);
313
+ foreach ($consents as $consent) {
314
+ $this->anonymizeConsent($email, $consent, $anonymizedId);
315
+ }
316
+ }
317
+ }
src/Components/PrivacyPolicy/AdminTabPrivacyPolicy.php CHANGED
@@ -1,436 +1,436 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\PrivacyPolicy;
4
-
5
- use Codelight\GDPR\Admin\AdminTab;
6
-
7
- class AdminTabPrivacyPolicy extends AdminTab
8
- {
9
- /* @var string */
10
- protected $slug = 'privacy-policy';
11
-
12
- /* @var PolicyGenerator */
13
- protected $policyGenerator;
14
-
15
- public function __construct(PolicyGenerator $policyGenerator)
16
- {
17
- $this->policyGenerator = $policyGenerator;
18
-
19
- $this->title = _x('Privacy Policy', '(Admin)', 'gdpr-framework');
20
-
21
- $this->registerSetting('gdpr_company_name');
22
- $this->registerSetting('gdpr_contact_email');
23
- $this->registerSetting('gdpr_company_location');
24
-
25
- $this->registerSetting('gdpr_representative_contact_name');
26
- $this->registerSetting('gdpr_representative_contact_email');
27
- $this->registerSetting('gdpr_representative_contact_phone');
28
-
29
- $this->registerSetting('gdpr_dpa_website');
30
- $this->registerSetting('gdpr_dpa_email');
31
- $this->registerSetting('gdpr_dpa_phone');
32
-
33
- $this->registerSetting('gdpr_has_dpo');
34
- $this->registerSetting('gdpr_dpo_name');
35
- $this->registerSetting('gdpr_dpo_email');
36
-
37
- /*
38
- $this->registerSetting('gdpr_pp_data_gathered_1');
39
- $this->registerSetting('gdpr_pp_data_gathered_2');
40
- $this->registerSetting('gdpr_pp_data_gathered_3');
41
- $this->registerSetting('gdpr_pp_data_gathered_4');
42
-
43
- $this->registerSetting('gdpr_pp_data_usage_1');
44
- $this->registerSetting('gdpr_pp_data_usage_2');
45
- $this->registerSetting('gdpr_pp_data_usage_3');
46
- $this->registerSetting('gdpr_pp_data_usage_4');
47
-
48
- $this->registerSetting('gdpr_pp_data_partners');
49
- */
50
-
51
- add_action('gdpr/admin/action/privacy-policy/generate', [$this, 'generatePolicy']);
52
- }
53
-
54
- public function init()
55
- {
56
- /**
57
- * General settings
58
- */
59
- $this->registerSettingSection(
60
- 'gdpr_section_privacy_policy',
61
- _x('Privacy Policy', '(Admin)', 'gdpr-framework'),
62
- [$this, 'renderHeader']
63
- );
64
-
65
- /**
66
- * Company info
67
- */
68
- $this->registerSettingSection(
69
- 'gdpr_section_privacy_policy_company',
70
- _x('Company information', '(Admin)', 'gdpr-framework')
71
- );
72
-
73
- $this->registerSettingField(
74
- 'gdpr_company_name',
75
- _x('Company Name', '(Admin)', 'gdpr-framework'),
76
- [$this, 'renderCompanyNameHtml'],
77
- 'gdpr_section_privacy_policy_company'
78
- );
79
-
80
- $this->registerSettingField(
81
- 'gdpr_company_email',
82
- _x('Company Email', '(Admin)', 'gdpr-framework'),
83
- [$this, 'renderCompanyEmailHtml'],
84
- 'gdpr_section_privacy_policy_company'
85
- );
86
-
87
- $this->registerSettingField(
88
- 'gdpr_company_location',
89
- _x('Company Location', '(Admin)', 'gdpr-framework'),
90
- [$this, 'renderCompanyLocationHtml'],
91
- 'gdpr_section_privacy_policy_company'
92
- );
93
-
94
- /**
95
- * Representative
96
- */
97
- $this->registerSettingSection(
98
- 'gdpr_section_privacy_policy_representative',
99
- false,
100
- [$this, 'renderRepresentativeOpen']
101
- );
102
-
103
- $this->registerSettingField(
104
- 'gdpr_representative_contact_name',
105
- _x('Representative Contact Name', '(Admin)', 'gdpr-framework'),
106
- [$this, 'renderRepresentativeContactName'],
107
- 'gdpr_section_privacy_policy_representative'
108
- );
109
-
110
- $this->registerSettingField(
111
- 'gdpr_representative_contact_email',
112
- _x('Representative Contact Email', '(Admin)', 'gdpr-framework'),
113
- [$this, 'renderRepresentativeContactEmail'],
114
- 'gdpr_section_privacy_policy_representative'
115
- );
116
-
117
- $this->registerSettingField(
118
- 'gdpr_representative_contact_phone',
119
- _x('Representative Contact Phone', '(Admin)', 'gdpr-framework'),
120
- [$this, 'renderRepresentativeContactPhone'],
121
- 'gdpr_section_privacy_policy_representative'
122
- );
123
-
124
- $this->registerSettingSection(
125
- 'gdpr_section_privacy_policy_representative_close',
126
- false,
127
- [$this, 'renderRepresentativeClose']
128
- );
129
-
130
- /**
131
- * DPA
132
- */
133
- $this->registerSettingSection(
134
- 'gdpr_section_privacy_policy_dpa',
135
- _x('Data Protection Authority', '(Admin)', 'gdpr-framework'),
136
- [$this, 'renderDpaJS']
137
- );
138
-
139
- $this->registerSettingField(
140
- 'gdpr_dpa_website',
141
- _x('Data Protection Authority Website', '(Admin)', 'gdpr-framework'),
142
- [$this, 'renderDpaWebsite'],
143
- 'gdpr_section_privacy_policy_dpa'
144
- );
145
-
146
- $this->registerSettingField(
147
- 'gdpr_dpa_email',
148
- _x('Data Protection Authority Email', '(Admin)', 'gdpr-framework'),
149
- [$this, 'renderDpaEmail'],
150
- 'gdpr_section_privacy_policy_dpa'
151
- );
152
-
153
- $this->registerSettingField(
154
- 'gdpr_dpa_phone',
155
- _x('Data Protection Authority Phone', '(Admin)', 'gdpr-framework'),
156
- [$this, 'renderDpaPhone'],
157
- 'gdpr_section_privacy_policy_dpa'
158
- );
159
-
160
- /**
161
- * DPO
162
- */
163
- $this->registerSettingSection(
164
- 'gdpr_section_privacy_policy_dpo',
165
- _x('Data Protection Officer', '(Admin)', 'gdpr-framework'),
166
- function() {
167
- echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-data-protection-officer-dpo/' target='_blank'>";
168
- echo _x('Knowledge base: Do I need to appoint a Data Protection Officer?', '(Admin)', 'gdpr-framework');
169
- echo "</a>";
170
- }
171
- );
172
-
173
- $this->registerSettingField(
174
- 'gdpr_has_dpo',
175
- _x('Data Protection Officer', '(Admin)', 'gdpr-framework'),
176
- [$this, 'renderHasDPOHtml'],
177
- 'gdpr_section_privacy_policy_dpo'
178
- );
179
-
180
- $this->registerSettingField(
181
- 'gdpr_dpo_name',
182
- _x('Data Protection Officer Name', '(Admin)', 'gdpr-framework'),
183
- [$this, 'renderDPONameHtml'],
184
- 'gdpr_section_privacy_policy_dpo',
185
- ['class' => 'gdpr-dpo hidden']
186
- );
187
-
188
- $this->registerSettingField(
189
- 'gdpr_dpo_email',
190
- _x('Data Protection Officer Email', '(Admin)', 'gdpr-framework'),
191
- [$this, 'renderDPOEmailHtml'],
192
- 'gdpr_section_privacy_policy_dpo',
193
- ['class' => 'gdpr-dpo hidden']
194
- );
195
- }
196
-
197
- public function renderHeader()
198
- {
199
- echo gdpr('view')->render('admin/privacy-policy/header');
200
- }
201
-
202
- /**
203
- * Company info
204
- */
205
-
206
- public function renderCompanyNameHtml()
207
- {
208
- $value = gdpr('options')->get('company_name') ? esc_attr(gdpr('options')->get('company_name')) : '';
209
- $placeholder = _x('Company Name', '(Admin)', 'gdpr-framework');
210
- echo "<input name='gdpr_company_name' placeholder='{$placeholder}' value='{$value}'>";
211
- }
212
-
213
- public function renderCompanyEmailHtml()
214
- {
215
- $value = gdpr('options')->get('contact_email') ? esc_attr(gdpr('options')->get('contact_email')) : '';
216
- $placeholder = _x('Contact Email', '(Admin)', 'gdpr-framework');
217
- echo "<input type='email' name='gdpr_contact_email' placeholder='{$placeholder}' value='{$value}'>";
218
- }
219
-
220
- public function renderCompanyLocationHtml()
221
- {
222
- $country = gdpr('options')->get('company_location') ? gdpr('options')->get('company_location') : '';
223
- $countrySelectOptions = gdpr('helpers')->getCountrySelectOptions($country);
224
- echo gdpr('view')->render('admin/privacy-policy/company-location', compact('countrySelectOptions'));
225
- }
226
-
227
- /**
228
- * Representative contact
229
- */
230
-
231
- public function renderRepresentativeOpen()
232
- {
233
- echo "<span class='gdpr-representative hidden'>";
234
- echo "<h3>";
235
- echo _x('Representative Contact', '(Admin)', 'gdpr-framework');
236
- echo "</h3>";
237
- echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-an-eu-based-representative/' target='_blank'>";
238
- echo _x('Knowledge base: Do I need to appoint an EU-based representative?', '(Admin)', 'gdpr-framework');
239
- echo "</a>";
240
- }
241
-
242
- public function renderRepresentativeContactName()
243
- {
244
- $value = gdpr('options')->get('representative_contact_name') ? esc_attr(gdpr('options')->get('representative_contact_name')) : '';
245
- $placeholder = _x('Representative Contact Name', '(Admin)', 'gdpr-framework');
246
- echo "<input name='gdpr_representative_contact_name' placeholder='{$placeholder}' value='{$value}'>";
247
- }
248
-
249
- public function renderRepresentativeContactEmail()
250
- {
251
- $value = gdpr('options')->get('representative_contact_email') ? esc_attr(gdpr('options')->get('representative_contact_email')) : '';
252
- $placeholder = _x('Representative Contact Email', '(Admin)', 'gdpr-framework');
253
- echo "<input type='email' name='gdpr_representative_contact_email' placeholder='{$placeholder}' value='{$value}'>";
254
- }
255
-
256
- public function renderRepresentativeContactPhone()
257
- {
258
- $value = gdpr('options')->get('representative_contact_phone') ? esc_attr(gdpr('options')->get('representative_contact_phone')) : '';
259
- $placeholder = _x('Representative Contact Phone', '(Admin)', 'gdpr-framework');
260
- echo "<input name='gdpr_representative_contact_phone' placeholder='{$placeholder}' value='{$value}'>";
261
- }
262
-
263
- public function renderRepresentativeClose()
264
- {
265
- echo "</span>";
266
- }
267
-
268
- /**
269
- * Data Protection Authority
270
- */
271
- public function renderDpaJS()
272
- {
273
- echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-an-eu-based-representative/' target='_blank'>";
274
- echo 'See the <a href="http://ec.europa.eu/justice/data-protection/article-29/structure/data-protection-authorities/index_en.htm" target="_blank">list of contacts here</a>';
275
- echo "</a>";
276
-
277
-
278
-
279
- $dpaData = json_encode(gdpr('helpers')->getDataProtectionAuthorities());
280
- echo gdpr('view')->render('admin/privacy-policy/dpa', compact('dpaData'));
281
- }
282
-
283
- public function renderDpaWebsite()
284
- {
285
- $value = gdpr('options')->get('dpa_website') ? esc_attr(gdpr('options')->get('dpa_website')) : '';
286
- $placeholder = _x('Data Protection Authority Website', '(Admin)', 'gdpr-framework');
287
- echo "<input name='gdpr_dpa_website' id='gdpr_dpa_website' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
288
- }
289
-
290
- public function renderDpaEmail()
291
- {
292
- $value = gdpr('options')->get('dpa_email') ? esc_attr(gdpr('options')->get('dpa_email')) : '';
293
- $placeholder = _x('Data Protection Authority Email', '(Admin)', 'gdpr-framework');
294
- echo "<input type='email' name='gdpr_dpa_email' id='gdpr_dpa_email' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
295
- }
296
-
297
- public function renderDpaPhone()
298
- {
299
- $value = gdpr('options')->get('dpa_phone') ? esc_attr(gdpr('options')->get('dpa_phone')) : '';
300
- $placeholder = _x('Data Protection Authority Phone', '(Admin)', 'gdpr-framework');
301
- echo "<input name='gdpr_dpa_phone' id='gdpr_dpa_phone' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
302
- }
303
-
304
- /**
305
- * Data Protection Officer
306
- */
307
-
308
- public function renderHasDPOHtml()
309
- {
310
- $hasDPO = gdpr('options')->get('has_dpo');
311
- echo gdpr('view')->render('admin/privacy-policy/has-dpo', compact('hasDPO'));
312
- }
313
-
314
- public function renderDPONameHtml()
315
- {
316
- $value = gdpr('options')->get('dpo_name') ? esc_attr(gdpr('options')->get('dpo_name')) : '';
317
- $placeholder = _x('DPO Name', '(Admin)', 'gdpr-framework');
318
- echo "<input name='gdpr_dpo_name' placeholder='{$placeholder}' value='{$value}'>";
319
- }
320
-
321
- public function renderDPOEmailHtml()
322
- {
323
- $value = gdpr('options')->get('dpo_email') ? esc_attr(gdpr('options')->get('dpo_email')) : '';
324
- $placeholder = _x('DPO Name', '(Admin)', 'gdpr-framework');
325
- echo "<input type='email' name='gdpr_dpo_email' placeholder='{$placeholder}' value='{$value}'>";
326
- }
327
-
328
-
329
- public function generatePolicy()
330
- {
331
- $policyPage = gdpr('options')->get('policy_page');
332
-
333
- // todo: handle errors
334
- if ( ! $policyPage) {
335
- return;
336
- }
337
-
338
- $policy = gdpr('view')->render(
339
- 'policy/policy'
340
- );
341
-
342
- wp_update_post([
343
- 'ID' => $policyPage,
344
- 'post_content' => $policy,
345
- ]);
346
-
347
- wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy&gdpr_notice=policy_generated'));
348
- }
349
-
350
- /**
351
- * Render either the settings or the generated policy
352
- */
353
- public function renderContents()
354
- {
355
- if (isset($_GET['generate']) && 'yes' == $_GET['generate']) {
356
- return $this->renderPolicy();
357
- } else {
358
- return $this->renderSettings();
359
- }
360
- }
361
-
362
- /**
363
- * Render the contents including settings fields, sections and submit button.
364
- * Trigger hooks for rendering content before and after the settings fields.
365
- *
366
- * @return string
367
- */
368
- public function renderSettings()
369
- {
370
- ob_start();
371
-
372
- do_action("gdpr/tabs/{$this->getSlug()}/before", $this);
373
- $this->settingsFields($this->getOptionsGroupName());
374
- do_settings_sections($this->getOptionsGroupName());
375
- do_action("gdpr/tabs/{$this->getSlug()}/after", $this);
376
-
377
- $this->renderSubmitButton();
378
-
379
- return ob_get_clean();
380
- }
381
-
382
- public function renderPolicy()
383
- {
384
- $policyPageId = gdpr('options')->get('policy_page');
385
- if ($policyPageId) {
386
- $policyUrl = get_edit_post_link($policyPageId);
387
- } else {
388
- $policyUrl = false;
389
- }
390
-
391
- $editor = $this->getPolicyEditor();
392
- $backUrl = gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy');
393
-
394
- return gdpr('view')->render('admin/privacy-policy/generated', compact('editor', 'policyUrl', 'backUrl'));
395
- }
396
-
397
- protected function getPolicyEditor()
398
- {
399
- ob_start();
400
-
401
- wp_editor(
402
- wp_kses_post($this->policyGenerator->generate()),
403
- 'gdpr_policy',
404
- [
405
- 'media_buttons' => false,
406
- 'editor_height' => 600,
407
- 'teeny' => true,
408
- 'editor_css' => '<style>#mceu_16 { display: none; }</style>'
409
- ]
410
- );
411
-
412
- return ob_get_clean();
413
- }
414
-
415
- /**
416
- * Render WP's default submit button
417
- */
418
- public function renderSubmitButton()
419
- {
420
- submit_button(_x('Save & Generate Policy', '(Admin)', 'gdpr-framework'));
421
- }
422
-
423
- /**
424
- * In order to set up a proper redirect to the generated policy
425
- * after saving settings, we modify the way wp_nonce_field is called and insert our own referer input.
426
- *
427
- * @param $optionGroup
428
- */
429
- public function settingsFields($optionGroup)
430
- {
431
- echo "<input type='hidden' name='option_page' value='" . esc_attr($optionGroup) . "' />";
432
- echo '<input type="hidden" name="action" value="update" />';
433
- wp_nonce_field("$optionGroup-options", '_wpnonce', false);
434
- echo '<input type="hidden" name="_wp_http_referer" value="'. esc_attr( wp_unslash( $_SERVER['REQUEST_URI'] ) . '&generate=yes' ) . '" />';
435
- }
436
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\PrivacyPolicy;
4
+
5
+ use Codelight\GDPR\Admin\AdminTab;
6
+
7
+ class AdminTabPrivacyPolicy extends AdminTab
8
+ {
9
+ /* @var string */
10
+ protected $slug = 'privacy-policy';
11
+
12
+ /* @var PolicyGenerator */
13
+ protected $policyGenerator;
14
+
15
+ public function __construct(PolicyGenerator $policyGenerator)
16
+ {
17
+ $this->policyGenerator = $policyGenerator;
18
+
19
+ $this->title = _x('Privacy Policy', '(Admin)', 'gdpr-framework');
20
+
21
+ $this->registerSetting('gdpr_company_name');
22
+ $this->registerSetting('gdpr_contact_email');
23
+ $this->registerSetting('gdpr_company_location');
24
+
25
+ $this->registerSetting('gdpr_representative_contact_name');
26
+ $this->registerSetting('gdpr_representative_contact_email');
27
+ $this->registerSetting('gdpr_representative_contact_phone');
28
+
29
+ $this->registerSetting('gdpr_dpa_website');
30
+ $this->registerSetting('gdpr_dpa_email');
31
+ $this->registerSetting('gdpr_dpa_phone');
32
+
33
+ $this->registerSetting('gdpr_has_dpo');
34
+ $this->registerSetting('gdpr_dpo_name');
35
+ $this->registerSetting('gdpr_dpo_email');
36
+
37
+ /*
38
+ $this->registerSetting('gdpr_pp_data_gathered_1');
39
+ $this->registerSetting('gdpr_pp_data_gathered_2');
40
+ $this->registerSetting('gdpr_pp_data_gathered_3');
41
+ $this->registerSetting('gdpr_pp_data_gathered_4');
42
+
43
+ $this->registerSetting('gdpr_pp_data_usage_1');
44
+ $this->registerSetting('gdpr_pp_data_usage_2');
45
+ $this->registerSetting('gdpr_pp_data_usage_3');
46
+ $this->registerSetting('gdpr_pp_data_usage_4');
47
+
48
+ $this->registerSetting('gdpr_pp_data_partners');
49
+ */
50
+
51
+ add_action('gdpr/admin/action/privacy-policy/generate', [$this, 'generatePolicy']);
52
+ }
53
+
54
+ public function init()
55
+ {
56
+ /**
57
+ * General settings
58
+ */
59
+ $this->registerSettingSection(
60
+ 'gdpr_section_privacy_policy',
61
+ _x('Privacy Policy', '(Admin)', 'gdpr-framework'),
62
+ [$this, 'renderHeader']
63
+ );
64
+
65
+ /**
66
+ * Company info
67
+ */
68
+ $this->registerSettingSection(
69
+ 'gdpr_section_privacy_policy_company',
70
+ _x('Company information', '(Admin)', 'gdpr-framework')
71
+ );
72
+
73
+ $this->registerSettingField(
74
+ 'gdpr_company_name',
75
+ _x('Company Name', '(Admin)', 'gdpr-framework'),
76
+ [$this, 'renderCompanyNameHtml'],
77
+ 'gdpr_section_privacy_policy_company'
78
+ );
79
+
80
+ $this->registerSettingField(
81
+ 'gdpr_company_email',
82
+ _x('Company Email', '(Admin)', 'gdpr-framework'),
83
+ [$this, 'renderCompanyEmailHtml'],
84
+ 'gdpr_section_privacy_policy_company'
85
+ );
86
+
87
+ $this->registerSettingField(
88
+ 'gdpr_company_location',
89
+ _x('Company Location', '(Admin)', 'gdpr-framework'),
90
+ [$this, 'renderCompanyLocationHtml'],
91
+ 'gdpr_section_privacy_policy_company'
92
+ );
93
+
94
+ /**
95
+ * Representative
96
+ */
97
+ $this->registerSettingSection(
98
+ 'gdpr_section_privacy_policy_representative',
99
+ false,
100
+ [$this, 'renderRepresentativeOpen']
101
+ );
102
+
103
+ $this->registerSettingField(
104
+ 'gdpr_representative_contact_name',
105
+ _x('Representative Contact Name', '(Admin)', 'gdpr-framework'),
106
+ [$this, 'renderRepresentativeContactName'],
107
+ 'gdpr_section_privacy_policy_representative'
108
+ );
109
+
110
+ $this->registerSettingField(
111
+ 'gdpr_representative_contact_email',
112
+ _x('Representative Contact Email', '(Admin)', 'gdpr-framework'),
113
+ [$this, 'renderRepresentativeContactEmail'],
114
+ 'gdpr_section_privacy_policy_representative'
115
+ );
116
+
117
+ $this->registerSettingField(
118
+ 'gdpr_representative_contact_phone',
119
+ _x('Representative Contact Phone', '(Admin)', 'gdpr-framework'),
120
+ [$this, 'renderRepresentativeContactPhone'],
121
+ 'gdpr_section_privacy_policy_representative'
122
+ );
123
+
124
+ $this->registerSettingSection(
125
+ 'gdpr_section_privacy_policy_representative_close',
126
+ false,
127
+ [$this, 'renderRepresentativeClose']
128
+ );
129
+
130
+ /**
131
+ * DPA
132
+ */
133
+ $this->registerSettingSection(
134
+ 'gdpr_section_privacy_policy_dpa',
135
+ _x('Data Protection Authority', '(Admin)', 'gdpr-framework'),
136
+ [$this, 'renderDpaJS']
137
+ );
138
+
139
+ $this->registerSettingField(
140
+ 'gdpr_dpa_website',
141
+ _x('Data Protection Authority Website', '(Admin)', 'gdpr-framework'),
142
+ [$this, 'renderDpaWebsite'],
143
+ 'gdpr_section_privacy_policy_dpa'
144
+ );
145
+
146
+ $this->registerSettingField(
147
+ 'gdpr_dpa_email',
148
+ _x('Data Protection Authority Email', '(Admin)', 'gdpr-framework'),
149
+ [$this, 'renderDpaEmail'],
150
+ 'gdpr_section_privacy_policy_dpa'
151
+ );
152
+
153
+ $this->registerSettingField(
154
+ 'gdpr_dpa_phone',
155
+ _x('Data Protection Authority Phone', '(Admin)', 'gdpr-framework'),
156
+ [$this, 'renderDpaPhone'],
157
+ 'gdpr_section_privacy_policy_dpa'
158
+ );
159
+
160
+ /**
161
+ * DPO
162
+ */
163
+ $this->registerSettingSection(
164
+ 'gdpr_section_privacy_policy_dpo',
165
+ _x('Data Protection Officer', '(Admin)', 'gdpr-framework'),
166
+ function() {
167
+ echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-data-protection-officer-dpo/' target='_blank'>";
168
+ echo _x('Knowledge base: Do I need to appoint a Data Protection Officer?', '(Admin)', 'gdpr-framework');
169
+ echo "</a>";
170
+ }
171
+ );
172
+
173
+ $this->registerSettingField(
174
+ 'gdpr_has_dpo',
175
+ _x('Data Protection Officer', '(Admin)', 'gdpr-framework'),
176
+ [$this, 'renderHasDPOHtml'],
177
+ 'gdpr_section_privacy_policy_dpo'
178
+ );
179
+
180
+ $this->registerSettingField(
181
+ 'gdpr_dpo_name',
182
+ _x('Data Protection Officer Name', '(Admin)', 'gdpr-framework'),
183
+ [$this, 'renderDPONameHtml'],
184
+ 'gdpr_section_privacy_policy_dpo',
185
+ ['class' => 'gdpr-dpo hidden']
186
+ );
187
+
188
+ $this->registerSettingField(
189
+ 'gdpr_dpo_email',
190
+ _x('Data Protection Officer Email', '(Admin)', 'gdpr-framework'),
191
+ [$this, 'renderDPOEmailHtml'],
192
+ 'gdpr_section_privacy_policy_dpo',
193
+ ['class' => 'gdpr-dpo hidden']
194
+ );
195
+ }
196
+
197
+ public function renderHeader()
198
+ {
199
+ echo gdpr('view')->render('admin/privacy-policy/header');
200
+ }
201
+
202
+ /**
203
+ * Company info
204
+ */
205
+
206
+ public function renderCompanyNameHtml()
207
+ {
208
+ $value = gdpr('options')->get('company_name') ? esc_attr(gdpr('options')->get('company_name')) : '';
209
+ $placeholder = _x('Company Name', '(Admin)', 'gdpr-framework');
210
+ echo "<input name='gdpr_company_name' placeholder='{$placeholder}' value='{$value}'>";
211
+ }
212
+
213
+ public function renderCompanyEmailHtml()
214
+ {
215
+ $value = gdpr('options')->get('contact_email') ? esc_attr(gdpr('options')->get('contact_email')) : '';
216
+ $placeholder = _x('Contact Email', '(Admin)', 'gdpr-framework');
217
+ echo "<input type='email' name='gdpr_contact_email' placeholder='{$placeholder}' value='{$value}'>";
218
+ }
219
+
220
+ public function renderCompanyLocationHtml()
221
+ {
222
+ $country = gdpr('options')->get('company_location') ? gdpr('options')->get('company_location') : '';
223
+ $countrySelectOptions = gdpr('helpers')->getCountrySelectOptions($country);
224
+ echo gdpr('view')->render('admin/privacy-policy/company-location', compact('countrySelectOptions'));
225
+ }
226
+
227
+ /**
228
+ * Representative contact
229
+ */
230
+
231
+ public function renderRepresentativeOpen()
232
+ {
233
+ echo "<span class='gdpr-representative hidden'>";
234
+ echo "<h3>";
235
+ echo _x('Representative Contact', '(Admin)', 'gdpr-framework');
236
+ echo "</h3>";
237
+ echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-an-eu-based-representative/' target='_blank'>";
238
+ echo _x('Knowledge base: Do I need to appoint an EU-based representative?', '(Admin)', 'gdpr-framework');
239
+ echo "</a>";
240
+ }
241
+
242
+ public function renderRepresentativeContactName()
243
+ {
244
+ $value = gdpr('options')->get('representative_contact_name') ? esc_attr(gdpr('options')->get('representative_contact_name')) : '';
245
+ $placeholder = _x('Representative Contact Name', '(Admin)', 'gdpr-framework');
246
+ echo "<input name='gdpr_representative_contact_name' placeholder='{$placeholder}' value='{$value}'>";
247
+ }
248
+
249
+ public function renderRepresentativeContactEmail()
250
+ {
251
+ $value = gdpr('options')->get('representative_contact_email') ? esc_attr(gdpr('options')->get('representative_contact_email')) : '';
252
+ $placeholder = _x('Representative Contact Email', '(Admin)', 'gdpr-framework');
253
+ echo "<input type='email' name='gdpr_representative_contact_email' placeholder='{$placeholder}' value='{$value}'>";
254
+ }
255
+
256
+ public function renderRepresentativeContactPhone()
257
+ {
258
+ $value = gdpr('options')->get('representative_contact_phone') ? esc_attr(gdpr('options')->get('representative_contact_phone')) : '';
259
+ $placeholder = _x('Representative Contact Phone', '(Admin)', 'gdpr-framework');
260
+ echo "<input name='gdpr_representative_contact_phone' placeholder='{$placeholder}' value='{$value}'>";
261
+ }
262
+
263
+ public function renderRepresentativeClose()
264
+ {
265
+ echo "</span>";
266
+ }
267
+
268
+ /**
269
+ * Data Protection Authority
270
+ */
271
+ public function renderDpaJS()
272
+ {
273
+ echo "<a href='https://codelight.eu/wordpress-gdpr-framework/knowledge-base/do-i-need-to-appoint-an-eu-based-representative/' target='_blank'>";
274
+ echo 'See the <a href="http://ec.europa.eu/justice/data-protection/article-29/structure/data-protection-authorities/index_en.htm" target="_blank">list of contacts here</a>';
275
+ echo "</a>";
276
+
277
+
278
+
279
+ $dpaData = json_encode(gdpr('helpers')->getDataProtectionAuthorities());
280
+ echo gdpr('view')->render('admin/privacy-policy/dpa', compact('dpaData'));
281
+ }
282
+
283
+ public function renderDpaWebsite()
284
+ {
285
+ $value = gdpr('options')->get('dpa_website') ? esc_attr(gdpr('options')->get('dpa_website')) : '';
286
+ $placeholder = _x('Data Protection Authority Website', '(Admin)', 'gdpr-framework');
287
+ echo "<input name='gdpr_dpa_website' id='gdpr_dpa_website' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
288
+ }
289
+
290
+ public function renderDpaEmail()
291
+ {
292
+ $value = gdpr('options')->get('dpa_email') ? esc_attr(gdpr('options')->get('dpa_email')) : '';
293
+ $placeholder = _x('Data Protection Authority Email', '(Admin)', 'gdpr-framework');
294
+ echo "<input type='email' name='gdpr_dpa_email' id='gdpr_dpa_email' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
295
+ }
296
+
297
+ public function renderDpaPhone()
298
+ {
299
+ $value = gdpr('options')->get('dpa_phone') ? esc_attr(gdpr('options')->get('dpa_phone')) : '';
300
+ $placeholder = _x('Data Protection Authority Phone', '(Admin)', 'gdpr-framework');
301
+ echo "<input name='gdpr_dpa_phone' id='gdpr_dpa_phone' placeholder='{$placeholder}' value='{$value}' data-set='{$value}'>";
302
+ }
303
+
304
+ /**
305
+ * Data Protection Officer
306
+ */
307
+
308
+ public function renderHasDPOHtml()
309
+ {
310
+ $hasDPO = gdpr('options')->get('has_dpo');
311
+ echo gdpr('view')->render('admin/privacy-policy/has-dpo', compact('hasDPO'));
312
+ }
313
+
314
+ public function renderDPONameHtml()
315
+ {
316
+ $value = gdpr('options')->get('dpo_name') ? esc_attr(gdpr('options')->get('dpo_name')) : '';
317
+ $placeholder = _x('DPO Name', '(Admin)', 'gdpr-framework');
318
+ echo "<input name='gdpr_dpo_name' placeholder='{$placeholder}' value='{$value}'>";
319
+ }
320
+
321
+ public function renderDPOEmailHtml()
322
+ {
323
+ $value = gdpr('options')->get('dpo_email') ? esc_attr(gdpr('options')->get('dpo_email')) : '';
324
+ $placeholder = _x('DPO Name', '(Admin)', 'gdpr-framework');
325
+ echo "<input type='email' name='gdpr_dpo_email' placeholder='{$placeholder}' value='{$value}'>";
326
+ }
327
+
328
+
329
+ public function generatePolicy()
330
+ {
331
+ $policyPage = gdpr('options')->get('policy_page');
332
+
333
+ // todo: handle errors
334
+ if ( ! $policyPage) {
335
+ return;
336
+ }
337
+
338
+ $policy = gdpr('view')->render(
339
+ 'policy/policy'
340
+ );
341
+
342
+ wp_update_post([
343
+ 'ID' => $policyPage,
344
+ 'post_content' => $policy,
345
+ ]);
346
+
347
+ wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy&gdpr_notice=policy_generated'));
348
+ }
349
+
350
+ /**
351
+ * Render either the settings or the generated policy
352
+ */
353
+ public function renderContents()
354
+ {
355
+ if (isset($_GET['generate']) && 'yes' == $_GET['generate']) {
356
+ return $this->renderPolicy();
357
+ } else {
358
+ return $this->renderSettings();
359
+ }
360
+ }
361
+
362
+ /**
363
+ * Render the contents including settings fields, sections and submit button.
364
+ * Trigger hooks for rendering content before and after the settings fields.
365
+ *
366
+ * @return string
367
+ */
368
+ public function renderSettings()
369
+ {
370
+ ob_start();
371
+
372
+ do_action("gdpr/tabs/{$this->getSlug()}/before", $this);
373
+ $this->settingsFields($this->getOptionsGroupName());
374
+ do_settings_sections($this->getOptionsGroupName());
375
+ do_action("gdpr/tabs/{$this->getSlug()}/after", $this);
376
+
377
+ $this->renderSubmitButton();
378
+
379
+ return ob_get_clean();
380
+ }
381
+
382
+ public function renderPolicy()
383
+ {
384
+ $policyPageId = gdpr('options')->get('policy_page');
385
+ if ($policyPageId) {
386
+ $policyUrl = get_edit_post_link($policyPageId);
387
+ } else {
388
+ $policyUrl = false;
389
+ }
390
+
391
+ $editor = $this->getPolicyEditor();
392
+ $backUrl = gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy');
393
+
394
+ return gdpr('view')->render('admin/privacy-policy/generated', compact('editor', 'policyUrl', 'backUrl'));
395
+ }
396
+
397
+ protected function getPolicyEditor()
398
+ {
399
+ ob_start();
400
+
401
+ wp_editor(
402
+ wp_kses_post($this->policyGenerator->generate()),
403
+ 'gdpr_policy',
404
+ [
405
+ 'media_buttons' => false,
406
+ 'editor_height' => 600,
407
+ 'teeny' => true,
408
+ 'editor_css' => '<style>#mceu_16 { display: none; }</style>'
409
+ ]
410
+ );
411
+
412
+ return ob_get_clean();
413
+ }
414
+
415
+ /**
416
+ * Render WP's default submit button
417
+ */
418
+ public function renderSubmitButton()
419
+ {
420
+ submit_button(_x('Save & Generate Policy', '(Admin)', 'gdpr-framework'));
421
+ }
422
+
423
+ /**
424
+ * In order to set up a proper redirect to the generated policy
425
+ * after saving settings, we modify the way wp_nonce_field is called and insert our own referer input.
426
+ *
427
+ * @param $optionGroup
428
+ */
429
+ public function settingsFields($optionGroup)
430
+ {
431
+ echo "<input type='hidden' name='option_page' value='" . esc_attr($optionGroup) . "' />";
432
+ echo '<input type="hidden" name="action" value="update" />';
433
+ wp_nonce_field("$optionGroup-options", '_wpnonce', false);
434
+ echo '<input type="hidden" name="_wp_http_referer" value="'. esc_attr( wp_unslash( $_SERVER['REQUEST_URI'] ) . '&generate=yes' ) . '" />';
435
+ }
436
+ }
src/Components/PrivacyPolicy/PolicyGenerator.php CHANGED
@@ -1,45 +1,45 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\PrivacyPolicy;
4
-
5
- class PolicyGenerator
6
- {
7
- public function generate()
8
- {
9
- return gdpr('view')->render(
10
- 'policy/policy',
11
- $this->getData()
12
- );
13
- }
14
-
15
- public function getData()
16
- {
17
- $location = gdpr('options')->get('company_location');
18
- $date = date(get_option('date_format'));
19
-
20
- return [
21
- 'companyName' => gdpr('options')->get('company_name'),
22
- 'companyLocation' => $location,
23
- 'contactEmail' => gdpr('options')->get('contact_email') ?
24
- gdpr('options')->get('contact_email') :
25
- get_option('admin_email'),
26
-
27
- 'hasRepresentative' => gdpr('helpers')->countryNeedsRepresentative($location),
28
- 'representativeContactName' => gdpr('options')->get('representative_contact_name'),
29
- 'representativeContactEmail' => gdpr('options')->get('representative_contact_email'),
30
- 'representativeContactPhone' => gdpr('options')->get('representative_contact_phone'),
31
-
32
- 'dpaWebsite' => gdpr('options')->get('dpa_name'),
33
- 'dpaEmail' => gdpr('options')->get('dpa_email'),
34
- 'dpaPhone' => gdpr('options')->get('dpa_phone'),
35
-
36
- 'hasDpo' => gdpr('options')->get('has_dpo'),
37
- 'dpoName' => gdpr('options')->get('dpo_name'),
38
- 'dpoEmail' => gdpr('options')->get('dpo_email'),
39
-
40
- 'hasTerms' => gdpr('options')->get('terms_page'),
41
-
42
- 'date' => $date,
43
- ];
44
- }
45
  }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\PrivacyPolicy;
4
+
5
+ class PolicyGenerator
6
+ {
7
+ public function generate()
8
+ {
9
+ return gdpr('view')->render(
10
+ 'policy/policy',
11
+ $this->getData()
12
+ );
13
+ }
14
+
15
+ public function getData()
16
+ {
17
+ $location = gdpr('options')->get('company_location');
18
+ $date = date(get_option('date_format'));
19
+
20
+ return [
21
+ 'companyName' => gdpr('options')->get('company_name'),
22
+ 'companyLocation' => $location,
23
+ 'contactEmail' => gdpr('options')->get('contact_email') ?
24
+ gdpr('options')->get('contact_email') :
25
+ get_option('admin_email'),
26
+
27
+ 'hasRepresentative' => gdpr('helpers')->countryNeedsRepresentative($location),
28
+ 'representativeContactName' => gdpr('options')->get('representative_contact_name'),
29
+ 'representativeContactEmail' => gdpr('options')->get('representative_contact_email'),
30
+ 'representativeContactPhone' => gdpr('options')->get('representative_contact_phone'),
31
+
32
+ 'dpaWebsite' => gdpr('options')->get('dpa_name'),
33
+ 'dpaEmail' => gdpr('options')->get('dpa_email'),
34
+ 'dpaPhone' => gdpr('options')->get('dpa_phone'),
35
+
36
+ 'hasDpo' => gdpr('options')->get('has_dpo'),
37
+ 'dpoName' => gdpr('options')->get('dpo_name'),
38
+ 'dpoEmail' => gdpr('options')->get('dpo_email'),
39
+
40
+ 'hasTerms' => gdpr('options')->get('terms_page'),
41
+
42
+ 'date' => $date,
43
+ ];
44
+ }
45
  }
src/Components/PrivacyPolicy/PrivacyPolicy.php CHANGED
@@ -1,92 +1,92 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\PrivacyPolicy;
4
-
5
- /**
6
- * Handles putting together and rendering the privacy policy page
7
- *
8
- * Class PrivacyPolicy
9
- *
10
- * @package Codelight\GDPR\Components\PrivacyPolicy
11
- */
12
- class PrivacyPolicy
13
- {
14
- public function __construct()
15
- {
16
- add_filter('gdpr/admin/tabs', [$this, 'registerAdminTab'], 35);
17
-
18
- add_shortcode('gdpr_privacy', [$this, 'doShortcode']);
19
- add_shortcode('gdpr_privacy_policy_url', [$this, 'renderUrlShortcode']);
20
- add_shortcode('gdpr_privacy_policy_link', [$this, 'renderLinkShortcode']);
21
- }
22
-
23
- public function registerAdminTab($tabs)
24
- {
25
- $tabs['privacy-policy'] = gdpr()->make(AdminTabPrivacyPolicy::class);
26
-
27
- return $tabs;
28
- }
29
-
30
- public function doShortcode($attributes)
31
- {
32
- $attributes = shortcode_atts([
33
- 'item' => null,
34
- ], $attributes);
35
-
36
- switch ($attributes['item']) {
37
- case 'company_name':
38
- return esc_html(gdpr('options')->get('company_name'));
39
- case 'company_email':
40
- return esc_html(gdpr('options')->get('contact_email'));
41
- case 'company_email_link':
42
- $email = antispambot(gdpr('options')->get('contact_email'));
43
- return "<a href='mailto:{$email}'>{$email}</a>";
44
- case 'dpo_name':
45
- return esc_html(gdpr('options')->get('dpo_name'));
46
- case 'dpo_email':
47
- return esc_html(gdpr('options')->get('dpo_email'));
48
- case 'dpo_email_link':
49
- $email = antispambot(gdpr('options')->get('dpo_email'));
50
- return "<a href='mailto:{$email}'>{$email}</a>";
51
- case 'rep_name':
52
- return esc_html(gdpr('options')->get('representative_contact_name'));
53
- case 'rep_email':
54
- return esc_html(gdpr('options')->get('representative_contact_email'));
55
- case 'rep_email_link':
56
- $email = antispambot(gdpr('options')->get('representative_contact_email'));
57
- return "<a href='mailto:{$email}'>{$email}</a>";
58
- case 'authority_website':
59
- return esc_html(gdpr('options')->get('dpa_website'));
60
- case 'authority_email':
61
- return esc_html(gdpr('options')->get('dpa_email'));
62
- case 'authority_email_link':
63
- $email = antispambot(gdpr('options')->get('dpa_email'));
64
- return "<a href='mailto:{$email}'>{$email}</a>";
65
- case 'authority_phone':
66
- return esc_html(gdpr('options')->get('dpa_phone'));
67
- case null:
68
- return '';
69
- }
70
-
71
- return '';
72
- }
73
-
74
- public function renderUrlShortcode()
75
- {
76
- return gdpr('helpers')->getPrivacyPolicyPageUrl();
77
- }
78
-
79
- public function renderLinkShortcode($attributes)
80
- {
81
- $attributes = shortcode_atts([
82
- 'title' => __('Privacy Policy', 'gdpr-framework'),
83
- ], $attributes);
84
-
85
- $url = gdpr('helpers')->getPrivacyPolicyPageUrl();
86
-
87
- return
88
- "<a href='{$url}'>" .
89
- esc_html($attributes['title']) .
90
- "</a>";
91
- }
92
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\PrivacyPolicy;
4
+
5
+ /**
6
+ * Handles putting together and rendering the privacy policy page
7
+ *
8
+ * Class PrivacyPolicy
9
+ *
10
+ * @package Codelight\GDPR\Components\PrivacyPolicy
11
+ */
12
+ class PrivacyPolicy
13
+ {
14
+ public function __construct()
15
+ {
16
+ add_filter('gdpr/admin/tabs', [$this, 'registerAdminTab'], 35);
17
+
18
+ add_shortcode('gdpr_privacy', [$this, 'doShortcode']);
19
+ add_shortcode('gdpr_privacy_policy_url', [$this, 'renderUrlShortcode']);
20
+ add_shortcode('gdpr_privacy_policy_link', [$this, 'renderLinkShortcode']);
21
+ }
22
+
23
+ public function registerAdminTab($tabs)
24
+ {
25
+ $tabs['privacy-policy'] = gdpr()->make(AdminTabPrivacyPolicy::class);
26
+
27
+ return $tabs;
28
+ }
29
+
30
+ public function doShortcode($attributes)
31
+ {
32
+ $attributes = shortcode_atts([
33
+ 'item' => null,
34
+ ], $attributes);
35
+
36
+ switch ($attributes['item']) {
37
+ case 'company_name':
38
+ return esc_html(gdpr('options')->get('company_name'));
39
+ case 'company_email':
40
+ return esc_html(gdpr('options')->get('contact_email'));
41
+ case 'company_email_link':
42
+ $email = antispambot(gdpr('options')->get('contact_email'));
43
+ return "<a href='mailto:{$email}'>{$email}</a>";
44
+ case 'dpo_name':
45
+ return esc_html(gdpr('options')->get('dpo_name'));
46
+ case 'dpo_email':
47
+ return esc_html(gdpr('options')->get('dpo_email'));
48
+ case 'dpo_email_link':
49
+ $email = antispambot(gdpr('options')->get('dpo_email'));
50
+ return "<a href='mailto:{$email}'>{$email}</a>";
51
+ case 'rep_name':
52
+ return esc_html(gdpr('options')->get('representative_contact_name'));
53
+ case 'rep_email':
54
+ return esc_html(gdpr('options')->get('representative_contact_email'));
55
+ case 'rep_email_link':
56
+ $email = antispambot(gdpr('options')->get('representative_contact_email'));
57
+ return "<a href='mailto:{$email}'>{$email}</a>";
58
+ case 'authority_website':
59
+ return esc_html(gdpr('options')->get('dpa_website'));
60
+ case 'authority_email':
61
+ return esc_html(gdpr('options')->get('dpa_email'));
62
+ case 'authority_email_link':
63
+ $email = antispambot(gdpr('options')->get('dpa_email'));
64
+ return "<a href='mailto:{$email}'>{$email}</a>";
65
+ case 'authority_phone':
66
+ return esc_html(gdpr('options')->get('dpa_phone'));
67
+ case null:
68
+ return '';
69
+ }
70
+
71
+ return '';
72
+ }
73
+
74
+ public function renderUrlShortcode()
75
+ {
76
+ return gdpr('helpers')->getPrivacyPolicyPageUrl();
77
+ }
78
+
79
+ public function renderLinkShortcode($attributes)
80
+ {
81
+ $attributes = shortcode_atts([
82
+ 'title' => __('Privacy Policy', 'gdpr-framework'),
83
+ ], $attributes);
84
+
85
+ $url = gdpr('helpers')->getPrivacyPolicyPageUrl();
86
+
87
+ return
88
+ "<a href='{$url}'>" .
89
+ esc_html($attributes['title']) .
90
+ "</a>";
91
+ }
92
+ }
src/Components/PrivacyToolsPage/PrivacyToolsPage.php CHANGED
@@ -1,15 +1,15 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\PrivacyToolsPage;
4
-
5
- class PrivacyToolsPage
6
- {
7
- public function __construct()
8
- {
9
- gdpr()->singleton(PrivacyToolsPageController::class);
10
- gdpr()->make(PrivacyToolsPageShortcode::class);
11
-
12
- gdpr()->singleton(PrivacyToolsPageShortcode::class);
13
- gdpr()->make(PrivacyToolsPageShortcode::class);
14
- }
15
  }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\PrivacyToolsPage;
4
+
5
+ class PrivacyToolsPage
6
+ {
7
+ public function __construct()
8
+ {
9
+ gdpr()->singleton(PrivacyToolsPageController::class);
10
+ gdpr()->make(PrivacyToolsPageShortcode::class);
11
+
12
+ gdpr()->singleton(PrivacyToolsPageShortcode::class);
13
+ gdpr()->make(PrivacyToolsPageShortcode::class);
14
+ }
15
  }
src/Components/PrivacyToolsPage/PrivacyToolsPageController.php CHANGED
@@ -1,278 +1,278 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\PrivacyToolsPage;
4
-
5
- use Codelight\GDPR\DataSubject\DataSubject;
6
- use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
7
- use Codelight\GDPR\DataSubject\DataSubjectIdentificator;
8
- use Codelight\GDPR\DataSubject\DataSubjectManager;
9
- use Codelight\GDPR\DataSubject\DataExporter;
10
-
11
- /**
12
- * Handle the data page on front-end
13
- *
14
- * Class DataPageController
15
- *
16
- * @package Codelight\GDPR\Components\DataPage
17
- */
18
- class PrivacyToolsPageController
19
- {
20
- /* @var DataSubjectAuthenticator */
21
- protected $dataSubjectAuthenticator;
22
-
23
- /* @var DataSubjectIdentificator */
24
- protected $dataSubjectIdentificator;
25
-
26
- /* @var DataSubjectManager */
27
- protected $dataSubjectManager;
28
-
29
- /**
30
- * DataPageController constructor.
31
- *
32
- * @param DataSubjectIdentificator $dataSubjectIdentificator
33
- * @param DataSubjectManager $dataSubjectManager
34
- */
35
- public function __construct(
36
- DataSubjectAuthenticator $dataSubjectAuthenticator,
37
- DataSubjectIdentificator $dataSubjectIdentificator,
38
- DataSubjectManager $dataSubjectManager,
39
- DataExporter $dataExporter
40
- ) {
41
- $this->dataSubjectAuthenticator = $dataSubjectAuthenticator;
42
- $this->dataSubjectIdentificator = $dataSubjectIdentificator;
43
- $this->dataSubjectManager = $dataSubjectManager;
44
- $this->dataExporter = $dataExporter;
45
-
46
- if ( ! gdpr('options')->get('enable')) {
47
- return;
48
- }
49
-
50
- $this->setup();
51
- }
52
-
53
- protected function setup()
54
- {
55
- add_action('wp_enqueue_scripts', [$this, 'enqueue']);
56
-
57
- // Listen to 'identify' action and send an email
58
- add_action('gdpr/frontend/action/identify', [$this, 'sendIdentificationEmail']);
59
-
60
- add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderConsentForm'], 10, 2);
61
- add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderExportForm'], 20, 2);
62
- add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderDeleteForm'], 30, 2);
63
-
64
- add_action('gdpr/frontend/privacy-tools-page/action/withdraw_consent', [$this, 'withdrawConsent'], 10, 2);
65
- add_action('gdpr/frontend/privacy-tools-page/action/export', [$this, 'export'], 10, 2);
66
- add_action('gdpr/frontend/privacy-tools-page/action/forget', [$this, 'forget'], 10, 2);
67
- }
68
-
69
- public function enqueue()
70
- {
71
- if ( ! gdpr('options')->get('enable_stylesheet') || ! is_page(gdpr('options')->get('tools_page'))) {
72
- return;
73
- }
74
-
75
- wp_enqueue_style(
76
- 'gdpr-framework-privacy-tools',
77
- gdpr('config')->get('plugin.url') . 'assets/privacy-tools.css'
78
- );
79
- }
80
-
81
- /**
82
- * If the given email address exists as a data subject, send an authentication email to that address
83
- */
84
- public function sendIdentificationEmail()
85
- {
86
- // Additional safety check
87
- if ( ! is_email($_REQUEST['email'])) {
88
- $this->redirect(['gdpr_notice' => 'invalid_email']);
89
- }
90
-
91
- if ($this->dataSubjectIdentificator->isDataSubject($_REQUEST['email'])) {
92
- $this->dataSubjectIdentificator->sendIdentificationEmail($_REQUEST['email']);
93
- } else {
94
- $this->dataSubjectIdentificator->sendNoDataFoundEmail($_REQUEST['email']);
95
- }
96
-
97
- $this->redirect(['gdpr_notice' => 'email_sent']);
98
- }
99
-
100
- /**
101
- * Render the page contents.
102
- * This is only called via the shortcode.
103
- */
104
- public function render()
105
- {
106
- $dataSubject = $this->dataSubjectAuthenticator->authenticate();
107
- $this->renderNotices();
108
-
109
- if ($dataSubject) {
110
- $this->renderPrivacyTools($dataSubject);
111
- } else {
112
- $this->renderIdentificationForm();
113
- }
114
- }
115
-
116
- /**
117
- * Display notices to the user.
118
- * The contents of the notices are currently hardcoded inside the template.
119
- */
120
- protected function renderNotices()
121
- {
122
- if ( ! isset($_REQUEST['gdpr_notice'])) {
123
- return;
124
- }
125
-
126
- echo gdpr('view')->render('privacy-tools/notices');
127
- }
128
-
129
- /**
130
- * Render the contents of the identification form
131
- */
132
- protected function renderIdentificationForm()
133
- {
134
- $nonce = wp_create_nonce('gdpr/frontend/action/identify');
135
- echo gdpr('view')->render('privacy-tools/form-identify', compact('nonce', 'notices'));
136
- }
137
-
138
- /**
139
- * Render the contents of the Privacy Tools page
140
- *
141
- * @param DataSubject $dataSubject
142
- */
143
- protected function renderPrivacyTools(DataSubject $dataSubject)
144
- {
145
- $email = $dataSubject->getEmail();
146
- echo gdpr('view')->render('privacy-tools/privacy-tools', compact('dataSubject', 'email'));
147
- }
148
-
149
- /**
150
- * Render the form that allows withdrawing consent
151
- *
152
- * @param DataSubject $dataSubject
153
- */
154
- public function renderConsentForm(DataSubject $dataSubject)
155
- {
156
- $consentData = $dataSubject->getVisibleConsentData();
157
-
158
- foreach ($consentData as &$item) {
159
- $item['withdraw_url'] = add_query_arg([
160
- 'gdpr_action' => 'withdraw_consent',
161
- 'gdpr_nonce' => wp_create_nonce("gdpr/frontend/privacy-tools-page/action/withdraw_consent"),
162
- 'email' => $dataSubject->getEmail(),
163
- 'consent' => $item['slug'],
164
- ]);
165
- }
166
-
167
- $consentInfo = apply_filters('the_content', gdpr('options')->get('consent_info'));
168
-
169
- echo gdpr('view')->render(
170
- "privacy-tools/form-consent",
171
- compact('consentData', 'consentInfo')
172
- );
173
- }
174
-
175
- /**
176
- * Render the form that allows the data subject to export their data
177
- *
178
- * @param DataSubject $dataSubject
179
- */
180
- public function renderExportForm(DataSubject $dataSubject)
181
- {
182
- $email = $dataSubject->getEmail();
183
- $nonce = wp_create_nonce("gdpr/frontend/privacy-tools-page/action/export");
184
-
185
- echo gdpr('view')->render(
186
- "privacy-tools/form-export",
187
- compact('email', 'nonce')
188
- );
189
- }
190
-
191
- /**
192
- * Render the form that allows the data subject to delete their data
193
- *
194
- * @param DataSubject $dataSubject
195
- */
196
- public function renderDeleteForm(DataSubject $dataSubject)
197
- {
198
- // Let's not allow admins to delete themselves
199
- if (current_user_can('manage_options')) {
200
- echo gdpr('view')->render("privacy-tools/notice-admin-role");
201
-
202
- return;
203
- }
204
-
205
- $action = 'forget';
206
- $email = $dataSubject->getEmail();
207
- $nonce = wp_create_nonce("gdpr/frontend/privacy-tools-page/action/forget");
208
-
209
- echo gdpr('view')->render(
210
- "privacy-tools/form-delete",
211
- compact('action', 'email', 'nonce')
212
- );
213
- }
214
-
215
- /**
216
- * Withdraw the consent
217
- *
218
- * @param DataSubject $dataSubject
219
- */
220
- public function withdrawConsent(DataSubject $dataSubject)
221
- {
222
- $dataSubject->withdrawConsent($_REQUEST['consent']);
223
- $this->redirect(['gdpr_notice' => 'consent_withdrawn']);
224
- }
225
-
226
- /**
227
- * Trigger the export action.
228
- *
229
- * @param DataSubject $dataSubject
230
- */
231
- public function export(DataSubject $dataSubject)
232
- {
233
- $data = $dataSubject->export($_REQUEST['gdpr_format']);
234
-
235
- if ( ! is_null($data)) {
236
- // If there is data, download it
237
- $this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
238
- } else {
239
- // If there's no data, then show notification that your request has been sent.
240
- $this->redirect(['gdpr_notice' => 'request_sent']);
241
- }
242
- }
243
-
244
- /**
245
- * Trigger the forget action.
246
- *
247
- * @param DataSubject $dataSubject
248
- */
249
- public function forget(DataSubject $dataSubject)
250
- {
251
- $deleted = $dataSubject->forget();
252
-
253
- if ($deleted) {
254
- $this->dataSubjectAuthenticator->deleteSession();
255
- $this->redirect(['gdpr_notice' => 'data_deleted']);
256
- } else {
257
- // If request was sent to admin, then show notification
258
- $this->redirect(['gdpr_notice' => 'request_sent']);
259
- }
260
-
261
- }
262
-
263
- /**
264
- * Redirect the visitor to an appropriate location
265
- *
266
- * @param array $args
267
- * @param null $baseUrl
268
- */
269
- protected function redirect($args = [], $baseUrl = null)
270
- {
271
- if ( ! $baseUrl) {
272
- $baseUrl = get_permalink(gdpr('options')->get('tools_page'));
273
- }
274
-
275
- wp_safe_redirect(add_query_arg($args, $baseUrl));
276
- exit;
277
- }
278
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\PrivacyToolsPage;
4
+
5
+ use Codelight\GDPR\DataSubject\DataSubject;
6
+ use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
7
+ use Codelight\GDPR\DataSubject\DataSubjectIdentificator;
8
+ use Codelight\GDPR\DataSubject\DataSubjectManager;
9
+ use Codelight\GDPR\DataSubject\DataExporter;
10
+
11
+ /**
12
+ * Handle the data page on front-end
13
+ *
14
+ * Class DataPageController
15
+ *
16
+ * @package Codelight\GDPR\Components\DataPage
17
+ */
18
+ class PrivacyToolsPageController
19
+ {
20
+ /* @var DataSubjectAuthenticator */
21
+ protected $dataSubjectAuthenticator;
22
+
23
+ /* @var DataSubjectIdentificator */
24
+ protected $dataSubjectIdentificator;
25
+
26
+ /* @var DataSubjectManager */
27
+ protected $dataSubjectManager;
28
+
29
+ /**
30
+ * DataPageController constructor.
31
+ *
32
+ * @param DataSubjectIdentificator $dataSubjectIdentificator
33
+ * @param DataSubjectManager $dataSubjectManager
34
+ */
35
+ public function __construct(
36
+ DataSubjectAuthenticator $dataSubjectAuthenticator,
37
+ DataSubjectIdentificator $dataSubjectIdentificator,
38
+ DataSubjectManager $dataSubjectManager,
39
+ DataExporter $dataExporter
40
+ ) {
41
+ $this->dataSubjectAuthenticator = $dataSubjectAuthenticator;
42
+ $this->dataSubjectIdentificator = $dataSubjectIdentificator;
43
+ $this->dataSubjectManager = $dataSubjectManager;
44
+ $this->dataExporter = $dataExporter;
45
+
46
+ if ( ! gdpr('options')->get('enable')) {
47
+ return;
48
+ }
49
+
50
+ $this->setup();
51
+ }
52
+
53
+ protected function setup()
54
+ {
55
+ add_action('wp_enqueue_scripts', [$this, 'enqueue']);
56
+
57
+ // Listen to 'identify' action and send an email
58
+ add_action('gdpr/frontend/action/identify', [$this, 'sendIdentificationEmail']);
59
+
60
+ add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderConsentForm'], 10, 2);
61
+ add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderExportForm'], 20, 2);
62
+ add_action('gdpr/frontend/privacy-tools-page/content', [$this, 'renderDeleteForm'], 30, 2);
63
+
64
+ add_action('gdpr/frontend/privacy-tools-page/action/withdraw_consent', [$this, 'withdrawConsent'], 10, 2);
65
+ add_action('gdpr/frontend/privacy-tools-page/action/export', [$this, 'export'], 10, 2);
66
+ add_action('gdpr/frontend/privacy-tools-page/action/forget', [$this, 'forget'], 10, 2);
67
+ }
68
+
69
+ public function enqueue()
70
+ {
71
+ if ( ! gdpr('options')->get('enable_stylesheet') || ! is_page(gdpr('options')->get('tools_page'))) {
72
+ return;
73
+ }
74
+
75
+ wp_enqueue_style(
76
+ 'gdpr-framework-privacy-tools',
77
+ gdpr('config')->get('plugin.url') . 'assets/privacy-tools.css'
78
+ );
79
+ }
80
+
81
+ /**
82
+ * If the given email address exists as a data subject, send an authentication email to that address
83
+ */
84
+ public function sendIdentificationEmail()
85
+ {
86
+ // Additional safety check
87
+ if ( ! is_email($_REQUEST['email'])) {
88
+ $this->redirect(['gdpr_notice' => 'invalid_email']);
89
+ }
90
+
91
+ if ($this->dataSubjectIdentificator->isDataSubject($_REQUEST['email'])) {
92
+ $this->dataSubjectIdentificator->sendIdentificationEmail($_REQUEST['email']);
93
+ } else {
94
+ $this->dataSubjectIdentificator->sendNoDataFoundEmail($_REQUEST['email']);
95
+ }
96
+
97
+ $this->redirect(['gdpr_notice' => 'email_sent']);
98
+ }
99
+
100
+ /**
101
+ * Render the page contents.
102
+ * This is only called via the shortcode.
103
+ */
104
+ public function render()
105
+ {
106
+ $dataSubject = $this->dataSubjectAuthenticator->authenticate();
107
+ $this->renderNotices();
108
+
109
+ if ($dataSubject) {
110
+ $this->renderPrivacyTools($dataSubject);
111
+ } else {
112
+ $this->renderIdentificationForm();
113
+ }
114
+ }
115
+
116
+ /**
117
+ * Display notices to the user.
118
+ * The contents of the notices are currently hardcoded inside the template.
119
+ */
120
+ protected function renderNotices()
121
+ {
122
+ if ( ! isset($_REQUEST['gdpr_notice'])) {
123
+ return;
124
+ }
125
+
126
+ echo gdpr('view')->render('privacy-tools/notices');
127
+ }
128
+
129
+ /**
130
+ * Render the contents of the identification form
131
+ */
132
+ protected function renderIdentificationForm()
133
+ {
134
+ $nonce = wp_create_nonce('gdpr/frontend/action/identify');
135
+ echo gdpr('view')->render('privacy-tools/form-identify', compact('nonce', 'notices'));
136
+ }
137
+
138
+ /**
139
+ * Render the contents of the Privacy Tools page
140
+ *
141
+ * @param DataSubject $dataSubject
142
+ */
143
+ protected function renderPrivacyTools(DataSubject $dataSubject)
144
+ {
145
+ $email = $dataSubject->getEmail();
146
+ echo gdpr('view')->render('privacy-tools/privacy-tools', compact('dataSubject', 'email'));
147
+ }
148
+
149
+ /**
150
+ * Render the form that allows withdrawing consent
151
+ *
152
+ * @param DataSubject $dataSubject
153
+ */
154
+ public function renderConsentForm(DataSubject $dataSubject)
155
+ {
156
+ $consentData = $dataSubject->getVisibleConsentData();
157
+
158
+ foreach ($consentData as &$item) {
159
+ $item['withdraw_url'] = add_query_arg([
160
+ 'gdpr_action' => 'withdraw_consent',
161
+ 'gdpr_nonce' => wp_create_nonce("gdpr/frontend/privacy-tools-page/action/withdraw_consent"),
162
+ 'email' => $dataSubject->getEmail(),
163
+ 'consent' => $item['slug'],
164
+ ]);
165
+ }
166
+
167
+ $consentInfo = apply_filters('the_content', gdpr('options')->get('consent_info'));
168
+
169
+ echo gdpr('view')->render(
170
+ "privacy-tools/form-consent",
171
+ compact('consentData', 'consentInfo')
172
+ );
173
+ }
174
+
175
+ /**
176
+ * Render the form that allows the data subject to export their data
177
+ *
178
+ * @param DataSubject $dataSubject
179
+ */
180
+ public function renderExportForm(DataSubject $dataSubject)
181
+ {
182
+ $email = $dataSubject->getEmail();
183
+ $nonce = wp_create_nonce("gdpr/frontend/privacy-tools-page/action/export");
184
+
185
+ echo gdpr('view')->render(
186
+ "privacy-tools/form-export",
187
+ compact('email', 'nonce')
188
+ );
189
+ }
190
+
191
+ /**
192
+ * Render the form that allows the data subject to delete their data
193
+ *
194
+ * @param DataSubject $dataSubject
195
+ */
196
+ public function renderDeleteForm(DataSubject $dataSubject)
197
+ {
198
+ // Let's not allow admins to delete themselves
199
+ if (current_user_can('manage_options')) {
200
+ echo gdpr('view')->render("privacy-tools/notice-admin-role");
201
+
202
+ return;
203
+ }
204
+
205
+ $action = 'forget';
206
+ $email = $dataSubject->getEmail();
207
+ $nonce = wp_create_nonce("gdpr/frontend/privacy-tools-page/action/forget");
208
+
209
+ echo gdpr('view')->render(
210
+ "privacy-tools/form-delete",
211
+ compact('action', 'email', 'nonce')
212
+ );
213
+ }
214
+
215
+ /**
216
+ * Withdraw the consent
217
+ *
218
+ * @param DataSubject $dataSubject
219
+ */
220
+ public function withdrawConsent(DataSubject $dataSubject)
221
+ {
222
+ $dataSubject->withdrawConsent($_REQUEST['consent']);
223
+ $this->redirect(['gdpr_notice' => 'consent_withdrawn']);
224
+ }
225
+
226
+ /**
227
+ * Trigger the export action.
228
+ *
229
+ * @param DataSubject $dataSubject
230
+ */
231
+ public function export(DataSubject $dataSubject)
232
+ {
233
+ $data = $dataSubject->export($_REQUEST['gdpr_format']);
234
+
235
+ if ( ! is_null($data)) {
236
+ // If there is data, download it
237
+ $this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
238
+ } else {
239
+ // If there's no data, then show notification that your request has been sent.
240
+ $this->redirect(['gdpr_notice' => 'request_sent']);
241
+ }
242
+ }
243
+
244
+ /**
245
+ * Trigger the forget action.
246
+ *
247
+ * @param DataSubject $dataSubject
248
+ */
249
+ public function forget(DataSubject $dataSubject)
250
+ {
251
+ $deleted = $dataSubject->forget();
252
+
253
+ if ($deleted) {
254
+ $this->dataSubjectAuthenticator->deleteSession();
255
+ $this->redirect(['gdpr_notice' => 'data_deleted']);
256
+ } else {
257
+ // If request was sent to admin, then show notification
258
+ $this->redirect(['gdpr_notice' => 'request_sent']);
259
+ }
260
+
261
+ }
262
+
263
+ /**
264
+ * Redirect the visitor to an appropriate location
265
+ *
266
+ * @param array $args
267
+ * @param null $baseUrl
268
+ */
269
+ protected function redirect($args = [], $baseUrl = null)
270
+ {
271
+ if ( ! $baseUrl) {
272
+ $baseUrl = get_permalink(gdpr('options')->get('tools_page'));
273
+ }
274
+
275
+ wp_safe_redirect(add_query_arg($args, $baseUrl));
276
+ exit;
277
+ }
278
+ }
src/Components/PrivacyToolsPage/PrivacyToolsPageShortcode.php CHANGED
@@ -1,45 +1,45 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\PrivacyToolsPage;
4
-
5
- class PrivacyToolsPageShortcode
6
- {
7
- public function __construct(PrivacyToolsPageController $controller)
8
- {
9
- $this->controller = $controller;
10
-
11
- add_shortcode('gdpr_privacy_tools', [$this, 'renderPage']);
12
- add_shortcode('gdpr_privacy_tools_url', [$this, 'renderUrlShortcode']);
13
- add_shortcode('gdpr_privacy_tools_link', [$this, 'renderLinkShortcode']);
14
- }
15
-
16
- public function renderPage()
17
- {
18
- if (!gdpr('options')->get('enable')) {
19
- return __('This page is currently disabled.', 'gdpr-framework');
20
- }
21
-
22
- ob_start();
23
- $this->controller->render();
24
- return ob_get_clean();
25
- }
26
-
27
- public function renderUrlShortcode()
28
- {
29
- return gdpr('helpers')->getPrivacyToolsPageUrl();
30
- }
31
-
32
- public function renderLinkShortcode($attributes)
33
- {
34
- $attributes = shortcode_atts([
35
- 'title' => __('Privacy Tools', 'gdpr-framework'),
36
- ], $attributes);
37
-
38
- $url = gdpr('helpers')->getPrivacyToolsPageUrl();
39
-
40
- return
41
- "<a href='{$url}'>" .
42
- esc_html($attributes['title']) .
43
- "</a>";
44
- }
45
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\PrivacyToolsPage;
4
+
5
+ class PrivacyToolsPageShortcode
6
+ {
7
+ public function __construct(PrivacyToolsPageController $controller)
8
+ {
9
+ $this->controller = $controller;
10
+
11
+ add_shortcode('gdpr_privacy_tools', [$this, 'renderPage']);
12
+ add_shortcode('gdpr_privacy_tools_url', [$this, 'renderUrlShortcode']);
13
+ add_shortcode('gdpr_privacy_tools_link', [$this, 'renderLinkShortcode']);
14
+ }
15
+
16
+ public function renderPage()
17
+ {
18
+ if (!gdpr('options')->get('enable')) {
19
+ return __('This page is currently disabled.', 'gdpr-framework');
20
+ }
21
+
22
+ ob_start();
23
+ $this->controller->render();
24
+ return ob_get_clean();
25
+ }
26
+
27
+ public function renderUrlShortcode()
28
+ {
29
+ return gdpr('helpers')->getPrivacyToolsPageUrl();
30
+ }
31
+
32
+ public function renderLinkShortcode($attributes)
33
+ {
34
+ $attributes = shortcode_atts([
35
+ 'title' => __('Privacy Tools', 'gdpr-framework'),
36
+ ], $attributes);
37
+
38
+ $url = gdpr('helpers')->getPrivacyToolsPageUrl();
39
+
40
+ return
41
+ "<a href='{$url}'>" .
42
+ esc_html($attributes['title']) .
43
+ "</a>";
44
+ }
45
+ }
src/Components/Support/AdminTabSupport.php CHANGED
@@ -1,34 +1,34 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\Support;
4
-
5
- use Codelight\GDPR\Admin\AdminTab;
6
-
7
- class AdminTabSupport extends AdminTab
8
- {
9
- protected $slug = 'support';
10
-
11
- public function __construct()
12
- {
13
- $this->title = _x('Support', '(Admin)', 'gdpr-framework');
14
- }
15
-
16
- public function init()
17
- {
18
- $this->registerSettingSection(
19
- 'gdpr-section-support',
20
- _x('Support', '(Admin)', 'gdpr-framework'),
21
- [$this, 'renderTab']
22
- );
23
- }
24
-
25
- public function renderTab()
26
- {
27
- echo gdpr('view')->render('admin/support/contents');
28
- }
29
-
30
- public function renderSubmitButton()
31
- {
32
- // Intentionally left blank
33
- }
34
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\Support;
4
+
5
+ use Codelight\GDPR\Admin\AdminTab;
6
+
7
+ class AdminTabSupport extends AdminTab
8
+ {
9
+ protected $slug = 'support';
10
+
11
+ public function __construct()
12
+ {
13
+ $this->title = _x('Support', '(Admin)', 'gdpr-framework');
14
+ }
15
+
16
+ public function init()
17
+ {
18
+ $this->registerSettingSection(
19
+ 'gdpr-section-support',
20
+ _x('Support', '(Admin)', 'gdpr-framework'),
21
+ [$this, 'renderTab']
22
+ );
23
+ }
24
+
25
+ public function renderTab()
26
+ {
27
+ echo gdpr('view')->render('admin/support/contents');
28
+ }
29
+
30
+ public function renderSubmitButton()
31
+ {
32
+ // Intentionally left blank
33
+ }
34
+ }
src/Components/Support/Support.php CHANGED
@@ -1,18 +1,18 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\Support;
4
-
5
- class Support
6
- {
7
- public function __construct()
8
- {
9
- add_filter('gdpr/admin/tabs', [$this, 'registerTab'], 40);
10
- }
11
-
12
- public function registerTab($tabs)
13
- {
14
- $tabs['support'] = gdpr()->make(AdminTabSupport::class);
15
-
16
- return $tabs;
17
- }
18
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\Support;
4
+
5
+ class Support
6
+ {
7
+ public function __construct()
8
+ {
9
+ add_filter('gdpr/admin/tabs', [$this, 'registerTab'], 40);
10
+ }
11
+
12
+ public function registerTab($tabs)
13
+ {
14
+ $tabs['support'] = gdpr()->make(AdminTabSupport::class);
15
+
16
+ return $tabs;
17
+ }
18
+ }
src/Components/WordpressComments/WordpressComments.php CHANGED
@@ -1,173 +1,173 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\WordpressComments;
4
-
5
- use Codelight\GDPR\DataSubject\DataSubject;
6
- use Codelight\GDPR\DataSubject\DataSubjectManager;
7
-
8
- class WordpressComments
9
- {
10
- /* @var DataSubjectManager */
11
- protected $dataSubjectManager;
12
-
13
- public function __construct(DataSubjectManager $dataSubjectManager)
14
- {
15
- $this->dataSubjectManager = $dataSubjectManager;
16
-
17
- $this->setup();
18
- }
19
-
20
- public function setup()
21
- {
22
- if (gdpr('options')->get('policy_page')) {
23
- add_action('comment_form_after_fields', [$this, 'maybeAddCommentFormCheckbox']);
24
- add_action('comment_form_logged_in_after', [$this, 'maybeAddCommentFormCheckbox']);
25
-
26
- add_filter('preprocess_comment', [$this, 'validate']);
27
- }
28
-
29
- add_filter('gdpr/data-subject/data', [$this, 'getExportData'], 1, 2);
30
- add_action('gdpr/data-subject/delete', [$this, 'deleteComments']);
31
- add_action('gdpr/data-subject/anonymize', [$this, 'deleteComments']);
32
- }
33
-
34
- /**
35
- * Check if consent is needed
36
- *
37
- * @return bool
38
- */
39
- public function needsConsent($email = null)
40
- {
41
- if ($email) {
42
- $dataSubject = $this->dataSubjectManager->getByEmail($email);
43
- } else {
44
- $dataSubject = $this->dataSubjectManager->getByLoggedInUser();
45
- }
46
- return !($dataSubject && $dataSubject->hasConsented('privacy-policy'));
47
- }
48
-
49
- /**
50
- * If consent is needed, render the checkbox
51
- *
52
- * @param $fields
53
- */
54
- public function maybeAddCommentFormCheckbox()
55
- {
56
- $email = isset($_POST['email']) ? $_POST['email'] : null;
57
-
58
- if (!$this->needsConsent($email)) {
59
- return;
60
- }
61
-
62
- $privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
63
- $termsPage = gdpr('options')->get('terms_page');
64
- if ($termsPage) {
65
- $termsUrl = get_permalink($termsPage);
66
- } else {
67
- $termsUrl = false;
68
- }
69
-
70
- echo gdpr('view')->render(
71
- 'modules/wordpress-comments/terms-checkbox',
72
- compact('termsUrl', 'privacyPolicyUrl')
73
- );
74
- }
75
-
76
- /**
77
- * If consent is needed, validate it
78
- */
79
- public function validate($commentData)
80
- {
81
- $email = isset($_POST['email']) ? $_POST['email'] : null;
82
-
83
- if (!$this->needsConsent($email)) {
84
- return $commentData;
85
- }
86
-
87
- if (!isset($_POST['gdpr_terms']) || !$_POST['gdpr_terms']) {
88
- wp_die(
89
- sprintf(
90
- __('%sERROR:%s You need to accept the terms and conditions to post a comment.'),
91
- '<strong>',
92
- '</strong>'
93
- )
94
- );
95
- } else {
96
- if (is_user_logged_in()) {
97
- $dataSubject = $this->dataSubjectManager->getByLoggedInUser();
98
- } else {
99
- $dataSubject = $this->dataSubjectManager->getByEmail($email);
100
- }
101
- $dataSubject->giveConsent('privacy-policy');
102
- }
103
-
104
- return $commentData;
105
- }
106
-
107
- /**
108
- * Add comments as well as comment meta to export data
109
- *
110
- * @param $data
111
- * @param $email
112
- * @param $dataSubject
113
- * @return mixed
114
- */
115
- public function getExportData($data, $email)
116
- {
117
- $comments = $this->getCommentsByEmail($email);
118
-
119
- if (count($comments)) {
120
-
121
- foreach ($comments as $comment) {
122
- /* @var $comment \WP_Comment */
123
-
124
- $commentData = [
125
- 'comment_author' => $comment->comment_author,
126
- 'comment_author_email' => $comment->comment_author_email,
127
- 'comment_author_url' => $comment->comment_author_url,
128
- 'comment_author_IP' => $comment->comment_author_IP,
129
- 'comment_date' => $comment->comment_date,
130
- 'comment_date_gmt' => $comment->comment_date_gmt,
131
- 'comment_content' => $comment->comment_content,
132
- 'comment_approved' => $comment->comment_approved,
133
- 'comment_agent' => $comment->comment_agent,
134
- ];
135
-
136
- $commentMeta = get_comment_meta($comment->comment_ID);
137
- if (!empty($commentMeta)) {
138
- $commentData['comment_meta'] = $commentMeta;
139
- }
140
-
141
- $data['comments'][] = $commentData;
142
- }
143
- }
144
-
145
- return $data;
146
- }
147
-
148
- public function deleteComments($email)
149
- {
150
- $comments = $this->getCommentsByEmail($email);
151
-
152
- if (!count($comments)) {
153
- return;
154
- }
155
-
156
- foreach ($comments as $comment) {
157
- /* @var $comment \WP_Comment */
158
- wp_delete_comment($comment->comment_ID, true);
159
- }
160
- }
161
-
162
- public function getCommentsByEmail($email)
163
- {
164
- if (!$email || !is_email($email)) {
165
- return [];
166
- }
167
-
168
- $query = new \WP_Comment_Query;
169
- return $query->query([
170
- 'author_email' => $email,
171
- ]);
172
- }
173
  }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\WordpressComments;
4
+
5
+ use Codelight\GDPR\DataSubject\DataSubject;
6
+ use Codelight\GDPR\DataSubject\DataSubjectManager;
7
+
8
+ class WordpressComments
9
+ {
10
+ /* @var DataSubjectManager */
11
+ protected $dataSubjectManager;
12
+
13
+ public function __construct(DataSubjectManager $dataSubjectManager)
14
+ {
15
+ $this->dataSubjectManager = $dataSubjectManager;
16
+
17
+ $this->setup();
18
+ }
19
+
20
+ public function setup()
21
+ {
22
+ if (gdpr('options')->get('policy_page')) {
23
+ add_action('comment_form_after_fields', [$this, 'maybeAddCommentFormCheckbox']);
24
+ add_action('comment_form_logged_in_after', [$this, 'maybeAddCommentFormCheckbox']);
25
+
26
+ add_filter('preprocess_comment', [$this, 'validate']);
27
+ }
28
+
29
+ add_filter('gdpr/data-subject/data', [$this, 'getExportData'], 1, 2);
30
+ add_action('gdpr/data-subject/delete', [$this, 'deleteComments']);
31
+ add_action('gdpr/data-subject/anonymize', [$this, 'deleteComments']);
32
+ }
33
+
34
+ /**
35
+ * Check if consent is needed
36
+ *
37
+ * @return bool
38
+ */
39
+ public function needsConsent($email = null)
40
+ {
41
+ if ($email) {
42
+ $dataSubject = $this->dataSubjectManager->getByEmail($email);
43
+ } else {
44
+ $dataSubject = $this->dataSubjectManager->getByLoggedInUser();
45
+ }
46
+ return !($dataSubject && $dataSubject->hasConsented('privacy-policy'));
47
+ }
48
+
49
+ /**
50
+ * If consent is needed, render the checkbox
51
+ *
52
+ * @param $fields
53
+ */
54
+ public function maybeAddCommentFormCheckbox()
55
+ {
56
+ $email = isset($_POST['email']) ? $_POST['email'] : null;
57
+
58
+ if (!$this->needsConsent($email)) {
59
+ return;
60
+ }
61
+
62
+ $privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
63
+ $termsPage = gdpr('options')->get('terms_page');
64
+ if ($termsPage) {
65
+ $termsUrl = get_permalink($termsPage);
66
+ } else {
67
+ $termsUrl = false;
68
+ }
69
+
70
+ echo gdpr('view')->render(
71
+ 'modules/wordpress-comments/terms-checkbox',
72
+ compact('termsUrl', 'privacyPolicyUrl')
73
+ );
74
+ }
75
+
76
+ /**
77
+ * If consent is needed, validate it
78
+ */
79
+ public function validate($commentData)
80
+ {
81
+ $email = isset($_POST['email']) ? $_POST['email'] : null;
82
+
83
+ if (!$this->needsConsent($email)) {
84
+ return $commentData;
85
+ }
86
+
87
+ if (!isset($_POST['gdpr_terms']) || !$_POST['gdpr_terms']) {
88
+ wp_die(
89
+ sprintf(
90
+ __('%sERROR:%s You need to accept the terms and conditions to post a comment.'),
91
+ '<strong>',
92
+ '</strong>'
93
+ )
94
+ );
95
+ } else {
96
+ if (is_user_logged_in()) {
97
+ $dataSubject = $this->dataSubjectManager->getByLoggedInUser();
98
+ } else {
99
+ $dataSubject = $this->dataSubjectManager->getByEmail($email);
100
+ }
101
+ $dataSubject->giveConsent('privacy-policy');
102
+ }
103
+
104
+ return $commentData;
105
+ }
106
+
107
+ /**
108
+ * Add comments as well as comment meta to export data
109
+ *
110
+ * @param $data
111
+ * @param $email
112
+ * @param $dataSubject
113
+ * @return mixed
114
+ */
115
+ public function getExportData($data, $email)
116
+ {
117
+ $comments = $this->getCommentsByEmail($email);
118
+
119
+ if (count($comments)) {
120
+
121
+ foreach ($comments as $comment) {
122
+ /* @var $comment \WP_Comment */
123
+
124
+ $commentData = [
125
+ 'comment_author' => $comment->comment_author,
126
+ 'comment_author_email' => $comment->comment_author_email,
127
+ 'comment_author_url' => $comment->comment_author_url,
128
+ 'comment_author_IP' => $comment->comment_author_IP,
129
+ 'comment_date' => $comment->comment_date,
130
+ 'comment_date_gmt' => $comment->comment_date_gmt,
131
+ 'comment_content' => $comment->comment_content,
132
+ 'comment_approved' => $comment->comment_approved,
133
+ 'comment_agent' => $comment->comment_agent,
134
+ ];
135
+
136
+ $commentMeta = get_comment_meta($comment->comment_ID);
137
+ if (!empty($commentMeta)) {
138
+ $commentData['comment_meta'] = $commentMeta;
139
+ }
140
+
141
+ $data['comments'][] = $commentData;
142
+ }
143
+ }
144
+
145
+ return $data;
146
+ }
147
+
148
+ public function deleteComments($email)
149
+ {
150
+ $comments = $this->getCommentsByEmail($email);
151
+
152
+ if (!count($comments)) {
153
+ return;
154
+ }
155
+
156
+ foreach ($comments as $comment) {
157
+ /* @var $comment \WP_Comment */
158
+ wp_delete_comment($comment->comment_ID, true);
159
+ }
160
+ }
161
+
162
+ public function getCommentsByEmail($email)
163
+ {
164
+ if (!$email || !is_email($email)) {
165
+ return [];
166
+ }
167
+
168
+ $query = new \WP_Comment_Query;
169
+ return $query->query([
170
+ 'author_email' => $email,
171
+ ]);
172
+ }
173
  }
src/Components/WordpressUser/Controllers/DashboardDataPageController.php CHANGED
@@ -1,197 +1,197 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\WordpressUser\Controllers;
4
-
5
- use Codelight\GDPR\DataSubject\DataExporter;
6
- use Codelight\GDPR\DataSubject\DataSubject;
7
- use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
8
-
9
- /**
10
- * Handles Users > Privacy Tools page
11
- *
12
- * Class DashboardDataPageController
13
- *
14
- * @package Codelight\GDPR\Modules\WordpressUser\Controllers
15
- */
16
- class DashboardDataPageController
17
- {
18
- /**
19
- * DashboardDataPageController constructor.
20
- *
21
- * @param DataExporter $dataExporter
22
- */
23
- public function __construct(DataExporter $dataExporter, DataSubjectAuthenticator $dataSubjectAuthenticator)
24
- {
25
- $this->dataExporter = $dataExporter;
26
- $this->dataSubjectAuthenticator = $dataSubjectAuthenticator;
27
-
28
- add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderHeader'], 10);
29
- add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderConsentForm'], 20);
30
- add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderExportForm'], 30);
31
- add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderDeleteForm'], 40);
32
-
33
- add_action('gdpr/dashboard/privacy-tools/action/withdraw_consent', [$this, 'withdrawConsent']);
34
- add_action('gdpr/dashboard/privacy-tools/action/export', [$this, 'export']);
35
- add_action('gdpr/dashboard/privacy-tools/action/forget', [$this, 'forget']);
36
-
37
- add_action('admin_notices', [$this, 'renderAdminNotices']);
38
- }
39
-
40
- /**
41
- * Render success notices via admin_notice action
42
- */
43
- public function renderAdminNotices()
44
- {
45
- if ('profile_page_gdpr-profile' !== get_current_screen()->base) {
46
- return;
47
- }
48
-
49
- if (!isset($_REQUEST['gdpr_notice'])) {
50
- return;
51
- }
52
-
53
- if ('request_sent' === $_REQUEST['gdpr_notice']) {
54
- $message = __('We have received your request and will reply within 30 days.', 'gdpr-framework');
55
- $class = 'notice notice-success';
56
- }
57
-
58
- if ('consent_withdrawn' === $_REQUEST['gdpr_notice']) {
59
- $message = __('Consent withdrawn.', 'gdpr-framework');
60
- $class = 'notice notice-success';
61
- }
62
-
63
- echo gdpr('view')->render('admin/notice', compact('message', 'class'));
64
- }
65
-
66
- /**
67
- * Render page header
68
- */
69
- public function renderHeader()
70
- {
71
- echo gdpr('view')->render(
72
- "modules/wordpress-user/dashboard/data-page/header"
73
- );
74
- }
75
-
76
- /**
77
- * Render the consent form
78
- *
79
- * @param DataSubject $dataSubject
80
- */
81
- public function renderConsentForm(DataSubject $dataSubject)
82
- {
83
- $consentData = $dataSubject->getVisibleConsentData();
84
-
85
- foreach ($consentData as &$item) {
86
- $item['withdraw_url'] = add_query_arg([
87
- 'gdpr_action' => 'withdraw_consent',
88
- 'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/withdraw_consent"),
89
- 'email' => $dataSubject->getEmail(),
90
- 'consent' => $item['slug'],
91
- ]);
92
- }
93
-
94
- $consentInfo = apply_filters('the_content', gdpr('options')->get('consent_info'));
95
-
96
- echo gdpr('view')->render(
97
- "modules/wordpress-user/dashboard/data-page/form-consent",
98
- compact('consentData', 'consentInfo')
99
- );
100
- }
101
-
102
- /**
103
- * Render the buttons that allow exporting data
104
- */
105
- public function renderExportForm()
106
- {
107
- $exportHTMLUrl = add_query_arg([
108
- 'gdpr_action' => 'export',
109
- 'gdpr_format' => 'html',
110
- 'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/export"),
111
- ]);
112
-
113
- $exportJSONUrl = add_query_arg([
114
- 'gdpr_action' => 'export',
115
- 'gdpr_format' => 'json',
116
- 'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/export"),
117
- ]);
118
-
119
- echo gdpr('view')->render(
120
- "modules/wordpress-user/dashboard/form-export",
121
- compact('exportHTMLUrl', 'exportJSONUrl')
122
- );
123
- }
124
-
125
- /**
126
- * Render the delete data button
127
- */
128
- public function renderDeleteForm()
129
- {
130
- $showDelete = !current_user_can('manage_options');
131
- $url = add_query_arg([
132
- 'gdpr_action' => 'forget',
133
- 'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/forget"),
134
- ]);
135
-
136
- echo gdpr('view')->render(
137
- "modules/wordpress-user/dashboard/data-page/form-delete",
138
- compact('url', 'showDelete')
139
- );
140
- }
141
-
142
- /**
143
- * @param DataSubject $dataSubject
144
- */
145
- public function withdrawConsent(DataSubject $dataSubject)
146
- {
147
- $dataSubject->withdrawConsent($_REQUEST['consent']);
148
- $this->redirect(['gdpr_notice' => 'consent_withdrawn']);
149
- }
150
-
151
- /**
152
- * @param DataSubject $dataSubject
153
- */
154
- public function export(DataSubject $dataSubject)
155
- {
156
- $data = $dataSubject->export($_REQUEST['gdpr_format']);
157
-
158
- if (!is_null($data)) {
159
- // If there is data, download it
160
- $this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
161
- } else {
162
- // If there's no data, then show notification that your request has been sent.
163
- $this->redirect(['gdpr_notice' => 'request_sent']);
164
- }
165
- }
166
-
167
- /**
168
- * @param DataSubject $dataSubject
169
- */
170
- public function forget(DataSubject $dataSubject)
171
- {
172
- $status = $dataSubject->forget();
173
-
174
- if (!$status) {
175
- $this->redirect(['gdpr_notice' => 'request_sent']);
176
- } else {
177
- $this->dataSubjectAuthenticator->deleteSession();
178
- $this->redirect([], '/');
179
- }
180
- }
181
-
182
- /**
183
- * Redirect the visitor to an appropriate location
184
- *
185
- * @param array $args
186
- * @param null $baseUrl
187
- */
188
- protected function redirect($args = [], $baseUrl = null)
189
- {
190
- if (!$baseUrl) {
191
- $baseUrl = gdpr('helpers')->getDashboardDataPageUrl();
192
- }
193
-
194
- wp_safe_redirect(add_query_arg($args, $baseUrl));
195
- exit;
196
- }
197
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\WordpressUser\Controllers;
4
+
5
+ use Codelight\GDPR\DataSubject\DataExporter;
6
+ use Codelight\GDPR\DataSubject\DataSubject;
7
+ use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
8
+
9
+ /**
10
+ * Handles Users > Privacy Tools page
11
+ *
12
+ * Class DashboardDataPageController
13
+ *
14
+ * @package Codelight\GDPR\Modules\WordpressUser\Controllers
15
+ */
16
+ class DashboardDataPageController
17
+ {
18
+ /**
19
+ * DashboardDataPageController constructor.
20
+ *
21
+ * @param DataExporter $dataExporter
22
+ */
23
+ public function __construct(DataExporter $dataExporter, DataSubjectAuthenticator $dataSubjectAuthenticator)
24
+ {
25
+ $this->dataExporter = $dataExporter;
26
+ $this->dataSubjectAuthenticator = $dataSubjectAuthenticator;
27
+
28
+ add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderHeader'], 10);
29
+ add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderConsentForm'], 20);
30
+ add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderExportForm'], 30);
31
+ add_action('gdpr/dashboard/privacy-tools/content', [$this, 'renderDeleteForm'], 40);
32
+
33
+ add_action('gdpr/dashboard/privacy-tools/action/withdraw_consent', [$this, 'withdrawConsent']);
34
+ add_action('gdpr/dashboard/privacy-tools/action/export', [$this, 'export']);
35
+ add_action('gdpr/dashboard/privacy-tools/action/forget', [$this, 'forget']);
36
+
37
+ add_action('admin_notices', [$this, 'renderAdminNotices']);
38
+ }
39
+
40
+ /**
41
+ * Render success notices via admin_notice action
42
+ */
43
+ public function renderAdminNotices()
44
+ {
45
+ if ('profile_page_gdpr-profile' !== get_current_screen()->base) {
46
+ return;
47
+ }
48
+
49
+ if (!isset($_REQUEST['gdpr_notice'])) {
50
+ return;
51
+ }
52
+
53
+ if ('request_sent' === $_REQUEST['gdpr_notice']) {
54
+ $message = __('We have received your request and will reply within 30 days.', 'gdpr-framework');
55
+ $class = 'notice notice-success';
56
+ }
57
+
58
+ if ('consent_withdrawn' === $_REQUEST['gdpr_notice']) {
59
+ $message = __('Consent withdrawn.', 'gdpr-framework');
60
+ $class = 'notice notice-success';
61
+ }
62
+
63
+ echo gdpr('view')->render('admin/notice', compact('message', 'class'));
64
+ }
65
+
66
+ /**
67
+ * Render page header
68
+ */
69
+ public function renderHeader()
70
+ {
71
+ echo gdpr('view')->render(
72
+ "modules/wordpress-user/dashboard/data-page/header"
73
+ );
74
+ }
75
+
76
+ /**
77
+ * Render the consent form
78
+ *
79
+ * @param DataSubject $dataSubject
80
+ */
81
+ public function renderConsentForm(DataSubject $dataSubject)
82
+ {
83
+ $consentData = $dataSubject->getVisibleConsentData();
84
+
85
+ foreach ($consentData as &$item) {
86
+ $item['withdraw_url'] = add_query_arg([
87
+ 'gdpr_action' => 'withdraw_consent',
88
+ 'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/withdraw_consent"),
89
+ 'email' => $dataSubject->getEmail(),
90
+ 'consent' => $item['slug'],
91
+ ]);
92
+ }
93
+
94
+ $consentInfo = apply_filters('the_content', gdpr('options')->get('consent_info'));
95
+
96
+ echo gdpr('view')->render(
97
+ "modules/wordpress-user/dashboard/data-page/form-consent",
98
+ compact('consentData', 'consentInfo')
99
+ );
100
+ }
101
+
102
+ /**
103
+ * Render the buttons that allow exporting data
104
+ */
105
+ public function renderExportForm()
106
+ {
107
+ $exportHTMLUrl = add_query_arg([
108
+ 'gdpr_action' => 'export',
109
+ 'gdpr_format' => 'html',
110
+ 'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/export"),
111
+ ]);
112
+
113
+ $exportJSONUrl = add_query_arg([
114
+ 'gdpr_action' => 'export',
115
+ 'gdpr_format' => 'json',
116
+ 'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/export"),
117
+ ]);
118
+
119
+ echo gdpr('view')->render(
120
+ "modules/wordpress-user/dashboard/form-export",
121
+ compact('exportHTMLUrl', 'exportJSONUrl')
122
+ );
123
+ }
124
+
125
+ /**
126
+ * Render the delete data button
127
+ */
128
+ public function renderDeleteForm()
129
+ {
130
+ $showDelete = !current_user_can('manage_options');
131
+ $url = add_query_arg([
132
+ 'gdpr_action' => 'forget',
133
+ 'gdpr_nonce' => wp_create_nonce("gdpr/dashboard/privacy-tools/action/forget"),
134
+ ]);
135
+
136
+ echo gdpr('view')->render(
137
+ "modules/wordpress-user/dashboard/data-page/form-delete",
138
+ compact('url', 'showDelete')
139
+ );
140
+ }
141
+
142
+ /**
143
+ * @param DataSubject $dataSubject
144
+ */
145
+ public function withdrawConsent(DataSubject $dataSubject)
146
+ {
147
+ $dataSubject->withdrawConsent($_REQUEST['consent']);
148
+ $this->redirect(['gdpr_notice' => 'consent_withdrawn']);
149
+ }
150
+
151
+ /**
152
+ * @param DataSubject $dataSubject
153
+ */
154
+ public function export(DataSubject $dataSubject)
155
+ {
156
+ $data = $dataSubject->export($_REQUEST['gdpr_format']);
157
+
158
+ if (!is_null($data)) {
159
+ // If there is data, download it
160
+ $this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
161
+ } else {
162
+ // If there's no data, then show notification that your request has been sent.
163
+ $this->redirect(['gdpr_notice' => 'request_sent']);
164
+ }
165
+ }
166
+
167
+ /**
168
+ * @param DataSubject $dataSubject
169
+ */
170
+ public function forget(DataSubject $dataSubject)
171
+ {
172
+ $status = $dataSubject->forget();
173
+
174
+ if (!$status) {
175
+ $this->redirect(['gdpr_notice' => 'request_sent']);
176
+ } else {
177
+ $this->dataSubjectAuthenticator->deleteSession();
178
+ $this->redirect([], '/');
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Redirect the visitor to an appropriate location
184
+ *
185
+ * @param array $args
186
+ * @param null $baseUrl
187
+ */
188
+ protected function redirect($args = [], $baseUrl = null)
189
+ {
190
+ if (!$baseUrl) {
191
+ $baseUrl = gdpr('helpers')->getDashboardDataPageUrl();
192
+ }
193
+
194
+ wp_safe_redirect(add_query_arg($args, $baseUrl));
195
+ exit;
196
+ }
197
+ }
src/Components/WordpressUser/Controllers/DashboardProfilePageController.php CHANGED
@@ -1,123 +1,123 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\WordpressUser\Controllers;
4
-
5
- use Codelight\GDPR\DataSubject\DataExporter;
6
- use Codelight\GDPR\DataSubject\DataSubject;
7
- use Codelight\GDPR\DataSubject\DataSubjectManager;
8
-
9
- class DashboardProfilePageController
10
- {
11
- public function __construct(DataSubjectManager $dataSubjectManager, DataExporter $dataExporter)
12
- {
13
- $this->dataSubjectManager = $dataSubjectManager;
14
- $this->dataExporter = $dataExporter;
15
-
16
- add_action('gdpr/dashboard/profile-page/content', [$this, 'renderHeader'], 10);
17
- add_action('gdpr/dashboard/profile-page/content', [$this, 'renderConsentTable'], 20);
18
- add_action('gdpr/dashboard/profile-page/content', [$this, 'renderExportForm'], 30);
19
- add_action('gdpr/dashboard/profile-page/content', [$this, 'renderDeleteForm'], 40);
20
-
21
- add_action('gdpr/admin/action/export', [$this, 'export']);
22
- add_action('gdpr/admin/action/forget', [$this, 'forget']);
23
- }
24
-
25
- protected function isUserAnonymized(DataSubject $dataSubject)
26
- {
27
- return !$dataSubject->getEmail();
28
- }
29
-
30
- public function renderHeader(DataSubject $dataSubject)
31
- {
32
- $isAnonymized = $this->isUserAnonymized($dataSubject);
33
-
34
- echo gdpr('view')->render(
35
- "modules/wordpress-user/dashboard/profile-page/header",
36
- compact('isAnonymized')
37
- );
38
- }
39
-
40
- public function renderConsentTable(DataSubject $dataSubject)
41
- {
42
- if ($this->isUserAnonymized($dataSubject)) {
43
- return;
44
- }
45
-
46
- $consentData = $dataSubject->getConsentData();
47
-
48
- echo gdpr('view')->render(
49
- "modules/wordpress-user/dashboard/profile-page/table-consent",
50
- compact('consentData')
51
- );
52
- }
53
-
54
- public function renderExportForm(DataSubject $dataSubject)
55
- {
56
- if ($this->isUserAnonymized($dataSubject)) {
57
- return;
58
- }
59
-
60
- $exportHTMLUrl = add_query_arg([
61
- 'gdpr_action' => 'export',
62
- 'gdpr_format' => 'html',
63
- 'gdpr_email' => $dataSubject->getEmail(),
64
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
65
- ]);
66
-
67
- $exportJSONUrl = add_query_arg([
68
- 'gdpr_action' => 'export',
69
- 'gdpr_format' => 'json',
70
- 'gdpr_email' => $dataSubject->getEmail(),
71
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
72
- ]);
73
-
74
- echo gdpr('view')->render(
75
- "modules/wordpress-user/dashboard/form-export",
76
- compact('exportHTMLUrl', 'exportJSONUrl')
77
- );
78
- }
79
-
80
- public function renderDeleteForm(DataSubject $dataSubject)
81
- {
82
- if ($this->isUserAnonymized($dataSubject)) {
83
- return;
84
- }
85
-
86
- // Hide the delete button away from site admins on their own profile page to avoid accidents
87
- $showDelete = !(current_user_can('manage_options') && wp_get_current_user()->ID === $dataSubject->getUserId());
88
-
89
- $anonymizeUrl = add_query_arg([
90
- 'gdpr_email' => $dataSubject->getEmail(),
91
- 'gdpr_action' => 'forget',
92
- 'gdpr_force_action' => 'anonymize',
93
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
94
- ]);
95
-
96
- $deleteUrl = add_query_arg([
97
- 'gdpr_email' => $dataSubject->getEmail(),
98
- 'gdpr_action' => 'forget',
99
- 'gdpr_force_action' => 'delete',
100
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
101
- ]);
102
-
103
- echo gdpr('view')->render(
104
- "modules/wordpress-user/dashboard/profile-page/form-delete",
105
- compact('anonymizeUrl', 'deleteUrl', 'showDelete')
106
- );
107
- }
108
-
109
- public function export()
110
- {
111
- $dataSubject = $this->dataSubjectManager->getByEmail($_REQUEST['gdpr_email']);
112
- $data = $dataSubject->export($_REQUEST['gdpr_format'], true);
113
- $this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
114
- }
115
-
116
- public function forget()
117
- {
118
- $dataSubject = $this->dataSubjectManager->getByEmail($_REQUEST['gdpr_email']);
119
- $dataSubject->forget($_REQUEST['gdpr_force_action']);
120
-
121
- wp_safe_redirect(admin_url('users.php'));
122
- }
123
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\WordpressUser\Controllers;
4
+
5
+ use Codelight\GDPR\DataSubject\DataExporter;
6
+ use Codelight\GDPR\DataSubject\DataSubject;
7
+ use Codelight\GDPR\DataSubject\DataSubjectManager;
8
+
9
+ class DashboardProfilePageController
10
+ {
11
+ public function __construct(DataSubjectManager $dataSubjectManager, DataExporter $dataExporter)
12
+ {
13
+ $this->dataSubjectManager = $dataSubjectManager;
14
+ $this->dataExporter = $dataExporter;
15
+
16
+ add_action('gdpr/dashboard/profile-page/content', [$this, 'renderHeader'], 10);
17
+ add_action('gdpr/dashboard/profile-page/content', [$this, 'renderConsentTable'], 20);
18
+ add_action('gdpr/dashboard/profile-page/content', [$this, 'renderExportForm'], 30);
19
+ add_action('gdpr/dashboard/profile-page/content', [$this, 'renderDeleteForm'], 40);
20
+
21
+ add_action('gdpr/admin/action/export', [$this, 'export']);
22
+ add_action('gdpr/admin/action/forget', [$this, 'forget']);
23
+ }
24
+
25
+ protected function isUserAnonymized(DataSubject $dataSubject)
26
+ {
27
+ return !$dataSubject->getEmail();
28
+ }
29
+
30
+ public function renderHeader(DataSubject $dataSubject)
31
+ {
32
+ $isAnonymized = $this->isUserAnonymized($dataSubject);
33
+
34
+ echo gdpr('view')->render(
35
+ "modules/wordpress-user/dashboard/profile-page/header",
36
+ compact('isAnonymized')
37
+ );
38
+ }
39
+
40
+ public function renderConsentTable(DataSubject $dataSubject)
41
+ {
42
+ if ($this->isUserAnonymized($dataSubject)) {
43
+ return;
44
+ }
45
+
46
+ $consentData = $dataSubject->getConsentData();
47
+
48
+ echo gdpr('view')->render(
49
+ "modules/wordpress-user/dashboard/profile-page/table-consent",
50
+ compact('consentData')
51
+ );
52
+ }
53
+
54
+ public function renderExportForm(DataSubject $dataSubject)
55
+ {
56
+ if ($this->isUserAnonymized($dataSubject)) {
57
+ return;
58
+ }
59
+
60
+ $exportHTMLUrl = add_query_arg([
61
+ 'gdpr_action' => 'export',
62
+ 'gdpr_format' => 'html',
63
+ 'gdpr_email' => $dataSubject->getEmail(),
64
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
65
+ ]);
66
+
67
+ $exportJSONUrl = add_query_arg([
68
+ 'gdpr_action' => 'export',
69
+ 'gdpr_format' => 'json',
70
+ 'gdpr_email' => $dataSubject->getEmail(),
71
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
72
+ ]);
73
+
74
+ echo gdpr('view')->render(
75
+ "modules/wordpress-user/dashboard/form-export",
76
+ compact('exportHTMLUrl', 'exportJSONUrl')
77
+ );
78
+ }
79
+
80
+ public function renderDeleteForm(DataSubject $dataSubject)
81
+ {
82
+ if ($this->isUserAnonymized($dataSubject)) {
83
+ return;
84
+ }
85
+
86
+ // Hide the delete button away from site admins on their own profile page to avoid accidents
87
+ $showDelete = !(current_user_can('manage_options') && wp_get_current_user()->ID === $dataSubject->getUserId());
88
+
89
+ $anonymizeUrl = add_query_arg([
90
+ 'gdpr_email' => $dataSubject->getEmail(),
91
+ 'gdpr_action' => 'forget',
92
+ 'gdpr_force_action' => 'anonymize',
93
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
94
+ ]);
95
+
96
+ $deleteUrl = add_query_arg([
97
+ 'gdpr_email' => $dataSubject->getEmail(),
98
+ 'gdpr_action' => 'forget',
99
+ 'gdpr_force_action' => 'delete',
100
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
101
+ ]);
102
+
103
+ echo gdpr('view')->render(
104
+ "modules/wordpress-user/dashboard/profile-page/form-delete",
105
+ compact('anonymizeUrl', 'deleteUrl', 'showDelete')
106
+ );
107
+ }
108
+
109
+ public function export()
110
+ {
111
+ $dataSubject = $this->dataSubjectManager->getByEmail($_REQUEST['gdpr_email']);
112
+ $data = $dataSubject->export($_REQUEST['gdpr_format'], true);
113
+ $this->dataExporter->export($data, $dataSubject, $_REQUEST['gdpr_format']);
114
+ }
115
+
116
+ public function forget()
117
+ {
118
+ $dataSubject = $this->dataSubjectManager->getByEmail($_REQUEST['gdpr_email']);
119
+ $dataSubject->forget($_REQUEST['gdpr_force_action']);
120
+
121
+ wp_safe_redirect(admin_url('users.php'));
122
+ }
123
+ }
src/Components/WordpressUser/DataManager.php CHANGED
@@ -1,151 +1,151 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\WordpressUser;
4
-
5
- use Codelight\GDPR\DataSubject\DataSubject;
6
-
7
- class DataManager
8
- {
9
- public function getData(DataSubject $dataSubject)
10
- {
11
- $user = $dataSubject->getUser();
12
- if ($user) {
13
- $meta = get_user_meta($user->ID);
14
- $data['meta'] = $meta;
15
- } else {
16
- $data = [];
17
- }
18
-
19
- $whitelist = [
20
- 'nickname',
21
- 'first_name',
22
- 'last_name',
23
- 'description',
24
- 'locale',
25
- 'community-events-location',
26
- ];
27
-
28
- if (isset($data['meta']) && count($data['meta'])) {
29
- foreach ($data['meta'] as $key => $value) {
30
- if (!in_array($key, $whitelist)) {
31
- unset($data['meta'][$key]);
32
- }
33
- }
34
- }
35
-
36
- // Remove session keys. Just in case.
37
- if (isset($meta) && isset($meta['session_tokens']) && count($meta['session_tokens'])) {
38
- foreach ($meta['session_tokens'] as $token) {
39
- foreach (unserialize($token) as $key => $tokenData) {
40
- $data['meta']['session_tokens'][] = $tokenData;
41
- }
42
- }
43
- }
44
-
45
- /*
46
- $blacklist = [
47
- 'use_ssl',
48
- 'show_admin_bar_front',
49
- 'wp_capabilities',
50
- 'wp_user_level',
51
- 'dismissed_wp_pointers',
52
- 'show_welcome_panel',
53
- 'wp_dashboard_quick_press_last_post_id',
54
- 'wp_user-settings',
55
- 'wp_user-settings-time',
56
- 'closedpostboxes_page',
57
- 'metaboxhidden_page',
58
- 'session_tokens',
59
- 'managenav-menuscolumnshidden',
60
- 'metaboxhidden_nav-menus',
61
- 'nav_menu_recently_edited',
62
- 'acf_user_settings',
63
- ];
64
-
65
- // Blacklist some data
66
- if (isset($data['meta']) && count($data['meta'])) {
67
- foreach ($data['meta'] as $key => $value) {
68
- if (in_array($key, $blacklist)) {
69
- unset($data['meta'][$key]);
70
- }
71
- }
72
-
73
- $data['meta'] = array_diff_assoc($data['meta'], $blacklist);
74
- }
75
- */
76
-
77
- return apply_filters('gdpr/wordpress-user/export/data', $data);
78
- }
79
-
80
- public function deleteUser(DataSubject $dataSubject, $reassign = null)
81
- {
82
- require_once(ABSPATH . 'wp-admin/includes/user.php');
83
-
84
- $reassignOption = gdpr('options')->get('delete_action_reassign');
85
- if ('reassign' === $reassignOption) {
86
- $reassignUserId = gdpr('options')->get('delete_action_reassign_user');
87
- } else {
88
- $reassignUserId = false;
89
- }
90
-
91
- wp_delete_user($dataSubject->getUserId(), $reassignUserId);
92
- }
93
-
94
- public function anonymizeUser(DataSubject $dataSubject, $anonymizedId)
95
- {
96
- if (!$dataSubject->hasUser()) {
97
- return;
98
- }
99
-
100
- if (!$anonymizedId) {
101
- gdpr('helpers')->error();
102
- }
103
-
104
- // Save a unique identifier to tie anonymized data together for analytics purposes
105
- update_user_meta($dataSubject->getUserId(), "gdpr_anonymized_id", $anonymizedId);
106
-
107
- // Change username
108
- global $wpdb;
109
-
110
- $anonymizedUsername = apply_filters('gdpr/wordpress-user/anonymize/username', '[anonymous]');
111
- $wpdb->update(
112
- $wpdb->users,
113
- ['user_login' => $anonymizedUsername],
114
- ['ID' => $dataSubject->getUserId()]
115
- );
116
-
117
- // Clear all relevant user fields, reset password
118
- wp_update_user([
119
- 'ID' => $dataSubject->getUserId(),
120
- 'user_email' => '',
121
- 'user_nicename' => '',
122
- 'user_url' => '',
123
- 'user_activation_key' => '',
124
- 'display_name' => $anonymizedUsername,
125
- // Set a random password, just in case the functionality that disallows users from logging in should break for any reason
126
- 'user_pass' => wp_hash_password(wp_generate_password()),
127
- ]);
128
-
129
- // Clear all relevant usermeta fields
130
- delete_user_meta($dataSubject->getUserId(), 'first_name');
131
- delete_user_meta($dataSubject->getUserId(), 'last_name');
132
- delete_user_meta($dataSubject->getUserId(), 'nickname');
133
- delete_user_meta($dataSubject->getUserId(), 'description');
134
- delete_user_meta($dataSubject->getUserId(), 'session_tokens');
135
- delete_user_meta($dataSubject->getUserId(), 'community-events-location');
136
-
137
- // Remove all capabilities
138
- $user = $dataSubject->getUser();
139
- $user->remove_all_caps();
140
-
141
- // Finally, assign the 'anonymous' role to user
142
- if (apply_filters('gdpr/wordpress-user/anonymize/change_role', true) && get_role('anonymous')) {
143
-
144
- foreach ($user->roles as $role) {
145
- $user->remove_role($role);
146
- }
147
-
148
- $user->add_role('anonymous');
149
- }
150
- }
151
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\WordpressUser;
4
+
5
+ use Codelight\GDPR\DataSubject\DataSubject;
6
+
7
+ class DataManager
8
+ {
9
+ public function getData(DataSubject $dataSubject)
10
+ {
11
+ $user = $dataSubject->getUser();
12
+ if ($user) {
13
+ $meta = get_user_meta($user->ID);
14
+ $data['meta'] = $meta;
15
+ } else {
16
+ $data = [];
17
+ }
18
+
19
+ $whitelist = [
20
+ 'nickname',
21
+ 'first_name',
22
+ 'last_name',
23
+ 'description',
24
+ 'locale',
25
+ 'community-events-location',
26
+ ];
27
+
28
+ if (isset($data['meta']) && count($data['meta'])) {
29
+ foreach ($data['meta'] as $key => $value) {
30
+ if (!in_array($key, $whitelist)) {
31
+ unset($data['meta'][$key]);
32
+ }
33
+ }
34
+ }
35
+
36
+ // Remove session keys. Just in case.
37
+ if (isset($meta) && isset($meta['session_tokens']) && count($meta['session_tokens'])) {
38
+ foreach ($meta['session_tokens'] as $token) {
39
+ foreach (unserialize($token) as $key => $tokenData) {
40
+ $data['meta']['session_tokens'][] = $tokenData;
41
+ }
42
+ }
43
+ }
44
+
45
+ /*
46
+ $blacklist = [
47
+ 'use_ssl',
48
+ 'show_admin_bar_front',
49
+ 'wp_capabilities',
50
+ 'wp_user_level',
51
+ 'dismissed_wp_pointers',
52
+ 'show_welcome_panel',
53
+ 'wp_dashboard_quick_press_last_post_id',
54
+ 'wp_user-settings',
55
+ 'wp_user-settings-time',
56
+ 'closedpostboxes_page',
57
+ 'metaboxhidden_page',
58
+ 'session_tokens',
59
+ 'managenav-menuscolumnshidden',
60
+ 'metaboxhidden_nav-menus',
61
+ 'nav_menu_recently_edited',
62
+ 'acf_user_settings',
63
+ ];
64
+
65
+ // Blacklist some data
66
+ if (isset($data['meta']) && count($data['meta'])) {
67
+ foreach ($data['meta'] as $key => $value) {
68
+ if (in_array($key, $blacklist)) {
69
+ unset($data['meta'][$key]);
70
+ }
71
+ }
72
+
73
+ $data['meta'] = array_diff_assoc($data['meta'], $blacklist);
74
+ }
75
+ */
76
+
77
+ return apply_filters('gdpr/wordpress-user/export/data', $data);
78
+ }
79
+
80
+ public function deleteUser(DataSubject $dataSubject, $reassign = null)
81
+ {
82
+ require_once(ABSPATH . 'wp-admin/includes/user.php');
83
+
84
+ $reassignOption = gdpr('options')->get('delete_action_reassign');
85
+ if ('reassign' === $reassignOption) {
86
+ $reassignUserId = gdpr('options')->get('delete_action_reassign_user');
87
+ } else {
88
+ $reassignUserId = false;
89
+ }
90
+
91
+ wp_delete_user($dataSubject->getUserId(), $reassignUserId);
92
+ }
93
+
94
+ public function anonymizeUser(DataSubject $dataSubject, $anonymizedId)
95
+ {
96
+ if (!$dataSubject->hasUser()) {
97
+ return;
98
+ }
99
+
100
+ if (!$anonymizedId) {
101
+ gdpr('helpers')->error();
102
+ }
103
+
104
+ // Save a unique identifier to tie anonymized data together for analytics purposes
105
+ update_user_meta($dataSubject->getUserId(), "gdpr_anonymized_id", $anonymizedId);
106
+
107
+ // Change username
108
+ global $wpdb;
109
+
110
+ $anonymizedUsername = apply_filters('gdpr/wordpress-user/anonymize/username', '[anonymous]');
111
+ $wpdb->update(
112
+ $wpdb->users,
113
+ ['user_login' => $anonymizedUsername],
114
+ ['ID' => $dataSubject->getUserId()]
115
+ );
116
+
117
+ // Clear all relevant user fields, reset password
118
+ wp_update_user([
119
+ 'ID' => $dataSubject->getUserId(),
120
+ 'user_email' => '',
121
+ 'user_nicename' => '',
122
+ 'user_url' => '',
123
+ 'user_activation_key' => '',
124
+ 'display_name' => $anonymizedUsername,
125
+ // Set a random password, just in case the functionality that disallows users from logging in should break for any reason
126
+ 'user_pass' => wp_hash_password(wp_generate_password()),
127
+ ]);
128
+
129
+ // Clear all relevant usermeta fields
130
+ delete_user_meta($dataSubject->getUserId(), 'first_name');
131
+ delete_user_meta($dataSubject->getUserId(), 'last_name');
132
+ delete_user_meta($dataSubject->getUserId(), 'nickname');
133
+ delete_user_meta($dataSubject->getUserId(), 'description');
134
+ delete_user_meta($dataSubject->getUserId(), 'session_tokens');
135
+ delete_user_meta($dataSubject->getUserId(), 'community-events-location');
136
+
137
+ // Remove all capabilities
138
+ $user = $dataSubject->getUser();
139
+ $user->remove_all_caps();
140
+
141
+ // Finally, assign the 'anonymous' role to user
142
+ if (apply_filters('gdpr/wordpress-user/anonymize/change_role', true) && get_role('anonymous')) {
143
+
144
+ foreach ($user->roles as $role) {
145
+ $user->remove_role($role);
146
+ }
147
+
148
+ $user->add_role('anonymous');
149
+ }
150
+ }
151
+ }
src/Components/WordpressUser/RegistrationForm.php CHANGED
@@ -1,50 +1,50 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\WordpressUser;
4
-
5
- use Codelight\GDPR\DataSubject\DataSubjectManager;
6
-
7
- class RegistrationForm
8
- {
9
- /* @var DataSubjectManager */
10
- protected $dataSubjectManager;
11
-
12
- public function __construct(DataSubjectManager $dataSubjectManager)
13
- {
14
- $this->dataSubjectManager = $dataSubjectManager;
15
-
16
- if (gdpr('options')->get('policy_page')) {
17
- add_action('register_form', [$this, 'addRegisterFormCheckbox']);
18
- add_filter('registration_errors', [$this, 'validate'], PHP_INT_MAX);
19
- }
20
- }
21
-
22
- public function addRegisterFormCheckbox()
23
- {
24
- $privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
25
- $termsPage = gdpr('options')->get('terms_page');
26
-
27
- if ($termsPage) {
28
- $termsUrl = get_permalink($termsPage);
29
- } else {
30
- $termsUrl = false;
31
- }
32
-
33
- echo gdpr('view')->render(
34
- 'modules/wordpress-user/registration-terms-checkbox',
35
- compact('privacyPolicyUrl', 'termsUrl')
36
- );
37
- }
38
-
39
- public function validate(\WP_Error $errors)
40
- {
41
- if (empty($_POST['gdpr_terms']) || !$_POST['gdpr_terms']) {
42
- $errors->add('gdpr_error', __('<strong>ERROR</strong>: You must accept the terms and conditions.', 'gdpr-framework'));
43
- } else {
44
- $dataSubject = $this->dataSubjectManager->getByEmail($_POST['user_email']);
45
- $dataSubject->giveConsent('privacy-policy');
46
- }
47
-
48
- return $errors;
49
- }
50
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\WordpressUser;
4
+
5
+ use Codelight\GDPR\DataSubject\DataSubjectManager;
6
+
7
+ class RegistrationForm
8
+ {
9
+ /* @var DataSubjectManager */
10
+ protected $dataSubjectManager;
11
+
12
+ public function __construct(DataSubjectManager $dataSubjectManager)
13
+ {
14
+ $this->dataSubjectManager = $dataSubjectManager;
15
+
16
+ if (gdpr('options')->get('policy_page')) {
17
+ add_action('register_form', [$this, 'addRegisterFormCheckbox']);
18
+ add_filter('registration_errors', [$this, 'validate'], PHP_INT_MAX);
19
+ }
20
+ }
21
+
22
+ public function addRegisterFormCheckbox()
23
+ {
24
+ $privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
25
+ $termsPage = gdpr('options')->get('terms_page');
26
+
27
+ if ($termsPage) {
28
+ $termsUrl = get_permalink($termsPage);
29
+ } else {
30
+ $termsUrl = false;
31
+ }
32
+
33
+ echo gdpr('view')->render(
34
+ 'modules/wordpress-user/registration-terms-checkbox',
35
+ compact('privacyPolicyUrl', 'termsUrl')
36
+ );
37
+ }
38
+
39
+ public function validate(\WP_Error $errors)
40
+ {
41
+ if (empty($_POST['gdpr_terms']) || !$_POST['gdpr_terms']) {
42
+ $errors->add('gdpr_error', __('<strong>ERROR</strong>: You must accept the terms and conditions.', 'gdpr-framework'));
43
+ } else {
44
+ $dataSubject = $this->dataSubjectManager->getByEmail($_POST['user_email']);
45
+ $dataSubject->giveConsent('privacy-policy');
46
+ }
47
+
48
+ return $errors;
49
+ }
50
+ }
src/Components/WordpressUser/WordpressUser.php CHANGED
@@ -1,111 +1,111 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Components\WordpressUser;
4
-
5
- use Codelight\GDPR\DataSubject\DataSubjectManager;
6
- use Codelight\GDPR\Components\WordpressUser\Controllers\DashboardDataPageController;
7
- use Codelight\GDPR\Components\WordpressUser\Controllers\DashboardProfilePageController;
8
-
9
- /**
10
- * Handles everything related to a WordPress user account
11
- *
12
- * Class WordpressUser
13
- *
14
- * @package Codelight\GDPR\Modules\WordpressUser
15
- */
16
- class WordpressUser
17
- {
18
- /* @var string */
19
- protected $name = 'wordpress-user';
20
-
21
- /* @var DataManager */
22
- protected $dataManager;
23
-
24
- /* @var DataSubjectManager */
25
- protected $dataSubjectManager;
26
-
27
- /**
28
- * WordpressUser constructor.
29
- *
30
- * @param DataSubjectManager $dataSubjectManager
31
- * @param DataManager $dataManager
32
- */
33
- public function __construct(DataSubjectManager $dataSubjectManager, DataManager $dataManager)
34
- {
35
- $this->dataSubjectManager = $dataSubjectManager;
36
- $this->dataManager = $dataManager;
37
-
38
- gdpr()->make(DashboardProfilePageController::class);
39
- gdpr()->make(RegistrationForm::class);
40
-
41
- if (gdpr('options')->get('enable')) {
42
- gdpr()->make(DashboardDataPageController::class);
43
-
44
- // Register Privacy Tools page in admin
45
- add_action('admin_menu', [$this, 'registerDashboardDataPage']);
46
- }
47
-
48
- // Register render action on Profile edit page
49
- add_action('show_user_profile', [$this, 'triggerProfileRenderAction'], PHP_INT_MAX);
50
- add_action('edit_user_profile', [$this, 'triggerProfileRenderAction'], PHP_INT_MAX);
51
-
52
- add_filter('gdpr/data-subject/data', [$this, 'getExportData'], 1, 2);
53
- add_action('gdpr/data-subject/delete', [$this, 'deleteUser'], 100);
54
- add_action('gdpr/data-subject/anonymize', [$this, 'anonymizeUser'], 100, 2);
55
- }
56
-
57
- /**
58
- * Register Privacy Tools dashboard page under Users
59
- */
60
- public function registerDashboardDataPage()
61
- {
62
- add_users_page(
63
- _x('Privacy Tools', '(Admin)', 'gdpr-framework'),
64
- _x('Privacy Tools', '(Admin)', 'gdpr-framework'),
65
- 'read',
66
- 'gdpr-profile',
67
- [$this, 'renderDashboardDataPage']
68
- );
69
- }
70
-
71
- /**
72
- * Render the contents of Privacy Tools dashboard page
73
- */
74
- public function renderDashboardDataPage()
75
- {
76
- $dataSubject = $this->dataSubjectManager->getByLoggedInUser();
77
-
78
- if ($dataSubject) {
79
- do_action('gdpr/dashboard/privacy-tools/content', $dataSubject);
80
- }
81
- }
82
-
83
- /**
84
- * On profile page, trigger an action with the same format as the Router provides
85
- * so that we have consistency with the rest of the hooks.
86
- */
87
- public function triggerProfileRenderAction(\WP_User $user)
88
- {
89
- if (current_user_can('edit_users') || current_user_can('delete_users')) {
90
- $dataSubject = $this->dataSubjectManager->getByEmail($user->user_email);
91
- do_action("gdpr/dashboard/profile-page/content", $dataSubject);
92
- }
93
- }
94
-
95
- public function getExportData($data, $email)
96
- {
97
- return $data + $this->dataManager->getData($this->dataSubjectManager->getByEmail($email));
98
- }
99
-
100
- public function deleteUser($email)
101
- {
102
- $dataSubject = $this->dataSubjectManager->getByEmail($email);
103
- $this->dataManager->deleteUser($dataSubject);
104
- }
105
-
106
- public function anonymizeUser($email, $anonymizedId)
107
- {
108
- $dataSubject = $this->dataSubjectManager->getByEmail($email);
109
- $this->dataManager->anonymizeUser($dataSubject, $anonymizedId);
110
- }
111
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Components\WordpressUser;
4
+
5
+ use Codelight\GDPR\DataSubject\DataSubjectManager;
6
+ use Codelight\GDPR\Components\WordpressUser\Controllers\DashboardDataPageController;
7
+ use Codelight\GDPR\Components\WordpressUser\Controllers\DashboardProfilePageController;
8
+
9
+ /**
10
+ * Handles everything related to a WordPress user account
11
+ *
12
+ * Class WordpressUser
13
+ *
14
+ * @package Codelight\GDPR\Modules\WordpressUser
15
+ */
16
+ class WordpressUser
17
+ {
18
+ /* @var string */
19
+ protected $name = 'wordpress-user';
20
+
21
+ /* @var DataManager */
22
+ protected $dataManager;
23
+
24
+ /* @var DataSubjectManager */
25
+ protected $dataSubjectManager;
26
+
27
+ /**
28
+ * WordpressUser constructor.
29
+ *
30
+ * @param DataSubjectManager $dataSubjectManager
31
+ * @param DataManager $dataManager
32
+ */
33
+ public function __construct(DataSubjectManager $dataSubjectManager, DataManager $dataManager)
34
+ {
35
+ $this->dataSubjectManager = $dataSubjectManager;
36
+ $this->dataManager = $dataManager;
37
+
38
+ gdpr()->make(DashboardProfilePageController::class);
39
+ gdpr()->make(RegistrationForm::class);
40
+
41
+ if (gdpr('options')->get('enable')) {
42
+ gdpr()->make(DashboardDataPageController::class);
43
+
44
+ // Register Privacy Tools page in admin
45
+ add_action('admin_menu', [$this, 'registerDashboardDataPage']);
46
+ }
47
+
48
+ // Register render action on Profile edit page
49
+ add_action('show_user_profile', [$this, 'triggerProfileRenderAction'], PHP_INT_MAX);
50
+ add_action('edit_user_profile', [$this, 'triggerProfileRenderAction'], PHP_INT_MAX);
51
+
52
+ add_filter('gdpr/data-subject/data', [$this, 'getExportData'], 1, 2);
53
+ add_action('gdpr/data-subject/delete', [$this, 'deleteUser'], 100);
54
+ add_action('gdpr/data-subject/anonymize', [$this, 'anonymizeUser'], 100, 2);
55
+ }
56
+
57
+ /**
58
+ * Register Privacy Tools dashboard page under Users
59
+ */
60
+ public function registerDashboardDataPage()
61
+ {
62
+ add_users_page(
63
+ _x('Privacy Tools', '(Admin)', 'gdpr-framework'),
64
+ _x('Privacy Tools', '(Admin)', 'gdpr-framework'),
65
+ 'read',
66
+ 'gdpr-profile',
67
+ [$this, 'renderDashboardDataPage']
68
+ );
69
+ }
70
+
71
+ /**
72
+ * Render the contents of Privacy Tools dashboard page
73
+ */
74
+ public function renderDashboardDataPage()
75
+ {
76
+ $dataSubject = $this->dataSubjectManager->getByLoggedInUser();
77
+
78
+ if ($dataSubject) {
79
+ do_action('gdpr/dashboard/privacy-tools/content', $dataSubject);
80
+ }
81
+ }
82
+
83
+ /**
84
+ * On profile page, trigger an action with the same format as the Router provides
85
+ * so that we have consistency with the rest of the hooks.
86
+ */
87
+ public function triggerProfileRenderAction(\WP_User $user)
88
+ {
89
+ if (current_user_can('edit_users') || current_user_can('delete_users')) {
90
+ $dataSubject = $this->dataSubjectManager->getByEmail($user->user_email);
91
+ do_action("gdpr/dashboard/profile-page/content", $dataSubject);
92
+ }
93
+ }
94
+
95
+ public function getExportData($data, $email)
96
+ {
97
+ return $data + $this->dataManager->getData($this->dataSubjectManager->getByEmail($email));
98
+ }
99
+
100
+ public function deleteUser($email)
101
+ {
102
+ $dataSubject = $this->dataSubjectManager->getByEmail($email);
103
+ $this->dataManager->deleteUser($dataSubject);
104
+ }
105
+
106
+ public function anonymizeUser($email, $anonymizedId)
107
+ {
108
+ $dataSubject = $this->dataSubjectManager->getByEmail($email);
109
+ $this->dataManager->anonymizeUser($dataSubject, $anonymizedId);
110
+ }
111
+ }
src/DataSubject/AdminTabDataSubject.php CHANGED
@@ -1,126 +1,126 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\DataSubject;
4
-
5
- use Codelight\GDPR\Admin\AdminTab;
6
-
7
- /**
8
- * Class AdminTabDataSubject
9
- *
10
- * @package Codelight\GDPR\DataSubject
11
- */
12
- class AdminTabDataSubject extends AdminTab
13
- {
14
- /* @var string */
15
- protected $slug = 'data-subject';
16
-
17
- /* @var DataSubjectManager */
18
- protected $dataSubjectManager;
19
-
20
- /**
21
- * AdminTabDataSubject constructor.
22
- *
23
- * @param DataSubjectManager $dataSubjectManager
24
- */
25
- public function __construct(DataSubjectManager $dataSubjectManager)
26
- {
27
- $this->title = _x('Data Subjects', '(Admin)', 'gdpr-framework');
28
- $this->dataSubjectManager = $dataSubjectManager;
29
-
30
- // Workaround to allow this page to be submitted
31
- $this->registerSetting('gdpr_email');
32
-
33
- // Register handler for this action
34
- add_action('gdpr/admin/action/search', [$this, 'searchRedirect']);
35
- }
36
-
37
- public function init()
38
- {
39
- $this->registerSettingSection(
40
- 'gdpr-section-data-subjects',
41
- _x('Data Subjects', '(Admin)', 'gdpr-framework'),
42
- [$this, 'renderTab']
43
- );
44
- }
45
-
46
- public function renderTab()
47
- {
48
- if (isset($_GET['search']) && $_GET['search']) {
49
- $results = $this->getRenderedResults($_GET['search'], $this->dataSubjectManager->getByEmail($_GET['search']));
50
- } else {
51
- $results = '';
52
- }
53
-
54
- $nonce = wp_create_nonce('gdpr/admin/action/search');
55
- echo gdpr('view')->render(
56
- 'admin/data-subjects/search-form',
57
- compact('nonce', 'results', 'exportUrl', 'deleteUrl')
58
- );
59
- }
60
-
61
- public function getRenderedResults($email, DataSubject $dataSubject)
62
- {
63
- $hasData = $dataSubject->hasData();
64
- $links = [];
65
-
66
- if ($hasData) {
67
- if ($dataSubject->getUserId()) {
68
- $userName = get_userdata($dataSubject->getUserId())->user_login;
69
- $links['profile'] = get_edit_user_link($dataSubject->getUserId());
70
- $adminCap = user_can($dataSubject->getUserId(), 'manage_options');
71
-
72
- } else {
73
- $userName = false;
74
- $adminCap = false;
75
- }
76
-
77
- /**
78
- * TODO: these actions are currently triggered in DashboardProfilePageController
79
- * Should replace this with a generic AdminController!
80
- * Also consider namespacing gdpr_action in this case, i.e. profile/delete vs data-subject-tab/delete
81
- */
82
- $links['view'] = add_query_arg([
83
- 'gdpr_action' => 'export',
84
- 'gdpr_format' => 'html',
85
- 'gdpr_email' => $_GET['search'],
86
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
87
- ]);
88
-
89
- $links['export'] = add_query_arg([
90
- 'gdpr_action' => 'export',
91
- 'gdpr_format' => 'json',
92
- 'gdpr_email' => $_GET['search'],
93
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
94
- ]);
95
-
96
- $links['anonymize'] = add_query_arg([
97
- 'gdpr_email' => $_GET['search'],
98
- 'gdpr_action' => 'forget',
99
- 'gdpr_force_action' => 'anonymize',
100
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
101
- ]);
102
-
103
- $links['delete'] = add_query_arg([
104
- 'gdpr_email' => $_GET['search'],
105
- 'gdpr_action' => 'forget',
106
- 'gdpr_force_action' => 'delete',
107
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
108
- ]);
109
- }
110
-
111
- return gdpr('view')->render('admin/data-subjects/search-results', compact('email', 'hasData', 'links', 'userName', 'adminCap'));
112
- }
113
-
114
- public function renderSubmitButton()
115
- {
116
- // Intentionally left blank
117
- }
118
-
119
- public function searchRedirect()
120
- {
121
- if (isset($_POST['gdpr_email']) && $_POST['gdpr_email']) {
122
- wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $_POST['gdpr_email']));
123
- exit;
124
- }
125
- }
126
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\DataSubject;
4
+
5
+ use Codelight\GDPR\Admin\AdminTab;
6
+
7
+ /**
8
+ * Class AdminTabDataSubject
9
+ *
10
+ * @package Codelight\GDPR\DataSubject
11
+ */
12
+ class AdminTabDataSubject extends AdminTab
13
+ {
14
+ /* @var string */
15
+ protected $slug = 'data-subject';
16
+
17
+ /* @var DataSubjectManager */
18
+ protected $dataSubjectManager;
19
+
20
+ /**
21
+ * AdminTabDataSubject constructor.
22
+ *
23
+ * @param DataSubjectManager $dataSubjectManager
24
+ */
25
+ public function __construct(DataSubjectManager $dataSubjectManager)
26
+ {
27
+ $this->title = _x('Data Subjects', '(Admin)', 'gdpr-framework');
28
+ $this->dataSubjectManager = $dataSubjectManager;
29
+
30
+ // Workaround to allow this page to be submitted
31
+ $this->registerSetting('gdpr_email');
32
+
33
+ // Register handler for this action
34
+ add_action('gdpr/admin/action/search', [$this, 'searchRedirect']);
35
+ }
36
+
37
+ public function init()
38
+ {
39
+ $this->registerSettingSection(
40
+ 'gdpr-section-data-subjects',
41
+ _x('Data Subjects', '(Admin)', 'gdpr-framework'),
42
+ [$this, 'renderTab']
43
+ );
44
+ }
45
+
46
+ public function renderTab()
47
+ {
48
+ if (isset($_GET['search']) && $_GET['search']) {
49
+ $results = $this->getRenderedResults($_GET['search'], $this->dataSubjectManager->getByEmail($_GET['search']));
50
+ } else {
51
+ $results = '';
52
+ }
53
+
54
+ $nonce = wp_create_nonce('gdpr/admin/action/search');
55
+ echo gdpr('view')->render(
56
+ 'admin/data-subjects/search-form',
57
+ compact('nonce', 'results', 'exportUrl', 'deleteUrl')
58
+ );
59
+ }
60
+
61
+ public function getRenderedResults($email, DataSubject $dataSubject)
62
+ {
63
+ $hasData = $dataSubject->hasData();
64
+ $links = [];
65
+
66
+ if ($hasData) {
67
+ if ($dataSubject->getUserId()) {
68
+ $userName = get_userdata($dataSubject->getUserId())->user_login;
69
+ $links['profile'] = get_edit_user_link($dataSubject->getUserId());
70
+ $adminCap = user_can($dataSubject->getUserId(), 'manage_options');
71
+
72
+ } else {
73
+ $userName = false;
74
+ $adminCap = false;
75
+ }
76
+
77
+ /**
78
+ * TODO: these actions are currently triggered in DashboardProfilePageController
79
+ * Should replace this with a generic AdminController!
80
+ * Also consider namespacing gdpr_action in this case, i.e. profile/delete vs data-subject-tab/delete
81
+ */
82
+ $links['view'] = add_query_arg([
83
+ 'gdpr_action' => 'export',
84
+ 'gdpr_format' => 'html',
85
+ 'gdpr_email' => $_GET['search'],
86
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
87
+ ]);
88
+
89
+ $links['export'] = add_query_arg([
90
+ 'gdpr_action' => 'export',
91
+ 'gdpr_format' => 'json',
92
+ 'gdpr_email' => $_GET['search'],
93
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/export"),
94
+ ]);
95
+
96
+ $links['anonymize'] = add_query_arg([
97
+ 'gdpr_email' => $_GET['search'],
98
+ 'gdpr_action' => 'forget',
99
+ 'gdpr_force_action' => 'anonymize',
100
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
101
+ ]);
102
+
103
+ $links['delete'] = add_query_arg([
104
+ 'gdpr_email' => $_GET['search'],
105
+ 'gdpr_action' => 'forget',
106
+ 'gdpr_force_action' => 'delete',
107
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/forget"),
108
+ ]);
109
+ }
110
+
111
+ return gdpr('view')->render('admin/data-subjects/search-results', compact('email', 'hasData', 'links', 'userName', 'adminCap'));
112
+ }
113
+
114
+ public function renderSubmitButton()
115
+ {
116
+ // Intentionally left blank
117
+ }
118
+
119
+ public function searchRedirect()
120
+ {
121
+ if (isset($_POST['gdpr_email']) && $_POST['gdpr_email']) {
122
+ wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $_POST['gdpr_email']));
123
+ exit;
124
+ }
125
+ }
126
+ }
src/DataSubject/DataExporter.php CHANGED
@@ -1,138 +1,138 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\DataSubject;
4
-
5
- /**
6
- * Handle formatting and downloading data subject's data.
7
- *
8
- * Class DataManager
9
- *
10
- * @package Codelight\GDPR\DataSubject
11
- */
12
- class DataExporter
13
- {
14
- public function export(array $data, DataSubject $dataSubject, $format = 'html')
15
- {
16
- $data = $this->maybeUnserialize($data);
17
-
18
- do_action('gdpr/export', $data, $dataSubject->getEmail(), $dataSubject, $format);
19
-
20
- if ('html' === $format) {
21
- $this->downloadHTML($data, $dataSubject);
22
- } elseif ('json' === $format) {
23
- $this->downloadJSON($data, $dataSubject);
24
- }
25
- }
26
-
27
- /**
28
- * Download a data subject's data in human-readable format,
29
- * formatted as a table in an HTML document unless overridden.
30
- *
31
- * @param array $data
32
- * @param DataSubject $dataSubject
33
- */
34
- protected function downloadHTML(array $data, DataSubject $dataSubject)
35
- {
36
- // Allow extensions to send a different response
37
- do_action('gdpr/export/html', $data, $dataSubject->getEmail(), $dataSubject);
38
-
39
- $filename = 'data_' . date("Y-m-d_H:i:s") . '.html';
40
-
41
- // By default, send a downloadable HTML file
42
- header("Pragma: public");
43
- header("Expires: 0");
44
- header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
45
- header("Cache-Control: private", false);
46
- header("Content-Type: text/html");
47
- header("Content-Disposition: attachment; filename=\"{$filename}\";");
48
- header("Content-Transfer-Encoding: binary");
49
-
50
- echo $this->getHtmlData($data);
51
- exit;
52
- }
53
-
54
- /**
55
- * Download a data subject's data in machine-readable format,
56
- * formatted as JSON unless overridden.
57
- *
58
- * @param array $data
59
- * @param DataSubject $dataSubject
60
- */
61
- protected function downloadJSON(array $data, DataSubject $dataSubject)
62
- {
63
- // Allow extensions to send a different response
64
- do_action('gdpr/export/json', $data, $dataSubject->getEmail(), $dataSubject);
65
-
66
- $filename = 'data_' . date("Y-m-d_H:i:s") . '.json';
67
-
68
- // By default, encode to JSON and send a JSON response
69
- header("Pragma: public");
70
- header("Expires: 0");
71
- header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
72
- header("Cache-Control: private", false);
73
- header("Content-Type: application/json");
74
- header("Content-Disposition: attachment; filename=\"{$filename}\";");
75
- header("Content-Transfer-Encoding: binary");
76
-
77
- wp_send_json($data);
78
- }
79
-
80
- protected function getHtmlData($data)
81
- {
82
- $table = $this->formatAsTable($this->maybeUnserialize($data));
83
- return gdpr('view')->render('global/html-data', compact('table'));
84
- }
85
-
86
- protected function formatAsTable(array $data, $level = 0)
87
- {
88
- $output = "<table class='level-{$level}'>";
89
- foreach ($data as $key => $value) {
90
- $output .= "<tr>";
91
-
92
- // Output key
93
- $output .= "<td class='key'>";
94
- $output .= esc_html($key);
95
- $output .= "</td>";
96
-
97
- // Output value
98
- $output .= "<td class='value'>";
99
-
100
- // Account for arrays with just one item, such as usermeta
101
- if (is_array($value) && 1 === count($value)) {
102
- $value = $value[0];
103
- }
104
-
105
- // In case of arrays, recurse
106
- if (is_array($value)) {
107
- $output .= $this->formatAsTable($value, ($level + 1));
108
- } else {
109
- $output .= esc_html($value);
110
- }
111
- $output .= "</td>";
112
-
113
- $output .= "</tr>";
114
- }
115
-
116
- $output .= "</table>";
117
- return $output;
118
- }
119
-
120
- /**
121
- * Recursively maybe unserialize data
122
- *
123
- * @param array $data
124
- * @return array
125
- */
126
- protected function maybeUnserialize(array $data)
127
- {
128
- foreach ($data as &$datum) {
129
- if (is_array($datum)) {
130
- $datum = $this->maybeUnserialize($datum);
131
- } else {
132
- $datum = maybe_unserialize($datum);
133
- }
134
- }
135
-
136
- return $data;
137
- }
138
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\DataSubject;
4
+
5
+ /**
6
+ * Handle formatting and downloading data subject's data.
7
+ *
8
+ * Class DataManager
9
+ *
10
+ * @package Codelight\GDPR\DataSubject
11
+ */
12
+ class DataExporter
13
+ {
14
+ public function export(array $data, DataSubject $dataSubject, $format = 'html')
15
+ {
16
+ $data = $this->maybeUnserialize($data);
17
+
18
+ do_action('gdpr/export', $data, $dataSubject->getEmail(), $dataSubject, $format);
19
+
20
+ if ('html' === $format) {
21
+ $this->downloadHTML($data, $dataSubject);
22
+ } elseif ('json' === $format) {
23
+ $this->downloadJSON($data, $dataSubject);
24
+ }
25
+ }
26
+
27
+ /**
28
+ * Download a data subject's data in human-readable format,
29
+ * formatted as a table in an HTML document unless overridden.
30
+ *
31
+ * @param array $data
32
+ * @param DataSubject $dataSubject
33
+ */
34
+ protected function downloadHTML(array $data, DataSubject $dataSubject)
35
+ {
36
+ // Allow extensions to send a different response
37
+ do_action('gdpr/export/html', $data, $dataSubject->getEmail(), $dataSubject);
38
+
39
+ $filename = 'data_' . date("Y-m-d_H:i:s") . '.html';
40
+
41
+ // By default, send a downloadable HTML file
42
+ header("Pragma: public");
43
+ header("Expires: 0");
44
+ header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
45
+ header("Cache-Control: private", false);
46
+ header("Content-Type: text/html");
47
+ header("Content-Disposition: attachment; filename=\"{$filename}\";");
48
+ header("Content-Transfer-Encoding: binary");
49
+
50
+ echo $this->getHtmlData($data);
51
+ exit;
52
+ }
53
+
54
+ /**
55
+ * Download a data subject's data in machine-readable format,
56
+ * formatted as JSON unless overridden.
57
+ *
58
+ * @param array $data
59
+ * @param DataSubject $dataSubject
60
+ */
61
+ protected function downloadJSON(array $data, DataSubject $dataSubject)
62
+ {
63
+ // Allow extensions to send a different response
64
+ do_action('gdpr/export/json', $data, $dataSubject->getEmail(), $dataSubject);
65
+
66
+ $filename = 'data_' . date("Y-m-d_H:i:s") . '.json';
67
+
68
+ // By default, encode to JSON and send a JSON response
69
+ header("Pragma: public");
70
+ header("Expires: 0");
71
+ header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
72
+ header("Cache-Control: private", false);
73
+ header("Content-Type: application/json");
74
+ header("Content-Disposition: attachment; filename=\"{$filename}\";");
75
+ header("Content-Transfer-Encoding: binary");
76
+
77
+ wp_send_json($data);
78
+ }
79
+
80
+ protected function getHtmlData($data)
81
+ {
82
+ $table = $this->formatAsTable($this->maybeUnserialize($data));
83
+ return gdpr('view')->render('global/html-data', compact('table'));
84
+ }
85
+
86
+ protected function formatAsTable(array $data, $level = 0)
87
+ {
88
+ $output = "<table class='level-{$level}'>";
89
+ foreach ($data as $key => $value) {
90
+ $output .= "<tr>";
91
+
92
+ // Output key
93
+ $output .= "<td class='key'>";
94
+ $output .= esc_html($key);
95
+ $output .= "</td>";
96
+
97
+ // Output value
98
+ $output .= "<td class='value'>";
99
+
100
+ // Account for arrays with just one item, such as usermeta
101
+ if (is_array($value) && 1 === count($value)) {
102
+ $value = $value[0];
103
+ }
104
+
105
+ // In case of arrays, recurse
106
+ if (is_array($value)) {
107
+ $output .= $this->formatAsTable($value, ($level + 1));
108
+ } else {
109
+ $output .= esc_html($value);
110
+ }
111
+ $output .= "</td>";
112
+
113
+ $output .= "</tr>";
114
+ }
115
+
116
+ $output .= "</table>";
117
+ return $output;
118
+ }
119
+
120
+ /**
121
+ * Recursively maybe unserialize data
122
+ *
123
+ * @param array $data
124
+ * @return array
125
+ */
126
+ protected function maybeUnserialize(array $data)
127
+ {
128
+ foreach ($data as &$datum) {
129
+ if (is_array($datum)) {
130
+ $datum = $this->maybeUnserialize($datum);
131
+ } else {
132
+ $datum = maybe_unserialize($datum);
133
+ }
134
+ }
135
+
136
+ return $data;
137
+ }
138
+ }
src/DataSubject/DataRepository.php CHANGED
@@ -1,191 +1,191 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\DataSubject;
4
-
5
- /**
6
- * Class DataRepository
7
- *
8
- * @package Codelight\GDPR\DataSubject
9
- */
10
- class DataRepository
11
- {
12
- /**
13
- * DataRepository constructor.
14
- *
15
- * @param $email
16
- */
17
- public function __construct($email)
18
- {
19
- $this->email = $email;
20
- }
21
-
22
- /**
23
- * Export all stored data. Triggers 'gdpr/data-subject/data' filter.
24
- */
25
- public function getData($email)
26
- {
27
- return apply_filters('gdpr/data-subject/data', [], $email);
28
- }
29
-
30
- /**
31
- * Trigger the configured 'export' action
32
- *
33
- * @param $email
34
- * @return array|null
35
- */
36
- public function export($email, $format, $force = false)
37
- {
38
- $action = gdpr('options')->get('export_action');
39
- $data = null;
40
-
41
- if ($force) {
42
- $action = 'download';
43
- }
44
-
45
- switch($action) {
46
- case 'download':
47
- $data = $this->getData($email);
48
- break;
49
- case 'download_and_notify':
50
- $data = $this->getData($email);
51
- $this->notifyExportAction($email, $format);
52
- break;
53
- case 'notify':
54
- $this->notifyExportRequest($email, $format);
55
- break;
56
- default:
57
- $this->notifyExportRequest($email, $format);
58
- break;
59
- }
60
-
61
- return $data;
62
- }
63
-
64
- /**
65
- * Trigger the configured 'forget' action
66
- *
67
- * @param $email
68
- *
69
- * @return bool
70
- */
71
- public function forget($email, $forceAction = null)
72
- {
73
- $action = gdpr('options')->get('delete_action');
74
-
75
- if ($forceAction) {
76
- $action = $forceAction;
77
- }
78
-
79
- switch($action) {
80
- case 'delete':
81
- $this->delete($email);
82
- return true;
83
- case 'delete_and_notify':
84
- $userId = $this->delete($email);
85
- $this->notifyForgetAction($email, $userId);
86
- return true;
87
- case 'anonymize':
88
- $this->anonymize($email);
89
- return true;
90
- case 'anonymize_and_notify':
91
- $userId = $this->anonymize($email);
92
- $this->notifyForgetAction($email, $userId);
93
- return true;
94
- case 'notify':
95
- $this->notifyForgetRequest($email);
96
- return false;
97
- default:
98
- $this->notifyForgetRequest($email);
99
- return false;
100
- }
101
- }
102
-
103
- /**
104
- * @param $email
105
- */
106
- protected function anonymize($email)
107
- {
108
- $userId = null;
109
-
110
- if (email_exists($email)) {
111
- $userId = get_user_by('email', $email)->ID;
112
- }
113
-
114
- $anonymizedId = wp_generate_password(12, false);
115
- do_action('gdpr/data-subject/anonymize', $email, $anonymizedId, $userId);
116
-
117
- return $userId;
118
- }
119
-
120
- /**
121
- * @param $email
122
- */
123
- protected function delete($email)
124
- {
125
- $userId = null;
126
-
127
- if (email_exists($email)) {
128
- $userId = get_user_by('email', $email)->ID;
129
- }
130
-
131
- do_action('gdpr/data-subject/delete', $email, $userId);
132
-
133
- return $userId;
134
- }
135
-
136
- /**
137
- * @param $email
138
- */
139
- protected function notifyExportAction($email, $format)
140
- {
141
- gdpr('helpers')->mail(
142
- gdpr('options')->get('export_action_email'),
143
- __("Data exported", 'gdpr-framework'),
144
- gdpr('view')->render('email/action-export', compact('email', 'format')),
145
- ['Content-Type: text/html; charset=UTF-8']
146
- );
147
- }
148
-
149
- /**
150
- * @param $email
151
- */
152
- protected function notifyExportRequest($email, $format)
153
- {
154
- $adminTabLink = esc_url(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $email));
155
-
156
- gdpr('helpers')->mail(
157
- gdpr('options')->get('export_action_email'),
158
- __("Data export request", 'gdpr-framework'),
159
- gdpr('view')->render('email/request-export', compact('email', 'format', 'adminTabLink')),
160
- ['Content-Type: text/html; charset=UTF-8']
161
- );
162
- }
163
-
164
- /**
165
- * @param $email
166
- */
167
- protected function notifyForgetAction($email, $userId = null)
168
- {
169
- gdpr('helpers')->mail(
170
- gdpr('options')->get('delete_action_email'),
171
- __("Data removed", 'gdpr-framework'),
172
- gdpr('view')->render('email/action-forget', compact('email', 'userId')),
173
- ['Content-Type: text/html; charset=UTF-8']
174
- );
175
- }
176
-
177
- /**
178
- * @param $email
179
- */
180
- protected function notifyForgetRequest($email)
181
- {
182
- $adminTabLink = esc_url(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $email));
183
-
184
- gdpr('helpers')->mail(
185
- gdpr('options')->get('delete_action_email'),
186
- __("Data removal request", 'gdpr-framework'),
187
- gdpr('view')->render('email/request-forget', compact('email', 'adminTabLink')),
188
- ['Content-Type: text/html; charset=UTF-8']
189
- );
190
- }
191
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\DataSubject;
4
+
5
+ /**
6
+ * Class DataRepository
7
+ *
8
+ * @package Codelight\GDPR\DataSubject
9
+ */
10
+ class DataRepository
11
+ {
12
+ /**
13
+ * DataRepository constructor.
14
+ *
15
+ * @param $email
16
+ */
17
+ public function __construct($email)
18
+ {
19
+ $this->email = $email;
20
+ }
21
+
22
+ /**
23
+ * Export all stored data. Triggers 'gdpr/data-subject/data' filter.
24
+ */
25
+ public function getData($email)
26
+ {
27
+ return apply_filters('gdpr/data-subject/data', [], $email);
28
+ }
29
+
30
+ /**
31
+ * Trigger the configured 'export' action
32
+ *
33
+ * @param $email
34
+ * @return array|null
35
+ */
36
+ public function export($email, $format, $force = false)
37
+ {
38
+ $action = gdpr('options')->get('export_action');
39
+ $data = null;
40
+
41
+ if ($force) {
42
+ $action = 'download';
43
+ }
44
+
45
+ switch($action) {
46
+ case 'download':
47
+ $data = $this->getData($email);
48
+ break;
49
+ case 'download_and_notify':
50
+ $data = $this->getData($email);
51
+ $this->notifyExportAction($email, $format);
52
+ break;
53
+ case 'notify':
54
+ $this->notifyExportRequest($email, $format);
55
+ break;
56
+ default:
57
+ $this->notifyExportRequest($email, $format);
58
+ break;
59
+ }
60
+
61
+ return $data;
62
+ }
63
+
64
+ /**
65
+ * Trigger the configured 'forget' action
66
+ *
67
+ * @param $email
68
+ *
69
+ * @return bool
70
+ */
71
+ public function forget($email, $forceAction = null)
72
+ {
73
+ $action = gdpr('options')->get('delete_action');
74
+
75
+ if ($forceAction) {
76
+ $action = $forceAction;
77
+ }
78
+
79
+ switch($action) {
80
+ case 'delete':
81
+ $this->delete($email);
82
+ return true;
83
+ case 'delete_and_notify':
84
+ $userId = $this->delete($email);
85
+ $this->notifyForgetAction($email, $userId);
86
+ return true;
87
+ case 'anonymize':
88
+ $this->anonymize($email);
89
+ return true;
90
+ case 'anonymize_and_notify':
91
+ $userId = $this->anonymize($email);
92
+ $this->notifyForgetAction($email, $userId);
93
+ return true;
94
+ case 'notify':
95
+ $this->notifyForgetRequest($email);
96
+ return false;
97
+ default:
98
+ $this->notifyForgetRequest($email);
99
+ return false;
100
+ }
101
+ }
102
+
103
+ /**
104
+ * @param $email
105
+ */
106
+ protected function anonymize($email)
107
+ {
108
+ $userId = null;
109
+
110
+ if (email_exists($email)) {
111
+ $userId = get_user_by('email', $email)->ID;
112
+ }
113
+
114
+ $anonymizedId = wp_generate_password(12, false);
115
+ do_action('gdpr/data-subject/anonymize', $email, $anonymizedId, $userId);
116
+
117
+ return $userId;
118
+ }
119
+
120
+ /**
121
+ * @param $email
122
+ */
123
+ protected function delete($email)
124
+ {
125
+ $userId = null;
126
+
127
+ if (email_exists($email)) {
128
+ $userId = get_user_by('email', $email)->ID;
129
+ }
130
+
131
+ do_action('gdpr/data-subject/delete', $email, $userId);
132
+
133
+ return $userId;
134
+ }
135
+
136
+ /**
137
+ * @param $email
138
+ */
139
+ protected function notifyExportAction($email, $format)
140
+ {
141
+ gdpr('helpers')->mail(
142
+ gdpr('options')->get('export_action_email'),
143
+ __("Data exported", 'gdpr-framework'),
144
+ gdpr('view')->render('email/action-export', compact('email', 'format')),
145
+ ['Content-Type: text/html; charset=UTF-8']
146
+ );
147
+ }
148
+
149
+ /**
150
+ * @param $email
151
+ */
152
+ protected function notifyExportRequest($email, $format)
153
+ {
154
+ $adminTabLink = esc_url(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $email));
155
+
156
+ gdpr('helpers')->mail(
157
+ gdpr('options')->get('export_action_email'),
158
+ __("Data export request", 'gdpr-framework'),
159
+ gdpr('view')->render('email/request-export', compact('email', 'format', 'adminTabLink')),
160
+ ['Content-Type: text/html; charset=UTF-8']
161
+ );
162
+ }
163
+
164
+ /**
165
+ * @param $email
166
+ */
167
+ protected function notifyForgetAction($email, $userId = null)
168
+ {
169
+ gdpr('helpers')->mail(
170
+ gdpr('options')->get('delete_action_email'),
171
+ __("Data removed", 'gdpr-framework'),
172
+ gdpr('view')->render('email/action-forget', compact('email', 'userId')),
173
+ ['Content-Type: text/html; charset=UTF-8']
174
+ );
175
+ }
176
+
177
+ /**
178
+ * @param $email
179
+ */
180
+ protected function notifyForgetRequest($email)
181
+ {
182
+ $adminTabLink = esc_url(gdpr('helpers')->getAdminUrl('&gdpr-tab=data-subject&search=' . $email));
183
+
184
+ gdpr('helpers')->mail(
185
+ gdpr('options')->get('delete_action_email'),
186
+ __("Data removal request", 'gdpr-framework'),
187
+ gdpr('view')->render('email/request-forget', compact('email', 'adminTabLink')),
188
+ ['Content-Type: text/html; charset=UTF-8']
189
+ );
190
+ }
191
+ }
src/DataSubject/DataSubjectAdmin.php CHANGED
@@ -1,18 +1,18 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\DataSubject;
4
-
5
- class DataSubjectAdmin
6
- {
7
- public function __construct()
8
- {
9
- add_filter('gdpr/admin/tabs', [$this, 'registerTab'], 30);
10
- }
11
-
12
- public function registerTab($tabs)
13
- {
14
- $tabs['data-subject'] = gdpr()->make(AdminTabDataSubject::class);
15
-
16
- return $tabs;
17
- }
18
  }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\DataSubject;
4
+
5
+ class DataSubjectAdmin
6
+ {
7
+ public function __construct()
8
+ {
9
+ add_filter('gdpr/admin/tabs', [$this, 'registerTab'], 30);
10
+ }
11
+
12
+ public function registerTab($tabs)
13
+ {
14
+ $tabs['data-subject'] = gdpr()->make(AdminTabDataSubject::class);
15
+
16
+ return $tabs;
17
+ }
18
  }
src/DataSubject/DataSubjectAuthenticator.php CHANGED
@@ -1,130 +1,130 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\DataSubject;
4
-
5
- /**
6
- * Handle authenticating the data subject either by logged in user or by email/cookie
7
- *
8
- * Class DataSubjectAuthenticator
9
- *
10
- * @package Codelight\GDPR\DataSubject
11
- */
12
- class DataSubjectAuthenticator
13
- {
14
- /**
15
- * DataSubjectAuthenticator constructor.
16
- *
17
- * @param DataSubjectManager $dataSubjectManager
18
- * @param DataSubjectIdentificator $dataSubjectIdentificator
19
- */
20
- public function __construct(DataSubjectManager $dataSubjectManager, DataSubjectIdentificator $dataSubjectIdentificator)
21
- {
22
- $this->dataSubjectManager = $dataSubjectManager;
23
- $this->dataSubjectIdentificator = $dataSubjectIdentificator;
24
- }
25
-
26
- /**
27
- * Attempt to authenticate the data subject
28
- *
29
- * @return bool|\Codelight\GDPR\DataSubject\DataSubject
30
- */
31
- public function authenticate()
32
- {
33
- // If the user is logged in, authenticate them
34
- if (is_user_logged_in()) {
35
- return apply_filters('gdpr/authenticate', $this->dataSubjectManager->getByLoggedInUser());
36
- }
37
-
38
- // If the request contains the identification cookie, validate it and identify the
39
- // current user
40
- $cookieData = $this->getIdentificationCookieData();
41
- if ($cookieData && $this->dataSubjectIdentificator->isKeyValid($cookieData[0], $cookieData[1])) {
42
- return apply_filters('gdpr/authenticate', $this->dataSubjectManager->getByEmail($cookieData[0]));
43
- }
44
-
45
- // Otherwise, we are not authenticated
46
- return apply_filters('gdpr/authenticate', false);
47
- }
48
-
49
- /**
50
- * If the request contains a new identification key, validate it, then set a new key
51
- * to make the previous link obsolete.
52
- */
53
- public function identify()
54
- {
55
- // Do not attempt to identify logged in users
56
- if (is_user_logged_in()) {
57
- return;
58
- }
59
-
60
- if (isset($_REQUEST['gdpr_key']) && isset($_REQUEST['email'])) {
61
-
62
- $privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
63
-
64
- if ($this->dataSubjectIdentificator->isKeyValid($_REQUEST['email'], $_REQUEST['gdpr_key'])) {
65
- $this->setIdentificationCookie($_REQUEST['email']);
66
- $url = $privacyToolsPageUrl;
67
- } else {
68
- $url = add_query_arg([
69
- 'gdpr_notice' => 'invalid_key',
70
- ], $privacyToolsPageUrl);
71
- }
72
-
73
- wp_safe_redirect($url);
74
- exit;
75
- }
76
- }
77
-
78
- /**
79
- * Set the identification cookie with the given key
80
- *
81
- * @param $key
82
- */
83
- public function setIdentificationCookie($email)
84
- {
85
- $key = $this->dataSubjectIdentificator->generateKey($email);
86
-
87
- setcookie(
88
- 'gdpr_key',
89
- $email . '|' . $key,
90
- time() + (15 * 60),
91
- COOKIEPATH,
92
- COOKIE_DOMAIN,
93
- false,
94
- true
95
- );
96
- }
97
-
98
- /**
99
- * @return string
100
- */
101
- public function getIdentificationCookieData()
102
- {
103
- return isset($_COOKIE['gdpr_key']) ? explode('|', $_COOKIE['gdpr_key']) : null;
104
- }
105
-
106
- /**
107
- * Remove the cookie
108
- */
109
- public function deleteSession($logout = true)
110
- {
111
- unset($_COOKIE['gdpr_key']);
112
-
113
- setcookie(
114
- 'gdpr_key',
115
- '',
116
- time() - 3600,
117
- COOKIEPATH,
118
- COOKIE_DOMAIN,
119
- false,
120
- true
121
- );
122
-
123
- if ($logout) {
124
- wp_logout();
125
- } else {
126
- wp_destroy_current_session();
127
- wp_clear_auth_cookie();
128
- }
129
- }
130
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\DataSubject;
4
+
5
+ /**
6
+ * Handle authenticating the data subject either by logged in user or by email/cookie
7
+ *
8
+ * Class DataSubjectAuthenticator
9
+ *
10
+ * @package Codelight\GDPR\DataSubject
11
+ */
12
+ class DataSubjectAuthenticator
13
+ {
14
+ /**
15
+ * DataSubjectAuthenticator constructor.
16
+ *
17
+ * @param DataSubjectManager $dataSubjectManager
18
+ * @param DataSubjectIdentificator $dataSubjectIdentificator
19
+ */
20
+ public function __construct(DataSubjectManager $dataSubjectManager, DataSubjectIdentificator $dataSubjectIdentificator)
21
+ {
22
+ $this->dataSubjectManager = $dataSubjectManager;
23
+ $this->dataSubjectIdentificator = $dataSubjectIdentificator;
24
+ }
25
+
26
+ /**
27
+ * Attempt to authenticate the data subject
28
+ *
29
+ * @return bool|\Codelight\GDPR\DataSubject\DataSubject
30
+ */
31
+ public function authenticate()
32
+ {
33
+ // If the user is logged in, authenticate them
34
+ if (is_user_logged_in()) {
35
+ return apply_filters('gdpr/authenticate', $this->dataSubjectManager->getByLoggedInUser());
36
+ }
37
+
38
+ // If the request contains the identification cookie, validate it and identify the
39
+ // current user
40
+ $cookieData = $this->getIdentificationCookieData();
41
+ if ($cookieData && $this->dataSubjectIdentificator->isKeyValid($cookieData[0], $cookieData[1])) {
42
+ return apply_filters('gdpr/authenticate', $this->dataSubjectManager->getByEmail($cookieData[0]));
43
+ }
44
+
45
+ // Otherwise, we are not authenticated
46
+ return apply_filters('gdpr/authenticate', false);
47
+ }
48
+
49
+ /**
50
+ * If the request contains a new identification key, validate it, then set a new key
51
+ * to make the previous link obsolete.
52
+ */
53
+ public function identify()
54
+ {
55
+ // Do not attempt to identify logged in users
56
+ if (is_user_logged_in()) {
57
+ return;
58
+ }
59
+
60
+ if (isset($_REQUEST['gdpr_key']) && isset($_REQUEST['email'])) {
61
+
62
+ $privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
63
+
64
+ if ($this->dataSubjectIdentificator->isKeyValid($_REQUEST['email'], $_REQUEST['gdpr_key'])) {
65
+ $this->setIdentificationCookie($_REQUEST['email']);
66
+ $url = $privacyToolsPageUrl;
67
+ } else {
68
+ $url = add_query_arg([
69
+ 'gdpr_notice' => 'invalid_key',
70
+ ], $privacyToolsPageUrl);
71
+ }
72
+
73
+ wp_safe_redirect($url);
74
+ exit;
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Set the identification cookie with the given key
80
+ *
81
+ * @param $key
82
+ */
83
+ public function setIdentificationCookie($email)
84
+ {
85
+ $key = $this->dataSubjectIdentificator->generateKey($email);
86
+
87
+ setcookie(
88
+ 'gdpr_key',
89
+ $email . '|' . $key,
90
+ time() + (15 * 60),
91
+ COOKIEPATH,
92
+ COOKIE_DOMAIN,
93
+ false,
94
+ true
95
+ );
96
+ }
97
+
98
+ /**
99
+ * @return string
100
+ */
101
+ public function getIdentificationCookieData()
102
+ {
103
+ return isset($_COOKIE['gdpr_key']) ? explode('|', $_COOKIE['gdpr_key']) : null;
104
+ }
105
+
106
+ /**
107
+ * Remove the cookie
108
+ */
109
+ public function deleteSession($logout = true)
110
+ {
111
+ unset($_COOKIE['gdpr_key']);
112
+
113
+ setcookie(
114
+ 'gdpr_key',
115
+ '',
116
+ time() - 3600,
117
+ COOKIEPATH,
118
+ COOKIE_DOMAIN,
119
+ false,
120
+ true
121
+ );
122
+
123
+ if ($logout) {
124
+ wp_logout();
125
+ } else {
126
+ wp_destroy_current_session();
127
+ wp_clear_auth_cookie();
128
+ }
129
+ }
130
+ }
src/DataSubject/DataSubjectIdentificator.php CHANGED
@@ -1,184 +1,184 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\DataSubject;
4
-
5
- use Codelight\GDPR\Options\Options;
6
-
7
- /**
8
- * Identify the data subject by unique temporary key
9
- *
10
- * Class DataSubjectIdentificator
11
- *
12
- * @package Codelight\GDPR\DataSubject
13
- */
14
- class DataSubjectIdentificator
15
- {
16
- /* @var DataSubjectManager */
17
- protected $dataSubjectManager;
18
-
19
- /* @var Options */
20
- protected $options;
21
-
22
- /**
23
- * DataSubjectIdentificator constructor.
24
- *
25
- * @param DataSubjectManager $dataSubjectManager
26
- */
27
- public function __construct(DataSubjectManager $dataSubjectManager, Options $options)
28
- {
29
- $this->dataSubjectManager = $dataSubjectManager;
30
- $this->options = $options;
31
- }
32
-
33
- /**
34
- * Check if there is any data associated with the given email address
35
- *
36
- * @param $email
37
- * @return bool
38
- */
39
- public function isDataSubject($email)
40
- {
41
- $dataSubject = $this->dataSubjectManager->getByEmail($email);
42
-
43
- return apply_filters('gdpr/data-subject/has-data', $dataSubject->hasData(), $email);
44
- }
45
-
46
- /**
47
- * Send the email with the link that allows data subject to authenticate
48
- *
49
- * @param $email
50
- */
51
- public function sendIdentificationEmail($email)
52
- {
53
- $key = $this->generateKey($email);
54
- $privacyToolsPageUrl = gdpr('helpers')->getPrivacyToolsPageUrl();
55
- $identificationUrl = add_query_arg([
56
- 'gdpr_key' => $key,
57
- 'email' => $email,
58
- ], $privacyToolsPageUrl);
59
-
60
- $siteName = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
61
-
62
- // todo: handle or log email sending errors
63
- gdpr('helpers')->mail(
64
- $email,
65
- __("Your personal data on", 'gdpr-framework') . ' ' . $siteName,
66
- gdpr('view')->render('email/identify-data-subject', compact('identificationUrl', 'siteName')),
67
- ['Content-Type: text/html; charset=UTF-8']
68
- );
69
- }
70
-
71
- /**
72
- * Notify the email address that we do not store any data about them
73
- *
74
- * @param $email
75
- */
76
- public function sendNoDataFoundEmail($email)
77
- {
78
- $siteName = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
79
-
80
- gdpr('helpers')->mail(
81
- $email,
82
- __("Your personal data on", 'gdpr-framework') . ' ' . $siteName,
83
- gdpr('view')->render('email/no-data', compact('siteName')),
84
- ['Content-Type: text/html; charset=UTF-8']
85
- );
86
- }
87
-
88
- /**
89
- * Check if the given key is valid for the given email
90
- *
91
- * @param $email
92
- * @param $key
93
- * @return bool
94
- */
95
- public function isKeyValid($email, $key)
96
- {
97
- $keyData = $this->options->get("key_{$email}");
98
-
99
- if (!$keyData) {
100
- // No key exists
101
- return false;
102
- }
103
-
104
- if (!isset($keyData['hashed-key']) || empty($keyData['hashed-key'])) {
105
- // There was an error saving the data to database
106
- return false;
107
- }
108
-
109
- if (!$this->validateKey($key, $keyData['hashed-key'])) {
110
- // Invalid key
111
- return false;
112
- }
113
-
114
- if ($keyData['valid-until'] < strtotime('now')) {
115
- // expired key
116
- return false;
117
- }
118
-
119
- // Double-check everything just to make sure we leave no errors in the code
120
- return ($this->validateKey($key, $keyData['hashed-key']) && $keyData['valid-until'] > strtotime('now'));
121
- }
122
-
123
- /**
124
- * Generate a secret key using the same functionality WP itself is using for Forgot Password requests
125
- *
126
- * @param $email
127
- */
128
- public function generateKey($email)
129
- {
130
- $key = wp_generate_password(20, false);
131
- $this->saveKey($email, $key);
132
-
133
- return $key;
134
- }
135
-
136
- /**
137
- * Save key into the database along with the expiration timestamp
138
- *
139
- * @param $email
140
- * @param $key
141
- */
142
- protected function saveKey($email, $key)
143
- {
144
- $this->options->set("key_{$email}", [
145
- 'email' => $email,
146
- 'hashed-key' => $this->hashKey($key),
147
- 'valid-until' => strtotime('+15 minutes'),
148
- ]);
149
- }
150
-
151
- /**
152
- * @param $submittedKey
153
- * @param $storedKey
154
- */
155
- protected function validateKey($submittedKey, $storedKey)
156
- {
157
- return $this->getHasher()->CheckPassword($submittedKey, $storedKey);
158
- }
159
-
160
- /**
161
- * Hash the key before saving to database to keep it hidden from the prying eyes of your sysadmin
162
- *
163
- * @param $key
164
- * @return bool|string
165
- */
166
- protected function hashKey($key)
167
- {
168
- return $this->getHasher()->HashPassword($key);
169
- }
170
-
171
- /**
172
- * @return \PasswordHash
173
- */
174
- protected function getHasher()
175
- {
176
- global $wp_hasher;
177
- if (empty($wp_hasher)) {
178
- require_once ABSPATH . WPINC . '/class-phpass.php';
179
- $wp_hasher = new \PasswordHash(8, true);
180
- }
181
-
182
- return $wp_hasher;
183
- }
184
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\DataSubject;
4
+
5
+ use Codelight\GDPR\Options\Options;
6
+
7
+ /**
8
+ * Identify the data subject by unique temporary key
9
+ *
10
+ * Class DataSubjectIdentificator
11
+ *
12
+ * @package Codelight\GDPR\DataSubject
13
+ */
14
+ class DataSubjectIdentificator
15
+ {
16
+ /* @var DataSubjectManager */
17
+ protected $dataSubjectManager;
18
+
19
+ /* @var Options */
20
+ protected $options;
21
+
22
+ /**
23
+ * DataSubjectIdentificator constructor.
24
+ *
25
+ * @param DataSubjectManager $dataSubjectManager
26
+ */
27
+ public function __construct(DataSubjectManager $dataSubjectManager, Options $options)
28
+ {
29
+ $this->dataSubjectManager = $dataSubjectManager;
30
+ $this->options = $options;
31
+ }
32
+
33
+ /**
34
+ * Check if there is any data associated with the given email address
35
+ *
36
+ * @param $email
37
+ * @return bool
38
+ */
39
+ public function isDataSubject($email)
40
+ {
41
+ $dataSubject = $this->dataSubjectManager->getByEmail($email);
42
+
43
+ return apply_filters('gdpr/data-subject/has-data', $dataSubject->hasData(), $email);
44
+ }
45
+
46
+ /**
47
+ * Send the email with the link that allows data subject to authenticate
48
+ *
49
+ * @param $email
50
+ */
51
+ public function sendIdentificationEmail($email)
52
+ {
53
+ $key = $this->generateKey($email);
54
+ $privacyToolsPageUrl = gdpr('helpers')->getPrivacyToolsPageUrl();
55
+ $identificationUrl = add_query_arg([
56
+ 'gdpr_key' => $key,
57
+ 'email' => $email,
58
+ ], $privacyToolsPageUrl);
59
+
60
+ $siteName = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
61
+
62
+ // todo: handle or log email sending errors
63
+ gdpr('helpers')->mail(
64
+ $email,
65
+ __("Your personal data on", 'gdpr-framework') . ' ' . $siteName,
66
+ gdpr('view')->render('email/identify-data-subject', compact('identificationUrl', 'siteName')),
67
+ ['Content-Type: text/html; charset=UTF-8']
68
+ );
69
+ }
70
+
71
+ /**
72
+ * Notify the email address that we do not store any data about them
73
+ *
74
+ * @param $email
75
+ */
76
+ public function sendNoDataFoundEmail($email)
77
+ {
78
+ $siteName = wp_specialchars_decode(get_option('blogname'), ENT_QUOTES);
79
+
80
+ gdpr('helpers')->mail(
81
+ $email,
82
+ __("Your personal data on", 'gdpr-framework') . ' ' . $siteName,
83
+ gdpr('view')->render('email/no-data', compact('siteName')),
84
+ ['Content-Type: text/html; charset=UTF-8']
85
+ );
86
+ }
87
+
88
+ /**
89
+ * Check if the given key is valid for the given email
90
+ *
91
+ * @param $email
92
+ * @param $key
93
+ * @return bool
94
+ */
95
+ public function isKeyValid($email, $key)
96
+ {
97
+ $keyData = $this->options->get("key_{$email}");
98
+
99
+ if (!$keyData) {
100
+ // No key exists
101
+ return false;
102
+ }
103
+
104
+ if (!isset($keyData['hashed-key']) || empty($keyData['hashed-key'])) {
105
+ // There was an error saving the data to database
106
+ return false;
107
+ }
108
+
109
+ if (!$this->validateKey($key, $keyData['hashed-key'])) {
110
+ // Invalid key
111
+ return false;
112
+ }
113
+
114
+ if ($keyData['valid-until'] < strtotime('now')) {
115
+ // expired key
116
+ return false;
117
+ }
118
+
119
+ // Double-check everything just to make sure we leave no errors in the code
120
+ return ($this->validateKey($key, $keyData['hashed-key']) && $keyData['valid-until'] > strtotime('now'));
121
+ }
122
+
123
+ /**
124
+ * Generate a secret key using the same functionality WP itself is using for Forgot Password requests
125
+ *
126
+ * @param $email
127
+ */
128
+ public function generateKey($email)
129
+ {
130
+ $key = wp_generate_password(20, false);
131
+ $this->saveKey($email, $key);
132
+
133
+ return $key;
134
+ }
135
+
136
+ /**
137
+ * Save key into the database along with the expiration timestamp
138
+ *
139
+ * @param $email
140
+ * @param $key
141
+ */
142
+ protected function saveKey($email, $key)
143
+ {
144
+ $this->options->set("key_{$email}", [
145
+ 'email' => $email,
146
+ 'hashed-key' => $this->hashKey($key),
147
+ 'valid-until' => strtotime('+15 minutes'),
148
+ ]);
149
+ }
150
+
151
+ /**
152
+ * @param $submittedKey
153
+ * @param $storedKey
154
+ */
155
+ protected function validateKey($submittedKey, $storedKey)
156
+ {
157
+ return $this->getHasher()->CheckPassword($submittedKey, $storedKey);
158
+ }
159
+
160
+ /**
161
+ * Hash the key before saving to database to keep it hidden from the prying eyes of your sysadmin
162
+ *
163
+ * @param $key
164
+ * @return bool|string
165
+ */
166
+ protected function hashKey($key)
167
+ {
168
+ return $this->getHasher()->HashPassword($key);
169
+ }
170
+
171
+ /**
172
+ * @return \PasswordHash
173
+ */
174
+ protected function getHasher()
175
+ {
176
+ global $wp_hasher;
177
+ if (empty($wp_hasher)) {
178
+ require_once ABSPATH . WPINC . '/class-phpass.php';
179
+ $wp_hasher = new \PasswordHash(8, true);
180
+ }
181
+
182
+ return $wp_hasher;
183
+ }
184
+ }
src/Helpers.php CHANGED
@@ -1,170 +1,170 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR;
4
-
5
- /**
6
- * General helper functions
7
- *
8
- * Class Helpers
9
- *
10
- * @package Codelight\GDPR
11
- */
12
- class Helpers
13
- {
14
- public function supportUrl($url = '')
15
- {
16
- return gdpr('config')->get('help.url') . $url;
17
- }
18
-
19
- /**
20
- * Get an associative array of EU countries
21
- *
22
- * @return array
23
- */
24
- public function getEUCountryList()
25
- {
26
- return [
27
- 'AT' => _x('Austria', '(Admin)', 'gdpr-framework'),
28
- 'BE' => _x('Belgium', '(Admin)', 'gdpr-framework'),
29
- 'BG' => _x('Bulgaria', '(Admin)', 'gdpr-framework'),
30
- 'HR' => _x('Croatia','(Admin)', 'gdpr-framework'),
31
- 'CY' => _x('Cyprus', '(Admin)', 'gdpr-framework'),
32
- 'CZ' => _x('Czech Republic', '(Admin)', 'gdpr-framework'),
33
- 'DK' => _x('Denmark', '(Admin)', 'gdpr-framework'),
34
- 'EE' => _x('Estonia', '(Admin)', 'gdpr-framework'),
35
- 'FI' => _x('Finland', '(Admin)', 'gdpr-framework'),
36
- 'FR' => _x('France', '(Admin)', 'gdpr-framework'),
37
- 'DE' => _x('Germany', '(Admin)', 'gdpr-framework'),
38
- 'GR' => _x('Greece', '(Admin)', 'gdpr-framework'),
39
- 'HU' => _x('Hungary', '(Admin)', 'gdpr-framework'),
40
- 'IE' => _x('Ireland', '(Admin)', 'gdpr-framework'),
41
- 'IT' => _x('Italy', '(Admin)', 'gdpr-framework'),
42
- 'LV' => _x('Latvia', '(Admin)', 'gdpr-framework'),
43
- 'LT' => _x('Lithuania', '(Admin)', 'gdpr-framework'),
44
- 'LU' => _x('Luxembourg', '(Admin)', 'gdpr-framework'),
45
- 'MT' => _x('Malta', '(Admin)', 'gdpr-framework'),
46
- 'NL' => _x('Netherlands', '(Admin)', 'gdpr-framework'),
47
- 'PL' => _x('Poland', '(Admin)', 'gdpr-framework'),
48
- 'PT' => _x('Portugal', '(Admin)', 'gdpr-framework'),
49
- 'RO' => _x('Romania', '(Admin)', 'gdpr-framework'),
50
- 'SK' => _x('Slovakia', '(Admin)', 'gdpr-framework'),
51
- 'SI' => _x('Slovenia', '(Admin)', 'gdpr-framework'),
52
- 'ES' => _x('Spain', '(Admin)', 'gdpr-framework'),
53
- 'SE' => _x('Sweden', '(Admin)', 'gdpr-framework'),
54
- 'UK' => _x('United Kingdom', '(Admin)', 'gdpr-framework'),
55
- ];
56
- }
57
-
58
- /**
59
- * Get a list of <option> values for the country selector
60
- *
61
- * @param null $current
62
- *
63
- * @return mixed
64
- */
65
- public function getCountrySelectOptions($current = null)
66
- {
67
- $eu = $this->getEUCountryList();
68
- $outside = [
69
- "IS" => _x('Iceland', '(Admin)', 'gdpr-framework'),
70
- "NO" => _x('Norway', '(Admin)', 'gdpr-framework'),
71
- "LI" => _x('Liechtenstein', '(Admin)', 'gdpr-framework'),
72
- "CH" => _x('Switzerland', '(Admin)', 'gdpr-framework'),
73
- "US" => _x('United States', '(Admin)', 'gdpr-framework'),
74
- "other" => _x('Rest of the world', '(Admin)', 'gdpr-framework'),
75
- ];
76
-
77
- return gdpr('view')->render('global/country-options', compact('eu', 'outside', 'current'));
78
- }
79
-
80
- /**
81
- * Check if a controller from the given country needs a representative in the EU
82
- *
83
- * @param $code
84
- * @return bool
85
- */
86
- public function countryNeedsRepresentative($code)
87
- {
88
- return in_array($code, ['US', 'other']);
89
- }
90
-
91
- /**
92
- * Get the data protection authority information for a given country
93
- *
94
- * @param null $countryCode
95
- * @return array
96
- */
97
- public function getDataProtectionAuthorityInfo($countryCode = null)
98
- {
99
- if (!$countryCode) {
100
- $countryCode = gdpr('options')->get('company_location');
101
- }
102
-
103
- $dpaData = require(gdpr('config')->get('plugin.path') . 'assets/data-protection-authorities.php');
104
-
105
- if (isset($dpaData[$countryCode])) {
106
- return $dpaData[$countryCode];
107
- }
108
-
109
- return [];
110
- }
111
-
112
- /**
113
- * Get the info regarding all DPAs
114
- */
115
- public function getDataProtectionAuthorities()
116
- {
117
- return require(gdpr('config')->get('plugin.path') . 'assets/data-protection-authorities.php');
118
- }
119
-
120
- public function getAdminUrl($suffix = '')
121
- {
122
- return admin_url('tools.php?page=privacy' . $suffix);
123
- }
124
-
125
- public function getDashboardDataPageUrl($suffix = '')
126
- {
127
- return admin_url('users.php?page=gdpr-profile' . $suffix);
128
- }
129
-
130
- public function getPrivacyToolsPageUrl()
131
- {
132
- $toolsPageId = gdpr('options')->get('tools_page');
133
- return $toolsPageId ? get_permalink($toolsPageId) : '';
134
- }
135
-
136
- public function getPrivacyPolicyPageUrl()
137
- {
138
- $policyPageId = gdpr('options')->get('policy_page');
139
- return $policyPageId ? get_permalink($policyPageId) : '';
140
- }
141
-
142
- public function error()
143
- {
144
- wp_die(
145
- __('An error has occurred. Please contact the site administrator.', 'gdpr-framework')
146
- );
147
- }
148
-
149
- public function docs($url = '')
150
- {
151
- return 'https://codelight.eu/wordpress-gdpr-framework/' . $url;
152
- }
153
-
154
- /**
155
- * Wrapper around wp_mail() to filter the headers
156
- * Example code for changing the sender email:
157
- *
158
- * add_filter('gdpr/mail/headers', function($headers) {
159
- $headers[] = 'From: Firstname Lastname <test@example.com>';
160
- return $headers;
161
- });
162
- *
163
- *
164
- */
165
- public function mail($to, $subject, $message, $headers = '', $attachments = [])
166
- {
167
- $headers = apply_filters('gdpr/mail/headers', $headers);
168
- wp_mail($to, $subject, $message, $headers, $attachments);
169
- }
170
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR;
4
+
5
+ /**
6
+ * General helper functions
7
+ *
8
+ * Class Helpers
9
+ *
10
+ * @package Codelight\GDPR
11
+ */
12
+ class Helpers
13
+ {
14
+ public function supportUrl($url = '')
15
+ {
16
+ return gdpr('config')->get('help.url') . $url;
17
+ }
18
+
19
+ /**
20
+ * Get an associative array of EU countries
21
+ *
22
+ * @return array
23
+ */
24
+ public function getEUCountryList()
25
+ {
26
+ return [
27
+ 'AT' => _x('Austria', '(Admin)', 'gdpr-framework'),
28
+ 'BE' => _x('Belgium', '(Admin)', 'gdpr-framework'),
29
+ 'BG' => _x('Bulgaria', '(Admin)', 'gdpr-framework'),
30
+ 'HR' => _x('Croatia','(Admin)', 'gdpr-framework'),
31
+ 'CY' => _x('Cyprus', '(Admin)', 'gdpr-framework'),
32
+ 'CZ' => _x('Czech Republic', '(Admin)', 'gdpr-framework'),
33
+ 'DK' => _x('Denmark', '(Admin)', 'gdpr-framework'),
34
+ 'EE' => _x('Estonia', '(Admin)', 'gdpr-framework'),
35
+ 'FI' => _x('Finland', '(Admin)', 'gdpr-framework'),
36
+ 'FR' => _x('France', '(Admin)', 'gdpr-framework'),
37
+ 'DE' => _x('Germany', '(Admin)', 'gdpr-framework'),
38
+ 'GR' => _x('Greece', '(Admin)', 'gdpr-framework'),
39
+ 'HU' => _x('Hungary', '(Admin)', 'gdpr-framework'),
40
+ 'IE' => _x('Ireland', '(Admin)', 'gdpr-framework'),
41
+ 'IT' => _x('Italy', '(Admin)', 'gdpr-framework'),
42
+ 'LV' => _x('Latvia', '(Admin)', 'gdpr-framework'),
43
+ 'LT' => _x('Lithuania', '(Admin)', 'gdpr-framework'),
44
+ 'LU' => _x('Luxembourg', '(Admin)', 'gdpr-framework'),
45
+ 'MT' => _x('Malta', '(Admin)', 'gdpr-framework'),
46
+ 'NL' => _x('Netherlands', '(Admin)', 'gdpr-framework'),
47
+ 'PL' => _x('Poland', '(Admin)', 'gdpr-framework'),
48
+ 'PT' => _x('Portugal', '(Admin)', 'gdpr-framework'),
49
+ 'RO' => _x('Romania', '(Admin)', 'gdpr-framework'),
50
+ 'SK' => _x('Slovakia', '(Admin)', 'gdpr-framework'),
51
+ 'SI' => _x('Slovenia', '(Admin)', 'gdpr-framework'),
52
+ 'ES' => _x('Spain', '(Admin)', 'gdpr-framework'),
53
+ 'SE' => _x('Sweden', '(Admin)', 'gdpr-framework'),
54
+ 'UK' => _x('United Kingdom', '(Admin)', 'gdpr-framework'),
55
+ ];
56
+ }
57
+
58
+ /**
59
+ * Get a list of <option> values for the country selector
60
+ *
61
+ * @param null $current
62
+ *
63
+ * @return mixed
64
+ */
65
+ public function getCountrySelectOptions($current = null)
66
+ {
67
+ $eu = $this->getEUCountryList();
68
+ $outside = [
69
+ "IS" => _x('Iceland', '(Admin)', 'gdpr-framework'),
70
+ "NO" => _x('Norway', '(Admin)', 'gdpr-framework'),
71
+ "LI" => _x('Liechtenstein', '(Admin)', 'gdpr-framework'),
72
+ "CH" => _x('Switzerland', '(Admin)', 'gdpr-framework'),
73
+ "US" => _x('United States', '(Admin)', 'gdpr-framework'),
74
+ "other" => _x('Rest of the world', '(Admin)', 'gdpr-framework'),
75
+ ];
76
+
77
+ return gdpr('view')->render('global/country-options', compact('eu', 'outside', 'current'));
78
+ }
79
+
80
+ /**
81
+ * Check if a controller from the given country needs a representative in the EU
82
+ *
83
+ * @param $code
84
+ * @return bool
85
+ */
86
+ public function countryNeedsRepresentative($code)
87
+ {
88
+ return in_array($code, ['US', 'other']);
89
+ }
90
+
91
+ /**
92
+ * Get the data protection authority information for a given country
93
+ *
94
+ * @param null $countryCode
95
+ * @return array
96
+ */
97
+ public function getDataProtectionAuthorityInfo($countryCode = null)
98
+ {
99
+ if (!$countryCode) {
100
+ $countryCode = gdpr('options')->get('company_location');
101
+ }
102
+
103
+ $dpaData = require(gdpr('config')->get('plugin.path') . 'assets/data-protection-authorities.php');
104
+
105
+ if (isset($dpaData[$countryCode])) {
106
+ return $dpaData[$countryCode];
107
+ }
108
+
109
+ return [];
110
+ }
111
+
112
+ /**
113
+ * Get the info regarding all DPAs
114
+ */
115
+ public function getDataProtectionAuthorities()
116
+ {
117
+ return require(gdpr('config')->get('plugin.path') . 'assets/data-protection-authorities.php');
118
+ }
119
+
120
+ public function getAdminUrl($suffix = '')
121
+ {
122
+ return admin_url('tools.php?page=privacy' . $suffix);
123
+ }
124
+
125
+ public function getDashboardDataPageUrl($suffix = '')
126
+ {
127
+ return admin_url('users.php?page=gdpr-profile' . $suffix);
128
+ }
129
+
130
+ public function getPrivacyToolsPageUrl()
131
+ {
132
+ $toolsPageId = gdpr('options')->get('tools_page');
133
+ return $toolsPageId ? get_permalink($toolsPageId) : '';
134
+ }
135
+
136
+ public function getPrivacyPolicyPageUrl()
137
+ {
138
+ $policyPageId = gdpr('options')->get('policy_page');
139
+ return $policyPageId ? get_permalink($policyPageId) : '';
140
+ }
141
+
142
+ public function error()
143
+ {
144
+ wp_die(
145
+ __('An error has occurred. Please contact the site administrator.', 'gdpr-framework')
146
+ );
147
+ }
148
+
149
+ public function docs($url = '')
150
+ {
151
+ return 'https://codelight.eu/wordpress-gdpr-framework/' . $url;
152
+ }
153
+
154
+ /**
155
+ * Wrapper around wp_mail() to filter the headers
156
+ * Example code for changing the sender email:
157
+ *
158
+ * add_filter('gdpr/mail/headers', function($headers) {
159
+ $headers[] = 'From: Firstname Lastname <test@example.com>';
160
+ return $headers;
161
+ });
162
+ *
163
+ *
164
+ */
165
+ public function mail($to, $subject, $message, $headers = '', $attachments = [])
166
+ {
167
+ $headers = apply_filters('gdpr/mail/headers', $headers);
168
+ wp_mail($to, $subject, $message, $headers, $attachments);
169
+ }
170
+ }
src/Installer/Installer.php CHANGED
@@ -1,303 +1,303 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Installer;
4
-
5
- use Codelight\GDPR\Admin\AdminTabGeneral;
6
-
7
- /**
8
- * Handle all installation activities
9
- *
10
- * Class Installer
11
- *
12
- * @package Codelight\GDPR\Installer
13
- */
14
- class Installer
15
- {
16
- /* @var array */
17
- protected $defaultSteps = [
18
- 'Codelight\GDPR\Installer\Steps\Welcome',
19
- 'Codelight\GDPR\Installer\Steps\Disclaimer',
20
- 'Codelight\GDPR\Installer\Steps\ConfigurationPages',
21
- 'Codelight\GDPR\Installer\Steps\ConfigurationSettings',
22
- 'Codelight\GDPR\Installer\Steps\PolicySettings',
23
- 'Codelight\GDPR\Installer\Steps\PolicyContents',
24
- 'Codelight\GDPR\Installer\Steps\Consent',
25
- 'Codelight\GDPR\Installer\Steps\Integrations',
26
- 'Codelight\GDPR\Installer\Steps\Finish',
27
- ];
28
-
29
- /* @var array */
30
- protected $steps = [];
31
-
32
- /* @var InstallerWizard */
33
- protected $wizard;
34
-
35
- /* @var InstallerRouter */
36
- protected $router;
37
-
38
- /**
39
- * Check if the installer is enabled and ensure the user has correct permissions to run it
40
- */
41
- public function __construct(AdminTabGeneral $adminTab)
42
- {
43
- if (!$this->isInstallerEnabled()) {
44
- return;
45
- }
46
-
47
- if (!$this->userHasPermissions()) {
48
- return;
49
- }
50
-
51
- $this->adminTab = $adminTab;
52
-
53
- $this->maybeDisplayDisclaimer();
54
- $this->setupHooks();
55
-
56
- if (!$this->isInstalled()) {
57
- $this->setupSteps();
58
- $this->runInstaller();
59
- }
60
- }
61
-
62
- /**
63
- * Setup actions and admin tab components
64
- */
65
- protected function setupHooks()
66
- {
67
- add_action('admin_init', [$this, 'setupAdminGeneralTabButtons'], 0);
68
-
69
- add_action('gdpr/admin/action/accept_disclaimer', [$this, 'acceptDisclaimer']);
70
-
71
- add_action('gdpr/admin/action/restart_wizard', [$this, 'restartWizard']);
72
-
73
- add_action('gdpr/admin/action/auto_install', [$this, 'autoInstall']);
74
- add_action('gdpr/admin/action/skip_install', [$this, 'skipInstall']);
75
- }
76
-
77
- protected function runInstaller()
78
- {
79
- $this->wizard = new InstallerWizard;
80
- $this->router = new InstallerRouter($this->steps);
81
-
82
- // If we're currently on one of the installer steps, let the router handle it
83
- if ($this->router->isInstallerStep()) {
84
- return;
85
- }
86
-
87
- if ($this->getCurrentStepSlug()) {
88
- // If the current step is set, display continue notice
89
- $step = $this->router->findStep($this->getCurrentStepSlug());
90
- // If step doesn't exist, then it means the step slugs have changed. Do nothing.
91
- if (!$step) {
92
- return;
93
- }
94
- $this->displayContinueNotice($step->getUrl());
95
- } else {
96
- // If the current step is not set, it means the installer hasn't been started yet
97
- $this->displayWelcomeNotice();
98
- }
99
- }
100
-
101
- /**
102
- * If the admin has not accepted the disclaimer, render it
103
- */
104
- public function maybeDisplayDisclaimer()
105
- {
106
- if (!gdpr('options')->get('plugin_disclaimer_accepted') && (isset($_GET['page']) && 'privacy' === $_GET['page'])) {
107
- $acceptUrl = add_query_arg([
108
- 'gdpr_action' => 'accept_disclaimer',
109
- 'gdpr_nonce' => wp_create_nonce('gdpr/admin/action/accept_disclaimer'),
110
- ]);
111
- gdpr('admin-notice')->add('admin/notices/disclaimer', compact('acceptUrl'));
112
- }
113
- }
114
-
115
- /**
116
- * Mark the disclaimer as accepted
117
- */
118
- public function acceptDisclaimer()
119
- {
120
- gdpr('options')->set('plugin_disclaimer_accepted', 'yes');
121
- wp_safe_redirect(gdpr('helpers')->getAdminUrl());
122
- exit;
123
- }
124
-
125
- /**
126
- * Display installer section in admin page
127
- */
128
- public function setupAdminGeneralTabButtons()
129
- {
130
- /**
131
- * Display wizard buttons
132
- */
133
- $this->adminTab->registerSettingSection(
134
- 'gdpr-section-wizard',
135
- _x('Setup Wizard', '(Admin)', 'gdpr-framework'),
136
- [$this, 'renderWizardButtons']
137
- );
138
- }
139
-
140
- /**
141
- * Render the installer section
142
- */
143
- public function renderWizardButtons()
144
- {
145
- $restartUrl = add_query_arg([
146
- 'gdpr_action' => 'restart_wizard',
147
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/restart_wizard"),
148
- ]);
149
-
150
- echo gdpr('view')->render(
151
- 'admin/wizard-buttons',
152
- compact('restartUrl')
153
- );
154
- }
155
-
156
- /**
157
- * Restart and redirect to first step
158
- */
159
- public function restartWizard()
160
- {
161
- gdpr('options')->delete('installer_step');
162
- gdpr('options')->delete('is_installed');
163
-
164
- wp_safe_redirect(self_admin_url());
165
- exit;
166
- }
167
-
168
- /**
169
- * Allow plugins to modify the steps
170
- */
171
- protected function setupSteps()
172
- {
173
- $steps = apply_filters('gdpr/installer/steps', $this->defaultSteps);
174
-
175
- foreach ($steps as $index => $step) {
176
- $this->steps[$index] = new $step;
177
- }
178
- }
179
-
180
- /**
181
- * The installer can be disabled by filter.
182
- * Check if it's enabled
183
- *
184
- * @return bool
185
- */
186
- protected function isInstallerEnabled()
187
- {
188
- return apply_filters('gdpr/installer/enabled', true);
189
- }
190
-
191
- /**
192
- * Check if the current user has correct permissions to run the installer
193
- *
194
- * @return bool
195
- */
196
- protected function userHasPermissions()
197
- {
198
- return current_user_can(apply_filters('gdpr/installer/permissions', 'manage_options'));
199
- }
200
-
201
- /**
202
- * Check if the installer is already ran
203
- *
204
- * @return bool
205
- */
206
- protected function isInstalled()
207
- {
208
- return gdpr('options')->get('is_installed');
209
- }
210
-
211
- /**
212
- * @return string
213
- */
214
- public function getCurrentStepSlug()
215
- {
216
- return gdpr('options')->get('installer_step');
217
- }
218
-
219
- /**
220
- * Render an admin notice that will display the welcome message
221
- */
222
- protected function displayWelcomeNotice()
223
- {
224
- // Make sure we display the notice only to admins
225
- if (!current_user_can(apply_filters('gdpr/capability', 'manage_options'))) {
226
- return;
227
- }
228
-
229
- $installerUrl = $this->steps[0]->getUrl();
230
- $autoInstallUrl = add_query_arg([
231
- 'gdpr_action' => 'auto_install',
232
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/auto_install"),
233
- ]);
234
- $skipUrl = add_query_arg([
235
- 'gdpr_action' => 'skip_install',
236
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/skip_install"),
237
- ]);
238
-
239
- gdpr('admin-notice')->add(
240
- 'installer/welcome-notice',
241
- compact('installerUrl', 'autoInstallUrl', 'skipUrl')
242
- );
243
- }
244
-
245
- /**
246
- * Render an admin notice that will display the continue button
247
- *
248
- * @param $url
249
- */
250
- protected function displayContinueNotice($url)
251
- {
252
- // Make sure we display the notice only to admins
253
- if (!current_user_can(apply_filters('gdpr/capability', 'manage_options'))) {
254
- return;
255
- }
256
-
257
- $skipUrl = add_query_arg([
258
- 'gdpr_action' => 'skip_install',
259
- 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/skip_install"),
260
- ]);
261
-
262
- gdpr('admin-notice')->add('installer/continue-notice', ['buttonUrl' => $url, 'skipUrl' => $skipUrl]);
263
- }
264
-
265
- /**
266
- * Automatically create pages for Privacy Policy and set the corresponding options
267
- */
268
- public function autoInstall()
269
- {
270
- $policyPageId = wp_insert_post([
271
- 'post_title' => __('Privacy Policy', 'gdpr-framework'),
272
- 'post_type' => 'page',
273
- ]);
274
-
275
- gdpr('options')->set('policy_page', $policyPageId);
276
-
277
- $toolsPageId = wp_insert_post([
278
- 'post_content' => '[gdpr_privacy_tools]',
279
- 'post_title' => __('Privacy Tools', 'gdpr-framework'),
280
- 'post_type' => 'page',
281
- ]);
282
- gdpr('options')->set('tools_page', $toolsPageId);
283
-
284
- // Woocommerce compatibility - automatically add their terms page
285
- if (get_option('woocommerce_terms_page_id')) {
286
- gdpr('options')->set('terms_page', get_option('woocommerce_terms_page_id'));
287
- }
288
-
289
- gdpr('options')->set('is_installed', 'yes');
290
- wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy&gdpr-notice=autoinstall'));
291
- exit;
292
- }
293
-
294
- /**
295
- * Do nothing, but mark the installer as completed
296
- */
297
- public function skipInstall()
298
- {
299
- gdpr('options')->set('is_installed', 'yes');
300
- wp_safe_redirect(gdpr('helpers')->getAdminUrl());
301
- exit;
302
- }
303
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Installer;
4
+
5
+ use Codelight\GDPR\Admin\AdminTabGeneral;
6
+
7
+ /**
8
+ * Handle all installation activities
9
+ *
10
+ * Class Installer
11
+ *
12
+ * @package Codelight\GDPR\Installer
13
+ */
14
+ class Installer
15
+ {
16
+ /* @var array */
17
+ protected $defaultSteps = [
18
+ 'Codelight\GDPR\Installer\Steps\Welcome',
19
+ 'Codelight\GDPR\Installer\Steps\Disclaimer',
20
+ 'Codelight\GDPR\Installer\Steps\ConfigurationPages',
21
+ 'Codelight\GDPR\Installer\Steps\ConfigurationSettings',
22
+ 'Codelight\GDPR\Installer\Steps\PolicySettings',
23
+ 'Codelight\GDPR\Installer\Steps\PolicyContents',
24
+ 'Codelight\GDPR\Installer\Steps\Consent',
25
+ 'Codelight\GDPR\Installer\Steps\Integrations',
26
+ 'Codelight\GDPR\Installer\Steps\Finish',
27
+ ];
28
+
29
+ /* @var array */
30
+ protected $steps = [];
31
+
32
+ /* @var InstallerWizard */
33
+ protected $wizard;
34
+
35
+ /* @var InstallerRouter */
36
+ protected $router;
37
+
38
+ /**
39
+ * Check if the installer is enabled and ensure the user has correct permissions to run it
40
+ */
41
+ public function __construct(AdminTabGeneral $adminTab)
42
+ {
43
+ if (!$this->isInstallerEnabled()) {
44
+ return;
45
+ }
46
+
47
+ if (!$this->userHasPermissions()) {
48
+ return;
49
+ }
50
+
51
+ $this->adminTab = $adminTab;
52
+
53
+ $this->maybeDisplayDisclaimer();
54
+ $this->setupHooks();
55
+
56
+ if (!$this->isInstalled()) {
57
+ $this->setupSteps();
58
+ $this->runInstaller();
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Setup actions and admin tab components
64
+ */
65
+ protected function setupHooks()
66
+ {
67
+ add_action('admin_init', [$this, 'setupAdminGeneralTabButtons'], 0);
68
+
69
+ add_action('gdpr/admin/action/accept_disclaimer', [$this, 'acceptDisclaimer']);
70
+
71
+ add_action('gdpr/admin/action/restart_wizard', [$this, 'restartWizard']);
72
+
73
+ add_action('gdpr/admin/action/auto_install', [$this, 'autoInstall']);
74
+ add_action('gdpr/admin/action/skip_install', [$this, 'skipInstall']);
75
+ }
76
+
77
+ protected function runInstaller()
78
+ {
79
+ $this->wizard = new InstallerWizard;
80
+ $this->router = new InstallerRouter($this->steps);
81
+
82
+ // If we're currently on one of the installer steps, let the router handle it
83
+ if ($this->router->isInstallerStep()) {
84
+ return;
85
+ }
86
+
87
+ if ($this->getCurrentStepSlug()) {
88
+ // If the current step is set, display continue notice
89
+ $step = $this->router->findStep($this->getCurrentStepSlug());
90
+ // If step doesn't exist, then it means the step slugs have changed. Do nothing.
91
+ if (!$step) {
92
+ return;
93
+ }
94
+ $this->displayContinueNotice($step->getUrl());
95
+ } else {
96
+ // If the current step is not set, it means the installer hasn't been started yet
97
+ $this->displayWelcomeNotice();
98
+ }
99
+ }
100
+
101
+ /**
102
+ * If the admin has not accepted the disclaimer, render it
103
+ */
104
+ public function maybeDisplayDisclaimer()
105
+ {
106
+ if (!gdpr('options')->get('plugin_disclaimer_accepted') && (isset($_GET['page']) && 'privacy' === $_GET['page'])) {
107
+ $acceptUrl = add_query_arg([
108
+ 'gdpr_action' => 'accept_disclaimer',
109
+ 'gdpr_nonce' => wp_create_nonce('gdpr/admin/action/accept_disclaimer'),
110
+ ]);
111
+ gdpr('admin-notice')->add('admin/notices/disclaimer', compact('acceptUrl'));
112
+ }
113
+ }
114
+
115
+ /**
116
+ * Mark the disclaimer as accepted
117
+ */
118
+ public function acceptDisclaimer()
119
+ {
120
+ gdpr('options')->set('plugin_disclaimer_accepted', 'yes');
121
+ wp_safe_redirect(gdpr('helpers')->getAdminUrl());
122
+ exit;
123
+ }
124
+
125
+ /**
126
+ * Display installer section in admin page
127
+ */
128
+ public function setupAdminGeneralTabButtons()
129
+ {
130
+ /**
131
+ * Display wizard buttons
132
+ */
133
+ $this->adminTab->registerSettingSection(
134
+ 'gdpr-section-wizard',
135
+ _x('Setup Wizard', '(Admin)', 'gdpr-framework'),
136
+ [$this, 'renderWizardButtons']
137
+ );
138
+ }
139
+
140
+ /**
141
+ * Render the installer section
142
+ */
143
+ public function renderWizardButtons()
144
+ {
145
+ $restartUrl = add_query_arg([
146
+ 'gdpr_action' => 'restart_wizard',
147
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/restart_wizard"),
148
+ ]);
149
+
150
+ echo gdpr('view')->render(
151
+ 'admin/wizard-buttons',
152
+ compact('restartUrl')
153
+ );
154
+ }
155
+
156
+ /**
157
+ * Restart and redirect to first step
158
+ */
159
+ public function restartWizard()
160
+ {
161
+ gdpr('options')->delete('installer_step');
162
+ gdpr('options')->delete('is_installed');
163
+
164
+ wp_safe_redirect(self_admin_url());
165
+ exit;
166
+ }
167
+
168
+ /**
169
+ * Allow plugins to modify the steps
170
+ */
171
+ protected function setupSteps()
172
+ {
173
+ $steps = apply_filters('gdpr/installer/steps', $this->defaultSteps);
174
+
175
+ foreach ($steps as $index => $step) {
176
+ $this->steps[$index] = new $step;
177
+ }
178
+ }
179
+
180
+ /**
181
+ * The installer can be disabled by filter.
182
+ * Check if it's enabled
183
+ *
184
+ * @return bool
185
+ */
186
+ protected function isInstallerEnabled()
187
+ {
188
+ return apply_filters('gdpr/installer/enabled', true);
189
+ }
190
+
191
+ /**
192
+ * Check if the current user has correct permissions to run the installer
193
+ *
194
+ * @return bool
195
+ */
196
+ protected function userHasPermissions()
197
+ {
198
+ return current_user_can(apply_filters('gdpr/installer/permissions', 'manage_options'));
199
+ }
200
+
201
+ /**
202
+ * Check if the installer is already ran
203
+ *
204
+ * @return bool
205
+ */
206
+ protected function isInstalled()
207
+ {
208
+ return gdpr('options')->get('is_installed');
209
+ }
210
+
211
+ /**
212
+ * @return string
213
+ */
214
+ public function getCurrentStepSlug()
215
+ {
216
+ return gdpr('options')->get('installer_step');
217
+ }
218
+
219
+ /**
220
+ * Render an admin notice that will display the welcome message
221
+ */
222
+ protected function displayWelcomeNotice()
223
+ {
224
+ // Make sure we display the notice only to admins
225
+ if (!current_user_can(apply_filters('gdpr/capability', 'manage_options'))) {
226
+ return;
227
+ }
228
+
229
+ $installerUrl = $this->steps[0]->getUrl();
230
+ $autoInstallUrl = add_query_arg([
231
+ 'gdpr_action' => 'auto_install',
232
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/auto_install"),
233
+ ]);
234
+ $skipUrl = add_query_arg([
235
+ 'gdpr_action' => 'skip_install',
236
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/skip_install"),
237
+ ]);
238
+
239
+ gdpr('admin-notice')->add(
240
+ 'installer/welcome-notice',
241
+ compact('installerUrl', 'autoInstallUrl', 'skipUrl')
242
+ );
243
+ }
244
+
245
+ /**
246
+ * Render an admin notice that will display the continue button
247
+ *
248
+ * @param $url
249
+ */
250
+ protected function displayContinueNotice($url)
251
+ {
252
+ // Make sure we display the notice only to admins
253
+ if (!current_user_can(apply_filters('gdpr/capability', 'manage_options'))) {
254
+ return;
255
+ }
256
+
257
+ $skipUrl = add_query_arg([
258
+ 'gdpr_action' => 'skip_install',
259
+ 'gdpr_nonce' => wp_create_nonce("gdpr/admin/action/skip_install"),
260
+ ]);
261
+
262
+ gdpr('admin-notice')->add('installer/continue-notice', ['buttonUrl' => $url, 'skipUrl' => $skipUrl]);
263
+ }
264
+
265
+ /**
266
+ * Automatically create pages for Privacy Policy and set the corresponding options
267
+ */
268
+ public function autoInstall()
269
+ {
270
+ $policyPageId = wp_insert_post([
271
+ 'post_title' => __('Privacy Policy', 'gdpr-framework'),
272
+ 'post_type' => 'page',
273
+ ]);
274
+
275
+ gdpr('options')->set('policy_page', $policyPageId);
276
+
277
+ $toolsPageId = wp_insert_post([
278
+ 'post_content' => '[gdpr_privacy_tools]',
279
+ 'post_title' => __('Privacy Tools', 'gdpr-framework'),
280
+ 'post_type' => 'page',
281
+ ]);
282
+ gdpr('options')->set('tools_page', $toolsPageId);
283
+
284
+ // Woocommerce compatibility - automatically add their terms page
285
+ if (get_option('woocommerce_terms_page_id')) {
286
+ gdpr('options')->set('terms_page', get_option('woocommerce_terms_page_id'));
287
+ }
288
+
289
+ gdpr('options')->set('is_installed', 'yes');
290
+ wp_safe_redirect(gdpr('helpers')->getAdminUrl('&gdpr-tab=privacy-policy&gdpr-notice=autoinstall'));
291
+ exit;
292
+ }
293
+
294
+ /**
295
+ * Do nothing, but mark the installer as completed
296
+ */
297
+ public function skipInstall()
298
+ {
299
+ gdpr('options')->set('is_installed', 'yes');
300
+ wp_safe_redirect(gdpr('helpers')->getAdminUrl());
301
+ exit;
302
+ }
303
+ }
src/Installer/InstallerStep.php CHANGED
@@ -1,200 +1,200 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Installer;
4
-
5
- /**
6
- * Handle the plumbing of an installer step
7
- *
8
- * Class InstallerStep
9
- *
10
- * @package Codelight\GDPR\Installer
11
- */
12
- abstract class InstallerStep
13
- {
14
- /* @var string */
15
- protected $stepType;
16
-
17
- /* @var string */
18
- protected $slug;
19
-
20
- /* @var string */
21
- protected $type;
22
-
23
- /* @var string */
24
- protected $template;
25
-
26
- /* @var int */
27
- protected $activeSteps;
28
-
29
- /**
30
- * Render a step for viewing
31
- */
32
- public function run()
33
- {
34
- $this->enqueue();
35
- $this->renderHeader();
36
- $this->renderContent();
37
- $this->renderNonce();
38
- $this->renderFooter();
39
- }
40
-
41
- /**
42
- * Validate the form submission
43
- *
44
- * @return bool
45
- */
46
- public function validate()
47
- {
48
- return true;
49
- }
50
-
51
- /**
52
- * Validate the nonce
53
- *
54
- * @return bool
55
- */
56
- public function validateNonce()
57
- {
58
- return isset($_POST['gdpr_nonce']) && wp_verify_nonce($_POST['gdpr_nonce'], $this->slug);
59
- }
60
-
61
- /**
62
- * Process the form submission
63
- */
64
- public function submit()
65
- {
66
-
67
- }
68
-
69
-
70
- /**
71
- * Display error notice or something
72
- */
73
- public function getErrors()
74
- {
75
- return $this->errors;
76
- }
77
-
78
- /**
79
- * Register WP's default assets and plugin installer assets
80
- */
81
- protected function enqueue()
82
- {
83
- wp_enqueue_style('common');
84
- wp_enqueue_style('buttons');
85
-
86
- /**
87
- * GDPR installer custom styles
88
- */
89
- wp_enqueue_style(
90
- 'gdpr-installer',
91
- gdpr('config')->get('plugin.url') . 'assets/gdpr-installer.css'
92
- );
93
-
94
- wp_enqueue_style(
95
- 'select2css',
96
- '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css'
97
- );
98
-
99
- wp_enqueue_script('jquery');
100
- wp_enqueue_script('jquery-ui-core');
101
- wp_enqueue_script('jquery-ui-widget');
102
- wp_enqueue_script('jquery-ui-mouse');
103
- wp_enqueue_script('jquery-ui-sortable');
104
- wp_enqueue_script('jquery-ui-tabs');
105
- wp_enqueue_script(
106
- 'select2',
107
- '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.min.js',
108
- ['jquery']
109
- );
110
- wp_enqueue_script(
111
- 'conditional-show',
112
- gdpr('config')->get('plugin.url') . 'assets/conditional-show.js',
113
- ['jquery']
114
- );
115
-
116
- //global $wp_scripts;
117
- //$ui = $wp_scripts->query('jquery-ui-core');
118
- //wp_enqueue_style('jquery-ui-smoothness', "//ajax.googleapis.com/ajax/libs/jqueryui/{$ui->ver}/themes/smoothness/jquery-ui.min.css", false, null);
119
-
120
- wp_enqueue_script(
121
- 'jquery-repeater',
122
- gdpr('config')->get('plugin.url') . 'assets/jquery.repeater.min.js',
123
- ['jquery']
124
- );
125
-
126
- /**
127
- * Installer javascript
128
- */
129
- wp_enqueue_script(
130
- 'gdpr-installer',
131
- gdpr('config')->get('plugin.url') . 'assets/gdpr-installer.js',
132
- ['jquery', 'select2']
133
- );
134
- }
135
-
136
- /**
137
- * Render the installer page header - html head, form, logo
138
- */
139
- protected function renderHeader()
140
- {
141
- echo gdpr('view')->render('installer/header', ['activeSteps' => $this->activeSteps]);
142
- }
143
-
144
- /**
145
- * Render the installer page content - should be overridden by child class
146
- */
147
- protected function renderContent()
148
- {
149
- echo gdpr('view')->render($this->template);
150
- }
151
-
152
- /**
153
- * Create and render the nonce based on the name of the current step
154
- */
155
- protected function renderNonce()
156
- {
157
- $nonce = wp_create_nonce($this->slug);
158
- echo gdpr('view')->render('installer/nonce', compact('nonce'));
159
- }
160
-
161
- /**
162
- * Render the footer - nav buttons and closing tags
163
- */
164
- protected function renderFooter()
165
- {
166
- echo gdpr('view')->render('installer/footer');
167
- }
168
-
169
- /**
170
- * @return string
171
- */
172
- public function getUrl()
173
- {
174
- return gdpr('config')->get('installer.wizardUrl') . $this->slug;
175
- }
176
-
177
- /**
178
- * @return string
179
- */
180
- public function getSlug()
181
- {
182
- if (is_null($this->slug)) {
183
- trigger_error("GDPR: Slug not defined for step!", E_USER_ERROR);
184
- }
185
-
186
- return $this->slug;
187
- }
188
-
189
- /**
190
- * @return string
191
- */
192
- public function getType()
193
- {
194
- if (is_null($this->type)) {
195
- trigger_error("GDPR: Type not defined for step {$this->slug}", E_USER_ERROR);
196
- }
197
-
198
- return $this->type;
199
- }
200
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Installer;
4
+
5
+ /**
6
+ * Handle the plumbing of an installer step
7
+ *
8
+ * Class InstallerStep
9
+ *
10
+ * @package Codelight\GDPR\Installer
11
+ */
12
+ abstract class InstallerStep
13
+ {
14
+ /* @var string */
15
+ protected $stepType;
16
+
17
+ /* @var string */
18
+ protected $slug;
19
+
20
+ /* @var string */
21
+ protected $type;
22
+
23
+ /* @var string */
24
+ protected $template;
25
+
26
+ /* @var int */
27
+ protected $activeSteps;
28
+
29
+ /**
30
+ * Render a step for viewing
31
+ */
32
+ public function run()
33
+ {
34
+ $this->enqueue();
35
+ $this->renderHeader();
36
+ $this->renderContent();
37
+ $this->renderNonce();
38
+ $this->renderFooter();
39
+ }
40
+
41
+ /**
42
+ * Validate the form submission
43
+ *
44
+ * @return bool
45
+ */
46
+ public function validate()
47
+ {
48
+ return true;
49
+ }
50
+
51
+ /**
52
+ * Validate the nonce
53
+ *
54
+ * @return bool
55
+ */
56
+ public function validateNonce()
57
+ {
58
+ return isset($_POST['gdpr_nonce']) && wp_verify_nonce($_POST['gdpr_nonce'], $this->slug);
59
+ }
60
+
61
+ /**
62
+ * Process the form submission
63
+ */
64
+ public function submit()
65
+ {
66
+
67
+ }
68
+
69
+
70
+ /**
71
+ * Display error notice or something
72
+ */
73
+ public function getErrors()
74
+ {
75
+ return $this->errors;
76
+ }
77
+
78
+ /**
79
+ * Register WP's default assets and plugin installer assets
80
+ */
81
+ protected function enqueue()
82
+ {
83
+ wp_enqueue_style('common');
84
+ wp_enqueue_style('buttons');
85
+
86
+ /**
87
+ * GDPR installer custom styles
88
+ */
89
+ wp_enqueue_style(
90
+ 'gdpr-installer',
91
+ gdpr('config')->get('plugin.url') . 'assets/gdpr-installer.css'
92
+ );
93
+
94
+ wp_enqueue_style(
95
+ 'select2css',
96
+ '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/css/select2.min.css'
97
+ );
98
+
99
+ wp_enqueue_script('jquery');
100
+ wp_enqueue_script('jquery-ui-core');
101
+ wp_enqueue_script('jquery-ui-widget');
102
+ wp_enqueue_script('jquery-ui-mouse');
103
+ wp_enqueue_script('jquery-ui-sortable');
104
+ wp_enqueue_script('jquery-ui-tabs');
105
+ wp_enqueue_script(
106
+ 'select2',
107
+ '//cdnjs.cloudflare.com/ajax/libs/select2/4.0.5/js/select2.min.js',
108
+ ['jquery']
109
+ );
110
+ wp_enqueue_script(
111
+ 'conditional-show',
112
+ gdpr('config')->get('plugin.url') . 'assets/conditional-show.js',
113
+ ['jquery']
114
+ );
115
+
116
+ //global $wp_scripts;
117
+ //$ui = $wp_scripts->query('jquery-ui-core');
118
+ //wp_enqueue_style('jquery-ui-smoothness', "//ajax.googleapis.com/ajax/libs/jqueryui/{$ui->ver}/themes/smoothness/jquery-ui.min.css", false, null);
119
+
120
+ wp_enqueue_script(
121
+ 'jquery-repeater',
122
+ gdpr('config')->get('plugin.url') . 'assets/jquery.repeater.min.js',
123
+ ['jquery']
124
+ );
125
+
126
+ /**
127
+ * Installer javascript
128
+ */
129
+ wp_enqueue_script(
130
+ 'gdpr-installer',
131
+ gdpr('config')->get('plugin.url') . 'assets/gdpr-installer.js',
132
+ ['jquery', 'select2']
133
+ );
134
+ }
135
+
136
+ /**
137
+ * Render the installer page header - html head, form, logo
138
+ */
139
+ protected function renderHeader()
140
+ {
141
+ echo gdpr('view')->render('installer/header', ['activeSteps' => $this->activeSteps]);
142
+ }
143
+
144
+ /**
145
+ * Render the installer page content - should be overridden by child class
146
+ */
147
+ protected function renderContent()
148
+ {
149
+ echo gdpr('view')->render($this->template);
150
+ }
151
+
152
+ /**
153
+ * Create and render the nonce based on the name of the current step
154
+ */
155
+ protected function renderNonce()
156
+ {
157
+ $nonce = wp_create_nonce($this->slug);
158
+ echo gdpr('view')->render('installer/nonce', compact('nonce'));
159
+ }
160
+
161
+ /**
162
+ * Render the footer - nav buttons and closing tags
163
+ */
164
+ protected function renderFooter()
165
+ {
166
+ echo gdpr('view')->render('installer/footer');
167
+ }
168
+
169
+ /**
170
+ * @return string
171
+ */
172
+ public function getUrl()
173
+ {
174
+ return gdpr('config')->get('installer.wizardUrl') . $this->slug;
175
+ }
176
+
177
+ /**
178
+ * @return string
179
+ */
180
+ public function getSlug()
181
+ {
182
+ if (is_null($this->slug)) {
183
+ trigger_error("GDPR: Slug not defined for step!", E_USER_ERROR);
184
+ }
185
+
186
+ return $this->slug;
187
+ }
188
+
189
+ /**
190
+ * @return string
191
+ */
192
+ public function getType()
193
+ {
194
+ if (is_null($this->type)) {
195
+ trigger_error("GDPR: Type not defined for step {$this->slug}", E_USER_ERROR);
196
+ }
197
+
198
+ return $this->type;
199
+ }
200
+ }
src/Installer/Steps/ConfigurationPages.php CHANGED
@@ -1,61 +1,61 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Installer\Steps;
4
-
5
- use Codelight\GDPR\Installer\InstallerStep;
6
- use Codelight\GDPR\Installer\InstallerStepInterface;
7
-
8
- class ConfigurationPages extends InstallerStep implements InstallerStepInterface
9
- {
10
- protected $slug = 'configuration-pages';
11
-
12
- protected $type = 'wizard';
13
-
14
- protected $template = 'installer/steps/configuration-pages';
15
-
16
- protected $activeSteps = 1;
17
-
18
- protected function renderContent()
19
- {
20
- $privacyToolsPage = gdpr('options')->get('tools_page');
21
- $privacyToolsPageSelector = wp_dropdown_pages([
22
- 'name' => 'gdpr_tools_page',
23
- 'show_option_none' => _x('&mdash; Create a new page &mdash;', '(Admin)', 'gdpr-framework'),
24
- 'option_none_value' => 'new',
25
- 'selected' => $privacyToolsPage ? $privacyToolsPage : 'new',
26
- 'echo' => false,
27
- 'class' => 'gdpr-select js-gdpr-select2',
28
- ]);
29
-
30
- echo gdpr('view')->render(
31
- $this->template,
32
- compact(
33
- 'policyPage',
34
- 'policyPageSelector',
35
- 'privacyToolsPage',
36
- 'privacyToolsPageSelector'
37
- )
38
- );
39
- }
40
-
41
- public function submit()
42
- {
43
- if (isset($_POST['gdpr_create_tools_page']) && 'yes' === $_POST['gdpr_create_tools_page']) {
44
- $id = $this->createPrivacyToolsPage();
45
- gdpr('options')->set('tools_page', $id);
46
- } else {
47
- gdpr('options')->set('tools_page', $_POST['gdpr_tools_page']);
48
- }
49
- }
50
-
51
- protected function createPrivacyToolsPage()
52
- {
53
- $id = wp_insert_post([
54
- 'post_content' => '[gdpr_privacy_tools]',
55
- 'post_title' => __('Privacy Tools', 'gdpr-framework'),
56
- 'post_type' => 'page',
57
- ]);
58
-
59
- return $id;
60
- }
61
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Installer\Steps;
4
+
5
+ use Codelight\GDPR\Installer\InstallerStep;
6
+ use Codelight\GDPR\Installer\InstallerStepInterface;
7
+
8
+ class ConfigurationPages extends InstallerStep implements InstallerStepInterface
9
+ {
10
+ protected $slug = 'configuration-pages';
11
+
12
+ protected $type = 'wizard';
13
+
14
+ protected $template = 'installer/steps/configuration-pages';
15
+
16
+ protected $activeSteps = 1;
17
+
18
+ protected function renderContent()
19
+ {
20
+ $privacyToolsPage = gdpr('options')->get('tools_page');
21
+ $privacyToolsPageSelector = wp_dropdown_pages([
22
+ 'name' => 'gdpr_tools_page',
23
+ 'show_option_none' => _x('&mdash; Create a new page &mdash;', '(Admin)', 'gdpr-framework'),
24
+ 'option_none_value' => 'new',
25
+ 'selected' => $privacyToolsPage ? $privacyToolsPage : 'new',
26
+ 'echo' => false,
27
+ 'class' => 'gdpr-select js-gdpr-select2',
28
+ ]);
29
+
30
+ echo gdpr('view')->render(
31
+ $this->template,
32
+ compact(
33
+ 'policyPage',
34
+ 'policyPageSelector',
35
+ 'privacyToolsPage',
36
+ 'privacyToolsPageSelector'
37
+ )
38
+ );
39
+ }
40
+
41
+ public function submit()
42
+ {
43
+ if (isset($_POST['gdpr_create_tools_page']) && 'yes' === $_POST['gdpr_create_tools_page']) {
44
+ $id = $this->createPrivacyToolsPage();
45
+ gdpr('options')->set('tools_page', $id);
46
+ } else {
47
+ gdpr('options')->set('tools_page', $_POST['gdpr_tools_page']);
48
+ }
49
+ }
50
+
51
+ protected function createPrivacyToolsPage()
52
+ {
53
+ $id = wp_insert_post([
54
+ 'post_content' => '[gdpr_privacy_tools]',
55
+ 'post_title' => __('Privacy Tools', 'gdpr-framework'),
56
+ 'post_type' => 'page',
57
+ ]);
58
+
59
+ return $id;
60
+ }
61
+ }
src/Installer/Steps/ConfigurationSettings.php CHANGED
@@ -1,71 +1,71 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Installer\Steps;
4
-
5
- use Codelight\GDPR\Installer\InstallerStep;
6
- use Codelight\GDPR\Installer\InstallerStepInterface;
7
-
8
- class ConfigurationSettings extends InstallerStep implements InstallerStepInterface
9
- {
10
- protected $slug = 'configuration-settings';
11
-
12
- protected $type = 'wizard';
13
-
14
- protected $template = 'installer/steps/configuration-settings';
15
-
16
- protected $activeSteps = 1;
17
-
18
- protected function renderContent()
19
- {
20
- $privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
21
-
22
- $deleteAction = gdpr('options')->get('delete_action');
23
- $deleteActionEmail = gdpr('options')->get('delete_action_email');
24
-
25
- $exportAction = gdpr('options')->get('export_action');
26
- $exportActionEmail = gdpr('options')->get('export_action_email');
27
-
28
- $reassign = gdpr('options')->get('delete_action_reassign');
29
- $reassignUser = gdpr('options')->get('delete_action_reassign_user');
30
-
31
- echo gdpr('view')->render(
32
- $this->template,
33
- compact(
34
- 'deleteAction',
35
- 'deleteActionEmail',
36
- 'exportAction',
37
- 'exportActionEmail',
38
- 'privacyToolsPageUrl',
39
- 'reassign',
40
- 'reassignUser'
41
- )
42
- );
43
- }
44
-
45
- public function submit()
46
- {
47
- if (isset($_POST['gdpr_export_action'])) {
48
- gdpr('options')->set('delete_action', $_POST['gdpr_export_action']);
49
- }
50
-
51
- if (isset($_POST['gdpr_export_action_email'])) {
52
- gdpr('options')->set('delete_action_email', $_POST['gdpr_export_action_email']);
53
- }
54
-
55
- if (isset($_POST['gdpr_delete_action'])) {
56
- gdpr('options')->set('delete_action', $_POST['gdpr_delete_action']);
57
- }
58
-
59
- if (isset($_POST['gdpr_delete_action_email'])) {
60
- gdpr('options')->set('delete_action_email', $_POST['gdpr_delete_action_email']);
61
- }
62
-
63
- if (isset($_POST['gdpr_delete_action_reassign'])) {
64
- gdpr('options')->set('delete_action_reassign', $_POST['gdpr_delete_action_reassign']);
65
- }
66
-
67
- if (isset($_POST['gdpr_delete_action_reassign_user'])) {
68
- gdpr('options')->set('delete_action_reassign_user', $_POST['gdpr_delete_action_reassign_user']);
69
- }
70
- }
71
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Installer\Steps;
4
+
5
+ use Codelight\GDPR\Installer\InstallerStep;
6
+ use Codelight\GDPR\Installer\InstallerStepInterface;
7
+
8
+ class ConfigurationSettings extends InstallerStep implements InstallerStepInterface
9
+ {
10
+ protected $slug = 'configuration-settings';
11
+
12
+ protected $type = 'wizard';
13
+
14
+ protected $template = 'installer/steps/configuration-settings';
15
+
16
+ protected $activeSteps = 1;
17
+
18
+ protected function renderContent()
19
+ {
20
+ $privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
21
+
22
+ $deleteAction = gdpr('options')->get('delete_action');
23
+ $deleteActionEmail = gdpr('options')->get('delete_action_email');
24
+
25
+ $exportAction = gdpr('options')->get('export_action');
26
+ $exportActionEmail = gdpr('options')->get('export_action_email');
27
+
28
+ $reassign = gdpr('options')->get('delete_action_reassign');
29
+ $reassignUser = gdpr('options')->get('delete_action_reassign_user');
30
+
31
+ echo gdpr('view')->render(
32
+ $this->template,
33
+ compact(
34
+ 'deleteAction',
35
+ 'deleteActionEmail',
36
+ 'exportAction',
37
+ 'exportActionEmail',
38
+ 'privacyToolsPageUrl',
39
+ 'reassign',
40
+ 'reassignUser'
41
+ )
42
+ );
43
+ }
44
+
45
+ public function submit()
46
+ {
47
+ if (isset($_POST['gdpr_export_action'])) {
48
+ gdpr('options')->set('delete_action', $_POST['gdpr_export_action']);
49
+ }
50
+
51
+ if (isset($_POST['gdpr_export_action_email'])) {
52
+ gdpr('options')->set('delete_action_email', $_POST['gdpr_export_action_email']);
53
+ }
54
+
55
+ if (isset($_POST['gdpr_delete_action'])) {
56
+ gdpr('options')->set('delete_action', $_POST['gdpr_delete_action']);
57
+ }
58
+
59
+ if (isset($_POST['gdpr_delete_action_email'])) {
60
+ gdpr('options')->set('delete_action_email', $_POST['gdpr_delete_action_email']);
61
+ }
62
+
63
+ if (isset($_POST['gdpr_delete_action_reassign'])) {
64
+ gdpr('options')->set('delete_action_reassign', $_POST['gdpr_delete_action_reassign']);
65
+ }
66
+
67
+ if (isset($_POST['gdpr_delete_action_reassign_user'])) {
68
+ gdpr('options')->set('delete_action_reassign_user', $_POST['gdpr_delete_action_reassign_user']);
69
+ }
70
+ }
71
+ }
src/Installer/Steps/Consent.php CHANGED
@@ -1,30 +1,30 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Installer\Steps;
4
-
5
- use Codelight\GDPR\Installer\InstallerStep;
6
- use Codelight\GDPR\Installer\InstallerStepInterface;
7
-
8
- class Consent extends InstallerStep implements InstallerStepInterface
9
- {
10
- protected $slug = 'consent';
11
-
12
- protected $type = 'wizard';
13
-
14
- protected $template = 'installer/steps/consent';
15
-
16
- protected $activeSteps = 3;
17
-
18
- protected function renderContent()
19
- {
20
- $isRegistrationOpen = get_option('users_can_register');
21
- $isCommentsEnabled = class_exists('Disable_Comments') ? false : true;
22
- $privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
23
- $hasGravityForms = class_exists('\GFForms');
24
-
25
- echo gdpr('view')->render(
26
- $this->template,
27
- compact('isRegistrationOpen', 'isCommentsEnabled', 'privacyToolsPageUrl', 'hasGravityForms')
28
- );
29
- }
30
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Installer\Steps;
4
+
5
+ use Codelight\GDPR\Installer\InstallerStep;
6
+ use Codelight\GDPR\Installer\InstallerStepInterface;
7
+
8
+ class Consent extends InstallerStep implements InstallerStepInterface
9
+ {
10
+ protected $slug = 'consent';
11
+
12
+ protected $type = 'wizard';
13
+
14
+ protected $template = 'installer/steps/consent';
15
+
16
+ protected $activeSteps = 3;
17
+
18
+ protected function renderContent()
19
+ {
20
+ $isRegistrationOpen = get_option('users_can_register');
21
+ $isCommentsEnabled = class_exists('Disable_Comments') ? false : true;
22
+ $privacyToolsPageUrl = get_permalink(gdpr('options')->get('tools_page'));
23
+ $hasGravityForms = class_exists('\GFForms');
24
+
25
+ echo gdpr('view')->render(
26
+ $this->template,
27
+ compact('isRegistrationOpen', 'isCommentsEnabled', 'privacyToolsPageUrl', 'hasGravityForms')
28
+ );
29
+ }
30
+ }
src/Installer/Steps/Integrations.php CHANGED
@@ -1,48 +1,47 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Installer\Steps;
4
-
5
- use Codelight\GDPR\Installer\InstallerStep;
6
- use Codelight\GDPR\Installer\InstallerStepInterface;
7
-
8
- class Integrations extends InstallerStep implements InstallerStepInterface
9
- {
10
- protected $slug = 'integrations';
11
-
12
- protected $type = 'wizard';
13
-
14
- protected $template = 'installer/steps/integrations';
15
-
16
- protected $activeSteps = 4;
17
-
18
- protected function renderContent()
19
- {
20
- $enableThemeCompatibility = gdpr('options')->get('enable_theme_compatibility');
21
- $currentTheme = gdpr('themes')->getCurrentThemeName();
22
- $isThemeSupported = gdpr('themes')->isCurrentThemeSupported();
23
- $isThemeSupported = true;
24
-
25
- $hasWooCommerce = false;
26
- $hasEDD = false;
27
-
28
- echo gdpr('view')->render(
29
- $this->template,
30
- compact(
31
- 'enableThemeCompatibility',
32
- 'hasEDD',
33
- 'hasWooCommerce',
34
- 'currentTheme',
35
- 'isThemeSupported'
36
- )
37
- );
38
- }
39
-
40
- public function submit()
41
- {
42
- if (isset($_POST['gdpr_enable_theme_compatibility']) && 'yes' === $_POST['gdpr_enable_theme_compatibility']) {
43
- gdpr('options')->set('enable_theme_compatibility', true);
44
- } else {
45
- gdpr('options')->set('enable_theme_compatibility', false);
46
- }
47
- }
48
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Installer\Steps;
4
+
5
+ use Codelight\GDPR\Installer\InstallerStep;
6
+ use Codelight\GDPR\Installer\InstallerStepInterface;
7
+
8
+ class Integrations extends InstallerStep implements InstallerStepInterface
9
+ {
10
+ protected $slug = 'integrations';
11
+
12
+ protected $type = 'wizard';
13
+
14
+ protected $template = 'installer/steps/integrations';
15
+
16
+ protected $activeSteps = 4;
17
+
18
+ protected function renderContent()
19
+ {
20
+ $enableThemeCompatibility = gdpr('options')->get('enable_theme_compatibility');
21
+ $currentTheme = gdpr('themes')->getCurrentThemeName();
22
+ $isThemeSupported = gdpr('themes')->isCurrentThemeSupported();
23
+
24
+ $hasWooCommerce = false;
25
+ $hasEDD = false;
26
+
27
+ echo gdpr('view')->render(
28
+ $this->template,
29
+ compact(
30
+ 'enableThemeCompatibility',
31
+ 'hasEDD',
32
+ 'hasWooCommerce',
33
+ 'currentTheme',
34
+ 'isThemeSupported'
35
+ )
36
+ );
37
+ }
38
+
39
+ public function submit()
40
+ {
41
+ if (isset($_POST['gdpr_enable_theme_compatibility']) && 'yes' === $_POST['gdpr_enable_theme_compatibility']) {
42
+ gdpr('options')->set('enable_theme_compatibility', true);
43
+ } else {
44
+ gdpr('options')->set('enable_theme_compatibility', false);
45
+ }
46
+ }
47
+ }
 
src/Installer/Steps/PolicyContents.php CHANGED
@@ -1,31 +1,31 @@
1
- <?php
2
-
3
-
4
- namespace Codelight\GDPR\Installer\Steps;
5
-
6
-
7
- use Codelight\GDPR\Installer\InstallerStep;
8
- use Codelight\GDPR\Installer\InstallerStepInterface;
9
-
10
- class PolicyContents extends InstallerStep implements InstallerStepInterface
11
- {
12
- protected $slug = 'policy-contents';
13
-
14
- protected $type = 'wizard';
15
-
16
- protected $template = 'installer/steps/policy-contents';
17
-
18
- protected $activeSteps = 2;
19
-
20
- protected function renderContent()
21
- {
22
- $policyUrl = get_permalink(gdpr('options')->get('policy_page'));
23
- $editPolicyUrl = get_edit_post_link(gdpr('options')->get('policy_page'));
24
- $policyGenerated = gdpr('options')->get('policy_generated');
25
-
26
- echo gdpr('view')->render(
27
- $this->template,
28
- compact('policyUrl', 'editPolicyUrl', 'policyGenerated')
29
- );
30
- }
31
- }
1
+ <?php
2
+
3
+
4
+ namespace Codelight\GDPR\Installer\Steps;
5
+
6
+
7
+ use Codelight\GDPR\Installer\InstallerStep;
8
+ use Codelight\GDPR\Installer\InstallerStepInterface;
9
+
10
+ class PolicyContents extends InstallerStep implements InstallerStepInterface
11
+ {
12
+ protected $slug = 'policy-contents';
13
+
14
+ protected $type = 'wizard';
15
+
16
+ protected $template = 'installer/steps/policy-contents';
17
+
18
+ protected $activeSteps = 2;
19
+
20
+ protected function renderContent()
21
+ {
22
+ $policyUrl = get_permalink(gdpr('options')->get('policy_page'));
23
+ $editPolicyUrl = get_edit_post_link(gdpr('options')->get('policy_page'));
24
+ $policyGenerated = gdpr('options')->get('policy_generated');
25
+
26
+ echo gdpr('view')->render(
27
+ $this->template,
28
+ compact('policyUrl', 'editPolicyUrl', 'policyGenerated')
29
+ );
30
+ }
31
+ }
src/Installer/Steps/PolicySettings.php CHANGED
@@ -1,215 +1,215 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Installer\Steps;
4
-
5
- use Codelight\GDPR\Installer\InstallerStep;
6
- use Codelight\GDPR\Installer\InstallerStepInterface;
7
-
8
- class PolicySettings extends InstallerStep implements InstallerStepInterface
9
- {
10
- protected $slug = 'policy-settings';
11
-
12
- protected $type = 'wizard';
13
-
14
- protected $template = 'installer/steps/policy-settings';
15
-
16
- protected $activeSteps = 2;
17
-
18
- protected function renderContent()
19
- {
20
- $policyPage = gdpr('options')->get('policy_page');
21
- $policyPageSelector = wp_dropdown_pages([
22
- 'name' => 'gdpr_policy_page',
23
- 'show_option_none' => _x('&mdash; Create a new page &mdash;', '(Admin)', 'gdpr-framework'),
24
- 'option_none_value' => 'new',
25
- 'selected' => $policyPage ? $policyPage : 'new',
26
- 'echo' => false,
27
- 'class' => 'gdpr-select js-gdpr-select2',
28
- ]);
29
-
30
- $hasTermsPage = gdpr('options')->get('has_terms_page');
31
- $termsPage = gdpr('options')->get('terms_page');
32
-
33
- // Woo compatibility
34
- if (!$termsPage && get_option('woocommerce_terms_page_id')) {
35
- $hasTermsPage = 'yes';
36
- $termsPage = get_option('woocommerce_terms_page_id');
37
- $termsPageNote = _x(
38
- 'We have automatically selected your WooCommerce Terms & Conditions page.',
39
- '(Admin)',
40
- 'gdpr-framework'
41
- );
42
- } else {
43
- $termsPageNote = false;
44
- }
45
-
46
- $termsPageSelector = wp_dropdown_pages([
47
- 'name' => 'gdpr_terms_page',
48
- 'show_option_none' => _x('&mdash; Create a new page &mdash;', '(Admin)', 'gdpr-framework'),
49
- 'option_none_value' => 'new',
50
- 'selected' => $termsPage ? $termsPage : 'new',
51
- 'echo' => false,
52
- 'class' => 'gdpr-select js-gdpr-select2',
53
- ]);
54
-
55
- $companyName = gdpr('options')->get('company_name');
56
- $companyLocation = gdpr('options')->get('company_location');
57
- $countryOptions = gdpr('helpers')->getCountrySelectOptions($companyLocation);
58
- $contactEmail = gdpr('options')->get('contact_email') ?
59
- gdpr('options')->get('contact_email') :
60
- get_option('admin_email');
61
-
62
- $representativeContactName = gdpr('options')->get('representative_contact_name');
63
- $representativeContactEmail = gdpr('options')->get('representative_contact_email');
64
- $representativeContactPhone = gdpr('options')->get('representative_contact_phone');
65
-
66
- $dpaWebsite = gdpr('options')->get('dpa_name');
67
- $dpaEmail = gdpr('options')->get('dpa_email');
68
- $dpaPhone = gdpr('options')->get('dpa_phone');
69
- $dpaData = json_encode(gdpr('helpers')->getDataProtectionAuthorities());
70
-
71
- $hasDPO = gdpr('options')->get('has_dpo');
72
- $dpoName = gdpr('options')->get('dpo_name');
73
- $dpoEmail = gdpr('options')->get('dpo_email');
74
-
75
- echo gdpr('view')->render(
76
- $this->template,
77
- compact(
78
- 'policyPage',
79
- 'policyPageSelector',
80
- 'companyName',
81
- 'companyLocation',
82
- 'contactEmail',
83
- 'countryOptions',
84
- 'hasDPO',
85
- 'dpoEmail',
86
- 'dpoName',
87
- 'representativeContactName',
88
- 'representativeContactEmail',
89
- 'representativeContactPhone',
90
- 'dpaWebsite',
91
- 'dpaEmail',
92
- 'dpaPhone',
93
- 'dpaData',
94
- 'hasTermsPage',
95
- 'termsPage',
96
- 'termsPageSelector',
97
- 'termsPageNote'
98
- )
99
- );
100
- }
101
-
102
- /*
103
- public function validate()
104
- {
105
- if (!is_email($_POST['gdpr_contact_email'])) {
106
- $this->errors = 'Company email is not a valid email!';
107
- return false;
108
- }
109
-
110
- return true;
111
-
112
- //filter_var($url, FILTER_VALIDATE_URL) === FALSE
113
- }
114
- */
115
-
116
- public function submit()
117
- {
118
- /**
119
- * Policy page
120
- */
121
- if (isset($_POST['gdpr_create_policy_page']) && 'yes' === $_POST['gdpr_create_policy_page']) {
122
- $id = $this->createPolicyPage();
123
- gdpr('options')->set('policy_page', $id);
124
- } else {
125
- gdpr('options')->set('policy_page', $_POST['gdpr_policy_page']);
126
- }
127
-
128
- /**
129
- * 'Generate policy' checkbox
130
- */
131
- if (isset($_POST['gdpr_generate_policy']) && 'yes' === $_POST['gdpr_generate_policy']) {
132
- $this->generatePolicy();
133
- gdpr('options')->set('policy_generated', true);
134
- } else {
135
- gdpr('options')->set('policy_generated', false);
136
- }
137
-
138
- /**
139
- * Company information
140
- */
141
- gdpr('options')->set('company_name', $_POST['gdpr_company_name']);
142
- gdpr('options')->set('company_location', $_POST['gdpr_company_location']);
143
-
144
- if (is_email($_POST['gdpr_contact_email'])) {
145
- gdpr('options')->set('contact_email', $_POST['gdpr_contact_email']);
146
- }
147
-
148
- /**
149
- * Data Protection Officer
150
- */
151
- if (isset($_POST['gdpr_has_dpo'])) {
152
- gdpr('options')->set('has_dpo', $_POST['gdpr_has_dpo']);
153
- }
154
-
155
- gdpr('options')->set('dpo_name', $_POST['gdpr_dpo_name']);
156
-
157
- if (is_email($_POST['gdpr_dpo_email'])) {
158
- gdpr('options')->set('dpo_email', $_POST['gdpr_dpo_email']);
159
- }
160
-
161
- /**
162
- * Representative contact
163
- */
164
- gdpr('options')->set('representative_contact_name', $_POST['gdpr_representative_contact_name']);
165
- gdpr('options')->set('representative_contact_phone', $_POST['gdpr_representative_contact_phone']);
166
-
167
- if (is_email($_POST['gdpr_representative_contact_email'])) {
168
- gdpr('options')->set('representative_contact_email', $_POST['gdpr_representative_contact_email']);
169
- }
170
-
171
- /**
172
- * Data protection authority
173
- */
174
- gdpr('options')->set('dpa_website', $_POST['gdpr_dpa_website']);
175
- gdpr('options')->set('dpa_phone', $_POST['gdpr_dpa_phone']);
176
-
177
- if (is_email($_POST['gdpr_dpa_email'])) {
178
- gdpr('options')->set('dpa_email', $_POST['gdpr_dpa_email']);
179
- }
180
-
181
-
182
- /**
183
- * Terms page
184
- */
185
- if (isset($_POST['gdpr_has_terms_page'])) {
186
- gdpr('options')->set('has_terms_page', $_POST['gdpr_has_terms_page']);
187
- }
188
-
189
- if (isset($_POST['gdpr_has_terms_page']) && 'yes' === $_POST['gdpr_has_terms_page'] && isset($_POST['gdpr_terms_page'])) {
190
- gdpr('options')->set('terms_page', $_POST['gdpr_terms_page']);
191
- } else {
192
- gdpr('options')->delete('terms_page');
193
- }
194
- }
195
-
196
- protected function createPolicyPage()
197
- {
198
- $id = wp_insert_post([
199
- 'post_title' => __('Privacy Policy', 'gdpr-framework'),
200
- 'post_type' => 'page',
201
- ]);
202
-
203
- return $id;
204
- }
205
-
206
- protected function generatePolicy()
207
- {
208
- wp_update_post([
209
- 'ID' => gdpr('options')->get('policy_page'),
210
- 'post_content' => gdpr('view')->render(
211
- 'policy/policy'
212
- ),
213
- ]);
214
- }
215
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Installer\Steps;
4
+
5
+ use Codelight\GDPR\Installer\InstallerStep;
6
+ use Codelight\GDPR\Installer\InstallerStepInterface;
7
+
8
+ class PolicySettings extends InstallerStep implements InstallerStepInterface
9
+ {
10
+ protected $slug = 'policy-settings';
11
+
12
+ protected $type = 'wizard';
13
+
14
+ protected $template = 'installer/steps/policy-settings';
15
+
16
+ protected $activeSteps = 2;
17
+
18
+ protected function renderContent()
19
+ {
20
+ $policyPage = gdpr('options')->get('policy_page');
21
+ $policyPageSelector = wp_dropdown_pages([
22
+ 'name' => 'gdpr_policy_page',
23
+ 'show_option_none' => _x('&mdash; Create a new page &mdash;', '(Admin)', 'gdpr-framework'),
24
+ 'option_none_value' => 'new',
25
+ 'selected' => $policyPage ? $policyPage : 'new',
26
+ 'echo' => false,
27
+ 'class' => 'gdpr-select js-gdpr-select2',
28
+ ]);
29
+
30
+ $hasTermsPage = gdpr('options')->get('has_terms_page');
31
+ $termsPage = gdpr('options')->get('terms_page');
32
+
33
+ // Woo compatibility
34
+ if (!$termsPage && get_option('woocommerce_terms_page_id')) {
35
+ $hasTermsPage = 'yes';
36
+ $termsPage = get_option('woocommerce_terms_page_id');
37
+ $termsPageNote = _x(
38
+ 'We have automatically selected your WooCommerce Terms & Conditions page.',
39
+ '(Admin)',
40
+ 'gdpr-framework'
41
+ );
42
+ } else {
43
+ $termsPageNote = false;
44
+ }
45
+
46
+ $termsPageSelector = wp_dropdown_pages([
47
+ 'name' => 'gdpr_terms_page',
48
+ 'show_option_none' => _x('&mdash; Create a new page &mdash;', '(Admin)', 'gdpr-framework'),
49
+ 'option_none_value' => 'new',
50
+ 'selected' => $termsPage ? $termsPage : 'new',
51
+ 'echo' => false,
52
+ 'class' => 'gdpr-select js-gdpr-select2',
53
+ ]);
54
+
55
+ $companyName = gdpr('options')->get('company_name');
56
+ $companyLocation = gdpr('options')->get('company_location');
57
+ $countryOptions = gdpr('helpers')->getCountrySelectOptions($companyLocation);
58
+ $contactEmail = gdpr('options')->get('contact_email') ?
59
+ gdpr('options')->get('contact_email') :
60
+ get_option('admin_email');
61
+
62
+ $representativeContactName = gdpr('options')->get('representative_contact_name');
63
+ $representativeContactEmail = gdpr('options')->get('representative_contact_email');
64
+ $representativeContactPhone = gdpr('options')->get('representative_contact_phone');
65
+
66
+ $dpaWebsite = gdpr('options')->get('dpa_name');
67
+ $dpaEmail = gdpr('options')->get('dpa_email');
68
+ $dpaPhone = gdpr('options')->get('dpa_phone');
69
+ $dpaData = json_encode(gdpr('helpers')->getDataProtectionAuthorities());
70
+
71
+ $hasDPO = gdpr('options')->get('has_dpo');
72
+ $dpoName = gdpr('options')->get('dpo_name');
73
+ $dpoEmail = gdpr('options')->get('dpo_email');
74
+
75
+ echo gdpr('view')->render(
76
+ $this->template,
77
+ compact(
78
+ 'policyPage',
79
+ 'policyPageSelector',
80
+ 'companyName',
81
+ 'companyLocation',
82
+ 'contactEmail',
83
+ 'countryOptions',
84
+ 'hasDPO',
85
+ 'dpoEmail',
86
+ 'dpoName',
87
+ 'representativeContactName',
88
+ 'representativeContactEmail',
89
+ 'representativeContactPhone',
90
+ 'dpaWebsite',
91
+ 'dpaEmail',
92
+ 'dpaPhone',
93
+ 'dpaData',
94
+ 'hasTermsPage',
95
+ 'termsPage',
96
+ 'termsPageSelector',
97
+ 'termsPageNote'
98
+ )
99
+ );
100
+ }
101
+
102
+ /*
103
+ public function validate()
104
+ {
105
+ if (!is_email($_POST['gdpr_contact_email'])) {
106
+ $this->errors = 'Company email is not a valid email!';
107
+ return false;
108
+ }
109
+
110
+ return true;
111
+
112
+ //filter_var($url, FILTER_VALIDATE_URL) === FALSE
113
+ }
114
+ */
115
+
116
+ public function submit()
117
+ {
118
+ /**
119
+ * Policy page
120
+ */
121
+ if (isset($_POST['gdpr_create_policy_page']) && 'yes' === $_POST['gdpr_create_policy_page']) {
122
+ $id = $this->createPolicyPage();
123
+ gdpr('options')->set('policy_page', $id);
124
+ } else {
125
+ gdpr('options')->set('policy_page', $_POST['gdpr_policy_page']);
126
+ }
127
+
128
+ /**
129
+ * 'Generate policy' checkbox
130
+ */
131
+ if (isset($_POST['gdpr_generate_policy']) && 'yes' === $_POST['gdpr_generate_policy']) {
132
+ $this->generatePolicy();
133
+ gdpr('options')->set('policy_generated', true);
134
+ } else {
135
+ gdpr('options')->set('policy_generated', false);
136
+ }
137
+
138
+ /**
139
+ * Company information
140
+ */
141
+ gdpr('options')->set('company_name', $_POST['gdpr_company_name']);
142
+ gdpr('options')->set('company_location', $_POST['gdpr_company_location']);
143
+
144
+ if (is_email($_POST['gdpr_contact_email'])) {
145
+ gdpr('options')->set('contact_email', $_POST['gdpr_contact_email']);
146
+ }
147
+
148
+ /**
149
+ * Data Protection Officer
150
+ */
151
+ if (isset($_POST['gdpr_has_dpo'])) {
152
+ gdpr('options')->set('has_dpo', $_POST['gdpr_has_dpo']);
153
+ }
154
+
155
+ gdpr('options')->set('dpo_name', $_POST['gdpr_dpo_name']);
156
+
157
+ if (is_email($_POST['gdpr_dpo_email'])) {
158
+ gdpr('options')->set('dpo_email', $_POST['gdpr_dpo_email']);
159
+ }
160
+
161
+ /**
162
+ * Representative contact
163
+ */
164
+ gdpr('options')->set('representative_contact_name', $_POST['gdpr_representative_contact_name']);
165
+ gdpr('options')->set('representative_contact_phone', $_POST['gdpr_representative_contact_phone']);
166
+
167
+ if (is_email($_POST['gdpr_representative_contact_email'])) {
168
+ gdpr('options')->set('representative_contact_email', $_POST['gdpr_representative_contact_email']);
169
+ }
170
+
171
+ /**
172
+ * Data protection authority
173
+ */
174
+ gdpr('options')->set('dpa_website', $_POST['gdpr_dpa_website']);
175
+ gdpr('options')->set('dpa_phone', $_POST['gdpr_dpa_phone']);
176
+
177
+ if (is_email($_POST['gdpr_dpa_email'])) {
178
+ gdpr('options')->set('dpa_email', $_POST['gdpr_dpa_email']);
179
+ }
180
+
181
+
182
+ /**
183
+ * Terms page
184
+ */
185
+ if (isset($_POST['gdpr_has_terms_page'])) {
186
+ gdpr('options')->set('has_terms_page', $_POST['gdpr_has_terms_page']);
187
+ }
188
+
189
+ if (isset($_POST['gdpr_has_terms_page']) && 'yes' === $_POST['gdpr_has_terms_page'] && isset($_POST['gdpr_terms_page'])) {
190
+ gdpr('options')->set('terms_page', $_POST['gdpr_terms_page']);
191
+ } else {
192
+ gdpr('options')->delete('terms_page');
193
+ }
194
+ }
195
+
196
+ protected function createPolicyPage()
197
+ {
198
+ $id = wp_insert_post([
199
+ 'post_title' => __('Privacy Policy', 'gdpr-framework'),
200
+ 'post_type' => 'page',
201
+ ]);
202
+
203
+ return $id;
204
+ }
205
+
206
+ protected function generatePolicy()
207
+ {
208
+ wp_update_post([
209
+ 'ID' => gdpr('options')->get('policy_page'),
210
+ 'post_content' => gdpr('view')->render(
211
+ 'policy/policy'
212
+ ),
213
+ ]);
214
+ }
215
+ }
src/Modules/ContactForm7/ContactForm7.php CHANGED
@@ -1,108 +1,108 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Modules\ContactForm7;
4
-
5
- use Codelight\GDPR\Components\Consent\ConsentManager;
6
- use Codelight\GDPR\DataSubject\DataSubjectManager;
7
-
8
- class ContactForm7
9
- {
10
- public function __construct(DataSubjectManager $dataSubjectManager, ConsentManager $consentManager)
11
- {
12
- $this->dataSubjectManager = $dataSubjectManager;
13
- $this->consentManager = $consentManager;
14
-
15
- //add_action('wpcf7_init', [$this, 'addFormTags'], 10, 3);
16
- //add_action('wpcf7_admin_init', [$this, 'addFormTagGenerators'], 9999, 3);
17
-
18
- add_action('wpcf7_before_send_mail', [$this, 'processFormSubmission'], 10, 3);
19
- }
20
-
21
- public function addFormTags()
22
- {
23
- wpcf7_add_form_tag(
24
- ['gdpr_consent_text'],
25
- [$this, 'renderPrivacyTag']
26
- );
27
- }
28
-
29
- public function addFormTagGenerators()
30
- {
31
- $generator = \WPCF7_TagGenerator::get_instance();
32
-
33
- $generator->add(
34
- 'gdpr_privacy',
35
- _x('gdpr terms txt', '(Admin)', 'gdpr-framework'),
36
- [$this, 'generatePrivacyTag']
37
- );
38
- }
39
-
40
- public function generatePrivacyTag($contactForm, $args)
41
- {
42
- //$args = wp_parse_args( $args, array() );
43
- //$description = _x( "Generate the default text for your Privacy Policy acceptance checkbox. For more details, see %s.", '(Admin)', 'gdpr-framework' );
44
- //$descLink = wpcf7_link( _x( 'https://TODO', '(Admin)', 'gdpr-framework' ), _x( 'GDPR Terms', '(Admin)', 'gdpr-framework' ) );
45
- //$content = $this->renderPrivacyTag();
46
-
47
- echo gdpr('view')->render(
48
- 'modules/contact-form-7/generator-privacy',
49
- compact('description', 'descLink', 'args', 'content')
50
- );
51
- }
52
-
53
- public function renderPrivacyTag()
54
- {
55
- $privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
56
-
57
- return gdpr('view')->render(
58
- 'modules/contact-form-7/content-privacy',
59
- compact('privacyPolicyUrl')
60
- );
61
- }
62
-
63
- public function processFormSubmission(\WPCF7_ContactForm $form, $abort, \WPCF7_Submission $submission)
64
- {
65
- $consents = $this->findConsents($form, $submission);
66
-
67
- if (!count($consents)) {
68
- return;
69
- }
70
-
71
- $email = $this->findEmail($submission);
72
-
73
- if (!$email) {
74
- return;
75
- }
76
-
77
- $dataSubject = $this->dataSubjectManager->getByEmail($email);
78
-
79
- foreach ($consents as $consent) {
80
- $dataSubject->giveConsent($consent);
81
- }
82
- }
83
-
84
- public function findConsents(\WPCF7_ContactForm $form, \WPCF7_Submission $submission)
85
- {
86
- $consents = [];
87
-
88
- foreach ($form->scan_form_tags() as $tag) {
89
- /* @var $tag \WPCF7_FormTag */
90
- if ('acceptance' === $tag->type && $submission->get_posted_data()[$tag->name] && $this->consentManager->isRegisteredConsent($tag->name)) {
91
- $consents[] = $tag->name;
92
- }
93
- }
94
-
95
- return $consents;
96
- }
97
-
98
- public function findEmail(\WPCF7_Submission $submission)
99
- {
100
- if (isset($submission->get_posted_data()['your-email'])) {
101
- return $submission->get_posted_data()['your-email'];
102
- }
103
-
104
- if (isset($submission->get_posted_data()['email'])) {
105
- return $submission->get_posted_data()['email'];
106
- }
107
- }
108
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Modules\ContactForm7;
4
+
5
+ use Codelight\GDPR\Components\Consent\ConsentManager;
6
+ use Codelight\GDPR\DataSubject\DataSubjectManager;
7
+
8
+ class ContactForm7
9
+ {
10
+ public function __construct(DataSubjectManager $dataSubjectManager, ConsentManager $consentManager)
11
+ {
12
+ $this->dataSubjectManager = $dataSubjectManager;
13
+ $this->consentManager = $consentManager;
14
+
15
+ //add_action('wpcf7_init', [$this, 'addFormTags'], 10, 3);
16
+ //add_action('wpcf7_admin_init', [$this, 'addFormTagGenerators'], 9999, 3);
17
+
18
+ add_action('wpcf7_before_send_mail', [$this, 'processFormSubmission'], 10, 3);
19
+ }
20
+
21
+ public function addFormTags()
22
+ {
23
+ wpcf7_add_form_tag(
24
+ ['gdpr_consent_text'],
25
+ [$this, 'renderPrivacyTag']
26
+ );
27
+ }
28
+
29
+ public function addFormTagGenerators()
30
+ {
31
+ $generator = \WPCF7_TagGenerator::get_instance();
32
+
33
+ $generator->add(
34
+ 'gdpr_privacy',
35
+ _x('gdpr terms txt', '(Admin)', 'gdpr-framework'),
36
+ [$this, 'generatePrivacyTag']
37
+ );
38
+ }
39
+
40
+ public function generatePrivacyTag($contactForm, $args)
41
+ {
42
+ //$args = wp_parse_args( $args, array() );
43
+ //$description = _x( "Generate the default text for your Privacy Policy acceptance checkbox. For more details, see %s.", '(Admin)', 'gdpr-framework' );
44
+ //$descLink = wpcf7_link( _x( 'https://TODO', '(Admin)', 'gdpr-framework' ), _x( 'GDPR Terms', '(Admin)', 'gdpr-framework' ) );
45
+ //$content = $this->renderPrivacyTag();
46
+
47
+ echo gdpr('view')->render(
48
+ 'modules/contact-form-7/generator-privacy',
49
+ compact('description', 'descLink', 'args', 'content')
50
+ );
51
+ }
52
+
53
+ public function renderPrivacyTag()
54
+ {
55
+ $privacyPolicyUrl = get_permalink(gdpr('options')->get('policy_page'));
56
+
57
+ return gdpr('view')->render(
58
+ 'modules/contact-form-7/content-privacy',
59
+ compact('privacyPolicyUrl')
60
+ );
61
+ }
62
+
63
+ public function processFormSubmission(\WPCF7_ContactForm $form, $abort, \WPCF7_Submission $submission)
64
+ {
65
+ $consents = $this->findConsents($form, $submission);
66
+
67
+ if (!count($consents)) {
68
+ return;
69
+ }
70
+
71
+ $email = $this->findEmail($submission);
72
+
73
+ if (!$email) {
74
+ return;
75
+ }
76
+
77
+ $dataSubject = $this->dataSubjectManager->getByEmail($email);
78
+
79
+ foreach ($consents as $consent) {
80
+ $dataSubject->giveConsent($consent);
81
+ }
82
+ }
83
+
84
+ public function findConsents(\WPCF7_ContactForm $form, \WPCF7_Submission $submission)
85
+ {
86
+ $consents = [];
87
+
88
+ foreach ($form->scan_form_tags() as $tag) {
89
+ /* @var $tag \WPCF7_FormTag */
90
+ if ('acceptance' === $tag->type && $submission->get_posted_data()[$tag->name] && $this->consentManager->isRegisteredConsent($tag->name)) {
91
+ $consents[] = $tag->name;
92
+ }
93
+ }
94
+
95
+ return $consents;
96
+ }
97
+
98
+ public function findEmail(\WPCF7_Submission $submission)
99
+ {
100
+ if (isset($submission->get_posted_data()['your-email'])) {
101
+ return $submission->get_posted_data()['your-email'];
102
+ }
103
+
104
+ if (isset($submission->get_posted_data()['email'])) {
105
+ return $submission->get_posted_data()['email'];
106
+ }
107
+ }
108
+ }
src/Modules/WPML/WPML.php CHANGED
@@ -1,153 +1,153 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR\Modules\WPML;
4
-
5
- class WPML
6
- {
7
- protected $prefix = 'gdpr_';
8
-
9
- protected $translatableOptions = [
10
- 'tools_page',
11
- 'policy_page',
12
- 'terms_page',
13
- 'consent_info',
14
- ];
15
-
16
- public function __construct()
17
- {
18
- if (!class_exists('Sitepress')) {
19
- return;
20
- }
21
-
22
- $this->setupOptionFilters();
23
- }
24
-
25
- protected function setupOptionFilters()
26
- {
27
- foreach ($this->translatableOptions as $option) {
28
- add_filter("gdpr/options/get/{$option}", [$this, 'getTranslatedOption']);
29
-
30
- $option = $this->prefix($option);
31
- add_filter("pre_update_option_{$option}", [$this, 'setTranslatedOption'], 10, 2);
32
- }
33
-
34
- add_filter('gdpr/options/get/consent_types', [$this, 'getConsentTypes']);
35
- add_filter('gdpr/options/set/consent_types', [$this, 'saveConsentTypes']);
36
- }
37
-
38
- public function getTranslatedOption($option)
39
- {
40
- if (!defined('ICL_LANGUAGE_CODE')) {
41
- if (is_array($option)) {
42
- return '';
43
- } else {
44
- return $option;
45
- }
46
- }
47
-
48
- if (isset($option[ICL_LANGUAGE_CODE])) {
49
- return $option[ICL_LANGUAGE_CODE];
50
- } else {
51
- return '';
52
- }
53
- }
54
-
55
- public function setTranslatedOption($newValue, $oldValue)
56
- {
57
- if (!defined('ICL_LANGUAGE_CODE')) {
58
- return $newValue;
59
- }
60
-
61
- if (is_array($oldValue)) {
62
- $value = $oldValue;
63
- } else {
64
- $value = [];
65
- }
66
-
67
- $value[ICL_LANGUAGE_CODE] = $newValue;
68
-
69
- return $value;
70
- }
71
-
72
- public function getConsentTypes($consentTypes)
73
- {
74
- if (!defined('ICL_LANGUAGE_CODE')) {
75
- return $consentTypes;
76
- }
77
-
78
- $code = ICL_LANGUAGE_CODE;
79
- $filteredConsentTypes = [];
80
-
81
- if (count($consentTypes)) {
82
- foreach ($consentTypes as $consentType) {
83
-
84
- if ('privacy-policy' === $consentType['slug'] or 'terms-condition' === $consentType['slug']) {
85
- $filteredConsentTypes[] = [
86
- 'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
87
- 'visible' => isset($consentType['visible']) ? $consentType['visible'] : 0,
88
- 'title' => isset($consentType["title"]) ? $consentType["title"] : '',
89
- 'description' => isset($consentType["description"]) ? $consentType["description"] : '',
90
- ];
91
- } else {
92
- $filteredConsentTypes[] = [
93
- 'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
94
- 'visible' => isset($consentType['visible']) ? $consentType['visible'] : 0,
95
- 'title' => isset($consentType["{$code}_title"]) ? $consentType["{$code}_title"] : '',
96
- 'description' => isset($consentType["{$code}_description"]) ? $consentType["{$code}_description"] : '',
97
- ];
98
- }
99
- }
100
- }
101
-
102
- return $filteredConsentTypes;
103
- }
104
-
105
- public function saveConsentTypes($newConsentTypes)
106
- {
107
- if (!defined('ICL_LANGUAGE_CODE')) {
108
- return $newConsentTypes;
109
- }
110
-
111
- $code = ICL_LANGUAGE_CODE;
112
- $translatedConsentTypes = [];
113
- $currentConsentTypes = gdpr('options')->get('consent_types', null, false);
114
-
115
- if (count($newConsentTypes)) {
116
- foreach ($newConsentTypes as &$newConsentType) {
117
-
118
- // Match an existing consent type with the new one
119
- $slug = $newConsentType['slug'];
120
- $existingConsentType = current(array_filter($currentConsentTypes, function($value) use ($slug) {
121
- return $value['slug'] === $slug;
122
- }));
123
-
124
- if ($existingConsentType) {
125
- // We have a matching existing consent - update translations, keep the rest
126
- $existingConsentType["{$code}_title"] = $newConsentType['title'];
127
- $existingConsentType["{$code}_description"] = $newConsentType['description'];
128
-
129
- $translatedConsentTypes[] = $existingConsentType;
130
- } else {
131
- // We do not have a matching existin consent - just adjust the keys for language
132
- $newConsentType["{$code}_title"] = $newConsentType['title'];
133
- $newConsentType["{$code}_description"] = $newConsentType['description'];
134
- unset($newConsentType['title']);
135
- unset($newConsentType['description']);
136
-
137
- $translatedConsentTypes[] = $newConsentType;
138
- }
139
- }
140
- }
141
-
142
- return $translatedConsentTypes;
143
- }
144
-
145
- public function prefix($name)
146
- {
147
- if (0 === strpos($name, $this->prefix)) {
148
- return $name;
149
- }
150
-
151
- return $this->prefix . $name;
152
- }
153
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Modules\WPML;
4
+
5
+ class WPML
6
+ {
7
+ protected $prefix = 'gdpr_';
8
+
9
+ protected $translatableOptions = [
10
+ 'tools_page',
11
+ 'policy_page',
12
+ 'terms_page',
13
+ 'consent_info',
14
+ ];
15
+
16
+ public function __construct()
17
+ {
18
+ if (!class_exists('Sitepress')) {
19
+ return;
20
+ }
21
+
22
+ $this->setupOptionFilters();
23
+ }
24
+
25
+ protected function setupOptionFilters()
26
+ {
27
+ foreach ($this->translatableOptions as $option) {
28
+ add_filter("gdpr/options/get/{$option}", [$this, 'getTranslatedOption']);
29
+
30
+ $option = $this->prefix($option);
31
+ add_filter("pre_update_option_{$option}", [$this, 'setTranslatedOption'], 10, 2);
32
+ }
33
+
34
+ add_filter('gdpr/options/get/consent_types', [$this, 'getConsentTypes']);
35
+ add_filter('gdpr/options/set/consent_types', [$this, 'saveConsentTypes']);
36
+ }
37
+
38
+ public function getTranslatedOption($option)
39
+ {
40
+ if (!defined('ICL_LANGUAGE_CODE')) {
41
+ if (is_array($option)) {
42
+ return '';
43
+ } else {
44
+ return $option;
45
+ }
46
+ }
47
+
48
+ if (isset($option[ICL_LANGUAGE_CODE])) {
49
+ return $option[ICL_LANGUAGE_CODE];
50
+ } else {
51
+ return '';
52
+ }
53
+ }
54
+
55
+ public function setTranslatedOption($newValue, $oldValue)
56
+ {
57
+ if (!defined('ICL_LANGUAGE_CODE')) {
58
+ return $newValue;
59
+ }
60
+
61
+ if (is_array($oldValue)) {
62
+ $value = $oldValue;
63
+ } else {
64
+ $value = [];
65
+ }
66
+
67
+ $value[ICL_LANGUAGE_CODE] = $newValue;
68
+
69
+ return $value;
70
+ }
71
+
72
+ public function getConsentTypes($consentTypes)
73
+ {
74
+ if (!defined('ICL_LANGUAGE_CODE')) {
75
+ return $consentTypes;
76
+ }
77
+
78
+ $code = ICL_LANGUAGE_CODE;
79
+ $filteredConsentTypes = [];
80
+
81
+ if (count($consentTypes)) {
82
+ foreach ($consentTypes as $consentType) {
83
+
84
+ if (isset($consentType['slug']) && ('privacy-policy' === $consentType['slug'] or 'terms-condition' === $consentType['slug'])) {
85
+ $filteredConsentTypes[] = [
86
+ 'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
87
+ 'visible' => isset($consentType['visible']) ? $consentType['visible'] : 0,
88
+ 'title' => isset($consentType["title"]) ? $consentType["title"] : '',
89
+ 'description' => isset($consentType["description"]) ? $consentType["description"] : '',
90
+ ];
91
+ } else {
92
+ $filteredConsentTypes[] = [
93
+ 'slug' => isset($consentType['slug']) ? $consentType['slug'] : '',
94
+ 'visible' => isset($consentType['visible']) ? $consentType['visible'] : 0,
95
+ 'title' => isset($consentType["{$code}_title"]) ? $consentType["{$code}_title"] : '',
96
+ 'description' => isset($consentType["{$code}_description"]) ? $consentType["{$code}_description"] : '',
97
+ ];
98
+ }
99
+ }
100
+ }
101
+
102
+ return $filteredConsentTypes;
103
+ }
104
+
105
+ public function saveConsentTypes($newConsentTypes)
106
+ {
107
+ if (!defined('ICL_LANGUAGE_CODE')) {
108
+ return $newConsentTypes;
109
+ }
110
+
111
+ $code = ICL_LANGUAGE_CODE;
112
+ $translatedConsentTypes = [];
113
+ $currentConsentTypes = gdpr('options')->get('consent_types', null, false);
114
+
115
+ if (count($newConsentTypes)) {
116
+ foreach ($newConsentTypes as &$newConsentType) {
117
+
118
+ // Match an existing consent type with the new one
119
+ $slug = $newConsentType['slug'];
120
+ $existingConsentType = current(array_filter($currentConsentTypes, function($value) use ($slug) {
121
+ return $value['slug'] === $slug;
122
+ }));
123
+
124
+ if ($existingConsentType) {
125
+ // We have a matching existing consent - update translations, keep the rest
126
+ $existingConsentType["{$code}_title"] = $newConsentType['title'];
127
+ $existingConsentType["{$code}_description"] = $newConsentType['description'];
128
+
129
+ $translatedConsentTypes[] = $existingConsentType;
130
+ } else {
131
+ // We do not have a matching existin consent - just adjust the keys for language
132
+ $newConsentType["{$code}_title"] = $newConsentType['title'];
133
+ $newConsentType["{$code}_description"] = $newConsentType['description'];
134
+ unset($newConsentType['title']);
135
+ unset($newConsentType['description']);
136
+
137
+ $translatedConsentTypes[] = $newConsentType;
138
+ }
139
+ }
140
+ }
141
+
142
+ return $translatedConsentTypes;
143
+ }
144
+
145
+ public function prefix($name)
146
+ {
147
+ if (0 === strpos($name, $this->prefix)) {
148
+ return $name;
149
+ }
150
+
151
+ return $this->prefix . $name;
152
+ }
153
+ }
src/Router.php CHANGED
@@ -1,166 +1,166 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR;
4
-
5
- use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
6
-
7
- /**
8
- * Handles automatically identifying context and triggering actions based on $_REQUEST['gdpr_action']
9
- *
10
- * Class Router
11
- *
12
- * @package Codelight\GDPR
13
- */
14
- class Router
15
- {
16
- /* @var DataSubjectAuthenticator $authenticator */
17
- protected $authenticator;
18
-
19
- /**
20
- * Router constructor.
21
- *
22
- * @param DataSubjectAuthenticator $authenticator
23
- */
24
- public function __construct(DataSubjectAuthenticator $authenticator)
25
- {
26
- $this->authenticator = $authenticator;
27
-
28
- // Routing happens at priority 20 to allow other 'init' actions to complete before
29
- add_action('init', [$this, 'routeFrontendRequest'], 20);
30
- add_action('admin_init', [$this, 'routeAdminRequest'], 20);
31
- }
32
-
33
- /**
34
- * Get and sanitize the action parameter
35
- *
36
- * @return bool|mixed
37
- */
38
- protected function getAction()
39
- {
40
- if (!isset($_REQUEST['gdpr_action'])) {
41
- return false;
42
- }
43
-
44
- // Simple sanitization: allowed chars are alphanumeric, dash, underscore and forward slash.
45
- return preg_replace("/[^a-zA-Z0-9_\-\/]/", "", $_REQUEST['gdpr_action']);
46
- }
47
-
48
- /**
49
- * Detect and trigger proper action in front-end
50
- *
51
- * @param $action
52
- */
53
- public function routeFrontendRequest()
54
- {
55
- // Since the 'init' hooks runs in both admin and non-admin requests, double-check where we are
56
- if (is_admin()) {
57
- return;
58
- }
59
-
60
- // Handle identification by email
61
- $this->authenticator->identify();
62
-
63
- $action = $this->getAction();
64
- $nonce = isset($_REQUEST['gdpr_nonce']) ? $_REQUEST['gdpr_nonce'] : null;
65
-
66
- if (!$action) {
67
- return;
68
- }
69
-
70
- $dataSubject = $this->authenticator->authenticate();
71
-
72
- if ($dataSubject) {
73
- $tag = "gdpr/frontend/privacy-tools-page/action/{$action}";
74
- if (wp_verify_nonce($nonce, $tag)) {
75
- $key = isset($_REQUEST['gdpr_key']) ? $_REQUEST['gdpr_key'] : null;
76
- do_action($tag, $dataSubject, $key);
77
- } else {
78
- wp_die(
79
- sprintf(
80
- __('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
81
- esc_html($action)
82
- )
83
- );
84
- }
85
- } else {
86
- $tag = "gdpr/frontend/action/{$action}";
87
- if (wp_verify_nonce($nonce, $tag)) {
88
- do_action($tag);
89
- } else {
90
- wp_die(
91
- sprintf(
92
- __('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
93
- esc_html($action)
94
- )
95
- );
96
- }
97
- }
98
- }
99
-
100
- /**
101
- * Detect and trigger proper action in admin
102
- *
103
- * @param $action
104
- */
105
- public function routeAdminRequest()
106
- {
107
- $action = $this->getAction();
108
- $nonce = isset($_REQUEST['gdpr_nonce']) ? $_REQUEST['gdpr_nonce'] : null;
109
-
110
- if (!$action) {
111
- return;
112
- }
113
-
114
- if (isset($_GET['page']) && 'gdpr-profile' === $_GET['page']) {
115
-
116
- $dataSubject = $this->authenticator->authenticate();
117
- if ($dataSubject) {
118
- $tag = "gdpr/dashboard/privacy-tools/action/{$action}";
119
-
120
- if (wp_verify_nonce($nonce, $tag)) {
121
- do_action($tag, $dataSubject);
122
- } else {
123
- wp_die(
124
- sprintf(
125
- __('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
126
- esc_html($action)
127
- )
128
- );
129
- }
130
- }
131
- } else {
132
- if ($this->checkAdminPermissions()) {
133
-
134
- $tag = "gdpr/admin/action/{$action}";
135
-
136
- if (wp_verify_nonce($nonce, $tag)) {
137
- do_action($tag);
138
- } else {
139
- wp_die(
140
- sprintf(
141
- __('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
142
- esc_html($action)
143
- )
144
- );
145
- }
146
- } else {
147
- wp_die(
148
- sprintf(
149
- _x('You do not have the required permissions to perform this action!', '(Admin)', 'gdpr-framework'),
150
- esc_html($action)
151
- )
152
- );
153
- }
154
- }
155
- }
156
-
157
- /**
158
- * Check if the current user has the correct capability to perform an admin action
159
- *
160
- * @return bool
161
- */
162
- protected function checkAdminPermissions()
163
- {
164
- return current_user_can(apply_filters('gdpr/capability', 'manage_options'));
165
- }
166
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR;
4
+
5
+ use Codelight\GDPR\DataSubject\DataSubjectAuthenticator;
6
+
7
+ /**
8
+ * Handles automatically identifying context and triggering actions based on $_REQUEST['gdpr_action']
9
+ *
10
+ * Class Router
11
+ *
12
+ * @package Codelight\GDPR
13
+ */
14
+ class Router
15
+ {
16
+ /* @var DataSubjectAuthenticator $authenticator */
17
+ protected $authenticator;
18
+
19
+ /**
20
+ * Router constructor.
21
+ *
22
+ * @param DataSubjectAuthenticator $authenticator
23
+ */
24
+ public function __construct(DataSubjectAuthenticator $authenticator)
25
+ {
26
+ $this->authenticator = $authenticator;
27
+
28
+ // Routing happens at priority 20 to allow other 'init' actions to complete before
29
+ add_action('init', [$this, 'routeFrontendRequest'], 20);
30
+ add_action('admin_init', [$this, 'routeAdminRequest'], 20);
31
+ }
32
+
33
+ /**
34
+ * Get and sanitize the action parameter
35
+ *
36
+ * @return bool|mixed
37
+ */
38
+ protected function getAction()
39
+ {
40
+ if (!isset($_REQUEST['gdpr_action'])) {
41
+ return false;
42
+ }
43
+
44
+ // Simple sanitization: allowed chars are alphanumeric, dash, underscore and forward slash.
45
+ return preg_replace("/[^a-zA-Z0-9_\-\/]/", "", $_REQUEST['gdpr_action']);
46
+ }
47
+
48
+ /**
49
+ * Detect and trigger proper action in front-end
50
+ *
51
+ * @param $action
52
+ */
53
+ public function routeFrontendRequest()
54
+ {
55
+ // Since the 'init' hooks runs in both admin and non-admin requests, double-check where we are
56
+ if (is_admin()) {
57
+ return;
58
+ }
59
+
60
+ // Handle identification by email
61
+ $this->authenticator->identify();
62
+
63
+ $action = $this->getAction();
64
+ $nonce = isset($_REQUEST['gdpr_nonce']) ? $_REQUEST['gdpr_nonce'] : null;
65
+
66
+ if (!$action) {
67
+ return;
68
+ }
69
+
70
+ $dataSubject = $this->authenticator->authenticate();
71
+
72
+ if ($dataSubject) {
73
+ $tag = "gdpr/frontend/privacy-tools-page/action/{$action}";
74
+ if (wp_verify_nonce($nonce, $tag)) {
75
+ $key = isset($_REQUEST['gdpr_key']) ? $_REQUEST['gdpr_key'] : null;
76
+ do_action($tag, $dataSubject, $key);
77
+ } else {
78
+ wp_die(
79
+ sprintf(
80
+ __('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
81
+ esc_html($action)
82
+ )
83
+ );
84
+ }
85
+ } else {
86
+ $tag = "gdpr/frontend/action/{$action}";
87
+ if (wp_verify_nonce($nonce, $tag)) {
88
+ do_action($tag);
89
+ } else {
90
+ wp_die(
91
+ sprintf(
92
+ __('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
93
+ esc_html($action)
94
+ )
95
+ );
96
+ }
97
+ }
98
+ }
99
+
100
+ /**
101
+ * Detect and trigger proper action in admin
102
+ *
103
+ * @param $action
104
+ */
105
+ public function routeAdminRequest()
106
+ {
107
+ $action = $this->getAction();
108
+ $nonce = isset($_REQUEST['gdpr_nonce']) ? $_REQUEST['gdpr_nonce'] : null;
109
+
110
+ if (!$action) {
111
+ return;
112
+ }
113
+
114
+ if (isset($_GET['page']) && 'gdpr-profile' === $_GET['page']) {
115
+
116
+ $dataSubject = $this->authenticator->authenticate();
117
+ if ($dataSubject) {
118
+ $tag = "gdpr/dashboard/privacy-tools/action/{$action}";
119
+
120
+ if (wp_verify_nonce($nonce, $tag)) {
121
+ do_action($tag, $dataSubject);
122
+ } else {
123
+ wp_die(
124
+ sprintf(
125
+ __('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
126
+ esc_html($action)
127
+ )
128
+ );
129
+ }
130
+ }
131
+ } else {
132
+ if ($this->checkAdminPermissions()) {
133
+
134
+ $tag = "gdpr/admin/action/{$action}";
135
+
136
+ if (wp_verify_nonce($nonce, $tag)) {
137
+ do_action($tag);
138
+ } else {
139
+ wp_die(
140
+ sprintf(
141
+ __('Nonce error for action "%s". Please go back and try again!', 'gdpr-framework'),
142
+ esc_html($action)
143
+ )
144
+ );
145
+ }
146
+ } else {
147
+ wp_die(
148
+ sprintf(
149
+ _x('You do not have the required permissions to perform this action!', '(Admin)', 'gdpr-framework'),
150
+ esc_html($action)
151
+ )
152
+ );
153
+ }
154
+ }
155
+ }
156
+
157
+ /**
158
+ * Check if the current user has the correct capability to perform an admin action
159
+ *
160
+ * @return bool
161
+ */
162
+ protected function checkAdminPermissions()
163
+ {
164
+ return current_user_can(apply_filters('gdpr/capability', 'manage_options'));
165
+ }
166
+ }
src/Setup.php CHANGED
@@ -1,93 +1,94 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR;
4
-
5
- use Codelight\GDPR\Admin\AdminTab;
6
- use Codelight\GDPR\Components\Consent\ConsentManager;
7
- use Codelight\GDPR\Components\PrivacyToolsPage\PrivacyToolsPage;
8
- use Codelight\GDPR\Components\PrivacyPolicy\PrivacyPolicy;
9
- use Codelight\GDPR\Components\Support\Support;
10
- use Codelight\GDPR\Components\WordpressComments\WordpressComments;
11
- use Codelight\GDPR\DataSubject\DataExporter;
12
- use Codelight\GDPR\DataSubject\DataSubjectAdmin;
13
- use Codelight\GDPR\DataSubject\DataSubjectIdentificator;
14
- use Codelight\GDPR\DataSubject\DataSubjectManager;
15
- use Codelight\GDPR\Modules\ContactForm7\ContactForm7;
16
- use Codelight\GDPR\Components\Themes\Themes;
17
- use Codelight\GDPR\Components\WordpressUser\WordpressUser;
18
- use Codelight\GDPR\Modules\WPML\WPML;
19
- use Codelight\GDPR\Options\Options;
20
-
21
- /**
22
- * Instantiate components
23
- *
24
- * Class Setup
25
- * @package Codelight\GDPR
26
- */
27
- class Setup
28
- {
29
- /**
30
- * Setup constructor.
31
- */
32
- public function __construct()
33
- {
34
- $this->registerComponents();
35
- $this->runComponents();
36
-
37
- add_action('init', function() {
38
-
39
- if (!is_admin()) {
40
- return;
41
- }
42
-
43
- gdpr()->singleton(SetupAdmin::class);
44
- gdpr(SetupAdmin::class);
45
- }, 0);
46
- }
47
-
48
- /**
49
- * Register required components in the container
50
- */
51
- protected function registerComponents()
52
- {
53
- gdpr()->bind(Router::class);
54
- gdpr()->bind(DataExporter::class);
55
-
56
- gdpr()->singleton(PrivacyToolsPage::class);
57
-
58
- gdpr()->singleton(AdminTab::class);
59
- gdpr()->singleton(DataSubjectManager::class);
60
- gdpr()->singleton(DataSubjectIdentificator::class);
61
- gdpr()->singleton(View::class);
62
- gdpr()->singleton(Options::class);
63
- gdpr()->singleton(ConsentManager::class);
64
- gdpr()->singleton(Helpers::class);
65
- gdpr()->singleton(Themes::class);
66
-
67
- gdpr()->alias(View::class, 'view');
68
- gdpr()->alias(Options::class, 'options');
69
- gdpr()->alias(ConsentManager::class, 'consent');
70
- gdpr()->alias(Helpers::class, 'helpers');
71
- gdpr()->alias(Themes::class, 'themes');
72
- }
73
-
74
- /**
75
- * Check which components should be ran and run them
76
- */
77
- protected function runComponents()
78
- {
79
- gdpr()->make(WPML::class);
80
- gdpr()->make(Router::class);
81
- gdpr()->make(DataSubjectIdentificator::class);
82
- gdpr()->make(DataSubjectAdmin::class);
83
- gdpr()->make(PrivacyToolsPage::class);
84
- gdpr()->make(PrivacyPolicy::class);
85
- gdpr()->make(WordpressComments::class);
86
- gdpr()->make(WordpressUser::class);
87
- gdpr()->make(Support::class);
88
-
89
- // Integrations
90
- gdpr()->make(Themes::class);
91
- gdpr()->make(ContactForm7::class);
92
- }
93
- }
 
1
+ <?php
2
+
3
+ namespace Codelight\GDPR;
4
+
5
+ use Codelight\GDPR\Admin\AdminTab;
6
+ use Codelight\GDPR\Components\Consent\ConsentManager;
7
+ use Codelight\GDPR\Components\PrivacyToolsPage\PrivacyToolsPage;
8
+ use Codelight\GDPR\Components\PrivacyPolicy\PrivacyPolicy;
9
+ use Codelight\GDPR\Components\Support\Support;
10
+ use Codelight\GDPR\Components\WordpressComments\WordpressComments;
11
+ use Codelight\GDPR\DataSubject\DataExporter;
12
+ use Codelight\GDPR\DataSubject\DataSubjectAdmin;
13
+ use Codelight\GDPR\DataSubject\DataSubjectIdentificator;
14
+ use Codelight\GDPR\DataSubject\DataSubjectManager;
15
+ use Codelight\GDPR\Modules\ContactForm7\ContactForm7;
16
+ use Codelight\GDPR\Components\Themes\Themes;
17
+ use Codelight\GDPR\Components\WordpressUser\WordpressUser;
18
+ use Codelight\GDPR\Modules\WPML\WPML;
19
+ use Codelight\GDPR\Options\Options;
20
+
21
+ /**
22
+ * Instantiate components
23
+ *
24
+ * Class Setup
25
+ * @package Codelight\GDPR
26
+ */
27
+ class Setup
28
+ {
29
+ /**
30
+ * Setup constructor.
31
+ */
32
+ public function __construct()
33
+ {
34
+ $this->registerComponents();
35
+ $this->runComponents();
36
+
37
+ add_action('init', function() {
38
+
39
+ if (!is_admin()) {
40
+ return;
41
+ }
42
+
43
+ gdpr()->singleton(SetupAdmin::class);
44
+ gdpr(SetupAdmin::class);
45
+ }, 0);
46
+ }
47
+
48
+ /**
49
+ * Register required components in the container
50
+ */
51
+ protected function registerComponents()
52
+ {
53
+ gdpr()->bind(Router::class);
54
+ gdpr()->bind(DataExporter::class);
55
+
56
+ gdpr()->singleton(PrivacyToolsPage::class);
57
+
58
+ gdpr()->singleton(AdminTab::class);
59
+ gdpr()->singleton(DataSubjectManager::class);
60
+ gdpr()->singleton(DataSubjectIdentificator::class);
61
+ gdpr()->singleton(View::class);
62
+ gdpr()->singleton(Options::class);
63
+ gdpr()->singleton(ConsentManager::class);
64
+ gdpr()->singleton(Helpers::class);
65
+ gdpr()->singleton(Themes::class);
66
+
67
+ gdpr()->alias(View::class, 'view');
68
+ gdpr()->alias(Options::class, 'options');
69
+ gdpr()->alias(ConsentManager::class, 'consent');
70
+ gdpr()->alias(Helpers::class, 'helpers');
71
+ gdpr()->alias(Themes::class, 'themes');
72
+ gdpr()->alias(DataSubjectManager::class, 'data-subject');
73
+ }
74
+
75
+ /**
76
+ * Check which components should be ran and run them
77
+ */
78
+ protected function runComponents()
79
+ {
80
+ gdpr()->make(WPML::class);
81
+ gdpr()->make(Router::class);
82
+ gdpr()->make(DataSubjectIdentificator::class);
83
+ gdpr()->make(DataSubjectAdmin::class);
84
+ gdpr()->make(PrivacyToolsPage::class);
85
+ gdpr()->make(PrivacyPolicy::class);
86
+ gdpr()->make(WordpressComments::class);
87
+ gdpr()->make(WordpressUser::class);
88
+ gdpr()->make(Support::class);
89
+
90
+ // Integrations
91
+ gdpr()->make(Themes::class);
92
+ gdpr()->make(ContactForm7::class);
93
+ }
94
+ }
src/SetupAdmin.php CHANGED
@@ -1,62 +1,62 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR;
4
-
5
- use Codelight\GDPR\Admin\AdminError;
6
- use Codelight\GDPR\Admin\AdminNotice;
7
- use Codelight\GDPR\Admin\Modal;
8
- use Codelight\GDPR\Admin\WordpressAdmin;
9
- use Codelight\GDPR\Admin\WordpressAdminPage;
10
- use Codelight\GDPR\Components\Consent\ConsentAdmin;
11
- use Codelight\GDPR\Installer\Installer;
12
- use Codelight\GDPR\Installer\AdminInstallerNotice;
13
-
14
- /**
15
- * Register and set up admin components.
16
- * This class is instantiated at admin_init priority 0
17
- *
18
- * Class SetupAdmin
19
- *
20
- * @package Codelight\GDPR
21
- */
22
- class SetupAdmin
23
- {
24
- /**
25
- * SetupAdmin constructor.
26
- */
27
- public function __construct()
28
- {
29
- $this->registerComponents();
30
- $this->runComponents();
31
- }
32
-
33
- /**
34
- * Register components in the container
35
- */
36
- protected function registerComponents()
37
- {
38
- gdpr()->singleton(WordpressAdmin::class);
39
- gdpr()->singleton(WordpressAdminPage::class);
40
- gdpr()->singleton(Installer::class);
41
-
42
- // Not a singleton.
43
- gdpr()->alias(AdminNotice::class, 'admin-notice');
44
- gdpr()->alias(AdminError::class, 'admin-error');
45
- gdpr()->alias(AdminInstallerNotice::class, 'installer-notice');
46
- gdpr()->alias(Modal::class, 'admin-modal');
47
- gdpr()->alias(WordpressAdminPage::class, 'admin-page');
48
-
49
- gdpr()->bind(ConsentAdmin::class);
50
- }
51
-
52
- /**
53
- * Run components
54
- */
55
- protected function runComponents()
56
- {
57
- gdpr(WordpressAdmin::class);
58
- gdpr(WordpressAdminPage::class);
59
- gdpr(Installer::class);
60
- gdpr(ConsentAdmin::class);
61
- }
62
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR;
4
+
5
+ use Codelight\GDPR\Admin\AdminError;
6
+ use Codelight\GDPR\Admin\AdminNotice;
7
+ use Codelight\GDPR\Admin\Modal;
8
+ use Codelight\GDPR\Admin\WordpressAdmin;
9
+ use Codelight\GDPR\Admin\WordpressAdminPage;
10
+ use Codelight\GDPR\Components\Consent\ConsentAdmin;
11
+ use Codelight\GDPR\Installer\Installer;
12
+ use Codelight\GDPR\Installer\AdminInstallerNotice;
13
+
14
+ /**
15
+ * Register and set up admin components.
16
+ * This class is instantiated at admin_init priority 0
17
+ *
18
+ * Class SetupAdmin
19
+ *
20
+ * @package Codelight\GDPR
21
+ */
22
+ class SetupAdmin
23
+ {
24
+ /**
25
+ * SetupAdmin constructor.
26
+ */
27
+ public function __construct()
28
+ {
29
+ $this->registerComponents();
30
+ $this->runComponents();
31
+ }
32
+
33
+ /**
34
+ * Register components in the container
35
+ */
36
+ protected function registerComponents()
37
+ {
38
+ gdpr()->singleton(WordpressAdmin::class);
39
+ gdpr()->singleton(WordpressAdminPage::class);
40
+ gdpr()->singleton(Installer::class);
41
+
42
+ // Not a singleton.
43
+ gdpr()->alias(AdminNotice::class, 'admin-notice');
44
+ gdpr()->alias(AdminError::class, 'admin-error');
45
+ gdpr()->alias(AdminInstallerNotice::class, 'installer-notice');
46
+ gdpr()->alias(Modal::class, 'admin-modal');
47
+ gdpr()->alias(WordpressAdminPage::class, 'admin-page');
48
+
49
+ gdpr()->bind(ConsentAdmin::class);
50
+ }
51
+
52
+ /**
53
+ * Run components
54
+ */
55
+ protected function runComponents()
56
+ {
57
+ gdpr(WordpressAdmin::class);
58
+ gdpr(WordpressAdminPage::class);
59
+ gdpr(Installer::class);
60
+ gdpr(ConsentAdmin::class);
61
+ }
62
+ }
src/Updater/Updater.php ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Codelight\GDPR\Updater;
4
+
5
+ class Updater
6
+ {
7
+ public function __construct()
8
+ {
9
+ $currentVersion = $this->getVersion();
10
+
11
+ if ($currentVersion === GDPR_FRAMEWORK_VERSION) {
12
+ return;
13
+ }
14
+
15
+ if (version_compare($currentVersion, '1.0.5', '<')) {
16
+ $this->update_1_0_5();
17
+ }
18
+ }
19
+
20
+ /**
21
+ * @return string
22
+ */
23
+ public function getVersion()
24
+ {
25
+ return get_option('gdpr_plugin_version', '1.0.0');
26
+ }
27
+
28
+ /**
29
+ * Retroactively fix bug in v1.0.3 where the activation code didn't run properly
30
+ */
31
+ public function update_1_0_5()
32
+ {
33
+ $model = new \Codelight\GDPR\Components\Consent\UserConsentModel();
34
+ $model->createTable();
35
+
36
+ if (apply_filters('gdpr/data-subject/anonymize/change_role', true) && ! get_role('anonymous')) {
37
+
38
+ add_role(
39
+ 'anonymous',
40
+ _x('Anonymous', '(Admin)', 'gdpr-framework'),
41
+ []
42
+ );
43
+ }
44
+
45
+ update_option('gdpr_plugin_version', '1.0.5');
46
+ }
47
+ }
src/View.php CHANGED
@@ -1,64 +1,64 @@
1
- <?php
2
-
3
- namespace Codelight\GDPR;
4
-
5
- /**
6
- * Handles locating templates from either the theme or plugin,
7
- * injecting and extracting data and rendering them.
8
- *
9
- * Class View
10
- * @package Codelight\GDPR
11
- */
12
- class View
13
- {
14
- /**
15
- * View constructor.
16
- */
17
- public function __construct()
18
- {
19
- $this->dirs = $this->getTemplateDirectories();
20
- }
21
-
22
- /**
23
- * Render a given template.
24
- *
25
- * @param $template
26
- * @param array $data
27
- * @param null $templateDir
28
- *
29
- * @return string
30
- */
31
- public function render($template, $data = [], $templateDir = null)
32
- {
33
- if (is_null($templateDir)) {
34
- foreach ($this->dirs as $dir) {
35
- if (file_exists($dir . $template . '.php')) {
36
- $templateDir = $dir;
37
- break;
38
- }
39
- }
40
- }
41
-
42
- extract($data);
43
- ob_start();
44
- require $templateDir . $template . '.php';
45
-
46
- return ob_get_clean();
47
- }
48
-
49
- /**
50
- * Get valid template directories and pass them through a filter
51
- *
52
- * @return array
53
- */
54
- protected function getTemplateDirectories()
55
- {
56
- $directories = array_filter([
57
- get_stylesheet_directory() . '/gdpr-framework/',
58
- get_template_directory() . '/gdpr-framework/',
59
- gdpr('config')->get('plugin.template_path'),
60
- ], 'is_dir');
61
-
62
- return array_unique(apply_filters('gdpr/views', $directories));
63
- }
64
- }
1
+ <?php
2
+
3
+ namespace Codelight\GDPR;
4
+
5
+ /**
6
+ * Handles locating templates from either the theme or plugin,
7
+ * injecting and extracting data and rendering them.
8
+ *
9
+ * Class View
10
+ * @package Codelight\GDPR
11
+ */
12
+ class View
13
+ {
14
+ /**
15
+ * View constructor.
16
+ */
17
+ public function __construct()
18
+ {
19
+ $this->dirs = $this->getTemplateDirectories();
20
+ }
21
+
22
+ /**
23
+ * Render a given template.
24
+ *
25
+ * @param $template
26
+ * @param array $data
27
+ * @param null $templateDir
28
+ *
29
+ * @return string
30
+ */
31
+ public function render($template, $data = [], $templateDir = null)
32
+ {
33
+ if (is_null($templateDir)) {
34
+ foreach ($this->dirs as $dir) {
35
+ if (file_exists($dir . $template . '.php')) {
36
+ $templateDir = $dir;
37
+ break;
38
+ }
39
+ }
40
+ }
41
+
42
+ extract($data);
43
+ ob_start();
44
+ require $templateDir . $template . '.php';
45
+
46
+ return ob_get_clean();
47
+ }
48
+
49
+ /**
50
+ * Get valid template directories and pass them through a filter
51
+ *
52
+ * @return array
53
+ */
54
+ protected function getTemplateDirectories()
55
+ {
56
+ $directories = array_filter([
57
+ get_stylesheet_directory() . '/gdpr-framework/',
58
+ get_template_directory() . '/gdpr-framework/',
59
+ gdpr('config')->get('plugin.template_path'),
60
+ ], 'is_dir');
61
+
62
+ return array_unique(apply_filters('gdpr/views', $directories));
63
+ }
64
+ }
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
- return ComposerAutoloaderInit9f3572d4c44534633256010eb339e06e::getLoader();
4
 
5
  require_once __DIR__ . '/composer/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInit5f4ac86ae1a983fd118be68a8ad29c43::getLoader();
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInit9f3572d4c44534633256010eb339e06e
6
  {
7
  private static $loader;
8
 
@@ -19,15 +19,15 @@ class ComposerAutoloaderInit9f3572d4c44534633256010eb339e06e
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInit9f3572d4c44534633256010eb339e06e', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInit9f3572d4c44534633256010eb339e06e', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
- call_user_func(\Composer\Autoload\ComposerStaticInit9f3572d4c44534633256010eb339e06e::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
@@ -48,19 +48,19 @@ class ComposerAutoloaderInit9f3572d4c44534633256010eb339e06e
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
- $includeFiles = Composer\Autoload\ComposerStaticInit9f3572d4c44534633256010eb339e06e::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
- composerRequire9f3572d4c44534633256010eb339e06e($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
- function composerRequire9f3572d4c44534633256010eb339e06e($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInit5f4ac86ae1a983fd118be68a8ad29c43
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInit5f4ac86ae1a983fd118be68a8ad29c43', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInit5f4ac86ae1a983fd118be68a8ad29c43', 'loadClassLoader'));
25
 
26
  $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
27
  if ($useStaticLoader) {
28
  require_once __DIR__ . '/autoload_static.php';
29
 
30
+ call_user_func(\Composer\Autoload\ComposerStaticInit5f4ac86ae1a983fd118be68a8ad29c43::getInitializer($loader));
31
  } else {
32
  $map = require __DIR__ . '/autoload_namespaces.php';
33
  foreach ($map as $namespace => $path) {
48
  $loader->register(true);
49
 
50
  if ($useStaticLoader) {
51
+ $includeFiles = Composer\Autoload\ComposerStaticInit5f4ac86ae1a983fd118be68a8ad29c43::$files;
52
  } else {
53
  $includeFiles = require __DIR__ . '/autoload_files.php';
54
  }
55
  foreach ($includeFiles as $fileIdentifier => $file) {
56
+ composerRequire5f4ac86ae1a983fd118be68a8ad29c43($fileIdentifier, $file);
57
  }
58
 
59
  return $loader;
60
  }
61
  }
62
 
63
+ function composerRequire5f4ac86ae1a983fd118be68a8ad29c43($fileIdentifier, $file)
64
  {
65
  if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
66
  require $file;
vendor/composer/autoload_static.php CHANGED
@@ -4,7 +4,7 @@
4
 
5
  namespace Composer\Autoload;
6
 
7
- class ComposerStaticInit9f3572d4c44534633256010eb339e06e
8
  {
9
  public static $files = array (
10
  '5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
@@ -72,8 +72,8 @@ class ComposerStaticInit9f3572d4c44534633256010eb339e06e
72
  public static function getInitializer(ClassLoader $loader)
73
  {
74
  return \Closure::bind(function () use ($loader) {
75
- $loader->prefixLengthsPsr4 = ComposerStaticInit9f3572d4c44534633256010eb339e06e::$prefixLengthsPsr4;
76
- $loader->prefixDirsPsr4 = ComposerStaticInit9f3572d4c44534633256010eb339e06e::$prefixDirsPsr4;
77
 
78
  }, null, ClassLoader::class);
79
  }
4
 
5
  namespace Composer\Autoload;
6
 
7
+ class ComposerStaticInit5f4ac86ae1a983fd118be68a8ad29c43
8
  {
9
  public static $files = array (
10
  '5255c38a0faeba867671b61dfda6d864' => __DIR__ . '/..' . '/paragonie/random_compat/lib/random.php',
72
  public static function getInitializer(ClassLoader $loader)
73
  {
74
  return \Closure::bind(function () use ($loader) {
75
+ $loader->prefixLengthsPsr4 = ComposerStaticInit5f4ac86ae1a983fd118be68a8ad29c43::$prefixLengthsPsr4;
76
+ $loader->prefixDirsPsr4 = ComposerStaticInit5f4ac86ae1a983fd118be68a8ad29c43::$prefixDirsPsr4;
77
 
78
  }, null, ClassLoader::class);
79
  }
views/admin/consent.php CHANGED
@@ -1,105 +1,105 @@
1
- <hr>
2
-
3
- <h3><?= _x('Default consent types', '(Admin)', 'gdpr-framework'); ?></h3>
4
- <p><?= _x('These are the consent types that have been automatically registered by the framework or a plugin.', '(Admin)', 'gdpr-framework'); ?></p>
5
- <?php if (count($defaultConsentTypes)): ?>
6
- <table class="gdpr-consent">
7
- <th><?= _x('Slug', '(Admin)', 'gdpr-framework'); ?></th>
8
- <th><?= _x('Title', '(Admin)', 'gdpr-framework'); ?></th>
9
- <th><?= _x('Description', '(Admin)', 'gdpr-framework'); ?></th>
10
- <th><?= _x('Visibility', '(Admin)', 'gdpr-framework'); ?></th>
11
- <?php foreach ($defaultConsentTypes as $consentType): ?>
12
- <tr>
13
- <td class="gdpr-consent-table-input"><?= $consentType['slug']; ?></td>
14
- <td class="gdpr-consent-table-input"><?= $consentType['title']; ?></td>
15
- <td class="gdpr-consent-table-desc"><?= $consentType['description']; ?></td>
16
- <td>
17
- <?php if ($consentType['visible']): ?>
18
- <?= _x('Visible', '(Admin)', 'gdpr-framework'); ?>
19
- <?php else: ?>
20
- <?= _x('Hidden', '(Admin)', 'gdpr-framework'); ?>
21
- <?php endif; ?>
22
- </td>
23
- </tr>
24
- <?php endforeach; ?>
25
- </table>
26
- <?php endif; ?>
27
- <br>
28
- <hr>
29
- <h3><?= _x('Custom consent types', '(Admin)', 'gdpr-framework'); ?></h3>
30
- <p><?= _x('Here you can add custom consent types to track. They will not be used anywhere by default - you will need to build an integration for each of them.', '(Admin)', 'gdpr-framework'); ?></p>
31
- <div class="js-gdpr-repeater" data-name="gdpr_consent_types">
32
- <table class="gdpr-consent-admin" data-repeater-list="gdpr_consent_types">
33
- <thead>
34
- <th>
35
- <?= _x('Machine-readable slug', '(Admin)', 'gdpr-framework'); ?>*
36
- </th>
37
- <th>
38
- <?= _x('Title', '(Admin)', 'gdpr-framework'); ?>*
39
- </th>
40
- <th>
41
- <?= _x('Description', '(Admin)', 'gdpr-framework'); ?>
42
- </th>
43
- <th>
44
- <?= _x('Visible?', '(Admin)', 'gdpr-framework'); ?>
45
- </th>
46
- </thead>
47
- <tr data-repeater-item>
48
- <td class="gdpr-consent-table-input">
49
- <input
50
- type="text"
51
- name="slug"
52
- placeholder="<?= _x('Slug', '(Admin)', 'gdpr-framework'); ?>"
53
- pattern="^[A-Za-z0-9_-]+$"
54
- oninvalid="setCustomValidity('Please fill in this field using alphanumeric characters, dashes and underscores.')"
55
- oninput="setCustomValidity('')"
56
- required
57
- />
58
- </td>
59
- <td class="gdpr-consent-table-input">
60
- <input type="text" name="title" placeholder="<?= _x('Title', '(Admin)', 'gdpr-framework'); ?>" required />
61
- </td>
62
- <td class="gdpr-consent-table-desc">
63
- <textarea type="text" name="description" placeholder="<?= _x('Description', '(Admin)', 'gdpr-framework'); ?>"></textarea>
64
- </td>
65
- <td>
66
- <label>
67
- <input type="checkbox" name="visible" value="1"/>
68
- <?= _x('Visible?', '(Admin)', 'gdpr-framework'); ?>
69
- </label>
70
- </td>
71
- <td>
72
- <input data-repeater-delete class="button button-primary" type="button" value="<?= _x('Remove', '(Admin)', 'gdpr-framework'); ?>"/>
73
- </td>
74
- </tr>
75
-
76
- </table>
77
- <div class="gdpr-consent-add-button">
78
- <input data-repeater-create class="button button-primary" type="button" value="Add consent type"/>
79
- </div>
80
- <input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
81
- <input type="hidden" name="gdpr_action" value="update_consent_data" />
82
- </div>
83
-
84
- <?php if (count($customConsentTypes)): ?>
85
- <script>
86
- window.repeaterData = [];
87
- window.repeaterData['gdpr_consent_types'] = <?= json_encode($customConsentTypes); ?>;
88
- </script>
89
- <?php endif; ?>
90
-
91
- <br>
92
- <hr>
93
- <h3><?= _x('Additional info', '(Admin)', 'gdpr-framework'); ?></h3>
94
- <p>
95
- <?= _x('This text will be displayed to your data subjects on the Privacy Tools page.', '(Admin)', 'gdpr-framework'); ?>
96
- </p>
97
- <?php wp_editor(
98
- wp_kses_post($consentInfo),
99
- 'gdpr_consent_info',
100
- [
101
- 'textarea_rows' => 4,
102
- ]
103
- );
104
- ?>
105
-
1
+ <hr>
2
+
3
+ <h3><?= _x('Default consent types', '(Admin)', 'gdpr-framework'); ?></h3>
4
+ <p><?= _x('These are the consent types that have been automatically registered by the framework or a plugin.', '(Admin)', 'gdpr-framework'); ?></p>
5
+ <?php if (count($defaultConsentTypes)): ?>
6
+ <table class="gdpr-consent">
7
+ <th><?= _x('Slug', '(Admin)', 'gdpr-framework'); ?></th>
8
+ <th><?= _x('Title', '(Admin)', 'gdpr-framework'); ?></th>
9
+ <th><?= _x('Description', '(Admin)', 'gdpr-framework'); ?></th>
10
+ <th><?= _x('Visibility', '(Admin)', 'gdpr-framework'); ?></th>
11
+ <?php foreach ($defaultConsentTypes as $consentType): ?>
12
+ <tr>
13
+ <td class="gdpr-consent-table-input"><?= $consentType['slug']; ?></td>
14
+ <td class="gdpr-consent-table-input"><?= $consentType['title']; ?></td>
15
+ <td class="gdpr-consent-table-desc"><?= $consentType['description']; ?></td>
16
+ <td>
17
+ <?php if ($consentType['visible']): ?>
18
+ <?= _x('Visible', '(Admin)', 'gdpr-framework'); ?>
19
+ <?php else: ?>
20
+ <?= _x('Hidden', '(Admin)', 'gdpr-framework'); ?>
21
+ <?php endif; ?>
22
+ </td>
23
+ </tr>
24
+ <?php endforeach; ?>
25
+ </table>
26
+ <?php endif; ?>
27
+ <br>
28
+ <hr>
29
+ <h3><?= _x('Custom consent types', '(Admin)', 'gdpr-framework'); ?></h3>
30
+ <p><?= _x('Here you can add custom consent types to track. They will not be used anywhere by default - you will need to build an integration for each of them.', '(Admin)', 'gdpr-framework'); ?></p>
31
+ <div class="js-gdpr-repeater" data-name="gdpr_consent_types">
32
+ <table class="gdpr-consent-admin" data-repeater-list="gdpr_consent_types">
33
+ <thead>
34
+ <th>
35
+ <?= _x('Machine-readable slug', '(Admin)', 'gdpr-framework'); ?>*
36
+ </th>
37
+ <th>
38
+ <?= _x('Title', '(Admin)', 'gdpr-framework'); ?>*
39
+ </th>
40
+ <th>
41
+ <?= _x('Description', '(Admin)', 'gdpr-framework'); ?>
42
+ </th>
43
+ <th>
44
+ <?= _x('Visible?', '(Admin)', 'gdpr-framework'); ?>
45
+ </th>
46
+ </thead>
47
+ <tr data-repeater-item>
48
+ <td class="gdpr-consent-table-input">
49
+ <input
50
+ type="text"
51
+ name="slug"
52
+ placeholder="<?= _x('Slug', '(Admin)', 'gdpr-framework'); ?>"
53
+ pattern="^[A-Za-z0-9_-]+$"
54
+ oninvalid="setCustomValidity('Please fill in this field using alphanumeric characters, dashes and underscores.')"
55
+ oninput="setCustomValidity('')"
56
+ required
57
+ />
58
+ </td>
59
+ <td class="gdpr-consent-table-input">
60
+ <input type="text" name="title" placeholder="<?= _x('Title', '(Admin)', 'gdpr-framework'); ?>" required />
61
+ </td>
62
+ <td class="gdpr-consent-table-desc">
63
+ <textarea type="text" name="description" placeholder="<?= _x('Description', '(Admin)', 'gdpr-framework'); ?>"></textarea>
64
+ </td>
65
+ <td>
66
+ <label>
67
+ <input type="checkbox" name="visible" value="1"/>
68
+ <?= _x('Visible?', '(Admin)', 'gdpr-framework'); ?>
69
+ </label>
70
+ </td>
71
+ <td>
72
+ <input data-repeater-delete class="button button-primary" type="button" value="<?= _x('Remove', '(Admin)', 'gdpr-framework'); ?>"/>
73
+ </td>
74
+ </tr>
75
+
76
+ </table>
77
+ <div class="gdpr-consent-add-button">
78
+ <input data-repeater-create class="button button-primary" type="button" value="Add consent type"/>
79
+ </div>
80
+ <input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
81
+ <input type="hidden" name="gdpr_action" value="update_consent_data" />
82
+ </div>
83
+
84
+ <?php if (count($customConsentTypes)): ?>
85
+ <script>
86
+ window.repeaterData = [];
87
+ window.repeaterData['gdpr_consent_types'] = <?= json_encode($customConsentTypes); ?>;
88
+ </script>
89
+ <?php endif; ?>
90
+
91
+ <br>
92
+ <hr>
93
+ <h3><?= _x('Additional info', '(Admin)', 'gdpr-framework'); ?></h3>
94
+ <p>
95
+ <?= _x('This text will be displayed to your data subjects on the Privacy Tools page.', '(Admin)', 'gdpr-framework'); ?>
96
+ </p>
97
+ <?php wp_editor(
98
+ wp_kses_post($consentInfo),
99
+ 'gdpr_consent_info',
100
+ [
101
+ 'textarea_rows' => 4,
102
+ ]
103
+ );
104
+ ?>
105
+
views/admin/data-subjects/search-form.php CHANGED
@@ -1,18 +1,18 @@
1
- <p>
2
- <?= _x('On this page, you can find which data subjects personal data you are storing and download, export or delete it.', '(Admin)', 'gdpr-framework'); ?>
3
- </p>
4
-
5
- <hr>
6
-
7
- <?= $results; ?>
8
-
9
- <label>
10
- <h3><?= _x('Find data subject by email', '(Admin)', 'gdpr-framework'); ?></h3>
11
- <input type="email" name="gdpr_email" placeholder="<?= _x('Email address', '(Admin)', 'gdpr-framework'); ?>" />
12
- </label>
13
-
14
- <input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
15
- <input type="hidden" name="gdpr_action" value="search" />
16
- <input class="button button-primary" type="submit" value="<?= _x('Search', '(Admin)', 'gdpr-framework'); ?>" />
17
-
18
- <br><br>
1
+ <p>
2
+ <?= _x('On this page, you can find which data subjects personal data you are storing and download, export or delete it.', '(Admin)', 'gdpr-framework'); ?>
3
+ </p>
4
+
5
+ <hr>
6
+
7
+ <?= $results; ?>
8
+
9
+ <label>
10
+ <h3><?= _x('Find data subject by email', '(Admin)', 'gdpr-framework'); ?></h3>
11
+ <input type="email" name="gdpr_email" placeholder="<?= _x('Email address', '(Admin)', 'gdpr-framework'); ?>" />
12
+ </label>
13
+
14
+ <input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
15
+ <input type="hidden" name="gdpr_action" value="search" />
16
+ <input class="button button-primary" type="submit" value="<?= _x('Search', '(Admin)', 'gdpr-framework'); ?>" />
17
+
18
+ <br><br>
views/admin/data-subjects/search-results.php CHANGED
@@ -1,33 +1,33 @@
1
- <div>
2
- <h3>Results for: <?= esc_html($email); ?></h3>
3
- <?php if ($hasData): ?>
4
-
5
- <?php if (isset($links['profile'])): ?>
6
- <p>
7
- <strong><?= _x('Username', '(Admin)', 'gdpr-framework'); ?>:</strong>
8
- <a href="<?= $links['profile']; ?>"><?= esc_html($userName); ?></a>
9
- </p>
10
- <?php else: ?>
11
- <p>
12
- <em><?= esc_html($email); ?> <?= _x('is not a registered user.', '(Admin)', 'gdpr-framework'); ?></em>
13
- </p>
14
- <?php endif; ?>
15
-
16
- <a class="button button-primary" href="<?= esc_url($links['view']); ?>"><?= _x('Download data (html)', '(Admin)', 'gdpr-framework'); ?></a>
17
- <a class="button button-primary" href="<?= esc_url($links['export']); ?>"><?= _x('Export data (json)', '(Admin)', 'gdpr-framework'); ?></a>
18
-
19
- <?php if ($adminCap): ?>
20
- <p>
21
- <strong><?= _x('This user has admin capabilities. Deleting data via this interface is disabled.', '(Admin)', 'gdpr-framework'); ?></strong>
22
- </p>
23
- <?php else: ?>
24
- <a class="button button-primary" href="<?= esc_url($links['anonymize']); ?>"><?= _x('Anonymize data', '(Admin)', 'gdpr-framework'); ?></a>
25
- <a class="button button-primary" href="<?= esc_url($links['delete']); ?>"><?= _x('Delete data', '(Admin)', 'gdpr-framework'); ?></a>
26
- <?php endif; ?>
27
-
28
- <?php else: ?>
29
- <p><?= _x('No data found!', '(Admin)', 'gdpr-framework'); ?></p>
30
- <?php endif; ?>
31
- </div>
32
- <br>
33
- <hr>
1
+ <div>
2
+ <h3>Results for: <?= esc_html($email); ?></h3>
3
+ <?php if ($hasData): ?>
4
+
5
+ <?php if (isset($links['profile'])): ?>
6
+ <p>
7
+ <strong><?= _x('Username', '(Admin)', 'gdpr-framework'); ?>:</strong>
8
+ <a href="<?= $links['profile']; ?>"><?= esc_html($userName); ?></a>
9
+ </p>
10
+ <?php else: ?>
11
+ <p>
12
+ <em><?= esc_html($email); ?> <?= _x('is not a registered user.', '(Admin)', 'gdpr-framework'); ?></em>
13
+ </p>
14
+ <?php endif; ?>
15
+
16
+ <a class="button button-primary" href="<?= esc_url($links['view']); ?>"><?= _x('Download data (html)', '(Admin)', 'gdpr-framework'); ?></a>
17
+ <a class="button button-primary" href="<?= esc_url($links['export']); ?>"><?= _x('Export data (json)', '(Admin)', 'gdpr-framework'); ?></a>
18
+
19
+ <?php if ($adminCap): ?>
20
+ <p>
21
+ <strong><?= _x('This user has admin capabilities. Deleting data via this interface is disabled.', '(Admin)', 'gdpr-framework'); ?></strong>
22
+ </p>
23
+ <?php else: ?>
24
+ <a class="button button-primary" href="<?= esc_url($links['anonymize']); ?>"><?= _x('Anonymize data', '(Admin)', 'gdpr-framework'); ?></a>
25
+ <a class="button button-primary" href="<?= esc_url($links['delete']); ?>"><?= _x('Delete data', '(Admin)', 'gdpr-framework'); ?></a>
26
+ <?php endif; ?>
27
+
28
+ <?php else: ?>
29
+ <p><?= _x('No data found!', '(Admin)', 'gdpr-framework'); ?></p>
30
+ <?php endif; ?>
31
+ </div>
32
+ <br>
33
+ <hr>
views/admin/general/delete-action-email.php CHANGED
@@ -1,7 +1,7 @@
1
- <input
2
- type="email"
3
- id="gdpr_delete_action_email"
4
- name="gdpr_delete_action_email"
5
- placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
6
- value="<?= esc_attr($deleteActionEmail); ?>"
7
- />
1
+ <input
2
+ type="email"
3
+ id="gdpr_delete_action_email"
4
+ name="gdpr_delete_action_email"
5
+ placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
6
+ value="<?= esc_attr($deleteActionEmail); ?>"
7
+ />
views/admin/general/delete-action-reassign.php CHANGED
@@ -1,11 +1,11 @@
1
- <select id="gdpr_delete_action_reassign" name="gdpr_delete_action_reassign" class="gdpr-select js-gdpr-conditional">
2
- <option value="delete" <?= selected($reassign, 'delete'); ?>>
3
- <?= _x('Delete content', '(Admin)', 'gdpr-framework'); ?>
4
- </option>
5
- <option value="reassign" <?= selected($reassign, 'reassign'); ?> data-show=".js-gdpr-delete-action-reassign-user">
6
- <?= _x('Reassign content to a user', '(Admin)', 'gdpr-framework'); ?>
7
- </option>
8
- </select>
9
- <p class="description">
10
- <?= _x('If the user has submitted any content on your site, should it be deleted or reassigned to another user?', '(Admin)', 'gdpr-framework'); ?>
11
- </p>
1
+ <select id="gdpr_delete_action_reassign" name="gdpr_delete_action_reassign" class="gdpr-select js-gdpr-conditional">
2
+ <option value="delete" <?= selected($reassign, 'delete'); ?>>
3
+ <?= _x('Delete content', '(Admin)', 'gdpr-framework'); ?>
4
+ </option>
5
+ <option value="reassign" <?= selected($reassign, 'reassign'); ?> data-show=".js-gdpr-delete-action-reassign-user">
6
+ <?= _x('Reassign content to a user', '(Admin)', 'gdpr-framework'); ?>
7
+ </option>
8
+ </select>
9
+ <p class="description">
10
+ <?= _x('If the user has submitted any content on your site, should it be deleted or reassigned to another user?', '(Admin)', 'gdpr-framework'); ?>
11
+ </p>
views/admin/general/delete-action.php CHANGED
@@ -1,3 +1,3 @@
1
- <select class="gdpr-select js-gdpr-conditional" name="gdpr_delete_action">
2
- <?= gdpr('view')->render('global/delete-action', compact('deleteAction')); ?>
3
  </select>
1
+ <select class="gdpr-select js-gdpr-conditional" name="gdpr_delete_action">
2
+ <?= gdpr('view')->render('global/delete-action', compact('deleteAction')); ?>
3
  </select>
views/admin/general/description-data-page.php CHANGED
@@ -1,3 +1,3 @@
1
- <p class="description">
2
- <?= _x('Select the page where users can go to control their data. This page must contain the [gdpr_privacy_tools] shortcode.', '(Admin)', 'gdpr-framework'); ?>
3
- </p>
1
+ <p class="description">
2
+ <?= _x('Select the page where users can go to control their data. This page must contain the [gdpr_privacy_tools] shortcode.', '(Admin)', 'gdpr-framework'); ?>
3
+ </p>
views/admin/general/description-delete-action.php CHANGED
@@ -1,3 +1,3 @@
1
- <p class="description">
2
- <?php _ex('What should happen if a data subject requests deleting their data.', '(Admin)', 'gdpr-framework'); ?>
3
- </p>
1
+ <p class="description">
2
+ <?php _ex('What should happen if a data subject requests deleting their data.', '(Admin)', 'gdpr-framework'); ?>
3
+ </p>
views/admin/general/description-export-action.php CHANGED
@@ -1,3 +1,3 @@
1
- <p class="description">
2
- <?php _ex('What should happen if a data subject requests viewing or exporting their data.', '(Admin)', 'gdpr-framework'); ?>
3
- </p>
1
+ <p class="description">
2
+ <?php _ex('What should happen if a data subject requests viewing or exporting their data.', '(Admin)', 'gdpr-framework'); ?>
3
+ </p>
views/admin/general/description-terms-page.php CHANGED
@@ -1,3 +1,3 @@
1
- <p class="description">
2
- <?php _ex('Optional. Select the page which contains your Terms & Conditions', '(Admin)', 'gdpr-framework'); ?>
3
- </p>
1
+ <p class="description">
2
+ <?php _ex('Optional. Select the page which contains your Terms & Conditions', '(Admin)', 'gdpr-framework'); ?>
3
+ </p>
views/admin/general/enable.php CHANGED
@@ -1,13 +1,13 @@
1
- <input
2
- type="checkbox"
3
- id="gdpr_enable"
4
- name="gdpr_enable"
5
- value="1"
6
- <?= checked($enabled, true); ?>
7
- />
8
- <label for="gdpr_enable">
9
- <?= _x('Enable the view, export and forget functionality for users and visitors', '(Admin)', 'gdpr-framework'); ?>
10
- </label>
11
- <p class="description">
12
- <?= _x('Enable the Privacy Tools page on front-end and dashboard. This allows visitors to request viewing and deleting their personal data and withdraw consents.', '(Admin)', 'gdpr-framework'); ?>
13
- </p>
1
+ <input
2
+ type="checkbox"
3
+ id="gdpr_enable"
4
+ name="gdpr_enable"
5
+ value="1"
6
+ <?= checked($enabled, true); ?>
7
+ />
8
+ <label for="gdpr_enable">
9
+ <?= _x('Enable the view, export and forget functionality for users and visitors', '(Admin)', 'gdpr-framework'); ?>
10
+ </label>
11
+ <p class="description">
12
+ <?= _x('Enable the Privacy Tools page on front-end and dashboard. This allows visitors to request viewing and deleting their personal data and withdraw consents.', '(Admin)', 'gdpr-framework'); ?>
13
+ </p>
views/admin/general/export-action-email.php CHANGED
@@ -1,7 +1,7 @@
1
- <input
2
- type="email"
3
- id="gdpr_export_action_email"
4
- name="gdpr_export_action_email"
5
- placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
6
- value="<?= esc_attr($exportActionEmail); ?>"
7
- />
1
+ <input
2
+ type="email"
3
+ id="gdpr_export_action_email"
4
+ name="gdpr_export_action_email"
5
+ placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
6
+ value="<?= esc_attr($exportActionEmail); ?>"
7
+ />
views/admin/general/stylesheet.php CHANGED
@@ -1,10 +1,10 @@
1
- <input
2
- type="checkbox"
3
- id="gdpr_enable_stylesheet"
4
- name="gdpr_enable_stylesheet"
5
- value="1"
6
- <?php echo checked($enabled, true); ?>
7
- />
8
- <label for="gdpr_enable_stylesheet">
9
- <?php _ex('Enable basic styling for Privacy Tools page.', '(Admin)', 'gdpr-framework'); ?>
10
- </label>
1
+ <input
2
+ type="checkbox"
3
+ id="gdpr_enable_stylesheet"
4
+ name="gdpr_enable_stylesheet"
5
+ value="1"
6
+ <?php echo checked($enabled, true); ?>
7
+ />
8
+ <label for="gdpr_enable_stylesheet">
9
+ <?php _ex('Enable basic styling for Privacy Tools page.', '(Admin)', 'gdpr-framework'); ?>
10
+ </label>
views/admin/general/theme-compatibility.php CHANGED
@@ -1,10 +1,10 @@
1
- <input
2
- type="checkbox"
3
- id="gdpr_enable_theme_compatibility"
4
- name="gdpr_enable_theme_compatibility"
5
- value="1"
6
- <?= checked($enabled, true); ?>
7
- />
8
- <label for="gdpr_enable_theme_compatibility">
9
- <?= _x('Automatically add Privacy Policy and Privacy Tools links to your site footer.', '(Admin)', 'gdpr-framework'); ?>
10
- </label>
1
+ <input
2
+ type="checkbox"
3
+ id="gdpr_enable_theme_compatibility"
4
+ name="gdpr_enable_theme_compatibility"
5
+ value="1"
6
+ <?= checked($enabled, true); ?>
7
+ />
8
+ <label for="gdpr_enable_theme_compatibility">
9
+ <?= _x('Automatically add Privacy Policy and Privacy Tools links to your site footer.', '(Admin)', 'gdpr-framework'); ?>
10
+ </label>
views/admin/modals/footer.php CHANGED
@@ -1,6 +1,6 @@
1
- <div class="gdpr-modal-footer">
2
- <a href="#" class="gdpr-close-modal">Close</a>
3
- |
4
- <a href="#">Get help</a>
5
- </div>
6
- </div>
1
+ <div class="gdpr-modal-footer">
2
+ <a href="#" class="gdpr-close-modal">Close</a>
3
+ |
4
+ <a href="#">Get help</a>
5
+ </div>
6
+ </div>
views/admin/modals/header.php CHANGED
@@ -1,5 +1,5 @@
1
- <div
2
- id="<?= $data['id']; ?>"
3
- class="hidden gdpr-modal"
4
- data-gdpr-title="<?= isset($data['title']) ? $data['title'] : ''; ?>"
5
- >
1
+ <div
2
+ id="<?= $data['id']; ?>"
3
+ class="hidden gdpr-modal"
4
+ data-gdpr-title="<?= isset($data['title']) ? $data['title'] : ''; ?>"
5
+ >
views/admin/modals/test.php CHANGED
@@ -1,8 +1,8 @@
1
- <h2>Test modal</h2>
2
- <p>This is a test modal. It can have any sort of content, for example a bullet list.</p>
3
- <ul>
4
- <li>Item 1</li>
5
- <li>Another item</li>
6
- <li>Last item</li>
7
- </ul>
8
- <p>It should be used for displaying super helpful instructions.</p>
1
+ <h2>Test modal</h2>
2
+ <p>This is a test modal. It can have any sort of content, for example a bullet list.</p>
3
+ <ul>
4
+ <li>Item 1</li>
5
+ <li>Another item</li>
6
+ <li>Last item</li>
7
+ </ul>
8
+ <p>It should be used for displaying super helpful instructions.</p>
views/admin/notices/disclaimer.php CHANGED
@@ -1,16 +1,16 @@
1
- <p>
2
- <strong>Disclaimer</strong><br>
3
- Using The GDPR Framework does NOT guarantee compliance to GDPR.
4
- By using this plugin, you agree to this disclaimer.
5
- These templates and guides provided to you are drafted by legal professionals in order for you to understand your obligations better,
6
- but they are NOT meant to constitute client-attorney relationship or personalized legal advice.
7
- Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
8
- We expressly disclaim all liability in respect of usage of this plugin.
9
- This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package.
10
- For compliance audit or further help <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>">contact legal professionals</a>.
11
- As each business and situation is unique, you might need to modify, add or delete information in these templates.
12
- In addition to this, you will need audit all your processing activities for achieving compliance to GDPR.
13
- Compliance to GDPR is risk based ongoing process.
14
- We are here to get you started.
15
- </p>
16
- <a class="button button-primary" href="<?= esc_url($acceptUrl); ?>">I accept</a>
1
+ <p>
2
+ <strong>Disclaimer</strong><br>
3
+ Using The GDPR Framework does NOT guarantee compliance to GDPR.
4
+ By using this plugin, you agree to this disclaimer.
5
+ These templates and guides provided to you are drafted by legal professionals in order for you to understand your obligations better,
6
+ but they are NOT meant to constitute client-attorney relationship or personalized legal advice.
7
+ Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
8
+ We expressly disclaim all liability in respect of usage of this plugin.
9
+ This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package.
10
+ For compliance audit or further help <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>">contact legal professionals</a>.
11
+ As each business and situation is unique, you might need to modify, add or delete information in these templates.
12
+ In addition to this, you will need audit all your processing activities for achieving compliance to GDPR.
13
+ Compliance to GDPR is risk based ongoing process.
14
+ We are here to get you started.
15
+ </p>
16
+ <a class="button button-primary" href="<?= esc_url($acceptUrl); ?>">I accept</a>
views/admin/notices/error.php CHANGED
@@ -1,3 +1,3 @@
1
- <div class="notice notice-error">
2
- <p><?= $message; ?></p>
3
- </div>
1
+ <div class="notice notice-error">
2
+ <p><?= $message; ?></p>
3
+ </div>
views/admin/notices/header.php CHANGED
@@ -1,4 +1,4 @@
1
- <div class="notice notice-gdpr">
2
- <img class="gdpr-badge" src="<?= gdpr('config')->get('plugin.url'); ?>assets/gdpr-rhino.svg" />
3
- <div class="gdpr-content">
4
- <h2><?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?></h2>
1
+ <div class="notice notice-gdpr">
2
+ <img class="gdpr-badge" src="<?= gdpr('config')->get('plugin.url'); ?>assets/gdpr-rhino.svg" />
3
+ <div class="gdpr-content">
4
+ <h2><?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?></h2>
views/admin/notices/help.php CHANGED
@@ -1,3 +1,3 @@
1
- <p>
2
- Need help? Take a look at our <a href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">documentation</a>.
3
- </p>
1
+ <p>
2
+ Need help? Take a look at our <a href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">documentation</a>.
3
+ </p>
views/admin/notices/helper-autoinstall.php CHANGED
@@ -1,10 +1,10 @@
1
- <p>
2
- <?= _x('A Privacy Policy page has been created, but it is empty. You can generate a policy template on this page.', '(Admin)', 'gdpr-framework'); ?>
3
- </p>
4
- <p>
5
- <?= _x(
6
- sprintf('Read more %shere%s', "<a href='{$helpUrl}'>", "</a>"),
7
- '(Admin)',
8
- 'gdpr-framework'
9
- ); ?>
10
- </p>
1
+ <p>
2
+ <?= _x('A Privacy Policy page has been created, but it is empty. You can generate a policy template on this page.', '(Admin)', 'gdpr-framework'); ?>
3
+ </p>
4
+ <p>
5
+ <?= _x(
6
+ sprintf('Read more %shere%s', "<a href='{$helpUrl}'>", "</a>"),
7
+ '(Admin)',
8
+ 'gdpr-framework'
9
+ ); ?>
10
+ </p>
views/admin/notices/helper-policy.php CHANGED
@@ -1,9 +1,9 @@
1
- <p>
2
- <?= _x('Heads up - your Privacy Policy still requires some attention. Find the places marked with [TODO] and replace them with real content!', '(Admin)', 'gdpr-framework'); ?>
3
- </p>
4
- <p>
5
- <?= _x(
6
- sprintf('Read more about editing your Privacy Policy %shere%s', "<a href='{$helpUrl}'>", "</a>"),
7
- '(Admin)','gdpr-framework'
8
- ); ?>
9
- </p>
1
+ <p>
2
+ <?= _x('Heads up - your Privacy Policy still requires some attention. Find the places marked with [TODO] and replace them with real content!', '(Admin)', 'gdpr-framework'); ?>
3
+ </p>
4
+ <p>
5
+ <?= _x(
6
+ sprintf('Read more about editing your Privacy Policy %shere%s', "<a href='{$helpUrl}'>", "</a>"),
7
+ '(Admin)','gdpr-framework'
8
+ ); ?>
9
+ </p>
views/admin/notices/helper-tools.php CHANGED
@@ -1,10 +1,10 @@
1
- <p>
2
- <?= _x('The contents of this page should contain the [gdpr_tools] shortcode.', '(Admin)', 'gdpr-framework'); ?>
3
- </p>
4
- <p>
5
- <?= _x(
6
- sprintf('Read more %shere%s', "<a href='{$helpUrl}'>", "</a>"),
7
- '(Admin)',
8
- 'gdpr-framework'
9
- ); ?>
10
- </p>
1
+ <p>
2
+ <?= _x('The contents of this page should contain the [gdpr_tools] shortcode.', '(Admin)', 'gdpr-framework'); ?>
3
+ </p>
4
+ <p>
5
+ <?= _x(
6
+ sprintf('Read more %shere%s', "<a href='{$helpUrl}'>", "</a>"),
7
+ '(Admin)',
8
+ 'gdpr-framework'
9
+ ); ?>
10
+ </p>
views/admin/privacy-policy/description-policy-page.php CHANGED
@@ -1,3 +1,3 @@
1
- <p class="description">
2
- <?= _x('Select the page which will contain your Privacy Policy', '(Admin)', 'gdpr-framework'); ?>
3
- </p>
1
+ <p class="description">
2
+ <?= _x('Select the page which will contain your Privacy Policy', '(Admin)', 'gdpr-framework'); ?>
3
+ </p>
views/admin/privacy-policy/dpa.php CHANGED
@@ -1,3 +1,3 @@
1
- <script>
2
- window.gdprDpaData = <?= $dpaData; ?>;
3
  </script>
1
+ <script>
2
+ window.gdprDpaData = <?= $dpaData; ?>;
3
  </script>
views/admin/privacy-policy/generated.php CHANGED
@@ -1,21 +1,21 @@
1
- <h3><?= _x('Privacy Policy', '(Admin)', 'gdpr-framework'); ?></h3>
2
- <p>
3
- <?= _x('Your Privacy Policy has been generated.', '(Admin)', 'gdpr-framework'); ?>
4
- <?php if ($policyUrl): ?>
5
- <?= __(
6
- sprintf(
7
- 'You can copy and paste it to your %sPrivacy Policy page%s.',
8
- "<a href='{$policyUrl}' target='_blank'>",
9
- "</a>"
10
- ),
11
- '(Admin)',
12
- 'gdpr-framework'
13
- ); ?>
14
- <?php endif; ?>
15
- </p>
16
-
17
- <?= $editor; ?>
18
-
19
- <br>
20
- <a href="<?= $backUrl; ?>" class="button button-secondary"><?= _x('&laquo; Back', '(Admin)', 'gdpr-framework'); ?></a>
21
- <br><br>
1
+ <h3><?= _x('Privacy Policy', '(Admin)', 'gdpr-framework'); ?></h3>
2
+ <p>
3
+ <?= _x('Your Privacy Policy has been generated.', '(Admin)', 'gdpr-framework'); ?>
4
+ <?php if ($policyUrl): ?>
5
+ <?= __(
6
+ sprintf(
7
+ 'You can copy and paste it to your %sPrivacy Policy page%s.',
8
+ "<a href='{$policyUrl}' target='_blank'>",
9
+ "</a>"
10
+ ),
11
+ '(Admin)',
12
+ 'gdpr-framework'
13
+ ); ?>
14
+ <?php endif; ?>
15
+ </p>
16
+
17
+ <?= $editor; ?>
18
+
19
+ <br>
20
+ <a href="<?= $backUrl; ?>" class="button button-secondary"><?= _x('&laquo; Back', '(Admin)', 'gdpr-framework'); ?></a>
21
+ <br><br>
views/admin/privacy-policy/header.php CHANGED
@@ -1,3 +1,3 @@
1
- <p>
2
- <?= _x('This page allows you to generate a Privacy Policy based on the information you entered below.', '(Admin)', 'gdpr-framework'); ?>
3
- </p>
1
+ <p>
2
+ <?= _x('This page allows you to generate a Privacy Policy based on the information you entered below.', '(Admin)', 'gdpr-framework'); ?>
3
+ </p>
views/admin/settings-page.php CHANGED
@@ -1,46 +1,46 @@
1
- <div class="wrap gdpr-framework-wrap">
2
- <h2>
3
- <?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?>
4
- </h2>
5
-
6
- <?php if (!empty($_GET['updated'])) : ?>
7
- <div id="setting-error-settings_updated" class="updated settings-error notice is-dismissible">
8
- <p><strong><?php _ex('GDPR settings saved!', '(Admin)', 'gdpr-framework') ?></strong></p>
9
- </div>
10
- <?php endif; ?>
11
-
12
- <?php if (count($tabs)): ?>
13
- <nav class="nav-tab-wrapper">
14
- <?php foreach ($tabs as $slug => $tab): ?>
15
- <a href="<?= $tab['url']; ?>" class="nav-tab <?= $tab['active'] ? 'nav-tab-active' : ''; ?>">
16
- <?= $tab['title'] ?>
17
- </a>
18
- <?php endforeach; ?>
19
- </nav>
20
- <?php endif; ?>
21
-
22
- <form action="options.php" method="POST">
23
- <?= $currentTabContents; ?>
24
- </form>
25
-
26
- <?php if ($signature): ?>
27
- <hr>
28
- <p>
29
- <em>
30
- <?= sprintf(
31
- _x('The GDPR Framework. Built with &#9829; by %sCodelight%s.', '(Admin)', 'gdpr-framework'),
32
- '<a href="https://codelight.eu/" target="_blank">',
33
- '</a>'
34
- ); ?>
35
- &nbsp;
36
- |
37
- &nbsp;
38
- <?= sprintf(
39
- _x("Support our development efforts with a %s5-star rating%s.", '(Admin)', 'gdpr-framework'),
40
- '<a href="https://wordpress.org/plugins/gdpr-framework/#reviews" target="_blank">',
41
- '</a>'
42
- ); ?>
43
- </em>
44
- </p>
45
- <?php endif; ?>
46
- </div>
1
+ <div class="wrap gdpr-framework-wrap">
2
+ <h2>
3
+ <?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?>
4
+ </h2>
5
+
6
+ <?php if (!empty($_GET['updated'])) : ?>
7
+ <div id="setting-error-settings_updated" class="updated settings-error notice is-dismissible">
8
+ <p><strong><?php _ex('GDPR settings saved!', '(Admin)', 'gdpr-framework') ?></strong></p>
9
+ </div>
10
+ <?php endif; ?>
11
+
12
+ <?php if (count($tabs)): ?>
13
+ <nav class="nav-tab-wrapper">
14
+ <?php foreach ($tabs as $slug => $tab): ?>
15
+ <a href="<?= $tab['url']; ?>" class="nav-tab <?= $tab['active'] ? 'nav-tab-active' : ''; ?>">
16
+ <?= $tab['title'] ?>
17
+ </a>
18
+ <?php endforeach; ?>
19
+ </nav>
20
+ <?php endif; ?>
21
+
22
+ <form action="options.php" method="POST">
23
+ <?= $currentTabContents; ?>
24
+ </form>
25
+
26
+ <?php if ($signature): ?>
27
+ <hr>
28
+ <p>
29
+ <em>
30
+ <?= sprintf(
31
+ _x('The GDPR Framework. Built with &#9829; by %sCodelight%s.', '(Admin)', 'gdpr-framework'),
32
+ '<a href="https://codelight.eu/" target="_blank">',
33
+ '</a>'
34
+ ); ?>
35
+ &nbsp;
36
+ |
37
+ &nbsp;
38
+ <?= sprintf(
39
+ _x("Support our development efforts with a %s5-star rating%s.", '(Admin)', 'gdpr-framework'),
40
+ '<a href="https://wordpress.org/plugins/gdpr-framework/#reviews" target="_blank">',
41
+ '</a>'
42
+ ); ?>
43
+ </em>
44
+ </p>
45
+ <?php endif; ?>
46
+ </div>
views/admin/support/contents.php CHANGED
@@ -1,62 +1,62 @@
1
- <hr>
2
-
3
- <section class="section">
4
- <h3 class="align-center">
5
- <?= _x('Need more info?', '(Admin)', 'gdpr-framework'); ?>
6
- </h3>
7
- <div class="row">
8
- <div class="col">
9
- <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/1.png');"></div>
10
- <a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">
11
- <?= _x('Site Owner\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
12
- </a>
13
- <p>
14
- <?= _x('Read the full guide on GDPR compliance.', '(Admin)', 'gdpr-framework'); ?>
15
- </p>
16
- </div>
17
- <div class="col">
18
- <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/2.png');"></div>
19
- <a class="button button-primary" href="<?= gdpr('helpers')->docs('knowledge-base'); ?>" target="_blank">
20
- <?= _x('Knowledge base', '(Admin)', 'gdpr-framework'); ?>
21
- </a>
22
- <p>
23
- <?= _x('Check out the knowledge base for common questions and answers.', '(Admin)', 'gdpr-framework'); ?>
24
- </p>
25
- </div>
26
- <div class="col">
27
- <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/3.png');"></div>
28
- <a class="button button-primary" href="<?= gdpr('helpers')->docs('developer-docs'); ?>" target="_blank">
29
- <?= _x('Developer\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
30
- </a>
31
- <p>
32
- <?= _x('We have a thorough guide to help making custom sites compliant.', '(Admin)', 'gdpr-framework'); ?>
33
- </p>
34
- </div>
35
- </div>
36
- </section>
37
-
38
- <section class="section">
39
- <h3 class="align-center">
40
- <?= _x('Need help?', '(Admin)', 'gdpr-framework'); ?>
41
- </h3>
42
- <div class="row">
43
- <div class="col">
44
- <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/4.png');"></div>
45
- <a class="button button-primary" href="https://wordpress.org/support/plugin/gdpr-framework" target="_blank">
46
- <?= _x('Submit a support request', '(Admin)', 'gdpr-framework'); ?>
47
- </a>
48
- <p>
49
- <?= _x('Found a bug or problem with the plugin? Post in the wordpress.org support forum.', '(Admin)', 'gdpr-framework'); ?>
50
- </p>
51
- </div>
52
- <div class="col">
53
- <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/5.png');"></div>
54
- <a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">
55
- <?= _x('Request a consultation', '(Admin)', 'gdpr-framework'); ?>
56
- </a>
57
- <p>
58
- <?= _x('Need development or legal assistance in making your site compliant? We can help!', '(Admin)', 'gdpr-framework'); ?>
59
- </p>
60
- </div>
61
- </div>
62
- </section>
1
+ <hr>
2
+
3
+ <section class="section">
4
+ <h3 class="align-center">
5
+ <?= _x('Need more info?', '(Admin)', 'gdpr-framework'); ?>
6
+ </h3>
7
+ <div class="row">
8
+ <div class="col">
9
+ <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/1.png');"></div>
10
+ <a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">
11
+ <?= _x('Site Owner\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
12
+ </a>
13
+ <p>
14
+ <?= _x('Read the full guide on GDPR compliance.', '(Admin)', 'gdpr-framework'); ?>
15
+ </p>
16
+ </div>
17
+ <div class="col">
18
+ <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/2.png');"></div>
19
+ <a class="button button-primary" href="<?= gdpr('helpers')->docs('knowledge-base'); ?>" target="_blank">
20
+ <?= _x('Knowledge base', '(Admin)', 'gdpr-framework'); ?>
21
+ </a>
22
+ <p>
23
+ <?= _x('Check out the knowledge base for common questions and answers.', '(Admin)', 'gdpr-framework'); ?>
24
+ </p>
25
+ </div>
26
+ <div class="col">
27
+ <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/3.png');"></div>
28
+ <a class="button button-primary" href="<?= gdpr('helpers')->docs('developer-docs'); ?>" target="_blank">
29
+ <?= _x('Developer\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
30
+ </a>
31
+ <p>
32
+ <?= _x('We have a thorough guide to help making custom sites compliant.', '(Admin)', 'gdpr-framework'); ?>
33
+ </p>
34
+ </div>
35
+ </div>
36
+ </section>
37
+
38
+ <section class="section">
39
+ <h3 class="align-center">
40
+ <?= _x('Need help?', '(Admin)', 'gdpr-framework'); ?>
41
+ </h3>
42
+ <div class="row">
43
+ <div class="col">
44
+ <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/4.png');"></div>
45
+ <a class="button button-primary" href="https://wordpress.org/support/plugin/gdpr-framework" target="_blank">
46
+ <?= _x('Submit a support request', '(Admin)', 'gdpr-framework'); ?>
47
+ </a>
48
+ <p>
49
+ <?= _x('Found a bug or problem with the plugin? Post in the wordpress.org support forum.', '(Admin)', 'gdpr-framework'); ?>
50
+ </p>
51
+ </div>
52
+ <div class="col">
53
+ <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/5.png');"></div>
54
+ <a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">
55
+ <?= _x('Request a consultation', '(Admin)', 'gdpr-framework'); ?>
56
+ </a>
57
+ <p>
58
+ <?= _x('Need development or legal assistance in making your site compliant? We can help!', '(Admin)', 'gdpr-framework'); ?>
59
+ </p>
60
+ </div>
61
+ </div>
62
+ </section>
views/admin/wizard-buttons.php CHANGED
@@ -1,5 +1,5 @@
1
- <a class="button button-primary" href="<?= esc_url($restartUrl); ?>">
2
- <?= _x('Restart setup wizard', '(Admin)', 'gdpr-framework'); ?>
3
- </a>
4
- <br><br>
5
- <hr>
1
+ <a class="button button-primary" href="<?= esc_url($restartUrl); ?>">
2
+ <?= _x('Restart setup wizard', '(Admin)', 'gdpr-framework'); ?>
3
+ </a>
4
+ <br><br>
5
+ <hr>
views/email/action-export.php CHANGED
@@ -1,9 +1,9 @@
1
- <p>
2
- <?= _x(
3
- sprintf('A data subject (%s) has just downloaded their data in %s format.', esc_html($email), esc_html($format)),
4
- '(Admin)', 'gdpr-framework'
5
- ); ?>
6
- </p>
7
- <p>
8
- <?= _x('This email is just for your information. You don\'t need to take any action', '(Admin)', 'gdpr-framework'); ?>
9
- </p>
1
+ <p>
2
+ <?= _x(
3
+ sprintf('A data subject (%s) has just downloaded their data in %s format.', esc_html($email), esc_html($format)),
4
+ '(Admin)', 'gdpr-framework'
5
+ ); ?>
6
+ </p>
7
+ <p>
8
+ <?= _x('This email is just for your information. You don\'t need to take any action', '(Admin)', 'gdpr-framework'); ?>
9
+ </p>
views/email/action-forget.php CHANGED
@@ -1,13 +1,13 @@
1
- <p>
2
- <?= _x(
3
- sprintf('A data subject (%s) has just removed all their data from your website.', esc_html($email)),
4
- '(Admin)', 'gdpr-framework'
5
- ); ?> <br><br>
6
-
7
- <?php if ($userId): ?>
8
- <?= _x('The data subject had a user account on your website.', '(Admin)', 'gdpr-framework'); ?> (ID: <?= $userId; ?>).
9
- <?php endif; ?>
10
- </p>
11
- <p>
12
- <?= _x('This email is just for your information. You don\'t need to take any action', '(Admin)', 'gdpr-framework'); ?>
13
- </p>
1
+ <p>
2
+ <?= _x(
3
+ sprintf('A data subject (%s) has just removed all their data from your website.', esc_html($email)),
4
+ '(Admin)', 'gdpr-framework'
5
+ ); ?> <br><br>
6
+
7
+ <?php if ($userId): ?>
8
+ <?= _x('The data subject had a user account on your website.', '(Admin)', 'gdpr-framework'); ?> (ID: <?= $userId; ?>).
9
+ <?php endif; ?>
10
+ </p>
11
+ <p>
12
+ <?= _x('This email is just for your information. You don\'t need to take any action', '(Admin)', 'gdpr-framework'); ?>
13
+ </p>
views/email/identify-data-subject.php CHANGED
@@ -1,11 +1,11 @@
1
- <p>
2
- <?= __('Someone has requested access to your data on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
3
- <?= __('If this was a mistake, just ignore this email and nothing will happen.', 'gdpr-framework'); ?> <br/>
4
- <?= __('To manage your data, visit the following address:', 'gdpr-framework'); ?> <br/>
5
- <a href="<?= esc_url($identificationUrl); ?>">
6
- <?= esc_url($identificationUrl); ?>
7
- </a>
8
- </p>
9
- <p>
10
- <?= __('This link is valid for 15 minutes.', 'gdpr-framework'); ?>
11
- </p>
1
+ <p>
2
+ <?= __('Someone has requested access to your data on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
3
+ <?= __('If this was a mistake, just ignore this email and nothing will happen.', 'gdpr-framework'); ?> <br/>
4
+ <?= __('To manage your data, visit the following address:', 'gdpr-framework'); ?> <br/>
5
+ <a href="<?= esc_url($identificationUrl); ?>">
6
+ <?= esc_url($identificationUrl); ?>
7
+ </a>
8
+ </p>
9
+ <p>
10
+ <?= __('This link is valid for 15 minutes.', 'gdpr-framework'); ?>
11
+ </p>
views/email/no-data.php CHANGED
@@ -1,6 +1,6 @@
1
- <p>
2
- <?= __('Someone has requested information about your personal data on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
3
- <?= __('None of your personal data is stored on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
4
- <br/>
5
- <?= __('If this was a mistake or you did not request this email, just ignore it and nothing will happen.', 'gdpr-framework'); ?> <br/>
6
- </p>
1
+ <p>
2
+ <?= __('Someone has requested information about your personal data on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
3
+ <?= __('None of your personal data is stored on', 'gdpr-framework'); ?> <?= esc_html($siteName); ?> <br/>
4
+ <br/>
5
+ <?= __('If this was a mistake or you did not request this email, just ignore it and nothing will happen.', 'gdpr-framework'); ?> <br/>
6
+ </p>
views/email/request-export.php CHANGED
@@ -1,14 +1,14 @@
1
- <p>
2
- <?= _x(
3
- sprintf('A data subject (%s) has requested to download their data in %s format.', esc_html($email), esc_html($format)),
4
- '(Admin)', 'gdpr-framework'
5
- ); ?>
6
- <br>
7
- <?= _x(
8
- sprintf('To access the data subject\'s data, %sclick here%s', "<a href='{$adminTabLink}'>", '</a>'),
9
- '(Admin)', 'gdpr-framework'
10
- ); ?>
11
- </p>
12
- <p>
13
- <?= _x('As a reminder: according to GDPR, you have 30 days to comply.', '(Admin)', 'gdpr-framework'); ?>
14
- </p>
1
+ <p>
2
+ <?= _x(
3
+ sprintf('A data subject (%s) has requested to download their data in %s format.', esc_html($email), esc_html($format)),
4
+ '(Admin)', 'gdpr-framework'
5
+ ); ?>
6
+ <br>
7
+ <?= _x(
8
+ sprintf('To access the data subject\'s data, %sclick here%s', "<a href='{$adminTabLink}'>", '</a>'),
9
+ '(Admin)', 'gdpr-framework'
10
+ ); ?>
11
+ </p>
12
+ <p>
13
+ <?= _x('As a reminder: according to GDPR, you have 30 days to comply.', '(Admin)', 'gdpr-framework'); ?>
14
+ </p>
views/email/request-forget.php CHANGED
@@ -1,14 +1,14 @@
1
- <p>
2
- <?= _x(
3
- sprintf('A data subject (%s) has requested to remove their data.', esc_html($email)),
4
- '(Admin)', 'gdpr-framework'
5
- ); ?>
6
- <br>
7
- <?= _x(
8
- sprintf('To access the data subject\'s data, %sclick here%s', "<a href='{$adminTabLink}'>", '</a>'),
9
- '(Admin)', 'gdpr-framework'
10
- ); ?>
11
- </p>
12
- <p>
13
- <?= _x('As a reminder: according to GDPR, you have 30 days to comply.', '(Admin)', 'gdpr-framework'); ?>
14
- </p>
1
+ <p>
2
+ <?= _x(
3
+ sprintf('A data subject (%s) has requested to remove their data.', esc_html($email)),
4
+ '(Admin)', 'gdpr-framework'
5
+ ); ?>
6
+ <br>
7
+ <?= _x(
8
+ sprintf('To access the data subject\'s data, %sclick here%s', "<a href='{$adminTabLink}'>", '</a>'),
9
+ '(Admin)', 'gdpr-framework'
10
+ ); ?>
11
+ </p>
12
+ <p>
13
+ <?= _x('As a reminder: according to GDPR, you have 30 days to comply.', '(Admin)', 'gdpr-framework'); ?>
14
+ </p>
views/global/country-options.php CHANGED
@@ -1,23 +1,23 @@
1
- <option disabled>-- Choose --</option>
2
-
3
- <optgroup label="Outside EU">
4
- <?php foreach ($outside as $code => $name): ?>
5
- <option
6
- value="<?= esc_attr($code); ?>"
7
- <?= selected($code, $current); ?>
8
- <?php if (in_array($code, ['UK', 'US', 'other'])): ?>
9
- data-show=".gdpr-representative"
10
- <?php endif; ?>
11
- >
12
- <?= esc_html($name); ?>
13
- </option>
14
- <?php endforeach; ?>
15
- </optgroup>
16
-
17
- <optgroup label="European Union">
18
- <?php foreach ($eu as $code => $name): ?>
19
- <option value="<?= esc_attr($code); ?>" <?= selected($code, $current); ?>>
20
- <?= esc_html($name); ?>
21
- </option>
22
- <?php endforeach; ?>
23
- </optgroup>
1
+ <option disabled>-- Choose --</option>
2
+
3
+ <optgroup label="Outside EU">
4
+ <?php foreach ($outside as $code => $name): ?>
5
+ <option
6
+ value="<?= esc_attr($code); ?>"
7
+ <?= selected($code, $current); ?>
8
+ <?php if (in_array($code, ['UK', 'US', 'other'])): ?>
9
+ data-show=".gdpr-representative"
10
+ <?php endif; ?>
11
+ >
12
+ <?= esc_html($name); ?>
13
+ </option>
14
+ <?php endforeach; ?>
15
+ </optgroup>
16
+
17
+ <optgroup label="European Union">
18
+ <?php foreach ($eu as $code => $name): ?>
19
+ <option value="<?= esc_attr($code); ?>" <?= selected($code, $current); ?>>
20
+ <?= esc_html($name); ?>
21
+ </option>
22
+ <?php endforeach; ?>
23
+ </optgroup>
views/global/delete-action.php CHANGED
@@ -1,20 +1,20 @@
1
- <option value="anonymize" <?= selected($deleteAction, 'anonymize'); ?>>
2
- <?= _x('Automatically anonymize data', '(Admin)', 'gdpr-framework') ?>
3
- </option>
4
- <option value="delete" <?= selected($deleteAction, 'delete'); ?> data-show=".js-gdpr-delete-action-reassign">
5
- <?= _x('Automatically delete data', '(Admin)', 'gdpr-framework') ?>
6
- </option>
7
- <option value="anonymize_and_notify" <?= selected($deleteAction, 'anonymize_and_notify'); ?>
8
- data-show=".js-gdpr-delete-action-email">
9
- <?= _x('Automatically anonymize data and notify me via email', '(Admin)', 'gdpr-framework') ?>
10
- </option>
11
- <option value="delete_and_notify" <?= selected($deleteAction, 'delete_and_notify'); ?>
12
- data-show=".js-gdpr-delete-action-email, .js-gdpr-delete-action-reassign">
13
- <?= _x('Automatically delete data and notify me via email', '(Admin)', 'gdpr-framework') ?>
14
- </option>
15
- <option value="notify" <?= selected($deleteAction, 'notify'); ?> data-show=".js-gdpr-delete-action-email">
16
- <?= _x('Only notify me via email', '(Admin)', 'gdpr-framework') ?>
17
- </option>
18
-
19
-
20
-
1
+ <option value="anonymize" <?= selected($deleteAction, 'anonymize'); ?>>
2
+ <?= _x('Automatically anonymize data', '(Admin)', 'gdpr-framework') ?>
3
+ </option>
4
+ <option value="delete" <?= selected($deleteAction, 'delete'); ?> data-show=".js-gdpr-delete-action-reassign">
5
+ <?= _x('Automatically delete data', '(Admin)', 'gdpr-framework') ?>
6
+ </option>
7
+ <option value="anonymize_and_notify" <?= selected($deleteAction, 'anonymize_and_notify'); ?>
8
+ data-show=".js-gdpr-delete-action-email">
9
+ <?= _x('Automatically anonymize data and notify me via email', '(Admin)', 'gdpr-framework') ?>
10
+ </option>
11
+ <option value="delete_and_notify" <?= selected($deleteAction, 'delete_and_notify'); ?>
12
+ data-show=".js-gdpr-delete-action-email, .js-gdpr-delete-action-reassign">
13
+ <?= _x('Automatically delete data and notify me via email', '(Admin)', 'gdpr-framework') ?>
14
+ </option>
15
+ <option value="notify" <?= selected($deleteAction, 'notify'); ?> data-show=".js-gdpr-delete-action-email">
16
+ <?= _x('Only notify me via email', '(Admin)', 'gdpr-framework') ?>
17
+ </option>
18
+
19
+
20
+
views/global/export-action.php CHANGED
@@ -1,14 +1,14 @@
1
- <option value="download" <?= selected($exportAction, 'download'); ?>>
2
- <?= _x('Automatically download data', '(Admin)', 'gdpr-framework') ?>
3
- </option>
4
- <option value="download_and_notify" <?= selected($exportAction, 'download_and_notify'); ?>
5
- data-show=".js-gdpr-export-action-email">
6
- <?= _x('Automatically download data and notify me via email', '(Admin)', 'gdpr-framework') ?>
7
- </option>
8
- <option value="notify" <?= selected($exportAction, 'notify'); ?>
9
- data-show=".js-gdpr-export-action-email">
10
- <?= _x('Only notify me via email', '(Admin)', 'gdpr-framework') ?>
11
- </option>
12
-
13
-
14
-
1
+ <option value="download" <?= selected($exportAction, 'download'); ?>>
2
+ <?= _x('Automatically download data', '(Admin)', 'gdpr-framework') ?>
3
+ </option>
4
+ <option value="download_and_notify" <?= selected($exportAction, 'download_and_notify'); ?>
5
+ data-show=".js-gdpr-export-action-email">
6
+ <?= _x('Automatically download data and notify me via email', '(Admin)', 'gdpr-framework') ?>
7
+ </option>
8
+ <option value="notify" <?= selected($exportAction, 'notify'); ?>
9
+ data-show=".js-gdpr-export-action-email">
10
+ <?= _x('Only notify me via email', '(Admin)', 'gdpr-framework') ?>
11
+ </option>
12
+
13
+
14
+
views/global/html-data.php CHANGED
@@ -1,39 +1,39 @@
1
- <!doctype html>
2
- <html lang="en-US">
3
- <head>
4
- <meta charset="UTF-8">
5
- <title>Your data</title>
6
-
7
- <style type="text/css">
8
- table {
9
- font-family: verdana,arial,sans-serif;
10
- font-size:11px;
11
- color:#333333;
12
- border-width: 1px;
13
- border-color: #3A3A3A;
14
- border-collapse: collapse;
15
- }
16
- table th {
17
- border-width: 1px;
18
- padding: 8px;
19
- border-style: solid;
20
- border-color: #3A3A3A;
21
- background-color: #B3B3B3;
22
- }
23
- table td {
24
- border-width: 1px;
25
- padding: 8px;
26
- border-style: solid;
27
- border-color: #3A3A3A;
28
- background-color: #ffffff;
29
- }
30
-
31
- td.key {
32
- font-weight: bold;
33
- }
34
- </style>
35
- </head>
36
- <body>
37
- <?= $table; ?>
38
- </body>
39
  </html>
1
+ <!doctype html>
2
+ <html lang="en-US">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <title>Your data</title>
6
+
7
+ <style type="text/css">
8
+ table {
9
+ font-family: verdana,arial,sans-serif;
10
+ font-size:11px;
11
+ color:#333333;
12
+ border-width: 1px;
13
+ border-color: #3A3A3A;
14
+ border-collapse: collapse;
15
+ }
16
+ table th {
17
+ border-width: 1px;
18
+ padding: 8px;
19
+ border-style: solid;
20
+ border-color: #3A3A3A;
21
+ background-color: #B3B3B3;
22
+ }
23
+ table td {
24
+ border-width: 1px;
25
+ padding: 8px;
26
+ border-style: solid;
27
+ border-color: #3A3A3A;
28
+ background-color: #ffffff;
29
+ }
30
+
31
+ td.key {
32
+ font-weight: bold;
33
+ }
34
+ </style>
35
+ </head>
36
+ <body>
37
+ <?= $table; ?>
38
+ </body>
39
  </html>
views/installer/continue-notice.php CHANGED
@@ -1,10 +1,10 @@
1
- <p>
2
- <?= _x('The The GDPR Framework setup has not been finalized yet.', '(Admin)', 'gdpr-framework'); ?> <br>
3
- <?= _x('You can continue the setup at any time.', '(Admin)', 'gdpr-framework'); ?>
4
- </p>
5
- <a class="button button-primary" href="<?= $buttonUrl; ?>">
6
- <?= _x('Continue the setup wizard', '(Admin)', 'gdpr-framework'); ?>
7
- </a>
8
- <a class="button button-secondary" href="<?= $skipUrl; ?>">
9
- <?= _x('Hide this message', '(Admin)', 'gdpr-framework'); ?>
10
- </a>
1
+ <p>
2
+ <?= _x('The The GDPR Framework setup has not been finalized yet.', '(Admin)', 'gdpr-framework'); ?> <br>
3
+ <?= _x('You can continue the setup at any time.', '(Admin)', 'gdpr-framework'); ?>
4
+ </p>
5
+ <a class="button button-primary" href="<?= $buttonUrl; ?>">
6
+ <?= _x('Continue the setup wizard', '(Admin)', 'gdpr-framework'); ?>
7
+ </a>
8
+ <a class="button button-secondary" href="<?= $skipUrl; ?>">
9
+ <?= _x('Hide this message', '(Admin)', 'gdpr-framework'); ?>
10
+ </a>
views/installer/footer.php CHANGED
@@ -1,41 +1,41 @@
1
- <!-- Close the installer form -->
2
- </form>
3
-
4
- <?php if (!isset($disableBackButton) or !$disableBackButton): ?>
5
- <form method="POST">
6
- <input type="hidden" name="gdpr-installer" value="previous" />
7
- <input type="submit" class="button button-secondary gdpr-step-button gdpr-step-button-prev" value="&laquo; <?= __('Back'); ?>">
8
- </form>
9
- <?php endif; ?>
10
-
11
- </div> <!-- .gdpr-content -->
12
-
13
-
14
-
15
- <!--
16
- <div class="gdpr-sticky">
17
- <hr>
18
- <a class="button button-primary" href="#">I need help</a>
19
- </div>
20
- -->
21
-
22
- </div> <!-- .container -->
23
-
24
- <div class="gdpr-footer-links">
25
- <p>
26
- You can always leave and continue the setup later from where you left off
27
- </p>
28
- <a class="button button-secondary" href="<?= admin_url(); ?>">
29
- Go to Dashboard
30
- </a>
31
- </div>
32
-
33
- <?php wp_print_scripts([
34
- 'gdpr-installer',
35
- 'jquery-repeater',
36
- 'select2',
37
- 'conditional-show'
38
- ]); ?>
39
- <?php do_action('admin_print_footer_scripts'); ?>
40
- </body>
41
- </html>
1
+ <!-- Close the installer form -->
2
+ </form>
3
+
4
+ <?php if (!isset($disableBackButton) or !$disableBackButton): ?>
5
+ <form method="POST">
6
+ <input type="hidden" name="gdpr-installer" value="previous" />
7
+ <input type="submit" class="button button-secondary gdpr-step-button gdpr-step-button-prev" value="&laquo; <?= __('Back'); ?>">
8
+ </form>
9
+ <?php endif; ?>
10
+
11
+ </div> <!-- .gdpr-content -->
12
+
13
+
14
+
15
+ <!--
16
+ <div class="gdpr-sticky">
17
+ <hr>
18
+ <a class="button button-primary" href="#">I need help</a>
19
+ </div>
20
+ -->
21
+
22
+ </div> <!-- .container -->
23
+
24
+ <div class="gdpr-footer-links">
25
+ <p>
26
+ You can always leave and continue the setup later from where you left off
27
+ </p>
28
+ <a class="button button-secondary" href="<?= admin_url(); ?>">
29
+ Go to Dashboard
30
+ </a>
31
+ </div>
32
+
33
+ <?php wp_print_scripts([
34
+ 'gdpr-installer',
35
+ 'jquery-repeater',
36
+ 'select2',
37
+ 'conditional-show'
38
+ ]); ?>
39
+ <?php do_action('admin_print_footer_scripts'); ?>
40
+ </body>
41
+ </html>
views/installer/header.php CHANGED
@@ -1,64 +1,64 @@
1
- <!DOCTYPE html>
2
- <html <?php language_attributes(); ?>>
3
- <head>
4
- <meta name="viewport" content="width=device-width" />
5
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
- <title>
7
- <?php echo esc_html_x( 'WordPress GDPR &rsaquo; Setup Wizard', '(Admin)', 'gdpr-framework' ); ?>
8
- </title>
9
- <?php wp_print_scripts(['jquery']); ?>
10
- <?php do_action('admin_print_styles'); ?>
11
- <?php do_action('admin_head'); ?>
12
- </head>
13
-
14
- <body class="gdpr-installer wp-core-ui">
15
-
16
- <div class="container gdpr-installer-container">
17
- <div class="gdpr-header">
18
- <div class="gdpr-header_left">
19
- <img class="gdpr-logo" src="<?= gdpr('config')->get('plugin.url'); ?>/assets/gdpr-rhino.svg" />
20
- </div>
21
- <div class="gdpr-header_right">
22
- <h1>
23
- <?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?>
24
- </h1>
25
- <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" class="button button-secondary button-side" target="_blank">
26
- <?= _x('I need help', '(Admin)', 'gdpr-framework'); ?>
27
- </a>
28
- <a href="<?= gdpr('helpers')->docs('developer-docs'); ?>" class="button button-secondary button-side" target="_blank">
29
- <?= _x('Developer Docs', '(Admin)', 'gdpr-framework'); ?>
30
- </a>
31
- </div>
32
- </div>
33
- <div class="gdpr-breadcrumbs">
34
- <div class="gdpr-breadcrumbs_unit <?= $activeSteps > 0 ? 'active' : ''; ?>">
35
- <div class="gdpr-breadcrumbs_item">
36
- <?= _x('Configuration', '(Admin)', 'gdpr-framework'); ?>
37
- </div>
38
- </div>
39
- <div class="gdpr-breadcrumbs_unit <?= $activeSteps > 1 ? 'active' : ''; ?>">
40
- <div class="gdpr-breadcrumbs_item">
41
- <?= _x('Privacy Policy', '(Admin)', 'gdpr-framework'); ?>
42
- </div>
43
- </div>
44
- <div class="gdpr-breadcrumbs_unit <?= $activeSteps > 2 ? 'active' : ''; ?>">
45
- <div class="gdpr-breadcrumbs_item">
46
- <?= _x('Forms & Consent', '(Admin)', 'gdpr-framework'); ?>
47
- </div>
48
- </div>
49
- <div class="gdpr-breadcrumbs_unit <?= $activeSteps > 3 ? 'active' : ''; ?>">
50
- <div class="gdpr-breadcrumbs_item">
51
- <?= _x('Integrations', '(Admin)', 'gdpr-framework'); ?>
52
- </div>
53
- </div>
54
- </div>
55
-
56
- <div class="gdpr-content">
57
-
58
- <?php if (isset($_GET['gdpr-error'])): ?>
59
- <p class="error">Failed to validate nonce! Please reload page and try again.</p>
60
- <?php endif; ?>
61
-
62
- <!-- Open the installer form -->
63
- <form method="POST">
64
- <input type="hidden" name="gdpr-installer" value="next" />
1
+ <!DOCTYPE html>
2
+ <html <?php language_attributes(); ?>>
3
+ <head>
4
+ <meta name="viewport" content="width=device-width" />
5
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6
+ <title>
7
+ <?php echo esc_html_x( 'WordPress GDPR &rsaquo; Setup Wizard', '(Admin)', 'gdpr-framework' ); ?>
8
+ </title>
9
+ <?php wp_print_scripts(['jquery']); ?>
10
+ <?php do_action('admin_print_styles'); ?>
11
+ <?php do_action('admin_head'); ?>
12
+ </head>
13
+
14
+ <body class="gdpr-installer wp-core-ui">
15
+
16
+ <div class="container gdpr-installer-container">
17
+ <div class="gdpr-header">
18
+ <div class="gdpr-header_left">
19
+ <img class="gdpr-logo" src="<?= gdpr('config')->get('plugin.url'); ?>/assets/gdpr-rhino.svg" />
20
+ </div>
21
+ <div class="gdpr-header_right">
22
+ <h1>
23
+ <?= _x('The GDPR Framework', '(Admin)', 'gdpr-framework'); ?>
24
+ </h1>
25
+ <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" class="button button-secondary button-side" target="_blank">
26
+ <?= _x('I need help', '(Admin)', 'gdpr-framework'); ?>
27
+ </a>
28
+ <a href="<?= gdpr('helpers')->docs('developer-docs'); ?>" class="button button-secondary button-side" target="_blank">
29
+ <?= _x('Developer Docs', '(Admin)', 'gdpr-framework'); ?>
30
+ </a>
31
+ </div>
32
+ </div>
33
+ <div class="gdpr-breadcrumbs">
34
+ <div class="gdpr-breadcrumbs_unit <?= $activeSteps > 0 ? 'active' : ''; ?>">
35
+ <div class="gdpr-breadcrumbs_item">
36
+ <?= _x('Configuration', '(Admin)', 'gdpr-framework'); ?>
37
+ </div>
38
+ </div>
39
+ <div class="gdpr-breadcrumbs_unit <?= $activeSteps > 1 ? 'active' : ''; ?>">
40
+ <div class="gdpr-breadcrumbs_item">
41
+ <?= _x('Privacy Policy', '(Admin)', 'gdpr-framework'); ?>
42
+ </div>
43
+ </div>
44
+ <div class="gdpr-breadcrumbs_unit <?= $activeSteps > 2 ? 'active' : ''; ?>">
45
+ <div class="gdpr-breadcrumbs_item">
46
+ <?= _x('Forms & Consent', '(Admin)', 'gdpr-framework'); ?>
47
+ </div>
48
+ </div>
49
+ <div class="gdpr-breadcrumbs_unit <?= $activeSteps > 3 ? 'active' : ''; ?>">
50
+ <div class="gdpr-breadcrumbs_item">
51
+ <?= _x('Integrations', '(Admin)', 'gdpr-framework'); ?>
52
+ </div>
53
+ </div>
54
+ </div>
55
+
56
+ <div class="gdpr-content">
57
+
58
+ <?php if (isset($_GET['gdpr-error'])): ?>
59
+ <p class="error">Failed to validate nonce! Please reload page and try again.</p>
60
+ <?php endif; ?>
61
+
62
+ <!-- Open the installer form -->
63
+ <form method="POST">
64
+ <input type="hidden" name="gdpr-installer" value="next" />
views/installer/steps/configuration-pages.php CHANGED
@@ -1,37 +1,37 @@
1
- <h1>
2
- Configuration (1/2)
3
- </h1>
4
-
5
- <h2>Privacy Tools page</h2>
6
- <p>
7
- The first major requirement of GDPR is that your customers need to be in control of their data. They have the
8
- right to view, edit and request deleting their <a href="<?= gdpr('helpers')->docs('guide/wordpress-gdpr-definitions-you-need-to-know/#personal-data'); ?>" target="_blank">personal data</a>. Note that this also
9
- applies to visitors who do not have accounts on your website.
10
- </p>
11
- <p>
12
- For this, we will designate a page where customers will be able to authenticate via login or email and automatically do all of the above.
13
- <a href="<?= gdpr('helpers')->docs('guide/privacy-tools-page-accessing-exporting-and-deleting-personal-data/'); ?>" target="_blank">Read more about the Privacy Tools page</a>
14
- </p>
15
- <hr>
16
-
17
- <h4>Set up the Privacy Tools page</h4>
18
- <fieldset>
19
- <label>
20
- <input type="radio" name="gdpr_create_tools_page" value="yes" class="js-gdpr-conditional" <?= !$privacyToolsPage ? 'checked': ''; ?>>
21
- Automatically create a new page for Privacy Tools
22
- </label>
23
-
24
- <label>
25
- <input type="radio" name="gdpr_create_tools_page" value="no" class="js-gdpr-conditional" data-show=".gdpr-select-privacy-tools-page" <?= $privacyToolsPage ? 'checked': ''; ?>> Select an existing page
26
- </label>
27
- </fieldset>
28
-
29
- <p class="gdpr-select-privacy-tools-page hidden">
30
- <label for="gdpr_tools_page">Select the page for Privacy Tools</label>
31
- <?= $privacyToolsPageSelector; ?>
32
- <strong>Important:</strong> Make sure that the page contains the <strong>[gdpr_privacy_tools]</strong> shortcode.
33
- </p>
34
-
35
- <hr>
36
- <br>
37
- <input type="submit" class="button button-gdpr button-right" value="Save &raquo;"/>
1
+ <h1>
2
+ Configuration (1/2)
3
+ </h1>
4
+
5
+ <h2>Privacy Tools page</h2>
6
+ <p>
7
+ The first major requirement of GDPR is that your customers need to be in control of their data. They have the
8
+ right to view, edit and request deleting their <a href="<?= gdpr('helpers')->docs('guide/wordpress-gdpr-definitions-you-need-to-know/#personal-data'); ?>" target="_blank">personal data</a>. Note that this also
9
+ applies to visitors who do not have accounts on your website.
10
+ </p>
11
+ <p>
12
+ For this, we will designate a page where customers will be able to authenticate via login or email and automatically do all of the above.
13
+ <a href="<?= gdpr('helpers')->docs('guide/privacy-tools-page-accessing-exporting-and-deleting-personal-data/'); ?>" target="_blank">Read more about the Privacy Tools page</a>
14
+ </p>
15
+ <hr>
16
+
17
+ <h4>Set up the Privacy Tools page</h4>
18
+ <fieldset>
19
+ <label>
20
+ <input type="radio" name="gdpr_create_tools_page" value="yes" class="js-gdpr-conditional" <?= !$privacyToolsPage ? 'checked': ''; ?>>
21
+ Automatically create a new page for Privacy Tools
22
+ </label>
23
+
24
+ <label>
25
+ <input type="radio" name="gdpr_create_tools_page" value="no" class="js-gdpr-conditional" data-show=".gdpr-select-privacy-tools-page" <?= $privacyToolsPage ? 'checked': ''; ?>> Select an existing page
26
+ </label>
27
+ </fieldset>
28
+
29
+ <p class="gdpr-select-privacy-tools-page hidden">
30
+ <label for="gdpr_tools_page">Select the page for Privacy Tools</label>
31
+ <?= $privacyToolsPageSelector; ?>
32
+ <strong>Important:</strong> Make sure that the page contains the <strong>[gdpr_privacy_tools]</strong> shortcode.
33
+ </p>
34
+
35
+ <hr>
36
+ <br>
37
+ <input type="submit" class="button button-gdpr button-right" value="Save &raquo;"/>
views/installer/steps/configuration-settings.php CHANGED
@@ -1,87 +1,87 @@
1
- <h1>
2
- Configuration (2/2)
3
- </h1>
4
- <h2>&#10004; Privacy Tools page configured!</h2>
5
- <p>
6
- You can take a look at the Privacy Tools page <a href="<?= $privacyToolsPageUrl; ?>" target="_blank">here</a>. <br>
7
- <br>
8
- <a href="<?= gdpr('helpers')->docs('guide/privacy-tools-page-accessing-exporting-and-deleting-personal-data/'); ?>" target="_blank">Read more about the Privacy Tools page</a>
9
- </p>
10
- <hr>
11
-
12
- <h2>Right to view & export data</h2>
13
- <p>
14
- Your customers have the right to review and export their personal data.
15
-
16
- <label for="gdpr_export_action">Select what happens if a customer wishes to view or export their personal data</label>
17
-
18
- <select class="gdpr-select js-gdpr-conditional" name="gdpr_export_action">
19
- <?= gdpr('view')->render('global/export-action', compact('exportAction')); ?>
20
- </select>
21
- <span class="hidden js-gdpr-export-action-email">
22
- <label for="export_action_email">
23
- <?= _x('Enter the email address to notify', '(Admin)', 'gdpr-framework'); ?>
24
- </label>
25
- <input
26
- type="email"
27
- id="gdpr_export_action_email"
28
- name="gdpr_export_action_email"
29
- placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
30
- value="<?= esc_attr($exportActionEmail); ?>"
31
- />
32
- </span>
33
- </p>
34
- <hr>
35
-
36
- <h2>Right to be forgotten</h2>
37
- <p>
38
- Your customers have the right to request deleting their personal data.
39
-
40
- <label for="gdpr_delete_action">Select what happens if a customer wishes to delete their personal data</label>
41
-
42
- <select class="gdpr-select js-gdpr-conditional" name="gdpr_delete_action">
43
- <?= gdpr('view')->render('global/delete-action', compact('deleteAction')); ?>
44
- </select>
45
-
46
- <span class="hidden js-gdpr-delete-action-reassign">
47
- <label for="gdpr_delete_action_reassign">If the user has created any content (posts or pages), should it be deleted or reassigned?</label>
48
- <select id="gdpr_delete_action_reassign" name="gdpr_delete_action_reassign" class="gdpr-select js-gdpr-conditional">
49
- <option value="delete" <?= selected($reassign, 'delete'); ?>>
50
- <?= _x('Delete content', '(Admin)', 'gdpr-framework'); ?>
51
- </option>
52
- <option value="reassign" <?= selected($reassign, 'reassign'); ?> data-show=".js-gdpr-delete-action-reassign-user">
53
- <?= _x('Reassign content to a user', '(Admin)', 'gdpr-framework'); ?>
54
- </option>
55
- </select>
56
- </span>
57
-
58
- <span class="hidden js-gdpr-delete-action-reassign-user">
59
- <label for="gdpr_delete_action_reassign_user">Select the user to reassign content to</label>
60
- <?php wp_dropdown_users([
61
- 'name' => 'gdpr_delete_action_reassign_user',
62
- 'show_option_none' => _x('&mdash; Select &mdash;', '(Admin)', 'gdpr-framework'),
63
- 'option_none_value' => '0',
64
- 'selected' => $reassignUser,
65
- 'class' => 'js-gdpr-select2 gdpr-select',
66
- 'id' => 'gdpr_delete_action_reassign_user',
67
- 'role__in' => apply_filters('gdpr/options/reassign/roles', ['administrator', 'editor']),
68
- ]); ?>
69
- </span>
70
-
71
- <span class="hidden js-gdpr-delete-action-email">
72
- <label for="delete_action_email">
73
- <?= _x('Enter the email address to notify', '(Admin)', 'gdpr-framework'); ?>
74
- </label>
75
- <input
76
- type="email"
77
- id="gdpr_delete_action_email"
78
- name="gdpr_delete_action_email"
79
- placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
80
- value="<?= esc_attr($deleteActionEmail); ?>"
81
- />
82
- </span>
83
- </p>
84
-
85
- <hr>
86
- <br>
87
- <input type="submit" class="button button-gdpr button-right" value="Save &raquo;"/>
1
+ <h1>
2
+ Configuration (2/2)
3
+ </h1>
4
+ <h2>&#10004; Privacy Tools page configured!</h2>
5
+ <p>
6
+ You can take a look at the Privacy Tools page <a href="<?= $privacyToolsPageUrl; ?>" target="_blank">here</a>. <br>
7
+ <br>
8
+ <a href="<?= gdpr('helpers')->docs('guide/privacy-tools-page-accessing-exporting-and-deleting-personal-data/'); ?>" target="_blank">Read more about the Privacy Tools page</a>
9
+ </p>
10
+ <hr>
11
+
12
+ <h2>Right to view & export data</h2>
13
+ <p>
14
+ Your customers have the right to review and export their personal data.
15
+
16
+ <label for="gdpr_export_action">Select what happens if a customer wishes to view or export their personal data</label>
17
+
18
+ <select class="gdpr-select js-gdpr-conditional" name="gdpr_export_action">
19
+ <?= gdpr('view')->render('global/export-action', compact('exportAction')); ?>
20
+ </select>
21
+ <span class="hidden js-gdpr-export-action-email">
22
+ <label for="export_action_email">
23
+ <?= _x('Enter the email address to notify', '(Admin)', 'gdpr-framework'); ?>
24
+ </label>
25
+ <input
26
+ type="email"
27
+ id="gdpr_export_action_email"
28
+ name="gdpr_export_action_email"
29
+ placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
30
+ value="<?= esc_attr($exportActionEmail); ?>"
31
+ />
32
+ </span>
33
+ </p>
34
+ <hr>
35
+
36
+ <h2>Right to be forgotten</h2>
37
+ <p>
38
+ Your customers have the right to request deleting their personal data.
39
+
40
+ <label for="gdpr_delete_action">Select what happens if a customer wishes to delete their personal data</label>
41
+
42
+ <select class="gdpr-select js-gdpr-conditional" name="gdpr_delete_action">
43
+ <?= gdpr('view')->render('global/delete-action', compact('deleteAction')); ?>
44
+ </select>
45
+
46
+ <span class="hidden js-gdpr-delete-action-reassign">
47
+ <label for="gdpr_delete_action_reassign">If the user has created any content (posts or pages), should it be deleted or reassigned?</label>
48
+ <select id="gdpr_delete_action_reassign" name="gdpr_delete_action_reassign" class="gdpr-select js-gdpr-conditional">
49
+ <option value="delete" <?= selected($reassign, 'delete'); ?>>
50
+ <?= _x('Delete content', '(Admin)', 'gdpr-framework'); ?>
51
+ </option>
52
+ <option value="reassign" <?= selected($reassign, 'reassign'); ?> data-show=".js-gdpr-delete-action-reassign-user">
53
+ <?= _x('Reassign content to a user', '(Admin)', 'gdpr-framework'); ?>
54
+ </option>
55
+ </select>
56
+ </span>
57
+
58
+ <span class="hidden js-gdpr-delete-action-reassign-user">
59
+ <label for="gdpr_delete_action_reassign_user">Select the user to reassign content to</label>
60
+ <?php wp_dropdown_users([
61
+ 'name' => 'gdpr_delete_action_reassign_user',
62
+ 'show_option_none' => _x('&mdash; Select &mdash;', '(Admin)', 'gdpr-framework'),
63
+ 'option_none_value' => '0',
64
+ 'selected' => $reassignUser,
65
+ 'class' => 'js-gdpr-select2 gdpr-select',
66
+ 'id' => 'gdpr_delete_action_reassign_user',
67
+ 'role__in' => apply_filters('gdpr/options/reassign/roles', ['administrator', 'editor']),
68
+ ]); ?>
69
+ </span>
70
+
71
+ <span class="hidden js-gdpr-delete-action-email">
72
+ <label for="delete_action_email">
73
+ <?= _x('Enter the email address to notify', '(Admin)', 'gdpr-framework'); ?>
74
+ </label>
75
+ <input
76
+ type="email"
77
+ id="gdpr_delete_action_email"
78
+ name="gdpr_delete_action_email"
79
+ placeholder="<?= __('Email address', 'gdpr-framework'); ?>"
80
+ value="<?= esc_attr($deleteActionEmail); ?>"
81
+ />
82
+ </span>
83
+ </p>
84
+
85
+ <hr>
86
+ <br>
87
+ <input type="submit" class="button button-gdpr button-right" value="Save &raquo;"/>
views/installer/steps/consent.php CHANGED
@@ -1,87 +1,87 @@
1
- <h1>
2
- Forms and Consent
3
- </h1>
4
-
5
- <h2>Introduction</h2>
6
-
7
- <p>
8
- GDPR brings very strict rules for gathering and processing personal data. The most important thing to remember is that
9
- you need to have <strong>legal grounds</strong> for each and every type of data you gather and process. If you are not
10
- familiar with what this means, we strongly recommend you read this post from the guide: <br>
11
- <a href="<?= gdpr('helpers')->docs('guide/legal-grounds-for-processing-data/'); ?>" target="_blank">Consent and other legal grounds for processing data</a>
12
- </p>
13
-
14
- <p>
15
- Under GDPR, <strong>all forms</strong> require special attention. You'll need to explain why you gather the data and
16
- what you do with it. And if there are no other legal grounds, you'll need to ask for consent.
17
- Note that your customers must also be able to <strong>withdraw</strong> each consent they have given.
18
- </p>
19
-
20
- <h2>WordPress forms</h2>
21
-
22
- <p>
23
- For <strong>posting comments</strong> and <strong>registering accounts</strong>,
24
- you will need to ask your customers consent to the Privacy Policy. If your site allows comments or registration,
25
- the GDPR Framework will automatically add consent checkboxes to the respective forms.
26
- </p>
27
-
28
- <h2>Withdrawing consent</h2>
29
-
30
- <p>
31
- Your customers can withdraw their given consents on the <a href="<?= $privacyToolsPageUrl; ?>" target="blank">Privacy Tools Page</a>.
32
- </p>
33
- <br>
34
- <hr>
35
-
36
- <?php if ($hasGravityForms): ?>
37
- <h2>&#10004; Gravity Forms</h2>
38
- <p>
39
- We have detected that Gravity Forms is enabled on your site.
40
- We're releasing Gravity Forms compatibility to the GDPR Framework shortly.
41
- <!--
42
- <a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about making your Gravity forms GDPR compliant.</a>
43
- -->
44
- </p>
45
- <hr>
46
- <?php endif; ?>
47
-
48
- <h2>&#10004; Contact Form 7</h2>
49
- <p>
50
- We have detected that Contact Form 7 is enabled on your site. The GDPR Framework is
51
- compatible with Contact Form 7.
52
- </p>
53
- <p>
54
- Each of the forms requires either a <strong>disclaimer</strong> or a <strong>consent checkbox</strong>.
55
- We have created some tools to help you out!
56
- </p>
57
- <p>
58
- <a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about making your Contact Form 7 forms GDPR compliant.</a>
59
- </p>
60
-
61
- <hr>
62
-
63
- <h2>Custom forms</h2>
64
- <p>
65
- <label for="gdpr_has_contact_forms">
66
- <input
67
- type="checkbox"
68
- name="gdpr_has_contact_forms"
69
- id="gdpr_has_contact_forms"
70
- class="js-gdpr-conditional"
71
- data-show=".gdpr-contact-custom"
72
- value="yes"
73
- >
74
- I have custom forms on my website (e.g. contact forms, newsletter signups, lottery signups)
75
- </label>
76
- </p>
77
- <p class="gdpr-contact-custom hidden">
78
- Each of the forms on your site requires either a <strong>disclaimer</strong> or a <strong>consent checkbox</strong>. <br>
79
- We cannot do this automatically - you need to do it yourself or request help from a developer. However, we have created some
80
- tools to help you out!
81
- <br>
82
- <a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about integrating custom forms</a>
83
- </p>
84
-
85
- <hr>
86
- <br>
87
- <input type="submit" class="button button-gdpr button-right" value="Continue &raquo;" />
1
+ <h1>
2
+ Forms and Consent
3
+ </h1>
4
+
5
+ <h2>Introduction</h2>
6
+
7
+ <p>
8
+ GDPR brings very strict rules for gathering and processing personal data. The most important thing to remember is that
9
+ you need to have <strong>legal grounds</strong> for each and every type of data you gather and process. If you are not
10
+ familiar with what this means, we strongly recommend you read this post from the guide: <br>
11
+ <a href="<?= gdpr('helpers')->docs('guide/legal-grounds-for-processing-data/'); ?>" target="_blank">Consent and other legal grounds for processing data</a>
12
+ </p>
13
+
14
+ <p>
15
+ Under GDPR, <strong>all forms</strong> require special attention. You'll need to explain why you gather the data and
16
+ what you do with it. And if there are no other legal grounds, you'll need to ask for consent.
17
+ Note that your customers must also be able to <strong>withdraw</strong> each consent they have given.
18
+ </p>
19
+
20
+ <h2>WordPress forms</h2>
21
+
22
+ <p>
23
+ For <strong>posting comments</strong> and <strong>registering accounts</strong>,
24
+ you will need to ask your customers consent to the Privacy Policy. If your site allows comments or registration,
25
+ the GDPR Framework will automatically add consent checkboxes to the respective forms.
26
+ </p>
27
+
28
+ <h2>Withdrawing consent</h2>
29
+
30
+ <p>
31
+ Your customers can withdraw their given consents on the <a href="<?= $privacyToolsPageUrl; ?>" target="blank">Privacy Tools Page</a>.
32
+ </p>
33
+ <br>
34
+ <hr>
35
+
36
+ <?php if ($hasGravityForms): ?>
37
+ <h2>&#10004; Gravity Forms</h2>
38
+ <p>
39
+ We have detected that Gravity Forms is enabled on your site.
40
+ We're releasing Gravity Forms compatibility to the GDPR Framework shortly.
41
+ <!--
42
+ <a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about making your Gravity forms GDPR compliant.</a>
43
+ -->
44
+ </p>
45
+ <hr>
46
+ <?php endif; ?>
47
+
48
+ <h2>&#10004; Contact Form 7</h2>
49
+ <p>
50
+ We have detected that Contact Form 7 is enabled on your site. The GDPR Framework is
51
+ compatible with Contact Form 7.
52
+ </p>
53
+ <p>
54
+ Each of the forms requires either a <strong>disclaimer</strong> or a <strong>consent checkbox</strong>.
55
+ We have created some tools to help you out!
56
+ </p>
57
+ <p>
58
+ <a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about making your Contact Form 7 forms GDPR compliant.</a>
59
+ </p>
60
+
61
+ <hr>
62
+
63
+ <h2>Custom forms</h2>
64
+ <p>
65
+ <label for="gdpr_has_contact_forms">
66
+ <input
67
+ type="checkbox"
68
+ name="gdpr_has_contact_forms"
69
+ id="gdpr_has_contact_forms"
70
+ class="js-gdpr-conditional"
71
+ data-show=".gdpr-contact-custom"
72
+ value="yes"
73
+ >
74
+ I have custom forms on my website (e.g. contact forms, newsletter signups, lottery signups)
75
+ </label>
76
+ </p>
77
+ <p class="gdpr-contact-custom hidden">
78
+ Each of the forms on your site requires either a <strong>disclaimer</strong> or a <strong>consent checkbox</strong>. <br>
79
+ We cannot do this automatically - you need to do it yourself or request help from a developer. However, we have created some
80
+ tools to help you out!
81
+ <br>
82
+ <a href="<?= gdpr('helpers')->docs('guide/making-your-forms-compliant/'); ?>" target="_blank">Read about integrating custom forms</a>
83
+ </p>
84
+
85
+ <hr>
86
+ <br>
87
+ <input type="submit" class="button button-gdpr button-right" value="Continue &raquo;" />
views/installer/steps/disclaimer.php CHANGED
@@ -1,21 +1,21 @@
1
- <h2>
2
- Very Important Legal Stuff!
3
- </h2>
4
- <hr>
5
- <p class="gdpr-disclaimer">
6
- <strong>Disclaimer</strong><br>
7
- Using The GDPR Framework does NOT guarantee compliance to GDPR.
8
- By using this plugin, you agree to this disclaimer.
9
- These templates and guides provided to you are drafted by legal professionals in order for you to understand your obligations better,
10
- but they are NOT meant to constitute client-attorney relationship or personalized legal advice.
11
- Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
12
- We expressly disclaim all liability in respect of usage of this plugin.
13
- This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package.
14
- For compliance audit or further help <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">contact legal professionals</a>.
15
- As each business and situation is unique, you might need to modify, add or delete information in these templates.
16
- In addition to this, you will need audit all your processing activities for achieving compliance to GDPR.
17
- Compliance to GDPR is risk based ongoing process.
18
- We are here to get you started.
19
- </p>
20
- <hr>
21
- <input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="<?= _x('I accept', '(Admin)', 'gdpr-framework'); ?>" />
1
+ <h2>
2
+ Very Important Legal Stuff!
3
+ </h2>
4
+ <hr>
5
+ <p class="gdpr-disclaimer">
6
+ <strong>Disclaimer</strong><br>
7
+ Using The GDPR Framework does NOT guarantee compliance to GDPR.
8
+ By using this plugin, you agree to this disclaimer.
9
+ These templates and guides provided to you are drafted by legal professionals in order for you to understand your obligations better,
10
+ but they are NOT meant to constitute client-attorney relationship or personalized legal advice.
11
+ Codelight is not eligible for any claim or action based on any information or functionality provided by this plugin.
12
+ We expressly disclaim all liability in respect of usage of this plugin.
13
+ This plugin gives you general information and tools, but is NOT meant to serve as complete compliance package.
14
+ For compliance audit or further help <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">contact legal professionals</a>.
15
+ As each business and situation is unique, you might need to modify, add or delete information in these templates.
16
+ In addition to this, you will need audit all your processing activities for achieving compliance to GDPR.
17
+ Compliance to GDPR is risk based ongoing process.
18
+ We are here to get you started.
19
+ </p>
20
+ <hr>
21
+ <input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="<?= _x('I accept', '(Admin)', 'gdpr-framework'); ?>" />
views/installer/steps/finish.php CHANGED
@@ -1,69 +1,69 @@
1
- <h2 class="align-center">
2
- All done!
3
- </h2>
4
- <p class="align-center">
5
- Congrats! You've just taken a huge step towards GDPR compliance!
6
- </p>
7
-
8
- <section class="section">
9
- <h3 class="align-center">
10
- <?= _x('Need more info?', '(Admin)', 'gdpr-framework'); ?>
11
- </h3>
12
- <div class="row">
13
- <div class="col">
14
- <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/1.png');"></div>
15
- <a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">
16
- <?= _x('Site Owner\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
17
- </a>
18
- <p>
19
- <?= _x('Read the full guide on GDPR compliance.', '(Admin)', 'gdpr-framework'); ?>
20
- </p>
21
- </div>
22
- <div class="col">
23
- <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/2.png');"></div>
24
- <a class="button button-primary" href="<?= gdpr('helpers')->docs('knowledge-base'); ?>" target="_blank">
25
- <?= _x('Knowledge base', '(Admin)', 'gdpr-framework'); ?>
26
- </a>
27
- <p>
28
- <?= _x('Check out the knowledge base for common questions and answers.', '(Admin)', 'gdpr-framework'); ?>
29
- </p>
30
- </div>
31
- <div class="col">
32
- <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/3.png');"></div>
33
- <a class="button button-primary" href="<?= gdpr('helpers')->docs('developer-docs'); ?>" target="_blank">
34
- <?= _x('Developer\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
35
- </a>
36
- <p>
37
- <?= _x('We have a thorough guide to help making custom sites compliant.', '(Admin)', 'gdpr-framework'); ?>
38
- </p>
39
- </div>
40
- </div>
41
- </section>
42
-
43
- <section class="section">
44
- <h3 class="align-center">
45
- <?= _x('Need help?', '(Admin)', 'gdpr-framework'); ?>
46
- </h3>
47
- <div class="row">
48
- <div class="col">
49
- <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/4.png');"></div>
50
- <a class="button button-primary" href="https://wordpress.org/support/plugin/gdpr-framework" target="_blank">
51
- <?= _x('Submit a support request', '(Admin)', 'gdpr-framework'); ?>
52
- </a>
53
- <p>
54
- <?= _x('Found a bug or problem with the plugin? Post in the wordpress.org support forum.', '(Admin)', 'gdpr-framework'); ?>
55
- </p>
56
- </div>
57
- <div class="col">
58
- <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/5.png');"></div>
59
- <a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">
60
- <?= _x('Request a consultation', '(Admin)', 'gdpr-framework'); ?>
61
- </a>
62
- <p>
63
- <?= _x('Need development or legal assistance in making your site compliant? We can help!', '(Admin)', 'gdpr-framework'); ?>
64
- </p>
65
- </div>
66
- </div>
67
- </section>
68
-
69
- <input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="Back to dashboard"" />
1
+ <h2 class="align-center">
2
+ All done!
3
+ </h2>
4
+ <p class="align-center">
5
+ Congrats! You've just taken a huge step towards GDPR compliance!
6
+ </p>
7
+
8
+ <section class="section">
9
+ <h3 class="align-center">
10
+ <?= _x('Need more info?', '(Admin)', 'gdpr-framework'); ?>
11
+ </h3>
12
+ <div class="row">
13
+ <div class="col">
14
+ <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/1.png');"></div>
15
+ <a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">
16
+ <?= _x('Site Owner\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
17
+ </a>
18
+ <p>
19
+ <?= _x('Read the full guide on GDPR compliance.', '(Admin)', 'gdpr-framework'); ?>
20
+ </p>
21
+ </div>
22
+ <div class="col">
23
+ <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/2.png');"></div>
24
+ <a class="button button-primary" href="<?= gdpr('helpers')->docs('knowledge-base'); ?>" target="_blank">
25
+ <?= _x('Knowledge base', '(Admin)', 'gdpr-framework'); ?>
26
+ </a>
27
+ <p>
28
+ <?= _x('Check out the knowledge base for common questions and answers.', '(Admin)', 'gdpr-framework'); ?>
29
+ </p>
30
+ </div>
31
+ <div class="col">
32
+ <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/3.png');"></div>
33
+ <a class="button button-primary" href="<?= gdpr('helpers')->docs('developer-docs'); ?>" target="_blank">
34
+ <?= _x('Developer\'s guide to GDPR', '(Admin)', 'gdpr-framework'); ?>
35
+ </a>
36
+ <p>
37
+ <?= _x('We have a thorough guide to help making custom sites compliant.', '(Admin)', 'gdpr-framework'); ?>
38
+ </p>
39
+ </div>
40
+ </div>
41
+ </section>
42
+
43
+ <section class="section">
44
+ <h3 class="align-center">
45
+ <?= _x('Need help?', '(Admin)', 'gdpr-framework'); ?>
46
+ </h3>
47
+ <div class="row">
48
+ <div class="col">
49
+ <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/4.png');"></div>
50
+ <a class="button button-primary" href="https://wordpress.org/support/plugin/gdpr-framework" target="_blank">
51
+ <?= _x('Submit a support request', '(Admin)', 'gdpr-framework'); ?>
52
+ </a>
53
+ <p>
54
+ <?= _x('Found a bug or problem with the plugin? Post in the wordpress.org support forum.', '(Admin)', 'gdpr-framework'); ?>
55
+ </p>
56
+ </div>
57
+ <div class="col">
58
+ <div class="col_image" style="background-image:url('<?= gdpr('config')->get('plugin.url'); ?>/assets/5.png');"></div>
59
+ <a class="button button-primary" href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">
60
+ <?= _x('Request a consultation', '(Admin)', 'gdpr-framework'); ?>
61
+ </a>
62
+ <p>
63
+ <?= _x('Need development or legal assistance in making your site compliant? We can help!', '(Admin)', 'gdpr-framework'); ?>
64
+ </p>
65
+ </div>
66
+ </div>
67
+ </section>
68
+
69
+ <input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="Back to dashboard"" />
views/installer/steps/integrations.php CHANGED
@@ -1,52 +1,52 @@
1
- <h1>
2
- Integrations
3
- </h1>
4
-
5
- <h2>Theme compatibility</h2>
6
- <p>
7
- The links to Privacy Policy and Privacy Tools should be visible somewhere on your site.
8
- A good place would be your site's footer.
9
- </p>
10
- <?php if ($isThemeSupported): ?>
11
- <p>
12
- We have detected that you are running <strong><?= esc_html(ucfirst($currentTheme)); ?> theme</strong>. We can automatically add the links to your site's footer if you'd like.
13
- <label for="gdpr_enable_theme_compatibility">
14
- <input
15
- type="checkbox"
16
- id="gdpr_enable_theme_compatibility"
17
- name="gdpr_enable_theme_compatibility"
18
- value="yes"
19
- <?= checked($enableThemeCompatibility, true); ?>
20
- />
21
- <?= _x('Automatically add Privacy Policy and Privacy Tools links to your site footer.', '(Admin)', 'gdpr-framework'); ?>
22
- </label>
23
- </p>
24
- <?php endif; ?>
25
- <hr>
26
-
27
- <?php if ($hasWooCommerce): ?>
28
- <h2>WooCommerce compatibility</h2>
29
- <p>
30
- TBD
31
- </p>
32
- <hr>
33
- <?php endif; ?>
34
-
35
- <?php if ($hasEDD): ?>
36
- <h2>Easy Digital Downloads compatibility</h2>
37
- <p>
38
- TBD
39
- </p>
40
- <hr>
41
- <?php endif; ?>
42
-
43
- <h2>Custom development</h2>
44
- <p>
45
- If you've had a developer build any custom features for your site, you should also make sure that everything is properly GDPR-compliant.
46
- <br>
47
- <a href="<?= gdpr('helpers')->docs('developer-docs/'); ?>" target="_blank">Read about making custom-built sites and features GDPR-compliant.</a>
48
- </p>
49
-
50
- <hr>
51
- <br>
52
- <input type="submit" class="button button-gdpr button-right" value="Continue &raquo;" />
1
+ <h1>
2
+ Integrations
3
+ </h1>
4
+
5
+ <h2>Theme compatibility</h2>
6
+ <p>
7
+ The links to Privacy Policy and Privacy Tools should be visible somewhere on your site.
8
+ A good place would be your site's footer.
9
+ </p>
10
+ <?php if ($isThemeSupported): ?>
11
+ <p>
12
+ We have detected that you are running <strong><?= esc_html(ucfirst($currentTheme)); ?> theme</strong>. We can automatically add the links to your site's footer if you'd like.
13
+ <label for="gdpr_enable_theme_compatibility">
14
+ <input
15
+ type="checkbox"
16
+ id="gdpr_enable_theme_compatibility"
17
+ name="gdpr_enable_theme_compatibility"
18
+ value="yes"
19
+ <?= checked($enableThemeCompatibility, true); ?>
20
+ />
21
+ <?= _x('Automatically add Privacy Policy and Privacy Tools links to your site footer.', '(Admin)', 'gdpr-framework'); ?>
22
+ </label>
23
+ </p>
24
+ <?php endif; ?>
25
+ <hr>
26
+
27
+ <?php if ($hasWooCommerce): ?>
28
+ <h2>WooCommerce compatibility</h2>
29
+ <p>
30
+ TBD
31
+ </p>
32
+ <hr>
33
+ <?php endif; ?>
34
+
35
+ <?php if ($hasEDD): ?>
36
+ <h2>Easy Digital Downloads compatibility</h2>
37
+ <p>
38
+ TBD
39
+ </p>
40
+ <hr>
41
+ <?php endif; ?>
42
+
43
+ <h2>Custom development</h2>
44
+ <p>
45
+ If you've had a developer build any custom features for your site, you should also make sure that everything is properly GDPR-compliant.
46
+ <br>
47
+ <a href="<?= gdpr('helpers')->docs('developer-docs/'); ?>" target="_blank">Read about making custom-built sites and features GDPR-compliant.</a>
48
+ </p>
49
+
50
+ <hr>
51
+ <br>
52
+ <input type="submit" class="button button-gdpr button-right" value="Continue &raquo;" />
views/installer/steps/policy-contents.php CHANGED
@@ -1,25 +1,25 @@
1
- <h1>
2
- Privacy Policy (2/2)
3
- </h1>
4
-
5
- <h2>&#10004; Privacy Policy configured!</h2>
6
- <?php if ($policyGenerated): ?>
7
- <p>
8
- Take a look at your new Privacy Policy page <a href="<?= $policyUrl; ?>" target="_blank">here</a>! <br>
9
- Make sure you read it - you will need to know all this anyway. <br><br>
10
- <strong>Important!</strong><br> The contents of your Privacy Policy depend on what your website (and
11
- business) does exactly. Note that this is just a template. <strong>You will need to modify it to suit your needs</strong>. To do that,
12
- go to the <a href="<?= $editPolicyUrl; ?>" target="_blank">admin Privacy Policy page</a> and just edit the contents of your policy.
13
- </p>
14
- <?php else: ?>
15
- <p>
16
- It looks like you selected an already existing Privacy Policy. <br>
17
- Note that GDPR puts some new requirements on what you need to have in your Privacy Policy. <br>
18
- <a href="<?= gdpr('helpers')->docs('guide/setting-up-the-privacy-policy/'); ?>" target="_blank">Read more about the requirements to your Privacy Policy</a>
19
- </p>
20
- <?php endif; ?>
21
-
22
- <hr>
23
- <br>
24
-
25
- <input type="submit" class="button button-gdpr button-right" value="Save &raquo;" />
1
+ <h1>
2
+ Privacy Policy (2/2)
3
+ </h1>
4
+
5
+ <h2>&#10004; Privacy Policy configured!</h2>
6
+ <?php if ($policyGenerated): ?>
7
+ <p>
8
+ Take a look at your new Privacy Policy page <a href="<?= $policyUrl; ?>" target="_blank">here</a>! <br>
9
+ Make sure you read it - you will need to know all this anyway. <br><br>
10
+ <strong>Important!</strong><br> The contents of your Privacy Policy depend on what your website (and
11
+ business) does exactly. Note that this is just a template. <strong>You will need to modify it to suit your needs</strong>. To do that,
12
+ go to the <a href="<?= $editPolicyUrl; ?>" target="_blank">admin Privacy Policy page</a> and just edit the contents of your policy.
13
+ </p>
14
+ <?php else: ?>
15
+ <p>
16
+ It looks like you selected an already existing Privacy Policy. <br>
17
+ Note that GDPR puts some new requirements on what you need to have in your Privacy Policy. <br>
18
+ <a href="<?= gdpr('helpers')->docs('guide/setting-up-the-privacy-policy/'); ?>" target="_blank">Read more about the requirements to your Privacy Policy</a>
19
+ </p>
20
+ <?php endif; ?>
21
+
22
+ <hr>
23
+ <br>
24
+
25
+ <input type="submit" class="button button-gdpr button-right" value="Save &raquo;" />
views/installer/steps/policy-settings.php CHANGED
@@ -1,185 +1,185 @@
1
- <h1>
2
- Privacy Policy (1/2)
3
- </h1>
4
-
5
- <h2>Privacy Policy page</h2>
6
- <p>
7
- The second major requirement of GDPR is a thorough Privacy Policy that explains all of the rights your customers
8
- have and describes how exactly their data is used. We've put together a GDPR-compliant privacy policy template for you.
9
- Fill in the fields below and a privacy policy will be generated automatically. Note that you will need to modify it later to suit your website and business. <br>
10
- <a href="<?= gdpr('helpers')->docs('guide/setting-up-the-privacy-policy/'); ?>" target="_blank">Read more about the Privacy Policy</a><br><br>
11
- If you already have a GDPR-compliant Privacy Policy, simply select the page where it is displayed and skip the rest.
12
- <br>
13
- </p>
14
-
15
- <fieldset>
16
- <label>
17
- <input type="radio" name="gdpr_create_policy_page" value="yes" class="js-gdpr-conditional" <?php echo !$policyPage ? 'checked': ''; ?>>
18
- Automatically create a new page for Privacy Policy
19
- </label>
20
-
21
- <label>
22
- <input type="radio" name="gdpr_create_policy_page" value="no" class="js-gdpr-conditional" data-show=".gdpr-select-policy-page" <?php echo $policyPage ? 'checked': ''; ?>> I want to use an existing page
23
- </label>
24
- </fieldset>
25
-
26
- <p class="gdpr-select-policy-page hidden">
27
- <label for="gdpr_policy_page">Select the page where your Privacy Policy will be displayed</label>
28
- <?= $policyPageSelector; ?>
29
- </p>
30
-
31
- <p>
32
- We can generate a somewhat personalized Privacy Policy template for you based on some information you can fill in below.
33
- Note that if you're using an existing page, this will overwrite the page contents.
34
-
35
- <label for="gdpr_generate_policy">
36
- <input
37
- type="checkbox"
38
- name="gdpr_generate_policy"
39
- id="gdpr_generate_policy"
40
- class="js-gdpr-conditional"
41
- data-show=".gdpr-generator-fields"
42
- value="yes"
43
- >
44
- Generate Privacy Policy
45
- </label>
46
- <em>Heads up - this will take some time to configure!</em>
47
- </p>
48
-
49
- <hr>
50
-
51
- <div class="gdpr-generator-fields hidden">
52
-
53
- <h2>Company information</h2>
54
- <label for="gdpr_company_name">Company legal name</label>
55
- <input type="text" id="gdpr_company_name" name="gdpr_company_name" value="<?= esc_attr($companyName); ?>"/>
56
- <em>Enter the name of your company. If you are not registered as a company, enter your full name.</em>
57
-
58
- <label for="gdpr_contact_email">Contact email</label>
59
- <input type="email" id="gdpr_contact_email" name="gdpr_contact_email" value="<?= esc_attr($contactEmail); ?>"/>
60
- <em>
61
- Enter the contact email which should be used for GDPR and personal data related inquiries.<br>
62
- This email will be displayed in the Privacy Policy.
63
- </em>
64
-
65
- <hr>
66
-
67
- <h2>Company location</h2>
68
- <label for="gdpr_company_location">Company location</label>
69
- <select id="gdpr_company_location" name="gdpr_company_location" class="js-gdpr-select2 gdpr-select js-gdpr-conditional js-gdpr-country-selector">
70
- <?= $countryOptions; ?>
71
- </select>
72
- <em>
73
- Select the country where your company is registered. <br>
74
- If you are not registered as a company, enter your country of residence.
75
- </em>
76
- <div class="gdpr-representative hidden">
77
- <p>
78
-
79
- If your company is located outside of the EU and the EFTA zone and you do not have a branch inside the EU,
80
- GDPR requires you to appoint a representative contact which has to be a person or company located in the EU.
81
- <a href="<?= gdpr('helpers')->docs('knowledge-base/do-i-need-to-appoint-an-eu-based-representative/'); ?>" target="_blank">Read more about appointing a representative and your options here</a>.
82
- </p>
83
- <p>
84
- If you have a representative contact, enter the contact details below.
85
-
86
- <label for="gdpr_representative_contact_name">Representative contact name</label>
87
- <input type="text" value="<?= esc_attr($representativeContactName); ?>" id="gdpr_representative_contact_name" name="gdpr_representative_contact_name" data />
88
-
89
- <label for="gdpr_representative_contact_email">Representative contact email</label>
90
- <input type="email" value="<?= esc_attr($representativeContactEmail); ?>" id="gdpr_representative_contact_email" name="gdpr_representative_contact_email" />
91
-
92
- <label for="gdpr_representative_contact_phone">Representative contact phone</label>
93
- <input type="text" value="<?= esc_attr($representativeContactPhone); ?>" id="gdpr_representative_contact_phone" name="gdpr_representative_contact_phone" />
94
-
95
- </p>
96
- </div>
97
- <br>
98
- <hr>
99
-
100
- <h2>Data Protection Authority</h2>
101
- <p>
102
- You are also obliged to provide the contact of your local supervisory authority.
103
-
104
- <span class="gdpr-representative hidden">
105
- <br><br>
106
- You are located outside of the EU. This means that you must designate an EU country's data protection authority to be your supervisory authority.
107
- Choose the Data Protection Authority of the country where most of your target audience resides. See the <a href="http://ec.europa.eu/justice/data-protection/article-29/structure/data-protection-authorities/index_en.htm" target="_blank">list of contacts here</a>.
108
- </span>
109
-
110
- <label for="gdpr_dpa_website">Data Protection Authority website</label>
111
- <input type="text" value="<?= esc_attr($dpaWebsite); ?>" id="gdpr_dpa_website" name="gdpr_dpa_website" data-set="<?= esc_attr($dpaWebsite); ?>" />
112
-
113
- <label for="gdpr_dpa_email">Data Protection Authority email</label>
114
- <input type="email" value="<?= esc_attr($dpaEmail); ?>" id="gdpr_dpa_email" name="gdpr_dpa_email" data-set="<?= esc_attr($dpaEmail); ?>" />
115
-
116
- <label for="gdpr_dpa_phone">Data Protection Authority phone</label>
117
- <input type="text" value="<?= esc_attr($dpaPhone); ?>" id="gdpr_dpa_phone" name="gdpr_dpa_phone" data-set="<?= esc_attr($dpaPhone); ?>" />
118
- </p>
119
- <script>
120
- window.gdprDpaData = <?= $dpaData; ?>;
121
- </script>
122
-
123
- <h2>Data Protection Officer</h2>
124
- <p>
125
- Under some circumstances, GDPR requires you to appoint a Data Protection Officer and display the contacts
126
- in your Privacy Policy. If you don't know whether or not you need a DPO, read this article: <a href="<?= gdpr('helpers')->docs('knowledge-base/do-i-need-to-appoint-data-protection-officer-dpo/'); ?>" target="_blank">Do I need a Data Protection Officer?</a>
127
-
128
- <label for="gdpr_has_dpo">
129
- <input
130
- type="checkbox"
131
- name="gdpr_has_dpo"
132
- id="gdpr_has_dpo"
133
- class="js-gdpr-conditional"
134
- data-show=".gdpr-dpo"
135
- value="yes"
136
- <?= checked($hasDPO, 'yes'); ?>
137
- >
138
- I have appointed a Data Protection Officer (DPO)
139
- </label>
140
- </p>
141
- <p class="gdpr-dpo hidden">
142
- <label for="gdpr_dpo_name">Data Protection Officer name</label>
143
- <input type="text" id="gdpr_dpo_name" name="gdpr_dpo_name" value="<?= esc_attr($dpoName); ?>"/>
144
- <em>This will be displayed in the Privacy Policy.</em>
145
-
146
- <label for="gdpr_dpo_email">Data Protection Officer email</label>
147
- <input type="email" id="gdpr_dpo_email" name="gdpr_dpo_email" value="<?= esc_attr($dpoEmail); ?>"/>
148
- <em>This will be displayed in the Privacy Policy.</em>
149
- </p>
150
- <hr>
151
- </div>
152
-
153
- <h2>Terms & Conditions page</h2>
154
- <p>
155
- If you have a Terms & Conditions page, we will need to know where it is located. If you don't have a Terms & Conditions page, you can safely skip this step.<br>
156
- If you are unsure if you need a T&C page, read this article:
157
- <a href="<?= gdpr('helpers')->supportUrl('knowledge-base/do-i-need-a-terms-conditions-page/') ?>" target="_blank">Do I need a Terms & Conditions page?</a>
158
-
159
- <label for="gdpr_has_terms_page">
160
- <input
161
- type="checkbox"
162
- name="gdpr_has_terms_page"
163
- id="gdpr_has_terms_page"
164
- class="js-gdpr-conditional"
165
- data-show=".gdpr-terms-page"
166
- value="yes"
167
- <?= checked($hasTermsPage, 'yes'); ?>
168
- >
169
- I have a Terms & Conditions page
170
- </label>
171
- </p>
172
- <p>
173
- <span class="gdpr-terms-page hidden">
174
- <label for="gdpr_terms_page">Select the page where your Terms & Conditions are displayed</label>
175
- <?php if ($termsPageNote): ?>
176
- <em><?= esc_html($termsPageNote); ?></em>
177
- <?php endif; ?>
178
- <?= $termsPageSelector; ?>
179
- <br>
180
- </span>
181
- </p>
182
-
183
- <hr>
184
- <br>
185
- <input type="submit" class="button button-gdpr button-right" value="Save &raquo;" />
1
+ <h1>
2
+ Privacy Policy (1/2)
3
+ </h1>
4
+
5
+ <h2>Privacy Policy page</h2>
6
+ <p>
7
+ The second major requirement of GDPR is a thorough Privacy Policy that explains all of the rights your customers
8
+ have and describes how exactly their data is used. We've put together a GDPR-compliant privacy policy template for you.
9
+ Fill in the fields below and a privacy policy will be generated automatically. Note that you will need to modify it later to suit your website and business. <br>
10
+ <a href="<?= gdpr('helpers')->docs('guide/setting-up-the-privacy-policy/'); ?>" target="_blank">Read more about the Privacy Policy</a><br><br>
11
+ If you already have a GDPR-compliant Privacy Policy, simply select the page where it is displayed and skip the rest.
12
+ <br>
13
+ </p>
14
+
15
+ <fieldset>
16
+ <label>
17
+ <input type="radio" name="gdpr_create_policy_page" value="yes" class="js-gdpr-conditional" <?php echo !$policyPage ? 'checked': ''; ?>>
18
+ Automatically create a new page for Privacy Policy
19
+ </label>
20
+
21
+ <label>
22
+ <input type="radio" name="gdpr_create_policy_page" value="no" class="js-gdpr-conditional" data-show=".gdpr-select-policy-page" <?php echo $policyPage ? 'checked': ''; ?>> I want to use an existing page
23
+ </label>
24
+ </fieldset>
25
+
26
+ <p class="gdpr-select-policy-page hidden">
27
+ <label for="gdpr_policy_page">Select the page where your Privacy Policy will be displayed</label>
28
+ <?= $policyPageSelector; ?>
29
+ </p>
30
+
31
+ <p>
32
+ We can generate a somewhat personalized Privacy Policy template for you based on some information you can fill in below.
33
+ Note that if you're using an existing page, this will overwrite the page contents.
34
+
35
+ <label for="gdpr_generate_policy">
36
+ <input
37
+ type="checkbox"
38
+ name="gdpr_generate_policy"
39
+ id="gdpr_generate_policy"
40
+ class="js-gdpr-conditional"
41
+ data-show=".gdpr-generator-fields"
42
+ value="yes"
43
+ >
44
+ Generate Privacy Policy
45
+ </label>
46
+ <em>Heads up - this will take some time to configure!</em>
47
+ </p>
48
+
49
+ <hr>
50
+
51
+ <div class="gdpr-generator-fields hidden">
52
+
53
+ <h2>Company information</h2>
54
+ <label for="gdpr_company_name">Company legal name</label>
55
+ <input type="text" id="gdpr_company_name" name="gdpr_company_name" value="<?= esc_attr($companyName); ?>"/>
56
+ <em>Enter the name of your company. If you are not registered as a company, enter your full name.</em>
57
+
58
+ <label for="gdpr_contact_email">Contact email</label>
59
+ <input type="email" id="gdpr_contact_email" name="gdpr_contact_email" value="<?= esc_attr($contactEmail); ?>"/>
60
+ <em>
61
+ Enter the contact email which should be used for GDPR and personal data related inquiries.<br>
62
+ This email will be displayed in the Privacy Policy.
63
+ </em>
64
+
65
+ <hr>
66
+
67
+ <h2>Company location</h2>
68
+ <label for="gdpr_company_location">Company location</label>
69
+ <select id="gdpr_company_location" name="gdpr_company_location" class="js-gdpr-select2 gdpr-select js-gdpr-conditional js-gdpr-country-selector">
70
+ <?= $countryOptions; ?>
71
+ </select>
72
+ <em>
73
+ Select the country where your company is registered. <br>
74
+ If you are not registered as a company, enter your country of residence.
75
+ </em>
76
+ <div class="gdpr-representative hidden">
77
+ <p>
78
+
79
+ If your company is located outside of the EU and the EFTA zone and you do not have a branch inside the EU,
80
+ GDPR requires you to appoint a representative contact which has to be a person or company located in the EU.
81
+ <a href="<?= gdpr('helpers')->docs('knowledge-base/do-i-need-to-appoint-an-eu-based-representative/'); ?>" target="_blank">Read more about appointing a representative and your options here</a>.
82
+ </p>
83
+ <p>
84
+ If you have a representative contact, enter the contact details below.
85
+
86
+ <label for="gdpr_representative_contact_name">Representative contact name</label>
87
+ <input type="text" value="<?= esc_attr($representativeContactName); ?>" id="gdpr_representative_contact_name" name="gdpr_representative_contact_name" data />
88
+
89
+ <label for="gdpr_representative_contact_email">Representative contact email</label>
90
+ <input type="email" value="<?= esc_attr($representativeContactEmail); ?>" id="gdpr_representative_contact_email" name="gdpr_representative_contact_email" />
91
+
92
+ <label for="gdpr_representative_contact_phone">Representative contact phone</label>
93
+ <input type="text" value="<?= esc_attr($representativeContactPhone); ?>" id="gdpr_representative_contact_phone" name="gdpr_representative_contact_phone" />
94
+
95
+ </p>
96
+ </div>
97
+ <br>
98
+ <hr>
99
+
100
+ <h2>Data Protection Authority</h2>
101
+ <p>
102
+ You are also obliged to provide the contact of your local supervisory authority.
103
+
104
+ <span class="gdpr-representative hidden">
105
+ <br><br>
106
+ You are located outside of the EU. This means that you must designate an EU country's data protection authority to be your supervisory authority.
107
+ Choose the Data Protection Authority of the country where most of your target audience resides. See the <a href="http://ec.europa.eu/justice/data-protection/article-29/structure/data-protection-authorities/index_en.htm" target="_blank">list of contacts here</a>.
108
+ </span>
109
+
110
+ <label for="gdpr_dpa_website">Data Protection Authority website</label>
111
+ <input type="text" value="<?= esc_attr($dpaWebsite); ?>" id="gdpr_dpa_website" name="gdpr_dpa_website" data-set="<?= esc_attr($dpaWebsite); ?>" />
112
+
113
+ <label for="gdpr_dpa_email">Data Protection Authority email</label>
114
+ <input type="email" value="<?= esc_attr($dpaEmail); ?>" id="gdpr_dpa_email" name="gdpr_dpa_email" data-set="<?= esc_attr($dpaEmail); ?>" />
115
+
116
+ <label for="gdpr_dpa_phone">Data Protection Authority phone</label>
117
+ <input type="text" value="<?= esc_attr($dpaPhone); ?>" id="gdpr_dpa_phone" name="gdpr_dpa_phone" data-set="<?= esc_attr($dpaPhone); ?>" />
118
+ </p>
119
+ <script>
120
+ window.gdprDpaData = <?= $dpaData; ?>;
121
+ </script>
122
+
123
+ <h2>Data Protection Officer</h2>
124
+ <p>
125
+ Under some circumstances, GDPR requires you to appoint a Data Protection Officer and display the contacts
126
+ in your Privacy Policy. If you don't know whether or not you need a DPO, read this article: <a href="<?= gdpr('helpers')->docs('knowledge-base/do-i-need-to-appoint-data-protection-officer-dpo/'); ?>" target="_blank">Do I need a Data Protection Officer?</a>
127
+
128
+ <label for="gdpr_has_dpo">
129
+ <input
130
+ type="checkbox"
131
+ name="gdpr_has_dpo"
132
+ id="gdpr_has_dpo"
133
+ class="js-gdpr-conditional"
134
+ data-show=".gdpr-dpo"
135
+ value="yes"
136
+ <?= checked($hasDPO, 'yes'); ?>
137
+ >
138
+ I have appointed a Data Protection Officer (DPO)
139
+ </label>
140
+ </p>
141
+ <p class="gdpr-dpo hidden">
142
+ <label for="gdpr_dpo_name">Data Protection Officer name</label>
143
+ <input type="text" id="gdpr_dpo_name" name="gdpr_dpo_name" value="<?= esc_attr($dpoName); ?>"/>
144
+ <em>This will be displayed in the Privacy Policy.</em>
145
+
146
+ <label for="gdpr_dpo_email">Data Protection Officer email</label>
147
+ <input type="email" id="gdpr_dpo_email" name="gdpr_dpo_email" value="<?= esc_attr($dpoEmail); ?>"/>
148
+ <em>This will be displayed in the Privacy Policy.</em>
149
+ </p>
150
+ <hr>
151
+ </div>
152
+
153
+ <h2>Terms & Conditions page</h2>
154
+ <p>
155
+ If you have a Terms & Conditions page, we will need to know where it is located. If you don't have a Terms & Conditions page, you can safely skip this step.<br>
156
+ If you are unsure if you need a T&C page, read this article:
157
+ <a href="<?= gdpr('helpers')->supportUrl('knowledge-base/do-i-need-a-terms-conditions-page/') ?>" target="_blank">Do I need a Terms & Conditions page?</a>
158
+
159
+ <label for="gdpr_has_terms_page">
160
+ <input
161
+ type="checkbox"
162
+ name="gdpr_has_terms_page"
163
+ id="gdpr_has_terms_page"
164
+ class="js-gdpr-conditional"
165
+ data-show=".gdpr-terms-page"
166
+ value="yes"
167
+ <?= checked($hasTermsPage, 'yes'); ?>
168
+ >
169
+ I have a Terms & Conditions page
170
+ </label>
171
+ </p>
172
+ <p>
173
+ <span class="gdpr-terms-page hidden">
174
+ <label for="gdpr_terms_page">Select the page where your Terms & Conditions are displayed</label>
175
+ <?php if ($termsPageNote): ?>
176
+ <em><?= esc_html($termsPageNote); ?></em>
177
+ <?php endif; ?>
178
+ <?= $termsPageSelector; ?>
179
+ <br>
180
+ </span>
181
+ </p>
182
+
183
+ <hr>
184
+ <br>
185
+ <input type="submit" class="button button-gdpr button-right" value="Save &raquo;" />
views/installer/steps/welcome.php CHANGED
@@ -1,18 +1,18 @@
1
- <h2>
2
- Welcome!
3
- </h2>
4
- <p>
5
- <strong>The GDPR setup wizard will guide you through the legal and technical requirements for your site.</strong><br>
6
- <br>
7
- We have made this process as easy, fast and painless as possible for you. <br>
8
- However, you should take some time to read and understand everything. Making your website (and business) properly compliant
9
- requires understanding GDPR and how your website works. <br>
10
- If you don't have the time to do that, you can always <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">request a consultation</a>.
11
- </p>
12
- <p>
13
- The <a href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">WordPress Site Owner's Guide to GDPR</a> will help you with any questions you might have during the
14
- setup process.
15
- </p>
16
- <hr>
17
- <p>Ready? Let's get this done!</p>
18
- <input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="Get started" />
1
+ <h2>
2
+ Welcome!
3
+ </h2>
4
+ <p>
5
+ <strong>The GDPR setup wizard will guide you through the legal and technical requirements for your site.</strong><br>
6
+ <br>
7
+ We have made this process as easy, fast and painless as possible for you. <br>
8
+ However, you should take some time to read and understand everything. Making your website (and business) properly compliant
9
+ requires understanding GDPR and how your website works. <br>
10
+ If you don't have the time to do that, you can always <a href="<?= gdpr('helpers')->docs('wordpress-gdpr-consultation'); ?>" target="_blank">request a consultation</a>.
11
+ </p>
12
+ <p>
13
+ The <a href="<?= gdpr('helpers')->docs('wordpress-site-owners-guide-to-gdpr/'); ?>" target="_blank">WordPress Site Owner's Guide to GDPR</a> will help you with any questions you might have during the
14
+ setup process.
15
+ </p>
16
+ <hr>
17
+ <p>Ready? Let's get this done!</p>
18
+ <input type="submit" class="button button-gdpr button-large button-gdpr-large button-center" value="Get started" />
views/installer/welcome-notice.php CHANGED
@@ -1,16 +1,16 @@
1
- <p>
2
- The GDPR Framework has not been set up yet. Would you like to do that? <br>
3
- Our setup wizard will guide you through the process.
4
- </p>
5
-
6
- <a class="button button-primary" href="<?= $installerUrl; ?>">
7
- <?= _x('Run the setup wizard', '(Admin)', 'gdpr-framework'); ?>
8
- </a>
9
-
10
- <a class="button button-secondary" href="<?= $autoInstallUrl; ?>">
11
- <?= _x('Auto-install pages', '(Admin)', 'gdpr-framework'); ?>
12
- </a>
13
-
14
- <a class="button button-secondary" href="<?= $skipUrl; ?>">
15
- <?= _x('Skip and install manually', '(Admin)', 'gdpr-framework'); ?>
16
- </a>
1
+ <p>
2
+ The GDPR Framework has not been set up yet. Would you like to do that? <br>
3
+ Our setup wizard will guide you through the process.
4
+ </p>
5
+
6
+ <a class="button button-primary" href="<?= $installerUrl; ?>">
7
+ <?= _x('Run the setup wizard', '(Admin)', 'gdpr-framework'); ?>
8
+ </a>
9
+
10
+ <a class="button button-secondary" href="<?= $autoInstallUrl; ?>">
11
+ <?= _x('Auto-install pages', '(Admin)', 'gdpr-framework'); ?>
12
+ </a>
13
+
14
+ <a class="button button-secondary" href="<?= $skipUrl; ?>">
15
+ <?= _x('Skip and install manually', '(Admin)', 'gdpr-framework'); ?>
16
+ </a>
views/modules/contact-form-7/content-privacy.php CHANGED
@@ -1,5 +1,5 @@
1
- <?= sprintf(
2
- __('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
3
- "<a href='{$privacyPolicyUrl}' target='_blank'>",
4
- '</a>'
5
- ); ?>
1
+ <?= sprintf(
2
+ __('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
3
+ "<a href='{$privacyPolicyUrl}' target='_blank'>",
4
+ '</a>'
5
+ ); ?>
views/modules/contact-form-7/generator-privacy.php CHANGED
@@ -1,17 +1,17 @@
1
- <div class="control-box">
2
- <fieldset>
3
- <legend><?php echo sprintf(esc_html($description), $descLink); ?></legend>
4
- </fieldset>
5
- <p>
6
- <?= _x('This tag generates the default text for Terms & Conditions and/or Privacy Policy checkbox.', '(Admin)', 'gdpr-framework'); ?> <br/>
7
- </p>
8
- </div>
9
-
10
- <div class="insert-box">
11
- <input type="text" name="asdf" class="tag code" readonly="readonly" onfocus="this.select()"/>
12
-
13
- <div class="submitbox">
14
- <input type="button" class="button button-primary insert-tag"
15
- value="<?php echo esc_attr(__('Insert', 'contact-form-7')); ?>"/>
16
- </div>
17
- </div>
1
+ <div class="control-box">
2
+ <fieldset>
3
+ <legend><?php echo sprintf(esc_html($description), $descLink); ?></legend>
4
+ </fieldset>
5
+ <p>
6
+ <?= _x('This tag generates the default text for Terms & Conditions and/or Privacy Policy checkbox.', '(Admin)', 'gdpr-framework'); ?> <br/>
7
+ </p>
8
+ </div>
9
+
10
+ <div class="insert-box">
11
+ <input type="text" name="asdf" class="tag code" readonly="readonly" onfocus="this.select()"/>
12
+
13
+ <div class="submitbox">
14
+ <input type="button" class="button button-primary insert-tag"
15
+ value="<?php echo esc_attr(__('Insert', 'contact-form-7')); ?>"/>
16
+ </div>
17
+ </div>
views/modules/wordpress-comments/terms-checkbox.php CHANGED
@@ -1,20 +1,20 @@
1
- <p class="gdpr-terms-container">
2
- <label>
3
- <input type="checkbox" name="gdpr_terms" id="gdpr_terms" value="1" required/>
4
- <?php if ($termsUrl): ?>
5
- <?= sprintf(
6
- __('I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s', 'gdpr-framework'),
7
- "<a href='{$termsUrl}' target='_blank'>",
8
- '</a>',
9
- "<a href='{$privacyPolicyUrl}' target='_blank'>",
10
- '</a>'
11
- ); ?>
12
- <?php else: ?>
13
- <?= sprintf(
14
- __('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
15
- "<a href='{$privacyPolicyUrl}' target='_blank'>",
16
- '</a>'
17
- ); ?>
18
- <?php endif; ?>*
19
- </label>
20
- </p>
1
+ <p class="gdpr-terms-container">
2
+ <label>
3
+ <input type="checkbox" name="gdpr_terms" id="gdpr_terms" value="1" required/>
4
+ <?php if ($termsUrl): ?>
5
+ <?= sprintf(
6
+ __('I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s', 'gdpr-framework'),
7
+ "<a href='{$termsUrl}' target='_blank'>",
8
+ '</a>',
9
+ "<a href='{$privacyPolicyUrl}' target='_blank'>",
10
+ '</a>'
11
+ ); ?>
12
+ <?php else: ?>
13
+ <?= sprintf(
14
+ __('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
15
+ "<a href='{$privacyPolicyUrl}' target='_blank'>",
16
+ '</a>'
17
+ ); ?>
18
+ <?php endif; ?>*
19
+ </label>
20
+ </p>
views/modules/wordpress-user/dashboard/data-page/form-consent.php CHANGED
@@ -1,39 +1,39 @@
1
- <?php if (count($consentData) or $consentInfo): ?>
2
- <hr>
3
- <h2><?= __('Consent', 'gdpr-framework'); ?></h2>
4
- <?php if (count($consentData)): ?>
5
- <form method="post">
6
- <p><?= __('Here you can withdraw any consents you have given.', 'gdpr-framework'); ?></p>
7
- <table class="gdpr-consent gdpr-consent-user">
8
- <th colspan="3"><?= __('Consents', 'gdpr-framework'); ?></th>
9
- <?php foreach ($consentData as $item): ?>
10
- <tr>
11
- <td>
12
- &#10004;
13
- </td>
14
- <td class="gdpr-consent-user-title">
15
- <?= $item['title']; ?>
16
- </td>
17
- <td class="gdpr-consent-user-desc">
18
- <?= $item['description']; ?>
19
- </td>
20
- <td>
21
- <?php if ('privacy-policy' !== $item['slug']): ?>
22
- <a href="<?= esc_url($item['withdraw_url']); ?>" class="button button-primary">
23
- <?= __('Withdraw', 'gdpr-framework'); ?>
24
- </a>
25
- <?php endif; ?>
26
- </td>
27
- </tr>
28
- <?php endforeach; ?>
29
- </table>
30
- </form>
31
- <?php endif; ?>
32
-
33
- <?php if ($consentInfo): ?>
34
- <p class="gdpr-consent-disclaimer">
35
- <em><?= $consentInfo; ?></em>
36
- </p>
37
- <?php endif; ?>
38
-
39
- <?php endif; ?>
1
+ <?php if (count($consentData) or $consentInfo): ?>
2
+ <hr>
3
+ <h2><?= __('Consent', 'gdpr-framework'); ?></h2>
4
+ <?php if (count($consentData)): ?>
5
+ <form method="post">
6
+ <p><?= __('Here you can withdraw any consents you have given.', 'gdpr-framework'); ?></p>
7
+ <table class="gdpr-consent gdpr-consent-user">
8
+ <th colspan="3"><?= __('Consents', 'gdpr-framework'); ?></th>
9
+ <?php foreach ($consentData as $item): ?>
10
+ <tr>
11
+ <td>
12
+ &#10004;
13
+ </td>
14
+ <td class="gdpr-consent-user-title">
15
+ <?= $item['title']; ?>
16
+ </td>
17
+ <td class="gdpr-consent-user-desc">
18
+ <?= $item['description']; ?>
19
+ </td>
20
+ <td>
21
+ <?php if ('privacy-policy' !== $item['slug']): ?>
22
+ <a href="<?= esc_url($item['withdraw_url']); ?>" class="button button-primary">
23
+ <?= __('Withdraw', 'gdpr-framework'); ?>
24
+ </a>
25
+ <?php endif; ?>
26
+ </td>
27
+ </tr>
28
+ <?php endforeach; ?>
29
+ </table>
30
+ </form>
31
+ <?php endif; ?>
32
+
33
+ <?php if ($consentInfo): ?>
34
+ <p class="gdpr-consent-disclaimer">
35
+ <em><?= $consentInfo; ?></em>
36
+ </p>
37
+ <?php endif; ?>
38
+
39
+ <?php endif; ?>
views/modules/wordpress-user/dashboard/data-page/form-delete.php CHANGED
@@ -1,30 +1,30 @@
1
- <table class="form-table">
2
- <tr>
3
- <th>
4
- <label>
5
- <?= _x('Delete this user and all data', '(Admin)', 'gdpr-framework') ?>
6
- </label>
7
- </th>
8
- <td>
9
- <?php if ($showDelete): ?>
10
- <a class="button" href="<?= esc_url($url); ?>">
11
- <?= _x('Delete my data', '(Admin)', 'gdpr-framework') ?>
12
- </a>
13
- <br/>
14
- <p class="description">
15
- <?= __('Delete all data we have gathered about you.', 'gdpr-framework') ?> <br/>
16
- <?= __('If you have a user account on our site, it will also be deleted.', 'gdpr-framework') ?> <br/>
17
- <?= __('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
18
- </p>
19
- <?php else: ?>
20
- <p>
21
- <em>
22
- <?= _x('You seem to have an administrator or equivalent role, so deleting/anonymizing via this page is disabled.', '(Admin)', 'gdpr-framework'); ?>
23
- </em>
24
- </p>
25
- <?php endif; ?>
26
- </td>
27
- </tr>
28
- </table>
29
-
30
-
1
+ <table class="form-table">
2
+ <tr>
3
+ <th>
4
+ <label>
5
+ <?= _x('Delete this user and all data', '(Admin)', 'gdpr-framework') ?>
6
+ </label>
7
+ </th>
8
+ <td>
9
+ <?php if ($showDelete): ?>
10
+ <a class="button" href="<?= esc_url($url); ?>">
11
+ <?= _x('Delete my data', '(Admin)', 'gdpr-framework') ?>
12
+ </a>
13
+ <br/>
14
+ <p class="description">
15
+ <?= __('Delete all data we have gathered about you.', 'gdpr-framework') ?> <br/>
16
+ <?= __('If you have a user account on our site, it will also be deleted.', 'gdpr-framework') ?> <br/>
17
+ <?= __('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
18
+ </p>
19
+ <?php else: ?>
20
+ <p>
21
+ <em>
22
+ <?= _x('You seem to have an administrator or equivalent role, so deleting/anonymizing via this page is disabled.', '(Admin)', 'gdpr-framework'); ?>
23
+ </em>
24
+ </p>
25
+ <?php endif; ?>
26
+ </td>
27
+ </tr>
28
+ </table>
29
+
30
+
views/modules/wordpress-user/dashboard/data-page/header.php CHANGED
@@ -1,3 +1,3 @@
1
- <h2>
2
- <?= _x('Privacy Tools', '(Admin)', 'gdpr-framework'); ?>
3
- </h2>
1
+ <h2>
2
+ <?= _x('Privacy Tools', '(Admin)', 'gdpr-framework'); ?>
3
+ </h2>
views/modules/wordpress-user/dashboard/form-export.php CHANGED
@@ -1,24 +1,24 @@
1
- <hr>
2
-
3
- <table class="form-table">
4
- <tr>
5
- <th>
6
- <label>
7
- <?= __('Download your data', 'gdpr-framework') ?>
8
- </label>
9
- </th>
10
- <td>
11
- <a class="button button-primary" href="<?= esc_url($exportHTMLUrl); ?>">
12
- <?= __('Download as table', 'gdpr-framework') ?>
13
- </a>
14
- <a class="button button-primary" href="<?= esc_url($exportJSONUrl); ?>">
15
- <?= __('Export as JSON', 'gdpr-framework') ?>
16
- </a>
17
- <br />
18
- <p class="description">
19
- <?= __('You can download all your data formatted as a table for viewing.', 'gdpr-framework') ?> <br>
20
- <?= __('Alternatively, you can export it in machine-readable JSON format.', 'gdpr-framework') ?>
21
- </p>
22
- </td>
23
- </tr>
24
- </table>
1
+ <hr>
2
+
3
+ <table class="form-table">
4
+ <tr>
5
+ <th>
6
+ <label>
7
+ <?= __('Download your data', 'gdpr-framework') ?>
8
+ </label>
9
+ </th>
10
+ <td>
11
+ <a class="button button-primary" href="<?= esc_url($exportHTMLUrl); ?>">
12
+ <?= __('Download as table', 'gdpr-framework') ?>
13
+ </a>
14
+ <a class="button button-primary" href="<?= esc_url($exportJSONUrl); ?>">
15
+ <?= __('Export as JSON', 'gdpr-framework') ?>
16
+ </a>
17
+ <br />
18
+ <p class="description">
19
+ <?= __('You can download all your data formatted as a table for viewing.', 'gdpr-framework') ?> <br>
20
+ <?= __('Alternatively, you can export it in machine-readable JSON format.', 'gdpr-framework') ?>
21
+ </p>
22
+ </td>
23
+ </tr>
24
+ </table>
views/modules/wordpress-user/dashboard/profile-page/form-delete.php CHANGED
@@ -1,29 +1,29 @@
1
- <table class="form-table">
2
- <tr>
3
- <th>
4
- <label>
5
- <?= _x('Delete this user and all data', '(Admin)', 'gdpr-framework') ?>
6
- </label>
7
- </th>
8
- <td>
9
- <?php if ($showDelete): ?>
10
- <a class="button" href="<?= esc_url($deleteUrl); ?>">
11
- <?= _x('Delete user and all data', '(Admin)', 'gdpr-framework') ?>
12
- </a>
13
- <a class="button" href="<?= esc_url($anonymizeUrl); ?>">
14
- <?= _x('Anonymize user and all data', '(Admin)', 'gdpr-framework') ?>
15
- </a>
16
- <br/>
17
- <p class="description">
18
- <?= _x('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
19
- </p>
20
- <?php else: ?>
21
- <p>
22
- <em>
23
- <?= _x('You seem to have an administrator or equivalent role, so deleting/anonymizing via this page is disabled.', '(Admin)', 'gdpr-framework'); ?>
24
- </em>
25
- </p>
26
- <?php endif; ?>
27
- </td>
28
- </tr>
29
- </table>
1
+ <table class="form-table">
2
+ <tr>
3
+ <th>
4
+ <label>
5
+ <?= _x('Delete this user and all data', '(Admin)', 'gdpr-framework') ?>
6
+ </label>
7
+ </th>
8
+ <td>
9
+ <?php if ($showDelete): ?>
10
+ <a class="button" href="<?= esc_url($deleteUrl); ?>">
11
+ <?= _x('Delete user and all data', '(Admin)', 'gdpr-framework') ?>
12
+ </a>
13
+ <a class="button" href="<?= esc_url($anonymizeUrl); ?>">
14
+ <?= _x('Anonymize user and all data', '(Admin)', 'gdpr-framework') ?>
15
+ </a>
16
+ <br/>
17
+ <p class="description">
18
+ <?= _x('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
19
+ </p>
20
+ <?php else: ?>
21
+ <p>
22
+ <em>
23
+ <?= _x('You seem to have an administrator or equivalent role, so deleting/anonymizing via this page is disabled.', '(Admin)', 'gdpr-framework'); ?>
24
+ </em>
25
+ </p>
26
+ <?php endif; ?>
27
+ </td>
28
+ </tr>
29
+ </table>
views/modules/wordpress-user/dashboard/profile-page/header.php CHANGED
@@ -1,8 +1,8 @@
1
- <h2>
2
- <?= _x('GDPR Data', '(Admin)', 'gdpr-framework'); ?>
3
- </h2>
4
- <?php if ($isAnonymized): ?>
5
- <p>
6
- <em><?= _x('This user has been anonymized.', '(Admin)', 'gdpr-framework'); ?></em>
7
- </p>
8
- <?php endif; ?>
1
+ <h2>
2
+ <?= _x('GDPR Data', '(Admin)', 'gdpr-framework'); ?>
3
+ </h2>
4
+ <?php if ($isAnonymized): ?>
5
+ <p>
6
+ <em><?= _x('This user has been anonymized.', '(Admin)', 'gdpr-framework'); ?></em>
7
+ </p>
8
+ <?php endif; ?>
views/modules/wordpress-user/dashboard/profile-page/table-consent.php CHANGED
@@ -1,18 +1,18 @@
1
- <hr>
2
- <?php if (count($consentData)): ?>
3
- <table class="gdpr-consent">
4
- <th colspan="2"><?= _x('Consents given', '(Admin)', 'gdpr-framework'); ?></th>
5
- <?php foreach ($consentData as $item): ?>
6
- <tr>
7
- <td>
8
- &#10004;
9
- </td>
10
- <td>
11
- <?= $item['title']; ?>
12
- </td>
13
- </tr>
14
- <?php endforeach; ?>
15
- </table>
16
- <?php else: ?>
17
- <p><?= _x('No consents given', '(Admin)', 'gdpr-framework'); ?>.</p>
18
- <?php endif; ?>
1
+ <hr>
2
+ <?php if (count($consentData)): ?>
3
+ <table class="gdpr-consent">
4
+ <th colspan="2"><?= _x('Consents given', '(Admin)', 'gdpr-framework'); ?></th>
5
+ <?php foreach ($consentData as $item): ?>
6
+ <tr>
7
+ <td>
8
+ &#10004;
9
+ </td>
10
+ <td>
11
+ <?= $item['title']; ?>
12
+ </td>
13
+ </tr>
14
+ <?php endforeach; ?>
15
+ </table>
16
+ <?php else: ?>
17
+ <p><?= _x('No consents given', '(Admin)', 'gdpr-framework'); ?>.</p>
18
+ <?php endif; ?>
views/modules/wordpress-user/registration-terms-checkbox.php CHANGED
@@ -1,21 +1,21 @@
1
- <p class="gdpr-terms-container" style="margin-bottom: 10px">
2
- <label>
3
- <input type="checkbox" name="gdpr_terms" id="gdpr_terms" value="1" />
4
-
5
- <?php if ($termsUrl): ?>
6
- <?= sprintf(
7
- __('I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s', 'gdpr-framework'),
8
- "<a href='{$termsUrl}' target='_blank'>",
9
- '</a>',
10
- "<a href='{$privacyPolicyUrl}' target='_blank'>",
11
- '</a>'
12
- ); ?>
13
- <?php else: ?>
14
- <?= sprintf(
15
- __('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
16
- "<a href='{$privacyPolicyUrl}' target='_blank'>",
17
- '</a>'
18
- ); ?>
19
- <?php endif; ?>*
20
- </label>
21
- </p>
1
+ <p class="gdpr-terms-container" style="margin-bottom: 10px">
2
+ <label>
3
+ <input type="checkbox" name="gdpr_terms" id="gdpr_terms" value="1" />
4
+
5
+ <?php if ($termsUrl): ?>
6
+ <?= sprintf(
7
+ __('I accept the %sTerms and Conditions%s and the %sPrivacy Policy%s', 'gdpr-framework'),
8
+ "<a href='{$termsUrl}' target='_blank'>",
9
+ '</a>',
10
+ "<a href='{$privacyPolicyUrl}' target='_blank'>",
11
+ '</a>'
12
+ ); ?>
13
+ <?php else: ?>
14
+ <?= sprintf(
15
+ __('I accept the %sPrivacy Policy%s', 'gdpr-framework'),
16
+ "<a href='{$privacyPolicyUrl}' target='_blank'>",
17
+ '</a>'
18
+ ); ?>
19
+ <?php endif; ?>*
20
+ </label>
21
+ </p>
views/policy/policy.php CHANGED
@@ -1,283 +1,283 @@
1
- <h2>Privacy Policy</h2>
2
- <p>
3
- <?= esc_html($companyName); ?> is committed to safeguarding your privacy. Contact us at <a href="mailto:<?= esc_attr($contactEmail); ?>"><?= esc_html($contactEmail); ?></a> if you have any questions or problems regarding the use of your Personal Data and we will gladly assist you.
4
- </p>
5
- <p>
6
- By using this site or/and our services, you consent to the Processing of your Personal Data as described in this Privacy Policy.
7
- <?php if ($hasTerms): ?>
8
- This Privacy Policy is a part of our Terms and Conditions; by agreeing to Terms and Conditions you also agree to this Policy. In the event of collision of terms used in Terms and Conditions and Privacy Policy, the latter shall prevail.
9
- <?php endif; ?>
10
- </p>
11
-
12
-
13
- <h3>Table of Contents</h3>
14
- <ol>
15
- <li><a href="#gdpr-definitions">Definitions used in this Policy</a></li>
16
- <li><a href="#gdpr-principles">Data protection principles we follow</a></li>
17
- <li><a href="#gdpr-rights">What rights do you have regarding your Personal Data</a></li>
18
- <li><a href="#gdpr-information">What Personal Data we gather about you</a></li>
19
- <li><a href="#gdpr-processing">How we use your Personal Data</a></li>
20
- <li><a href="#gdpr-sharing">Who else has access to your Personal Data</a></li>
21
- <li><a href="#gdpr-security">How we secure your data</a></li>
22
- <li><a href="#gdpr-cookies">Information about cookies</a></li>
23
- <li><a href="#gdpr-contact">Contact information</a></li>
24
- </ol>
25
-
26
-
27
- <h3 id="gdpr-definitions">Definitions</h3>
28
- <p>
29
- <strong>Personal Data</strong> – any information relating to an identified or identifiable natural person.
30
- <strong>Processing</strong> – any operation or set of operations which is performed on Personal Data or on sets of Personal Data.
31
- <strong>Data subject</strong> - a natural person whose Personal Data is being Processed.
32
- <strong>Child</strong> - a natural person under 16 years of age.
33
- <strong>We/us</strong> (either capitalized or not) – <?= esc_html($companyName); ?>
34
- </p>
35
-
36
-
37
- <h3 id="gdpr-principles">Data Protection Principles</h3>
38
- <p>
39
- We promise to follow the following data protection principles:
40
- </p>
41
- <ul>
42
- <li>
43
- Processing is lawful, fair, transparent. Our Processing activities have lawful grounds. We always consider your rights before Processing Personal Data. We will provide you information regarding Processing upon request.
44
- <li>
45
- Processing is limited to the purpose. Our Processing activities fit the purpose for which Personal Data was gathered.
46
- </li>
47
- <li>
48
- Processing is done with minimal data. We only gather and Process the minimal amount of Personal Data required for any purpose.
49
- </li>
50
- <li>
51
- Processing is limited with a time period. We will not store your personal data for longer than needed.
52
- </li>
53
- <li>
54
- We will do our best to ensure the accuracy of data.
55
- </li>
56
- <li>
57
- We will do our best to ensure the integrity and confidentiality of data.
58
- </li>
59
- </ul>
60
-
61
-
62
- <h3 id="gdpr-rights">Data Subject's rights</h3>
63
- <p>
64
- The Data Subject has the following rights:
65
- </p>
66
- <ol>
67
- <li>Right to information – meaning you have to right to know whether your Personal Data is being processed; what data is gathered, from where it is obtained and why and by whom it is processed.</li>
68
- <li>Right to access – meaning you have the right to access the data collected from/about you. This includes your right to request and obtain a copy of your Personal Data gathered.</li>
69
- <li>Right to rectification – meaning you have the right to request rectification or erasure of your Personal Data that is inaccurate or incomplete.</li>
70
- <li>Right to erasure – meaning in certain circumstances you can request for your Personal Data to be erased from our records.</li>
71
- <li>Right to restrict processing – meaning where certain conditions apply, you have the right to restrict the Processing of your Personal Data.</li>
72
- <li>Right to object to processing – meaning in certain cases you have the right to object to Processing of your Personal Data, for example in the case of direct marketing.</li>
73
- <li>Right to object to automated Processing – meaning you have the right to object to automated Processing, including profiling; and not to be subject to a decision based solely on automated Processing. This right you can exercise whenever there is an outcome of the profiling that produces legal effects concerning or significantly affecting you.</li>
74
- <li>Right to data portability – you have the right to obtain your Personal Data in a machine-readable format or if it is feasible, as a direct transfer from one Processor to another.</li>
75
- <li>Right to lodge a complaint – in the event that we refuse your request under the Rights of Access, we will provide you with a reason as to why. If you are not satisfied with the way your request has been handled please contact us.</li>
76
- <li>Right for the help of <a href="#gdpr-contact">supervisory authority</a> – meaning you have the right for the help of a supervisory authority and the right for other legal remedies such as claiming damages.</li>
77
- <li>Right to withdraw consent – you have the right withdraw any given consent for Processing of your Personal Data.</li>
78
- </ol>
79
-
80
-
81
- <h3 id="gdpr-information">Data we gather</h3>
82
- <p>
83
- <strong>[TODO] - Information you have provided us with</strong><br>
84
- This might be your e-mail address, name, billing address, home address etc – mainly information that is necessary for delivering you a product/service or to enhance your customer experience with us. We save the information you provide us with in order for you to comment or perform other activities on the website. This information includes, for example, your name and e-mail address.
85
- </p>
86
- <p>
87
- <strong>[TODO] - Information automatically collected about you</strong><br>
88
- This includes information that is automatically stored by cookies and other session tools. For example, your shopping cart information, your IP address, your shopping history (if there is any) etc. This information is used to improve your customer experience. When you use our services or look at the contents of our website, your activities may be logged.
89
- </p>
90
-
91
- <p>
92
- <strong>[TODO] - Information from our partners</strong><br>
93
- We gather information from our trusted partners with confirmation that they have legal grounds to share that information with us. This is either information you have provided them directly with or that they have gathered about you on other legal grounds. See the list of our partners <a href="#gdpr-sharing">here</a>.
94
- </p>
95
-
96
- <p>
97
- <strong>Publicly available information</strong><br>
98
- We might gather information about you that is publicly available.
99
- </p>
100
-
101
-
102
- <h3 id="gdpr-processing">How we use your Personal Data</h3>
103
-
104
- <p>
105
- We use your Personal Data in order to:
106
- </p>
107
- <ul>
108
- <li>provide our service to you. This includes for example registering your account; providing you with other products and services that you have requested; providing you with promotional items at your request and communicating with you in relation to those products and services; communicating and interacting with you; and notifying you of changes to any services.</li>
109
- <li>enhance your customer experience;</li>
110
- <li>fulfil an obligation under law or contract;</li>
111
- <li><strong>[TODO]</strong></li>
112
- </ul>
113
-
114
- <p>
115
- We use your Personal Data on legitimate grounds and/or with your Consent.
116
- </p>
117
-
118
- <p>
119
- On the grounds of entering into a contract or fulfilling contractual obligations, we Process your Personal Data for the following purposes:
120
- </p>
121
- <ul>
122
- <li>to identify you;</li>
123
- <li>to provide you a service or to send/offer you a product;</li>
124
- <li>to communicate either for sales or invoicing;</li>
125
- <li><strong>[TODO]</strong></li>
126
- </ul>
127
-
128
- <p>
129
- On the ground of legitimate interest, we Process your Personal Data for the following purposes:
130
- </p>
131
- <ul>
132
- <li>to send you personalized offers* (from us and/or our carefully selected partners);</li>
133
- <li>to administer and analyse our client base (purchasing behaviour and history) in order to improve the quality, variety, and availability of products/ services offered/provided;</li>
134
- <li>to conduct questionnaires concerning client satisfaction;</li>
135
- <li><strong>[TODO]</strong></li>
136
- </ul>
137
- <p>
138
- As long as you have not informed us otherwise, we consider offering you products/services that are similar or same to your purchasing history/browsing behaviour to be our legitimate interest.
139
- </p>
140
-
141
- <p>
142
- With your consent we Process your Personal Data for the following purposes:
143
- </p>
144
- <ul>
145
- <li>to send you newsletters and campaign offers (from us and/or our carefully selected partners);</li>
146
- <li>for other purposes we have asked your consent for;</li>
147
- <li><strong>[TODO]</strong></li>
148
- </ul>
149
-
150
- <p>
151
- We Process your Personal Data in order to fulfil obligation rising from law and/or use your Personal Data for options provided by law. We reserve the right to anonymise Personal Data gathered and to use any such data. We will use data outside the scope of this Policy only when it is anonymised. We save your billing information and other information gathered about you for as long as needed for accounting purposes or other obligations deriving from law, but not longer than <strong>[TODO]</strong>
152
- </p>
153
-
154
- <p>
155
- We might process your Personal Data for additional purposes that are not mentioned here, but are compatible with the original purpose for which the data was gathered. To do this, we will ensure that:
156
- </p>
157
- <ul>
158
- <li>the link between purposes, context and nature of Personal Data is suitable for further Processing;</li>
159
- <li>the further Processing would not harm your interests and</li>
160
- <li>there would be appropriate safeguard for Processing.</li>
161
- </ul>
162
- <p>
163
- We will inform you of any further Processing and purposes.
164
- </p>
165
-
166
-
167
- <h3 id="gdpr-sharing">Who else can access your Personal Data</h3>
168
- <p>
169
- We do not share your Personal Data with strangers. Personal Data about you is in some cases provided to our trusted partners in order to either make providing the service to you possible or to enhance your customer experience. We share your data with:
170
- </p>
171
- <p>
172
- <strong>Our processing partners:</strong>
173
- </p>
174
- <ul>
175
- <li><strong>[TODO]</strong></li>
176
- </ul>
177
-
178
- <p>
179
- <strong>Our business partners:</strong>
180
- </p>
181
- <ul>
182
- <li><strong>[TODO]</strong></li>
183
- </ul>
184
-
185
- <p>
186
- <strong>Connected third parties:</strong>
187
- </p>
188
- <ul>
189
- <li><strong>[TODO]</strong></li>
190
- </ul>
191
-
192
- <p>
193
- We only work with Processing partners who are able to ensure adequate level of protection to your Personal Data. We disclose your Personal Data to third parties or public officials when we are legally obliged to do so. We might disclose your Personal Data to third parties if you have consented to it or if there are other legal grounds for it.
194
- </p>
195
-
196
-
197
- <h3 id="gdpr-security">How we secure your data</h3>
198
-
199
- <p>
200
- We do our best to keep your Personal Data safe.  We use safe protocols for communication and transferring data (such as HTTPS). We use anonymising and pseudonymising where suitable. We monitor our systems for possible vulnerabilities and attacks.<strong>[TODO]</strong> - describe additional security measures.
201
- </p>
202
- <p>
203
- Even though we try our best we can not guarantee the security of information. However, we promise to notify suitable authorities of data breaches. We will also notify you if there is a threat to your rights or interests. We will do everything we reasonably can to prevent security breaches and to assist authorities should any breaches occur.
204
- </p>
205
- <p>
206
- If you have an account with us, note that you have to keep your username and password secret.
207
- </p>
208
-
209
- <h3>Children</h3>
210
- <p>
211
- We do not intend to collect or knowingly collect information from children. We do not target children with our services.
212
- </p>
213
-
214
- <h3 id="gdpr-cookies">Cookies and other technologies we use</h3>
215
- <p>
216
- We use cookies and/or similar technologies to analyse customer behaviour, administer the website, track users' movements, and to collect information about users. This is done in order to personalise and enhance your experience with us.
217
- </p>
218
-
219
- <p>
220
- A cookie is a tiny text file stored on your computer. Cookies store information that is used to help make sites work. Only we can access the cookies created by our website. You can control your cookies at the browser level. Choosing to disable cookies may hinder your use of certain functions.
221
- </p>
222
-
223
- <p>
224
- <strong>We use cookies for the following purposes:</strong>
225
- </p>
226
- <ul>
227
- <li>Necessary cookies – these cookies are required for you to be able to use some important features on our website, such as logging in. These cookies don't collect any personal information.</li>
228
- <li>Functionality cookies – these cookies provide functionality that makes using our service more convenient and makes providing more personalised features possible. For example, they might remember your name and e-mail in comment forms so you don't have to re-enter this information next time when commenting.</li>
229
- <li>Analytics cookies - these cookies are used to track the use and performance of our website and services</li>
230
- <li>Advertising cookies - these cookies are used to deliver advertisements that are relevant to you and to your interests. In addition, they are used to limit the number of times you see an advertisement. They are usually placed to the website by advertising networks with the website operator’s permission. These cookies remember that you have visited a website and this information is shared with other organisations such as advertisers. Often targeting or advertising cookies will be linked to site functionality provided by the other organisation.</li>
231
- </ul>
232
-
233
- <p>
234
- You can remove cookies stored in your computer via your browser settings. Alternatively, you can control some 3rd party cookies by using a privacy enhancement platform such as <a href="http://optout.aboutads.info/#!/" target="_blank">optout.aboutads.info</a> or <a href="http://www.youronlinechoices.com/" target="_blank">youronlinechoices.com</a>. For more information about cookies, visit <a href="http://www.allaboutcookies.org" target="_blank">allaboutcookies.org</a>.
235
- </p>
236
-
237
- <p>
238
- We use Google Analytics to measure traffic on our website. Google has their own Privacy Policy which you can review <a href="https://support.google.com/analytics/answer/6004245" target="_blank">here</a>. If you'd like to opt out of tracking by Google Analytics, visit the <a href="https://tools.google.com/dlpage/gaoptout" target="_blank">Google Analytics opt-out page</a>.
239
- </p>
240
-
241
-
242
- <h3 id="gdpr-contact">Contact Information</h3>
243
- <?php if ($hasDpo): ?>
244
- <p>
245
- <strong id="gdpr-dpo">Data Protection Officer</strong><br>
246
- If you have any questions regarding Processing your Personal Data, your rights regarding your Personal Data or this Privacy Policy, contact our Data Protection Officer<?= esc_html($dpoName); ?> at <a href="mailto:<?= esc_attr($dpoEmail); ?>"><?= esc_html($dpoEmail); ?></a>
247
- </p>
248
- <?php endif; ?>
249
-
250
- <?php if ($hasRepresentative): ?>
251
- <p>
252
- <strong id="gdpr-representative">Representative Contact in the EU</strong>
253
- <?php if ($representativeContactName): ?>
254
- Name: <?= esc_html($representativeContactName); ?>
255
- <?php endif; ?>
256
- <?php if ($representativeContactEmail): ?>
257
- Email: <a href="mailto:<?= esc_attr($representativeContactEmail); ?>"><?= esc_html($representativeContactEmail); ?></a><br>
258
- <?php endif; ?>
259
- <?php if ($representativeContactPhone): ?>
260
- Phone: <?= esc_html($representativeContactPhone); ?>
261
- <?php endif; ?>
262
- </p>
263
- <?php endif; ?>
264
-
265
- <p>
266
- <strong id="gdpr-dpa">Supervisory Authority</strong><br>
267
- <?php if ($dpaWebsite): ?>
268
- Website: <a href="<?= esc_attr($dpaWebsite); ?>" target="_blank"><?= esc_html($dpaWebsite); ?></a> <br>
269
- <?php endif; ?>
270
- <?php if ($dpaEmail): ?>
271
- Email: <a href="mailto:<?= esc_attr($dpaEmail); ?>"><?= esc_html($dpaEmail); ?></a><br>
272
- <?php endif; ?>
273
- <?php if ($dpaPhone): ?>
274
- Phone: <?= esc_html($dpaPhone); ?>
275
- <?php endif; ?>
276
- </p>
277
-
278
-
279
- <h3 id="gdpr-changes">Changes to this Privacy Policy</h3>
280
- <p>
281
- We reserve the right to make change to this Privacy Policy.
282
- Last modification was made <?= $date; ?>.
283
- </p>
1
+ <h2>Privacy Policy</h2>
2
+ <p>
3
+ <?= esc_html($companyName); ?> is committed to safeguarding your privacy. Contact us at <a href="mailto:<?= esc_attr($contactEmail); ?>"><?= esc_html($contactEmail); ?></a> if you have any questions or problems regarding the use of your Personal Data and we will gladly assist you.
4
+ </p>
5
+ <p>
6
+ By using this site or/and our services, you consent to the Processing of your Personal Data as described in this Privacy Policy.
7
+ <?php if ($hasTerms): ?>
8
+ This Privacy Policy is a part of our Terms and Conditions; by agreeing to Terms and Conditions you also agree to this Policy. In the event of collision of terms used in Terms and Conditions and Privacy Policy, the latter shall prevail.
9
+ <?php endif; ?>
10
+ </p>
11
+
12
+
13
+ <h3>Table of Contents</h3>
14
+ <ol>
15
+ <li><a href="#gdpr-definitions">Definitions used in this Policy</a></li>
16
+ <li><a href="#gdpr-principles">Data protection principles we follow</a></li>
17
+ <li><a href="#gdpr-rights">What rights do you have regarding your Personal Data</a></li>
18
+ <li><a href="#gdpr-information">What Personal Data we gather about you</a></li>
19
+ <li><a href="#gdpr-processing">How we use your Personal Data</a></li>
20
+ <li><a href="#gdpr-sharing">Who else has access to your Personal Data</a></li>
21
+ <li><a href="#gdpr-security">How we secure your data</a></li>
22
+ <li><a href="#gdpr-cookies">Information about cookies</a></li>
23
+ <li><a href="#gdpr-contact">Contact information</a></li>
24
+ </ol>
25
+
26
+
27
+ <h3 id="gdpr-definitions">Definitions</h3>
28
+ <p>
29
+ <strong>Personal Data</strong> – any information relating to an identified or identifiable natural person.
30
+ <strong>Processing</strong> – any operation or set of operations which is performed on Personal Data or on sets of Personal Data.
31
+ <strong>Data subject</strong> - a natural person whose Personal Data is being Processed.
32
+ <strong>Child</strong> - a natural person under 16 years of age.
33
+ <strong>We/us</strong> (either capitalized or not) – <?= esc_html($companyName); ?>
34
+ </p>
35
+
36
+
37
+ <h3 id="gdpr-principles">Data Protection Principles</h3>
38
+ <p>
39
+ We promise to follow the following data protection principles:
40
+ </p>
41
+ <ul>
42
+ <li>
43
+ Processing is lawful, fair, transparent. Our Processing activities have lawful grounds. We always consider your rights before Processing Personal Data. We will provide you information regarding Processing upon request.
44
+ <li>
45
+ Processing is limited to the purpose. Our Processing activities fit the purpose for which Personal Data was gathered.
46
+ </li>
47
+ <li>
48
+ Processing is done with minimal data. We only gather and Process the minimal amount of Personal Data required for any purpose.
49
+ </li>
50
+ <li>
51
+ Processing is limited with a time period. We will not store your personal data for longer than needed.
52
+ </li>
53
+ <li>
54
+ We will do our best to ensure the accuracy of data.
55
+ </li>
56
+ <li>
57
+ We will do our best to ensure the integrity and confidentiality of data.
58
+ </li>
59
+ </ul>
60
+
61
+
62
+ <h3 id="gdpr-rights">Data Subject's rights</h3>
63
+ <p>
64
+ The Data Subject has the following rights:
65
+ </p>
66
+ <ol>
67
+ <li>Right to information – meaning you have to right to know whether your Personal Data is being processed; what data is gathered, from where it is obtained and why and by whom it is processed.</li>
68
+ <li>Right to access – meaning you have the right to access the data collected from/about you. This includes your right to request and obtain a copy of your Personal Data gathered.</li>
69
+ <li>Right to rectification – meaning you have the right to request rectification or erasure of your Personal Data that is inaccurate or incomplete.</li>
70
+ <li>Right to erasure – meaning in certain circumstances you can request for your Personal Data to be erased from our records.</li>
71
+ <li>Right to restrict processing – meaning where certain conditions apply, you have the right to restrict the Processing of your Personal Data.</li>
72
+ <li>Right to object to processing – meaning in certain cases you have the right to object to Processing of your Personal Data, for example in the case of direct marketing.</li>
73
+ <li>Right to object to automated Processing – meaning you have the right to object to automated Processing, including profiling; and not to be subject to a decision based solely on automated Processing. This right you can exercise whenever there is an outcome of the profiling that produces legal effects concerning or significantly affecting you.</li>
74
+ <li>Right to data portability – you have the right to obtain your Personal Data in a machine-readable format or if it is feasible, as a direct transfer from one Processor to another.</li>
75
+ <li>Right to lodge a complaint – in the event that we refuse your request under the Rights of Access, we will provide you with a reason as to why. If you are not satisfied with the way your request has been handled please contact us.</li>
76
+ <li>Right for the help of <a href="#gdpr-contact">supervisory authority</a> – meaning you have the right for the help of a supervisory authority and the right for other legal remedies such as claiming damages.</li>
77
+ <li>Right to withdraw consent – you have the right withdraw any given consent for Processing of your Personal Data.</li>
78
+ </ol>
79
+
80
+
81
+ <h3 id="gdpr-information">Data we gather</h3>
82
+ <p>
83
+ <strong>[TODO] - Information you have provided us with</strong><br>
84
+ This might be your e-mail address, name, billing address, home address etc – mainly information that is necessary for delivering you a product/service or to enhance your customer experience with us. We save the information you provide us with in order for you to comment or perform other activities on the website. This information includes, for example, your name and e-mail address.
85
+ </p>
86
+ <p>
87
+ <strong>[TODO] - Information automatically collected about you</strong><br>
88
+ This includes information that is automatically stored by cookies and other session tools. For example, your shopping cart information, your IP address, your shopping history (if there is any) etc. This information is used to improve your customer experience. When you use our services or look at the contents of our website, your activities may be logged.
89
+ </p>
90
+
91
+ <p>
92
+ <strong>[TODO] - Information from our partners</strong><br>
93
+ We gather information from our trusted partners with confirmation that they have legal grounds to share that information with us. This is either information you have provided them directly with or that they have gathered about you on other legal grounds. See the list of our partners <a href="#gdpr-sharing">here</a>.
94
+ </p>
95
+
96
+ <p>
97
+ <strong>Publicly available information</strong><br>
98
+ We might gather information about you that is publicly available.
99
+ </p>
100
+
101
+
102
+ <h3 id="gdpr-processing">How we use your Personal Data</h3>
103
+
104
+ <p>
105
+ We use your Personal Data in order to:
106
+ </p>
107
+ <ul>
108
+ <li>provide our service to you. This includes for example registering your account; providing you with other products and services that you have requested; providing you with promotional items at your request and communicating with you in relation to those products and services; communicating and interacting with you; and notifying you of changes to any services.</li>
109
+ <li>enhance your customer experience;</li>
110
+ <li>fulfil an obligation under law or contract;</li>
111
+ <li><strong>[TODO]</strong></li>
112
+ </ul>
113
+
114
+ <p>
115
+ We use your Personal Data on legitimate grounds and/or with your Consent.
116
+ </p>
117
+
118
+ <p>
119
+ On the grounds of entering into a contract or fulfilling contractual obligations, we Process your Personal Data for the following purposes:
120
+ </p>
121
+ <ul>
122
+ <li>to identify you;</li>
123
+ <li>to provide you a service or to send/offer you a product;</li>
124
+ <li>to communicate either for sales or invoicing;</li>
125
+ <li><strong>[TODO]</strong></li>
126
+ </ul>
127
+
128
+ <p>
129
+ On the ground of legitimate interest, we Process your Personal Data for the following purposes:
130
+ </p>
131
+ <ul>
132
+ <li>to send you personalized offers* (from us and/or our carefully selected partners);</li>
133
+ <li>to administer and analyse our client base (purchasing behaviour and history) in order to improve the quality, variety, and availability of products/ services offered/provided;</li>
134
+ <li>to conduct questionnaires concerning client satisfaction;</li>
135
+ <li><strong>[TODO]</strong></li>
136
+ </ul>
137
+ <p>
138
+ As long as you have not informed us otherwise, we consider offering you products/services that are similar or same to your purchasing history/browsing behaviour to be our legitimate interest.
139
+ </p>
140
+
141
+ <p>
142
+ With your consent we Process your Personal Data for the following purposes:
143
+ </p>
144
+ <ul>
145
+ <li>to send you newsletters and campaign offers (from us and/or our carefully selected partners);</li>
146
+ <li>for other purposes we have asked your consent for;</li>
147
+ <li><strong>[TODO]</strong></li>
148
+ </ul>
149
+
150
+ <p>
151
+ We Process your Personal Data in order to fulfil obligation rising from law and/or use your Personal Data for options provided by law. We reserve the right to anonymise Personal Data gathered and to use any such data. We will use data outside the scope of this Policy only when it is anonymised. We save your billing information and other information gathered about you for as long as needed for accounting purposes or other obligations deriving from law, but not longer than <strong>[TODO]</strong>
152
+ </p>
153
+
154
+ <p>
155
+ We might process your Personal Data for additional purposes that are not mentioned here, but are compatible with the original purpose for which the data was gathered. To do this, we will ensure that:
156
+ </p>
157
+ <ul>
158
+ <li>the link between purposes, context and nature of Personal Data is suitable for further Processing;</li>
159
+ <li>the further Processing would not harm your interests and</li>
160
+ <li>there would be appropriate safeguard for Processing.</li>
161
+ </ul>
162
+ <p>
163
+ We will inform you of any further Processing and purposes.
164
+ </p>
165
+
166
+
167
+ <h3 id="gdpr-sharing">Who else can access your Personal Data</h3>
168
+ <p>
169
+ We do not share your Personal Data with strangers. Personal Data about you is in some cases provided to our trusted partners in order to either make providing the service to you possible or to enhance your customer experience. We share your data with:
170
+ </p>
171
+ <p>
172
+ <strong>Our processing partners:</strong>
173
+ </p>
174
+ <ul>
175
+ <li><strong>[TODO]</strong></li>
176
+ </ul>
177
+
178
+ <p>
179
+ <strong>Our business partners:</strong>
180
+ </p>
181
+ <ul>
182
+ <li><strong>[TODO]</strong></li>
183
+ </ul>
184
+
185
+ <p>
186
+ <strong>Connected third parties:</strong>
187
+ </p>
188
+ <ul>
189
+ <li><strong>[TODO]</strong></li>
190
+ </ul>
191
+
192
+ <p>
193
+ We only work with Processing partners who are able to ensure adequate level of protection to your Personal Data. We disclose your Personal Data to third parties or public officials when we are legally obliged to do so. We might disclose your Personal Data to third parties if you have consented to it or if there are other legal grounds for it.
194
+ </p>
195
+
196
+
197
+ <h3 id="gdpr-security">How we secure your data</h3>
198
+
199
+ <p>
200
+ We do our best to keep your Personal Data safe.  We use safe protocols for communication and transferring data (such as HTTPS). We use anonymising and pseudonymising where suitable. We monitor our systems for possible vulnerabilities and attacks.<strong>[TODO]</strong> - describe additional security measures.
201
+ </p>
202
+ <p>
203
+ Even though we try our best we can not guarantee the security of information. However, we promise to notify suitable authorities of data breaches. We will also notify you if there is a threat to your rights or interests. We will do everything we reasonably can to prevent security breaches and to assist authorities should any breaches occur.
204
+ </p>
205
+ <p>
206
+ If you have an account with us, note that you have to keep your username and password secret.
207
+ </p>
208
+
209
+ <h3>Children</h3>
210
+ <p>
211
+ We do not intend to collect or knowingly collect information from children. We do not target children with our services.
212
+ </p>
213
+
214
+ <h3 id="gdpr-cookies">Cookies and other technologies we use</h3>
215
+ <p>
216
+ We use cookies and/or similar technologies to analyse customer behaviour, administer the website, track users' movements, and to collect information about users. This is done in order to personalise and enhance your experience with us.
217
+ </p>
218
+
219
+ <p>
220
+ A cookie is a tiny text file stored on your computer. Cookies store information that is used to help make sites work. Only we can access the cookies created by our website. You can control your cookies at the browser level. Choosing to disable cookies may hinder your use of certain functions.
221
+ </p>
222
+
223
+ <p>
224
+ <strong>We use cookies for the following purposes:</strong>
225
+ </p>
226
+ <ul>
227
+ <li>Necessary cookies – these cookies are required for you to be able to use some important features on our website, such as logging in. These cookies don't collect any personal information.</li>
228
+ <li>Functionality cookies – these cookies provide functionality that makes using our service more convenient and makes providing more personalised features possible. For example, they might remember your name and e-mail in comment forms so you don't have to re-enter this information next time when commenting.</li>
229
+ <li>Analytics cookies - these cookies are used to track the use and performance of our website and services</li>
230
+ <li>Advertising cookies - these cookies are used to deliver advertisements that are relevant to you and to your interests. In addition, they are used to limit the number of times you see an advertisement. They are usually placed to the website by advertising networks with the website operator’s permission. These cookies remember that you have visited a website and this information is shared with other organisations such as advertisers. Often targeting or advertising cookies will be linked to site functionality provided by the other organisation.</li>
231
+ </ul>
232
+
233
+ <p>
234
+ You can remove cookies stored in your computer via your browser settings. Alternatively, you can control some 3rd party cookies by using a privacy enhancement platform such as <a href="http://optout.aboutads.info/#!/" target="_blank">optout.aboutads.info</a> or <a href="http://www.youronlinechoices.com/" target="_blank">youronlinechoices.com</a>. For more information about cookies, visit <a href="http://www.allaboutcookies.org" target="_blank">allaboutcookies.org</a>.
235
+ </p>
236
+
237
+ <p>
238
+ We use Google Analytics to measure traffic on our website. Google has their own Privacy Policy which you can review <a href="https://support.google.com/analytics/answer/6004245" target="_blank">here</a>. If you'd like to opt out of tracking by Google Analytics, visit the <a href="https://tools.google.com/dlpage/gaoptout" target="_blank">Google Analytics opt-out page</a>.
239
+ </p>
240
+
241
+
242
+ <h3 id="gdpr-contact">Contact Information</h3>
243
+ <?php if ($hasDpo): ?>
244
+ <p>
245
+ <strong id="gdpr-dpo">Data Protection Officer</strong><br>
246
+ If you have any questions regarding Processing your Personal Data, your rights regarding your Personal Data or this Privacy Policy, contact our Data Protection Officer<?= esc_html($dpoName); ?> at <a href="mailto:<?= esc_attr($dpoEmail); ?>"><?= esc_html($dpoEmail); ?></a>
247
+ </p>
248
+ <?php endif; ?>
249
+
250
+ <?php if ($hasRepresentative): ?>
251
+ <p>
252
+ <strong id="gdpr-representative">Representative Contact in the EU</strong>
253
+ <?php if ($representativeContactName): ?>
254
+ Name: <?= esc_html($representativeContactName); ?>
255
+ <?php endif; ?>
256
+ <?php if ($representativeContactEmail): ?>
257
+ Email: <a href="mailto:<?= esc_attr($representativeContactEmail); ?>"><?= esc_html($representativeContactEmail); ?></a><br>
258
+ <?php endif; ?>
259
+ <?php if ($representativeContactPhone): ?>
260
+ Phone: <?= esc_html($representativeContactPhone); ?>
261
+ <?php endif; ?>
262
+ </p>
263
+ <?php endif; ?>
264
+
265
+ <p>
266
+ <strong id="gdpr-dpa">Supervisory Authority</strong><br>
267
+ <?php if ($dpaWebsite): ?>
268
+ Website: <a href="<?= esc_attr($dpaWebsite); ?>" target="_blank"><?= esc_html($dpaWebsite); ?></a> <br>
269
+ <?php endif; ?>
270
+ <?php if ($dpaEmail): ?>
271
+ Email: <a href="mailto:<?= esc_attr($dpaEmail); ?>"><?= esc_html($dpaEmail); ?></a><br>
272
+ <?php endif; ?>
273
+ <?php if ($dpaPhone): ?>
274
+ Phone: <?= esc_html($dpaPhone); ?>
275
+ <?php endif; ?>
276
+ </p>
277
+
278
+
279
+ <h3 id="gdpr-changes">Changes to this Privacy Policy</h3>
280
+ <p>
281
+ We reserve the right to make change to this Privacy Policy.
282
+ Last modification was made <?= $date; ?>.
283
+ </p>
views/privacy-tools/form-consent.php CHANGED
@@ -1,39 +1,39 @@
1
- <?php if (count($consentData) or $consentInfo): ?>
2
- <h2><?= __('Consent', 'gdpr-framework'); ?></h2>
3
-
4
- <?php if (count($consentData)): ?>
5
- <p>
6
- <?= __('Here you can withdraw any consents you have given.', 'gdpr-framework'); ?>
7
- </p>
8
- <table class="gdpr-consent">
9
- <th colspan="4"><?= __('Consent types', 'gdpr-framework'); ?></th>
10
- <?php foreach ($consentData as $item): ?>
11
- <tr>
12
- <td>
13
- &#10004;
14
- </td>
15
- <td>
16
- <?= $item['title']; ?>
17
- </td>
18
- <td>
19
- <em><?= $item['description']; ?></em>
20
- </td>
21
- <td>
22
- <?php if ('privacy-policy' !== $item['slug']): ?>
23
- <a href="<?= esc_url($item['withdraw_url']); ?>" class="button button-primary">
24
- <?= __('Withdraw', 'gdpr-framework'); ?>
25
- </a>
26
- <?php endif; ?>
27
- </td>
28
- </tr>
29
- <?php endforeach; ?>
30
- </table>
31
- <?php endif; ?>
32
-
33
- <?php if ($consentInfo): ?>
34
- <div class="gdpr-consent-disclaimer">
35
- <?= $consentInfo; ?>
36
- </div>
37
- <?php endif; ?>
38
- <hr>
39
- <?php endif; ?>
1
+ <?php if (count($consentData) or $consentInfo): ?>
2
+ <h2><?= __('Consent', 'gdpr-framework'); ?></h2>
3
+
4
+ <?php if (count($consentData)): ?>
5
+ <p>
6
+ <?= __('Here you can withdraw any consents you have given.', 'gdpr-framework'); ?>
7
+ </p>
8
+ <table class="gdpr-consent">
9
+ <th colspan="4"><?= __('Consent types', 'gdpr-framework'); ?></th>
10
+ <?php foreach ($consentData as $item): ?>
11
+ <tr>
12
+ <td>
13
+ &#10004;
14
+ </td>
15
+ <td>
16
+ <?= $item['title']; ?>
17
+ </td>
18
+ <td>
19
+ <em><?= $item['description']; ?></em>
20
+ </td>
21
+ <td>
22
+ <?php if ('privacy-policy' !== $item['slug']): ?>
23
+ <a href="<?= esc_url($item['withdraw_url']); ?>" class="button button-primary">
24
+ <?= __('Withdraw', 'gdpr-framework'); ?>
25
+ </a>
26
+ <?php endif; ?>
27
+ </td>
28
+ </tr>
29
+ <?php endforeach; ?>
30
+ </table>
31
+ <?php endif; ?>
32
+
33
+ <?php if ($consentInfo): ?>
34
+ <div class="gdpr-consent-disclaimer">
35
+ <?= $consentInfo; ?>
36
+ </div>
37
+ <?php endif; ?>
38
+ <hr>
39
+ <?php endif; ?>
views/privacy-tools/form-delete.php CHANGED
@@ -1,18 +1,18 @@
1
- <h2><?= __('Delete my user and data', 'gdpr-framework') ?></h2>
2
-
3
- <div class="gdpr-delete-button">
4
- <form method="GET">
5
- <input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>"/>
6
- <input type="hidden" name="gdpr_action" value="<?= $action; ?>"/>
7
- <input type="submit" class="button button-primary" value="<?= __('Delete my data', 'gdpr-framework') ?>"/>
8
- </form>
9
- </div>
10
-
11
- <br/>
12
- <p class="description">
13
- <?= __('Delete all data we have gathered about you.', 'gdpr-framework') ?> <br/>
14
- <?= __('If you have a user account on our site, it will also be deleted.', 'gdpr-framework') ?> <br/>
15
- <?= __('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
16
- </p>
17
-
18
- <hr>
1
+ <h2><?= __('Delete my user and data', 'gdpr-framework') ?></h2>
2
+
3
+ <div class="gdpr-delete-button">
4
+ <form method="GET">
5
+ <input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>"/>
6
+ <input type="hidden" name="gdpr_action" value="<?= $action; ?>"/>
7
+ <input type="submit" class="button button-primary" value="<?= __('Delete my data', 'gdpr-framework') ?>"/>
8
+ </form>
9
+ </div>
10
+
11
+ <br/>
12
+ <p class="description">
13
+ <?= __('Delete all data we have gathered about you.', 'gdpr-framework') ?> <br/>
14
+ <?= __('If you have a user account on our site, it will also be deleted.', 'gdpr-framework') ?> <br/>
15
+ <?= __('Be careful - this action is permanent and CANNOT be undone.', 'gdpr-framework') ?>
16
+ </p>
17
+
18
+ <hr>
views/privacy-tools/form-export.php CHANGED
@@ -1,26 +1,26 @@
1
- <h2><?= __('Download your data', 'gdpr-framework') ?></h2>
2
-
3
- <p class="description">
4
- <?= __('You can download all your data formatted as a table for viewing.', 'gdpr-framework') ?> <br>
5
- <?= __('Alternatively, you can export it in machine-readable JSON format.', 'gdpr-framework') ?>
6
- </p>
7
-
8
- <div class="gdpr-download-button">
9
- <form method="POST">
10
- <input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
11
- <input type="hidden" name="gdpr_action" value="export" />
12
- <input type="hidden" name="gdpr_format" value="html" />
13
- <input type="submit" class="button button-primary" value="<?= __('Download as table', 'gdpr-framework') ?>" />
14
- </form>
15
- </div>
16
-
17
- <div class="gdpr-export-button">
18
- <form method="POST">
19
- <input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
20
- <input type="hidden" name="gdpr_action" value="export" />
21
- <input type="hidden" name="gdpr_format" value="json" />
22
- <input type="submit" class="button button-primary" value="<?= __('Export as JSON', 'gdpr-framework') ?>" />
23
- </form>
24
- </div>
25
-
26
- <hr>
1
+ <h2><?= __('Download your data', 'gdpr-framework') ?></h2>
2
+
3
+ <p class="description">
4
+ <?= __('You can download all your data formatted as a table for viewing.', 'gdpr-framework') ?> <br>
5
+ <?= __('Alternatively, you can export it in machine-readable JSON format.', 'gdpr-framework') ?>
6
+ </p>
7
+
8
+ <div class="gdpr-download-button">
9
+ <form method="POST">
10
+ <input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
11
+ <input type="hidden" name="gdpr_action" value="export" />
12
+ <input type="hidden" name="gdpr_format" value="html" />
13
+ <input type="submit" class="button button-primary" value="<?= __('Download as table', 'gdpr-framework') ?>" />
14
+ </form>
15
+ </div>
16
+
17
+ <div class="gdpr-export-button">
18
+ <form method="POST">
19
+ <input type="hidden" name="gdpr_nonce" value="<?= $nonce; ?>" />
20
+ <input type="hidden" name="gdpr_action" value="export" />
21
+ <input type="hidden" name="gdpr_format" value="json" />
22
+ <input type="submit" class="button button-primary" value="<?= __('Export as JSON', 'gdpr-framework') ?>" />
23
+ </form>
24
+ </div>
25
+
26
+ <hr>
views/privacy-tools/form-identify.php CHANGED
@@ -1,28 +1,30 @@
1
- <?php do_action('gdpr/privacy-tools-page/identify/before'); ?>
2
-
3
- <?php if (isset($_REQUEST['gdpr_notice']) && in_array($_REQUEST['gdpr_notice'], ['data_deleted', 'request_sent'])): ?>
4
- <p>
5
- <br>
6
-
7
- <a href="<?= get_home_url() ?>">
8
- <?= __('Back to front page', 'gdpr-framework'); ?>
9
- </a>
10
- </p>
11
- <?php else: ?>
12
-
13
- <h3>
14
- <?= __('Identify yourself!', 'gdpr-framework'); ?>
15
- </h3>
16
- <form>
17
- <label for="gdpr_email"><?= __('Enter your email address', 'gdpr-framework') ?></label>
18
- <input type="hidden" name="gdpr_action" value="identify" />
19
- <input type="hidden" name="gdpr_nonce" value="<?= $nonce ?>" />
20
- <input type="email" id="gdpr_email" name="email" placeholder="<?= __('Enter your email address', 'gdpr-framework') ?>" />
21
- <?php do_action('gdpr/privacy-tools-page/identify'); ?>
22
-
23
- <input type="submit" value="<?= __('Send email', 'gdpr-framework') ?>" />
24
- </form>
25
-
26
- <?php endif; ?>
27
-
28
- <?php do_action('gdpr/privacy-tools-page/identify/after'); ?>
 
 
1
+ <?php do_action('gdpr/privacy-tools-page/identify/before'); ?>
2
+
3
+ <?php if (isset($_REQUEST['gdpr_notice']) && in_array($_REQUEST['gdpr_notice'], ['data_deleted', 'request_sent'])): ?>
4
+ <p>
5
+ <br>
6
+
7
+ <a href="<?= get_home_url() ?>">
8
+ <?= __('Back to front page', 'gdpr-framework'); ?>
9
+ </a>
10
+ </p>
11
+ <?php else: ?>
12
+
13
+ <h3>
14
+ <?=
15
+ __('Please identify yourself via e-mail', 'gdpr-framework');
16
+ ?>
17
+ </h3>
18
+ <form>
19
+ <label for="gdpr_email"><?= __('Enter your email address', 'gdpr-framework') ?></label>
20
+ <input type="hidden" name="gdpr_action" value="identify" />
21
+ <input type="hidden" name="gdpr_nonce" value="<?= $nonce ?>" />
22
+ <input type="email" id="gdpr_email" name="email" placeholder="<?= __('Enter your email address', 'gdpr-framework') ?>" />
23
+ <?php do_action('gdpr/privacy-tools-page/identify'); ?>
24
+
25
+ <input type="submit" value="<?= __('Send email', 'gdpr-framework') ?>" />
26
+ </form>
27
+
28
+ <?php endif; ?>
29
+
30
+ <?php do_action('gdpr/privacy-tools-page/identify/after'); ?>
views/privacy-tools/notice-admin-role.php CHANGED
@@ -1,6 +1,6 @@
1
- <h2><?= __('Delete my user and data', 'gdpr-framework') ?></h2>
2
- <p class="description">
3
- <em>
4
- <?= _x('Data deletion is disabled for administrative accounts.', '(Admin)', 'gdpr-framework'); ?>
5
- </em>
6
- </p>
1
+ <h2><?= __('Delete my user and data', 'gdpr-framework') ?></h2>
2
+ <p class="description">
3
+ <em>
4
+ <?= _x('Data deletion is disabled for administrative accounts.', '(Admin)', 'gdpr-framework'); ?>
5
+ </em>
6
+ </p>
views/privacy-tools/notices.php CHANGED
@@ -1,25 +1,25 @@
1
- <div class="gdpr-notice">
2
- <?php if ('email_sent' === $_REQUEST['gdpr_notice']): ?>
3
- <?= __('We will send you an email with the link to access your data. Please check your spam folder as well!', 'gdpr-framework'); ?>
4
- <?php endif; ?>
5
-
6
- <?php if ('invalid_email' === $_REQUEST['gdpr_notice']): ?>
7
- <?= __('The email you entered does not appear to be a valid email.', 'gdpr-framework'); ?>
8
- <?php endif; ?>
9
-
10
- <?php if ('invalid_key' === $_REQUEST['gdpr_notice']): ?>
11
- <?= __('Sorry - the link seems to have expired. Please try again!', 'gdpr-framework'); ?>
12
- <?php endif; ?>
13
-
14
- <?php if ('consent_withdrawn' === $_REQUEST['gdpr_notice']): ?>
15
- <?= __('Consent withdrawn.', 'gdpr-framework'); ?>
16
- <?php endif; ?>
17
-
18
- <?php if ('request_sent' === $_REQUEST['gdpr_notice']): ?>
19
- <?= __('We have received your request and will reply within 30 days.', 'gdpr-framework'); ?>
20
- <?php endif; ?>
21
-
22
- <?php if ('data_deleted' === $_REQUEST['gdpr_notice']): ?>
23
- <?= __('Your personal data has been removed!', 'gdpr-framework'); ?>
24
- <?php endif; ?>
25
- </div>
1
+ <div class="gdpr-notice">
2
+ <?php if ('email_sent' === $_REQUEST['gdpr_notice']): ?>
3
+ <?= __('We will send you an email with the link to access your data. Please check your spam folder as well!', 'gdpr-framework'); ?>
4
+ <?php endif; ?>
5
+
6
+ <?php if ('invalid_email' === $_REQUEST['gdpr_notice']): ?>
7
+ <?= __('The email you entered does not appear to be a valid email.', 'gdpr-framework'); ?>
8
+ <?php endif; ?>
9
+
10
+ <?php if ('invalid_key' === $_REQUEST['gdpr_notice']): ?>
11
+ <?= __('Sorry - the link seems to have expired. Please try again!', 'gdpr-framework'); ?>
12
+ <?php endif; ?>
13
+
14
+ <?php if ('consent_withdrawn' === $_REQUEST['gdpr_notice']): ?>
15
+ <?= __('Consent withdrawn.', 'gdpr-framework'); ?>
16
+ <?php endif; ?>
17
+
18
+ <?php if ('request_sent' === $_REQUEST['gdpr_notice']): ?>
19
+ <?= __('We have received your request and will reply within 30 days.', 'gdpr-framework'); ?>
20
+ <?php endif; ?>
21
+
22
+ <?php if ('data_deleted' === $_REQUEST['gdpr_notice']): ?>
23
+ <?= __('Your personal data has been removed!', 'gdpr-framework'); ?>
24
+ <?php endif; ?>
25
+ </div>
views/privacy-tools/privacy-tools.php CHANGED
@@ -1,13 +1,13 @@
1
- <div class="gdpr-framework-privacy-tools">
2
- <?php do_action('gdpr/frontend/privacy-tools-page/content/before', $dataSubject); ?>
3
-
4
- <p>
5
- <?= __('You are identified as', 'gdpr-framework'); ?> <strong><?= esc_html($email); ?></strong>
6
- </p>
7
-
8
- <hr>
9
-
10
- <?php do_action('gdpr/frontend/privacy-tools-page/content', $dataSubject); ?>
11
-
12
- <?php do_action('gdpr/frontend/privacy-tools-page/content/after', $dataSubject); ?>
13
- </div>
1
+ <div class="gdpr-framework-privacy-tools">
2
+ <?php do_action('gdpr/frontend/privacy-tools-page/content/before', $dataSubject); ?>
3
+
4
+ <p>
5
+ <?= __('You are identified as', 'gdpr-framework'); ?> <strong><?= esc_html($email); ?></strong>
6
+ </p>
7
+
8
+ <hr>
9
+
10
+ <?php do_action('gdpr/frontend/privacy-tools-page/content', $dataSubject); ?>
11
+
12
+ <?php do_action('gdpr/frontend/privacy-tools-page/content/after', $dataSubject); ?>
13
+ </div>
views/themes/storefront/footer.php CHANGED
@@ -1,8 +1,8 @@
1
- &nbsp;|&nbsp;
2
- <a href="<?= esc_url($privacyPolicyUrl); ?>" style="color: #6d6d6d">
3
- <?= __('Privacy Policy', 'gdpr-framework'); ?>
4
- </a>
5
- &nbsp;|&nbsp;
6
- <a href="<?= esc_url($privacyToolsPageUrl); ?>" style="color: #6d6d6d">
7
- <?= __('Privacy Tools', 'gdpr-framework'); ?>
8
- </a>
1
+ &nbsp;|&nbsp;
2
+ <a href="<?= esc_url($privacyPolicyUrl); ?>" style="color: #6d6d6d">
3
+ <?= __('Privacy Policy', 'gdpr-framework'); ?>
4
+ </a>
5
+ &nbsp;|&nbsp;
6
+ <a href="<?= esc_url($privacyToolsPageUrl); ?>" style="color: #6d6d6d">
7
+ <?= __('Privacy Tools', 'gdpr-framework'); ?>
8
+ </a>
views/themes/twentyseventeen/footer.php CHANGED
@@ -1,9 +1,9 @@
1
- <div>
2
- <a href="<?= esc_url($privacyPolicyUrl); ?>">
3
- <?= __('Privacy Policy', 'gdpr-framework'); ?>
4
- </a>
5
- &nbsp;|&nbsp;
6
- <a href="<?= esc_url($privacyToolsPageUrl); ?>">
7
- <?= __('Privacy Tools', 'gdpr-framework'); ?>
8
- </a>
9
- </div>
1
+ <div>
2
+ <a href="<?= esc_url($privacyPolicyUrl); ?>">
3
+ <?= __('Privacy Policy', 'gdpr-framework'); ?>
4
+ </a>
5
+ &nbsp;|&nbsp;
6
+ <a href="<?= esc_url($privacyToolsPageUrl); ?>">
7
+ <?= __('Privacy Tools', 'gdpr-framework'); ?>
8
+ </a>
9
+ </div>
views/themes/twentysixteen/footer.php CHANGED
@@ -1,12 +1,12 @@
1
- <div style="margin-bottom: 10px">
2
- <span class="site-title">
3
- <a href="<?= esc_url($privacyPolicyUrl); ?>">
4
- <?= __('Privacy Policy', 'gdpr-framework'); ?>
5
- </a>
6
- </span>
7
- <span>
8
- <a href="<?= esc_url($privacyToolsPageUrl); ?>">
9
- <?= __('Privacy Tools', 'gdpr-framework'); ?>
10
- </a>
11
- </span>
12
- </div>
1
+ <div style="margin-bottom: 10px">
2
+ <span class="site-title">
3
+ <a href="<?= esc_url($privacyPolicyUrl); ?>">
4
+ <?= __('Privacy Policy', 'gdpr-framework'); ?>
5
+ </a>
6
+ </span>
7
+ <span>
8
+ <a href="<?= esc_url($privacyToolsPageUrl); ?>">
9
+ <?= __('Privacy Tools', 'gdpr-framework'); ?>
10
+ </a>
11
+ </span>
12
+ </div>