Uname:Linux ip-11-115-0-196 6.8.0-1039-aws #41~22.04.1-Ubuntu SMP Thu Sep 11 10:54:48 UTC 2025 x86_64

403WebShell
403Webshell
Server IP : 13.126.101.145  /  Your IP : 216.73.217.33
Web Server : Apache/2.4.52 (Ubuntu)
System : Linux ip-11-115-0-196 6.8.0-1039-aws #41~22.04.1-Ubuntu SMP Thu Sep 11 10:54:48 UTC 2025 x86_64
User : www-data ( 33)
PHP Version : 8.3.17
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : ON  |  Perl : ON  |  Python : OFF  |  Sudo : ON  |  Pkexec : ON
Directory :  /var/www/html/rentals_updated/wp-content/plugins/wpo365-login/Services/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /var/www/html/rentals_updated/wp-content/plugins/wpo365-login/Services/Event_Service.php
<?php

namespace Wpo\Services;

use Error;
use WP_Error;
use \Wpo\Core\Event;
use Wpo\Core\Event_User;
use Wpo\Core\User;
use Wpo\Core\WordPress_Helpers;
use Wpo\Core\Wpmu_Helpers;
use \Wpo\Services\Log_Service;
use \Wpo\Services\Options_Service;
use \Wpo\Services\Request_Service;

