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