Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Admin if fix #10

Merged
merged 3 commits into from
Jul 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
326 changes: 162 additions & 164 deletions admin/src/PluginUpdater.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,203 +4,201 @@

class PluginUpdater
{
private $file;
private $file;

private $plugin;
private $plugin;

private $basename;
private $basename;

private $active;
private $active;

private $username;
private $username;

private $repository;
private $repository;

private $authorize_token;
private $authorize_token;

private $github_response;
private $github_response;

public function __construct($file, $repository, $token = "")
{
$this->file = $file;
$this->username = 'Trizelos';
$this->repository = $repository;
$this->authorize_token = $token;
public function __construct( $file, $repository, $token = "" )
{
$this->file = $file;
$this->username = 'Trizelos';
$this->repository = $repository;
$this->authorize_token = $token;

$this->set_plugin_properties();
$this->set_plugin_properties();

$this->initialize();
}
$this->initialize();
}

private function set_plugin_properties(): void
{
if (!function_exists('get_plugin_data')) {
require_once(ABSPATH . 'wp-admin/includes/plugin.php');
}
$this->plugin = get_plugin_data($this->file);
$this->basename = plugin_basename($this->file);
$this->active = is_plugin_active($this->basename);
}
private function set_plugin_properties(): void
{
if ( ! function_exists( 'get_plugin_data' ) ) {
require_once( ABSPATH . 'wp-admin/includes/plugin.php' );
}
$this->plugin = get_plugin_data( $this->file );
$this->basename = plugin_basename( $this->file );
$this->active = is_plugin_active( $this->basename );
}

private function initialize(): void
{
add_filter('site_transient_update_plugins', array($this, 'modify_transient'), 10, 1);
add_filter('plugins_api', array($this, 'plugin_popup'), 10, 3);
add_filter('upgrader_post_install', array(&$this, 'after_install'), 10, 3);
private function initialize(): void
{
add_filter( 'site_transient_update_plugins', array( $this, 'modify_transient' ), 10, 1 );
add_filter( 'plugins_api', array( $this, 'plugin_popup' ), 10, 3 );
add_filter( 'upgrader_post_install', array( &$this, 'after_install' ), 10, 3 );

// Add Authorization Token to download_package
add_filter('upgrader_pre_download', function () {
add_filter('http_request_args', [$this, 'download_package'], 15, 2);
// Add Authorization Token to download_package
add_filter( 'upgrader_pre_download', function ()
{
add_filter( 'http_request_args', [ $this, 'download_package' ], 15, 2 );

return false; // upgrader_pre_download filter default return value.
});
}
return false; // upgrader_pre_download filter default return value.
} );
}

public function modify_transient($transient): mixed
{
if (empty($checked = $transient->checked)) {
return $transient;
}
public function modify_transient( $transient ): mixed
{
if ( ! str_contains( parse_url( $_SERVER["REQUEST_URI"], PHP_URL_PATH ), '/wp-admin/plugins.php' ) ) {
return $transient;
}

if (!array_key_exists($this->basename, $checked)) {
return $transient;
}
if ( empty( $checked = $transient->checked ) ) {
return $transient;
}

$this->get_repository_info(); // Get the repo info
if (!isset($this->github_response['tag_name'])) {
return $transient;
}
if ( ! array_key_exists( $this->basename, $checked ) ) {
return $transient;
}

$out_of_date = version_compare($this->github_response['tag_name'], $checked[$this->basename], 'gt'); // Check if we're out of date
$this->get_repository_info(); // Get the repo info
if ( ! isset( $this->github_response['tag_name'] ) ) {
return $transient;
}

if ($out_of_date) {
prew( $transient );

$new_files = $this->github_response['zipball_url']; // Get the ZIP
$out_of_date = version_compare( $this->github_response['tag_name'], $checked[ $this->basename ], 'gt' ); // Check if we're out of date

$slug = current(explode('/', $this->basename)); // Create valid slug
if ( $out_of_date ) {

$plugin = array( // setup our plugin info
'url' => $this->plugin["PluginURI"],
'slug' => $slug,
'package' => $new_files,
'new_version' => $this->github_response['tag_name']
);
$new_files = $this->github_response['zipball_url']; // Get the ZIP

$transient->response[$this->basename] = (object)$plugin; // Return it in response
}
$slug = current( explode( '/', $this->basename ) ); // Create valid slug

return $transient; // Return filtered transient
}
$plugin = array( // setup our plugin info
'url' => $this->plugin["PluginURI"],
'slug' => $slug,
'package' => $new_files,
'new_version' => $this->github_response['tag_name']
);

private function get_repository_info(): void
{
if (is_null($this->github_response)) { // Do we have a response?
$args = array();
$request_uri = sprintf('https://api.github.com/repos/%s/%s/releases', $this->username, $this->repository); // Build URI
$transient->response[ $this->basename ] = (object) $plugin; // Return it in response
}

if ($this->authorize_token) { // Is there an access token?
$args['headers']['Authorization'] = "bearer {$this->authorize_token}"; // Set the headers
}
return $transient; // Return filtered transient
}

$response = json_decode(wp_remote_retrieve_body(wp_remote_get($request_uri, $args)), true); // Get JSON and parse it
private function get_repository_info(): void
{
if ( is_null( $this->github_response ) ) { // Do we have a response?
$args = array();
$request_uri = sprintf( 'https://api.github.com/repos/%s/%s/releases', $this->username, $this->repository ); // Build URI

if (is_array($response)) { // If it is an array
$response = current($response); // Get the first item
}
if ( $this->authorize_token ) { // Is there an access token?
$args['headers']['Authorization'] = "bearer {$this->authorize_token}"; // Set the headers
}

$this->github_response = $response; // Set it to our property
}
}

public function plugin_popup($result, $action, $args): mixed
{
if ('plugin_information' !== $action) {
return $result;
}
if ($args->slug !== current(explode('/', $this->basename))) { // And it's our slug
return $result;
}
$this->get_repository_info(); // Get our repo info

if (isset($this->github_response['tag_name'])) {
return $result;
}

// Set it to an array
$plugin = array(
'name' => $this->plugin["Name"],
'slug' => $this->basename,
'requires' => '5.3',
$response = json_decode( wp_remote_retrieve_body( wp_remote_get( $request_uri, $args ) ), true ); // Get JSON and parse it

if ( is_array( $response ) ) { // If it is an array
$response = current( $response ); // Get the first item
}

$this->github_response = $response; // Set it to our property
}
}

public function plugin_popup( $result, $action, $args ): mixed
{
if ( 'plugin_information' !== $action ) {
return $result;
}
if ( $args->slug !== current( explode( '/', $this->basename ) ) ) { // And it's our slug
return $result;
}
$this->get_repository_info(); // Get our repo info

if ( isset( $this->github_response['tag_name'] ) ) {
return $result;
}

// Set it to an array
$plugin = array(
'name' => $this->plugin["Name"],
'slug' => $this->basename,
'requires' => '5.3',
// 'tested' => '5.*',
// 'rating' => '100.0',
// 'num_ratings' => '1',
// 'downloaded' => '1',
// 'added' => '2016-01-05',
'version' => $this->github_response['tag_name'],
'author' => $this->plugin["AuthorName"],
'author_profile' => $this->plugin["AuthorURI"],
'last_updated' => $this->github_response['published_at'],
'homepage' => $this->plugin["PluginURI"],
'short_description' => $this->plugin["Description"],
'sections' => array(
'Updates' => $this->github_response['body'],
'Description' => $this->plugin["Description"],
),
'download_link' => $this->github_response['zipball_url']
);

return (object)$plugin; // Return the data
}

public function download_package($args, $url): mixed
{

if (null !== $args['filename']) {
if ($this->authorize_token) {
$args = array_merge($args, array("headers" => array("Authorization" => "token {$this->authorize_token}")));
}
}

remove_filter('http_request_args', [$this, 'download_package']);

return $args;
}

public function after_install($response, $hook_extra, $result): mixed
{
global $wp_filesystem; // Get global FS object

$install_directory = plugin_dir_path($this->file); // Our plugin directory
$wp_filesystem->move($result['destination'], $install_directory); // Move files to the plugin dir
$result['destination'] = $install_directory; // Set the destination for the rest of the stack

if ($this->active) { // If it was active
activate_plugin($this->basename); // Reactivate
}

$this->composer_dump_autoload();

return $result;
}

private function composer_dump_autoload(): void
{
$cwd = getcwd();
$path = plugin_dir_path($this->file);

exec("cd $path && composer dump-autoload -o");
exec("cd $cwd");

prew('updated plugin: ' . $this->file);
}

public function cerberus_core_repos_settings(array $responses): array
{
$this->get_repository_info();
$responses[$this->basename]['response'] = $this->github_response;
$responses[$this->basename]['plugin_data'] = get_plugin_data($this->file);

return $responses;
}
'version' => $this->github_response['tag_name'],
'author' => $this->plugin["AuthorName"],
'author_profile' => $this->plugin["AuthorURI"],
'last_updated' => $this->github_response['published_at'],
'homepage' => $this->plugin["PluginURI"],
'short_description' => $this->plugin["Description"],
'sections' => array(
'Updates' => $this->github_response['body'],
'Description' => $this->plugin["Description"],
),
'download_link' => $this->github_response['zipball_url']
);

return (object) $plugin; // Return the data
}

public function download_package( $args, $url ): mixed
{

if ( null !== $args['filename'] ) {
if ( $this->authorize_token ) {
$args = array_merge( $args, array( "headers" => array( "Authorization" => "token {$this->authorize_token}" ) ) );
}
}

remove_filter( 'http_request_args', [ $this, 'download_package' ] );

return $args;
}

public function after_install( $response, $hook_extra, $result ): mixed
{
global $wp_filesystem; // Get global FS object

$install_directory = plugin_dir_path( $this->file ); // Our plugin directory
$wp_filesystem->move( $result['destination'], $install_directory ); // Move files to the plugin dir
$result['destination'] = $install_directory; // Set the destination for the rest of the stack

if ( $this->active ) { // If it was active
activate_plugin( $this->basename ); // Reactivate
}

$this->composer_dump_autoload();

return $result;
}

private function composer_dump_autoload(): void
{
$cwd = getcwd();
$path = plugin_dir_path( $this->file );

exec( "cd $path && composer dump-autoload -o" );
exec( "cd $cwd" );

prew( 'updated plugin: ' . $this->file );
}
}

8 changes: 5 additions & 3 deletions cerberus-plugins-manager.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
/**
* Plugin Name: Cerberus Plugins Manager
* Description: Manages the cerberus plugins
* Version: 1.0.7
* Version: 1.0.8
* Requires at least: 5.7
* Author: Casey
*/
Expand All @@ -13,5 +13,7 @@

require_once "vendor/autoload.php";

$settingsPage = new SettingsPage(__FILE__);
$pluginUpdater = new PluginUpdater(__FILE__, 'cerberus-plugins-manager');
if ( is_admin() ) {
$settingsPage = new SettingsPage( __FILE__ );
$pluginUpdater = new PluginUpdater( __FILE__, 'cerberus-plugins-manager' );
}