if (!class_exists('\Wpo\Services\Event_Service')) {

    class Event_Service
    {
        /**
         * Add a new event to the memoized collection.
         * 
         * @since 27.0
         * 
         * @param Event $event 
         * @return void 
         */
        public static function add_event($event)
        {
            if (!Options_Service::get_global_boolean_var('insights_enabled')) {
                return;
            }

            $request_service = Request_Service::get_instance();
            $request = $request_service->get_request($GLOBALS['WPO_CONFIG']['request_id']);
            $events = $request->get_item('events');

            if (!is_array($events)) {
                $events = array($event);
            } else {
                $events[] = $event;
            }

            $request->set_item('events', $events);
        }

        /**
         * Creates a new wpo365/user/created event (success).
         * 
         * @param int $wp_user_id 
         * 
         * @return void 
         */
        public static function user_created__handler($wp_user_id = 0)
        {
            $request_service = Request_Service::get_instance();
            $request = $request_service->get_request($GLOBALS['WPO_CONFIG']['request_id']);

            $wpo_usr = $request->get_item('wpo_usr');
            $is_user_sync = $request->get_item('user_sync');
            $is_scim = $request->get_item('scim');
            $data = '';

            if ($is_user_sync) {
                $category = 'SYNC';
            } else if ($is_scim) {
                $category = 'SCIM';
                $data = self::get_scim_attributes();
            } else if (!empty($wpo_usr)) {
                $category = 'SSO';
            } else {
                $category = 'WP';
            }

            $user = self::get_event_user($wp_user_id, $wpo_usr);
            $event = new Event('wpo365/user/created', $category, $user, $data);
            self::add_event($event);
        }

        /**
         * Creates a new wpo365/user/created event (fail).
         * 
         * @param WP_Error $error
         * 
         * @return void 
         */
        public static function user_created_fail__handler($error)
        {
            $request_service = Request_Service::get_instance();
            $request = $request_service->get_request($GLOBALS['WPO_CONFIG']['request_id']);

            $wpo_usr = $request->get_item('wpo_usr');
            $is_user_sync = $request->get_item('user_sync');
            $is_scim = $request->get_item('scim');
            $data = '';

            if ($is_user_sync) {
                $category = 'SYNC';
            } else if ($is_scim) {
                $category = 'SCIM';
                $data = self::get_scim_attributes();
            } else {
                $category = 'SSO';
            }

            if (is_wp_error($error)) {
                $error_message = $error->get_error_message();
            } else if (is_string($error)) {
                $error_message = $error;
            } else {
                $error_message = 'Unknown error occurred';
            }

            $user = self::get_event_user(0, $wpo_usr);
            $event = new Event('wpo365/user/created', $category, $user, $data, $error_message, 'ERROR', 'NOK');
            self::add_event($event);
        }

        /**
         * Creates a new wpo365/user/loggedin event (success).
         * 
         * @param string $logged_in_cookie 
         * @param int $expire 
         * @param int $expiration 
         * @param int $wp_user_id 
         * @param string $scheme 
         * @param string $token 
         * 
         * @return void 
         */
        public static function user_loggedin__handler($logged_in_cookie, $expire, $expiration, $wp_user_id, $scheme, $token)
        {
            $request_service = Request_Service::get_instance();
            $request = $request_service->get_request($GLOBALS['WPO_CONFIG']['request_id']);

            $wpo_usr = $request->get_item('wpo_usr');

            if (!empty($wpo_usr)) {
                $category = 'SSO';
            } else {
                $category = 'WP';
            }

            $user = self::get_event_user($wp_user_id, $wpo_usr);
            $event = new Event('wpo365/user/loggedin', $category, $user);
            self::add_event($event);
        }

        /**
         * Creates a new wpo365/user/loggedin event (fail).
         * 
         * @param string $category 
         * @param int $wp_user_id 
         * @param User $wpo_user 
         * @param array|null $data 
         * @param string|WP_User|WP_Error $error 
         * @param string $level 
         * @param string $status 
         * 
         * @return void 
         */
        public static function user_loggedin_fail__handler($error)
        {
            $request_service = Request_Service::get_instance();
            $request = $request_service->get_request($GLOBALS['WPO_CONFIG']['request_id']);

            $sso_loggedin_error_codes = array(
                Error_Service::AADAPPREG_ERROR,
                Error_Service::CHECK_LOG,
                Error_Service::DEACTIVATED,
                Error_Service::ID_TOKEN_ERROR,
                Error_Service::ID_TOKEN_AUD,
                Error_Service::NOT_CONFIGURED,
                Error_Service::NOT_FROM_DOMAIN,
                Error_Service::NOT_IN_GROUP,
                Error_Service::SAML2_ERROR,
                Error_Service::USER_NOT_FOUND,
                Error_Service::TAMPERED_WITH,
            );

            if (in_array($error, $sso_loggedin_error_codes)) {
                $category = 'SSO';
            } else {
                $category = 'WP';
            }

            $user = self::get_event_user();
            $event = new Event('wpo365/user/loggedin', $category, $user, null, $error, 'ERROR', 'NOK');
            self::add_event($event);
        }

        /**
         * Helper for the authenticate filter.
         * 
         * @param null|WP_user|WP_error $user 
         * @return mixed 
         */
        public static function authenticate__handler($user, $user_name, $password)
        {

            if (is_wp_error($user)) {
                self::user_loggedin_fail__handler($user->get_error_message());
            }

            return $user;
        }

        /**
         * Helper for the wp_login_failer action.
         * 
         * @param string $user_name
         * @param string $error
         * @return void 
         */
        public static function wp_login_failed__handler($user_name, $error)
        {
            self::user_loggedin_fail__handler($error);
        }

        public static function user_updated__handler($wp_user_id)
        {
            $request_service = Request_Service::get_instance();
            $request = $request_service->get_request($GLOBALS['WPO_CONFIG']['request_id']);

            $wpo_usr = $request->get_item('wpo_usr');
            $is_user_sync = $request->get_item('user_sync');
            $is_scim = $request->get_item('scim');
            $data = '';

            if ($is_user_sync) {
                $category = 'SYNC';
            } else if ($is_scim) {
                $category = 'SCIM';
                $data = self::get_scim_attributes();
            } else if (!empty($wpo_usr)) {
                $category = 'SSO';
            } else {
                $category = 'WP';
            }

            $user = self::get_event_user($wp_user_id, $wpo_usr);
            $event = new Event('wpo365/user/updated', $category, $user, $data);
            self::add_event($event);
        }

        public static function user_updated_fail__handler($wp_user_id, $error)
        {
            $request_service = Request_Service::get_instance();
            $request = $request_service->get_request($GLOBALS['WPO_CONFIG']['request_id']);

            $wpo_usr = $request->get_item('wpo_usr');
            $is_user_sync = $request->get_item('user_sync');
            $is_scim = $request->get_item('scim');
            $data = null;

            if ($is_user_sync) {
                $category = 'SYNC';
            } else if ($is_scim) {
                $category = 'SCIM';
                $data = self::get_scim_attributes();
            } else if (!empty($wpo_usr)) {
                $category = 'SSO';
            } else {
                $category = 'WP';
            }

            $user = self::get_event_user($wp_user_id, $wpo_usr);
            $event = new Event('wpo365/user/updated', $category, $user, $data, $error, 'ERROR', 'NOK');
            self::add_event($event);
        }

        public static function mail_sent__handler($log_message)
        {
            $user = self::get_event_user();
            $event = new Event('wpo365/mail/sent', 'MAIL', $user, null, $log_message);
            self::add_event($event);
        }

        public static function mail_sent_fail__handler($log_message)
        {
            $user = self::get_event_user();
            $event = new Event('wpo365/mail/sent', 'MAIL', $user, null, $log_message, 'ERROR', 'NOK');
            self::add_event($event);
        }

        /**
         * Saves the memoized events to the events database table.
         * 
         * @since 27.0
         * 
         * @return void 
         */
        public static function flush_events()
        {
            $request_service = Request_Service::get_instance();
            $request = $request_service->get_request($GLOBALS['WPO_CONFIG']['request_id']);
            $events = $request->get_item('events');

            if (empty($events)) {
                return; // Nothing to flush
            }

            self::ensure_events_table();

            global $wpdb;

            $table_name = self::get_events_table_name();

            foreach ($events as $event) {

                $data = array(
                    'event_action' => $event->action,
                    'event_category' => $event->category,
                    'event_data' => $event->data,
                    'event_error' => $event->error,
                    'event_level' => $event->level,
                    'event_status' => $event->status,
                    'event_timestamp' => WordPress_Helpers::time_zone_corrected_formatted_date($event->timestamp),
                    'event_user' => json_encode($event->user),
                );

                $wpdb->insert(
                    $table_name,
                    $data
                );

                if (!empty($wpdb->last_error)) {
                    Log_Service::write_log('ERROR', sprintf('%s -> An error occurred when trying add a new event [error: %s]', __METHOD__, $wpdb->last_error));
                }
            }

            $events = $request->remove_item('events');
        }

        /**
         * 
         * 
         * @param string $period 
         * @return WP_Error|void 
         */
        public static function get_insights_summary($period, $group)
        {
            $periods = array('TODAY', 'WTD', 'MTD', 'YTD');

            if (empty($period) || !in_array($period, $periods)) {
                $error = sprintf('%s -> Value %s for argument "period" is not supported', __METHOD__, $period);
                Log_Service::write_log('ERROR', $error);
                return new WP_Error('ArgumentException', $error);
            }

            self::ensure_events_table();

            global $wpdb;

            $table_name = self::get_events_table_name();

            if ($period == 'WTD') {
                $where_clause = "WEEK(`event_timestamp`) = WEEK(CURDATE()) AND YEAR(`event_timestamp`) = YEAR(CURDATE())";
            } elseif ($period == 'MTD') {
                $where_clause = "MONTH(`event_timestamp`) = MONTH(CURDATE()) AND YEAR(`event_timestamp`) = YEAR(CURDATE())";
            } elseif ($period == 'YTD') {
                $where_clause = "YEAR(`event_timestamp`) = YEAR(CURDATE())";
            } else {
                $where_clause = "DATE(`event_timestamp`) = CURDATE()";
            }

            if ($group == 'mail') {
                $keys = array('MAIL_SENT_OK', 'MAIL_SENT_NOK');
            }

            if ($group == 'login') {
                $keys = array('WP_LOGGEDIN_OK', 'WP_LOGGEDIN_NOK', 'SSO_LOGGEDIN_OK', 'SSO_LOGGEDIN_NOK');
            }

            if ($group == 'users') {
                $keys = array('SSO_CREATED_OK', 'SSO_CREATED_NOK', 'SYNC_CREATED_OK', 'SYNC_CREATED_NOK', 'SCIM_CREATED_OK', 'SCIM_CREATED_NOK', 'SYNC_UPDATED_OK', 'SYNC_UPDATED_NOK', 'SCIM_UPDATED_OK', 'SCIM_UPDATED_NOK');
            }

            if (!empty($keys)) {
                $query = 'SELECT';

                foreach ($keys as $key) {
                    $key_segments = self::key2params($key);

                    if (sizeof($key_segments) != 3) {
                        continue;
                    }

                    $query = $query . ' COALESCE(SUM(';
                    $query_glue = '';

                    foreach ($key_segments as $column_name => $value) {
                        $query = sprintf("%s%s`%s` = '%s'", $query, $query_glue, $column_name, $value);
                        $query_glue = 'AND';
                    }

                    $query = sprintf("%s), 0) AS %s,", $query, $key);
                }

                $query = rtrim($query, ',');
                $query = sprintf("%s FROM `%s` WHERE %s", $query, $table_name, $where_clause);
            }

            $rows = $wpdb->get_results($query);

            if (!empty($wpdb->last_error)) {
                $error = sprintf('%s -> An error occurred when trying retrieve insights summary [error: %s]', __METHOD__, $wpdb->last_error);
                Log_Service::write_log('ERROR', $error);
                return false;
            }

            return $rows;
        }

        public static function get_insights($key, $period, $start_row)
        {
            $periods = array('TODAY', 'WTD', 'MTD', 'YTD');

            if (empty($period) || !in_array($period, $periods)) {
                $error = sprintf('%s -> Value %s for argument "period" is not supported', __METHOD__, $period);
                Log_Service::write_log('ERROR', $error);
                return new WP_Error('ArgumentException', $error);
            }

            self::ensure_events_table();

            global $wpdb;

            $table_name = self::get_events_table_name();

            if ($period == 'WTD') {
                $where_clause = "WEEK(`event_timestamp`) = WEEK(CURDATE()) AND YEAR(`event_timestamp`) = YEAR(CURDATE())";
            } elseif ($period == 'MTD') {
                $where_clause = "MONTH(`event_timestamp`) = MONTH(CURDATE()) AND YEAR(`event_timestamp`) = YEAR(CURDATE())";
            } elseif ($period == 'YTD') {
                $where_clause = "YEAR(`event_timestamp`) = YEAR(CURDATE())";
            } else {
                $where_clause = "DATE(`event_timestamp`) = CURDATE()";
            }

            $where_params = self::key2params($key);

            if (sizeof($where_params) != 3) {
                return new WP_Error('ArgumentException', sprintf('%s => Attempt to split the key [%s] in 3 segments failed', __METHOD__, $key));
            }

            foreach ($where_params as $column_name => $value) {
                $where_clause = sprintf(
                    "%s %s `%s` = '%s'",
                    $where_clause,
                    empty($where_clause) ? '' : ' AND ',
                    $column_name,
                    $value
                );
            }

            $rows = $wpdb->get_results("SELECT 'SYNC_CREATED_OK' AS `key`, `event_user` AS `user`, `event_data` AS `data`, `event_error` AS `error`, `event_timestamp` AS `time` FROM $table_name WHERE $where_clause LIMIT 25 OFFSET $start_row");

            if (!empty($wpdb->last_error)) {
                $error = sprintf('%s -> An error occurred when trying retrieve insights [error: %s]', __METHOD__, $wpdb->last_error);
                Log_Service::write_log('ERROR', $error);
                return new WP_Error('DbException', $error);
            }

            return $rows;
        }

        /**
         * Truncates the insights data table.
         * 
         * @return WP_Error|true 
         */
        public static function truncate_insights_data()
        {
            global $wpdb;

            $table_name = self::get_events_table_name();

            if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") != $table_name) {
                $error = sprintf('%s -> Could not truncate table %s because the table was not found', __METHOD__, $table_name);
                Log_Service::write_log('WARN', $error);
                return new WP_Error('DbTableNotFoundException', $error);
            }

            $wpdb->query("TRUNCATE TABLE $table_name");

            if (!empty($wpdb->last_error)) {
                $error = sprintf('%s -> An error occurred when trying to truncate the insights table [error: %s]', __METHOD__, $wpdb->last_error);
                Log_Service::write_log('ERROR', $error);
                return new WP_Error('DbTruncateException', $error);
            }

            Log_Service::write_log('DEBUG', __METHOD__ . " -> Truncated the insights table successfully");
            return true;
        }

        /**
         * Splits the internal insights key (e.g. SSO_CREATED_NOK) into an assoc array that matches with table column names and values.
         * 
         * @param mixed $key 
         * @return (string|void)[] 
         */
        private static function key2params($key)
        {
            $key_segments = explode('_', $key);

            if (sizeof($key_segments) != 3) {
                return array();
            }

            $get_action = function ($action_key) {

                if ($action_key == 'CREATED') {
                    return 'wpo365/user/created';
                }

                if ($action_key == 'UPDATED') {
                    return 'wpo365/user/updated';
                }

                if ($action_key == 'SENT') {
                    return 'wpo365/mail/sent';
                }

                if ($action_key == 'LOGGEDIN') {
                    return 'wpo365/user/loggedin';
                }
            };

            return array(
                'event_action' => $get_action($key_segments[1]),
                'event_status' => $key_segments[2],
                'event_category' => $key_segments[0],
            );
        }

        /**
         * Ensures the Event table has been created.
         * 
         * @return bool 
         */
        private static function ensure_events_table()
        {
            global $wpdb;

            $table_name = self::get_events_table_name();

            if ($wpdb->get_var("SHOW TABLES LIKE '$table_name'") == $table_name) {
                return true;
            }

            $charset_collate = $wpdb->get_charset_collate();

            $sql = "CREATE TABLE IF NOT EXISTS $table_name (
                    id BIGINT AUTO_INCREMENT PRIMARY KEY, 
                    event_action TEXT NOT NULL,
                    event_category TEXT NOT NULL,
                    event_data LONGTEXT,
                    event_error TEXT,
                    event_level TEXT,
                    event_status TEXT NOT NULL,
                    event_timestamp DATETIME DEFAULT NULL,
                    event_user LONGTEXT
                    ) $charset_collate;";

            require_once(ABSPATH . 'wp-admin/includes/upgrade.php');
            dbDelta($sql);

            if (!empty($wpdb->last_error)) {
                Log_Service::write_log('ERROR', sprintf('%s -> An error occurred when trying to create the wpo365_events table [error: %s]', __METHOD__, $wpdb->last_error));
                return false;
            }

            return true;
        }

        /**
         * Helper method to centrally provide the custom WordPress table name.
         * 
         * @since 3.0
         * 
         * @return string
         */
        private static function get_events_table_name()
        {
            global $wpdb;

            if (Options_Service::mu_use_subsite_options() && !Wpmu_Helpers::mu_is_network_admin()) {
                return $wpdb->prefix . "wpo365_events";
            }

            return $wpdb->base_prefix . "wpo365_events";
        }

        /**
         * Helper to create a small info object with user details from both WP and Entra.
         * 
         * @param int $wp_user_id 
         * @param User $wpo_user 
         * 
         * @return void 
         */
        private static function get_event_user($wp_user_id = 0, $wpo_user = null)
        {
            $user = new Event_User();

            if (Options_Service::get_global_boolean_var('insights_anonymized')) {
                return $user;
            }

            if ($wp_user_id > 0) {
                $user->wp_user_id = $wp_user_id;

                $wp_user = get_user_by('ID', $wp_user_id);

                if (!empty($wp_user)) {

                    if (!empty($wp_user->user_login)) {
                        $user->wp_user_login = $wp_user->user_login;
                    }

                    if (!empty($wp_user->display_name)) {
                        $user->display_name = $wp_user->display_name;
                    }

                    if (!empty($wp_user->user_email)) {
                        $user->mail = $wp_user->user_email;
                    }
                }
            }

            if (!empty($wpo_user)) {

                if (empty($user->mail) && !empty($wpo_user->email)) {
                    $user->mail = $wpo_user->email;
                }

                if (!empty($wpo_user->oid)) {
                    $user->oid = $wpo_user->oid;
                }

                if (empty($user->display_name) && !empty($wpo_user->full_name)) {
                    $user->display_name = $wpo_user->full_name;
                }
            }

            return $user;
        }

        /**
         * Tries to get SCIM attributes from current context and return those as JSON.
         * 
         * @since 31.1
         * 
         * @return string 
         */
        private static function get_scim_attributes()
        {
            $request_service = Request_Service::get_instance();
            $request = $request_service->get_request($GLOBALS['WPO_CONFIG']['request_id']);
            $scim_attributes = $request->get_item('scim_attributes');

            if (is_array($scim_attributes)) {
                $as_json = json_encode($scim_attributes);

                if (!empty($as_json)) {
                    return $as_json;
                }

                $err_message = json_last_error_msg();
                Log_Service::write_log('WARN', sprintf('%s -> Could not encode SCIM attributes as JSON [%s]', __METHOD__, $err_message));
                Log_Service::write_log('DEBUG', $scim_attributes);
            }

            return null;
        }
    }
}

Youez - 2016 - github.com/yon3zu
LinuXploit