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->get_gitea_all(); update_option('gitea_last_checked', $now); } } function get_gitea_all() { $this->get_gitea_plugins(); $this->get_gitea_themes(); } function get_gitea_plugins() { $this->plugins = array(); $plugins = get_plugins(); foreach ($plugins as $plugin_slug => $plugin) { if (!empty($plugin['Gitea URI']) && !empty($plugin['Gitea Host'])) { // this is a gitea plugin $slug = trim(dirname($plugin_slug), '/'); $host = $this->get_gitea_host($plugin['Gitea Host']); $repo = $plugin['Gitea URI']; $local_version = strtolower($plugin['Version']); $url = $this->get_gitea_url($host, $repo, '/raw/master/'.basename($plugin_slug)); if ($url != false) { $new_version = $this->get_gitea_version($url, 'plugin'); $new_version = $new_version ? $new_version : $local_version; } // 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' => $host, 'gitea_repo' => $repo, 'description' => $plugin['Description'], 'url' => $host.$repo, 'local_version' => $local_version, 'new_version' => $new_version, 'package' => $this->get_gitea_url($host, $repo, '/archive/master.zip'), ); $this->plugins[$slug] = $gitea; } } update_option('gitea_plugins', $this->plugins); } function get_gitea_themes() { $this->themes = 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 = $this->get_gitea_host($theme->get('Gitea Host')); $repo = $theme->get('Gitea URI'); $local_version = strtolower($theme->get('Version')); $url = $this->get_gitea_url($host, $repo, '/raw/master/style.css'); if ($url != false) { $new_version = $this->get_gitea_version($url, 'plugin'); $new_version = $new_version ? $new_version : $local_version; } // 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' => $host, 'gitea_repo' => $repo, 'description' => $theme->get('Description'), 'author' => $theme->get('Author'), 'url' => $theme->get('AuthorURI'),//$host.$repo, 'local_version' => $local_version, 'new_version' => $new_version, 'package' => $this->get_gitea_url($host, $repo, '/archive/master.zip'), ); $this->themes[$slug] = $gitea; } } update_option('gitea_themes', $this->themes); } function get_gitea_host($host) { return rtrim($host, '/').'/'; } function get_gitea_token($host, $repo) { return '9ebc78834767d2ce0f95ec8a5ab597bc1fbc9ed6'; } function get_gitea_url($host, $repo, $args = '') { $access_token = $this->get_gitea_token($host, $repo); if (!$access_token) return false; return $host.'api/v1/repos/'.$repo.$args.'?access_token='.$access_token; } function get_gitea_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_gitea_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 && current_user_can($transient)) { $current = get_site_transient($transient); $this->get_gitea_all(); $current = $this->pre_set_site_transient_update_plugins($current); $current = $this->pre_set_site_transient_update_themes($current); set_site_transient($transient, $current); } remove_filter('admin_init', array($this, 'admin_pages_update_transient')); } 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; } } Gitea_Updater::getInstance();