diff --git a/gitea-updater-settings.php b/gitea-updater-settings.php new file mode 100644 index 0000000..9d72f34 --- /dev/null +++ b/gitea-updater-settings.php @@ -0,0 +1,59 @@ + + '> + +
+ +

Gitea Upater

+ + + + +
+ settings = new Gitea_Updater_Settings(); + + add_action('admin_init', array($this, 'admin_init')); + + // force check in core update, plugins and themes pages + add_action('admin_init', array($this, 'admin_pages_update_transient')); + + // plugins checks + add_filter('plugins_api', array($this, 'plugins_api'), 10, 3); + add_filter('pre_set_site_transient_update_plugins', array($this, 'pre_set_site_transient_update_plugins')); + + // themes checks + add_filter('pre_set_site_transient_update_themes', array($this, 'pre_set_site_transient_update_themes')); + + // rename directories + add_filter('upgrader_source_selection', array($this, 'upgrader_source_selection'), 10, 4); + + // extra plugins and themes headers (Gitea Host and Gitea URI) + add_filter('extra_plugin_headers', array($this, 'extra_headers')); + add_filter('extra_theme_headers', array($this, 'extra_headers')); + + // remote management + add_action('wp_update_plugins', array($this, 'forced_meta_update_plugins')); + add_action('wp_update_themes', array($this, 'forced_meta_update_themes')); + add_action('wp_ajax_nopriv_ithemes_sync_request', array($this, 'forced_meta_update_remote_management')); + add_action('update_option_auto_updater.lock', array($this, 'forced_meta_update_remote_management')); + + } + + + function admin_init() { + + // check interval data + $now = strtotime('now'); + $last_checked = (int) get_option('gitea_last_checked'); + $check_interval = apply_filters('gitea_check_interval', (60 * 60 * 0)); + + // cached data + $this->plugins = (array)get_option('gitea_plugins'); + $this->themes = (array)get_option('gitea_themes'); + + // if is time... update data + if (($now - $last_checked) > $check_interval) { + $this->plugins = $this->get_gitea_plugins(); + update_option('gitea_plugins', $this->plugins); + + $this->themes = $this->get_gitea_themes(); + update_option('gitea_themes', $this->plugins); + + update_option('gitea_last_checked', $now); + } + + var_dump($this->plugins); + + } + + function get_gitea_plugins() { + $plugin_data = array(); + $plugins = get_plugins(); + + foreach ($plugins as $plugin_slug => $plugin) { +var_dump($plugin_slug); +var_dump($plugin['Gitea Host']); + if (!empty($plugin['Gitea URI']) && !empty($plugin['Gitea Host'])) { + + // this is a gitea plugin + + $slug = trim(dirname($plugin_slug), '/'); + $host = $plugin['Gitea Host']; + $repo = $plugin['Gitea URI']; + + $url = $this->get_gitea_url($host, $repo, '/raw/master/'.basename($plugin_slug)); + var_dump($url); + if ($url == false) + continue; + + $version = $this->get_gitea_version($url, 'plugin'); + if ($version == false) + continue; + // here we have the remote version from gitea/repo/plugin_file + + // building the plugin data + $gitea = array( + 'plugin' => $plugin_slug, + 'slug' => $slug, + 'file' => basename($plugin_slug), + 'name' => $plugin['Name'], + 'gitea_host' => $plugin['Gitea Host'], + 'gitea_repo' => $plugin['Gitea URI'], + 'description' => $plugin['Description'], + 'url' => $host.$repo, + 'local_version' => strtolower($plugin['Version']), + 'new_version' => $version, + 'package' => $this->get_gitea_url($host, $repo, '/archive/master.zip'), + ); + + $plugin_data[$slug] = $gitea; + } + } + + return $plugin_data; + } + + function get_gitea_themes() { + $theme_data = array(); + $themes = wp_get_themes(); + + foreach ( $themes as $theme ) { + + if ($theme->get('Gitea Host') != '' && $theme->get('Gitea URI')) { + + // this is a gitea theme + + $slug = $theme->stylesheet; + $host = $theme->get('Gitea Host'); + $repo = $theme->get('Gitea URI'); + + $url = $this->get_gitea_url($host, $repo, '/raw/master/style.css'); + if ($url == false) + continue; + + $version = $this->get_gitea_version($url, 'theme'); + if ($version == false) + continue; + // here we have the remote version from gitea/repo/style.css + + // building the theme data + $gitea = array( + 'slug' => $slug, + 'name' => $theme->get('Name'), + 'gitea_host' => $theme->get('Gitea Host'), + 'gitea_repo' => $theme->get('Gitea URI'), + 'description' => $theme->get('Description'), + 'author' => $theme->get('Author'), + 'url' => $theme->get('AuthorURI'),//$host.$repo, + 'local_version' => strtolower($theme->get('Version')), + 'new_version' => $version, + 'package' => $this->get_gitea_url($host, $repo, '/archive/master.zip'), + ); + + $theme_data[$slug] = $gitea; + } + + } + + return $theme_data; + } + + function get_gitea_token($host) { + return '9ebc78834767d2ce0f95ec8a5ab597bc1fbc9ed6'; + } + + function get_gitea_url($host, $repo, $args = '') { + $access_token = $this->get_gitea_token($host); + if (!$access_token) return false; + return $host.'api/v1/repos/'.$repo.$args.'?access_token='.$access_token; + } + + function get_gite_file($url) { + $request = wp_remote_get($url); + + if (is_wp_error($request) || 200 != wp_remote_retrieve_response_code($request)) { + return false; + } + + // in $request['body'] we have the content from the file + return $request; + } + + function get_gitea_version($url, $type) { + + $request = $this->get_gite_file($url); + + if (!$request) return false; + + // get the headers + $headers = $this->get_file_headers($request['body'], $type); + + return isset($headers['Version']) ? $headers['Version'] : false; + } + + function plugins_api($default = false, $action, $args) { + if ('plugin_information' != $action) + return $default; + + if (!isset($this->plugins[$args->slug])) + return $default; + + // plugin information (view notes befor update) + + $plugin = $this->plugins[$args->slug]; + + return (object) array( + 'name' => $plugin['name'], + 'slug' => $plugin['plugin'], + 'version' => $plugin['new_version'], + 'sections' => array( + 'description' => $plugin['description'] + ), + 'download_link' => $plugin['package'], + 'homepage' => $plugin['url'], + ); + + } + + function pre_set_site_transient_update_plugins($transient) { + // check if some plugin needs update using the cached data + + foreach ($this->plugins as $plugin => $git_plugin) { + + if (version_compare($git_plugin['local_version'], $git_plugin['new_version'], '<')) { + $transient->response[$git_plugin['plugin']] = (object) $git_plugin; + } + + } + + return $transient; + } + + function pre_set_site_transient_update_themes($transient) { + // check if some theme needs update + + foreach ($this->themes as $theme => $git_theme) { + + if (version_compare($git_theme['local_version'], $git_theme['new_version'], '<')) { + $transient->response[$theme] = (array)$git_theme; + } + + } + + return $transient; + } + + public function admin_pages_update_transient() { + // force update data on 'plugins.php', 'themes.php', 'update-core.php' + + global $pagenow; + + $admin_pages = array('plugins.php', 'themes.php', 'update-core.php'); + $is_admin_page = in_array($pagenow, $admin_pages) ? true : false; + $transient = 'update_'.rtrim($pagenow, '.php'); + $transient = 'update_update-core' === $transient ? 'update_core' : $transient; + + if ($is_admin_page) { + $this->make_update_transient_current($transient); + } + + remove_filter('admin_init', array($this, 'admin_pages_update_transient')); + } + + function make_update_transient_current($transient) { + if (!in_array($transient, array('update_plugins', 'update_themes', 'update_core'))) { + return; + } + + if (current_user_can($transient)) { + $current = get_site_transient($transient); + switch ($transient) { + case 'update_plugins': + $this->forced_meta_update_plugins(true); + $current = $this->pre_set_site_transient_update_plugins($current); + break; + case 'update_themes': + $this->forced_meta_update_themes(true); + $current = $this->pre_set_site_transient_update_themes($current); + break; + case 'update_core': + $this->forced_meta_update_plugins(true); + $current = $this->pre_set_site_transient_update_plugins($current); + $this->forced_meta_update_themes(true); + $current = $this->pre_set_site_transient_update_themes($current); + break; + } + set_site_transient($transient, $current); + } + } + + public function forced_meta_update_plugins($true = false) { + if ($this->remote_managemnet || $true) { + $this->plugins = $this->get_gitea_plugins(); + } + } + + public function forced_meta_update_themes($true = false) { + if ($this->remote_managemnet || $true) { + $this->themes = $this->get_gitea_themes(); + } + } + + public function forced_meta_update_remote_management() { + $this->forced_meta_update_plugins(); + $this->forced_meta_update_themes(); + } + + function upgrader_source_selection($source, $remote_source, $upgrader, $hook_extra = null) { + global $wp_filesystem; + + $plugin = isset($hook_extra['plugin']) ? $hook_extra['plugin'] : false; + if (isset($this->plugins[$plugin]) && $plugin) { + $new_source = trailingslashit($remote_source).dirname($plugin); + $wp_filesystem->move($source, $new_source); + return trailingslashit($new_source); + } + + return $source; + } + + function get_file_headers($contents, $type) { + + $gitea_headers = array( + 'GiteaHost' => 'Gitea Host', + 'GiteaUri' => 'Gitea URI', + ); + + $default_plugin_headers = array( + 'Name' => 'Plugin Name', + 'PluginURI' => 'Plugin URI', + 'Version' => 'Version', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'TextDomain' => 'Text Domain', + 'DomainPath' => 'Domain Path', + 'Network' => 'Network', + ); + + $default_theme_headers = array( + 'Name' => 'Theme Name', + 'ThemeURI' => 'Theme URI', + 'Description' => 'Description', + 'Author' => 'Author', + 'AuthorURI' => 'Author URI', + 'Version' => 'Version', + 'Template' => 'Template', + 'Status' => 'Status', + 'Tags' => 'Tags', + 'TextDomain' => 'Text Domain', + 'DomainPath' => 'Domain Path', + ); + + if (false !== strpos($type, 'plugin')) { + $all_headers = $default_plugin_headers; + } + + if (false !== strpos($type, 'theme')) { + $all_headers = $default_theme_headers; + } + + $file_data = str_replace("\r", "\n", $contents); + + $all_headers = array_merge($gitea_headers, (array) $all_headers); + $all_headers = array_unique($all_headers); + + foreach ($all_headers as $field => $regex) { + if (preg_match( '/^[ \t\/*#@]*'.preg_quote($regex, '/').':(.*)$/mi', $file_data, $match) && $match[1]) { + $all_headers[$field] = _cleanup_header_comment($match[1]); + } else { + $all_headers[$field] = ''; + } + } + + $all_headers = array_filter($all_headers, + function($e) use (&$all_headers) { + return !empty($e); + }); + + return $all_headers; + } + + function extra_headers($headers) { + $headers[] = 'Gitea URI'; + $headers[] = 'Gitea Host'; + return $headers; + } + +} + +new Gitea_Updater(); \ No newline at end of file