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