-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
51cab71
commit 4097adf
Showing
114 changed files
with
11,056 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,10 @@ | ||
<?php | ||
|
||
namespace YahnisElsts\PluginUpdateChecker\v5; | ||
|
||
if ( !class_exists(PucFactory::class, false) ): | ||
|
||
class PucFactory extends \YahnisElsts\PluginUpdateChecker\v5p4\PucFactory { | ||
} | ||
|
||
endif; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,86 @@ | ||
<?php | ||
|
||
namespace YahnisElsts\PluginUpdateChecker\v5p4; | ||
|
||
if ( !class_exists(Autoloader::class, false) ): | ||
|
||
class Autoloader { | ||
const DEFAULT_NS_PREFIX = 'YahnisElsts\\PluginUpdateChecker\\'; | ||
|
||
private $prefix; | ||
private $rootDir; | ||
private $libraryDir; | ||
|
||
private $staticMap; | ||
|
||
public function __construct() { | ||
$this->rootDir = dirname(__FILE__) . '/'; | ||
|
||
$namespaceWithSlash = __NAMESPACE__ . '\\'; | ||
$this->prefix = $namespaceWithSlash; | ||
|
||
$this->libraryDir = $this->rootDir . '../..'; | ||
if ( !self::isPhar() ) { | ||
$this->libraryDir = realpath($this->libraryDir); | ||
} | ||
$this->libraryDir = $this->libraryDir . '/'; | ||
|
||
//Usually, dependencies like Parsedown are in the global namespace, | ||
//but if someone adds a custom namespace to the entire library, they | ||
//will be in the same namespace as this class. | ||
$isCustomNamespace = ( | ||
substr($namespaceWithSlash, 0, strlen(self::DEFAULT_NS_PREFIX)) !== self::DEFAULT_NS_PREFIX | ||
); | ||
$libraryPrefix = $isCustomNamespace ? $namespaceWithSlash : ''; | ||
|
||
$this->staticMap = array( | ||
$libraryPrefix . 'PucReadmeParser' => 'vendor/PucReadmeParser.php', | ||
$libraryPrefix . 'Parsedown' => 'vendor/Parsedown.php', | ||
); | ||
|
||
//Add the generic, major-version-only factory class to the static map. | ||
$versionSeparatorPos = strrpos(__NAMESPACE__, '\\v'); | ||
if ( $versionSeparatorPos !== false ) { | ||
$versionSegment = substr(__NAMESPACE__, $versionSeparatorPos + 1); | ||
$pointPos = strpos($versionSegment, 'p'); | ||
if ( ($pointPos !== false) && ($pointPos > 1) ) { | ||
$majorVersionSegment = substr($versionSegment, 0, $pointPos); | ||
$majorVersionNs = __NAMESPACE__ . '\\' . $majorVersionSegment; | ||
$this->staticMap[$majorVersionNs . '\\PucFactory'] = | ||
'Puc/' . $majorVersionSegment . '/Factory.php'; | ||
} | ||
} | ||
|
||
spl_autoload_register(array($this, 'autoload')); | ||
} | ||
|
||
/** | ||
* Determine if this file is running as part of a Phar archive. | ||
* | ||
* @return bool | ||
*/ | ||
private static function isPhar() { | ||
//Check if the current file path starts with "phar://". | ||
static $pharProtocol = 'phar://'; | ||
return (substr(__FILE__, 0, strlen($pharProtocol)) === $pharProtocol); | ||
} | ||
|
||
public function autoload($className) { | ||
if ( isset($this->staticMap[$className]) && file_exists($this->libraryDir . $this->staticMap[$className]) ) { | ||
include($this->libraryDir . $this->staticMap[$className]); | ||
return; | ||
} | ||
|
||
if ( strpos($className, $this->prefix) === 0 ) { | ||
$path = substr($className, strlen($this->prefix)); | ||
$path = str_replace(array('_', '\\'), '/', $path); | ||
$path = $this->rootDir . $path . '.php'; | ||
|
||
if ( file_exists($path) ) { | ||
include $path; | ||
} | ||
} | ||
} | ||
} | ||
|
||
endif; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,199 @@ | ||
<?php | ||
namespace YahnisElsts\PluginUpdateChecker\v5p4\DebugBar; | ||
|
||
use YahnisElsts\PluginUpdateChecker\v5p4\PucFactory; | ||
use YahnisElsts\PluginUpdateChecker\v5p4\UpdateChecker; | ||
|
||
if ( !class_exists(Extension::class, false) ): | ||
|
||
class Extension { | ||
const RESPONSE_BODY_LENGTH_LIMIT = 4000; | ||
|
||
/** @var UpdateChecker */ | ||
protected $updateChecker; | ||
protected $panelClass = Panel::class; | ||
|
||
public function __construct($updateChecker, $panelClass = null) { | ||
$this->updateChecker = $updateChecker; | ||
if ( isset($panelClass) ) { | ||
$this->panelClass = $panelClass; | ||
} | ||
|
||
if ( (strpos($this->panelClass, '\\') === false) ) { | ||
$this->panelClass = __NAMESPACE__ . '\\' . $this->panelClass; | ||
} | ||
|
||
add_filter('debug_bar_panels', array($this, 'addDebugBarPanel')); | ||
add_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies')); | ||
|
||
add_action('wp_ajax_puc_v5_debug_check_now', array($this, 'ajaxCheckNow')); | ||
} | ||
|
||
/** | ||
* Register the PUC Debug Bar panel. | ||
* | ||
* @param array $panels | ||
* @return array | ||
*/ | ||
public function addDebugBarPanel($panels) { | ||
if ( $this->updateChecker->userCanInstallUpdates() ) { | ||
$panels[] = new $this->panelClass($this->updateChecker); | ||
} | ||
return $panels; | ||
} | ||
|
||
/** | ||
* Enqueue our Debug Bar scripts and styles. | ||
*/ | ||
public function enqueuePanelDependencies() { | ||
wp_enqueue_style( | ||
'puc-debug-bar-style-v5', | ||
$this->getLibraryUrl("/css/puc-debug-bar.css"), | ||
array('debug-bar'), | ||
'20221008' | ||
); | ||
|
||
wp_enqueue_script( | ||
'puc-debug-bar-js-v5', | ||
$this->getLibraryUrl("/js/debug-bar.js"), | ||
array('jquery'), | ||
'20221008' | ||
); | ||
} | ||
|
||
/** | ||
* Run an update check and output the result. Useful for making sure that | ||
* the update checking process works as expected. | ||
*/ | ||
public function ajaxCheckNow() { | ||
//phpcs:ignore WordPress.Security.NonceVerification.Missing -- Nonce is checked in preAjaxRequest(). | ||
if ( !isset($_POST['uid']) || ($_POST['uid'] !== $this->updateChecker->getUniqueName('uid')) ) { | ||
return; | ||
} | ||
$this->preAjaxRequest(); | ||
$update = $this->updateChecker->checkForUpdates(); | ||
if ( $update !== null ) { | ||
echo "An update is available:"; | ||
//phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_print_r -- For debugging output. | ||
echo '<pre>', esc_html(print_r($update, true)), '</pre>'; | ||
} else { | ||
echo 'No updates found.'; | ||
} | ||
|
||
$errors = $this->updateChecker->getLastRequestApiErrors(); | ||
if ( !empty($errors) ) { | ||
printf('<p>The update checker encountered %d API error%s.</p>', count($errors), (count($errors) > 1) ? 's' : ''); | ||
|
||
foreach (array_values($errors) as $num => $item) { | ||
$wpError = $item['error']; | ||
/** @var \WP_Error $wpError */ | ||
printf('<h4>%d) %s</h4>', intval($num + 1), esc_html($wpError->get_error_message())); | ||
|
||
echo '<dl>'; | ||
printf('<dt>Error code:</dt><dd><code>%s</code></dd>', esc_html($wpError->get_error_code())); | ||
|
||
if ( isset($item['url']) ) { | ||
printf('<dt>Requested URL:</dt><dd><code>%s</code></dd>', esc_html($item['url'])); | ||
} | ||
|
||
if ( isset($item['httpResponse']) ) { | ||
if ( is_wp_error($item['httpResponse']) ) { | ||
$httpError = $item['httpResponse']; | ||
/** @var \WP_Error $httpError */ | ||
printf( | ||
'<dt>WordPress HTTP API error:</dt><dd>%s (<code>%s</code>)</dd>', | ||
esc_html($httpError->get_error_message()), | ||
esc_html($httpError->get_error_code()) | ||
); | ||
} else { | ||
//Status code. | ||
printf( | ||
'<dt>HTTP status:</dt><dd><code>%d %s</code></dd>', | ||
esc_html(wp_remote_retrieve_response_code($item['httpResponse'])), | ||
esc_html(wp_remote_retrieve_response_message($item['httpResponse'])) | ||
); | ||
|
||
//Headers. | ||
echo '<dt>Response headers:</dt><dd><pre>'; | ||
foreach (wp_remote_retrieve_headers($item['httpResponse']) as $name => $value) { | ||
printf("%s: %s\n", esc_html($name), esc_html($value)); | ||
} | ||
echo '</pre></dd>'; | ||
|
||
//Body. | ||
$body = wp_remote_retrieve_body($item['httpResponse']); | ||
if ( $body === '' ) { | ||
$body = '(Empty response.)'; | ||
} else if ( strlen($body) > self::RESPONSE_BODY_LENGTH_LIMIT ) { | ||
$length = strlen($body); | ||
$body = substr($body, 0, self::RESPONSE_BODY_LENGTH_LIMIT) | ||
. sprintf("\n(Long string truncated. Total length: %d bytes.)", $length); | ||
} | ||
|
||
printf('<dt>Response body:</dt><dd><pre>%s</pre></dd>', esc_html($body)); | ||
} | ||
} | ||
echo '<dl>'; | ||
} | ||
} | ||
|
||
exit; | ||
} | ||
|
||
/** | ||
* Check access permissions and enable error display (for debugging). | ||
*/ | ||
protected function preAjaxRequest() { | ||
if ( !$this->updateChecker->userCanInstallUpdates() ) { | ||
die('Access denied'); | ||
} | ||
check_ajax_referer('puc-ajax'); | ||
|
||
//phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.runtime_configuration_error_reporting -- Part of a debugging feature. | ||
error_reporting(E_ALL); | ||
//phpcs:ignore WordPress.PHP.IniSet.display_errors_Blacklisted | ||
@ini_set('display_errors', 'On'); | ||
} | ||
|
||
/** | ||
* Remove hooks that were added by this extension. | ||
*/ | ||
public function removeHooks() { | ||
remove_filter('debug_bar_panels', array($this, 'addDebugBarPanel')); | ||
remove_action('debug_bar_enqueue_scripts', array($this, 'enqueuePanelDependencies')); | ||
remove_action('wp_ajax_puc_v5_debug_check_now', array($this, 'ajaxCheckNow')); | ||
} | ||
|
||
/** | ||
* @param string $filePath | ||
* @return string | ||
*/ | ||
private function getLibraryUrl($filePath) { | ||
$absolutePath = realpath(dirname(__FILE__) . '/../../../' . ltrim($filePath, '/')); | ||
|
||
//Where is the library located inside the WordPress directory structure? | ||
$absolutePath = PucFactory::normalizePath($absolutePath); | ||
|
||
$pluginDir = PucFactory::normalizePath(WP_PLUGIN_DIR); | ||
$muPluginDir = PucFactory::normalizePath(WPMU_PLUGIN_DIR); | ||
$themeDir = PucFactory::normalizePath(get_theme_root()); | ||
|
||
if ( (strpos($absolutePath, $pluginDir) === 0) || (strpos($absolutePath, $muPluginDir) === 0) ) { | ||
//It's part of a plugin. | ||
return plugins_url(basename($absolutePath), $absolutePath); | ||
} else if ( strpos($absolutePath, $themeDir) === 0 ) { | ||
//It's part of a theme. | ||
$relativePath = substr($absolutePath, strlen($themeDir) + 1); | ||
$template = substr($relativePath, 0, strpos($relativePath, '/')); | ||
$baseUrl = get_theme_root_uri($template); | ||
|
||
if ( !empty($baseUrl) && $relativePath ) { | ||
return $baseUrl . '/' . $relativePath; | ||
} | ||
} | ||
|
||
return ''; | ||
} | ||
} | ||
|
||
endif; |
Oops, something went wrong.