PluginProbe
Defender Security – Malware Scanner, Login Security & Firewall / 5.7.2
Defender Security – Malware Scanner, Login Security & Firewall v5.7.2
6.3.0 6.2.3 6.2.4 6.2.0 6.2.1 6.2.2 6.1.0 5.3.1 5.4.0 5.4.1 5.5.0 5.5.1 5.6.0 5.6.1 5.6.2 5.7.0 5.7.1 5.7.2 5.8.0 5.8.1 5.9.0 6.0.0 6.0.1 3.0.1 3.1.0 All 141 releases
defender-security / src / component / audit / class-options-audit.php

class-options-audit.php in Defender Security – Malware Scanner, Login Security & Firewall 5.7.2, at src/component/audit/class-options-audit.php

258 lines 12.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Auditing changes to WordPress settings.
4 *
5 * @package WP_Defender\Component\Audit
6 */
7
8 namespace WP_Defender\Component\Audit;
9
10 use WP_Defender\Traits\User;
11 use WP_Defender\Model\Audit_Log;
12
13 /**
14 * Handles changes to WordPress settings such as updating options and deleting options.
15 */
16 class Options_Audit extends Audit_Event {
17
18 use User;
19
20 public const CONTEXT_SETTINGS = 'ct_setting';
21
22 /**
23 * Returns an array of hooks that the audit system will listen to.
24 * Specifically, it listens to the update_option hook to audit changes made to WordPress options.
25 *
26 * @return array[]
27 */
28 public function get_hooks(): array {
29 return array(
30 'update_option' => array(
31 'args' => array( 'option', 'old_value', 'value' ),
32 'callback' => array( self::class, 'process_options' ),
33 'event_type' => Audit_Log::EVENT_TYPE_SETTINGS,
34 'action_type' => self::ACTION_UPDATED,
35 ),
36 );
37 }
38
39 /**
40 * Processes the changes made to an option and generates an audit log entry if the option value has changed.
41 * It serializes array values for comparison and uses a human-readable format for logging.
42 *
43 * @return bool|array
44 */
45 public function process_options() {
46 $args = func_get_args();
47 $option = $args[1]['option'];
48 $old = $args[1]['old_value'];
49 $new = $args[1]['value'];
50 $option_human_read = self::key_to_human_name( $option );
51 // To avoid the recursive compare if both are nested array, convert all to string.
52 $check1 = is_array( $old ) ? wp_json_encode( $old ) : $old;
53 $check2 = is_array( $new ) ? wp_json_encode( $new ) : $new;
54
55 if ( $check1 === $check2 ) {
56 return false;
57 }
58 if ( false !== $option_human_read ) {
59 $user_name = $this->get_user_display( get_current_user_id() );
60 $blog_name = is_multisite() ? '[' . get_bloginfo( 'name' ) . ']' : '';
61 // We will need special case for reader.
62 switch ( $option ) {
63 case 'users_can_register':
64 if ( 0 === $new ) {
65 $text = sprintf(
66 /* translators: 1: Blog name, 2: User's display name */
67 esc_html__( '%1$s %2$s disabled site registration', 'defender-security' ),
68 $blog_name,
69 $user_name
70 );
71 } else {
72 $text = sprintf(
73 /* translators: 1: Blog name, 2: User's display name */
74 esc_html__( '%1$s %2$s opened site registration', 'defender-security' ),
75 $blog_name,
76 $user_name
77 );
78 }
79 break;
80 case 'start_of_week':
81 global $wp_locale;
82 $old_day = $wp_locale->get_weekday( $old );
83 $new_day = $wp_locale->get_weekday( $new );
84 $text = sprintf(
85 /* translators: 1: Blog name, 2: User's display name, 3: Option: Week Starts On, 4: Old day, 5: New day */
86 esc_html__( '%1$s %2$s update option %3$s from %4$s to %5$s', 'defender-security' ),
87 $blog_name,
88 $user_name,
89 $option_human_read,
90 $old_day,
91 $new_day
92 );
93 break;
94 case 'WPLANG':
95 if ( '' !== $new ) {
96 $text = sprintf(
97 /* translators: 1: Blog name, 2: User's display name, 3: Option: Site Language, 4: New option value */
98 esc_html__( '%1$s %2$s update option %3$s to %4$s', 'defender-security' ),
99 $blog_name,
100 $user_name,
101 $option_human_read,
102 $new
103 );
104 } else {
105 $text = sprintf(
106 /* translators: 1: Blog name, 2: User's display name, 3: Option: Site Language, 4: Old option value */
107 esc_html__( '%1$s %2$s update option %3$s from %4$s', 'defender-security' ),
108 $blog_name,
109 $user_name,
110 $option_human_read,
111 $old
112 );
113 }
114 break;
115 default:
116 $text = sprintf(
117 /* translators: 1: Blog name, 2: User's display name, 3: Option label, 4: Old option value, 5: New option value */
118 esc_html__( '%1$s %2$s update option %3$s from %4$s to %5$s', 'defender-security' ),
119 $blog_name,
120 $user_name,
121 $option_human_read,
122 $old,
123 $new
124 );
125 break;
126 }
127
128 return array( $text, self::CONTEXT_SETTINGS );
129 }
130
131 return false;
132 }
133
134 /**
135 * Converts an option key to a human-readable name using a predefined list. If the key is not found in the list, it
136 * returns the key itself.
137 *
138 * @param mixed $key The option key to convert.
139 *
140 * @return mixed
141 */
142 private static function key_to_human_name( $key ) {
143 $human_read = apply_filters(
144 'wd_audit_settings_keys',
145 array(
146 'blogname' => esc_html__( 'Site Title', 'defender-security' ),
147 'blogdescription' => esc_html__( 'Tagline', 'defender-security' ),
148 'gmt_offset' => esc_html__( 'Timezone', 'defender-security' ),
149 'date_format' => esc_html__( 'Date Format', 'defender-security' ),
150 'time_format' => esc_html__( 'Time Format', 'defender-security' ),
151 'start_of_week' => esc_html__( 'Week Starts On', 'defender-security' ),
152 'timezone_string' => esc_html__( 'Timezone', 'defender-security' ),
153 'WPLANG' => esc_html__( 'Site Language', 'defender-security' ),
154 'siteurl' => esc_html__( 'WordPress Address (URL)', 'defender-security' ),
155 'home' => esc_html__( 'Site Address (URL)', 'defender-security' ),
156 'admin_email' => esc_html__( 'Email Address', 'defender-security' ),
157 'users_can_register' => esc_html__( 'Membership', 'defender-security' ),
158 'default_role' => esc_html__( 'New User Default Role', 'defender-security' ),
159 'default_pingback_flag' => esc_html__( 'Default article settings', 'defender-security' ),
160 'default_ping_status' => esc_html__( 'Default article settings', 'defender-security' ),
161 'default_comment_status' => esc_html__( 'Default article settings', 'defender-security' ),
162 'comments_notify' => esc_html__( 'Email me whenever', 'defender-security' ),
163 'moderation_notify' => esc_html__( 'Email me whenever', 'defender-security' ),
164 'comment_moderation' => esc_html__( 'Before a comment appears', 'defender-security' ),
165 'require_name_email' => esc_html__( 'Other comment settings', 'defender-security' ),
166 'comment_whitelist' => esc_html__( 'Before a comment appears', 'defender-security' ),
167 'comment_max_links' => esc_html__( 'Comment Moderation', 'defender-security' ),
168 'moderation_keys' => esc_html__( 'Comment Moderation', 'defender-security' ),
169 'blacklist_keys' => esc_html__( 'Comment Blocklist', 'defender-security' ),
170 'show_avatars' => esc_html__( 'Avatar Display', 'defender-security' ),
171 'avatar_rating' => esc_html__( 'Maximum Rating', 'defender-security' ),
172 'avatar_default' => esc_html__( 'Default Avatar', 'defender-security' ),
173 'close_comments_for_old_posts' => esc_html__( 'Other comment settings', 'defender-security' ),
174 'close_comments_days_old' => esc_html__( 'Other comment settings', 'defender-security' ),
175 'thread_comments' => esc_html__( 'Other comment settings', 'defender-security' ),
176 'thread_comments_depth' => esc_html__( 'Other comment settings', 'defender-security' ),
177 'page_comments' => esc_html__( 'Other comment settings', 'defender-security' ),
178 'comments_per_page' => esc_html__( 'Other comment settings', 'defender-security' ),
179 'default_comments_page' => esc_html__( 'Other comment settings', 'defender-security' ),
180 'comment_order' => esc_html__( 'Other comment settings', 'defender-security' ),
181 'comment_registration' => esc_html__( 'Other comment settings', 'defender-security' ),
182 'thumbnail_size_w' => esc_html__( 'Thumbnail size', 'defender-security' ),
183 'thumbnail_size_h' => esc_html__( 'Thumbnail size', 'defender-security' ),
184 'thumbnail_crop' => esc_html__( 'Thumbnail size', 'defender-security' ),
185 'medium_size_w' => esc_html__( 'Medium size', 'defender-security' ),
186 'medium_size_h' => esc_html__( 'Medium size', 'defender-security' ),
187 'medium_large_size_w' => esc_html__( 'Medium size', 'defender-security' ),
188 'medium_large_size_h' => esc_html__( 'Medium size', 'defender-security' ),
189 'large_size_w' => esc_html__( 'Large size', 'defender-security' ),
190 'large_size_h' => esc_html__( 'Large size', 'defender-security' ),
191 'image_default_size' => esc_html__( 'Default image size', 'defender-security' ),
192 'image_default_align' => esc_html__( 'Default image align', 'defender-security' ),
193 'image_default_link_type' => esc_html__( 'Default image link type', 'defender-security' ),
194 'uploads_use_yearmonth_folders' => esc_html__( 'Uploading Files', 'defender-security' ),
195 'posts_per_page' => esc_html__( 'Blog pages show at most', 'defender-security' ),
196 'posts_per_rss' => esc_html__( 'Syndication feeds show the most recent', 'defender-security' ),
197 'rss_use_excerpt' => esc_html__( 'For each article in a feed, show', 'defender-security' ),
198 'show_on_front' => esc_html__( 'Front page displays', 'defender-security' ),
199 'page_on_front' => esc_html__( 'Front page', 'defender-security' ),
200 'page_for_posts' => esc_html__( 'Posts page', 'defender-security' ),
201 'blog_public' => esc_html__( 'Search Engine Visibility', 'defender-security' ),
202 'default_category' => esc_html__( 'Default Post Category', 'defender-security' ),
203 'default_email_category' => esc_html__( 'Default Mail Category', 'defender-security' ),
204 'default_link_category' => esc_html__( 'Default Link Category', 'defender-security' ),
205 'default_post_format' => esc_html__( 'Default Post Format', 'defender-security' ),
206 'mailserver_url' => esc_html__( 'Mail Server', 'defender-security' ),
207 'mailserver_port' => esc_html__( 'Port', 'defender-security' ),
208 'mailserver_login' => esc_html__( 'Login Name', 'defender-security' ),
209 'mailserver_pass' => esc_html__( 'Password', 'defender-security' ),
210 'ping_sites' => esc_html__( 'Update Services', 'defender-security' ),
211 'permalink_structure' => esc_html__( 'Permalink Setting', 'defender-security' ),
212 'category_base' => esc_html__( 'Category base', 'defender-security' ),
213 'tag_base' => esc_html__( 'Tag base', 'defender-security' ),
214 'registrationnotification' => esc_html__( 'Registration notification', 'defender-security' ),
215 'registration' => esc_html__( 'Allow new registrations', 'defender-security' ),
216 'add_new_users' => esc_html__( 'Add New Users', 'defender-security' ),
217 'menu_items' => esc_html__( 'Enable administration menus', 'defender-security' ),
218 'upload_space_check_disabled' => esc_html__( 'Site upload space', 'defender-security' ),
219 'blog_upload_space' => esc_html__( 'Site upload space', 'defender-security' ),
220 'upload_filetypes' => esc_html__( 'Upload file types', 'defender-security' ),
221 'site_name' => esc_html__( 'Network Title', 'defender-security' ),
222 'first_post' => esc_html__( 'First Post', 'defender-security' ),
223 'first_page' => esc_html__( 'First Page', 'defender-security' ),
224 'first_comment' => esc_html__( 'First Comment', 'defender-security' ),
225 'first_comment_url' => esc_html__( 'First Comment URL', 'defender-security' ),
226 'first_comment_author' => esc_html__( 'First Comment Author', 'defender-security' ),
227 'welcome_email' => esc_html__( 'Welcome Email', 'defender-security' ),
228 'welcome_user_email' => esc_html__( 'Welcome User Email', 'defender-security' ),
229 'fileupload_maxk' => esc_html__( 'Max upload file size', 'defender-security' ),
230 'illegal_names' => esc_html__( 'Banned Names', 'defender-security' ),
231 'limited_email_domains' => esc_html__( 'Limited Email Registrations', 'defender-security' ),
232 'banned_email_domains' => esc_html__( 'Banned Email Domains', 'defender-security' ),
233 )
234 );
235
236 if ( isset( $human_read[ $key ] ) ) {
237 if ( empty( $human_read[ $key ] ) ) {
238 return $key;
239 }
240
241 return $human_read[ $key ];
242 }
243
244 return false;
245 }
246
247 /**
248 * Provides a dictionary for translating audit contexts into human-readable formats.
249 *
250 * @return array
251 */
252 public function dictionary(): array {
253 return array(
254 self::CONTEXT_SETTINGS => esc_html__( 'Settings', 'defender-security' ),
255 );
256 }
257 }
258