1<?php
2
3namespace dokuwiki\plugin\config\core\Setting;
4
5/**
6 * Class setting_authtype
7 */
8class SettingAuthtype extends SettingMultichoice
9{
10    /** @inheritdoc */
11    public function initialize($default = null, $local = null, $protected = null)
12    {
13        /** @var $plugin_controller \dokuwiki\Extension\PluginController */
14        global $plugin_controller;
15
16        // retrieve auth types provided by plugins
17        foreach ($plugin_controller->getList('auth') as $plugin) {
18            $this->choices[] = $plugin;
19        }
20
21        parent::initialize($default, $local, $protected);
22    }
23
24    /** @inheritdoc */
25    public function update($input)
26    {
27        /** @var $plugin_controller \dokuwiki\Extension\PluginController */
28        global $plugin_controller;
29
30        // is an update possible/requested?
31        $local = $this->local;                       // save this, parent::update() may change it
32        if (!parent::update($input)) return false;    // nothing changed or an error caught by parent
33        $this->local = $local;                       // restore original, more error checking to come
34
35        // attempt to load the plugin
36        $auth_plugin = $plugin_controller->load('auth', $input);
37
38        // @TODO: throw an error in plugin controller instead of returning null
39        if (is_null($auth_plugin)) {
40            $this->error = true;
41            msg('Cannot load Auth Plugin "' . $input . '"', -1);
42            return false;
43        }
44
45        // verify proper instantiation (is this really a plugin?) @TODO use instanceof? implement interface?
46        if (is_object($auth_plugin) && !method_exists($auth_plugin, 'getPluginName')) {
47            $this->error = true;
48            msg('Cannot create Auth Plugin "' . $input . '"', -1);
49            return false;
50        }
51
52        // did we change the auth type? logout
53        global $conf;
54        if ($conf['authtype'] != $input) {
55            msg('Authentication system changed. Please re-login.');
56            auth_logoff();
57        }
58
59        $this->local = $input;
60        return true;
61    }
62}
63