PluginProbe ʕ •ᴥ•ʔ
WP 2FA – Two-factor authentication for WordPress / 2.6.0
WP 2FA – Two-factor authentication for WordPress v2.6.0
4.0.0 1.7.1 2.0.0 2.0.1 2.1.0 2.2.0 2.2.1 2.3.0 2.4.0 2.4.1 2.4.2 2.5.0 2.6.0 2.6.1 2.6.2 2.6.3 2.6.4 2.7.0 2.8.0 2.9.0 2.9.1 2.9.2 2.9.3 3.0.0 3.0.1 3.1.0 3.1.1 3.1.1.2 trunk 1.2.0 1.3.0 1.4.0 1.4.1 1.4.2 1.5.0 1.5.1 1.5.2 1.6.0 1.6.1 1.6.2 1.7.0
wp-2fa / includes / classes / Utils / class-debugging.php
wp-2fa / includes / classes / Utils Last commit date
class-abstract-migration.php 2 years ago class-date-time-utils.php 2 years ago class-debugging.php 2 years ago class-generate-modal.php 2 years ago class-migration.php 2 years ago class-request-utils.php 2 years ago class-settings-utils.php 2 years ago class-user-utils.php 2 years ago index.php 5 years ago
class-debugging.php
156 lines
1 <?php
2 /**
3 * Responsible for logging.
4 *
5 * @package wp2fa
6 * @subpackage utils
7 * @copyright %%YEAR%% Melapress
8 * @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0
9 * @link https://wordpress.org/plugins/wp-2fa/
10 * @since 1.4.2
11 */
12
13 declare(strict_types=1);
14
15 namespace WP2FA\Utils;
16
17 if ( ! class_exists( '\WP2FA\Utils\Debugging' ) ) {
18 /**
19 * Utility class for creating modal popup markup.
20 *
21 * @package WP2FA\Utils
22 * @since 1.4.2
23 */
24 class Debugging {
25
26 /**
27 * Local cache for the logging dir so that it doesn't need to be repopulated each time get_logging_dir_path is called.
28 *
29 * @var string
30 */
31 private static $logging_dir_path = '';
32
33 /**
34 * Retrieve the logging status
35 *
36 * @return boolean
37 */
38 private static function is_logging_enabled() {
39 /**
40 * Enables / Disables the logging for the plugin.
41 *
42 * @param bool $disabled - Default logging for the plugin.
43 */
44 return apply_filters( WP_2FA_PREFIX . 'logging_enabled', false );
45 }
46
47 /**
48 * Logs the given message
49 *
50 * @param string $message - The message to log.
51 *
52 * @return void
53 */
54 public static function log( $message ) {
55 if ( self::is_logging_enabled() ) {
56 self::write_to_log( self::get_log_timestamp() . "\n" . $message . "\n" . __( 'Current memory usage: ', 'wp-2fa' ) . memory_get_usage( true ) . "\n" );
57 }
58 }
59
60 /**
61 * Retrieves the path to the log file
62 *
63 * @return string
64 */
65 private static function get_logging_dir_path() {
66 if ( strlen( self::$logging_dir_path ) === 0 ) {
67 $uploads_dir = wp_upload_dir( null, false );
68 self::$logging_dir_path = trailingslashit( trailingslashit( $uploads_dir['basedir'] ) . WP_2FA_LOGS_DIR );
69 }
70
71 return self::$logging_dir_path;
72 }
73
74 /**
75 * Write data to log file.
76 *
77 * @param string $data - Data to write to file.
78 * @param bool $override - Set to true if overriding the file.
79 * @return bool
80 */
81 private static function write_to_log( $data, $override = false ) {
82 $logging_dir_path = self::get_logging_dir_path();
83 if ( ! is_dir( $logging_dir_path ) ) {
84 self::create_index_file();
85 self::create_htaccess_file();
86 }
87
88 $log_file_name = gmdate( 'Y-m-d' );
89 return self::write_to_file( 'wp-2fa-debug-' . $log_file_name . '.log', $data, $override );
90 }
91
92 /**
93 * Create an index.php file, if none exists, in order to
94 * avoid directory listing in the specified directory.
95 *
96 * @return bool
97 */
98 private static function create_index_file() {
99 return self::write_to_file( 'index.php', '<?php // Silence is golden' );
100 }
101
102 /**
103 * Create an .htaccess file, if none exists, in order to
104 * block access to directory listing in the specified directory.
105 *
106 * @return bool
107 */
108 private static function create_htaccess_file() {
109 return self::write_to_file( '.htaccess', 'Deny from all' );
110 }
111
112 /**
113 * Write data to log file in the uploads directory.
114 *
115 * @param string $filename - File name.
116 * @param string $content - Contents of the file.
117 * @param bool $override - (Optional) True if overriding file contents.
118 * @return bool
119 */
120 private static function write_to_file( $filename, $content, $override = false ) {
121 global $wp_filesystem;
122 require_once ABSPATH . 'wp-admin/includes/file.php';
123 WP_Filesystem();
124
125 $logging_dir = self::get_logging_dir_path();
126
127 $result = false;
128
129 if ( ! is_dir( $logging_dir ) ) {
130 if ( false === wp_mkdir_p( $logging_dir ) ) {
131 return false;
132 }
133 }
134
135 $filepath = $logging_dir . $filename;
136 if ( ! $wp_filesystem->exists( $filepath ) || $override ) {
137 $result = $wp_filesystem->put_contents( $filepath, $content );
138 } else {
139 $existing_content = $wp_filesystem->get_contents( $filepath );
140 $result = $wp_filesystem->put_contents( $filepath, $existing_content . $content );
141 }
142
143 return $result;
144 }
145
146 /**
147 * Returns the timestamp for log files.
148 *
149 * @return string
150 */
151 private static function get_log_timestamp() {
152 return '[' . gmdate( 'd-M-Y H:i:s' ) . ' UTC]';
153 }
154 }
155 }
156