PluginProbe
Boxzilla – WordPress Popup Builder / 3.1.3
Boxzilla – WordPress Popup Builder v3.1.3
3.4.11 3.4.10 3.4.9 3.4.3 3.4.4 3.4.5 3.4.6 3.4.7 3.4.8 trunk 3.0 3.0.1 3.0.2 3.0.3 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 All 72 releases
← All changes | src/licensing/class-update-manager.php +181 -225 3.4.33.1.3 View file →
@@ -1,270 +1,226 @@
1 1 <?php
2 2
3 3 namespace Boxzilla\Licensing;
4 4
5 -use Boxzilla\Plugin;
5 +use Boxzilla\Collection,
6 + Boxzilla\Plugin,
7 + Boxzilla\Admin\Notices;
6 8
7 -class UpdateManager
8 -{
9 - /**
10 - * @var array
11 - */
12 - protected $extensions = [];
9 +class UpdateManager {
13 10
14 - /**
15 - * @var API
16 - */
17 - protected $api;
11 + /**
12 + * @var Collection
13 + */
14 + protected $extensions;
18 15
19 - /**
20 - * @var License
21 - */
22 - protected $license;
16 + /**
17 + * @var API
18 + */
19 + protected $api;
23 20
24 - /**
25 - * @var
26 - */
27 - protected $available_updates;
21 + /**
22 + * @var License
23 + */
24 + protected $license;
28 25
29 - /**
30 - * @param array $extensions
31 - * @param API $api
32 - * @param License $license
33 - */
34 - public function __construct(array $extensions, API $api, License $license)
35 - {
36 - $this->extensions = $extensions;
37 - $this->license = $license;
38 - $this->api = $api;
39 - }
26 + /**
27 + * @var
28 + */
29 + protected $available_updates;
40 30
41 - /**
42 - * Add hooks
43 - */
44 - public function init()
45 - {
46 - add_filter('pre_set_site_transient_update_plugins', [ $this, 'add_updates' ]);
47 - add_filter('plugins_api', [ $this, 'get_plugin_info' ], 20, 3);
48 - add_filter('http_request_args', [ $this, 'add_auth_headers' ], 10, 2);
49 - }
31 + /**
32 + * @param Collection $extensions
33 + * @param API $api
34 + * @param License $license
35 + */
36 + public function __construct( Collection $extensions, API $api, License $license ) {
37 + $this->extensions = $extensions;
38 + $this->license = $license;
39 + $this->api = $api;
40 + }
50 41
51 - /**
52 - * This adds the license key header to download package requests.
53 - *
54 - * @param array $args
55 - * @param string $url
56 - *
57 - * @return mixed
58 - */
59 - public function add_auth_headers($args, $url)
60 - {
61 - // only act on download request's to the Boxzilla update API
62 - if (strpos($url, $this->api->url) !== 0 || strpos($url, '/download') === false) {
63 - return $args;
64 - }
42 + /**
43 + * Add hooks
44 + */
45 + public function hook() {
46 + add_filter( 'pre_set_site_transient_update_plugins', array( $this, 'add_updates' ) );
47 + add_filter( 'plugins_api', array( $this, 'get_plugin_info' ), 20, 3 );
48 + add_filter( 'http_request_args', array( $this, 'add_auth_headers' ), 10, 2 );
49 + }
65 50
66 - // only add if activation key not empty
67 - if (empty($this->license->activation_key)) {
68 - return $args;
69 - }
51 + /**
52 + * This adds the license key header to download package requests.
53 + *
54 + * @param array $args
55 + * @param string $url
56 + *
57 + * @return mixed
58 + */
59 + public function add_auth_headers( $args, $url ) {
60 + if( strpos( $url, $this->api->url ) !== 0 || strpos( $url, 'download' ) === false ) {
61 + return $args;
62 + }
70 63
71 - if (! isset($args['headers'])) {
72 - $args['headers'] = [];
73 - }
64 + if( empty( $args['headers'] ) ) {
65 + $args['headers'] = array();
66 + }
74 67
75 - $args['headers']['Authorization'] = "Bearer {$this->license->activation_key}";
76 - return $args;
77 - }
68 + $args['headers']['Authorization'] = 'Bearer ' . urlencode( $this->license->key );
69 + return $args;
70 + }
78 71
79 - private function get_plugin_by_slug($slug)
80 - {
81 - foreach ($this->extensions as $p) {
82 - // find plugin by slug
83 - if (dirname($p->slug()) === $slug) {
84 - return $p;
85 - }
86 - }
72 + /**
73 + * @param $result
74 + * @param string $action
75 + * @param null $args
76 + *
77 + * @return object
78 + */
79 + public function get_plugin_info( $result, $action = '', $args = null ) {
87 80
88 - return null;
89 - }
81 + // do nothing for unrelated requests
82 + if( $action !== 'plugin_information' || ! isset( $args->slug ) ) {
83 + return $result;
84 + }
90 85
91 - /**
92 - * @param $result
93 - * @param string $action
94 - * @param null $args
95 - *
96 - * @return object
97 - */
98 - public function get_plugin_info($result, $action = '', $args = null)
99 - {
100 - // do nothing for unrelated requests
101 - if ($action !== 'plugin_information' || ! isset($args->slug)) {
102 - return $result;
103 - }
86 + // only act on our plugins
87 + $plugin = $this->extensions->find( function( $p ) use($args) {
88 + return dirname( $p->slug() ) == $args->slug;
89 + });
104 90
105 - // only act on our plugins
106 - if (strpos($args->slug, 'boxzilla-') !== 0) {
107 - return $result;
108 - }
91 + // was it a plugin of ours?
92 + if( $plugin ) {
93 + return $this->get_update_info( $plugin );
94 + }
109 95
110 - return $this->get_update_info($args->slug);
111 - }
96 + return $result;
97 + }
112 98
113 - /**
114 - * @param object $updates
115 - * @return object
116 - */
117 - public function add_updates($updates)
118 - {
99 + /**
100 + * @param object $updates
101 + * @return object
102 + */
103 + public function add_updates( $updates ) {
119 104
120 - // do nothing if no plugins registered
121 - if (empty($this->extensions)) {
122 - return $updates;
123 - }
105 + // do nothing if no plugins registered
106 + if( count( $this->extensions ) === 0 ) {
107 + return $updates;
108 + }
124 109
125 - // failsafe WP bug
126 - if (empty($updates) || ! isset($updates->response) || ! is_array($updates->response)) {
127 - return $updates;
128 - }
110 + // failsafe WP bug
111 + if( empty( $updates )
112 + || empty( $updates->response )
113 + || ! is_array( $updates->response ) ) {
114 + return $updates;
115 + }
129 116
130 - // fetch available updates
131 - $available_updates = $this->fetch_updates();
117 + // fetch available updates
118 + $available_updates = $this->fetch_updates();
132 119
133 - // merge with other updates
134 - $updates->response = array_merge($updates->response, $available_updates);
120 + // merge with other updates
121 + $updates->response = array_merge( $updates->response, $available_updates );
135 122
136 - return $updates;
137 - }
123 + return $updates;
124 + }
138 125
139 - /**
140 - * Fetch array of available updates from remote server
141 - *
142 - * @return array
143 - */
144 - protected function fetch_updates()
145 - {
146 - if (is_array($this->available_updates)) {
147 - return $this->available_updates;
148 - }
126 + /**
127 + * Fetch array of available updates from remote server
128 + *
129 + * @return array
130 + */
131 + protected function fetch_updates() {
149 132
150 - // don't try if we failed a request recently.
151 - $failed_at = get_transient('boxzilla_request_failed');
152 - if (! empty($failed_at) && ( ( strtotime('now') - 300 ) < $failed_at )) {
153 - return [];
154 - }
133 + if( is_array( $this->available_updates ) ) {
134 + return $this->available_updates;
135 + }
155 136
156 - // fetch remote info
157 - try {
158 - $remote_plugins = $this->api->get_plugins();
159 - } catch (API_Exception $e) {
160 - // set flag for 5 minutes
161 - set_transient('boxzilla_request_failed', strtotime('now'), 300);
162 - return [];
163 - }
137 + // fetch remote info
138 + try {
139 + $remote_plugins = $this->api->get_plugins( $this->extensions );
140 + } catch( API_Exception $e ) {
141 + return array();
142 + }
143 +
144 + // filter remote plugins, we only want the ones with an update available
145 + $this->available_updates = $this->filter_remote_plugins( $remote_plugins );
164 146
165 - // filter remote plugins, we only want the ones with an update available
166 - $this->available_updates = $this->filter_remote_plugins($remote_plugins);
147 + return $this->available_updates;
167 148
168 - return $this->available_updates;
169 - }
149 + }
170 150
171 - /**
172 - * @param $remote_plugins
173 - * @return array
174 - */
175 - protected function filter_remote_plugins($remote_plugins)
176 - {
177 - $available_updates = [];
151 + /**
152 + * @param $remote_plugins
153 + * @return array
154 + */
155 + protected function filter_remote_plugins( $remote_plugins ) {
178 156
179 - // find new versions
180 - foreach ($remote_plugins as $remote_plugin) {
181 - // sanity check
182 - if (! isset($remote_plugin->new_version)) {
183 - continue;
184 - }
157 + $available_updates = array();
185 158
186 - // if plugin is activated, we can access it here
187 - if (isset($this->extensions[ $remote_plugin->sid ])) {
159 + // find new versions
160 + foreach( $remote_plugins as $remote_plugin ) {
188 161
189 - /** @var Plugin $local_plugin */
190 - $local_plugin = $this->extensions[ $remote_plugin->sid ];
162 + // find corresponding local plugin
163 + /** @var Plugin $local_plugin */
164 + $local_plugin = $this->extensions->find(
165 + function( $local_plugin ) use( $remote_plugin ){
166 + /** @var Plugin $local_plugin */
167 + return $local_plugin->id() == $remote_plugin->sid;
168 + }
169 + );
191 170
192 - // plugin found and local plugin version not same as remote version?
193 - if (! $local_plugin || version_compare($local_plugin->version(), $remote_plugin->new_version, '>=')) {
194 - continue;
195 - }
171 + // plugin found and local plugin version not same as remote version?
172 + if( ! $local_plugin || version_compare( $local_plugin->version(), $remote_plugin->version, '>=' ) ) {
173 + continue;
174 + }
196 175
197 - // add some dynamic data
198 - $available_updates[ $local_plugin->slug() ] = $this->format_response($local_plugin->slug(), $remote_plugin);
199 - } else {
200 - // if plugin is not active, use get_plugin_data for fetching version
201 - $plugin_file = WP_PLUGIN_DIR . "/{$remote_plugin->slug}/{$remote_plugin->slug}.php";
202 - if (! file_exists($plugin_file)) {
203 - continue;
204 - }
176 + // add some dynamic data
177 + $available_updates[ $local_plugin->slug() ] = $this->format_response( $local_plugin, $remote_plugin );
178 + }
205 179
206 - $plugin_data = get_plugin_data($plugin_file);
180 + return $available_updates;
181 + }
207 182
208 - if (! $plugin_data || version_compare($plugin_data['Version'], $remote_plugin->new_version, '>=')) {
209 - continue;
210 - }
183 + /**
184 + * @param Plugin $plugin
185 + *
186 + * @return null
187 + */
188 + public function get_update_info( Plugin $plugin ) {
189 + $available_updates = $this->fetch_updates();
211 190
212 - // add some dynamic data
213 - $slug = plugin_basename($plugin_file);
214 - $available_updates[ $slug ] = $this->format_response($slug, $remote_plugin);
215 - }
216 - }
191 + if( isset( $available_updates[ $plugin->slug() ] ) ) {
192 + return $available_updates[ $plugin->slug() ];
193 + }
217 194
218 - return $available_updates;
219 - }
195 + return null;
196 + }
220 197
221 - /**
222 - * @param string $slug
223 - *
224 - * @return null
225 - */
226 - public function get_update_info($slug)
227 - {
228 - $available_updates = $this->fetch_updates();
198 + /**
199 + * @param Plugin $plugin
200 + * @param $response
201 + *
202 + * @return mixed
203 + */
204 + protected function format_response( Plugin $plugin, $response ) {
205 + $response->new_version = $response->version;
206 + $response->slug = dirname( $plugin->slug() );
207 + $response->plugin = $plugin->slug();
229 208
230 - foreach ($available_updates as $plugin_file => $update_info) {
231 - if ($slug === $update_info->slug) {
232 - return $update_info;
233 - }
234 - }
209 + // add some notices if license is inactive
210 + if( ! $this->license->activated ) {
211 + $response->upgrade_notice = sprintf( 'You will need to <a href="%s">activate your license</a> to install this plugin update.', admin_url( 'edit.php?post_type=boxzilla-box&page=boxzilla-settings' ) );
212 + $response->sections->changelog = '<p>' . sprintf( 'You will need to <a href="%s" target="_top">activate your license</a> to install this plugin update.', admin_url( 'edit.php?post_type=boxzilla-box&page=boxzilla-settings' ) ) . '</p>' . $response->sections->changelog;
213 + $response->package = null;
214 + } else {
215 + // add activation key to download URL
216 + $response->package = add_query_arg( array( 'key' => $this->license->activation_key ), $response->package );
217 + }
235 218
236 - return null;
237 - }
219 + // cast subkey objects to array as that is what WP expects
220 + $response->sections = get_object_vars( $response->sections );
221 + $response->banners = get_object_vars( $response->banners );
238 222
239 - /**
240 - * @param $slug
241 - * @param $response
242 - *
243 - * @return mixed
244 - */
245 - protected function format_response($slug, $response)
246 - {
247 - $response->slug = dirname($slug);
248 - $response->plugin = $slug;
223 + return $response;
224 + }
249 225
250 - // add some notices if license is inactive
251 - if (! $this->license->activated) {
252 - $response->upgrade_notice = sprintf('You will need to <a href="%s">activate your license</a> to install this plugin update.', admin_url('edit.php?post_type=boxzilla-box&page=boxzilla-settings'));
253 - $response->sections->changelog = '<p>' . sprintf('You will need to <a href="%s" target="_top">activate your license</a> to install this plugin update.', admin_url('edit.php?post_type=boxzilla-box&page=boxzilla-settings')) . '</p>' . $response->sections->changelog;
254 - $response->package = null;
255 - }
256 -
257 - // cast subkey objects to array as that is what WP expects
258 - $response->sections = get_object_vars($response->sections);
259 - $response->banners = get_object_vars($response->banners);
260 - $response->contributors = get_object_vars($response->contributors);
261 - $response->contributors = array_map(
262 - function ($v) {
263 - return get_object_vars($v);
264 - },
265 - $response->contributors
266 - );
267 -
268 - return $response;
269 - }
270 -}
226 +}