PluginProbe ʕ •ᴥ•ʔ
Advanced Access Manager – Access Governance for WordPress / 5.3
Advanced Access Manager – Access Governance for WordPress v5.3
6.8.4 6.8.5 6.9.0 6.9.1 6.9.10 6.9.11 6.9.12 6.9.13 6.9.14 6.9.15 6.9.16 6.9.17 6.9.18 6.9.19 6.9.2 6.9.20 6.9.21 6.9.22 6.9.23 6.9.24 6.9.25 6.9.26 6.9.27 6.9.28 6.9.29 6.9.3 6.9.30 6.9.31 6.9.32 6.9.33 6.9.34 6.9.35 6.9.36 6.9.37 6.9.38 6.9.39 6.9.4 6.9.41 6.9.42 6.9.43 6.9.44 6.9.45 6.9.46 6.9.47 6.9.48 6.9.49 6.9.5 6.9.51 6.9.6 6.9.7 6.9.8 6.9.9 7.0.0 7.0.0-alpha.6 7.0.0-alpha.7 7.0.0-beta.1 7.0.0-rc1 7.0.0-rc2 7.0.0-rc3 7.0.1 7.0.10 7.0.11 7.0.2 7.0.3 7.0.4 7.0.5 7.0.6 7.0.7 7.0.8 7.0.9 7.1.0 7.1.1 trunk 3.0 4.0 4.0.1 4.1 4.2 4.3 4.4 4.4.1 4.5 4.6 4.6.1 4.6.2 4.7 4.7.1 4.7.2 4.7.5 4.7.6 4.8 4.8.1 4.9 4.9.1 4.9.2 4.9.3 4.9.4 4.9.5 4.9.5.1 4.9.5.2 5.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1 5.1.1 5.10 5.11 5.2 5.2.1 5.2.5 5.2.6 5.2.7 5.3 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.4 5.4.1 5.4.2 5.4.3 5.4.3.1 5.4.3.2 5.5 5.5.1 5.5.2 5.6 5.6.1 5.6.1.1 5.7 5.7.1 5.7.2 5.7.3 5.8 5.8.1 5.8.2 5.8.3 5.9 5.9.1 5.9.1.1 5.9.2 5.9.2.1 5.9.3 5.9.4 5.9.5 5.9.6 5.9.6.1 5.9.6.2 5.9.6.3 5.9.7 5.9.7.1 5.9.7.2 5.9.7.3 5.9.8 5.9.8.1 5.9.9 5.9.9.1 6.0.0 6.0.1 6.0.2 6.0.3 6.0.4 6.0.5 6.1.0 6.1.1 6.2.0 6.2.1 6.2.2 6.3.0 6.3.1 6.3.2 6.3.3 6.4.0 6.4.1 6.4.2 6.4.3 6.5.0 6.5.1 6.5.2 6.5.3 6.5.4 6.6.0 6.6.1 6.6.2 6.6.3 6.6.4 6.7.0 6.7.1 6.7.2 6.7.3 6.7.4 6.7.5 6.7.6 6.7.7 6.7.8 6.7.9 6.8.0 6.8.1 6.8.2 6.8.3
advanced-access-manager / Application / Extension / Repository.php
advanced-access-manager / Application / Extension Last commit date
List.php 8 years ago Repository.php 8 years ago
Repository.php
387 lines
1 <?php
2
3 /**
4 * ======================================================================
5 * LICENSE: This file is subject to the terms and conditions defined in *
6 * file 'license.txt', which is part of this source code package. *
7 * ======================================================================
8 */
9
10 /**
11 * Extension Repository
12 *
13 * @package AAM
14 * @author Vasyl Martyniuk <vasyl@vasyltech.com>
15 */
16 class AAM_Extension_Repository {
17
18 /**
19 * Extension status: installed
20 *
21 * Extension has been installed and is up to date
22 */
23 const STATUS_INSTALLED = 'installed';
24
25 /**
26 * License violation
27 *
28 * Extension is inactive
29 */
30 const STATUS_INACTIVE = 'inactive';
31
32 /**
33 * Extension status: download
34 *
35 * Extension is not installed and either needs to be purchased or
36 * downloaded for free.
37 */
38 const STATUS_DOWNLOAD = 'download';
39
40 /**
41 * Extension status: update
42 *
43 * New version of the extension has been detected.
44 */
45 const STATUS_UPDATE = 'update';
46
47 /**
48 * Single instance of itself
49 *
50 * @var AAM_Extension_Repository
51 *
52 * @access private
53 * @static
54 */
55 private static $_instance = null;
56
57 /**
58 * Extension list
59 *
60 * @var array
61 *
62 * @access protected
63 */
64 protected $list = array();
65
66 /**
67 * Constructor
68 *
69 * @return void
70 *
71 * @access protected
72 */
73 protected function __construct() {}
74
75 /**
76 * Load active extensions
77 *
78 * @return void
79 *
80 * @access public
81 */
82 public function load($dir = null) {
83 $basedir = (is_null($dir) ? $this->getBasedir() : $dir);
84
85 //since release 3.4 some extensions get intergreated into core
86 AAM_Core_Compatibility::initExtensions();
87
88 if (file_exists($basedir)) {
89 //iterate through each active extension and load it
90 foreach (scandir($basedir) as $extension) {
91 if (!in_array($extension, array('.', '..'))) {
92 $this->bootstrapExtension($basedir . '/' . $extension);
93 }
94 }
95 //Very important hook for cases when there is extensions dependancy.
96 //For example AAM Plus Package depends on AAM Utitlities properties
97 do_action('aam-post-extensions-load');
98 }
99 }
100
101 /**
102 * Bootstrap the Extension
103 *
104 * In case of any errors, the output can be found in console
105 *
106 * @param string $path
107 *
108 * @return void
109 * @access protected
110 */
111 protected function bootstrapExtension($path) {
112 static $cache = null;
113
114 if (is_null($cache)) {
115 $cache = AAM_Core_Compatibility::getLicenseList();
116 }
117
118 $load = true;
119 $config = "{$path}/config.php";
120 $bootstrap = "{$path}/bootstrap.php";
121
122 if (file_exists($config)) {
123 $conf = require $config;
124 $load = empty($cache[$conf['id']]['status']) || ($cache[$conf['id']]['status'] != self::STATUS_INACTIVE);
125 } else { // TODO - Remove May 2018
126 AAM_Core_Console::add(AAM_Backend_View_Helper::preparePhrase(
127 sprintf(
128 __('The [%s] file is missing. Update extension to the latest version. %sRead more.%s', AAM_KEY),
129 str_replace(AAM_EXTENSION_BASE . '/', '', $config),
130 '<a href="https://aamplugin.com/help/how-to-fix-the-config-php-file-is-missing-notification" target="_blank">',
131 '</a>'
132 ),
133 'b'
134 ));
135 }
136
137 if ($load && file_exists($bootstrap)) { //bootstrap the extension
138 require($bootstrap);
139 }
140 }
141
142 /**
143 * Store the license key
144 *
145 * This is important to have just for the update extension purposes
146 *
147 * @param stdClass $package
148 * @param string $license
149 *
150 * @return void
151 *
152 * @access public
153 */
154 public function storeLicense($package, $license) {
155 //retrieve the installed list of extensions
156 $list = AAM_Core_Compatibility::getLicenseList();
157
158 $list[$package->id] = array(
159 'license' => $license, 'expire' => $package->expire
160 );
161
162 //update the extension list
163 AAM_Core_API::updateOption('aam-extensions', $list);
164 }
165
166
167 /**
168 * Add new extension
169 *
170 * @param blob $zip
171 *
172 * @return boolean
173 * @access public
174 */
175 public function add($zip) {
176 $filepath = $this->getBasedir() . '/' . uniqid('aam_');
177 $result = false;
178
179 if (file_put_contents($filepath, $zip)) { //unzip the archive
180 WP_Filesystem(false, false, true); //init filesystem
181 $result = unzip_file($filepath, $this->getBasedir());
182 if (!is_wp_error($result)) {
183 $result = true;
184 }
185 @unlink($filepath); //remove the working archive
186 }
187
188 return $result;
189 }
190
191 /**
192 * Update extension status
193 *
194 * @param string $id
195 * @param string $status
196 */
197 public function updateStatus($id, $status) {
198 //retrieve the installed list of extensions
199 $list = AAM_Core_Compatibility::getLicenseList();
200
201 $list[$id]['status'] = $status;
202
203 //update the extension list
204 AAM_Core_API::updateOption('aam-extensions', $list);
205 }
206
207 /**
208 * Get extension version
209 *
210 * @param string $id
211 *
212 * @return string|null
213 *
214 * @access public
215 */
216 public function getVersion($id) {
217 return (defined($id) ? constant($id) : null);
218 }
219
220 /**
221 * Get extension list
222 *
223 * @return array
224 *
225 * @access public
226 */
227 public function getList() {
228 if (empty($this->list)) {
229 $list = AAM_Extension_List::get();
230 $index = AAM_Core_Compatibility::getLicenseList();
231 $check = AAM_Core_API::getOption('aam-check', array(), 'site');
232
233 foreach ($list as $id => &$item) {
234 //get premium license from the stored license index
235 if (empty($item['license'])) {
236 if (!empty($index[$id]['license'])) {
237 $item['license'] = $index[$id]['license'];
238 $item['expire'] = (isset($index[$id]['expire']) ? date('Y-m-d', strtotime($index[$id]['expire'])) : null);
239 } else {
240 $item['license'] = '';
241 }
242 }
243
244 //update extension status
245 $item['status'] = $this->checkStatus($item, $check, $index);
246 }
247
248 $this->list = $list;
249 }
250
251 return $this->list;
252 }
253
254 /**
255 *
256 * @param type $item
257 * @param type $index
258 * @return type
259 */
260 protected function checkStatus($item, $retrieved, $stored) {
261 $id = $item['id'];
262 $status = !empty($stored[$id]['status']) ? $stored[$id]['status'] : null;
263
264 if (is_null($status)) {
265 $status = AAM_Extension_Repository::STATUS_DOWNLOAD;
266
267 if (defined($id)) {
268 $status = AAM_Extension_Repository::STATUS_INSTALLED;
269
270 if ($this->isOutdatedVersion($item, $retrieved, constant($id))) {
271 $status = AAM_Extension_Repository::STATUS_UPDATE;
272 AAM_Core_Console::add(
273 AAM_Backend_View_Helper::preparePhrase(sprintf(
274 'The [%s] extension has new update available for download;',
275 $item['title']
276 ), 'b')
277 );
278 }
279 }
280 } elseif ($status == AAM_Extension_Repository::STATUS_INSTALLED) {
281 if (!defined($id)) {
282 $status = AAM_Extension_Repository::STATUS_DOWNLOAD;
283 } elseif ($this->isOutdatedVersion($item, $retrieved, constant($id))) {
284 $status = AAM_Extension_Repository::STATUS_UPDATE;
285 }
286 }
287
288 return $status;
289 }
290
291 /**
292 *
293 * @param type $item
294 * @param type $retrieved
295 * @param type $version
296 * @return type
297 */
298 protected function isOutdatedVersion($item, $retrieved, $version) {
299 $id = $item['id'];
300
301 if ($item['type'] == 'commercial') {
302 $valid = !empty($item['license']);
303 } else {
304 $valid = true;
305 }
306
307 return $valid && isset($retrieved->$id)
308 && version_compare($version, $retrieved->$id->version) == -1;
309 }
310
311 /**
312 * Check extension directory
313 *
314 * @return boolean|sstring
315 *
316 * @access public
317 *
318 * @global type $wp_filesystem
319 */
320 public function checkDirectory() {
321 $error = false;
322 $basedir = $this->getBasedir();
323
324 if (!file_exists($basedir)) {
325 if (!@mkdir($basedir, fileperms(ABSPATH) & 0777 | 0755, true)) {
326 $error = sprintf(__('Failed to create %s', AAM_KEY), $basedir);
327 }
328 } elseif (!is_writable($basedir)) {
329 $error = sprintf(
330 __('Directory %s is not writable', AAM_KEY), $basedir
331 );
332 }
333
334 return $error;
335 }
336
337 /**
338 * Get base directory
339 *
340 * @return string
341 *
342 * @access public
343 */
344 public function getBasedir() {
345 $dirname = AAM_Core_Config::get('extention.directory', AAM_EXTENSION_BASE);
346
347 if (file_exists($dirname) === false) {
348 @mkdir($dirname, fileperms( ABSPATH ) & 0777 | 0755);
349 }
350
351 return $dirname;
352 }
353
354 /**
355 * Check if there are any updates
356 *
357 * @return type
358 */
359 public function hasUpdates() {
360 $updates = 0;
361
362 foreach($this->getList() as $item) {
363 $updates += ($item['status'] == self::STATUS_UPDATE);
364 }
365
366 return $updates ? true : false;
367 }
368
369 /**
370 * Get single instance of itself
371 *
372 * @param AAM $parent
373 *
374 * @return AAM_Extension_Repository
375 *
376 * @access public
377 * @static
378 */
379 public static function getInstance() {
380 if (is_null(self::$_instance)) {
381 self::$_instance = new self;
382 }
383
384 return self::$_instance;
385 }
386
387 }