PluginProbe ʕ •ᴥ•ʔ
UpdraftPlus: WP Backup & Migration Plugin / 1.26.4
UpdraftPlus: WP Backup & Migration Plugin v1.26.4
1.26.4 1.26.3 1.9.19 1.9.25 1.9.26 1.9.30 1.9.31 1.9.32 1.9.4 1.9.40 1.9.41 1.9.42 1.9.43 1.9.44 1.9.45 1.9.46 1.9.5 1.9.50 1.9.51 1.9.60 1.9.62 1.9.63 1.9.64 1.11.12 1.4.8 1.11.15 1.4.9 1.11.17 1.5.16 1.11.18 1.5.20 1.11.2 1.5.21 1.11.20 1.5.22 1.11.23 1.5.5 1.11.24 1.5.6 1.11.25 1.5.7 1.11.26 1.5.8 1.11.27 1.5.9 1.11.28 1.6.1 1.11.3 1.6.17 1.11.4 1.6.2 1.11.5 1.6.46 1.11.8 1.7.0 1.11.9 1.7.1 1.12.0 1.7.18 1.12.1 1.7.20 1.12.12 1.7.3 1.12.13 1.7.34 1.12.15 1.7.35 1.12.17 1.7.39 1.12.2 1.7.40 1.12.20 1.7.41 1.12.23 1.8.1 1.12.24 1.8.11 1.12.25 1.8.12 1.12.28 1.8.13 1.12.29 1.8.2 1.12.30 1.8.5 1.12.32 1.8.8 1.12.34 1.9.0 1.12.35 1.9.13 1.12.37 1.9.15 1.12.39 1.9.17 1.12.4 1.12.40 1.12.6 1.13.1 1.13.11 1.13.12 1.13.15 1.13.16 1.13.2 1.13.3 1.13.4 1.13.5 1.13.6 1.13.7 1.13.8 1.13.9 1.14.10 1.14.11 1.14.12 1.14.13 1.14.2 1.14.3 1.14.4 1.14.5 1.14.7 1.14.9 1.15.0 1.15.2 1.15.3 1.15.5 1.15.6 1.15.7 1.16.0 1.16.10 1.16.11 1.16.12 1.16.13 1.16.14 1.16.15 1.16.16 1.16.17 1.16.20 1.16.21 1.16.22 1.16.23 1.16.24 1.16.25 1.16.26 1.16.28 1.16.29 1.16.32 1.16.34 1.16.35 1.16.36 1.16.37 1.16.4 1.16.40 1.16.41 1.16.42 1.16.43 1.16.44 1.16.45 1.16.46 1.16.47 1.16.48 1.16.49 1.16.5 1.16.50 1.16.51 1.16.53 1.16.55 1.16.56 1.16.59 1.16.6 1.16.60 1.16.61 1.16.62 1.16.63 1.16.64 1.16.65 1.16.66 1.16.67 1.16.68 1.16.69 1.16.7 1.16.8 1.16.9 1.2.0 1.2.1 1.2.10 1.2.11 1.2.12 1.2.14 1.2.15 1.2.16 1.2.17 1.2.19 1.2.2 1.2.20 1.2.24 1.2.25 1.2.26 1.2.27 1.2.28 1.2.29 1.2.3 1.2.30 1.2.31 1.2.33 1.2.35 1.2.36 1.2.38 1.2.39 1.2.4 1.2.40 1.2.41 1.2.42 1.2.43 1.2.44 1.2.45 1.2.46 1.2.5 1.2.7 1.2.8 1.2.9 1.22.1 1.22.10 1.22.11 1.22.12 1.22.14 1.22.15 1.22.16 1.22.17 1.22.18 1.22.19 1.22.20 1.22.21 1.22.22 1.22.23 1.22.24 1.22.3 1.22.4 1.22.5 1.22.6 1.22.7 1.22.8 1.22.9 1.23.1 1.23.10 1.23.11 1.23.12 1.23.13 1.23.15 1.23.16 1.23.2 1.23.3 1.23.4 1.23.5 1.23.6 1.23.7 1.23.8 1.23.9 1.24.1 1.24.10 1.24.11 1.24.12 1.24.2 trunk 1.24.3 0.7.4 1.24.4 0.7.7 1.24.5 0.8.28 1.24.6 0.8.29 1.24.7 0.8.30 1.24.8 0.8.31 1.24.9 0.8.32 1.25.1 0.8.33 1.25.2 0.8.36 1.25.3 0.8.37 1.25.5 0.8.50 1.25.6 0.8.51 1.25.7 0.9.1 1.25.8 0.9.10 1.25.9 0.9.11 1.26.1 0.9.12 1.26.2 0.9.2 1.3.10 0.9.20 1.3.12 0.9.21 1.3.14 0.9.22 1.3.15 1.0.10 1.3.17 1.0.11 1.3.18 1.0.12 1.3.19 1.0.15 1.3.2 1.0.16 1.3.20 1.0.18 1.3.22 1.0.20 1.3.23 1.0.3 1.3.24 1.0.4 1.3.25 1.0.5 1.3.3 1.0.6 1.3.4 1.0.7 1.3.6 1.0.8 1.3.7 1.0.9 1.3.8 1.1.0 1.3.9 1.1.10 1.4.0 1.1.11 1.4.10 1.1.12 1.4.11 1.1.13 1.4.12 1.1.14 1.4.13 1.1.15 1.4.14 1.1.16 1.4.15 1.1.17 1.4.2 1.1.2 1.4.27 1.1.3 1.4.28 1.1.5 1.4.29 1.1.6 1.4.30 1.1.8 1.4.4 1.1.9 1.4.48 1.10.1 1.4.5 1.10.3 1.4.6 1.11.1 1.4.7
updraftplus / includes / class-semaphore.php
updraftplus / includes Last commit date
Dropbox2 3 weeks ago Google 3 weeks ago blockui 3 weeks ago checkout-embed 3 weeks ago cloudfiles 3 weeks ago handlebars 1 month ago images 9 years ago jquery-ui.dialog.extended 3 weeks ago jquery.serializeJSON 5 years ago jstree 1 year ago labelauty 3 weeks ago pcloud 3 weeks ago select2 1 year ago tether 6 years ago tether-shepherd 7 years ago updraftclone 3 weeks ago S3.php 3 weeks ago S3compat.php 3 weeks ago cacert.pem 2 years ago class-backup-history.php 1 month ago class-commands.php 3 weeks ago class-database-utility.php 1 month ago class-filesystem-functions.php 1 month ago class-http-error-descriptions.php 2 years ago class-job-scheduler.php 3 years ago class-manipulation-functions.php 1 month ago class-partialfileservlet.php 3 weeks ago class-remote-send.php 3 weeks ago class-search-replace.php 1 month ago class-semaphore.php 3 weeks ago class-storage-methods-interface.php 1 month ago class-updraft-dashboard-news.php 1 month ago class-updraft-semaphore.php 4 years ago class-updraftcentral-updraftplus-commands.php 3 years ago class-updraftplus-deactivation.php 1 month ago class-updraftplus-encryption.php 1 month ago class-wpadmin-commands.php 1 month ago class-zip.php 1 month ago ftp.class.php 2 months ago get-cpanel-quota-usage.pl 12 years ago google-extensions.php 1 month ago jquery-ui.custom-v1.11.4-1-26-4.min.css 3 weeks ago jquery-ui.custom-v1.11.4-1-26-4.min.css.map 3 weeks ago jquery-ui.custom-v1.11.4.css 3 years ago jquery-ui.custom-v1.12.1-1-26-4.min.css 3 weeks ago jquery-ui.custom-v1.12.1-1-26-4.min.css.map 3 weeks ago jquery-ui.custom-v1.12.1.css 3 years ago migrator-lite.php 1 month ago updraft-admin-common-1-26-4.min.js 3 weeks ago updraft-admin-common.js 3 weeks ago updraft-restorer-skin-compatibility.php 6 years ago updraft-restorer-skin.php 3 years ago updraftcentral.php 1 year ago updraftplus-clone.php 1 year ago updraftplus-login.php 7 months ago updraftplus-notices.php 1 month ago updraftplus-tour.php 1 month ago updraftvault.php 3 years ago
class-semaphore.php
262 lines
1 <?php
2 // phpcs:disable WordPress.DB.DirectDatabaseQuery.DirectQuery -- Direct $wpdb query is required for this operation.
3 // phpcs:disable WordPress.DB.DirectDatabaseQuery.NoCaching -- some query operations need to always receive the most up-to-date or actual data directly from the database, reducing the risk of serving stale information.
4 /**
5 * Semaphore Lock Management
6 * Adapted from WP Social under the GPL - thanks to Alex King (https://github.com/crowdfavorite/wp-social)
7 */
8 class UpdraftPlus_Semaphore {
9
10 /**
11 * Initializes the semaphore object.
12 *
13 * @static
14 * @return UpdraftPlus_Semaphore
15 */
16 public static function factory() {
17 return new self;
18 }
19
20 /**
21 * Lock Broke
22 *
23 * @var boolean
24 */
25 protected $lock_broke = false;
26
27 public $lock_name = 'lock';
28
29 /**
30 * Attempts to start the lock. If the rename works, the lock is started.
31 *
32 * @return bool
33 */
34 public function lock() {
35 global $wpdb, $updraftplus;
36
37 // Attempt to set the lock
38 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Dynamic table name ($wpdb->options) and lock name used in semaphore queries cannot be parameterized
39 $affected = $wpdb->query("
40 UPDATE $wpdb->options
41 SET option_name = 'updraftplus_locked_".$this->lock_name."'
42 WHERE option_name = 'updraftplus_unlocked_".$this->lock_name."'
43 ");
44
45 if ('0' == $affected && !$this->stuck_check()) {
46 $updraftplus->log('Semaphore lock ('.$this->lock_name.', '.$wpdb->options.') failed (line '.__LINE__.')');
47 return false;
48 }
49
50 // Check to see if all processes are complete
51 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Dynamic table name ($wpdb->options) and lock name used in semaphore queries cannot be parameterized
52 $affected = $wpdb->query("
53 UPDATE $wpdb->options
54 SET option_value = CAST(option_value AS UNSIGNED) + 1
55 WHERE option_name = 'updraftplus_semaphore_".$this->lock_name."'
56 AND option_value = '0'
57 ");
58 if ('1' != $affected) {
59 if (!$this->stuck_check()) {
60 $updraftplus->log('Semaphore lock ('.$this->lock_name.', '.$wpdb->options.') failed (line '.__LINE__.')');
61 return false;
62 }
63
64 // Reset the semaphore to 1
65 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Dynamic table name ($wpdb->options) and lock name used in semaphore queries cannot be parameterized
66 $wpdb->query("
67 UPDATE $wpdb->options
68 SET option_value = '1'
69 WHERE option_name = 'updraftplus_semaphore_".$this->lock_name."'
70 ");
71
72 $updraftplus->log('Semaphore ('.$this->lock_name.', '.$wpdb->options.') reset to 1');
73 }
74
75 // Set the lock time
76 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Dynamic table name ($wpdb->options) and lock name used in semaphore queries cannot be parameterized
77 $wpdb->query($wpdb->prepare("
78 UPDATE $wpdb->options
79 SET option_value = %s
80 WHERE option_name = 'updraftplus_last_lock_time_".$this->lock_name."'
81 ", current_time('mysql', 1)));
82 $updraftplus->log('Set semaphore last lock ('.$this->lock_name.') time to '.current_time('mysql', 1));
83
84 $updraftplus->log('Semaphore lock ('.$this->lock_name.') complete');
85 return true;
86 }
87
88 public static function ensure_semaphore_exists($semaphore) {
89 // Make sure the options for semaphores exist
90 global $wpdb, $updraftplus;
91
92 $results = $wpdb->get_results(
93 $wpdb->prepare(
94 "SELECT option_id FROM $wpdb->options WHERE option_name IN (%s, %s, %s, %s)",
95 "updraftplus_locked_$semaphore",
96 "updraftplus_unlocked_$semaphore",
97 "updraftplus_last_lock_time_$semaphore",
98 "updraftplus_semaphore_$semaphore"
99 )
100 );
101
102 if (!is_array($results) || count($results) < 3) {
103
104 if (is_array($results) && count($results) > 0) {
105 $updraftplus->log("Semaphore ($semaphore, ".$wpdb->options.") in an impossible/broken state - fixing (".count($results).")");
106 } else {
107 $updraftplus->log("Semaphore ($semaphore, ".$wpdb->options.") being initialised");
108 }
109
110 $wpdb->query(
111 $wpdb->prepare(
112 "DELETE FROM $wpdb->options WHERE option_name IN (%s, %s, %s, %s)",
113 'updraftplus_locked_'.$semaphore,
114 'updraftplus_unlocked_'.$semaphore,
115 'updraftplus_last_lock_time_'.$semaphore,
116 'updraftplus_semaphore_'.$semaphore
117 )
118 );
119
120 $wpdb->query(
121 $wpdb->prepare(
122 "INSERT INTO $wpdb->options (option_name, option_value, autoload) VALUES (%s, %s, %s), (%s, %s, %s), (%s, %s, %s)",
123 'updraftplus_unlocked_'.$semaphore,
124 '1',
125 'no',
126 'updraftplus_last_lock_time_'.$semaphore,
127 current_time('mysql', 1),
128 'no',
129 'updraftplus_semaphore_'.$semaphore,
130 '0',
131 'no'
132 )
133 );
134 }
135 }
136
137 /**
138 * Increment the semaphore.
139 *
140 * @param array $filters
141 * @return Updraft_Semaphore
142 */
143 public function increment(array $filters = array()) {
144 global $wpdb, $updraftplus;
145
146 if (count($filters)) {
147 // Loop through all of the filters and increment the semaphore
148 foreach ($filters as $priority) {
149 for ($i = 0, $j = count($priority); $i < $j; ++$i) {
150 $this->increment();
151 }
152 }
153 } else {
154 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Dynamic table name ($wpdb->options) and lock name used in semaphore queries cannot be parameterized
155 $wpdb->query("
156 UPDATE $wpdb->options
157 SET option_value = CAST(option_value AS UNSIGNED) + 1
158 WHERE option_name = 'updraftplus_semaphore_".$this->lock_name."'
159 ");
160 $updraftplus->log('Incremented the semaphore ('.$this->lock_name.') by 1');
161 }
162
163 return $this;
164 }
165
166 /**
167 * Decrements the semaphore.
168 *
169 * @return void
170 */
171 public function decrement() {
172 global $wpdb, $updraftplus;
173
174 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Dynamic table name ($wpdb->options) and lock name used in semaphore queries cannot be parameterized
175 $wpdb->query("
176 UPDATE $wpdb->options
177 SET option_value = CAST(option_value AS UNSIGNED) - 1
178 WHERE option_name = 'updraftplus_semaphore_".$this->lock_name."'
179 AND CAST(option_value AS UNSIGNED) > 0
180 ");
181 $updraftplus->log('Decremented the semaphore ('.$this->lock_name.') by 1');
182 }
183
184 /**
185 * Unlocks the process.
186 *
187 * @return bool
188 */
189 public function unlock() {
190 global $wpdb, $updraftplus;
191
192 // Decrement for the master process.
193 $this->decrement();
194
195 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Dynamic table name ($wpdb->options) and lock name used in semaphore queries cannot be parameterized
196 $result = $wpdb->query("
197 UPDATE $wpdb->options
198 SET option_name = 'updraftplus_unlocked_".$this->lock_name."'
199 WHERE option_name = 'updraftplus_locked_".$this->lock_name."'
200 ");
201
202 if ('1' == $result) {
203 $updraftplus->log('Semaphore ('.$this->lock_name.') unlocked');
204 return true;
205 }
206
207 $updraftplus->log('Semaphore ('.$this->lock_name.', '.$wpdb->options.') still locked ('.$result.')');
208 return false;
209 }
210
211 /**
212 * Attempts to jiggle the stuck lock loose.
213 *
214 * @return bool
215 */
216 private function stuck_check() {
217 global $wpdb, $updraftplus;
218
219 // Check to see if we already broke the lock.
220 if ($this->lock_broke) {
221 return true;
222 }
223
224 $current_time = current_time('mysql', 1);
225 $three_minutes_before = gmdate('Y-m-d H:i:s', time()-(defined('UPDRAFTPLUS_SEMAPHORE_LOCK_WAIT') ? UPDRAFTPLUS_SEMAPHORE_LOCK_WAIT : 180));
226
227 // phpcs:ignore WordPress.DB.PreparedSQL.NotPrepared -- Dynamic table name ($wpdb->options) and lock name used in semaphore queries cannot be parameterized
228 $affected = $wpdb->query($wpdb->prepare("
229 UPDATE $wpdb->options
230 SET option_value = %s
231 WHERE option_name = 'updraftplus_last_lock_time_".$this->lock_name."'
232 AND option_value <= %s
233 ", $current_time, $three_minutes_before));
234
235 if ('1' == $affected) {
236 $updraftplus->log('Semaphore ('.$this->lock_name.', '.$wpdb->options.') was stuck, set lock time to '.$current_time);
237 $this->lock_broke = true;
238 return true;
239 }
240
241 // Check if lock is greater that 24 hours
242 $last_lock_time = strtotime(UpdraftPlus_Options::get_updraft_option('updraftplus_last_lock_time_'.$this->lock_name, $current_time));
243 $next_day = strtotime($current_time.' +1 day');
244 if ($last_lock_time > $next_day) {
245 $this->lock_broke = true;
246 return true;
247 }
248
249 return false;
250 }
251
252 /**
253 * Remove a given lock from the options table in the database
254 *
255 * @return Boolean True if the lock has successfully been removed, false otherwise
256 */
257 public function delete_lock() {
258 global $wpdb;
259 return (bool) $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->options} WHERE option_name = %s", $this->lock_name));
260 }
261 } // End UpdraftPlus_Semaphore
262