OrderPK ! m0 0 9 admin/bsf-analytics/assets/css/minified/style-rtl.min.cssnu [ [ID*="-optin-notice"]{padding:1px 12px;border-right-color:#007cba}[ID*="-optin-notice"] .notice-container{padding-top:10px;padding-bottom:12px}[ID*="-optin-notice"] .notice-content{margin:0}[ID*="-optin-notice"] .notice-heading{padding:0 0 12px 20px}[ID*="-optin-notice"] .button-primary{margin-left:5px}PK ! [0 0 5 admin/bsf-analytics/assets/css/minified/style.min.cssnu [ [ID*="-optin-notice"]{padding:1px 12px;border-left-color:#007cba}[ID*="-optin-notice"] .notice-container{padding-top:10px;padding-bottom:12px}[ID*="-optin-notice"] .notice-content{margin:0}[ID*="-optin-notice"] .notice-heading{padding:0 20px 12px 0}[ID*="-optin-notice"] .button-primary{margin-right:5px}PK ! q q 7 admin/bsf-analytics/assets/css/unminified/style-rtl.cssnu [ [ID*="-optin-notice"] { padding: 1px 12px; border-right-color: #007cba; } [ID*="-optin-notice"] .notice-container { padding-top: 10px; padding-bottom: 12px; } [ID*="-optin-notice"] .notice-content { margin: 0; } [ID*="-optin-notice"] .notice-heading { padding: 0 0 12px 20px; } [ID*="-optin-notice"] .button-primary { margin-left: 5px; }PK ! q q 3 admin/bsf-analytics/assets/css/unminified/style.cssnu [ [ID*="-optin-notice"] { padding: 1px 12px; border-left-color: #007cba; } [ID*="-optin-notice"] .notice-container { padding-top: 10px; padding-bottom: 12px; } [ID*="-optin-notice"] .notice-content { margin: 0; } [ID*="-optin-notice"] .notice-heading { padding: 0 20px 12px 0; } [ID*="-optin-notice"] .button-primary { margin-right: 5px; }PK ! 2 admin/bsf-analytics/class-bsf-analytics-loader.phpnu [ entities, $data ); } /** * Load Analytics library. * * @return void */ public function load_analytics() { $unique_entities = array(); if ( ! empty( $this->entities ) ) { foreach ( $this->entities as $entity ) { foreach ( $entity as $key => $data ) { if ( isset( $data['path'] ) ) { if ( file_exists( $data['path'] . '/version.json' ) ) { $file_contents = file_get_contents( $data['path'] . '/version.json' ); // phpcs:ignore WordPress.WP.AlternativeFunctions.file_get_contents_file_get_contents $analytics_version = json_decode( $file_contents, 1 ); $analytics_version = $analytics_version['bsf-analytics-ver']; if ( version_compare( $analytics_version, $this->analytics_version, '>' ) ) { $this->analytics_version = $analytics_version; $this->analytics_path = $data['path']; } } } if ( ! isset( $unique_entities[ $key ] ) ) { $unique_entities[ $key ] = $data; } } } if ( file_exists( $this->analytics_path ) && ! class_exists( 'BSF_Analytics' ) ) { require_once $this->analytics_path . '/class-bsf-analytics.php'; new BSF_Analytics( $unique_entities, $this->analytics_path, $this->analytics_version ); } } } } PK ! SQYc c 1 admin/bsf-analytics/class-bsf-analytics-stats.phpnu [ get_default_stats() ); } /** * Retrieve stats for site. * * @return array stats data. * @since 1.0.0 */ private function get_default_stats() { return array( 'graupi_version' => defined( 'BSF_UPDATER_VERSION' ) ? BSF_UPDATER_VERSION : false, 'domain_name' => get_site_url(), 'php_os' => PHP_OS, 'server_software' => isset( $_SERVER['SERVER_SOFTWARE'] ) ? filter_var( wp_unslash( $_SERVER['SERVER_SOFTWARE'] ), FILTER_SANITIZE_STRING ) : '', 'mysql_version' => $this->get_mysql_version(), 'php_version' => $this->get_php_version(), 'php_max_input_vars' => ini_get( 'max_input_vars' ), // phpcs:ignore:PHPCompatibility.IniDirectives.NewIniDirectives.max_input_varsFound 'php_post_max_size' => ini_get( 'post_max_size' ), 'php_max_execution_time' => ini_get( 'max_execution_time' ), 'php_memory_limit' => ini_get( 'memory_limit' ), 'zip_installed' => extension_loaded( 'zip' ), 'imagick_availabile' => extension_loaded( 'imagick' ), 'xmlreader_exists' => class_exists( 'XMLReader' ), 'gd_available' => extension_loaded( 'gd' ), 'curl_version' => $this->get_curl_version(), 'curl_ssl_version' => $this->get_curl_ssl_version(), 'is_writable' => $this->is_content_writable(), 'wp_version' => get_bloginfo( 'version' ), 'user_count' => $this->get_user_count(), 'site_language' => get_locale(), 'timezone' => wp_timezone_string(), 'is_ssl' => is_ssl(), 'is_multisite' => is_multisite(), 'network_url' => network_site_url(), 'external_object_cache' => (bool) wp_using_ext_object_cache(), 'wp_debug' => WP_DEBUG, 'wp_debug_display' => WP_DEBUG_DISPLAY, 'script_debug' => SCRIPT_DEBUG, 'active_plugins' => $this->get_active_plugins(), 'active_theme' => get_template(), 'active_stylesheet' => get_stylesheet(), ); } /** * Get installed PHP version. * * @return float PHP version. * @since 1.0.0 */ private function get_php_version() { if ( defined( 'PHP_MAJOR_VERSION' ) && defined( 'PHP_MINOR_VERSION' ) && defined( 'PHP_RELEASE_VERSION' ) ) { // phpcs:ignore return PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION; } return phpversion(); } /** * User count on site. * * @return int User count. * @since 1.0.0 */ private function get_user_count() { if ( is_multisite() ) { $user_count = get_user_count(); } else { $count = count_users(); $user_count = $count['total_users']; } return $user_count; } /** * Get active plugin's data. * * @return array active plugin's list. * @since 1.0.0 */ private function get_active_plugins() { if ( ! $this->plugins ) { // Ensure get_plugin_data function is loaded. if ( ! function_exists( 'get_plugin_data' ) ) { require_once ABSPATH . 'wp-admin/includes/plugin.php'; } $plugins = wp_get_active_and_valid_plugins(); $plugins = array_map( 'get_plugin_data', $plugins ); $this->plugins = array_map( array( $this, 'format_plugin' ), $plugins ); } return $this->plugins; } /** * Format plugin data. * * @param string $plugin plugin. * @return array formatted plugin data. * @since 1.0.0 */ public function format_plugin( $plugin ) { return array( 'name' => html_entity_decode( $plugin['Name'], ENT_COMPAT, 'UTF-8' ), 'url' => $plugin['PluginURI'], 'version' => $plugin['Version'], 'slug' => $plugin['TextDomain'], 'author_name' => html_entity_decode( wp_strip_all_tags( $plugin['Author'] ), ENT_COMPAT, 'UTF-8' ), 'author_url' => $plugin['AuthorURI'], ); } /** * Curl SSL version. * * @return float SSL version. * @since 1.0.0 */ private function get_curl_ssl_version() { $curl = array(); if ( function_exists( 'curl_version' ) ) { $curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version } return isset( $curl['ssl_version'] ) ? $curl['ssl_version'] : false; } /** * Get cURL version. * * @return float cURL version. * @since 1.0.0 */ private function get_curl_version() { if ( function_exists( 'curl_version' ) ) { $curl = curl_version(); // phpcs:ignore WordPress.WP.AlternativeFunctions.curl_curl_version } return isset( $curl['version'] ) ? $curl['version'] : false; } /** * Get MySQL version. * * @return float MySQL version. * @since 1.0.0 */ private function get_mysql_version() { global $wpdb; return $wpdb->db_version(); } /** * Check if content directory is writable. * * @return bool * @since 1.0.0 */ private function is_content_writable() { $upload_dir = wp_upload_dir(); return wp_is_writable( $upload_dir['basedir'] ); } } } /** * Polyfill for sites using WP version less than 5.3 */ if ( ! function_exists( 'wp_timezone_string' ) ) { /** * Get timezone string. * * @return string timezone string. * @since 1.0.0 */ function wp_timezone_string() { $timezone_string = get_option( 'timezone_string' ); if ( $timezone_string ) { return $timezone_string; } $offset = (float) get_option( 'gmt_offset' ); $hours = (int) $offset; $minutes = ( $offset - $hours ); $sign = ( $offset < 0 ) ? '-' : '+'; $abs_hour = abs( $hours ); $abs_mins = abs( $minutes * 60 ); $tz_offset = sprintf( '%s%02d:%02d', $sign, $abs_hour, $abs_mins ); return $tz_offset; } } PK ! "7 "7 + admin/bsf-analytics/class-bsf-analytics.phpnu [ entities = $args; define( 'BSF_ANALYTICS_VERSION', $analytics_version ); define( 'BSF_ANALYTICS_URI', $this->get_analytics_url( $analytics_path ) ); add_action( 'admin_init', array( $this, 'handle_optin_optout' ) ); add_action( 'admin_notices', array( $this, 'option_notice' ) ); add_action( 'init', array( $this, 'maybe_track_analytics' ), 99 ); $this->set_actions(); add_action( 'admin_init', array( $this, 'register_usage_tracking_setting' ) ); $this->includes(); } /** * Setup actions for admin notice style and analytics cron event. * * @since 1.0.4 */ public function set_actions() { foreach ( $this->entities as $key => $data ) { add_action( 'astra_notice_before_markup_' . $key . '-optin-notice', array( $this, 'enqueue_assets' ) ); add_action( 'update_option_' . $key . '_analytics_optin', array( $this, 'update_analytics_option_callback' ), 10, 3 ); add_action( 'add_option_' . $key . '_analytics_optin', array( $this, 'add_analytics_option_callback' ), 10, 2 ); } } /** * BSF Analytics URL * * @param string $analytics_path directory path to analytics library. * @return String URL of bsf-analytics directory. * @since 1.0.0 */ public function get_analytics_url( $analytics_path ) { $content_dir_path = wp_normalize_path( WP_CONTENT_DIR ); $analytics_path = wp_normalize_path( $analytics_path ); return str_replace( $content_dir_path, content_url(), $analytics_path ); } /** * Get API URL for sending analytics. * * @return string API URL. * @since 1.0.0 */ private function get_api_url() { return defined( 'BSF_API_URL' ) ? BSF_API_URL : 'https://support.brainstormforce.com/'; } /** * Enqueue Scripts. * * @since 1.0.0 * @return void */ public function enqueue_assets() { /** * Load unminified if SCRIPT_DEBUG is true. * * Directory and Extensions. */ $dir_name = ( SCRIPT_DEBUG ) ? 'unminified' : 'minified'; $file_rtl = ( is_rtl() ) ? '-rtl' : ''; $css_ext = ( SCRIPT_DEBUG ) ? '.css' : '.min.css'; $css_uri = BSF_ANALYTICS_URI . '/assets/css/' . $dir_name . '/style' . $file_rtl . $css_ext; wp_enqueue_style( 'bsf-analytics-admin-style', $css_uri, false, BSF_ANALYTICS_VERSION, 'all' ); } /** * Send analytics API call. * * @since 1.0.0 */ public function send() { wp_remote_post( $this->get_api_url() . 'wp-json/bsf-core/v1/analytics/', array( 'body' => BSF_Analytics_Stats::instance()->get_stats(), 'timeout' => 5, 'blocking' => false, ) ); } /** * Check if usage tracking is enabled. * * @return bool * @since 1.0.0 */ public function is_tracking_enabled() { foreach ( $this->entities as $key => $data ) { $is_enabled = get_site_option( $key . '_analytics_optin' ) === 'yes' ? true : false; $is_enabled = $this->is_white_label_enabled( $key ) ? false : $is_enabled; if ( apply_filters( $key . '_tracking_enabled', $is_enabled ) ) { return true; } } return false; } /** * Check if WHITE label is enabled for BSF products. * * @param string $source source of analytics. * @return bool * @since 1.0.0 */ public function is_white_label_enabled( $source ) { $options = apply_filters( $source . '_white_label_options', array() ); $is_enabled = false; if ( is_array( $options ) ) { foreach ( $options as $option ) { if ( true === $option ) { $is_enabled = true; break; } } } return $is_enabled; } /** * Display admin notice for usage tracking. * * @since 1.0.0 */ public function option_notice() { if ( ! current_user_can( 'manage_options' ) ) { return; } foreach ( $this->entities as $key => $data ) { $time_to_display = isset( $data['time_to_display'] ) ? $data['time_to_display'] : '+24 hours'; $usage_doc_link = isset( $data['usage_doc_link'] ) ? $data['usage_doc_link'] : $this->usage_doc_link; // Don't display the notice if tracking is disabled or White Label is enabled for any of our plugins. if ( false !== get_site_option( $key . '_analytics_optin', false ) || $this->is_white_label_enabled( $key ) ) { continue; } // Show tracker consent notice after 24 hours from installed time. if ( strtotime( $time_to_display, $this->get_analytics_install_time( $key ) ) > time() ) { continue; } /* translators: %s product name */ $notice_string = __( 'Want to help make %1s even more awesome? Allow us to collect non-sensitive diagnostic data and usage information. ', 'customizer-search' ); if ( is_multisite() ) { $notice_string .= __( 'This will be applicable for all sites from the network.', 'customizer-search' ); } $language_dir = is_rtl() ? 'rtl' : 'ltr'; Astra_Notices::add_notice( array( 'id' => $key . '-optin-notice', 'type' => '', 'message' => sprintf( '
', /* translators: %s usage doc link */ sprintf( $notice_string . '%4s', esc_html( $data['product_name'] ), $language_dir, esc_url( $usage_doc_link ), __( ' Know More.', 'customizer-search' ) ), add_query_arg( array( $key . '_analytics_optin' => 'yes', $key . '_analytics_nonce' => wp_create_nonce( $key . '_analytics_optin' ), 'bsf_analytics_source' => $key, ) ), __( 'Yes! Allow it', 'customizer-search' ), add_query_arg( array( $key . '_analytics_optin' => 'no', $key . '_analytics_nonce' => wp_create_nonce( $key . '_analytics_optin' ), 'bsf_analytics_source' => $key, ) ), MONTH_IN_SECONDS, __( 'No Thanks', 'customizer-search' ) ), 'show_if' => true, 'repeat-notice-after' => false, 'priority' => 18, 'display-with-other-notices' => true, ) ); } } /** * Process usage tracking opt out. * * @since 1.0.0 */ public function handle_optin_optout() { if ( ! current_user_can( 'manage_options' ) ) { return; } $source = isset( $_GET['bsf_analytics_source'] ) ? sanitize_text_field( wp_unslash( $_GET['bsf_analytics_source'] ) ) : ''; if ( ! isset( $_GET[ $source . '_analytics_nonce' ] ) ) { return; } if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_GET[ $source . '_analytics_nonce' ] ) ), $source . '_analytics_optin' ) ) { return; } $optin_status = isset( $_GET[ $source . '_analytics_optin' ] ) ? sanitize_text_field( wp_unslash( $_GET[ $source . '_analytics_optin' ] ) ) : ''; if ( 'yes' === $optin_status ) { $this->optin( $source ); } elseif ( 'no' === $optin_status ) { $this->optout( $source ); } wp_safe_redirect( remove_query_arg( array( $source . '_analytics_optin', $source . '_analytics_nonce', 'bsf_analytics_source', ) ) ); } /** * Opt in to usage tracking. * * @param string $source source of analytics. * @since 1.0.0 */ private function optin( $source ) { update_site_option( $source . '_analytics_optin', 'yes' ); } /** * Opt out to usage tracking. * * @param string $source source of analytics. * @since 1.0.0 */ private function optout( $source ) { update_site_option( $source . '_analytics_optin', 'no' ); } /** * Load analytics stat class. * * @since 1.0.0 */ private function includes() { require_once __DIR__ . '/class-bsf-analytics-stats.php'; } /** * Register usage tracking option in General settings page. * * @since 1.0.0 */ public function register_usage_tracking_setting() { foreach ( $this->entities as $key => $data ) { if ( ! apply_filters( $key . '_tracking_enabled', true ) || $this->is_white_label_enabled( $key ) ) { return; } $usage_doc_link = isset( $data['usage_doc_link'] ) ? $data['usage_doc_link'] : $this->usage_doc_link; $author = isset( $data['author'] ) ? $data['author'] : 'Brainstorm Force'; register_setting( 'general', // Options group. $key . '_analytics_optin', // Option name/database. array( 'sanitize_callback' => array( $this, 'sanitize_option' ) ) // sanitize callback function. ); add_settings_field( $key . '-analytics-optin', // Field ID. __( 'Usage Tracking', 'customizer-search' ), // Field title. array( $this, 'render_settings_field_html' ), // Field callback function. 'general', 'default', // Settings page slug. array( 'type' => 'checkbox', 'title' => $author, 'name' => $key . '_analytics_optin', 'label_for' => $key . '-analytics-optin', 'id' => $key . '-analytics-optin', 'usage_doc_link' => $usage_doc_link, ) ); } } /** * Sanitize Callback Function * * @param bool $input Option value. * @since 1.0.0 */ public function sanitize_option( $input ) { if ( ! $input || 'no' === $input ) { return 'no'; } return 'yes'; } /** * Print settings field HTML. * * @param array $args arguments to field. * @since 1.0.0 */ public function render_settings_field_html( $args ) { ?> add_option_to_network( $option, $value ); } } /** * Analytics option add callback. * * @param string $option Option name. * @param string $value value of option. * @since 1.0.0 */ public function add_analytics_option_callback( $option, $value ) { if ( is_multisite() ) { $this->add_option_to_network( $option, $value ); } } /** * Send analaytics track event if tracking is enabled. * * @since 1.0.0 */ public function maybe_track_analytics() { if ( ! $this->is_tracking_enabled() ) { return; } $analytics_track = get_site_transient( 'bsf_analytics_track' ); // If the last data sent is 2 days old i.e. transient is expired. if ( ! $analytics_track ) { $this->send(); set_site_transient( 'bsf_analytics_track', true, 2 * DAY_IN_SECONDS ); } } /** * Save analytics option to network. * * @param string $option name of option. * @param string $value value of option. * @since 1.0.0 */ public function add_option_to_network( $option, $value ) { // If action coming from general settings page. if ( isset( $_POST['option_page'] ) && 'general' === $_POST['option_page'] ) { // phpcs:ignore WordPress.Security.NonceVerification.Missing if ( get_site_option( $option ) ) { update_site_option( $option, $value ); } else { add_site_option( $option, $value ); } } } } } PK ! t) ) admin/bsf-analytics/version.jsonnu [ { "bsf-analytics-ver": "1.1.0" } PK ! @t t &