array( compared template, action template ). * * @return array */ public static function findings() { return array( 'core_modified' => array( /* translators: 1: path, 2: version, 3: locale. */ __( 'md5 of %1$s compared to the WordPress.org checksums of WordPress %2$s (%3$s): different.', 'aftersweep' ), /* translators: 2: version. */ __( 'Replace this file with the one from the official WordPress %2$s package, or show the difference to your host.', 'aftersweep' ), ), 'core_missing' => array( /* translators: 2: version, 3: locale. */ __( 'Listed in the WordPress.org checksums of WordPress %2$s (%3$s), not found on disk.', 'aftersweep' ), /* translators: 2: version. */ __( 'Check whether the file was removed on purpose; reinstalling WordPress %2$s puts it back.', 'aftersweep' ), ), 'core_unknown_file' => array( /* translators: 2: version, 3: locale. */ __( 'Not listed in the WordPress.org checksums of WordPress %2$s (%3$s), although it sits in a core folder.', 'aftersweep' ), __( 'Find out who put this file there: core folders only hold files from the official package.', 'aftersweep' ), ), 'core_root_unknown_php' => array( /* translators: 2: version, 3: locale. */ __( 'PHP file at the site root, not listed in the WordPress.org checksums of WordPress %2$s (%3$s).', 'aftersweep' ), __( 'Identify this file; if nobody on your side created it, show it to your host.', 'aftersweep' ), ), 'core_root_plugin_file' => array( /* translators: 2: plugin slug. */ __( 'PHP file at the site root, not listed in the WordPress.org checksums; known as the firewall file of %2$s, which is installed.', 'aftersweep' ), /* translators: 2: plugin slug. */ __( 'Make sure the firewall of %2$s was set up on this site: its setup writes this file at the root.', 'aftersweep' ), ), 'other_dir_suspect_php' => array( /* translators: 2: folder. */ __( 'PHP file in the %2$s folder, which has no reason to hold PHP on a WordPress site.', 'aftersweep' ), __( 'Identify this file; if nobody on your side put it there, keep a copy for your host, then remove it from the site.', 'aftersweep' ), ), 'other_dir_php' => array( '%1$s', // Placeholder only: nothing to translate. '', ), 'other_dir_php_by_folder' => array( /* translators: 1: folder, 2: number of PHP files. */ __( 'Folder %1$s at the site root, outside WordPress: %2$s PHP files, not compared to any reference.', 'aftersweep' ), __( 'Make sure you know what this folder holds (often another application); its PHP files were not judged.', 'aftersweep' ), ), 'config_marker' => array( /* translators: 1: marker. */ __( 'wp-config.php compared to the markers it should not hold; found: %1$s.', 'aftersweep' ), __( 'Compare wp-config.php with wp-config-sample.php and ask your host about every line you cannot explain.', 'aftersweep' ), ), 'config_docker_extra' => array( __( 'wp-config.php compared to the block written by the official WordPress Docker image: identical, its eval() runs the WORDPRESS_CONFIG_EXTRA variable.', 'aftersweep' ), __( 'If your site does not run on the official WordPress Docker image, ask your host who added this block.', 'aftersweep' ), ), 'config_uploads_include' => array( /* translators: 1: statement. */ __( 'wp-config.php loads a file from the uploads folder: %1$s', 'aftersweep' ), __( 'Compare wp-config.php with wp-config-sample.php and show this line to your host.', 'aftersweep' ), ), 'config_escaped_include' => array( /* translators: 1: statement. */ __( 'wp-config.php loads a file whose path is written in escape sequences: %1$s', 'aftersweep' ), __( 'Compare wp-config.php with wp-config-sample.php and show this line to your host.', 'aftersweep' ), ), 'plugin_modified' => array( /* translators: 1: path, 2: slug, 3: version, 4: algorithm. */ __( '%4$s of %1$s compared to the WordPress.org checksums of %2$s %3$s: different.', 'aftersweep' ), /* translators: 2: slug, 3: version. */ __( 'Reinstall %2$s %3$s from WordPress.org, or show the difference to your host.', 'aftersweep' ), ), 'plugin_unknown_php' => array( /* translators: 2: slug, 3: version. */ __( 'PHP file not listed in the WordPress.org checksums of %2$s %3$s.', 'aftersweep' ), /* translators: 2: slug. */ __( 'Identify this file: the published version of %2$s does not contain it.', 'aftersweep' ), ), 'plugin_extra_file' => array( /* translators: 2: slug, 3: version. */ __( 'File other than PHP not listed in the WordPress.org checksums of %2$s %3$s.', 'aftersweep' ), '', ), 'plugin_silence_index' => array( __( 'index.php of at most 200 bytes in a plugin folder, running no code.', 'aftersweep' ), '', ), 'plugin_hello_modified' => array( /* translators: 1: path, 2: version, 3: locale. */ __( 'md5 of %1$s compared to the entry wp-content/plugins/hello.php of the WordPress.org checksums of WordPress %2$s (%3$s): different.', 'aftersweep' ), /* translators: 2: version. */ __( 'Replace hello.php with the one from the official WordPress %2$s package, or delete Hello Dolly if you do not use it.', 'aftersweep' ), ), 'uploads_exec_extension' => array( /* translators: 2: extension. */ __( 'File name compared to the PHP extensions; found: .%2$s.', 'aftersweep' ), __( 'The uploads folder only holds media: keep a copy of this file for your host, then remove it from the site.', 'aftersweep' ), ), 'uploads_plugin_data' => array( /* translators: 2: plugin slug, 3: header of the file. */ __( 'PHP file in the folder %2$s keeps its data in, starting with the header this plugin writes (%3$s); %2$s is installed.', 'aftersweep' ), /* translators: 2: plugin slug. */ __( 'Make sure %2$s is in use on this site; a file of this folder without that header would be an anomaly.', 'aftersweep' ), ), 'uploads_access_exec' => array( /* translators: 2: directive, 3: extension or target. */ __( 'Compared to the rules on PHP handlers and auto_prepend_file; found: %2$s (%3$s).', 'aftersweep' ), __( 'This file makes the server run PHP in the uploads folder: keep a copy for your host, then remove it from the site.', 'aftersweep' ), ), 'uploads_access_file' => array( __( 'Compared to the only lines expected here (deny from all, Require all denied, Options -Indexes, Order, lines that turn PHP off, Files and IfModule containers, comments, empty lines): other lines found.', 'aftersweep' ), __( 'Read this file: it changes how the server treats the uploads folder.', 'aftersweep' ), ), 'uploads_php_content' => array( /* translators: 2: tag. */ __( 'First 4 KB of the file compared to the PHP opening tags; found: %2$s.', 'aftersweep' ), __( 'A media file has no reason to hold PHP code: keep a copy for your host, then remove it from the site.', 'aftersweep' ), ), 'uploads_silence_index' => array( __( 'index.php of at most 200 bytes holding only a PHP opening tag and comments.', 'aftersweep' ), '', ), 'mu_plugin' => array( /* translators: 2: name, 3: author, 4: size, 5: date. */ __( 'Must-use plugin, loaded on every page without activation. Plugin Name: %2$s; Author: %3$s; %4$s bytes; modified %5$s.', 'aftersweep' ), __( 'Make sure you or your host installed this must-use plugin.', 'aftersweep' ), ), 'mu_plugin_marker' => array( /* translators: 2: name, 3: author, 4: size, 5: date, 6: marker. */ __( 'Must-use plugin compared to the obfuscation markers; found: %6$s. Plugin Name: %2$s; Author: %3$s; %4$s bytes; modified %5$s.', 'aftersweep' ), __( 'Read this must-use plugin with your host: the marker has legitimate uses but is common in injected code.', 'aftersweep' ), ), 'dropin' => array( /* translators: 2: name, 3: author. */ __( 'Drop-in known to this WordPress, loaded by the core when present. Plugin Name: %2$s; Author: %3$s.', 'aftersweep' ), __( 'Find which plugin or host put this drop-in in place.', 'aftersweep' ), ), 'content_dir_plugin_config' => array( /* translators: 2: slug. */ __( 'PHP file at the first level of the content folder, known as the configuration file of %2$s, which is installed.', 'aftersweep' ), /* translators: 2: slug. */ __( 'Make sure %2$s wrote this file; it is not a drop-in and WordPress does not load it by itself.', 'aftersweep' ), ), 'content_dir_unknown_php' => array( __( 'PHP file at the first level of the content folder, neither a drop-in known to this WordPress nor index.php.', 'aftersweep' ), __( 'Identify this file; WordPress does not load it by itself.', 'aftersweep' ), ), 'user_registered_after' => array( /* translators: 3: registered, 4: reference date. */ __( 'Account holding a listed capability, registered on %3$s, on or after the reference date %4$s.', 'aftersweep' ), /* translators: 1: login, 2: id. */ __( 'Make sure you know who created account %1$s (ID %2$s).', 'aftersweep' ), ), 'user_cap_outside_role' => array( /* translators: 3: capabilities outside roles, 4: roles. */ __( 'Capabilities granted directly to the account, not by its roles (%4$s): %3$s.', 'aftersweep' ), /* translators: 1: login, 2: id. */ __( 'Check why account %1$s (ID %2$s) holds these capabilities on its own.', 'aftersweep' ), ), 'user_orphan_admin' => array( /* translators: 1: id. */ __( 'Capabilities metadata gives the administrator role to user ID %1$s, which does not exist in the users table.', 'aftersweep' ), __( 'Show this metadata row to your host: it points to an account that WordPress does not list.', 'aftersweep' ), ), 'privileged_user' => array( /* translators: 1: login, 2: id, 3: registered. */ __( 'Account %1$s (ID %2$s) holds a listed capability, registered on %3$s.', 'aftersweep' ), '', ), 'privileged_users' => array( /* translators: 1: count, 2: reference date. */ __( '%1$s accounts hold at least one listed capability and were registered before %2$s.', 'aftersweep' ), __( 'Go through this list and make sure you know every account.', 'aftersweep' ), ), 'htaccess_external_redirect' => array( /* translators: 2: directive, 3: host, 4: line. */ __( '%2$s target compared to the hosts of home and siteurl; points to %3$s. Line: %4$s', 'aftersweep' ), __( 'Remove this line after a backup, or ask your host who added it.', 'aftersweep' ), ), 'htaccess_conditional_rewrite' => array( /* translators: 2: variable, 3: line. */ __( 'Rewrite applied only for some visitors (%2$s condition). Rule: %3$s', 'aftersweep' ), __( 'Remove this rule set after a backup, or ask your host who added it.', 'aftersweep' ), ), 'htaccess_php_handler' => array( /* translators: 2: directive, 3: extension, 4: line. */ __( '%2$s compared to the PHP extensions; makes .%3$s run as PHP. Line: %4$s', 'aftersweep' ), __( 'Remove this line after a backup, or ask your host who added it.', 'aftersweep' ), ), 'php_prepend_append' => array( /* translators: 2: directive, 3: target. */ __( '%2$s makes PHP run %3$s before or after every script.', 'aftersweep' ), /* translators: 3: target. */ __( 'Find what %3$s is; if nobody on your side set it, show it to your host.', 'aftersweep' ), ), 'php_prepend_plugin' => array( /* translators: 2: directive, 3: target, 4: plugin slug. */ __( '%2$s runs %3$s, inside this site, the file name used by the firewall of %4$s, which is installed.', 'aftersweep' ), /* translators: 4: plugin slug. */ __( 'Make sure the firewall of %4$s set this line.', 'aftersweep' ), ), 'htaccess_external_error_document' => array( /* translators: 2: host, 3: line. */ __( 'ErrorDocument target compared to the hosts of home and siteurl; points to %2$s. Line: %3$s', 'aftersweep' ), __( 'Check who set this error page on another host.', 'aftersweep' ), ), 'content_recent' => array( /* translators: 2: id, 3: title, 4: author id, 5: date. */ __( '%3$s (ID %2$s, author ID %4$s), created or modified on %5$s.', 'aftersweep' ), '', ), 'content_recent_by_type' => array( /* translators: 1: type, 2: count, 3: reference date. */ __( '%2$s items of type %1$s created or modified on or after %3$s.', 'aftersweep' ), __( 'Open each item and make sure you know the change.', 'aftersweep' ), ), 'content_marker' => array( /* translators: 4: marker. */ __( 'Content compared to the markers of injected code; found: %4$s.', 'aftersweep' ), /* translators: 2: id, 3: title. */ __( 'Open %3$s (ID %2$s) in the code editor and check where this code comes from.', 'aftersweep' ), ), 'content_author_recent' => array( /* translators: 4: author id, 5: author registered, 6: reference date. */ __( 'Author ID %4$s registered on %5$s, on or after the reference date %6$s.', 'aftersweep' ), /* translators: 2: id, 3: title. */ __( 'Make sure you know the author of %3$s (ID %2$s).', 'aftersweep' ), ), 'cron_callback_uploads' => array( /* translators: 1: hook, 2: function, 3: file. */ __( 'Function %2$s attached to %1$s is defined in the uploads folder: %3$s.', 'aftersweep' ), __( 'Show this file to your host: the uploads folder only holds media.', 'aftersweep' ), ), 'cron_callback_mu_plugin' => array( /* translators: 1: hook, 2: function, 3: file. */ __( 'Function %2$s attached to %1$s is defined in a must-use plugin not recognized: %3$s.', 'aftersweep' ), __( 'Make sure you or your host installed this must-use plugin.', 'aftersweep' ), ), 'cron_callback_outside' => array( /* translators: 1: hook, 2: function, 3: file. */ __( 'Function %2$s attached to %1$s is defined outside the WordPress folder: %3$s.', 'aftersweep' ), __( 'Show this file to your host.', 'aftersweep' ), ), 'cron_args_marker' => array( /* translators: 2: marker. */ __( 'Arguments of the scheduled event compared to the obfuscation markers; found: %2$s.', 'aftersweep' ), /* translators: 1: hook. */ __( 'Find which plugin scheduled %1$s.', 'aftersweep' ), ), 'cron_no_callback' => array( '%1$s', // Placeholder only: nothing to translate. '', ), 'cron_without_code' => array( /* translators: 1: count. */ __( '%1$s scheduled events have no code attached on this page load.', 'aftersweep' ), __( 'Usually left behind by a removed plugin; check the hook names.', 'aftersweep' ), ), 'cron_attributed' => array( /* translators: 1: hook, 2: origin. */ __( '%1$s attributed to %2$s.', 'aftersweep' ), '', ), 'settings_urls' => array( /* translators: 1: siteurl, 2: home. */ __( 'siteurl: %1$s; home: %2$s.', 'aftersweep' ), __( 'Make sure both addresses are yours.', 'aftersweep' ), ), 'settings_hosts_differ' => array( /* translators: 1: siteurl host, 2: home host. */ __( 'Host of siteurl (%1$s) compared to host of home (%2$s): different.', 'aftersweep' ), __( 'Make sure both hosts are yours.', 'aftersweep' ), ), 'settings_constant_differs' => array( /* translators: 1: constant, 2: constant value, 3: option, 4: option value. */ __( '%1$s (%2$s) compared to the option %3$s (%4$s): different.', 'aftersweep' ), /* translators: 1: constant. */ __( 'Check who set %1$s in wp-config.php.', 'aftersweep' ), ), 'settings_open_registration_privileged' => array( /* translators: 1: role, 2: capabilities. */ __( 'Anyone can register, and the default role %1$s holds: %2$s.', 'aftersweep' ), __( 'Close registration or set a default role without these capabilities in Settings, General.', 'aftersweep' ), ), 'settings_open_registration' => array( /* translators: 1: role. */ __( 'Anyone can register; default role: %1$s.', 'aftersweep' ), __( 'Make sure open registration is wanted.', 'aftersweep' ), ), 'settings_active_plugin_hidden' => array( /* translators: 1: entry, 2: option. */ __( '%1$s is active in %2$s but absent from the plugin list, although the file exists.', 'aftersweep' ), __( 'Show this file to your host: an active plugin hidden from the list is a known hiding place.', 'aftersweep' ), ), 'settings_active_plugin_missing' => array( /* translators: 1: entry, 2: option. */ __( '%1$s is active in %2$s but the file does not exist.', 'aftersweep' ), __( 'Usually a plugin removed by hand; check the name.', 'aftersweep' ), ), 'option_marker' => array( /* translators: 2: marker, 3: autoload. */ __( 'Option value compared to the obfuscation markers; found: %2$s (autoload: %3$s).', 'aftersweep' ), /* translators: 1: option name. */ __( 'Find which plugin or theme writes option %1$s.', 'aftersweep' ), ), 'option_plugin_rules' => array( /* translators: 1: option name, 2: plugin slug. */ __( 'Option %1$s, where %2$s keeps its detection rules, holds the markers it detects; %2$s is installed.', 'aftersweep' ), '', ), ); } /** * Not-looked code => template. * * @return array */ public static function not_looked() { return array( 'themes' => __( 'Themes: WordPress.org publishes no checksums for themes.', 'aftersweep' ), 'tables_outside_wordpress' => __( 'Database tables that WordPress does not create.', 'aftersweep' ), 'comments' => __( 'Comments.', 'aftersweep' ), 'files_outside_wordpress' => __( 'Files outside the WordPress folder.', 'aftersweep' ), 'server_configuration' => __( 'Server configuration (nginx, Apache main configuration, hosting panel).', 'aftersweep' ), 'other_hosted_sites' => __( 'Other sites on the same hosting account.', 'aftersweep' ), 'other_network_sites' => __( 'Other sites of the network.', 'aftersweep' ), 'role_change_dates' => __( 'Dates of role changes: WordPress does not keep them.', 'aftersweep' ), 'core_not_consented' => __( 'Control 1 (core files): checksum download not allowed for this pass.', 'aftersweep' ), 'plugins_not_consented' => __( 'Control 2 (plugins): checksum download not allowed for this pass.', 'aftersweep' ), 'core_network_error' => __( 'Control 1 (core files): the WordPress.org checksums could not be downloaded.', 'aftersweep' ), 'core_unexpected_response' => __( 'Control 1 (core files): the WordPress.org answer had an unexpected format.', 'aftersweep' ), /* translators: 1: version, 2: locale. */ 'core_not_published' => __( 'Control 1 (core files): WordPress.org publishes no checksums for WordPress %1$s (%2$s).', 'aftersweep' ), /* translators: 1: locale, 2: file. */ 'core_locale_fallback' => __( '%2$s: checksums of the locale %1$s are not published; this file differs by locale and was not compared.', 'aftersweep' ), /* translators: 1: slug, 2: version. */ 'plugin_network_error' => __( '%1$s %2$s: the WordPress.org checksums could not be downloaded.', 'aftersweep' ), /* translators: 1: slug, 2: version. */ 'plugin_no_sums_for_version' => __( '%1$s: version %2$s has no published checksums.', 'aftersweep' ), /* translators: 1: slug, 2: version. */ 'plugin_not_compared' => __( '%1$s %2$s: no checksums were available for this pass.', 'aftersweep' ), /* translators: 1: slug. */ 'plugin_not_on_wporg' => __( '%1$s is not (or no longer) on WordPress.org.', 'aftersweep' ), /* translators: 1: plugin file. */ 'plugin_single_file_no_sums' => __( '%1$s: single-file plugin without published checksums.', 'aftersweep' ), 'hello_no_core_sums' => __( 'hello.php: compared to the core checksums, which are not available for this pass.', 'aftersweep' ), /* translators: 1: count. */ 'unreadable_files' => __( '%1$s files could not be read.', 'aftersweep' ), /* translators: 1: count. */ 'too_large_files' => __( '%1$s files larger than 5 MB were not read.', 'aftersweep' ), /* translators: 1: count. */ 'too_large_to_compare' => __( '%1$s files larger than 32 MB were not compared to the checksums.', 'aftersweep' ), /* translators: 1: folder, 2: number of PHP files. */ 'content_folder_unjudged' => __( '%1$s: %2$s PHP files, no rule of this plugin judges them.', 'aftersweep' ), /* translators: 1: folder. */ 'folder_not_traversed' => __( 'Folder not traversed: %1$s.', 'aftersweep' ), ); } /** Line under a control when findings of a code were only counted (D-13). */ public static function capped() { /* translators: 1: number of findings, 2: finding code. */ return __( '%1$s more findings with the code %2$s were counted but not listed.', 'aftersweep' ); } /** Summary line template. */ public static function summary() { /* translators: 1: number of anomalies, 2: number of suspects, 3: number of objects to identify, 4: number of points not looked at. */ return __( '%1$s anomalies, %2$s suspects, %3$s to identify, %4$s points not looked at', 'aftersweep' ); } }