summaryrefslogtreecommitdiff
path: root/lib/plugins/extension/helper/repository.php
diff options
context:
space:
mode:
authorAndreas Gohr <andi@splitbrain.org>2014-01-19 20:12:52 +0100
committerAndreas Gohr <andi@splitbrain.org>2014-01-19 20:12:52 +0100
commit0f569f4da813eb51aa75b3fe4a6e5c871b688eea (patch)
tree7db6c06417b07bb1bbaa5319d9605dfdcb21e1b0 /lib/plugins/extension/helper/repository.php
parent8426a3ee6fca3bd0fc582d6c405f5d30e12028d0 (diff)
parent30b90257784ae25a5e30c968b4c9391bb47ff1a1 (diff)
downloadrpg-0f569f4da813eb51aa75b3fe4a6e5c871b688eea.tar.gz
rpg-0f569f4da813eb51aa75b3fe4a6e5c871b688eea.tar.bz2
Merge branch 'extension_manager'
* extension_manager: (71 commits) added plugins group to test show a message when search returns no results added missing localization better filename parsing use DOKU_LF remove unneeded try/catch blocks typo fix purge cache only once on install check for admin in AJAX backend now use new core funtion to recursively delete added status to info list of extension plugin added css and html changes for RTL scripts to extension manager added basic mobile styles to extension manager (not great, but makes things at least readable) fixed and improved some HTML in extension manager added git warning fixed strict standard error and added some docblock removed the old plugin manager typo fix protect authplain and current auth plugin do not show updates for bundled plugins ... Conflicts: lib/plugins/plugin/lang/hu/admin_plugin.txt lib/plugins/plugin/lang/hu/lang.php
Diffstat (limited to 'lib/plugins/extension/helper/repository.php')
-rw-r--r--lib/plugins/extension/helper/repository.php191
1 files changed, 191 insertions, 0 deletions
diff --git a/lib/plugins/extension/helper/repository.php b/lib/plugins/extension/helper/repository.php
new file mode 100644
index 000000000..1f603a866
--- /dev/null
+++ b/lib/plugins/extension/helper/repository.php
@@ -0,0 +1,191 @@
+<?php
+/**
+ * DokuWiki Plugin extension (Helper Component)
+ *
+ * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
+ * @author Michael Hamann <michael@content-space.de>
+ */
+
+#define('EXTENSION_REPOSITORY_API', 'http://localhost/dokuwiki/lib/plugins/pluginrepo/api.php');
+
+if (!defined('EXTENSION_REPOSITORY_API_ENDPOINT'))
+ define('EXTENSION_REPOSITORY_API', 'http://www.dokuwiki.org/lib/plugins/pluginrepo/api.php');
+
+// must be run within Dokuwiki
+if(!defined('DOKU_INC')) die();
+
+/**
+ * Class helper_plugin_extension_repository provides access to the extension repository on dokuwiki.org
+ */
+class helper_plugin_extension_repository extends DokuWiki_Plugin {
+ private $loaded_extensions = array();
+ private $has_access = null;
+ /**
+ * Initialize the repository (cache), fetches data for all installed plugins
+ */
+ public function init() {
+ /* @var Doku_Plugin_Controller $plugin_controller */
+ global $plugin_controller;
+ if ($this->hasAccess()) {
+ $list = $plugin_controller->getList('', true);
+ $request_data = array('fmt' => 'php');
+ $request_needed = false;
+ foreach ($list as $name) {
+ $cache = new cache('##extension_manager##'.$name, 'repo');
+ $result = null;
+ if (!isset($this->loaded_extensions[$name]) && $this->hasAccess() && !$cache->useCache(array('age' => 3600 * 24))) {
+ $this->loaded_extensions[$name] = true;
+ $request_data['ext'][] = $name;
+ $request_needed = true;
+ }
+ }
+
+ if ($request_needed) {
+ $httpclient = new DokuHTTPClient();
+ $data = $httpclient->post(EXTENSION_REPOSITORY_API, $request_data);
+ if ($data !== false) {
+ $extensions = unserialize($data);
+ foreach ($extensions as $extension) {
+ $cache = new cache('##extension_manager##'.$extension['plugin'], 'repo');
+ $cache->storeCache(serialize($extension));
+ }
+ } else {
+ $this->has_access = false;
+ }
+ }
+ }
+ }
+
+ /**
+ * If repository access is available
+ *
+ * @return bool If repository access is available
+ */
+ public function hasAccess() {
+ if ($this->has_access === null) {
+ $cache = new cache('##extension_manager###hasAccess', 'repo');
+ $result = null;
+ if (!$cache->useCache(array('age' => 3600 * 24, 'purge'=>1))) {
+ $httpclient = new DokuHTTPClient();
+ $httpclient->timeout = 5;
+ $data = $httpclient->get(EXTENSION_REPOSITORY_API.'?cmd=ping');
+ if ($data !== false) {
+ $this->has_access = true;
+ $cache->storeCache(1);
+ } else {
+ $this->has_access = false;
+ $cache->storeCache(0);
+ }
+ } else {
+ $this->has_access = ($cache->retrieveCache(false) == 1);
+ }
+ }
+ return $this->has_access;
+ }
+
+ /**
+ * Get the remote data of an individual plugin or template
+ *
+ * @param string $name The plugin name to get the data for, template names need to be prefix by 'template:'
+ * @return array The data or null if nothing was found (possibly no repository access)
+ */
+ public function getData($name) {
+ $cache = new cache('##extension_manager##'.$name, 'repo');
+ $result = null;
+ if (!isset($this->loaded_extensions[$name]) && $this->hasAccess() && !$cache->useCache(array('age' => 3600 * 24))) {
+ $this->loaded_extensions[$name] = true;
+ $httpclient = new DokuHTTPClient();
+ $data = $httpclient->get(EXTENSION_REPOSITORY_API.'?fmt=php&ext[]='.urlencode($name));
+ if ($data !== false) {
+ $result = unserialize($data);
+ $cache->storeCache(serialize($result[0]));
+ return $result[0];
+ } else {
+ $this->has_access = false;
+ }
+ }
+ if (file_exists($cache->cache)) {
+ return unserialize($cache->retrieveCache(false));
+ }
+ return array();
+ }
+
+ /**
+ * Search for plugins or templates using the given query string
+ *
+ * @param string $q the query string
+ * @return array a list of matching extensions
+ */
+ public function search($q){
+ $query = $this->parse_query($q);
+ $query['fmt'] = 'php';
+
+ $httpclient = new DokuHTTPClient();
+ $data = $httpclient->post(EXTENSION_REPOSITORY_API, $query);
+ if ($data === false) return array();
+ $result = unserialize($data);
+
+ $ids = array();
+
+ // store cache info for each extension
+ foreach($result as $ext){
+ $name = $ext['plugin'];
+ $cache = new cache('##extension_manager##'.$name, 'repo');
+ $cache->storeCache(serialize($ext));
+ $ids[] = $name;
+ }
+
+ return $ids;
+ }
+
+ /**
+ * Parses special queries from the query string
+ *
+ * @param string $q
+ * @return array
+ */
+ protected function parse_query($q){
+ $parameters = array(
+ 'tag' => array(),
+ 'mail' => array(),
+ 'type' => array(),
+ 'ext' => array()
+ );
+
+ // extract tags
+ if(preg_match_all('/(^|\s)(tag:([\S]+))/', $q, $matches, PREG_SET_ORDER)){
+ foreach($matches as $m){
+ $q = str_replace($m[2], '', $q);
+ $parameters['tag'][] = $m[3];
+ }
+ }
+ // extract author ids
+ if(preg_match_all('/(^|\s)(authorid:([\S]+))/', $q, $matches, PREG_SET_ORDER)){
+ foreach($matches as $m){
+ $q = str_replace($m[2], '', $q);
+ $parameters['mail'][] = $m[3];
+ }
+ }
+ // extract extensions
+ if(preg_match_all('/(^|\s)(ext:([\S]+))/', $q, $matches, PREG_SET_ORDER)){
+ foreach($matches as $m){
+ $q = str_replace($m[2], '', $q);
+ $parameters['ext'][] = $m[3];
+ }
+ }
+ // extract types
+ if(preg_match_all('/(^|\s)(type:([\S]+))/', $q, $matches, PREG_SET_ORDER)){
+ foreach($matches as $m){
+ $q = str_replace($m[2], '', $q);
+ $parameters['type'][] = $m[3];
+ }
+ }
+
+ // FIXME make integer from type value
+
+ $parameters['q'] = trim($q);
+ return $parameters;
+ }
+}
+
+// vim:ts=4:sw=4:et: