xref: /dokuwiki/lib/plugins/extension/remote.php (revision 1d94f4f44cca59190c077a9ea0f097643d4be121)
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