PluginProbe ʕ •ᴥ•ʔ
WP 2FA – Two-factor authentication for WordPress / 2.4.2
WP 2FA – Two-factor authentication for WordPress v2.4.2
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-migration.php
wp-2fa / includes / classes / Utils Last commit date
class-abstract-migration.php 3 years ago class-date-time-utils.php 3 years ago class-debugging.php 3 years ago class-generate-modal.php 3 years ago class-migration.php 3 years ago class-request-utils.php 3 years ago class-settings-utils.php 3 years ago class-user-utils.php 3 years ago index.php 5 years ago
class-migration.php
342 lines
1 <?php
2 /**
3 * Responsible for plugin updates.
4 *
5 * @package wp2fa
6 * @subpackage utils
7 * @copyright 2023 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 */
11
12 namespace WP2FA\Utils;
13
14 use WP2FA\Utils\Abstract_Migration;
15 use \WP2FA\Utils\User_Utils as User_Utils;
16 use WP2FA\Utils\Settings_Utils as Settings_Utils;
17
18 defined( 'ABSPATH' ) || exit; // Exit if accessed directly.
19
20 /**
21 * Migration class
22 */
23 if ( ! class_exists( '\WP2FA\Utils\Migration' ) ) {
24
25 /**
26 * Put all you migration methods here
27 *
28 * @package WP2FA\Utils
29 * @since 1.6
30 */
31 class Migration extends Abstract_Migration {
32
33 /**
34 * The name of the option from which we should extract version
35 * Note: version is expected in version format - 1.0.0; 1; 1.0; 1.0.0.0
36 * Note: only numbers will be processed
37 *
38 * @var string
39 *
40 * @since 1.6.0
41 */
42 protected static $version_option_name = WP_2FA_PREFIX . 'plugin_version';
43
44 /**
45 * The constant name where the plugin version is stored
46 * Note: version is expected in version format - 1.0.0; 1; 1.0; 1.0.0.0
47 * Note: only numbers will be processed
48 *
49 * @var string
50 *
51 * @since 1.6.0
52 */
53 protected static $const_name_of_plugin_version = 'WP_2FA_VERSION';
54
55 /**
56 * The name of the plugin settings
57 *
58 * @var string
59 */
60 private static $plugin_settings_name = WP_2FA_SETTINGS_NAME;
61
62 /**
63 * The name of the plugin policy settings
64 *
65 * @var string
66 */
67 private static $plugin_policy_name = WP_2FA_POLICY_SETTINGS_NAME;
68
69 /**
70 * The name of the plugin white label settings
71 *
72 * @var string
73 */
74 private static $plugin_white_label_name = WP_2FA_WHITE_LABEL_SETTINGS_NAME;
75
76 /**
77 * The name of the plugin email settings
78 *
79 * @var string
80 */
81 private static $plugin_email_settings_name = WP_2FA_EMAIL_SETTINGS_NAME;
82
83 /**
84 * Migration for version upto 1.6.0
85 *
86 * @return void
87 * @since 1.6.0
88 */
89 protected static function migrate_up_to_160() {
90 $settings = self::get_settings( self::$plugin_settings_name );
91 if ( ! is_array( $settings ) ) {
92 return;
93 }
94
95 $needs_update = false;
96
97 $settings_to_convert = array( 'enforced_roles', 'enforced_users', 'excluded_users', 'excluded_roles' );
98 foreach ( $settings_to_convert as $setting_name ) {
99 if ( array_key_exists( $setting_name, $settings ) && ! is_array( $settings[ $setting_name ] ) ) {
100 $settings[ $setting_name ] = array_filter(
101 explode( ',', $settings[ $setting_name ] )
102 );
103 $needs_update = true;
104 }
105 }
106
107 if ( ! isset( $settings['backup_codes_enabled'] ) ) {
108 $settings['backup_codes_enabled'] = 'yes';
109 $needs_update = true;
110 }
111
112 if ( $needs_update ) {
113 // Update settings.
114 self::set_settings( self::$plugin_settings_name, $settings );
115 }
116 }
117
118 /**
119 * Migration for version upto 1.6.2
120 *
121 * @return void
122 * @since 1.6.2
123 */
124 protected static function migrate_up_to_162() {
125 $settings = self::get_settings( self::$plugin_settings_name );
126 if ( ! is_array( $settings ) ) {
127 return;
128 }
129
130 $needs_update = false;
131
132 $settings_to_convert = array( 'excluded_sites' );
133 foreach ( $settings_to_convert as $setting_name ) {
134 if ( array_key_exists( $setting_name, $settings ) && ! is_array( $settings[ $setting_name ] ) ) {
135 $original_settings_split = array_filter(
136 explode( ',', $settings[ $setting_name ] )
137 );
138 $settings[ $setting_name ] = array();
139 foreach ( $original_settings_split as $value ) {
140 $settings[ $setting_name ][] = mb_substr( $value, mb_strrpos( $value, ':' ) + 1 );
141 }
142 $needs_update = true;
143 }
144 }
145
146 self::migrate_up_to_160();
147
148 if ( $needs_update ) {
149 // Update settings.
150 self::set_settings( self::$plugin_settings_name, $settings );
151 }
152 }
153
154 /**
155 * Migration for version upto 1.5.0
156 *
157 * @return void
158 */
159 protected static function migrate_up_to_150() {
160 $settings = self::get_settings( self::$plugin_settings_name );
161
162 if ( is_array( $settings ) && array_key_exists( 'enforcment-policy', $settings ) ) {
163 // Correct setting name.
164 $settings['enforcement-policy'] = $settings['enforcment-policy'];
165 // Remove old setting.
166 unset( $settings['enforcment-policy'] );
167 // Update settings.
168 self::set_settings( self::$plugin_settings_name, $settings );
169 }
170 }
171
172 /**
173 * Migration for version upto 1.7.0
174 *
175 * @return void
176 */
177 protected static function migrate_up_to_170() {
178 $settings = self::get_settings( self::$plugin_settings_name );
179
180 if ( is_array( $settings ) && array_key_exists( 'notify_users', $settings ) ) {
181 // Remove old setting.
182 unset( $settings['notify_users'] );
183 // Update settings.
184 self::set_settings( self::$plugin_settings_name, $settings );
185 }
186
187 $email_settings = self::get_settings( self::$plugin_email_settings_name );
188 $items_to_remove = array( 'send_enforced_email', 'enforced_email_subject', 'enforced_email_body' );
189
190 if ( is_array( $email_settings ) && User_Utils::in_array_all( $items_to_remove, $email_settings ) ) {
191 foreach ( $items_to_remove as $item ) {
192 if ( isset( $email_settings[ $item ] ) ) {
193 unset( $email_settings[ $item ] );
194 }
195 }
196 // Update settings.
197 self::set_settings( self::$plugin_email_settings_name, $email_settings );
198 }
199 }
200
201 /**
202 * Migration for version upto 2.0.0
203 * Separates the current settings into 3 different types of settings:
204 * - Policy
205 * - General
206 * - White label
207 *
208 * @return void
209 */
210 protected static function migrate_up_to_200() {
211 $settings = self::get_settings( self::$plugin_settings_name );
212
213 if ( is_array( $settings ) ) {
214
215 $new_settings_array = array_flip(
216 array(
217 'enable_grace_cron',
218 'limit_access',
219 'delete_data_upon_uninstall',
220 'enable_destroy_session',
221 )
222 );
223
224 $new_white_label_array = array_flip(
225 array(
226 'default-text-code-page',
227 )
228 );
229
230 $settings_array = array_intersect_key(
231 $settings,
232 $new_settings_array
233 );
234
235 $settings = array_diff_key( $settings, $new_settings_array );
236
237 self::set_settings( self::$plugin_settings_name, $settings_array );
238
239 $white_label_settings = array_intersect_key(
240 $settings,
241 $new_white_label_array
242 );
243
244 $settings = array_diff_key( $settings, $new_white_label_array );
245
246 self::set_settings( self::$plugin_white_label_name, $white_label_settings );
247
248 self::set_settings( self::$plugin_policy_name, $settings );
249 }
250 }
251
252 /**
253 * Migration for version upto 2.2.0
254 *
255 * @return void
256 */
257 protected static function migrate_up_to_220() {
258 global $wpdb;
259
260 $new_prefix = 'wp_2fa_trusted_device_';
261 $old_prefix = 'wp2fa_trusted_device_';
262
263 delete_transient( 'wp_2fa_config_file_hash' );
264
265 $wpdb->query(
266 $wpdb->prepare(
267 "
268 UPDATE $wpdb->usermeta
269 SET meta_key = REPLACE( meta_key, %s, %s )
270 WHERE meta_key LIKE %s
271 ",
272 array(
273 $old_prefix,
274 $new_prefix,
275 $old_prefix . '%',
276 )
277 )
278 );
279 }
280
281 /**
282 * Migration for version upto 2.3.0
283 *
284 * @return void
285 */
286 protected static function migrate_up_to_230() {
287
288 $version = self::get_settings( self::$version_option_name );
289
290 if ( $version && version_compare( $version, '2.2.1', '<=' ) ) {
291 $settings = self::get_settings( self::$plugin_white_label_name );
292
293 if ( isset( $settings['enable_wizard_styling'] ) ) {
294 $settings['enable_wizard_styling'] = false;
295 } else {
296 $settings = array();
297 $settings['enable_wizard_styling'] = false;
298 }
299
300 self::set_settings( self::$plugin_white_label_name, $settings );
301 }
302 }
303
304 /**
305 * Migration for version upto 2.4.0
306 *
307 * @return void
308 */
309 protected static function migrate_up_to_240() {
310
311 \delete_transient( 'wp_2fa_config_file_hash' );
312
313 if ( \wp_next_scheduled( 'wp_2fa_check_grace_period_status' ) ) {
314 \wp_clear_scheduled_hook( 'wp_2fa_check_grace_period_status' );
315 }
316 }
317
318 /**
319 * Returns the plugin settings by a given setting type
320 *
321 * @param mixed $setting_name - The setting which needs to be extracted.
322 *
323 * @return mixed
324 */
325 private static function get_settings( $setting_name ) {
326 return Settings_Utils::get_option( $setting_name );
327 }
328
329 /**
330 * Updates the plugin settings
331 *
332 * @param mixed $setting_name - The setting which needs to be updated.
333 * @param mixed $settings - The settings values.
334 *
335 * @return void
336 */
337 private static function set_settings( $setting_name, $settings ) {
338 Settings_Utils::update_option( $setting_name, $settings );
339 }
340 }
341 }
342