OwlCyberSecurity - MANAGER
Edit File: User_Input.php
<?php /** * Class Google\Site_Kit\Core\User_Input\User_Input * * @package Google\Site_Kit\Core\User_Input * @copyright 2022 Google LLC * @license https://www.apache.org/licenses/LICENSE-2.0 Apache License 2.0 * @link https://sitekit.withgoogle.com */ namespace Google\Site_Kit\Core\User_Input; use ArrayAccess; use Google\Site_Kit\Context; use Google\Site_Kit\Core\Key_Metrics\Key_Metrics_Setup_Completed_By; use Google\Site_Kit\Core\Storage\Options; use Google\Site_Kit\Core\Storage\User_Options; use Google\Site_Kit\Core\User_Surveys\Survey_Queue; use WP_Error; use WP_User; /** * Class for handling User Input settings. * * @since 1.90.0 * @access private * @ignore */ class User_Input { /** * Site_Specific_Answers instance. * * @since 1.90.0 * @var Site_Specific_Answers */ protected $site_specific_answers; /** * User_Options instance. * * @since 1.90.0 * @var User_Options */ protected $user_options; /** * User_Specific_Answers instance. * * @since 1.90.0 * @var User_Specific_Answers */ protected $user_specific_answers; /** * REST_User_Input_Controller instance. * * @since 1.90.0 * @var REST_User_Input_Controller */ protected $rest_controller; /** * User Input questions. * * @since 1.90.0 * @var array|ArrayAccess */ private static $questions = array( 'purpose' => array( 'scope' => 'site', ), 'postFrequency' => array( 'scope' => 'user', ), 'goals' => array( 'scope' => 'user', ), 'includeConversionEvents' => array( 'scope' => 'site', ), ); /** * Constructor. * * @since 1.90.0 * * @param Context $context Plugin context. * @param Options $options Optional. Options instance. Default a new instance. * @param User_Options $user_options Optional. User_Options instance. Default a new instance. * @param Survey_Queue $survey_queue Optional. Survey_Queue instance. Default a new instance. */ public function __construct( Context $context, Options $options = null, User_Options $user_options = null, Survey_Queue $survey_queue = null ) { $this->site_specific_answers = new Site_Specific_Answers( $options ?: new Options( $context ) ); $this->user_options = $user_options ?: new User_Options( $context ); $this->user_specific_answers = new User_Specific_Answers( $this->user_options ); $this->rest_controller = new REST_User_Input_Controller( $this, $survey_queue ?: new Survey_Queue( $this->user_options ), new Key_Metrics_Setup_Completed_By( $options ?: new Options( $context ) ) ); } /** * Registers functionality. * * @since 1.90.0 */ public function register() { $this->site_specific_answers->register(); $this->user_specific_answers->register(); $this->rest_controller->register(); } /** * Gets the set of user input questions. * * @since 1.90.0 * * @return array The user input questions. */ public static function get_questions() { return static::$questions; } /** * Gets user input answers. * * @since 1.90.0 * * @return array|WP_Error User input answers. */ public function get_answers() { $questions = static::$questions; $site_answers = $this->site_specific_answers->get(); $user_answers = $this->user_specific_answers->get(); $settings = array_merge( is_array( $site_answers ) ? $site_answers : array(), is_array( $user_answers ) ? $user_answers : array() ); // If there are no settings, return default empty values. if ( empty( $settings ) ) { array_walk( $questions, function ( &$question ) { $question['values'] = array(); } ); return $questions; } foreach ( $settings as &$setting ) { if ( ! isset( $setting['answeredBy'] ) ) { continue; } $answered_by = intval( $setting['answeredBy'] ); if ( ! $answered_by || $answered_by === $this->user_options->get_user_id() ) { continue; } $setting['author'] = array( 'photo' => get_avatar_url( $answered_by ), 'login' => ( new WP_User( $answered_by ) )->user_login, ); } // If there are un-answered questions, return default empty values for them. foreach ( $questions as $question_key => $question_value ) { if ( ! isset( $settings[ $question_key ] ) ) { $settings[ $question_key ] = $question_value; $settings[ $question_key ]['values'] = array(); } } return $settings; } /** * Determines whether the current user input settings have empty values or not. * * @since 1.90.0 * * @param array $settings The settings to check. * @return boolean|null TRUE if at least one of the settings has empty values, otherwise FALSE. */ public function are_settings_empty( $settings = array() ) { if ( empty( $settings ) ) { $settings = $this->get_answers(); if ( is_wp_error( $settings ) ) { return null; } } // Conversion events may be empty during setup if no events have been detected. // Since this setting does not affect whether user input is considered "set up", // we are excluding it from this check. It relates to user input initially being // set up with detected events or events added later. unset( $settings['includeConversionEvents'] ); foreach ( $settings as $setting ) { if ( empty( $setting['values'] ) ) { return true; } } return false; } /** * Sets user input answers. * * @since 1.90.0 * * @param array $settings User settings. * @return array|WP_Error User input answers. */ public function set_answers( $settings ) { $site_settings = array(); $user_settings = array(); foreach ( $settings as $setting_key => $answers ) { $setting_data = array(); $setting_data['values'] = $answers; $setting_data['scope'] = static::$questions[ $setting_key ]['scope']; if ( 'site' === $setting_data['scope'] ) { $existing_answers = $this->get_answers(); $answered_by = $this->user_options->get_user_id(); if ( // If the answer to the "purpose" question changed, // attribute the answer to the current user changing the // answer. ( ! empty( $existing_answers['purpose']['values'] ) && ! empty( array_diff( $existing_answers['purpose']['values'], $answers ) ) ) || // If the answer to the "purpose" question was empty, // attribute the answer to the current user. empty( $existing_answers['purpose']['answeredBy'] ) ) { $answered_by = $this->user_options->get_user_id(); } else { // Otherwise, attribute the answer to the user who answered // the question previously. $answered_by = $existing_answers['purpose']['answeredBy']; } $setting_data['answeredBy'] = $answered_by; $site_settings[ $setting_key ] = $setting_data; } elseif ( 'user' === $setting_data['scope'] ) { $user_settings[ $setting_key ] = $setting_data; } } $this->site_specific_answers->set( $site_settings ); $this->user_specific_answers->set( $user_settings ); return $this->get_answers(); } }