This project does not seem to handle request data directly as such no vulnerable execution paths were found.
include
, or for example
via PHP's auto-loading mechanism.
These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * Session Database Handler |
||
4 | * |
||
5 | * @package Give |
||
6 | * @subpackage Classes/Give_Session |
||
7 | * @copyright Copyright (c) 2018, WordImpress |
||
8 | * @license https://opensource.org/licenses/gpl-license GNU Public License |
||
9 | * @since 2.2.0 |
||
10 | */ |
||
11 | |||
12 | // Exit if accessed directly. |
||
13 | if ( ! defined( 'ABSPATH' ) ) { |
||
14 | exit; |
||
15 | } |
||
16 | |||
17 | /** |
||
18 | * Class Give_DB_Sessions |
||
19 | */ |
||
20 | class Give_DB_Sessions extends Give_DB { |
||
21 | /** |
||
22 | * Cache group name |
||
23 | * |
||
24 | * @since 2.2.0 |
||
25 | * @access private |
||
26 | * |
||
27 | * @var string |
||
28 | */ |
||
29 | private $cache_group = 'give_sessions'; |
||
30 | |||
31 | /** |
||
32 | * Cache incrementer name |
||
33 | * |
||
34 | * @since 2.2.0 |
||
35 | * @access private |
||
36 | * |
||
37 | * @var string |
||
38 | */ |
||
39 | private $incrementer_name = 'give_sessions'; |
||
40 | |||
41 | |||
42 | /** |
||
43 | * Class Constructor |
||
44 | * |
||
45 | * @since 2.2.0 |
||
46 | * @access public |
||
47 | */ |
||
48 | public function __construct() { |
||
49 | global $wpdb; |
||
50 | $this->table_name = "{$wpdb->prefix}give_sessions"; |
||
51 | $this->primary_key = 'session_key'; |
||
52 | $this->version = '1.0'; |
||
53 | |||
54 | // Set cache group id. |
||
55 | $current_blog_id = get_current_blog_id(); |
||
56 | $this->incrementer_name = "give-cache-incrementer-sessions-{$current_blog_id}"; |
||
57 | $incrementer_value = wp_cache_get( $this->incrementer_name ); |
||
58 | $incrementer_value = ! empty( $incrementer_value ) ? $incrementer_value : microtime( true ); |
||
59 | $this->cache_group = "{$this->cache_group}_{$current_blog_id}_{$incrementer_value}"; |
||
60 | |||
61 | $this->register_table(); |
||
62 | |||
63 | parent::__construct(); |
||
64 | } |
||
65 | |||
66 | |||
67 | /** |
||
68 | * Whitelist of columns |
||
69 | * |
||
70 | * @since 2.2.0 |
||
71 | * @access public |
||
72 | * |
||
73 | * @return array Columns and formats. |
||
74 | */ |
||
75 | public function get_columns() { |
||
76 | return array( |
||
77 | 'session_id' => '%d', |
||
78 | 'session_key' => '%s', |
||
79 | 'session_value' => '%s', |
||
80 | 'session_expiry' => '%d', |
||
81 | ); |
||
82 | } |
||
83 | |||
84 | /** |
||
85 | * Create Meta Tables. |
||
86 | * |
||
87 | * @since 2.2.0 |
||
88 | * @access public |
||
89 | */ |
||
90 | View Code Duplication | public function create_table() { |
|
0 ignored issues
–
show
|
|||
91 | global $wpdb; |
||
92 | |||
93 | $charset_collate = $wpdb->get_charset_collate(); |
||
94 | |||
95 | $sql = "CREATE TABLE {$this->table_name} ( |
||
96 | session_id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, |
||
97 | session_key char(32) NOT NULL, |
||
98 | session_value longtext NOT NULL, |
||
99 | session_expiry BIGINT UNSIGNED NOT NULL, |
||
100 | PRIMARY KEY (session_key), |
||
101 | UNIQUE KEY session_id (session_id) |
||
102 | ) {$charset_collate};"; |
||
103 | |||
104 | require_once ABSPATH . 'wp-admin/includes/upgrade.php'; |
||
105 | dbDelta( $sql ); |
||
106 | |||
107 | update_option( $this->table_name . '_db_version', $this->version, false ); |
||
108 | } |
||
109 | |||
110 | |||
111 | /** |
||
112 | * Returns the session. |
||
113 | * |
||
114 | * @todo: add cache logic |
||
115 | * |
||
116 | * @param string $donor_id Donor ID. |
||
117 | * @param mixed $default Default session value. |
||
118 | * |
||
119 | * @return mixed |
||
120 | */ |
||
121 | public function get_session( $donor_id, $default = false ) { |
||
122 | global $wpdb; |
||
123 | |||
124 | if ( defined( 'WP_SETUP_CONFIG' ) ) { |
||
125 | return false; |
||
126 | } |
||
127 | |||
128 | if ( ! ( $value = wp_cache_get( $donor_id, $this->cache_group ) ) ) { // @codingStandardsIgnoreLine |
||
129 | |||
130 | // @codingStandardsIgnoreStart |
||
131 | $value = $wpdb->get_var( |
||
132 | $wpdb->prepare( |
||
133 | " |
||
134 | SELECT session_value |
||
135 | FROM $this->table_name |
||
136 | WHERE session_key = %s |
||
137 | ", |
||
138 | $donor_id |
||
139 | ) |
||
140 | ); |
||
141 | // @codingStandardsIgnoreEnd |
||
142 | |||
143 | if ( is_null( $value ) ) { |
||
144 | $value = $default; |
||
145 | } |
||
146 | |||
147 | wp_cache_add( $donor_id, $value, $this->cache_group ); |
||
148 | } |
||
149 | |||
150 | return maybe_unserialize( $value ); |
||
151 | } |
||
152 | |||
153 | /** |
||
154 | * Update the session expiry timestamp. |
||
155 | * |
||
156 | * @param string $donor_id Donor ID. |
||
157 | * @param int $timestamp Timestamp to expire the cookie. |
||
158 | */ |
||
159 | public function update_session_timestamp( $donor_id, $timestamp ) { |
||
160 | global $wpdb; |
||
161 | |||
162 | // @codingStandardsIgnoreStart. |
||
163 | $wpdb->update( |
||
164 | $this->table_name, |
||
165 | array( |
||
166 | 'session_expiry' => $timestamp, |
||
167 | ), |
||
168 | array( |
||
169 | 'session_key' => $donor_id, |
||
170 | ), |
||
171 | array( |
||
172 | '%d' |
||
173 | ) |
||
174 | ); |
||
175 | // @codingStandardsIgnoreEnd. |
||
176 | } |
||
177 | |||
178 | /** |
||
179 | * Delete the session from the cache and database. |
||
180 | * |
||
181 | * @since 2.2.0 |
||
182 | * @access public |
||
183 | * |
||
184 | * @param int $donor_id Customer ID. |
||
185 | */ |
||
186 | public function delete_session( $donor_id ) { |
||
187 | global $wpdb; |
||
188 | |||
189 | wp_cache_delete( $donor_id, $this->cache_group ); |
||
190 | |||
191 | // @codingStandardsIgnoreStart |
||
192 | $wpdb->delete( |
||
193 | $this->table_name, |
||
194 | array( |
||
195 | 'session_key' => $donor_id, |
||
196 | ) |
||
197 | ); |
||
198 | // @codingStandardsIgnoreEnd |
||
199 | } |
||
200 | |||
201 | |||
202 | /** |
||
203 | * Cleanup session data from the database and clear caches. |
||
204 | * Note: for internal logic only. |
||
205 | * |
||
206 | * @since 2.2.0 |
||
207 | * @access public |
||
208 | */ |
||
209 | public function delete_expired_sessions() { |
||
210 | global $wpdb; |
||
211 | |||
212 | wp_cache_set( $this->incrementer_name, microtime( true ) ); |
||
213 | |||
214 | // @codingStandardsIgnoreStart |
||
215 | $wpdb->query( |
||
216 | $wpdb->prepare( |
||
217 | "DELETE FROM $this->table_name WHERE session_expiry < %d", |
||
218 | time() |
||
219 | ) |
||
220 | ); |
||
221 | // @codingStandardsIgnoreEnd |
||
222 | } |
||
223 | |||
224 | /** |
||
225 | * Replace table data |
||
226 | * Note: only for internal use |
||
227 | * |
||
228 | * @since 2.2.0 |
||
229 | * @access public |
||
230 | * |
||
231 | * @param string $table_name Table name. |
||
232 | * @param array $data Data. |
||
233 | * @param array $format Array for data format of each key:value in data. |
||
234 | */ |
||
235 | public function __replace( $table_name, $data, $format = null ) { |
||
0 ignored issues
–
show
|
|||
236 | global $wpdb; |
||
237 | |||
238 | wp_cache_set( $data['session_key'], $data['session_value'], $this->cache_group, $data['session_expiry'] - time() ); |
||
239 | |||
0 ignored issues
–
show
|
|||
240 | |||
241 | // @codingStandardsIgnoreStart |
||
242 | $wpdb->replace( |
||
243 | $table_name, |
||
244 | $data, |
||
245 | $format |
||
246 | ); |
||
247 | // @codingStandardsIgnoreEnd |
||
248 | } |
||
249 | } |
||
250 |
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.