Plugin Directory

Changeset 3338906


Ignore:
Timestamp:
08/04/2025 11:13:07 AM (8 months ago)
Author:
endisha
Message:

Release 1.1.0

Location:
secure-passkeys/trunk
Files:
2 added
13 deleted
28 edited

Legend:

Unmodified
Added
Removed
  • secure-passkeys/trunk/assets/admin/css/profile.css

    r3262385 r3338906  
    102102.secure-passkeys .register-passkey-card .regular-text {
    103103  padding: 4px;
     104}
     105
     106.secure-passkeys .register-passkey-card .multiline-text {
     107  white-space: pre-line;
    104108}
    105109
  • secure-passkeys/trunk/assets/admin/js/settings.js

    r3262385 r3338906  
    88        registration_maximum_passkeys_per_user: 3,
    99        excluded_roles_registration_login: [],
     10        auto_generate_security_key_name: 0,
    1011        registration_timeout: 5,
    1112        registration_exclude_credentials_enabled: 1,
     
    111112        display_passkey_login_memberpress_enabled: 1,
    112113        display_passkey_login_edd_enabled: 1,
     114        display_passkey_login_ultimate_member_enabled: 1,
    113115        display_passkey_users_list_enabled: 1,
    114116        display_passkey_edit_user_enabled: 1,
     
    208210        challenge_cleanup_days: 0,
    209211        log_cleanup_days: 0,
     212        stop_log_records_enabled: 0,
    210213      },
    211214      defaults: {},
  • secure-passkeys/trunk/assets/frontend/css/login.css

    r3262385 r3338906  
    9191  padding: 10px !important;
    9292}
     93
     94/* Ultimate Member */
     95.secure-passkey-login-ultimate-member-wrapper .is-error {
     96  margin-top: 10px;
     97  margin-bottom: 10px;
     98}
     99
     100.secure-passkey-login-ultimate-member-wrapper .is-success {
     101  margin-top: 10px !important;
     102  margin-bottom: 10px !important;
     103}
  • secure-passkeys/trunk/assets/frontend/css/register.css

    r3262385 r3338906  
    289289  line-height: inherit;
    290290}
     291
     292#passkey_app .multiline-text {
     293  white-space: pre-line;
     294}
  • secure-passkeys/trunk/readme.txt

    r3262385 r3338906  
    44Requires at least: 6.0
    55Requires PHP: 7.4
    6 Tested up to: 6.7
    7 Stable tag: 1.0.0
     6Tested up to: 6.8
     7Stable tag: 1.1.0
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    2828    * MemberPress login form
    2929    * Easy Digital Downloads login form
     30    * Ultimate Member login form
    3031* **Admin Management:**  Administrators can delete, activate, or deactivate users directly from plugin settings or user profiles.
    3132* **Activity Logging:**  Monitor activity logs and track last login/registration of passkeys.
     
    7071After activating the plugin, a "Secure Passkeys" menu item will appear in your WordPress admin dashboard's sidebar.
    7172
    72 = How can I add an ew theme for frontend shortc? =
     73= How can I add a new theme for frontend shortcodes? =
    7374
    7475You can add a custom theme for frontend shortcodes using the `secure_passkeys_themes` and `secure_passkeys_themes_paths` filters.
     
    99100**Override Template Files:**  Copy the template files you wish to customize from `secure-passkeys/src/views/frontend/default/` to your custom theme's folder (your/path/to/new/theme/folder).  Any files not copied to your custom theme folder will be loaded from the plugin's default theme, providing a fallback mechanism.  This allows you to customize only the files you need to change.
    100101
     102= How can I redirect users to a custom page after they log in using a passkey? =
     103
     104Yes, you can redirect users after a passkey login by using the `secure_passkeys_login_redirect_url` filter. You can add the following code snippets to your theme's `functions.php` file.
     105
     106**Example – Redirect to a Specific URL:**
     107
     108This example redirects all users to a specific URL after they log in.
     109
     110`
     111<?php
     112
     113add_filter('secure_passkeys_login_redirect_url', function ($redirect_to) {
     114    // Redirect users to a custom URL after logging in with a passkey
     115    return 'https://your-domain.com/your-custom-path';
     116});
     117`
     118
     119**Example – Redirect Based on User Role:**
     120
     121This example redirects users based on their assigned role.
     122
     123`
     124<?php
     125
     126add_filter('secure_passkeys_login_redirect_url', function ($redirect_to) {
     127    $user = wp_get_current_user();
     128
     129    // Redirect administrators to the WP admin dashboard
     130    if (in_array('administrator', $user->roles)) {
     131        return admin_url();
     132    }
     133
     134    // Redirect subscribers to a custom dashboard page
     135    if (in_array('subscriber', $user->roles)) {
     136        return home_url('/dashboard');
     137    }
     138
     139    // Default fallback URL
     140    return $redirect_to;
     141});
     142`
     143
    101144= Are there other filters and actions? =
    102145
     
    106149
    107150== Changelog ==
     151= 1.1.0 2025-08-04 =
     152* Add - Added support for the Ultimate Member plugin.
     153* Add - Added an option to automatically generate security key name for new passkeys, so users are no longer required to enter one manually.
     154* Add - Added an option to disable the logging of user activity.
     155* Tweak - Added `extra_wrapper_classes` and `extra_button_classes` attributes to the `[secure_passkeys_login_form]` shortcode for easier CSS customization.
     156* Fix - Corrected an issue where the `used_at` timestamp for a challenge was not being updated correctly in the database.
     157* Fix - Removed the `Accept-Encoding` header from the fingerprint calculation to prevent potential validation errors.
     158* Fix - Improved localization by removing HTML from translatable strings, ensuring they can be translated properly.
     159* Fix - Resolved a PHP warning on the "Activity Log" caused by an attempt to process a non-existent `is_active` property on log records.
     160
    108161= 1.0.0 2025-03-05 =
    109162* Initial release.
  • secure-passkeys/trunk/secure-passkeys.php

    r3262385 r3338906  
    77 * Author: Mohamed Endisha
    88 * Author URI: https://endisha.ly
    9  * Version: 1.0.0
     9 * Version: 1.1.0
    1010 * Text Domain: secure-passkeys
    1111 * Domain Path: /src/languages/
     
    1818defined('ABSPATH') || exit;
    1919
    20 define('SECURE_PASSKEYS_VERSION', '1.0.0');
     20define('SECURE_PASSKEYS_VERSION', '1.1.0');
    2121define('SECURE_PASSKEYS_PLUGIN_FILE', __FILE__);
    2222define('SECURE_PASSKEYS_PLUGIN_DIR', __DIR__);
  • secure-passkeys/trunk/src/ajax/secure-passkeys-adminarea-ajax.php

    r3262385 r3338906  
    216216        array_map(function ($record) {
    217217            $aaguid_friendly_name = Secure_Passkeys_Webauthn_Helper::get_friendly_name($record->aaguid);
    218             $record->is_active = intval($record->is_active);
    219218            $record->localized_log_type = Secure_Passkeys_Log::get_localized_log_type($record->log_type);
    220219            $record->description = Secure_Passkeys_Log::get_log_line($record->log_type, $record->security_key_name, $aaguid_friendly_name);
  • secure-passkeys/trunk/src/ajax/secure-passkeys-frontend-ajax.php

    r3262385 r3338906  
    33namespace Secure_Passkeys\Ajax;
    44
     5use DateTime;
    56use Exception;
    67use Secure_Passkeys\Actions\Secure_Passkeys_Web_Authn_Enable_Action;
     
    141142        $user_id = get_current_user_id();
    142143        $challenge = sanitize_text_field(wp_unslash($_POST['challenge'] ?? ''));
    143         $security_key_name = sanitize_text_field(wp_unslash($_POST['security_key_name'] ?? ''));
     144
     145        $is_auto_generate_security_key_name_enabled = Secure_Passkeys_Helper::is_auto_generate_security_key_name_enabled();
     146
     147        if (!$is_auto_generate_security_key_name_enabled) {
     148            $security_key_name = sanitize_text_field(wp_unslash($_POST['security_key_name'] ?? ''));
     149        } else {
     150            $security_key_name = (new DateTime())->format('YmdHis');
     151            $security_key_name = apply_filters('secure_passkeys_auto_generate_security_key_name', 'Passkey-' . $security_key_name, $user_id, $security_key_name);
     152        }
    144153
    145154        try {
     
    155164        }
    156165
    157         if (empty($security_key_name)) {
    158             wp_send_json_error('EMPTY_SECURITY_KEY_NAME');
    159         } elseif (mb_strlen($security_key_name) < 3) {
    160             wp_send_json_error(__('Security key name must be at least 3 characters long.', 'secure-passkeys'));
    161         } elseif (mb_strlen($security_key_name) > 30) {
    162             wp_send_json_error(__('Security key name must be at most 30 characters long.', 'secure-passkeys'));
    163         } elseif (!preg_match('/^[A-Za-z0-9\s\-_]+$/', $security_key_name)) {
    164             wp_send_json_error(__('Please use only letters, numbers, spaces, hyphens, or underscores.', 'secure-passkeys'));
     166        if (!$is_auto_generate_security_key_name_enabled) {
     167            if (empty($security_key_name)) {
     168                wp_send_json_error('EMPTY_SECURITY_KEY_NAME');
     169            } elseif (mb_strlen($security_key_name) < 3) {
     170                wp_send_json_error(__('Security key name must be at least 3 characters long.', 'secure-passkeys'));
     171            } elseif (mb_strlen($security_key_name) > 30) {
     172                wp_send_json_error(__('Security key name must be at most 30 characters long.', 'secure-passkeys'));
     173            } elseif (!preg_match('/^[A-Za-z0-9\s\-_]+$/', $security_key_name)) {
     174                wp_send_json_error(__('Please use only letters, numbers, spaces, hyphens, or underscores.', 'secure-passkeys'));
     175            }
    165176        }
    166177
  • secure-passkeys/trunk/src/core/secure-passkeys-application.php

    r3262385 r3338906  
    1919        register_activation_hook(SECURE_PASSKEYS_PLUGIN_FILE, [$this, 'register_default_settings']);
    2020
    21         register_deactivation_hook(SECURE_PASSKEYS_PLUGIN_FILE, [$this, 'unregister']);
     21        register_deactivation_hook(SECURE_PASSKEYS_PLUGIN_FILE, [$this, 'unregister_jobs']);
    2222
    2323        add_action('activated_plugin', [$this, 'activation']);
     
    125125        $jobs = Secure_Passkeys_Loader::folder_loader(SECURE_PASSKEYS_JOBS_DIR, SECURE_PASSKEYS_PLUGIN_DIR);
    126126
    127         if (!empty($jobs)) {
    128             foreach ($jobs as $instance) {
    129                 if ($instance instanceof Secure_Passkeys_Scheduler) {
    130                     if (method_exists($instance, 'boot')) {
    131                         $instance->boot();
    132                     }
    133                 }
     127        if (empty($jobs)) {
     128            return;
     129        }
     130
     131        foreach ($jobs as $instance) {
     132            if ($instance instanceof Secure_Passkeys_Scheduler && method_exists($instance, 'boot')) {
     133                $instance->boot();
    134134            }
    135135        }
     
    139139     * Unregister jobs
    140140     */
    141     public function unregister()
     141    public function unregister_jobs()
    142142    {
    143143        $jobs = Secure_Passkeys_Loader::folder_loader(SECURE_PASSKEYS_JOBS_DIR, SECURE_PASSKEYS_PLUGIN_DIR);
    144144
    145         if (!empty($jobs)) {
    146             foreach ($jobs as $instance) {
    147                 if ($instance instanceof Secure_Passkeys_Scheduler) {
    148                     $instance->unregister();
    149                 }
     145        if (empty($jobs)) {
     146            return;
     147        }
     148
     149        foreach ($jobs as $instance) {
     150            if ($instance instanceof Secure_Passkeys_Scheduler) {
     151                $instance->unregister();
    150152            }
    151153        }
  • secure-passkeys/trunk/src/includes/secure-passkeys-frontend.php

    r3262385 r3338906  
    2626        add_action('edd_login_fields_after', [$this, 'add_to_edd_login_page']);
    2727        add_action('mepr-login-form-after-submit', [$this, 'add_to_memberpress_login_page']);
     28        add_action('um_after_login_fields', [$this, 'add_to_ultimate_member_login_page'], 10005);
    2829
    2930        add_action('wp_enqueue_scripts', [$this, 'enqueue_register_script']);
     
    6768    public function add_to_woocommerce_login_page()
    6869    {
    69         if (!Secure_Passkeys_Helper::get_option('display_passkey_login_woocommerce_enabled', 1)) {
     70        if (!Secure_Passkeys_Helper::get_option('display_passkey_login_woocommerce_enabled', 0)) {
    7071            return;
    7172        }
     
    8485    public function add_to_memberpress_login_page()
    8586    {
    86         if (!Secure_Passkeys_Helper::get_option('display_passkey_login_memberpress_enabled', 1)) {
     87        if (!Secure_Passkeys_Helper::get_option('display_passkey_login_memberpress_enabled', 0)) {
    8788            return;
    8889        }
     
    101102    public function add_to_edd_login_page()
    102103    {
    103         if (!Secure_Passkeys_Helper::get_option('display_passkey_login_edd_enabled', 1)) {
     104        if (!Secure_Passkeys_Helper::get_option('display_passkey_login_edd_enabled', 0)) {
    104105            return;
    105106        }
     
    116117    }
    117118
    118     public function render_shortcode_login_form()
    119     {
    120         if (is_user_logged_in()) {
    121             return;
    122         }
    123 
    124         wp_enqueue_script($this->login_handle);
    125 
    126         wp_enqueue_style($this->login_handle);
    127 
    128         return Secure_Passkeys_Frontend_Helper::include_view_frontend_file('login.shortcode', [], true);
     119    public function add_to_ultimate_member_login_page()
     120    {
     121        if (!Secure_Passkeys_Helper::get_option('display_passkey_login_ultimate_member_enabled', 0)) {
     122            return;
     123        }
     124
     125        if (is_user_logged_in()) {
     126            return;
     127        }
     128
     129        wp_enqueue_script($this->login_handle);
     130
     131        wp_enqueue_style($this->login_handle);
     132
     133        return Secure_Passkeys_Frontend_Helper::include_view_frontend_file('login.ultimate_member');
     134    }
     135
     136
     137    public function render_shortcode_login_form($atts)
     138    {
     139        if (is_user_logged_in()) {
     140            return;
     141        }
     142
     143        wp_enqueue_script($this->login_handle);
     144
     145        wp_enqueue_style($this->login_handle);
     146
     147        $custom_atts = apply_filters('secure_passkeys_login_form_shortcode_atts', [
     148            'extra_wrapper_classes' => '',
     149            'extra_button_classes' => ''
     150        ]);
     151
     152        $atts = shortcode_atts($custom_atts, $atts, 'secure_passkeys_login_form');
     153
     154        return Secure_Passkeys_Frontend_Helper::include_view_frontend_file('login.shortcode', $atts, true);
    129155    }
    130156
  • secure-passkeys/trunk/src/languages/secure-passkeys-ar.po

    r3262385 r3338906  
    33"Project-Id-Version: Secure Passkeys\n"
    44"Report-Msgid-Bugs-To: \n"
    5 "POT-Creation-Date: 2025-02-25 18:00+0200\n"
    6 "PO-Revision-Date: 2025-02-25 18:00+0200\n"
     5"POT-Creation-Date: 2025-08-04 12:17+0200\n"
     6"PO-Revision-Date: 2025-08-04 12:17+0200\n"
    77"Last-Translator: \n"
    88"Language-Team: Arabic\n"
     
    4646msgstr "تم تعطيل مفتاح المرور بنجاح"
    4747
    48 #: src/ajax/secure-passkeys-adminarea-ajax.php:236
    49 #: src/ajax/secure-passkeys-adminarea-ajax.php:261
     48#: src/ajax/secure-passkeys-adminarea-ajax.php:235
     49#: src/ajax/secure-passkeys-adminarea-ajax.php:260
    5050#: src/ajax/secure-passkeys-adminarea-settings-ajax.php:121
    5151#: src/ajax/secure-passkeys-adminarea-settings-ajax.php:145
     
    5353msgstr "ليس لديك صلاحيات لتقديم هذا الطلب."
    5454
    55 #: src/ajax/secure-passkeys-adminarea-ajax.php:238
     55#: src/ajax/secure-passkeys-adminarea-ajax.php:237
    5656#: src/ajax/secure-passkeys-adminarea-settings-ajax.php:123
    57 #: src/ajax/secure-passkeys-frontend-ajax.php:228
     57#: src/ajax/secure-passkeys-frontend-ajax.php:239
    5858msgid "The request method must be POST."
    5959msgstr "يجب أن تكون طريقة الطلب POST."
    6060
    61 #: src/ajax/secure-passkeys-adminarea-ajax.php:240
     61#: src/ajax/secure-passkeys-adminarea-ajax.php:239
    6262#: src/ajax/secure-passkeys-adminarea-settings-ajax.php:125
    63 #: src/ajax/secure-passkeys-frontend-ajax.php:230
     63#: src/ajax/secure-passkeys-frontend-ajax.php:241
    6464msgid "Token mismatch, please refresh the page."
    6565msgstr "رمز الصفحة غير مطابق ، يرجى تحديث الصفحة."
    6666
    67 #: src/ajax/secure-passkeys-adminarea-ajax.php:269
    68 #: src/ajax/secure-passkeys-frontend-ajax.php:226
    69 #: src/ajax/secure-passkeys-frontend-ajax.php:241
     67#: src/ajax/secure-passkeys-adminarea-ajax.php:268
     68#: src/ajax/secure-passkeys-frontend-ajax.php:237
     69#: src/ajax/secure-passkeys-frontend-ajax.php:252
    7070msgid "You are not allowed to make this request."
    7171msgstr "لا يمكنك تقديم هذا الطلب."
     
    7575msgstr "تم تحديث الإعدادات بنجاح."
    7676
    77 #: src/ajax/secure-passkeys-frontend-ajax.php:74
     77#: src/ajax/secure-passkeys-frontend-ajax.php:75
    7878msgid "Passkey authentication failed. Please try again."
    7979msgstr "فشلت مصادقة مفتاح المرور. يرجى المحاولة مرة أخرى."
    8080
    81 #: src/ajax/secure-passkeys-frontend-ajax.php:150
     81#: src/ajax/secure-passkeys-frontend-ajax.php:159
    8282#: src/utils/secure-passkeys-i18n.php:39 src/utils/secure-passkeys-i18n.php:107
    8383msgid "The maximum number of registered passkeys has been reached."
    8484msgstr "تم الوصول إلى الحد الأقصى لعدد مفاتيح المرور المسجلة."
    8585
    86 #: src/ajax/secure-passkeys-frontend-ajax.php:152
     86#: src/ajax/secure-passkeys-frontend-ajax.php:161
    8787msgid "This passkey is already registered. Please use a different one."
    8888msgstr "مفتاح المرور هذا مسجل بالفعل. يرجى استخدام مفتاح مرور آخر."
    8989
    90 #: src/ajax/secure-passkeys-frontend-ajax.php:154
    91 #: src/ajax/secure-passkeys-frontend-ajax.php:175
     90#: src/ajax/secure-passkeys-frontend-ajax.php:163
     91#: src/ajax/secure-passkeys-frontend-ajax.php:186
    9292msgid "Failed to register the passkey. Please try again later."
    9393msgstr "فشل تسجيل مفتاح المرور. يرجى المحاولة مرة أخرى لاحقاً."
    9494
    95 #: src/ajax/secure-passkeys-frontend-ajax.php:160
     95#: src/ajax/secure-passkeys-frontend-ajax.php:170
    9696#: src/utils/secure-passkeys-i18n.php:52
    9797msgid "Security key name must be at least 3 characters long."
    9898msgstr "يجب أن يكون اسم مفتاح الأمان مكوناً من 3 أحرف على الأقل."
    9999
    100 #: src/ajax/secure-passkeys-frontend-ajax.php:162
     100#: src/ajax/secure-passkeys-frontend-ajax.php:172
    101101msgid "Security key name must be at most 30 characters long."
    102102msgstr "يجب ألا يزيد طول اسم مفتاح الأمان عن 30 حرفاً على الأكثر."
    103103
    104 #: src/ajax/secure-passkeys-frontend-ajax.php:164
     104#: src/ajax/secure-passkeys-frontend-ajax.php:174
    105105#: src/utils/secure-passkeys-i18n.php:51 src/utils/secure-passkeys-i18n.php:117
    106106msgid "Please use only letters, numbers, spaces, hyphens, or underscores."
    107107msgstr "يُرجى استخدام الأحرف والأرقام والمسافات والواصلات والشرطات السفلية فقط."
    108108
    109 #: src/ajax/secure-passkeys-frontend-ajax.php:209
     109#: src/ajax/secure-passkeys-frontend-ajax.php:220
    110110msgid "You do not have permission to remove this passkey."
    111111msgstr "ليس لديك إذن لإزالة مفتاح المرور هذا."
     
    137137msgstr "سجل النشاط"
    138138
    139 #: src/models/secure-passkeys-log.php:72
     139#: src/models/secure-passkeys-log.php:77
    140140#: src/views/admin/vue/components/activity/app.vue.php:59
    141141msgid "Login"
    142142msgstr "دخول"
    143143
    144 #: src/models/secure-passkeys-log.php:73
     144#: src/models/secure-passkeys-log.php:78
    145145#: src/views/admin/vue/components/activity/app.vue.php:62
    146146msgid "Register"
    147147msgstr "تسجيل"
    148148
    149 #: src/models/secure-passkeys-log.php:74
     149#: src/models/secure-passkeys-log.php:79
    150150#: src/views/admin/vue/components/activity/app.vue.php:68
    151151msgid "Remove"
    152152msgstr "إزالة"
    153153
    154 #: src/models/secure-passkeys-log.php:75 src/utils/secure-passkeys-i18n.php:80
     154#: src/models/secure-passkeys-log.php:80 src/utils/secure-passkeys-i18n.php:80
    155155#: src/views/admin/vue/components/activity/app.vue.php:65
    156156#: src/views/admin/vue/components/passkeys/app.vue.php:266
     
    158158msgstr "حذف"
    159159
    160 #: src/models/secure-passkeys-log.php:76 src/utils/secure-passkeys-i18n.php:78
     160#: src/models/secure-passkeys-log.php:81 src/utils/secure-passkeys-i18n.php:78
    161161#: src/views/admin/vue/components/activity/app.vue.php:71
    162162#: src/views/admin/vue/components/passkeys/app.vue.php:241
     
    166166msgstr "تفعيل"
    167167
    168 #: src/models/secure-passkeys-log.php:77 src/utils/secure-passkeys-i18n.php:79
     168#: src/models/secure-passkeys-log.php:82 src/utils/secure-passkeys-i18n.php:79
    169169#: src/views/admin/vue/components/activity/app.vue.php:74
    170170#: src/views/admin/vue/components/passkeys/app.vue.php:248
     
    174174msgstr "تعطيل"
    175175
    176 #: src/models/secure-passkeys-log.php:92
     176#: src/models/secure-passkeys-log.php:97
    177177#, php-format
    178178msgid "User logged in using the passkey (%1$s) with the authenticator (%2$s)."
     
    181181"(%2$s)."
    182182
    183 #: src/models/secure-passkeys-log.php:94
     183#: src/models/secure-passkeys-log.php:99
    184184#, php-format
    185185msgid ""
     
    188188msgstr "تم تسجيل مفتاح المرور بنجاح مع الاسم (%1$s) باستخدام المصادقة (%2$s)."
    189189
    190 #: src/models/secure-passkeys-log.php:96
     190#: src/models/secure-passkeys-log.php:101
    191191#, php-format
    192192msgid "Passkey (%1$s) associated with the authenticator (%2$s) was removed."
    193193msgstr "تمت إزالة مفتاح المرور (%1$s) المرتبط بالمصادقة (%2$s)."
    194194
    195 #: src/models/secure-passkeys-log.php:98
     195#: src/models/secure-passkeys-log.php:103
    196196#, php-format
    197197msgid ""
     
    200200msgstr "تم حذف مفتاح المرور (‫%1$s) المرتبط بالمصادقة (%2$s) من قبل المسؤول."
    201201
    202 #: src/models/secure-passkeys-log.php:100
     202#: src/models/secure-passkeys-log.php:105
    203203#, php-format
    204204msgid ""
     
    207207msgstr "تم تنشيط مفتاح المرور (‫%1$s) المرتبط بالمصادقة (%2$s) من قبل المسؤول."
    208208
    209 #: src/models/secure-passkeys-log.php:102
     209#: src/models/secure-passkeys-log.php:107
    210210#, php-format
    211211msgid ""
     
    215215"تم إلغاء تنشيط مفتاح المرور (‫%1$s) المرتبط بالمصادقة (%2$s) من قبل المسؤول."
    216216
    217 #: src/settings/secure-passkeys-advanced-settings.php:40
     217#: src/settings/secure-passkeys-advanced-settings.php:42
    218218msgid "The challenge cleanup period is not correct."
    219219msgstr "الفترة الزمنية المحددة لمسح التحديات غير صحيحة."
    220220
    221 #: src/settings/secure-passkeys-advanced-settings.php:44
     221#: src/settings/secure-passkeys-advanced-settings.php:46
    222222msgid "The log cleanup period is not correct."
    223223msgstr "الفترة الزمنية المحددة لمسح النشاطات غير صحيحة."
    224224
    225 #: src/settings/secure-passkeys-display-settings.php:47
     225#: src/settings/secure-passkeys-display-settings.php:49
    226226msgid "The theme does not exist."
    227227msgstr "السمة غير موجودة."
    228228
    229 #: src/settings/secure-passkeys-display-settings.php:49
     229#: src/settings/secure-passkeys-display-settings.php:51
    230230msgid "The path associated with the theme does not exist."
    231231msgstr "المسار المرتبط بالسمة غير موجودة."
     
    235235msgstr "إعدادات غير صحيحة."
    236236
    237 #: src/settings/secure-passkeys-general-settings.php:45
     237#: src/settings/secure-passkeys-general-settings.php:47
    238238msgid "The maximum number of passkeys per user must be greater than 0."
    239239msgstr "يجب أن يكون الحد الأقصى لعدد مفاتيح المرور لكل مستخدم أكبر من 0."
    240240
    241 #: src/settings/secure-passkeys-general-settings.php:47
     241#: src/settings/secure-passkeys-general-settings.php:49
    242242msgid "The maximum number of passkeys must be less than 10."
    243243msgstr "الحد الأقصى لعدد مفاتيح المرور يجب أن يكون أقل من 10."
    244244
    245 #: src/settings/secure-passkeys-general-settings.php:51
     245#: src/settings/secure-passkeys-general-settings.php:53
    246246msgid "The excluded roles must be a valid role."
    247247msgstr "أحد المجموعات المستبعدة ليست مجموعة صحيحة."
    248248
    249 #: src/settings/secure-passkeys-general-settings.php:55
     249#: src/settings/secure-passkeys-general-settings.php:57
    250250msgid "The login user verification must be required, preferred, or discouraged."
    251251msgstr ""
    252252"يجب أن يكون التحقق من تسجيل الدخول للمستخدم مطلوبًا أو مفضلًا أو غير مستحسن."
    253253
    254 #: src/settings/secure-passkeys-general-settings.php:59
     254#: src/settings/secure-passkeys-general-settings.php:61
    255255msgid "The registration timeout must be greater than 0."
    256256msgstr "يجب أن تكون مهلة التسجيل أكبر من 0."
    257257
    258 #: src/settings/secure-passkeys-general-settings.php:63
     258#: src/settings/secure-passkeys-general-settings.php:65
    259259msgid "The login timeout must be greater than 0."
    260260msgstr "يجب أن تكون مهلة تسجيل الدخول أكبر من 0."
     
    278278msgstr "‫YOOtheme (UiKit)"
    279279
    280 #: src/utils/secure-passkeys-helper.php:149
     280#: src/utils/secure-passkeys-helper.php:148
    281281#, php-format
    282282msgid "%s ago"
     
    366366msgid ""
    367367"This passkey can work across multiple devices - pick a nickname that will "
    368 "help you identify it later.<br /> For example, the name of your password "
    369 "manager or account provider."
     368"help you identify it later.\n"
     369" For example, the name of your password manager or account provider."
    370370msgstr ""
    371371"يمكن لهذا المفتاح أن يعمل عبر أجهزة متعددة - اختر اسمًا مستعارًا يساعدك في "
    372 "التعرف عليه لاحقًا.<br /> على سبيل المثال، اسم مدير كلمات المرور أو مزود "
    373 "الحساب الخاص بك‬."
     372"التعرف عليه لاحقًا.\n"
     373"‬\n"
     374"‫على سبيل المثال، اسم مدير كلمات المرور أو مزود الحساب الخاص بك‬."
    374375
    375376#: src/utils/secure-passkeys-i18n.php:35 src/utils/secure-passkeys-i18n.php:102
     
    681682msgstr "إدارة الخيارات المتقدمة لصيانة الإضافة."
    682683
    683 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:49
     684#: src/views/admin/vue/components/settings/advanced-settings.vue.php:48
    684685msgid "Delete passkey challenge records older than"
    685686msgstr "حذف سجلات تحديات مفاتيح المرور الأقدم من"
    686687
    687 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:66
    688 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:102
     688#: src/views/admin/vue/components/settings/advanced-settings.vue.php:65
     689#: src/views/admin/vue/components/settings/advanced-settings.vue.php:101
    689690msgid "Never"
    690691msgstr "أبدا"
    691692
    692 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:69
    693 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:105
     693#: src/views/admin/vue/components/settings/advanced-settings.vue.php:68
     694#: src/views/admin/vue/components/settings/advanced-settings.vue.php:104
    694695msgid "Older than"
    695696msgstr "أقدم من"
    696697
    697 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:71
    698 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:107
     698#: src/views/admin/vue/components/settings/advanced-settings.vue.php:70
     699#: src/views/admin/vue/components/settings/advanced-settings.vue.php:106
    699700msgid "days"
    700701msgstr "أيام"
    701702
    702 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:76
     703#: src/views/admin/vue/components/settings/advanced-settings.vue.php:75
    703704msgid ""
    704705"Automatically removes outdated passkey challenge records to optimize database "
     
    708709"إذا تم الضبط على \"أبداً\"، لن يتم حذف السجلات."
    709710
    710 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:85
     711#: src/views/admin/vue/components/settings/advanced-settings.vue.php:84
    711712msgid "Delete log records older than"
    712713msgstr "حذف سجلات النشاطات الأقدم من"
    713714
    714 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:112
     715#: src/views/admin/vue/components/settings/advanced-settings.vue.php:111
    715716msgid ""
    716717"(Not recommended) Automatically deletes outdated log records. If set to "
     
    720721"تم ضبطه على “أبدًا”، فلن تتم إزالة السجلات."
    721722
    722 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:115
     723#: src/views/admin/vue/components/settings/advanced-settings.vue.php:114
    723724msgid "This results in the loss of activity log history."
    724725msgstr "يؤدي هذا إلى فقدان ومسح سجل النشاطات."
    725726
    726 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:141
    727 #: src/views/admin/vue/components/settings/display-settings.vue.php:345
    728 #: src/views/admin/vue/components/settings/general-settings.vue.php:274
     727#: src/views/admin/vue/components/settings/advanced-settings.vue.php:124
     728msgid "Disable Activity Log Recording"
     729msgstr "تعطيل سجلات النشاط"
     730
     731#: src/views/admin/vue/components/settings/advanced-settings.vue.php:138
     732msgid "Disable the creation of new activity log records."
     733msgstr "منع إنشاء سجلات نشاط جديدة."
     734
     735#: src/views/admin/vue/components/settings/advanced-settings.vue.php:140
     736msgid "This will prevent new activity log records from being created."
     737msgstr "سيؤدي هذا إلى منع إنشاء سجلات نشاط جديدة."
     738
     739#: src/views/admin/vue/components/settings/advanced-settings.vue.php:165
     740#: src/views/admin/vue/components/settings/display-settings.vue.php:374
     741#: src/views/admin/vue/components/settings/general-settings.vue.php:299
    729742msgid "Save Changes"
    730743msgstr "حفظ التغييرات"
    731744
    732 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:144
    733 #: src/views/admin/vue/components/settings/display-settings.vue.php:348
    734 #: src/views/admin/vue/components/settings/general-settings.vue.php:277
     745#: src/views/admin/vue/components/settings/advanced-settings.vue.php:168
     746#: src/views/admin/vue/components/settings/display-settings.vue.php:377
     747#: src/views/admin/vue/components/settings/general-settings.vue.php:302
    735748msgid "Saving..."
    736749msgstr "جاري الحفظ…"
    737750
    738 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:156
     751#: src/views/admin/vue/components/settings/advanced-settings.vue.php:180
    739752msgid "Configuring Cron Jobs"
    740753msgstr "تكوين مهام Cron"
    741754
    742 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:157
     755#: src/views/admin/vue/components/settings/advanced-settings.vue.php:181
    743756msgid ""
    744757"To ensure these options work as expected, it is recommended to set up a cron "
     
    750763"كيفية إعداد مهمة cron:"
    751764
    752 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:161
     765#: src/views/admin/vue/components/settings/advanced-settings.vue.php:185
    753766msgid "Log in to your web server control panel, such as cPanel or Plesk."
    754767msgstr ""
     
    756769"Plesk."
    757770
    758 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:164
     771#: src/views/admin/vue/components/settings/advanced-settings.vue.php:188
    759772msgid "Find the option to manage cron jobs and select it."
    760773msgstr "ابحث عن خيار إدارة مهام cron jobs وحدده."
    761774
    762 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:167
     775#: src/views/admin/vue/components/settings/advanced-settings.vue.php:191
    763776msgid ""
    764777"In the “Add New Cron Job” section, specify the frequency at which you want "
     
    768781"به، على سبيل المثال، كل دقيقة."
    769782
    770 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:170
     783#: src/views/admin/vue/components/settings/advanced-settings.vue.php:194
    771784msgid "In the “Command” field, enter the following command:"
    772785msgstr "في حقل “Command”، أدخل الأمر التالي:"
    773786
    774 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:173
     787#: src/views/admin/vue/components/settings/advanced-settings.vue.php:197
    775788msgid "Save the cron job."
    776789msgstr "احفظ مهمة cron job."
    777790
    778 #: src/views/admin/vue/components/settings/advanced-settings.vue.php:175
     791#: src/views/admin/vue/components/settings/advanced-settings.vue.php:199
    779792msgid "Add the following code to your \"wp-config.php\" file:"
    780793msgstr "أضف الكود التالي إلى ملف “wp-config.php”:"
     
    834847#: src/views/admin/vue/components/settings/display-settings.vue.php:173
    835848#: src/views/admin/vue/components/settings/display-settings.vue.php:202
     849#: src/views/admin/vue/components/settings/display-settings.vue.php:231
    836850#, php-format
    837851msgid "The %s plugin must be installed and activated to work correctly."
     
    857871"Digital Downloads."
    858872
    859 #: src/views/admin/vue/components/settings/display-settings.vue.php:215
     873#: src/views/admin/vue/components/settings/display-settings.vue.php:211
     874msgid "Login for Ultimate Member"
     875msgstr "تسجيل الدخول لـ Ultimate Member"
     876
     877#: src/views/admin/vue/components/settings/display-settings.vue.php:225
     878msgid "Enable Passkey Login for Ultimate Member login form."
     879msgstr ""
     880"تمكين الدخول بمفتاح المرور لصفحة تسجيل الدخول بإستخدام نموذج دخول Ultimate "
     881"Member."
     882
     883#: src/views/admin/vue/components/settings/display-settings.vue.php:244
    860884msgid ""
    861885"Use the following shortcodes to embed the passkey login and registration "
     
    871895"وقد لا تحتاج إلى إدارة هذا الأمر ما لم تكن تعمل مع صفحة مخصصة."
    872896
    873 #: src/views/admin/vue/components/settings/display-settings.vue.php:223
     897#: src/views/admin/vue/components/settings/display-settings.vue.php:252
    874898msgid "Login Short Code"
    875899msgstr "رمز شفرة تسجيل الدخول"
    876900
    877 #: src/views/admin/vue/components/settings/display-settings.vue.php:237
     901#: src/views/admin/vue/components/settings/display-settings.vue.php:266
    878902msgid ""
    879903"This shortcode to embed the \"Login via Passkey\" login button,this allows "
     
    883907"الدخول باستخدام بيانات اعتماد المفتاح المرور الخاصة بهم."
    884908
    885 #: src/views/admin/vue/components/settings/display-settings.vue.php:239
     909#: src/views/admin/vue/components/settings/display-settings.vue.php:268
    886910msgid "If the user is already logged in, the form will not be displayed."
    887911msgstr "إذا كان المستخدم قد قام بتسجيل الدخول بالفعل، فلن يتم عرض زر الدخول."
    888912
    889 #: src/views/admin/vue/components/settings/display-settings.vue.php:248
     913#: src/views/admin/vue/components/settings/display-settings.vue.php:277
    890914msgid "Register Short Code"
    891915msgstr "رمز شفرة تسجيل إنشاء رموز المرور"
    892916
    893 #: src/views/admin/vue/components/settings/display-settings.vue.php:262
     917#: src/views/admin/vue/components/settings/display-settings.vue.php:291
    894918msgid ""
    895919"This shortcode to embed the passkey registration form. This allows logged-in "
     
    899923"المسجلين بإنشاء وإدارة بيانات اعتماد مفتاح المرور الخاصة بهم."
    900924
    901 #: src/views/admin/vue/components/settings/display-settings.vue.php:264
     925#: src/views/admin/vue/components/settings/display-settings.vue.php:293
    902926msgid "If the user is not logged in, the form will not be displayed."
    903927msgstr "إذا لم يقم المستخدم بتسجيل الدخول، فلن يتم عرض النموذج."
    904928
    905 #: src/views/admin/vue/components/settings/display-settings.vue.php:275
     929#: src/views/admin/vue/components/settings/display-settings.vue.php:304
    906930msgid "Adminarea Options"
    907931msgstr "خيارات الواجهة الخلفية والادارة"
    908932
    909 #: src/views/admin/vue/components/settings/display-settings.vue.php:277
     933#: src/views/admin/vue/components/settings/display-settings.vue.php:306
    910934msgid "Configure the options available in the admin area."
    911935msgstr "قم بتكوين الخيارات المتاحة في منطقة الادارة."
    912936
    913 #: src/views/admin/vue/components/settings/display-settings.vue.php:286
     937#: src/views/admin/vue/components/settings/display-settings.vue.php:315
    914938msgid "Display Passkeys in Users List"
    915939msgstr "عرض مفاتيح المرور في قائمة المستخدمين"
    916940
    917 #: src/views/admin/vue/components/settings/display-settings.vue.php:300
     941#: src/views/admin/vue/components/settings/display-settings.vue.php:329
    918942msgid ""
    919943"Enable this option to show the passkeys as a column in the users list in the "
     
    923947"الإدارة."
    924948
    925 #: src/views/admin/vue/components/settings/display-settings.vue.php:307
     949#: src/views/admin/vue/components/settings/display-settings.vue.php:336
    926950msgid "Display Passkeys in Edit User/Profile"
    927951msgstr "عرض مفاتيح المرور في صفحة تعديل المستخدم/الملف الشخصي"
    928952
    929 #: src/views/admin/vue/components/settings/display-settings.vue.php:321
     953#: src/views/admin/vue/components/settings/display-settings.vue.php:350
    930954msgid ""
    931955"Enable this option to show the passkeys on the Edit User and Profile page in "
     
    9811005"shortscode لتسجيل مفتاح المرور."
    9821006
    983 #: src/views/admin/vue/components/settings/general-settings.vue.php:134
     1007#: src/views/admin/vue/components/settings/general-settings.vue.php:131
     1008msgid "Auto Generate Security Key Name"
     1009msgstr "إنشاء اسم مفتاح الأمان تلقائياً"
     1010
     1011#: src/views/admin/vue/components/settings/general-settings.vue.php:145
     1012msgid "Enable or disable the automatic generation of a security key name."
     1013msgstr "تمكين أو تعطيل الإنشاء التلقائي لاسم مفتاح الأمان."
     1014
     1015#: src/views/admin/vue/components/settings/general-settings.vue.php:147
     1016msgid ""
     1017"If enabled, users will not be prompted to enter a security key name manually "
     1018"when registering a passkey."
     1019msgstr ""
     1020"في حالة التمكين، لن تتم مطالبة المستخدمين بإدخال اسم مفتاح الأمان يدوياً عند "
     1021"عملية تسجيل مفتاح مرور."
     1022
     1023#: src/views/admin/vue/components/settings/general-settings.vue.php:159
    9841024msgid ""
    9851025"Configure the WebAuthn and Passkeys login and registration options., we "
     
    9911031"WebAuthn."
    9921032
    993 #: src/views/admin/vue/components/settings/general-settings.vue.php:145
     1033#: src/views/admin/vue/components/settings/general-settings.vue.php:170
    9941034msgid "Exclude Existing Credentials"
    9951035msgstr "استبعاد بيانات الاعتماد الموجودة"
    9961036
    997 #: src/views/admin/vue/components/settings/general-settings.vue.php:159
     1037#: src/views/admin/vue/components/settings/general-settings.vue.php:184
    9981038msgid ""
    9991039"Enable this option to prevent users from registering passkeys that are "
     
    10031043"(موصى به: ممكّن)."
    10041044
    1005 #: src/views/admin/vue/components/settings/general-settings.vue.php:166
     1045#: src/views/admin/vue/components/settings/general-settings.vue.php:191
    10061046msgid "Registration Timeout"
    10071047msgstr "وقت مهلة التسجيل"
    10081048
    1009 #: src/views/admin/vue/components/settings/general-settings.vue.php:179
     1049#: src/views/admin/vue/components/settings/general-settings.vue.php:204
    10101050msgid "Set the expiration timeout for passkey registration (in minutes)."
    10111051msgstr "تعيين مهلة انتهاء صلاحية تسجيل مفتاح المرور (بالدقائق)."
    10121052
    1013 #: src/views/admin/vue/components/settings/general-settings.vue.php:186
     1053#: src/views/admin/vue/components/settings/general-settings.vue.php:211
    10141054msgid "Login Timeout"
    10151055msgstr "وقت مهلة الدخول"
    10161056
    1017 #: src/views/admin/vue/components/settings/general-settings.vue.php:199
     1057#: src/views/admin/vue/components/settings/general-settings.vue.php:224
    10181058msgid "Set the expiration timeout for passkey login (in minutes)."
    10191059msgstr "تعيين مهلة انتهاء صلاحية الدخول بمفتاح المرور (بالدقائق)."
    10201060
    1021 #: src/views/admin/vue/components/settings/general-settings.vue.php:208
     1061#: src/views/admin/vue/components/settings/general-settings.vue.php:233
    10221062msgid "Enable User Verifications"
    10231063msgstr "التحقق من المستخدم"
    10241064
    1025 #: src/views/admin/vue/components/settings/general-settings.vue.php:222
     1065#: src/views/admin/vue/components/settings/general-settings.vue.php:247
    10261066msgid ""
    10271067"Choose the level of user verification required during passkey registration "
     
    10311071"ممكّن)."
    10321072
    1033 #: src/views/admin/vue/components/settings/general-settings.vue.php:229
     1073#: src/views/admin/vue/components/settings/general-settings.vue.php:254
    10341074msgid "Login User Verification"
    10351075msgstr "التحقق من تسجيل الدخول للمستخدم"
    10361076
    1037 #: src/views/admin/vue/components/settings/general-settings.vue.php:240
     1077#: src/views/admin/vue/components/settings/general-settings.vue.php:265
    10381078msgid "Required"
    10391079msgstr "إجباري"
    10401080
    1041 #: src/views/admin/vue/components/settings/general-settings.vue.php:243
     1081#: src/views/admin/vue/components/settings/general-settings.vue.php:268
    10421082msgid "Preferred"
    10431083msgstr "مفضل"
    10441084
    1045 #: src/views/admin/vue/components/settings/general-settings.vue.php:246
     1085#: src/views/admin/vue/components/settings/general-settings.vue.php:271
    10461086msgid "Discouraged"
    10471087msgstr "معطل"
    10481088
    1049 #: src/views/admin/vue/components/settings/general-settings.vue.php:250
     1089#: src/views/admin/vue/components/settings/general-settings.vue.php:275
    10501090msgid "Choose the level of user verification required during passkey login."
    10511091msgstr ""
     
    10721112#: src/views/frontend/default/login.memberpress.php:14
    10731113#: src/views/frontend/default/login.shortcode.php:14
     1114#: src/views/frontend/default/login.ultimate_member.php:14
    10741115#: src/views/frontend/default/login.woocommerce.php:14
    10751116#: src/views/frontend/yootheme/login.edd.php:14
    10761117#: src/views/frontend/yootheme/login.memberpress.php:14
    10771118#: src/views/frontend/yootheme/login.shortcode.php:14
     1119#: src/views/frontend/yootheme/login.ultimate_member.php:14
    10781120#: src/views/frontend/yootheme/login.woocommerce.php:14
    10791121msgid "Login via Passkey.."
     
    10841126#: src/views/frontend/default/login.memberpress.php:15
    10851127#: src/views/frontend/default/login.shortcode.php:15
     1128#: src/views/frontend/default/login.ultimate_member.php:15
    10861129#: src/views/frontend/default/login.woocommerce.php:15
    10871130#: src/views/frontend/yootheme/login.edd.php:15
    10881131#: src/views/frontend/yootheme/login.memberpress.php:15
    10891132#: src/views/frontend/yootheme/login.shortcode.php:15
     1133#: src/views/frontend/yootheme/login.ultimate_member.php:15
    10901134#: src/views/frontend/yootheme/login.woocommerce.php:15
    10911135msgid "Login via Passkey"
  • secure-passkeys/trunk/src/models/secure-passkeys-challenge.php

    r3262385 r3338906  
    8383    public function mark_as_used_challenge(string $challenge): void
    8484    {
    85         $this->update(['challenge' => $challenge], ['used_at' => (new DateTime())->format('Y-m-d H:i:s')]);
     85        $this->update(['used_at' => (new DateTime())->format('Y-m-d H:i:s')], ['challenge' => $challenge]);
    8686    }
    8787
  • secure-passkeys/trunk/src/models/secure-passkeys-log.php

    r3262385 r3338906  
    4848        ?string $ip_address = null
    4949    ) {
     50
     51        if (Secure_Passkeys_Helper::is_stop_log_records_enabled()) {
     52            return false;
     53        }
     54
    5055        if (is_null($ip_address)) {
    5156            $ip_address = Secure_Passkeys_Helper::get_ip_address();
  • secure-passkeys/trunk/src/settings/secure-passkeys-advanced-settings.php

    r3262385 r3338906  
    2626            'challenge_cleanup_days',
    2727            'log_cleanup_days',
     28            'stop_log_records_enabled',
    2829        ];
    2930    }
     
    3334        $challenge_cleanup_days = intval($_POST['settings']['challenge_cleanup_days'] ?? 0);
    3435        $log_cleanup_days = intval($_POST['settings']['log_cleanup_days'] ?? 0);
     36        $stop_log_records_enabled = intval($_POST['settings']['stop_log_records_enabled'] ?? 0);
    3537
    3638        $challenge_cleanup_days_periods = apply_filters('secure_passkeys_challenge_cleanup_allowed_days_periods', [0, 30, 60, 90]);
     
    4749        $data = [
    4850            'challenge_cleanup_days' => $challenge_cleanup_days,
    49             'log_cleanup_days' => $log_cleanup_days
     51            'log_cleanup_days' => $log_cleanup_days,
     52            'stop_log_records_enabled' => $stop_log_records_enabled
    5053        ];
    5154
  • secure-passkeys/trunk/src/settings/secure-passkeys-display-settings.php

    r3262385 r3338906  
    2626            'display_passkey_login_memberpress_enabled',
    2727            'display_passkey_login_edd_enabled',
     28            'display_passkey_login_ultimate_member_enabled',
    2829            'display_passkey_users_list_enabled',
    2930            'display_passkey_edit_user_enabled',
     
    3839        $display_passkey_login_memberpress_enabled = intval($_POST['settings']['display_passkey_login_memberpress_enabled'] ?? 1);
    3940        $display_passkey_login_edd_enabled = intval($_POST['settings']['display_passkey_login_edd_enabled'] ?? 1);
     41        $display_passkey_login_ultimate_member_enabled = intval($_POST['settings']['display_passkey_login_ultimate_member_enabled'] ?? 1);
    4042        $display_passkey_users_list_enabled = intval($_POST['settings']['display_passkey_users_list_enabled'] ?? 1);
    4143        $display_passkey_edit_user_enabled = intval($_POST['settings']['display_passkey_edit_user_enabled'] ?? 1);
     
    5658            'display_passkey_login_memberpress_enabled' => $display_passkey_login_memberpress_enabled,
    5759            'display_passkey_login_edd_enabled' => $display_passkey_login_edd_enabled,
     60            'display_passkey_login_ultimate_member_enabled' => $display_passkey_login_ultimate_member_enabled,
    5861            'display_passkey_users_list_enabled' => $display_passkey_users_list_enabled,
    5962            'display_passkey_edit_user_enabled' => $display_passkey_edit_user_enabled,
  • secure-passkeys/trunk/src/settings/secure-passkeys-general-settings.php

    r3262385 r3338906  
    2323            'registration_maximum_passkeys_per_user',
    2424            'excluded_roles_registration_login',
     25            'auto_generate_security_key_name',
    2526            'registration_timeout',
    2627            'registration_exclude_credentials_enabled',
     
    3637        $registration_maximum_passkeys_per_user = intval($_POST['settings']['registration_maximum_passkeys_per_user'] ?? 3);
    3738        $excluded_roles_registration_login = map_deep(wp_unslash($_POST['settings']['excluded_roles_registration_login'] ?? []), 'sanitize_text_field');
     39        $auto_generate_security_key_name = intval($_POST['settings']['auto_generate_security_key_name'] ?? 0);
    3840        $registration_timeout = intval($_POST['settings']['registration_timeout'] ?? 0);
    3941        $registration_exclude_credentials_enabled = intval($_POST['settings']['registration_exclude_credentials_enabled'] ?? 1);
     
    6870            'registration_maximum_passkeys_per_user' => $registration_maximum_passkeys_per_user,
    6971            'excluded_roles_registration_login' => $excluded_roles_registration_login,
     72            'auto_generate_security_key_name' => $auto_generate_security_key_name,
    7073            'registration_timeout' => $registration_timeout,
    7174            'registration_exclude_credentials_enabled' => $registration_exclude_credentials_enabled,
  • secure-passkeys/trunk/src/utils/secure-passkeys-helper.php

    r3262385 r3338906  
    7373        return $roles;
    7474    }
    75 
    7675
    7776    public static function are_allowed_empty_roles(?array $roles = [])
     
    167166        $ipAddress = self::get_ip_address() ?? 'unknown';
    168167        $acceptLanguage = sanitize_text_field(wp_unslash($_SERVER['HTTP_ACCEPT_LANGUAGE'] ?? 'unknown'));
    169         $acceptEncoding = sanitize_text_field(wp_unslash($_SERVER['HTTP_ACCEPT_ENCODING'] ?? 'unknown'));
    170 
    171         $fingerprintData = $userAgent . '|' . $ipAddress . '|' . $acceptLanguage . '|' . $acceptEncoding;
     168
     169        $fingerprintData = $userAgent . '|' . $ipAddress . '|' . $acceptLanguage;
    172170
    173171        $fingerprintHash = hash('sha256', $fingerprintData);
    174172
    175173        return $fingerprintHash;
     174    }
     175
     176    public static function is_auto_generate_security_key_name_enabled(): int
     177    {
     178        $enabled = apply_filters(
     179            'secure_passkeys_auto_generate_security_key_name_enabled',
     180            self::get_option('auto_generate_security_key_name', 0)
     181        );
     182
     183        return intval($enabled);
     184    }
     185
     186    public static function is_stop_log_records_enabled(): int
     187    {
     188        $enabled = apply_filters(
     189            'secure_passkeys_stop_log_records_enabled',
     190            self::get_option('stop_log_records_enabled', 0)
     191        );
     192
     193        return intval($enabled);
    176194    }
    177195
     
    218236            'registration_maximum_passkeys_per_user' => 3,
    219237            'excluded_roles_registration_login' => [],
     238            'auto_generate_security_key_name' => 0,
    220239            'registration_timeout' => 5,
    221240            'registration_exclude_credentials_enabled' => 1,
     
    228247            'display_passkey_login_memberpress_enabled' => 1,
    229248            'display_passkey_login_edd_enabled' => 1,
     249            'display_passkey_login_ultimate_member_enabled' => 1,
    230250            'display_passkey_users_list_enabled' => 1,
    231251            'display_passkey_edit_user_enabled' => 1,
    232252            'challenge_cleanup_days' => 0,
    233253            'log_cleanup_days' => 0,
     254            'stop_log_records_enabled' => 0,
    234255        ];
    235256    }
  • secure-passkeys/trunk/src/utils/secure-passkeys-i18n.php

    r3262385 r3338906  
    3232            'last_used' => __('Last used', 'secure-passkeys'),
    3333            'security_key_name' => __('Name your security key', 'secure-passkeys'),
    34             'security_key_description' => __('This passkey can work across multiple devices - pick a nickname that will help you identify it later.<br /> For example, the name of your password manager or account provider.', 'secure-passkeys'),
     34            'security_key_description' => __("This passkey can work across multiple devices - pick a nickname that will help you identify it later.\n For example, the name of your password manager or account provider.", 'secure-passkeys'),
    3535            'security_key_name_placeholder' => __('Enter Security Key Name', 'secure-passkeys'),
    3636            'inactive' => __('Inactive', 'secure-passkeys'),
     
    9999            'last_used' => __('Last used', 'secure-passkeys'),
    100100            'security_key_name' => __('Name your security key', 'secure-passkeys'),
    101             'security_key_description' => __('This passkey can work across multiple devices - pick a nickname that will help you identify it later.<br /> For example, the name of your password manager or account provider.', 'secure-passkeys'),
     101            'security_key_description' => __("This passkey can work across multiple devices - pick a nickname that will help you identify it later.\n For example, the name of your password manager or account provider.", 'secure-passkeys'),
    102102            'security_key_name_placeholder' => __('Enter Security Key Name', 'secure-passkeys'),
    103103            'inactive' => __('Inactive', 'secure-passkeys'),
  • secure-passkeys/trunk/src/utils/secure-passkeys-webauthn-helper.php

    r3262385 r3338906  
    130130            "name" => "LogMeOnce",
    131131            "icon" => "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB2ZXJzaW9uPSIxLjEiIHZpZXdCb3g9IjAgMCAyMDQ4IDIwNDgiIHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPgo8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSg5OTEpIiBkPSJtMCAwaDcxbDI0IDggMjAgNiAxMiA1IDE1IDggMTYgMTEgMTYgMTIgMTUgMTIgMTEgOSAyOCAyNCAxMiAxMSAxMSA5IDEyIDExIDggNyAxNSAxMyAxNCAxMSAxMiAxMCAxOCAxMyAxNyAxMiAxMSA3IDI0IDE0IDMyIDE3IDI0IDExIDIxIDkgMjggMTEgMjggOSAzMyAxMCAyMiA2IDI3IDYgNTMgOSA0MyA3IDM0IDcgMjMgNiAxNiA2IDE5IDEwIDE1IDEwIDE0IDExIDIwIDIwIDEzIDE3IDEwIDE2IDggMTUgNyAxOSA1IDI1IDExIDg5IDQgMzQgMyAzNyAxIDI1djExOWwtMiAzOC0zIDM0LTUgMzYtNSAzNS02IDUwLTUgMjktMTIgNTUtMTYgNjYtMTUgNDktMTYgNTAtMTkgNTEtMTggNDMtMTIgMjgtMTcgMzYtMTUgMzEtMjQgNDQtMTAgMTgtMTEgMTgtMTUgMjUtMTUgMjMtMTAgMTYtMTQgMjAtMTAgMTQtMTUgMjItMTYgMjEtMTEgMTQtMTMgMTYtOCAxMS0xMSAxMy05IDExLTEyIDEzLTcgOC05IDEwLTcgOC0xNiAxNy04IDloLTJsLTIgNC00OSA0OS04IDctNyA3LTggNy03IDctMTEgOS0zIDNoLTJ2MmwtMTEgOS0xMSAxMC05IDctMTEgMTAtMTQgMTEtMTggMTMtMTEgOS0xMSA4LTE4IDEzLTM1IDI0LTIxIDE0LTI0IDE1LTE5IDExLTE4IDEwLTI4IDE0LTIxIDgtMjcgNy0xMiAzLTEgMWgtNDhsLTQ0LTExLTIwLTctMjAtOS0xNi04LTI0LTEzLTIxLTEzLTE1LTEwLTIwLTE0LTE2LTExLTEyLTktMTktMTQtMTMtMTAtMTYtMTItMTctMTQtMTAtOC0xNy0xNC0yNi0yMi0xMy0xMi04LTctMTYtMTUtMTctMTYtNTctNTctNy04LTEwLTEwLTctOC0xMS0xMi0xMC0xMS05LTExLTI4LTM0LTEzLTE2LTEzLTE3LTExLTE1LTE0LTE5LTEzLTE4LTEzLTE5LTEwLTE1LTEzLTIwLTEzLTIxLTE5LTMyLTE0LTI1LTE1LTI4LTIxLTQyLTE1LTMzLTE2LTM4LTE0LTM2LTEwLTI5LTctMTgtMTQtNDUtMTgtNjQtNi0yNi0xMS01Mi0xMi02My00LTI5LTYtNjItNi03Mi0zLTUyLTEtMzB2LTU5bDItNjEgMy00NyA1LTQ1IDYtMzUgNi0xOCA5LTE5IDEwLTE4IDEwLTE1IDgtMTAgNS02aDJsMi00IDgtOCAxMS05IDEwLTcgMjEtMTMgMTYtOCAxNy02IDM0LTggMzItNyA2NC0xMSA0OS05IDMwLTggMjMtOCA0Mi0xNCAyMS05IDMzLTE1IDIzLTExIDIxLTEyIDE4LTEwIDIxLTE0IDIwLTEzIDExLTggMTMtMTAgMTQtMTEgMTEtOSAxMy0xMSA4LTcgOS05aDJ2LTJsOC03IDEwLTEwaDJsMS0zIDgtNyAxMy0xMyAxMS05IDctNyAxOS0xNCAxNC05IDE5LTExIDE5LTcgMjMtNyAxMC0zeiIgZmlsbD0iI0YxODQyOSIvPgo8cGF0aCB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMDIxLDYyMikiIGQ9Im0wIDAgMjEgMSAyOCA0IDIxIDYgMjEgOCAyMCAxMSAxNiAxMSAxNSAxMyAxNCAxNHYyaDJsMTggMjQgMTAgMTggNSAxMSA1IDEzIDcgMjYgMyAxNCAxIDEwdjMybC00IDI1LTcgMjYtNyAxOC0xMCAxOS0xNCAyMS05IDEwLTcgOC0xMyAxMy0xMSA5LTEzIDktMTYgOS0xMyA1IDEgMTIgOCAzNiAxNSA2MyAxOSA4NSAxNCA2MyA0IDI1IDIgMTR2MjVsLTMgMTQtNyAxMC05IDgtMTEgNS02IDItMjEgMmgtNjhsLTgzIDFoLTMybC0xNC0zLTctNC0xMy0xMS04LTEwLTQtOC0yLTh2LTE1bDUtMzAgNy0zMiAxNS02MCAxNi03MiAxMi01MiA3LTM2IDMtMjUtNi0yLTE2LTgtMTItNy0xMi05LTEwLTktOC03LTktOS0xMS0xNC0xMS0xNy0xMC0xOS04LTIwLTYtMjAtMy0xNy0xLTl2LTMwbDMtMjAgNi0yNyA3LTIxIDE3LTMzIDExLTE1IDctOCAxMS0xMiAxNS0xMyAxNi0xMiAyMS0xMiAxOC04IDIyLTYgMTktM3oiIGZpbGw9IiNGRUZGRkUiLz4KPC9zdmc+Cg=="
    132         ]
     132        ],
     133        "a10c6dd9-465e-4226-8198-c7c44b91c555" => [
     134            "name" => "Kaspersky Password Manager",
     135            "icon" => "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iNTEyIiBoZWlnaHQ9IjUxMiIgdmlld0JveD0iMCAwIDUxMiA1MTIiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzc0ODRfODc0NSkiPjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMV83NDg0Xzg3NDUpIj48ZyBjbGlwLXBhdGg9InVybCgjY2xpcDJfNzQ4NF84NzQ1KSI+PHBhdGggZD0iTTI4MS45NjQgNi45NjE3MUMyNjUuODkzIC0yLjI5OTc0IDI0Ni4xMDcgLTIuMjk5NzQgMjMwLjAzNiA2Ljk2MTcxTDQ2LjAzNjUgMTEzLjAwMkMyOS45MjcxIDEyMi4yODYgMjAgMTM5LjQ2NiAyMCAxNTguMDZWMzUzLjk3MkMyMCAzNzIuNTY2IDI5LjkyNzEgMzg5Ljc0NSA0Ni4wMzY1IDM5OS4wMjlMMjMwLjAzNiA1MDUuMDdDMjQ2LjEwNyA1MTQuMzMxIDI2NS44OTMgNTE0LjMzMSAyODEuOTY0IDUwNS4wN0w0NjUuOTY0IDM5OS4wMjlDNDgyLjA3MyAzODkuNzQ1IDQ5MiAzNzIuNTY2IDQ5MiAzNTMuOTcyVjE1OC4wNkM0OTIgMTM5LjQ2NiA0ODIuMDczIDEyMi4yODYgNDY1Ljk2NCAxMTMuMDAyTDI4MS45NjQgNi45NjE3MVoiIGZpbGw9InVybCgjcGFpbnQwX2xpbmVhcl83NDg0Xzg3NDUpIi8+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00NTMuOTggMTMzLjc5OEwyNjkuOTggMjcuNzU3NEMyNjEuMzI3IDIyLjc3MDQgMjUwLjY3MyAyMi43NzA0IDI0Mi4wMiAyNy43NTc0TDU4LjAxOTYgMTMzLjc5OEM0OS4zNDUzIDEzOC43OTcgNDQgMTQ4LjA0NyA0NCAxNTguMDZWMzUzLjk3MkM0NCAzNjMuOTg0IDQ5LjM0NTMgMzczLjIzNCA1OC4wMTk2IDM3OC4yMzNMMjQyLjAyIDQ4NC4yNzRDMjUwLjY3MyA0ODkuMjYxIDI2MS4zMjcgNDg5LjI2MSAyNjkuOTggNDg0LjI3NEw0NTMuOTggMzc4LjIzM0M0NjIuNjU1IDM3My4yMzQgNDY4IDM2My45ODQgNDY4IDM1My45NzJWMTU4LjA2QzQ2OCAxNDguMDQ3IDQ2Mi42NTUgMTM4Ljc5NyA0NTMuOTggMTMzLjc5OFpNMjgxLjk2NCA2Ljk2MTcxQzI2NS44OTMgLTIuMjk5NzQgMjQ2LjEwNyAtMi4yOTk3NCAyMzAuMDM2IDYuOTYxNzFMNDYuMDM2NSAxMTMuMDAyQzI5LjkyNzEgMTIyLjI4NiAyMCAxMzkuNDY2IDIwIDE1OC4wNlYzNTMuOTcyQzIwIDM3Mi41NjYgMjkuOTI3MSAzODkuNzQ1IDQ2LjAzNjUgMzk5LjAyOUwyMzAuMDM2IDUwNS4wN0MyNDYuMTA3IDUxNC4zMzEgMjY1Ljg5MyA1MTQuMzMxIDI4MS45NjQgNTA1LjA3TDQ2NS45NjQgMzk5LjAyOUM0ODIuMDczIDM4OS43NDUgNDkyIDM3Mi41NjYgNDkyIDM1My45NzJWMTU4LjA2QzQ5MiAxMzkuNDY2IDQ4Mi4wNzMgMTIyLjI4NiA0NjUuOTY0IDExMy4wMDJMMjgxLjk2NCA2Ljk2MTcxWiIgZmlsbD0iYmxhY2siLz48L2c+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yNTYgMTQwQzI0Mi43NDUgMTQwIDIzMiAxNTAuNzQ1IDIzMiAxNjRDMjMyIDE3Ny4yNTUgMjQyLjc0NSAxODggMjU2IDE4OEMyNjkuMjU1IDE4OCAyODAgMTc3LjI1NSAyODAgMTY0QzI4MCAxNTAuNzQ1IDI2OS4yNTUgMTQwIDI1NiAxNDBaTTI0OCAxNjRDMjQ4IDE1OS41ODIgMjUxLjU4MiAxNTYgMjU2IDE1NkMyNjAuNDE4IDE1NiAyNjQgMTU5LjU4MiAyNjQgMTY0QzI2NCAxNjguNDE4IDI2MC40MTggMTcyIDI1NiAxNzJDMjUxLjU4MiAxNzIgMjQ4IDE2OC40MTggMjQ4IDE2NFoiIGZpbGw9ImJsYWNrIi8+PHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNzIgMTkyQzE3MiAxNDUuNjA4IDIwOS42MDggMTA4IDI1NiAxMDhDMzAyLjM5MiAxMDggMzQwIDE0NS42MDggMzQwIDE5MkMzNDAgMjI3LjA2MSAzMTguNTE5IDI1Ny4xMDUgMjg4IDI2OS42OVYzODYuNjdDMjg4IDM5Mi4zOTEgMjg0Ljk0NiAzOTcuNjc2IDI3OS45ODkgNDAwLjUzM0wyNjMuOTg5IDQwOS43NTNDMjU5LjA0NCA0MTIuNjAzIDI1Mi45NTYgNDEyLjYwMyAyNDguMDExIDQwOS43NTNMMjMyLjAxMSA0MDAuNTMzQzIyNy4wNTQgMzk3LjY3NiAyMjQgMzkyLjM5MSAyMjQgMzg2LjY3VjM3MkMyMjQgMzY5Ljg3OCAyMjQuODQzIDM2Ny44NDQgMjI2LjM0MyAzNjYuMzQzTDIzNiAzNTYuNjg2VjM1NS4zMTRMMjI2LjM0MyAzNDUuNjU3QzIyNC44NDMgMzQ0LjE1NyAyMjQgMzQyLjEyMiAyMjQgMzQwVjMzMkMyMjQgMzI5Ljg3OCAyMjQuODQzIDMyNy44NDQgMjI2LjM0MyAzMjYuMzQzTDIzNiAzMTYuNjg2VjMxNS4zMTRMMjI2LjM0MyAzMDUuNjU3QzIyNC44NDMgMzA0LjE1NyAyMjQgMzAyLjEyMiAyMjQgMzAwVjI2OS42OUMxOTMuNDgxIDI1Ny4xMDUgMTcyIDIyNy4wNjEgMTcyIDE5MlpNMjU2IDEyNEMyMTguNDQ1IDEyNCAxODggMTU0LjQ0NSAxODggMTkyQzE4OCAyMjkuNTU1IDIxOC40NDUgMjYwIDI1NiAyNjBDMjkzLjU1NSAyNjAgMzI0IDIyOS41NTUgMzI0IDE5MkMzMjQgMTU0LjQ0NSAyOTMuNTU1IDEyNCAyNTYgMTI0Wk0yNTYgMjc2QzI2MS40NzEgMjc2IDI2Ni44MiAyNzUuNDc3IDI3MiAyNzQuNDc4VjM4Ni42N0wyNTYgMzk1Ljg5TDI0MCAzODYuNjdWMzc1LjMxNEwyNDkuNjU3IDM2NS42NTdDMjUxLjE1NyAzNjQuMTU3IDI1MiAzNjIuMTIyIDI1MiAzNjBWMzUyQzI1MiAzNDkuODc4IDI1MS4xNTcgMzQ3Ljg0NCAyNDkuNjU3IDM0Ni4zNDNMMjQwIDMzNi42ODZWMzM1LjMxNEwyNDkuNjU3IDMyNS42NTdDMjUxLjE1NyAzMjQuMTU3IDI1MiAzMjIuMTIyIDI1MiAzMjBWMzEyQzI1MiAzMDkuODc4IDI1MS4xNTcgMzA3Ljg0NCAyNDkuNjU3IDMwNi4zNDNMMjQwIDI5Ni42ODZWMjc0LjQ3OEMyNDUuMTggMjc1LjQ3NyAyNTAuNTI5IDI3NiAyNTYgMjc2WiIgZmlsbD0iYmxhY2siLz48L2c+PC9nPjxkZWZzPjxsaW5lYXJHcmFkaWVudCBpZD0icGFpbnQwX2xpbmVhcl83NDg0Xzg3NDUiIHgxPSIzOTMuODY1IiB5MT0iNjMuMjc5NiIgeDI9Ijk5LjIwNDMiIHkyPSI0MjkuOTk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+PHN0b3Agc3RvcC1jb2xvcj0iIzRERkY4OCIvPjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzNERThDQSIvPjwvbGluZWFyR3JhZGllbnQ+PGNsaXBQYXRoIGlkPSJjbGlwMF83NDg0Xzg3NDUiPjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPjwvY2xpcFBhdGg+PGNsaXBQYXRoIGlkPSJjbGlwMV83NDg0Xzg3NDUiPjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPjwvY2xpcFBhdGg+PGNsaXBQYXRoIGlkPSJjbGlwMl83NDg0Xzg3NDUiPjxyZWN0IHdpZHRoPSI1MTIiIGhlaWdodD0iNTEyIiBmaWxsPSJ3aGl0ZSIvPjwvY2xpcFBhdGg+PC9kZWZzPjwvc3ZnPg=="
     136        ],
     137        "d350af52-0351-4ba2-acd3-dfeeadc3f764" => [
     138            "name" => "pwSafe",
     139            "icon" => "data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB4bWxuczpzdmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjEiIGlkPSJzdmcyIiB3aWR0aD0iMTc3Ljc3NzMzIiBoZWlnaHQ9IjE3Ny43NzczMyIgdmlld0JveD0iMCAwIDE3Ny43NzczMyAxNzcuNzc3MzMiIHN0eWxlPSJ6b29tOiAxOyI+PGRlZnMgaWQ9ImRlZnM2Ij48Y2xpcFBhdGggY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiIGlkPSJjbGlwUGF0aDE2Ij48cGF0aCBkPSJNIDAsMTMyLjMzMyBIIDEzMy4zMzMgViAwIEggMCBaIiBpZD0icGF0aDE0Ij48L3BhdGg+PC9jbGlwUGF0aD48L2RlZnM+PGcgaWQ9Imc4IiB0cmFuc2Zvcm09Im1hdHJpeCgxLjMzMzMzMzMsMCwwLC0xLjMzMzMzMzMsMCwxNzYuNDQ0KSI+PGcgaWQ9ImcxMCI+PGcgaWQ9ImcxMiIgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoMTYpIj48ZyBpZD0iZzE4IiB0cmFuc2Zvcm09InRyYW5zbGF0ZSgxMTMuMTQ5NCw4NC42NjE2KSI+PHBhdGggZD0iTTAsMCBjLTkuNjIxLDE2LjI2NCAtMjMuNzA0LDI5Ljg4OCAtMzcuMjU0LDQwLjQzMyBjLTEuMDQyLDAuODEyIC0yLjA4MiwxLjYwNSAtMy4xMTQsMi4zOCBjLTEuODExLDEuMzU1IC0zLjYwMywyLjY1NCAtNS4zNjUsMy44OTYgYy0wLjUxOCwtMC4zNTYgLTEuMDM4LC0wLjcxOCAtMS41NjEsLTEuMDg0IGMtMTIuODUyLC05LjAxMiAtMjcuMjkyLC0yMS4wOTggLTM4LjU2NCwtMzUuODM2IGMtMi45NDMsLTMuODQ4IC01LjY3LC03Ljg3NiAtOC4wOTYsLTEyLjA3OCBjLTcuNDUsLTEyLjkwMiAtMTIuMDY1LC0yNy40NDEgLTE0Ljg4NSwtNDEuMzg4IGMtMS41ODIsLTcuODI0IC0yLjU5OSwtMTUuNDYyIC0zLjIzNSwtMjIuNTIxIGMxOC4xNTIsLTguNjMzIDQyLjM0NSwtMTcuMjYgNjYuNTQsLTE3LjI2IGMyMy4yNTcsMCA0Ni41MTQsNy45NzIgNjQuNDA3LDE2LjI1OSBjLTEuNiwyMC4wMzYgLTYuMjI1LDQ1LjMwNCAtMTguMzIyLDY2LjI1NyBDMC4zNjgsLTAuNjI2IDAuMTg2LC0wLjMxMyAwLDAgIiBpZD0icGF0aDIwIiBzdHlsZT0iZmlsbDojMjYzMjQ4O2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIj48L3BhdGg+PC9nPjxnIGlkPSJnMjIiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDk3LjE2MTEsNzQuNDk0NikiPjxwYXRoIGQ9Ik0wLDAgYy02LjQxNCwxMC44NDIgLTE1LjgwMywxOS45MjUgLTI0LjgzNSwyNi45NTUgYy0wLjY5NiwwLjU0MiAtMS4zODgsMS4wNjkgLTIuMDc3LDEuNTg3IGMtMS4yMDYsMC45MDMgLTIuNDAxLDEuNzY5IC0zLjU3NiwyLjU5NyBjLTAuMzQ2LC0wLjIzOCAtMC42OTQsLTAuNDc5IC0xLjA0MSwtMC43MjMgYy04LjU2OSwtNi4wMDggLTE4LjE5NiwtMTQuMDY1IC0yNS43MSwtMjMuODkgYy0xLjk2MiwtMi41NjYgLTMuNzgsLTUuMjUxIC01LjM5NywtOC4wNTIgYy00Ljk2NywtOC42MDEgLTguMDQzLC0xOC4yOTQgLTkuOTI0LC0yNy41OTMgYy0xLjA1NSwtNS4yMTYgLTEuNzMyLC0xMC4zMDggLTIuMTU2LC0xNS4wMTMgYzEyLjEwMiwtNS43NTUgMjguMjMxLC0xMS41MDYgNDQuMzYxLC0xMS41MDYgYzE1LjUwMywtMC4wMDEgMzEuMDA4LDUuMzE0IDQyLjkzNywxMC44MzkgQzExLjUxNiwtMzEuNDQyIDguNDMzLC0xNC41OTcgMC4zNjcsLTAuNjI3IEMwLjI0NiwtMC40MTggMC4xMjQsLTAuMjA5IDAsMCAiIGlkPSJwYXRoMjQiIHN0eWxlPSJmaWxsOiM3Zjg5YTE7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiPjwvcGF0aD48L2c+PGcgaWQ9ImcyNiIgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoODEuNjI4OSw2NS4zMzc5KSI+PHBhdGggZD0iTTAsMC43NTAwNSBjLTMuMjA4LDUuNDIxIC03LjkwMiw5Ljk2MiAtMTIuNDIsMTMuNDc4IGMtMC4zNDcsMC4yNyAtMC42OTMsMC41MzQgLTEuMDM4LDAuNzkzIGMtMC42MDQsMC40NTIgLTEuMiwwLjg4NSAtMS43ODcsMS4yOTkgYy0wLjE3MywtMC4xMiAtMC4zNDgsLTAuMjQgLTAuNTIxLC0wLjM2MiBjLTQuMjg0LC0zLjAwNCAtOS4wOTcsLTcuMDMyIC0xMi44NTUsLTExLjk0NSBjLTAuOTgxLC0xLjI4MyAtMS44OSwtMi42MjYgLTIuNjk4LC00LjAyNyBjLTIuNDgzLC00LjI5OSAtNC4wMjIsLTkuMTQ3IC00Ljk2MiwtMTMuNzk2IGMtMC41MjcsLTIuNjA4IC0wLjg2NywtNS4xNTQgLTEuMDc4LC03LjUwNiBjNi4wNSwtMi44NzggMTQuMTE1LC01Ljc1MyAyMi4xOCwtNS43NTMgYzcuNzUyLDAgMTUuNTA0LDIuNjU3IDIxLjQ2OSw1LjQyIEM1Ljc1OCwtMTQuOTcxOTUxIDQuMjE1LC02LjU0Nzk1IDAuMTgyLDAuNDM2MDUgQzAuMTIyLDAuNTQyMDUgMC4wNjEsMC42NDYwNSAwLDAuNzUwMDUgIiBpZD0icGF0aDI4IiBzdHlsZT0iZmlsbDojZjc5NzFkO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIj48L3BhdGg+PC9nPjwvZz48L2c+PC9nPjwvc3ZnPg=="
     140        ],
    133141    ];
    134142
  • secure-passkeys/trunk/src/views/admin/vue/components/settings/advanced-settings.vue.php

    r3262385 r3338906  
    4343  <table class="form-table" :class="{'loading-blur': isLoading}" width="100%">
    4444    <tbody>
    45       <!-- Challenge Cleanup Settings -->
    4645      <tr>
    4746        <th style="width: 200px">
     
    115114                ><?php esc_html_e('This results in the loss of activity log history.', 'secure-passkeys'); ?></span
    116115              >
     116            </p>
     117          </label>
     118        </td>
     119      </tr>
     120
     121      <tr>
     122        <th style="width: 200px">
     123          <label for="stop_log_records_enabled" class="inline-label">
     124            <?php esc_html_e('Disable Activity Log Recording', 'secure-passkeys'); ?>
     125          </label>
     126        </th>
     127        <td>
     128          <label for="stop_log_records_enabled">
     129            <input
     130              name="stop_log_records_enabled"
     131              type="checkbox"
     132              id="stop_log_records_enabled"
     133              v-model="settings.stop_log_records_enabled"
     134              true-value="1"
     135              false-value="0"
     136              :disabled="submitting || isLoading"
     137            />
     138            <?php esc_html_e('Disable the creation of new activity log records.', 'secure-passkeys'); ?>
     139            <p class="help">
     140              <?php esc_html_e('This will prevent new activity log records from being created.', 'secure-passkeys'); ?>
    117141            </p>
    118142          </label>
  • secure-passkeys/trunk/src/views/admin/vue/components/settings/display-settings.vue.php

    r3262385 r3338906  
    206206        </td>
    207207      </tr>
     208      <tr>
     209        <th style="width: 200px">
     210          <label for="display_passkey_login_ultimate_member_enabled" class="inline-label">
     211            <?php esc_html_e('Login for Ultimate Member', 'secure-passkeys'); ?>
     212          </label>
     213        </th>
     214        <td>
     215          <label for="display_passkey_login_ultimate_member_enabled">
     216            <input
     217              name="display_passkey_login_ultimate_member_enabled"
     218              type="checkbox"
     219              id="display_passkey_login_ultimate_member_enabled"
     220              v-model="settings.display_passkey_login_ultimate_member_enabled"
     221              true-value="1"
     222              false-value="0"
     223              :disabled="submitting || isLoading"
     224            />
     225            <?php esc_html_e('Enable Passkey Login for Ultimate Member login form.', 'secure-passkeys'); ?>
     226          </label>
     227          <div>
     228            <p class="help">
     229              <?php
     230              // translators: %s represents the name of the required plugin (e.g., "Ultimate Member").
     231              printf(esc_html__('The %s plugin must be installed and activated to work correctly.', 'secure-passkeys'), 'Ultimate Member');
     232              ?>
     233            </p>
     234          </div>
     235        </td>
     236      </tr>
    208237    </tbody>
    209238  </table>
  • secure-passkeys/trunk/src/views/admin/vue/components/settings/general-settings.vue.php

    r3262385 r3338906  
    125125        </td>
    126126      </tr>
     127     
     128      <tr>
     129        <th>
     130          <label for="auto_generate_security_key_name" class="inline-label"
     131            ><?php esc_html_e('Auto Generate Security Key Name', 'secure-passkeys'); ?></label
     132          >
     133        </th>
     134        <td>
     135          <label for="auto_generate_security_key_name">
     136            <input
     137              name="auto_generate_security_key_name"
     138              type="checkbox"
     139              id="auto_generate_security_key_name"
     140              v-model="settings.auto_generate_security_key_name"
     141              true-value="1"
     142              false-value="0"
     143              :disabled="submitting || isLoading"
     144            />
     145            <?php esc_html_e('Enable or disable the automatic generation of a security key name.', 'secure-passkeys'); ?>
     146            <p class="help">
     147              <?php esc_html_e('If enabled, users will not be prompted to enter a security key name manually when registering a passkey.', 'secure-passkeys'); ?>
     148            </p>
     149          </label>
     150        </td>
     151      </tr>
    127152    </tbody>
    128153  </table>
  • secure-passkeys/trunk/src/views/admin/vue/profile.php

    r3262385 r3338906  
    8585                    <strong>{{ i18n.security_key_name }}</strong>
    8686                    <br />
    87                     <span v-html="i18n.security_key_description"></span>
     87                    <span v-text="i18n.security_key_description" class="multiline-text"></span>
    8888                  </p>
    8989                  <div class="input-wrapper">
  • secure-passkeys/trunk/src/views/frontend/default/login.shortcode.php

    r3262385 r3338906  
    88defined('ABSPATH') || exit;
    99?>
    10 <div class="secure-passkey-login-short-code-wrapper" id="secure-passkey-login-wrapper">
     10<div class="secure-passkey-login-short-code-wrapper <?php echo esc_attr($extra_wrapper_classes ?? ''); ?>" id="secure-passkey-login-wrapper">
    1111    <div id="errorMessage" class="notice notice-error" style="display: none;"></div>
    1212    <div id="successMessage" class="notice notice-success" style="display: none;"></div>
    13     <button id="login-via-passkey" class="button button-large login-via-passkey">
     13    <button id="login-via-passkey" class="button button-large login-via-passkey <?php echo esc_attr($extra_button_classes ?? ''); ?>">
    1414        <span id="spinnerText" style="display: none;"><?php esc_html_e('Login via Passkey..', 'secure-passkeys') ;?></span>
    1515        <span id="buttonText"><?php esc_html_e('Login via Passkey', 'secure-passkeys') ;?></span>
  • secure-passkeys/trunk/src/views/frontend/default/register.php

    r3262385 r3338906  
    7070          <strong>{{ i18n.security_key_name }}</strong>
    7171          <br />
    72           <span v-html="i18n.security_key_description"></span>
     72          <span v-text="i18n.security_key_description" class="multiline-text"></span>
    7373        </p>
    7474        <div class="input-wrapper">
  • secure-passkeys/trunk/src/views/frontend/yootheme/login.shortcode.php

    r3262385 r3338906  
    88defined('ABSPATH') || exit;
    99?>
    10 <div class="uk-container uk-text-center" id="secure-passkey-login-wrapper">
     10<div class="uk-container uk-text-center <?php echo esc_attr($extra_wrapper_classes ?? ''); ?>" id="secure-passkey-login-wrapper">
    1111    <div id="errorMessage" class="uk-alert-danger" uk-alert style="display: none;"></div>
    1212    <div id="successMessage" class="uk-alert-success" uk-alert style="display: none;"></div>
    13     <button id="login-via-passkey" class="uk-button uk-button-default">
     13    <button id="login-via-passkey" class="uk-button uk-button-default <?php echo esc_attr($extra_button_classes ?? ''); ?>">
    1414        <span id="spinnerText" style="display: none;"><?php esc_html_e('Login via Passkey..', 'secure-passkeys'); ?></span>
    1515        <span id="buttonText"><?php esc_html_e('Login via Passkey', 'secure-passkeys'); ?></span>
  • secure-passkeys/trunk/src/views/frontend/yootheme/register.php

    r3262385 r3338906  
    5555          <strong>{{ i18n.security_key_name }}</strong
    5656          ><br />
    57           <span v-html="i18n.security_key_description"></span>
     57          <span v-text="i18n.security_key_description" class="multiline-text"></span>
    5858        </p>
    5959        <div class="uk-inline uk-width-1-1">
Note: See TracChangeset for help on using the changeset viewer.