PluginProbe
Magic Login – Magic Link & Passwordless Authentication for WordPress – Login Without Password / 2.1
Magic Login – Magic Link & Passwordless Authentication for WordPress – Login Without Password v2.1
2.8.1 2.1 2.1.1 2.1.2 2.1.3 2.2 2.3 2.3.1 2.3.2 2.3.3 2.3.4 2.3.5 2.4 2.4.1 2.4.2 2.5 2.5.1 2.6 2.6.1 2.6.2 2.6.3 2.7 2.7.1 2.8 trunk All 48 releases
magic-login / includes / settings.php

settings.php in Magic Login – Magic Link & Passwordless Authentication for WordPress – Login Without Password 2.1, at includes/settings.php

911 lines 37.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Settings Page
4 *
5 * @package MagicLogin
6 */
7
8 namespace MagicLogin\Settings;
9
10 use const MagicLogin\Constants\BLOG_URL;
11 use const MagicLogin\Constants\DOCS_URL;
12 use const MagicLogin\Constants\FAQ_URL;
13 use const MagicLogin\Constants\GITHUB_URL;
14 use const MagicLogin\Constants\SUPPORT_URL;
15 use const MagicLogin\Constants\SETTING_OPTION;
16 use const MagicLogin\Constants\TWITTER_URL;
17 use function MagicLogin\Utils\delete_all_tokens;
18 use function MagicLogin\Utils\get_allowed_intervals;
19 use function MagicLogin\Utils\get_doc_url;
20 use function MagicLogin\Utils\get_ttl_with_interval;
21
22 // phpcs:disable WordPress.WhiteSpace.PrecisionAlignment.Found
23 // phpcs:disable Generic.WhiteSpace.DisallowSpaceIndent.SpacesUsed
24 // phpcs:disable WordPress.WP.I18n.MissingTranslatorsComment
25
26 /**
27 * Default setup routine
28 *
29 * @return void
30 */
31 function setup() {
32 if ( MAGIC_LOGIN_IS_NETWORK ) {
33 add_action( 'network_admin_menu', __NAMESPACE__ . '\\admin_menu' );
34 } else {
35 add_action( 'admin_menu', __NAMESPACE__ . '\\admin_menu' );
36 }
37
38 add_action( 'admin_init', __NAMESPACE__ . '\\save_settings' );
39 add_filter( 'admin_body_class', __NAMESPACE__ . '\\add_sui_admin_body_class' );
40 }
41
42 /**
43 * Add required class for shared UI
44 *
45 * @param string $classes css classes for admin area
46 *
47 * @return string
48 * @see https://wpmudev.github.io/shared-ui/installation/
49 */
50 function add_sui_admin_body_class( $classes ) {
51 $classes .= ' sui-2-12-24 ';
52
53 return $classes;
54 }
55
56
57 /**
58 * Add menu item
59 */
60 function admin_menu() {
61 $parent = MAGIC_LOGIN_IS_NETWORK ? 'settings.php' : 'options-general.php';
62
63 add_submenu_page(
64 $parent,
65 esc_html__( 'Magic Login', 'magic-login' ),
66 esc_html__( 'Magic Login', 'magic-login' ),
67 apply_filters( 'magic_login_admin_menu_cap', 'manage_options' ),
68 'magic-login',
69 __NAMESPACE__ . '\settings_page'
70 );
71 }
72
73 /**
74 * Settings page
75 */
76 function settings_page() {
77 $settings = \MagicLogin\Utils\get_settings();
78 ?>
79 <?php if ( is_network_admin() ) : ?>
80 <?php settings_errors(); ?>
81 <?php endif; ?>
82
83 <main class="sui-wrap">
84 <div class="sui-header">
85 <h1 class="sui-header-title">
86 <?php esc_html_e( 'Magic Login', 'magic-login' ); ?>
87 </h1>
88
89 <!-- Float element to Right -->
90 <div class="sui-actions-right">
91 <a href="<?php echo esc_url( DOCS_URL ); ?>" class="sui-button sui-button-blue" target="_blank">
92 <i class="sui-icon-academy" aria-hidden="true"></i>
93 <?php esc_html_e( 'Documentation', 'magic-login' ); ?>
94 </a>
95 </div>
96 </div>
97
98 <form method="post" action="">
99 <?php wp_nonce_field( 'magic_login_settings', 'magic_login_settings' ); ?>
100 <section class="sui-row-with-sidenav">
101
102 <!-- TAB: Regular -->
103 <div class="sui-box" data-tab="basic-options">
104
105 <div class="sui-box-header">
106 <h2 class="sui-box-title">
107 <?php esc_html_e( 'Settings', 'magic-login' ); ?>
108 </h2>
109 <div class="sui-actions-right sui-hidden-important" style="display: none;">
110 <button type="submit" class="sui-button sui-button-blue" id="magic-login-save-settings-top" data-msg="">
111 <i class="sui-icon-save" aria-hidden="true"></i>
112 <?php esc_html_e( 'Update settings', 'magic-login' ); ?>
113 </button>
114 </div>
115 </div>
116
117 <div class="sui-box-body sui-upsell-items">
118
119 <!-- Force Magic Login -->
120 <div class="sui-box-settings-row">
121 <div class="sui-box-settings-col-1">
122 <span class="sui-settings-label" for="force-magic-login"><?php esc_html_e( 'Force Magic Login', 'magic-login' ); ?></span>
123 <span class="sui-description"><?php esc_html_e( 'Change default login behaviour and use magic login as default login method.', 'magic-login' ); ?></span>
124 </div>
125
126 <div class="sui-box-settings-col-2">
127 <div class="sui-form-field">
128 <label for="is_default" class="sui-toggle">
129 <input type="checkbox"
130 value="1"
131 name="is_default"
132 id="is_default"
133 aria-labelledby="force-magic-login-label"
134 <?php checked( 1, $settings['is_default'] ); ?>
135 >
136 <span class="sui-toggle-slider" aria-hidden="true"></span>
137 <span id="force-magic-login-label" class="sui-toggle-label"><?php esc_html_e( 'Use magic login by default', 'magic-login' ); ?></span>
138 </label>
139 <span class="sui-description">
140 <?php
141 echo wp_kses_post(
142 sprintf(
143 /* translators: 1: Login URL with Magic Login flavour */
144 __( 'Magic login form is accessible <a href="%1$s">%1$s</a>', 'magic-login' ),
145 esc_url( site_url( 'wp-login.php?action=magic_login', 'login_post' ) )
146 )
147 );
148 ?>
149 </span>
150 <div class="sui-notice sui-notice-info" style="padding: 10px 20px 10px 0; margin:0;">
151 <div class="sui-notice-content">
152 <div class="sui-notice-message">
153 <span class="sui-notice-icon sui-icon-info sui-md" aria-hidden="true"></span>
154 <p>
155 <?php
156 echo wp_kses_post(
157 sprintf(
158 /* translators: 1: Magic Login shortcode 2: Documentation URL 3: 'Learn More' text */
159 __( 'In order to add a login form to any page, you can use shortcode <code>%1$s</code> or block. <a href="%2$s" target="_blank" rel="noopener">%3$s</a>' ),
160 '[magic_login_form]',
161 get_doc_url( 'add-login-form-to-a-page' ),
162 __( 'Learn More.', 'magic-login' )
163 )
164 );
165 ?>
166 </p>
167 </div>
168 </div>
169 </div>
170 </div>
171 </div>
172 </div>
173
174 <!-- Add to login form -->
175 <div class="sui-box-settings-row">
176 <div class="sui-box-settings-col-1">
177 <span class="sui-settings-label" for="force-magic-login"><?php esc_html_e( 'Show on Login Form', 'magic-login' ); ?></span>
178 <span class="sui-description"><?php esc_html_e( 'Adds magic login button to WordPress login form.', 'magic-login' ); ?></span>
179 </div>
180
181 <div class="sui-box-settings-col-2">
182 <div class="sui-form-field">
183 <label for="add_login_button" class="sui-toggle">
184 <input type="checkbox"
185 value="1"
186 name="add_login_button"
187 id="add_login_button"
188 aria-labelledby="add-to-login-form-label"
189 <?php checked( 1, $settings['add_login_button'] ); ?>
190 >
191 <span class="sui-toggle-slider" aria-hidden="true"></span>
192 <span id="add-to-login-form-label" class="sui-toggle-label"><?php esc_html_e( 'Add magic login button to standard login form', 'magic-login' ); ?></span>
193 </label>
194 </div>
195 </div>
196 </div>
197
198 <!-- TTL -->
199 <?php list( $token_ttl, $selected_interval ) = get_ttl_with_interval( $settings['token_ttl'] ); ?>
200 <?php $allowed_intervals = get_allowed_intervals(); ?>
201 <div class="sui-box-settings-row">
202 <div class="sui-box-settings-col-1">
203 <span class="sui-settings-label" id="token_ttl_label"><?php esc_html_e( 'Token Lifespan', 'magic-login' ); ?></span>
204 <span class="sui-description">
205 <?php esc_html_e( 'The TTL (time to live) of the login link. WP-Cron removes expired tokens.', 'magic-login' ); ?>
206 <a href="<?php echo esc_url( get_doc_url( 'token-lifespan' ) ); ?>" target="_blank"><?php esc_html_e( 'Learn More.', 'magic-login' ); ?></a>
207 </span>
208 </div>
209
210 <div class="sui-box-settings-col-2">
211 <div class="sui-form-field">
212 <input
213 name="token_ttl"
214 id="token_ttl"
215 class="sui-form-control sui-field-has-suffix"
216 aria-labelledby="token_ttl_label"
217 type="number"
218 value="<?php echo absint( $token_ttl ); ?>"
219 min="0"
220 />
221 <span class="sui-field-suffix">
222 <select id="token_interval" name="token_interval" class="sui-form-control">
223 <?php foreach ( $allowed_intervals as $val => $label ) : ?>
224 <option <?php selected( $val, $selected_interval ); ?> value="<?php echo esc_attr( $val ); ?>"><?php echo esc_html( $label ); ?></option>
225 <?php endforeach; ?>
226 </select>
227 </span>
228 </div>
229 </div>
230 </div>
231
232 <!-- Token Validity -->
233 <div class="sui-box-settings-row">
234 <div class="sui-box-settings-col-1">
235 <span class="sui-settings-label" id="token_validity_label"><?php esc_html_e( 'Token Validity', 'magic-login' ); ?></span>
236 <span class="sui-description">
237 <?php esc_html_e( 'Specify how many times a token can be used.', 'magic-login' ); ?>
238 <a href="<?php echo esc_url( get_doc_url( 'token-validity' ) ); ?>" target="_blank"><?php esc_html_e( 'Learn More.', 'magic-login' ); ?></a>
239 </span>
240 </div>
241
242 <div class="sui-box-settings-col-2">
243 <div class="sui-form-field">
244 <input
245 name="token_validity"
246 id="token_validity"
247 class="sui-form-control sui-field-has-suffix"
248 aria-labelledby="token_validity_label"
249 type="number"
250 value="<?php echo absint( $settings['token_validity'] ); ?>"
251 min="0"
252 max="10"
253 />
254 </div>
255 </div>
256 </div>
257
258 <!-- Auto Login links -->
259 <div class="sui-box-settings-row">
260 <div class="sui-box-settings-col-1">
261 <span class="sui-settings-label"><?php esc_html_e( 'Auto Login Links', 'magic-login' ); ?></span>
262 <span class="sui-description"><?php esc_html_e( 'If the recipient exists, automatically adds the login link to outgoing emails sent from WordPress. ', 'magic-login' ); ?></span>
263 </div>
264
265 <div class="sui-box-settings-col-2">
266 <div class="sui-form-field">
267 <label for="auto_login_links" class="sui-toggle">
268 <input type="checkbox"
269 value="1"
270 name="auto_login_links"
271 id="auto_login_links"
272 aria-labelledby="add-to-login-form-label"
273 <?php checked( 1, $settings['auto_login_links'] ); ?>
274 >
275 <span class="sui-toggle-slider" aria-hidden="true"></span>
276 <span id="add-to-login-form-label" class="sui-toggle-label"><?php esc_html_e( 'Add magic login links to outgoing emails', 'magic-login' ); ?></span>
277 <span class="sui-description">
278 <?php esc_html_e( 'This could be useful when there is an action waiting for the user. (eg: reply comment, complete shopping etc...)', 'magic-login' ); ?>
279 </span>
280 </label>
281 </div>
282 </div>
283 </div>
284
285 <!-- Woo Integration -->
286 <div class="sui-box-settings-row sui-disabled">
287 <div class="sui-box-settings-col-1">
288 <span class="sui-settings-label">
289 <?php esc_html_e( 'Enable Magic Login for WooCommerce', 'magic-login' ); ?>
290 <span class="sui-tag sui-tag-pro"><?php esc_html_e( 'Pro', 'magic-login' ); ?></span>
291 </span>
292 <span class="sui-description">
293 <?php esc_html_e( 'Integrates with WooCommerce login form.', 'magic-login' ); ?>
294 <a href="<?php echo esc_url( get_doc_url( 'woocommerce-integration' ) ); ?>" target="_blank"><?php esc_html_e( 'Learn More.', 'magic-login' ); ?></a>
295 </span>
296 </div>
297
298 <div class="sui-box-settings-col-2">
299 <div class="sui-form-field">
300 <label for="enable_woo_integration" class="sui-toggle">
301 <input type="checkbox"
302 value="1"
303 name="enable_woo_integration"
304 id="enable_woo_integration"
305 aria-labelledby="integrate-to-woocommerce-form-label"
306 aria-controls="woo-detail-controls"
307 <?php checked( 1, $settings['enable_woo_integration'] ); ?>
308 >
309 <span class="sui-toggle-slider" aria-hidden="true"></span>
310 <span id="integrate-to-woocommerce-form-label" class="sui-toggle-label"><?php esc_html_e( 'Integrate magic login with WooCommerce login form', 'magic-login' ); ?></span>
311 <span class="sui-description">
312 <?php esc_html_e( 'Streamline checkout experience for returning customers.', 'magic-login' ); ?>
313 </span>
314 </label>
315 </div>
316 <div style=" <?php echo( ! $settings['enable_woo_integration'] ? 'display:none' : '' ); ?>" tabindex="0" id="woo-detail-controls" class="sui-toggle-content sui-border-frame">
317 <div class="sui-form-field" role="radiogroup">
318 <span class="sui-label"><?php esc_html_e( 'Magic Login Form Position on WooCommerce', 'magic-login' ); ?></span>
319
320 <label for="woo_position_before" class="sui-radio">
321 <input
322 type="radio"
323 name="woo_position"
324 id="woo_position_before"
325 aria-labelledby="label-woo_position"
326 value="before"
327 <?php checked( 'before', $settings['woo_position'] ); ?>
328 />
329 <span aria-hidden="true"></span>
330 <span id="label-woo_position"><?php esc_html_e( 'Before WooCommerce Login Form', 'magic-login' ); ?></span>
331 </label>
332 <label for="woo_position_after" class="sui-radio">
333 <input
334 type="radio"
335 name="woo_position"
336 id="woo_position_after"
337 aria-labelledby="label-woo_position"
338 value="after"
339 <?php checked( 'after', $settings['woo_position'] ); ?>
340 />
341 <span aria-hidden="true"></span>
342 <span id="label-woo_position"><?php esc_html_e( 'After WooCommerce Login Form', 'magic-login' ); ?></span>
343 </label>
344 </div>
345 </div>
346 </div>
347 </div>
348
349 <!-- Brute Force Protection -->
350 <div class="sui-box-settings-row sui-disabled">
351 <div class="sui-box-settings-col-1">
352 <span class="sui-settings-label-with-tag">
353 <?php esc_html_e( 'Brute Force Protection', 'magic-login' ); ?>
354 <span class="sui-tag sui-tag-pro"><?php esc_html_e( 'Pro', 'magic-login' ); ?></span>
355 </span>
356 <span id="brute-force-protection-description" class="sui-description"><?php esc_html_e( 'Enable additional security mechanisms to limit login requests.', 'magic-login' ); ?></span>
357 </div>
358 <div class="sui-box-settings-col-2">
359 <div class="sui-form-field">
360 <label for="enable_brute_force_protection" class="sui-toggle">
361 <input type="checkbox"
362 value="1"
363 name="enable_brute_force_protection"
364 id="enable_brute_force_protection"
365 aria-describedby="brute-force-protection-description"
366 aria-controls="brute-force-protection-controls"
367 <?php checked( 1, $settings['enable_brute_force_protection'] ); ?>
368 >
369 <span class="sui-toggle-slider" aria-hidden="true"></span>
370 <span id="brute-force-protection-label" class="sui-toggle-label"><?php esc_html_e( 'Enable brute force protection', 'magic-login' ); ?></span>
371 <span class="sui-description">
372 </span>
373 </label>
374
375 <div style=" <?php echo( ! $settings['enable_brute_force_protection'] ? 'display:none' : '' ); ?>" tabindex="0" id="brute-force-protection-controls" class="sui-toggle-content sui-border-frame">
376 <div class="sui-form-field">
377 <?php
378 $brute_force_fields = array(
379 'brute_force_bantime' => array(
380 'min' => 1,
381 'max' => 1440,
382 ),
383 'brute_force_login_attempt' => array(
384 'min' => 1,
385 'max' => 100,
386 ),
387 'brute_force_login_time' => array(
388 'min' => 1,
389 'max' => 600,
390 ),
391 );
392 foreach ( $brute_force_fields as $field => $args ) {
393 ${$field . '_input'} = sprintf(
394 '<input
395 id="%1$s"
396 name="%1$s"
397 min="%2$d"
398 max="%3$d"
399 type="number"
400 class="sui-form-control sui-field-has-suffix"
401 value="%4$d"
402 >',
403 esc_attr( $field ),
404 absint( $args['min'] ),
405 absint( $args['max'] ),
406 absint( $settings[ $field ] )
407 );
408 }
409 /* translators: 1: Ban duration input 2: Trial count input 3: Interval input */
410 printf(
411 __( 'Block the IP address for %1$s minutes when it fails to login %2$s times in %3$s minutes.', 'magic-login' ), // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
412 $brute_force_bantime_input, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
413 $brute_force_login_attempt_input, // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
414 $brute_force_login_time_input // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
415 ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
416 ?>
417 </div>
418 </div>
419 </div>
420
421 </div>
422 </div>
423
424 <!-- Throttle -->
425 <div class="sui-box-settings-row sui-disabled">
426 <div class="sui-box-settings-col-1">
427 <span class="sui-settings-label-with-tag">
428 <?php esc_html_e( 'Login Request Throttling', 'magic-login' ); ?>
429 <span class="sui-tag sui-tag-pro"><?php esc_html_e( 'Pro', 'magic-login' ); ?></span>
430 </span>
431 <span id="magic-login-throttle-description" class="sui-description"><?php esc_html_e( 'Limit login URL generation for the given time span.', 'magic-login' ); ?></span>
432 </div>
433 <div class="sui-box-settings-col-2">
434 <div class="sui-form-field">
435 <label for="enable_login_throttling" class="sui-toggle">
436 <input
437 type="checkbox"
438 value="1"
439 name="enable_login_throttling"
440 id="enable_login_throttling"
441 aria-describedby="magic-login-throttle-description"
442 aria-controls="magic-login-throttle-controls"
443 <?php checked( 1, $settings['enable_login_throttling'] ); ?>
444 >
445 <span class="sui-toggle-slider" aria-hidden="true"></span>
446 <span id="magic-login-throttle-label" class="sui-toggle-label"><?php esc_html_e( 'Enable throttling' ); ?></span>
447 <span class="sui-description">
448 </span>
449 </label>
450
451 <div style=" <?php echo( ! $settings['enable_login_throttling'] ? 'display:none' : '' ); ?>" tabindex="0" id="magic-login-throttle-controls" class="sui-toggle-content sui-border-frame">
452 <div class="sui-form-field">
453 <?php esc_html_e( 'Allow to create maximum' ); ?>
454 <input
455 id="login_throttling_limit"
456 name="login_throttling_limit"
457 min="1"
458 max="30"
459 type="number"
460 class="sui-form-control sui-field-has-suffix"
461 value="<?php echo absint( $settings['login_throttling_limit'] ); ?>"
462 >
463 <?php esc_html_e( 'login links from the same IP within' ); ?>
464 <input
465 id="login_throttling_time"
466 name="login_throttling_time"
467 min="1"
468 max="1440"
469 type="number"
470 class="sui-form-control sui-field-has-suffix"
471 value="<?php echo absint( $settings['login_throttling_time'] ); ?>"
472 >
473 <?php esc_html_e( 'minutes.' ); ?>
474 </div>
475 </div>
476 </div>
477
478 </div>
479 </div>
480
481 <!-- IP Address Check -->
482 <div class="sui-box-settings-row sui-disabled">
483 <div class="sui-box-settings-col-1">
484 <span class="sui-settings-label">
485 <?php esc_html_e( 'IP Check', 'magic-login' ); ?>
486 <span class="sui-tag sui-tag-pro"><?php esc_html_e( 'Pro', 'magic-login' ); ?></span>
487 </span>
488 <span class="sui-description">
489 <?php esc_html_e( 'The user should log in from the same IP that makes a login request. (except for the login links generated via CLI)', 'magic-login' ); ?>
490 </span>
491 </div>
492
493 <div class="sui-box-settings-col-2">
494 <div class="sui-form-field">
495 <label for="enable_ip_check" class="sui-toggle">
496 <input
497 type="checkbox"
498 value="1"
499 name="enable_ip_check"
500 id="enable_ip_check"
501 aria-labelledby="enable-ip-check-label"
502 <?php checked( 1, $settings['enable_ip_check'] ); ?>
503 >
504 <span class="sui-toggle-slider" aria-hidden="true"></span>
505 <span id="enable-ip-check-label" class="sui-toggle-label"><?php esc_html_e( 'Enable IP address check', 'magic-login' ); ?></span>
506 </label>
507 </div>
508 </div>
509 </div>
510
511 <!-- Allowed Domain -->
512 <div class="sui-box-settings-row sui-disabled">
513 <div class="sui-box-settings-col-1">
514 <span class="sui-settings-label">
515 <?php esc_html_e( 'Domain Restriction', 'magic-login' ); ?>
516 <span class="sui-tag sui-tag-pro"><?php esc_html_e( 'Pro', 'magic-login' ); ?></span>
517 </span>
518 <span id="domain-restriction-description" class="sui-description"><?php esc_html_e( 'Allow only listed domains to login via magic links.', 'magic-login' ); ?></span>
519 </div>
520 <div class="sui-box-settings-col-2">
521 <div class="sui-form-field">
522 <label for="enable_domain_restriction" class="sui-toggle">
523 <input
524 type="checkbox"
525 value="1"
526 name="enable_domain_restriction"
527 id="enable_domain_restriction"
528 aria-describedby="enable-domain-restriction-description"
529 aria-controls="enable-domain-restriction-controls"
530 <?php checked( 1, $settings['enable_domain_restriction'] ); ?>
531 >
532 <span class="sui-toggle-slider" aria-hidden="true"></span>
533 <span id="domain-restriction-label" class="sui-toggle-label"><?php esc_html_e( 'Enable domain restriction', 'magic-login' ); ?></span>
534 <span class="sui-description">
535 </span>
536 </label>
537
538 <div style=" <?php echo( ! $settings['enable_domain_restriction'] ? 'display:none' : '' ); ?>" tabindex="0" id="enable-domain-restriction-controls" class="sui-toggle-content sui-border-frame">
539 <div class="sui-form-field">
540 <textarea
541 placeholder="example.com"
542 id="allowed_domains"
543 name="allowed_domains"
544 class="sui-form-control"
545 aria-describedby="allowed-domains-description"
546 rows="7"
547 ><?php echo esc_textarea( $settings['allowed_domains'] ); ?></textarea>
548 <span id="allowed-domains-description" class="sui-description"><?php esc_html_e( 'Enter allowed domains line by line.', 'magic-login' ); ?></span>
549 </div>
550 </div>
551 </div>
552
553 </div>
554 </div>
555
556 <!-- E-mail Subject -->
557 <div class="sui-box-settings-row sui-disabled">
558 <div class="sui-box-settings-col-1">
559 <span class="sui-settings-label" id="email_subject_label">
560 <?php esc_html_e( 'Email Subject', 'magic-login' ); ?>
561 <span class="sui-tag sui-tag-pro"><?php esc_html_e( 'Pro', 'magic-login' ); ?></span>
562 </span>
563 </div>
564
565 <div class="sui-box-settings-col-2">
566 <div class="sui-form-field">
567 <input
568 name="email_subject"
569 id="email_subject"
570 class="sui-form-control"
571 aria-labelledby="email_subject_label"
572 type="text"
573 value="<?php echo esc_attr( $settings['email_subject'] ); ?>"
574 />
575 </div>
576 </div>
577 </div>
578
579 <!-- E-mail Content -->
580 <div class="sui-box-settings-row sui-disabled">
581 <div class="sui-box-settings-col-2">
582 <div class="sui-form-field">
583 <!-- Email body -->
584 <div class="sui-form-field">
585 <label class="sui-settings-label sui-label sui-label-editor" for="login_email"><?php esc_html_e( 'Email Content', 'magic-login' ); ?>
586 <span class="sui-tag sui-tag-pro"><?php esc_html_e( 'Pro', 'magic-login' ); ?></span>
587 </span>
588 </label>
589 <?php
590 \wp_editor(
591 $settings['login_email'],
592 'login_email',
593 array(
594 'media_buttons' => false,
595 'textarea_name' => 'login_email',
596 'editor_css' => '',
597 'editor_height' => 192,
598 'drag_drop_upload' => false,
599 )
600 );
601 ?>
602 <span class="sui-description"><?php esc_html_e( 'Supported placeholders: {{SITEURL}}, {{USERNAME}}, {{FIRST_NAME}}, {{LAST_NAME}}, {{FULL_NAME}}, {{DISPLAY_NAME}}, {{USER_EMAIL}, {{SITENAME}}, {{EXPIRES}}, {{MAGIC_LINK}}, {{EXPIRES_WITH_INTERVAL}}, {{TOKEN_VALIDITY_COUNT}}', 'magic-login' ); ?></span>
603 </div>
604 </div>
605 </div>
606 </div>
607
608 <!-- Login redirect settings -->
609 <div class="sui-box-settings-row sui-disabled">
610
611 <div class="sui-box-settings-col-1">
612 <span class="sui-settings-label"><?php esc_html_e( 'Login Redirect', 'magic-login' ); ?>
613 <span class="sui-tag sui-tag-pro"><?php esc_html_e( 'Pro', 'magic-login' ); ?></span>
614 </span>
615 <span class="sui-description"><?php esc_html_e( 'Redirect users to custom URL after login.', 'magic-login' ); ?></span>
616 </div>
617
618 <div class="sui-box-settings-col-2">
619
620 <div class="sui-form-field">
621 <label for="enable_login_redirection" class="sui-toggle">
622 <input
623 type="checkbox"
624 id="enable_login_redirection"
625 name="enable_login_redirection"
626 aria-labelledby="enable-login-redirection-label"
627 aria-controls="login-redirection-controls"
628 <?php checked( 1, $settings['enable_login_redirection'] ); ?>
629 >
630 <span class="sui-toggle-slider" aria-hidden="true"></span>
631 <span id="enable-login-redirection-label" class="sui-toggle-label"><?php esc_html_e( 'Enable custom login redirection', 'magic-login' ); ?></span>
632 </label>
633
634 <div style=" <?php echo( ! $settings['enable_login_redirection'] ? 'display:none' : '' ); ?>" tabindex="0" id="login-redirection-controls" class="sui-toggle-content sui-border-frame">
635
636 <div class="sui-form-field">
637 <label for="default_redirection_url" id="label-login-redirection-url" class="sui-label"><?php esc_html_e( 'Target URL:', 'magic-login' ); ?></label>
638 <input
639 placeholder="https://example.com/wp-admin"
640 id="default_redirection_url"
641 name="default_redirection_url"
642 class="sui-form-control"
643 aria-labelledby="label-login-redirection-url"
644 aria-describedby="error-login-redirection-url description-login-redirection-url"
645 value="<?php echo esc_url( $settings['default_redirection_url'] ); ?>"
646 />
647 <span id="description-login-redirection-url" class="sui-description"><?php esc_html_e( 'By default it redirects to admin dashboard', 'magic-login' ); ?></span>
648 </div>
649
650 <div class="sui-form-field">
651 <label for="enable_wp_login_redirection" class="sui-toggle">
652 <input type="checkbox"
653 value="1"
654 id="enable_wp_login_redirection"
655 name="enable_wp_login_redirection"
656 aria-labelledby="enable-wp-login-redirection-label"
657 aria-describedby="enable-wp-login-redirection-description"
658 aria-controls="enable-wp-login-redirection-controls"
659 <?php checked( 1, $settings['enable_wp_login_redirection'] ); ?>
660 >
661 <span class="sui-toggle-slider" aria-hidden="true"></span>
662 <span id="enable-wp-login-redirection-label" class="sui-toggle-label"><?php esc_html_e( 'Apply redirection to normal WordPress login too.', 'magic-login' ); ?></span>
663 <span class="sui-description"><?php esc_html_e( 'Enable this option to apply redirection rules for both password and passwordless logins, ensuring a seamless navigation experience post-login.', 'magic-login' ); ?></span>
664 </label>
665 </div>
666
667 <div class="sui-form-field">
668 <label for="enforce_redirection_rules" class="sui-toggle">
669 <input type="checkbox"
670 value="1"
671 id="enforce_redirection_rules"
672 name="enforce_redirection_rules"
673 aria-labelledby="enforce-redirection-rules-label"
674 aria-describedby="enforce-redirection-rules-description"
675 <?php checked( 1, $settings['enforce_redirection_rules'] ); ?>
676 >
677 <span class="sui-toggle-slider" aria-hidden="true"></span>
678 <span id="enforce-redirection-rules-label" class="sui-toggle-label"><?php esc_html_e( 'Override block/shortcode specific redirections.', 'magic-login' ); ?></span>
679 <span class="sui-description"><?php esc_html_e( 'When this option is enabled, block/shortcode-based redirections will be ignored.', 'magic-login' ); ?></span>
680 </label>
681 </div>
682
683 <div class="sui-form-field">
684 <label for="enable_role_based_redirection" class="sui-toggle">
685 <input type="checkbox"
686 value="1"
687 id="enable_role_based_redirection"
688 name="enable_role_based_redirection"
689 aria-labelledby="enable-role-based-redirection-label"
690 aria-describedby="enable-role-based-redirection-description"
691 aria-controls="enable-role-based-redirection-controls"
692 <?php checked( 1, $settings['enable_role_based_redirection'] ); ?>
693 >
694 <span class="sui-toggle-slider" aria-hidden="true"></span>
695 <span id="enable-role-based-redirection-label" class="sui-toggle-label"><?php esc_html_e( 'Enable role-based redirection.', 'magic-login' ); ?></span>
696 <span id="description-role-based-login-redirect" class="sui-description"><?php esc_html_e( 'Leave it blank to use default redirection rule.', 'magic-login' ); ?></span>
697 </label>
698 </div>
699
700 <div style=" <?php echo( ! $settings['enable_role_based_redirection'] ? 'display:none' : '' ); ?>" tabindex="0" id="enable-role-based-redirection-controls" class="sui-toggle-content sui-border-frame">
701 <?php
702 $all_roles = wp_roles();
703 $roles = $all_roles->roles ? $all_roles->roles : [];
704 ?>
705 <table class="sui-table">
706 <thead>
707 <tr>
708 <th><?php esc_html_e( 'Role', 'magic-login' ); ?></th>
709 <th><?php esc_html_e( 'Target URL', 'magic-login' ); ?></th>
710 </tr>
711 </thead>
712
713 <tbody>
714
715 <?php if ( $roles ) : ?>
716 <?php foreach ( $roles as $role => $role_details ) : ?>
717 <tr>
718 <td class="sui-table-item-title"><?php echo esc_html( $role_details['name'] ); ?></td>
719 <td><input
720 type="text"
721 name="redirect_role[<?php echo esc_attr( $role ); ?>]"
722 class="sui-form-control"
723 value="<?php echo( isset( $settings['role_based_redirection_rules'][ $role ] ) ? esc_url( $settings['role_based_redirection_rules'][ $role ] ) : '' ); ?>"
724 /></td>
725 </tr>
726 <?php endforeach; ?>
727 <?php endif; ?>
728
729 </tbody>
730
731 <tfoot>
732 </tfoot>
733
734 </table>
735 </div>
736
737 </div>
738
739 </div>
740 </div>
741
742 </div>
743
744 <!-- Ajaxify magic login request -->
745 <div class="sui-box-settings-row">
746 <div class="sui-box-settings-col-1">
747 <span class="sui-settings-label" for="ajax-magic-login"><?php esc_html_e( 'Enable AJAX', 'magic-login' ); ?></span>
748 <span class="sui-description"><?php esc_html_e( 'It will ajaxify the login requests on pages that use shortcode or block.', 'magic-login' ); ?></span>
749 </div>
750
751 <div class="sui-box-settings-col-2">
752 <div class="sui-form-field">
753 <label for="enable_ajax" class="sui-toggle">
754 <input type="checkbox"
755 value="1"
756 name="enable_ajax"
757 id="enable_ajax"
758 aria-labelledby="enable-ajax-form-label"
759 <?php checked( 1, $settings['enable_ajax'] ); ?>
760 >
761 <span class="sui-toggle-slider" aria-hidden="true"></span>
762 <span id="enable-ajax-form-label" class="sui-toggle-label"><?php esc_html_e( 'Enable AJAX for requesting magic login links.', 'magic-login' ); ?></span>
763 <span class="sui-description"><?php esc_html_e( 'It allows to send links without refreshing the current page.', 'magic-login' ); ?></span>
764 </label>
765 </div>
766 </div>
767 </div>
768
769 <!-- Reset Tokens -->
770 <div class="sui-box-settings-row">
771 <div class="sui-box-settings-col-1">
772 <span class="sui-settings-label"><?php esc_html_e( 'Reset Tokens', 'magic-login' ); ?></span>
773 <span id="reset-tokens" class="sui-description"><?php esc_html_e( 'If you want to clean all tokens at once click to reset button.', 'magic-login' ); ?></span>
774 </div>
775 <div class="sui-box-settings-col-2">
776 <div class="sui-form-field">
777 <input type="submit" name="reset_tokens" id="reset_tokens" aria-describedby="reset-tokens" class="sui-button sui-button-ghost" value="<?php echo esc_attr( __( 'Reset', 'magic-login' ) ); ?>">
778 </div>
779 </div>
780 </div>
781
782 <!-- Upsell ads -->
783 <div class="sui-box-settings-row sui-upsell-row">
784 <div class="sui-upsell-notice" style="padding-left: 0;">
785 <p><?php esc_html_e( 'With our pro version of magic login, you will unlock the advanced configurations of the plugin and get access to the WP-CLI command along with our premium support.' ); ?><br>
786 <a href="https://handyplugins.co/magic-login-pro/?utm_source=wp_admin&utm_medium=plugin&utm_campaign=settings_page" rel="noopener noreferrer nofollow" target="_blank" class="sui-button sui-button-purple" style="margin-top: 10px;color:#fff;"><?php esc_html_e( 'Try Magic Login Pro Today', 'magic-login' ); ?></a>
787 </p>
788 </div>
789 </div>
790
791 </div>
792
793 <div class="sui-box-footer">
794 <div class="sui-actions-left">
795 <button type="submit" class="sui-button sui-button-blue" id="magic-login-save-settings" data-msg="">
796 <i class="sui-icon-save" aria-hidden="true"></i>
797 <?php esc_html_e( 'Update settings', 'magic-login' ); ?>
798 </button>
799 </div>
800 </div>
801
802 </div>
803 </section>
804
805 </form>
806
807 <!-- ELEMENT: The Brand -->
808 <div class="sui-footer">
809 <?php
810 echo wp_kses_post(
811 sprintf(
812 /* translators: %s: HandyPlugins URL */
813 __( 'Made with <i class="sui-icon-heart"></i> by <a href="%s" rel="noopener" target="_blank">HandyPlugins</a>', 'magic-login' ),
814 'https://handyplugins.co/'
815 )
816 );
817 ?>
818 </div>
819
820 <footer>
821 <!-- ELEMENT: Navigation -->
822 <ul class="sui-footer-nav">
823 <li><a href="<?php echo esc_url_raw( FAQ_URL ); ?>" target="_blank"><?php esc_html_e( 'FAQ', 'magic-login' ); ?></a></li>
824 <li><a href="<?php echo esc_url( BLOG_URL ); ?>" target="_blank"><?php esc_html_e( 'Blog', 'magic-login' ); ?></a></li>
825 <li><a href="<?php echo esc_url( SUPPORT_URL ); ?>" target="_blank"><?php esc_html_e( 'Support', 'magic-login' ); ?></a></li>
826 <li><a href="<?php echo esc_url( DOCS_URL ); ?>" target="_blank"><?php esc_html_e( 'Docs', 'magic-login' ); ?></a></li>
827 </ul>
828
829 <!-- ELEMENT: Social Media -->
830 <ul class="sui-footer-social">
831 <li><a href="<?php echo esc_url( GITHUB_URL ); ?>" target="_blank">
832 <i class="sui-icon-social-github" aria-hidden="true"></i>
833 <span class="sui-screen-reader-text">GitHub</span>
834 </a></li>
835 <li><a href="<?php echo esc_url( TWITTER_URL ); ?>" target="_blank">
836 <i class="sui-icon-social-twitter" aria-hidden="true"></i></a>
837 <span class="sui-screen-reader-text">Twitter</span>
838 </li>
839 </ul>
840 </footer>
841
842 </main>
843
844 <?php
845 }
846
847 /**
848 * Save settings
849 */
850 function save_settings() {
851
852 if ( ! is_user_logged_in() ) {
853 return;
854 }
855
856 $nonce = filter_input( INPUT_POST, 'magic_login_settings', FILTER_SANITIZE_SPECIAL_CHARS );
857 if ( wp_verify_nonce( $nonce, 'magic_login_settings' ) ) {
858
859 if ( isset( $_POST['reset_tokens'] ) ) {
860 if ( false !== delete_all_tokens() ) {
861 add_settings_error( SETTING_OPTION, 'magic-login', esc_html__( 'Tokens has been removed.', 'magic-login' ), 'success' );
862 } else {
863 add_settings_error( SETTING_OPTION, 'magic-login', esc_html__( 'Tokens could not be removed.', 'magic-login' ), 'error' );
864 }
865
866 return;
867 }
868
869 $settings = [];
870 $settings['is_default'] = boolval( filter_input( INPUT_POST, 'is_default' ) );
871 $settings['add_login_button'] = boolval( filter_input( INPUT_POST, 'add_login_button' ) );
872 $settings['token_ttl'] = absint( filter_input( INPUT_POST, 'token_ttl' ) );
873 $settings['token_validity'] = absint( filter_input( INPUT_POST, 'token_validity' ) );
874 $settings['auto_login_links'] = boolval( filter_input( INPUT_POST, 'auto_login_links' ) );
875 $settings['enable_ajax'] = boolval( filter_input( INPUT_POST, 'enable_ajax' ) );
876
877 // convert TTL in minute
878 if ( isset( $_POST['token_ttl'] ) && $_POST['token_ttl'] > 0 && isset( $_POST['token_interval'] ) ) {
879 switch ( $_POST['token_interval'] ) {
880 case 'DAY':
881 $settings['token_ttl'] = absint( $_POST['token_ttl'] ) * 1440;
882 break;
883 case 'HOUR':
884 $settings['token_ttl'] = absint( $_POST['token_ttl'] ) * 60;
885 break;
886 case 'MINUTE':
887 default:
888 $settings['token_ttl'] = absint( $_POST['token_ttl'] ) * 1;
889 }
890 }
891
892 $token_interval = sanitize_text_field( filter_input( INPUT_POST, 'token_interval' ) );
893 $allowed_intervals = get_allowed_intervals();
894
895 if ( isset( $allowed_intervals[ $token_interval ] ) ) {
896 $settings['token_interval'] = $token_interval;
897 }
898
899 if ( MAGIC_LOGIN_IS_NETWORK ) {
900 update_site_option( SETTING_OPTION, $settings );
901 } else {
902 update_option( SETTING_OPTION, $settings );
903 }
904
905 add_settings_error( SETTING_OPTION, 'magic-login', esc_html__( 'Settings saved.', 'magic-login' ), 'success' );
906
907 return;
908 }
909
910 }
911