PluginProbe
The GDPR Framework By Data443 / trunk
The GDPR Framework By Data443 vtrunk
2.5.0 2.4.0 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.3 1.0.33 1.0.34 1.0.35 1.0.36 1.0.37 1.0.39 1.0.4 1.0.40 1.0.41 1.0.42 1.0.43 1.0.44 1.0.45 1.0.46 All 41 releases
gdpr-framework / src / Components / WordpressUser / DataManager.php

DataManager.php in The GDPR Framework By Data443 trunk, at src/Components/WordpressUser/DataManager.php

189 lines 6.2 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
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 // Remove session keys. Just in case.
29 if (isset($meta) && isset($meta['session_tokens']) && count($meta['session_tokens'])) {
30 foreach ($meta['session_tokens'] as $token) {
31 // Security fix (SECURITY-AUDIT.md Finding 5 / PR review Finding
32 // 3): decode this DB-sourced string with the object-blocking
33 // gdpr_safe_unserialize() helper rather than
34 // maybe_unserialize(), which would still instantiate a
35 // serialized object. Validate the decoded shape before use.
36 $tokens = gdpr_safe_unserialize($token);
37
38 if (!is_array($tokens)) {
39 continue;
40 }
41
42 foreach ($tokens as $tokenData) {
43 if (is_array($tokenData)) {
44 $data['meta']['session_tokens'][] = $tokenData;
45 }
46 }
47 }
48 }
49
50 /*
51 $blacklist = [
52 'use_ssl',
53 'show_admin_bar_front',
54 'wp_capabilities',
55 'wp_user_level',
56 'dismissed_wp_pointers',
57 'show_welcome_panel',
58 'wp_dashboard_quick_press_last_post_id',
59 'wp_user-settings',
60 'wp_user-settings-time',
61 'closedpostboxes_page',
62 'metaboxhidden_page',
63 'session_tokens',
64 'managenav-menuscolumnshidden',
65 'metaboxhidden_nav-menus',
66 'nav_menu_recently_edited',
67 'acf_user_settings',
68 ];
69
70 // Blacklist some data
71 if (isset($data['meta']) && count($data['meta'])) {
72 foreach ($data['meta'] as $key => $value) {
73 if (in_array($key, $blacklist)) {
74 unset($data['meta'][$key]);
75 }
76 }
77
78 $data['meta'] = array_diff_assoc($data['meta'], $blacklist);
79 }
80 */
81 global $wpdb;
82 $table_prefix = $wpdb->prefix;
83 if (isset($data['meta']) && count($data['meta'])) {
84 foreach ($data['meta'] as $key => $value) {
85 if ($this->startsWith($key, $table_prefix)) {
86 $newKey = $this->removePrefix($key, $table_prefix);
87 if (strlen($newKey) > 0) {
88 $data['meta'][$newKey] = $value;
89 unset($data['meta'][$key]);
90 }
91 }
92 }
93 }
94
95 return apply_filters('gdpr/wordpress-user/export/data', $data);
96 }
97
98 private function removePrefix($string, $prefix)
99 {
100 if (strpos($string, $prefix) === 0) {
101 $string = substr($string, strlen($prefix));
102 }
103 return $string;
104 }
105
106 private function startsWith($string, $prefix)
107 {
108 return substr($string, 0, strlen($prefix)) === $prefix;
109 }
110
111 public function deleteUser(DataSubject $dataSubject, $reassign = null)
112 {
113 global $gdpr;
114 require_once(ABSPATH . 'wp-admin/includes/user.php');
115
116 $reassignOption = $gdpr->Options->get('delete_action_reassign');
117 if ('reassign' === $reassignOption) {
118 $reassignUserId = $gdpr->Options->get('delete_action_reassign_user');
119 } else {
120 $reassignUserId = false;
121 }
122 if($dataSubject->getUserId()){
123 $dataSubject->gdpr_delete_log($dataSubject->getUserId());
124 wp_delete_user($dataSubject->getUserId(), $reassignUserId);
125 }
126 }
127
128 public function anonymizeUser(DataSubject $dataSubject, $anonymizedId)
129 {
130 if (!$dataSubject->hasUser()) {
131 return;
132 }
133
134 if (!$anonymizedId) {
135 gdpr('helpers')->error();
136 }
137
138 // Save a unique identifier to tie anonymized data together for analytics purposes
139 update_user_meta($dataSubject->getUserId(), "gdpr_anonymized_id", $anonymizedId);
140
141 // Change username
142 global $wpdb;
143
144 $anonymizedUsername = apply_filters('gdpr/wordpress-user/anonymize/username', '[anonymous]');
145 $wpdb->update(
146 $wpdb->users,
147 ['user_login' => $anonymizedUsername],
148 ['ID' => $dataSubject->getUserId()]
149 );
150
151 // Clear all relevant user fields, reset password
152 wp_update_user([
153 'ID' => $dataSubject->getUserId(),
154 'user_email' => '',
155 'user_nicename' => '',
156 'user_url' => '',
157 'user_activation_key' => '',
158 'display_name' => $anonymizedUsername,
159 // Set a random password, just in case the functionality that disallows users from logging in should break for any reason
160 'user_pass' => wp_hash_password(wp_generate_password()),
161 ]);
162
163 // Clear Logs
164 $dataSubject->gdpr_delete_log($dataSubject->getUserId());
165
166 // Clear all relevant usermeta fields
167 delete_user_meta($dataSubject->getUserId(), 'first_name');
168 delete_user_meta($dataSubject->getUserId(), 'last_name');
169 delete_user_meta($dataSubject->getUserId(), 'nickname');
170 delete_user_meta($dataSubject->getUserId(), 'description');
171 delete_user_meta($dataSubject->getUserId(), 'session_tokens');
172 delete_user_meta($dataSubject->getUserId(), 'community-events-location');
173
174 // Remove all capabilities
175 $user = $dataSubject->getUser();
176 $user->remove_all_caps();
177
178 // Finally, assign the 'anonymous' role to user
179 if (apply_filters('gdpr/wordpress-user/anonymize/change_role', true) && get_role('anonymous')) {
180
181 foreach ($user->roles as $role) {
182 $user->remove_role($role);
183 }
184
185 $user->add_role('anonymous');
186 }
187 }
188 }
189