tfa = $tfa; if (!is_admin()) return; // Add to Settings menu on sites add_action('admin_menu', array($this, 'menu_entry_for_admin')); // Add settings link in plugin list $plugin = plugin_basename(SIMBA_TFA_PLUGIN_FILE); add_filter("plugin_action_links_".$plugin, array($this, 'add_plugin_settings_link')); add_filter('network_admin_plugin_action_links_'.$plugin, array($this, 'add_plugin_settings_link')); // Entry that everybody gets add_action('network_admin_menu', array($this, 'admin_menu')); add_action('admin_menu', array($this, 'admin_menu')); // Add TFA column on users list add_action('manage_users_columns', array($this, 'manage_users_columns_tfa')); add_action('wpmu_users_columns', array($this, 'manage_users_columns_tfa')); add_action('manage_users_custom_column', array($this, 'manage_users_custom_column_tfa'), 10, 3); // Needed users.php CSS. add_action('admin_print_styles-users.php', array($this, 'load_users_css'), 10, 0); } /** * Enqueue CSS styling on the users page */ public function load_users_css() { wp_enqueue_style( 'tfa-users-css', SIMBA_TFA_PLUGIN_URL.'/css/users.css', array(), $this->tfa->version, 'screen' ); } /** * Runs upon the WP filters plugin_action_links_(plugin) and network_plugin_action_links_(plugin) * * @param Array $links * * @return Array */ public function add_plugin_settings_link($links) { if (!is_network_admin()) { $link = ''.__('Plugin settings', 'two-factor-authentication').''; array_unshift($links, $link); } else { switch_to_blog(1); $link = ''.__('Plugin settings', 'two-factor-authentication').''; restore_current_blog(); array_unshift($links, $link); } $link2 = ''.__('User settings', 'two-factor-authentication').''; array_unshift($links, $link2); return $links; } /** * Runs upon the WP action admin_menu */ public function admin_menu() { $this->tfa->get_totp_controller()->potentially_port_private_keys(); global $current_user; if(!$this->tfa->is_activated_for_user($current_user->ID)) return; add_menu_page(__('Two Factor Authentication', 'two-factor-authentication'), __('Two Factor Auth', 'two-factor-authentication'), 'read', 'two-factor-auth-user', array($this, 'show_user_settings_page'), SIMBA_TFA_PLUGIN_URL.'/img/tfa_admin_icon_16x16.png', 72); } /** * Include the user settings page code */ public function show_user_settings_page() { global $current_user; $totp_controller = $this->tfa->get_totp_controller(); if (!empty($_REQUEST['_tfa_activate_nonce']) && !empty($_POST['tfa_enable_tfa']) && wp_verify_nonce($_REQUEST['_tfa_activate_nonce'], 'tfa_activate') && !empty($_GET['settings-updated'])) { $this->tfa->change_tfa_enabled_status($current_user->ID, $_POST['tfa_enable_tfa']); $tfa_settings_saved = true; } // TODO: This should go in the TOTP class if (!empty($_REQUEST['_tfa_algorithm_nonce']) && !empty($_POST['tfa_algorithm_type']) && !empty($_GET['settings-updated']) && wp_verify_nonce($_REQUEST['_tfa_algorithm_nonce'], 'tfa_algorithm')) { $old_algorithm = $totp_controller->get_user_otp_algorithm($current_user->ID); if ($old_algorithm != $_POST['tfa_algorithm_type']) { $totp_controller->changeUserAlgorithmTo($current_user->ID, $_POST['tfa_algorithm_type']); } $tfa_settings_saved = true; } if (!empty($_GET['warning_button_clicked']) && !empty($_REQUEST['resyncnonce']) && wp_verify_nonce($_REQUEST['resyncnonce'], 'tfaresync')) { delete_user_meta($current_user->ID, 'tfa_hotp_off_sync'); } include SIMBA_TFA_PLUGIN_DIR.'/includes/user_settings.php'; } /** * Runs upon the WP action admin_menu */ public function menu_entry_for_admin() { if (is_multisite() && (!is_super_admin() || !is_main_site())) return; add_action('admin_init', array($this, 'register_two_factor_auth_settings')); add_options_page( __('Two Factor Authentication', 'two-factor-authentication'), __('Two Factor Authentication', 'two-factor-authentication'), $this->tfa->get_management_capability(), 'two-factor-auth', array($this, 'show_admin_settings_page') ); } /** * Include the admin settings page code */ public function show_admin_settings_page() { $simba_two_factor_authentication = $this->tfa; $totp_controller = $this->tfa->get_totp_controller(); $totp_controller->setUserHMACTypes(); if (!is_admin() || !current_user_can($this->tfa->get_management_capability())) return; require_once(SIMBA_TFA_PLUGIN_DIR.'/includes/admin_settings.php'); } /** * Add the 2FA label to the users list table header. * * @param Array $columns Table columns. * * @return Array */ public function manage_users_columns_tfa($columns = array()) { $columns['tfa-status'] = __('2FA', 'two-factor-authentication'); return $columns; } /** * Add status into TFA column. * * @param String $value String. * @param String $column_name Column name. * @param Integer $user_id User ID. * * @return String */ public function manage_users_custom_column_tfa($value = '', $column_name = '', $user_id = 0) { // Only for this column name. if ('tfa-status' === $column_name) { if (!$this->tfa->is_activated_for_user($user_id)) { $value = '—'; } elseif ($this->tfa->is_activated_by_user($user_id)) { // Use value. $value = ''; } else { // No group. $value = ''; } } return $value; } /** * Runs upon the WP action admin_init */ public function register_two_factor_auth_settings() { global $wp_roles; if (!isset($wp_roles)) $wp_roles = new WP_Roles(); foreach ($wp_roles->role_names as $id => $name) { register_setting('tfa_user_roles_group', 'tfa_'.$id); register_setting('tfa_user_roles_trusted_group', 'tfa_trusted_'.$id); register_setting('tfa_user_roles_required_group', 'tfa_required_'.$id); } if (is_multisite()) { register_setting('tfa_user_roles_group', 'tfa__super_admin'); register_setting('tfa_user_roles_trusted_group', 'tfa_trusted__super_admin'); register_setting('tfa_user_roles_required_group', 'tfa_required__super_admin'); } register_setting('tfa_user_roles_required_group', 'tfa_requireafter'); register_setting('tfa_user_roles_required_group', 'tfa_if_required_redirect_to'); register_setting('tfa_user_roles_required_group', 'tfa_hide_turn_off'); register_setting('tfa_user_roles_trusted_group', 'tfa_trusted_for'); register_setting('simba_tfa_woocommerce_group', 'tfa_wc_add_section'); register_setting('simba_tfa_woocommerce_group', 'tfa_bot_protection'); register_setting('simba_tfa_default_hmac_group', 'tfa_default_hmac'); register_setting('tfa_xmlrpc_status_group', 'tfa_xmlrpc_on'); } }