PluginProbe
Boxzilla – WordPress Popup Builder / 3.1.12
Boxzilla – WordPress Popup Builder v3.1.12
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.1.12, at src/licensing/class-update-manager.php

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