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

226 lines 5.4 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 // 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 );
146
147 return $this->available_updates;
148
149 }
150
151 /**
152 * @param $remote_plugins
153 * @return array
154 */
155 protected function filter_remote_plugins( $remote_plugins ) {
156
157 $available_updates = array();
158
159 // find new versions
160 foreach( $remote_plugins as $remote_plugin ) {
161
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 );
170
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 }
175
176 // add some dynamic data
177 $available_updates[ $local_plugin->slug() ] = $this->format_response( $local_plugin, $remote_plugin );
178 }
179
180 return $available_updates;
181 }
182
183 /**
184 * @param Plugin $plugin
185 *
186 * @return null
187 */
188 public function get_update_info( Plugin $plugin ) {
189 $available_updates = $this->fetch_updates();
190
191 if( isset( $available_updates[ $plugin->slug() ] ) ) {
192 return $available_updates[ $plugin->slug() ];
193 }
194
195 return null;
196 }
197
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();
208
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 }
218
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 );
222
223 return $response;
224 }
225
226 }