/var/www/html_it/wp-content/plugins/woocommerce/src/StoreApi/SessionHandler.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php
declare(strict_types=1);

namespace 
Automattic\WooCommerce\StoreApi;

use 
Automattic\Jetpack\Constants;
use 
Automattic\WooCommerce\StoreApi\Utilities\CartTokenUtils;
use 
WC_Session;

defined'ABSPATH' ) || exit;

/**
 * SessionHandler class
 */
final class SessionHandler extends WC_Session {
    
/**
     * Token from HTTP headers.
     *
     * @var string
     */
    
protected $token '';

    
/**
     * Table name for session data.
     *
     * @var string Custom session table name
     */
    
protected $table '';

    
/**
     * Expiration timestamp.
     *
     * @var int
     */
    
protected $session_expiration 0;

    
/**
     * Constructor for the session class.
     */
    
public function __construct() {
        
$this->token wc_cleanwp_unslash$_SERVER['HTTP_CART_TOKEN'] ?? '' ) );
        
$this->table $GLOBALS['wpdb']->prefix 'woocommerce_sessions';
    }

    
/**
     * Init hooks and session data.
     */
    
public function init() {
        
$this->init_session_from_token();
        
add_action'shutdown', array( $this'save_data' ), 20 );
    }

    
/**
     * Process the token header to load the correct session.
     */
    
protected function init_session_from_token() {
        
$payload CartTokenUtils::get_cart_token_payload$this->token );

        
$this->_customer_id       $payload['user_id'];
        
$this->session_expiration $payload['exp'];
        
$this->_data              = (array) $this->get_session$this->get_customer_id(), array() );
    }

    
/**
     * Returns the session.
     *
     * @param string $customer_id Customer ID.
     * @param mixed  $default_value Default session value.

     * @return mixed Returns either the session data or the default value. Returns false if WP setup is in progress.
     */
    
public function get_session$customer_id$default_value false ) {
        global 
$wpdb;

        
// This mimics behaviour from default WC_Session_Handler class. There will be no sessions retrieved while WP setup is due.
        
if ( Constants::is_defined'WP_SETUP_CONFIG' ) ) {
            return 
$default_value;
        }

        
$value $wpdb->get_var(
            
$wpdb->prepare(
                
'SELECT session_value FROM %i WHERE session_key = %s',
                
$this->table,
                
$customer_id
            
)
        );

        if ( 
is_null$value ) ) {
            
$value $default_value;
        }

        return 
maybe_unserialize$value );
    }

    
/**
     * Save data and delete user session.
     */
    
public function save_data() {
        
// Dirty if something changed - prevents saving nothing new.
        
if ( $this->_dirty ) {
            global 
$wpdb;

            
$wpdb->query(
                
$wpdb->prepare(
                    
'INSERT INTO %i (`session_key`, `session_value`, `session_expiry`) VALUES (%s, %s, %d) ON DUPLICATE KEY UPDATE `session_value` = VALUES(`session_value`), `session_expiry` = VALUES(`session_expiry`)',
                    
$this->table,
                    
$this->get_customer_id(),
                    
maybe_serialize$this->_data ),
                    
$this->session_expiration
                
)
            );

            
$this->_dirty false;
        }
    }
}