PluginProbe
Boxzilla – WordPress Popup Builder / 3.2.6
Boxzilla – WordPress Popup Builder v3.2.6
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
boxzilla / src / licensing / class-update-manager.php

class-update-manager.php in Boxzilla – WordPress Popup Builder 3.2.6, at src/licensing/class-update-manager.php

238 lines 5.7 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Boxzilla\Licensing;
4
5 use Boxzilla\Collection,
6 Boxzilla\Plugin,
7 Boxzilla\Admin\Notices;
8
9 class UpdateManager {
10
11 /**
12 * @var Collection
13 */
14 protected $extensions;
15
16 /**
17 * @var API
18 */
19 protected $api;
20
21 /**
22 * @var License
23 */
24 protected $license;
25
26 /**
27 * @var
28 */
29 protected $available_updates;
30
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 }
41
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 }
50
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
62 if( strpos( $url, $this->api->url ) !== 0 || strpos( $url, 'download' ) === false ) {
63 return $args;
64 }
65
66 // only add if activation key not empty
67 if( empty( $this->license->activation_key ) ) {
68 return $args;
69 }
70
71 if( empty( $args['headers'] ) ) {
72 $args['headers'] = array();
73 }
74
75 $args['headers']['Authorization'] = 'Bearer ' . urlencode( $this->license->activation_key );
76 return $args;
77 }
78
79 /**
80 * @param $result
81 * @param string $action
82 * @param null $args
83 *
84 * @return object
85 */
86 public function get_plugin_info( $result, $action = '', $args = null ) {
87
88 // do nothing for unrelated requests
89 if( $action !== 'plugin_information' || ! isset( $args->slug ) ) {
90 return $result;
91 }
92
93 // only act on our plugins
94 $plugin = $this->extensions->find( function( $p ) use($args) {
95 return dirname( $p->slug() ) == $args->slug;
96 });
97
98 // was it a plugin of ours?
99 if( $plugin ) {
100 return $this->get_update_info( $plugin );
101 }
102
103 return $result;
104 }
105
106 /**
107 * @param object $updates
108 * @return object
109 */
110 public function add_updates( $updates ) {
111
112 // do nothing if no plugins registered
113 if( count( $this->extensions ) === 0 ) {
114 return $updates;
115 }
116
117 // failsafe WP bug
118 if( empty( $updates )
119 || empty( $updates->response )
120 || ! is_array( $updates->response ) ) {
121 return $updates;
122 }
123
124 // fetch available updates
125 $available_updates = $this->fetch_updates();
126
127 // merge with other updates
128 $updates->response = array_merge( $updates->response, $available_updates );
129
130 return $updates;
131 }
132
133 /**
134 * Fetch array of available updates from remote server
135 *
136 * @return array
137 */
138 protected function fetch_updates() {
139
140 if( is_array( $this->available_updates ) ) {
141 return $this->available_updates;
142 }
143
144 // don't try if we failed a request recently.
145 $failed_at = get_transient( 'boxzilla_request_failed' );
146 if( ! empty( $failed_at ) && ( (strtotime('now') - 300) < $failed_at ) ) {
147 return array();
148 }
149
150 // fetch remote info
151 try {
152 $remote_plugins = $this->api->get_plugins( $this->extensions );
153 } catch( API_Exception $e ) {
154 // set flag for 5 minutes
155 set_transient( 'boxzilla_request_failed', strtotime('now'), 300 );
156 return array();
157 }
158
159 // filter remote plugins, we only want the ones with an update available
160 $this->available_updates = $this->filter_remote_plugins( $remote_plugins );
161
162 return $this->available_updates;
163
164 }
165
166 /**
167 * @param $remote_plugins
168 * @return array
169 */
170 protected function filter_remote_plugins( $remote_plugins ) {
171
172 $available_updates = array();
173
174 // find new versions
175 foreach( $remote_plugins as $remote_plugin ) {
176
177 // find corresponding local plugin
178 /** @var Plugin $local_plugin */
179 $local_plugin = $this->extensions->find(
180 function( $local_plugin ) use( $remote_plugin ){
181 /** @var Plugin $local_plugin */
182 return $local_plugin->id() == $remote_plugin->sid;
183 }
184 );
185
186 // plugin found and local plugin version not same as remote version?
187 if( ! $local_plugin || version_compare( $local_plugin->version(), $remote_plugin->new_version, '>=' ) ) {
188 continue;
189 }
190
191 // add some dynamic data
192 $available_updates[ $local_plugin->slug() ] = $this->format_response( $local_plugin, $remote_plugin );
193 }
194
195 return $available_updates;
196 }
197
198 /**
199 * @param Plugin $plugin
200 *
201 * @return null
202 */
203 public function get_update_info( Plugin $plugin ) {
204 $available_updates = $this->fetch_updates();
205
206 if( isset( $available_updates[ $plugin->slug() ] ) ) {
207 return $available_updates[ $plugin->slug() ];
208 }
209
210 return null;
211 }
212
213 /**
214 * @param Plugin $plugin
215 * @param $response
216 *
217 * @return mixed
218 */
219 protected function format_response( Plugin $plugin, $response ) {
220 $response->slug = dirname( $plugin->slug() );
221 $response->plugin = $plugin->slug();
222
223 // add some notices if license is inactive
224 if( ! $this->license->activated ) {
225 $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' ) );
226 $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;
227 $response->package = null;
228 }
229
230 // cast subkey objects to array as that is what WP expects
231 $response->sections = get_object_vars( $response->sections );
232 $response->banners = get_object_vars( $response->banners );
233
234 return $response;
235 }
236
237 }
238