PluginProbe
Stream – Activity Log & Audit Trail / 4.0.2
Stream – Activity Log & Audit Trail v4.0.2
4.4.0 4.3.0 4.2.2 4.2.1 trunk 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.0.5 3.0.6 3.0.7 3.1 3.1.1 3.10.0 3.2.0 3.2.1 3.2.2 3.2.3 All 50 releases
stream / connectors / class-connector-users.php

class-connector-users.php in Stream – Activity Log & Audit Trail 4.0.2, at connectors/class-connector-users.php

391 lines 9.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Connector for users
4 *
5 * @package WP_Stream
6 */
7
8 namespace WP_Stream;
9
10 /**
11 * Class - Connector_Users
12 */
13 class Connector_Users extends Connector {
14
15 /**
16 * Connector slug
17 *
18 * @var string
19 */
20 public $name = 'users';
21
22 /**
23 * Stores users object before the user being deleted.
24 *
25 * @var WP_User
26 */
27 protected $_users_object_pre_deleted = array(); // @codingStandardsIgnoreLine
28
29 /**
30 * Actions registered for this connector
31 *
32 * @var array
33 */
34 public $actions = array(
35 'user_register',
36 'profile_update',
37 'password_reset',
38 'retrieve_password',
39 'set_logged_in_cookie',
40 'clear_auth_cookie',
41 'delete_user',
42 'deleted_user',
43 'set_user_role',
44 'set_current_user',
45 );
46
47 /**
48 * Return translated connector label
49 *
50 * @return string Translated connector label
51 */
52 public function get_label() {
53 return esc_html__( 'Users', 'stream' );
54 }
55
56 /**
57 * Return translated action term labels
58 *
59 * @return array Action terms label translation
60 */
61 public function get_action_labels() {
62 return array(
63 'updated' => esc_html__( 'Updated', 'stream' ),
64 'created' => esc_html__( 'Created', 'stream' ),
65 'deleted' => esc_html__( 'Deleted', 'stream' ),
66 'password-reset' => esc_html__( 'Password Reset', 'stream' ),
67 'forgot-password' => esc_html__( 'Lost Password', 'stream' ),
68 'login' => esc_html__( 'Log In', 'stream' ),
69 'logout' => esc_html__( 'Log Out', 'stream' ),
70 'switched-to' => esc_html__( 'Switched To', 'stream' ),
71 'switched-back' => esc_html__( 'Switched Back', 'stream' ),
72 'switched-off' => esc_html__( 'Switched Off', 'stream' ),
73 );
74 }
75
76 /**
77 * Return translated context labels
78 *
79 * @return array Context label translations
80 */
81 public function get_context_labels() {
82 return array(
83 'users' => esc_html__( 'Users', 'stream' ),
84 'sessions' => esc_html__( 'Sessions', 'stream' ),
85 'profiles' => esc_html__( 'Profiles', 'stream' ),
86 );
87 }
88
89 /**
90 * Add action links to Stream drop row in admin list screen
91 *
92 * @filter wp_stream_action_links_{connector}
93 *
94 * @param array $links Previous links registered.
95 * @param Record $record Stream record.
96 *
97 * @return array Action links
98 */
99 public function action_links( $links, $record ) {
100 if ( $record->object_id ) {
101 $link = get_edit_user_link( $record->object_id );
102 if ( $link ) {
103 $links [ esc_html__( 'Edit User', 'stream' ) ] = $link;
104 }
105 }
106
107 return $links;
108 }
109
110 /**
111 * Get an array of role labels assigned to a specific user.
112 *
113 * @param object|int $user User object or user ID to get roles for.
114 *
115 * @return array $labels An array of role labels
116 */
117 public function get_role_labels( $user ) {
118 if ( is_int( $user ) ) {
119 $user = get_user_by( 'id', $user );
120 }
121
122 if ( ! is_a( $user, 'WP_User' ) ) {
123 return array();
124 }
125
126 global $wp_roles;
127
128 $roles = $wp_roles->get_names();
129 $labels = array();
130
131 foreach ( $roles as $role => $label ) {
132 if ( in_array( $role, (array) $user->roles, true ) ) {
133 $labels[] = translate_user_role( $label );
134 }
135 }
136
137 return $labels;
138 }
139
140 /**
141 * Log user registrations
142 *
143 * @action user_register
144 *
145 * @param int $user_id Newly registered user ID.
146 */
147 public function callback_user_register( $user_id ) {
148 $current_user = wp_get_current_user();
149 $registered_user = get_user_by( 'id', $user_id );
150
151 if ( ! $current_user->ID ) { // Non logged-in user registered themselves.
152 $message = esc_html__( 'New user registration', 'stream' );
153 $user_to_log = $registered_user->ID;
154 } else { // Current logged-in user created a new user.
155 /* translators: %1$s: a user display name, %2$s: a user role (e.g. "Jane Doe", "subscriber") */
156 $message = _x(
157 'New user account created for %1$s (%2$s)',
158 '1: User display name, 2: User role',
159 'stream'
160 );
161 $user_to_log = $current_user->ID;
162 }
163
164 $this->log(
165 $message,
166 array(
167 'display_name' => ( $registered_user->display_name ) ? $registered_user->display_name : $registered_user->user_login,
168 'roles' => implode( ', ', $this->get_role_labels( $user_id ) ),
169 ),
170 $registered_user->ID,
171 'users',
172 'created',
173 $user_to_log
174 );
175 }
176
177 /**
178 * Log profile update
179 *
180 * @action profile_update
181 *
182 * @param int $user_id Registered user ID.
183 * @param \WP_User $user Registered user object.
184 */
185 public function callback_profile_update( $user_id, $user ) {
186 unset( $user_id );
187
188 $this->log(
189 /* translators: %s: a user display name (e.g. "Jane Doe") */
190 __( '%s\'s profile was updated', 'stream' ),
191 array(
192 'display_name' => $user->display_name,
193 ),
194 $user->ID,
195 'profiles',
196 'updated'
197 );
198 }
199
200 /**
201 * Log role transition
202 *
203 * @action set_user_role
204 *
205 * @param int $user_id User ID.
206 * @param string $new_role User role.
207 * @param array $old_roles Old user roles.
208 */
209 public function callback_set_user_role( $user_id, $new_role, $old_roles ) {
210 if ( empty( $old_roles ) ) {
211 return;
212 }
213
214 global $wp_roles;
215
216 $this->log(
217 /* translators: %1$s: a user display name, %2$s: a user role, %3$s: another user role (e.g. "Jane Doe", "editor", "subscriber") */
218 _x(
219 '%1$s\'s role was changed from %2$s to %3$s',
220 '1: User display name, 2: Old role, 3: New role',
221 'stream'
222 ),
223 array(
224 'display_name' => get_user_by( 'id', $user_id )->display_name,
225 'old_role' => translate_user_role( $wp_roles->role_names[ current( $old_roles ) ] ),
226 'new_role' => $new_role ? translate_user_role( $wp_roles->role_names[ $new_role ] ) : __( 'N/A', 'stream' ),
227 ),
228 $user_id,
229 'profiles',
230 'updated'
231 );
232 }
233
234 /**
235 * Log password reset
236 *
237 * @action password_reset
238 *
239 * @param \WP_User $user User.
240 */
241 public function callback_password_reset( $user ) {
242 $this->log(
243 /* translators: %s: a user display name (e.g. "Jane Doe") */
244 __( '%s\'s password was reset', 'stream' ),
245 array(
246 'display_name' => $user->display_name,
247 ),
248 $user->ID,
249 'profiles',
250 'password-reset',
251 $user->ID
252 );
253 }
254
255 /**
256 * Log user requests to retrieve passwords
257 *
258 * @action retrieve_password
259 *
260 * @param string $user_login User login.
261 */
262 public function callback_retrieve_password( $user_login ) {
263 if ( wp_stream_filter_var( $user_login, FILTER_VALIDATE_EMAIL ) ) {
264 $user = get_user_by( 'email', $user_login );
265 } else {
266 $user = get_user_by( 'login', $user_login );
267 }
268
269 $this->log(
270 /* translators: %s: a user display name (e.g. "Jane Doe") */
271 __( '%s\'s password was requested to be reset', 'stream' ),
272 array(
273 'display_name' => $user->display_name,
274 ),
275 $user->ID,
276 'sessions',
277 'forgot-password',
278 $user->ID
279 );
280 }
281
282 /**
283 * Log user login
284 *
285 * @action set_logged_in_cookie
286 *
287 * @param string $logged_in_cookie Authenticated cookie.
288 * @param int $expire Unused.
289 * @param int $expiration Unused.
290 * @param int $user_id Unused.
291 */
292 public function callback_set_logged_in_cookie( $logged_in_cookie, $expire, $expiration, $user_id ) {
293 unset( $logged_in_cookie );
294 unset( $expire );
295 unset( $expiration );
296 $user = get_user_by( 'id', $user_id );
297
298 $this->log(
299 /* translators: %s: a user display name (e.g. "Jane Doe") */
300 __( '%s logged in', 'stream' ),
301 array(
302 'display_name' => $user->display_name,
303 ),
304 $user->ID,
305 'sessions',
306 'login',
307 $user->ID
308 );
309 }
310
311 /**
312 * Log user logout
313 *
314 * @action clear_auth_cookie
315 */
316 public function callback_clear_auth_cookie() {
317 $user_id = get_current_user_id();
318 $user = get_user_by( 'ID', $user_id );
319
320 // For some reason, incognito mode calls clear_auth_cookie on failed login attempts.
321 if ( empty( $user ) || ! $user->exists() ) {
322 return;
323 }
324
325 $this->log(
326 /* translators: %s: a user display name (e.g. "Jane Doe") */
327 __( '%s logged out', 'stream' ),
328 array( 'display_name' => $user->display_name ),
329 $user->ID,
330 'sessions',
331 'logout',
332 $user->ID
333 );
334 }
335
336 /**
337 * There's no logging in this callback's action, the reason
338 * behind this hook is so that we can store user objects before
339 * being deleted. During `deleted_user` hook, our callback
340 * receives $user_id param but it's useless as the user record
341 * was already removed from DB.
342 *
343 * @action delete_user
344 * @param int $user_id User ID that maybe deleted.
345 */
346 public function callback_delete_user( $user_id ) {
347 if ( ! isset( $this->_users_object_pre_deleted[ $user_id ] ) ) {
348 $this->_users_object_pre_deleted[ $user_id ] = get_user_by( 'id', $user_id );
349 }
350 }
351
352 /**
353 * Log deleted user.
354 *
355 * @action deleted_user
356 * @param int $user_id Deleted user ID.
357 */
358 public function callback_deleted_user( $user_id ) {
359 $user = wp_get_current_user();
360
361 if ( isset( $this->_users_object_pre_deleted[ $user_id ] ) ) {
362 /* translators: %1$s: a user display name, %2$s: a user role (e.g. "Jane Doe", "subscriber") */
363 $message = _x(
364 '%1$s\'s account was deleted (%2$s)',
365 '1: User display name, 2: User roles',
366 'stream'
367 );
368 $display_name = $this->_users_object_pre_deleted[ $user_id ]->display_name;
369 $deleted_user = $this->_users_object_pre_deleted[ $user_id ];
370 unset( $this->_users_object_pre_deleted[ $user_id ] );
371 } else {
372 /* translators: %d: a user display name, and a user role (e.g. "Jane Doe", "subscriber") */
373 $message = esc_html__( 'User account #%d was deleted', 'stream' );
374 $display_name = $user_id;
375 $deleted_user = $user_id;
376 }
377
378 $this->log(
379 $message,
380 array(
381 'display_name' => $display_name,
382 'roles' => implode( ', ', $this->get_role_labels( $deleted_user ) ),
383 ),
384 $user_id,
385 'users',
386 'deleted',
387 $user->ID
388 );
389 }
390 }
391