1<?php 2 3use dokuwiki\Extension\RemotePlugin; 4use dokuwiki\plugin\extension\Extension; 5use dokuwiki\plugin\extension\ExtensionApiResponse; 6use dokuwiki\plugin\extension\Installer; 7use dokuwiki\plugin\extension\Local; 8use dokuwiki\plugin\extension\Repository; 9use dokuwiki\Remote\AccessDeniedException; 10 11/** 12 * DokuWiki Plugin extension (Remote Component) 13 * 14 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 15 * @author Andreas Gohr <andi@splitbrain.org> 16 */ 17class remote_plugin_extension extends RemotePlugin 18{ 19 /** 20 * List installed extensions 21 * 22 * This lists all installed extensions. The list is not sorted in any way. 23 * 24 * @return ExtensionApiResponse[] The list of installed extensions and their details 25 */ 26 public function list() 27 { 28 if (!auth_isadmin()) { 29 throw new AccessDeniedException('Only admins are allowed to access extensions', 114); 30 } 31 32 $extensions = (new Local())->getExtensions(); 33 Repository::getInstance()->initExtensions(array_keys($extensions)); 34 35 return array_values( 36 array_map( 37 static fn($extension) => new ExtensionApiResponse($extension), 38 $extensions 39 ) 40 ); 41 } 42 43 /** 44 * Search for extensions in the repository 45 * 46 * @param string $query The keyword(s) to search for 47 * @param int $max Maximum number of results (default 10) 48 * @return ExtensionApiResponse[] List of matching extensions 49 */ 50 public function search($query, $max = 10) 51 { 52 if (!auth_isadmin()) { 53 throw new AccessDeniedException('Only admins are allowed to access extensions', 114); 54 } 55 56 $repo = Repository::getInstance(); 57 $result = $repo->searchExtensions($query); 58 59 if ($max > 0) { 60 $result = array_slice($result, 0, $max); 61 } 62 63 return array_values( 64 array_map( 65 static fn($extension) => new ExtensionApiResponse($extension), 66 $result 67 ) 68 ); 69 } 70 71 /** 72 * Enable a specific extension 73 * 74 * @param string $extension Extension ID to enable 75 * @return bool Success status 76 */ 77 public function enable($extension) 78 { 79 if (!auth_isadmin()) { 80 throw new AccessDeniedException('Only admins are allowed to manage extensions', 114); 81 } 82 83 $ext = Extension::createFromId($extension); 84 $ext->enable(); 85 return true; 86 } 87 88 /** 89 * Disable a specific extension 90 * 91 * @param string $extension Extension ID to disable 92 * @return bool Success status 93 */ 94 public function disable($extension) 95 { 96 if (!auth_isadmin()) { 97 throw new AccessDeniedException('Only admins are allowed to manage extensions', 114); 98 } 99 100 $ext = Extension::createFromId($extension); 101 $ext->disable(); 102 return true; 103 } 104 105 /** 106 * Install a specific extension 107 * 108 * This will also install dependencies, so more than the given extension may be installed. 109 * 110 * @param string $extension Extension ID or download URL 111 * @return string[] List of installed extensions 112 */ 113 public function install($extension) 114 { 115 if (!auth_isadmin()) { 116 throw new AccessDeniedException('Only admins are allowed to manage extensions', 114); 117 } 118 119 $installer = new Installer(true); 120 $installer->installFromId($extension); 121 122 return array_keys( 123 array_filter( 124 $installer->getProcessed(), 125 static fn($status) => ( 126 $status == Installer::STATUS_INSTALLED || $status == Installer::STATUS_UPDATED 127 ) 128 ) 129 ); 130 } 131 132 /** 133 * Uninstall a specific extension 134 * 135 * @param string $extension Extension ID to uninstall 136 * @return bool Success status 137 */ 138 public function uninstall($extension) 139 { 140 if (!auth_isadmin()) { 141 throw new AccessDeniedException('Only admins are allowed to manage extensions', 114); 142 } 143 144 $ext = Extension::createFromId($extension); 145 $installer = new Installer(); 146 $installer->uninstall($ext); 147 return true; 148 } 149} 150