xref: /plugin/farmer/admin/new.php (revision 85becf1b7890015fe3aa8651c1a80fd9664e9915)
1<?php
2/**
3 * DokuWiki Plugin farmer (Admin Component)
4 *
5 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
6 * @author  Michael Große <grosse@cosmocode.de>
7 */
8
9// must be run within Dokuwiki
10if(!defined('DOKU_INC')) die();
11
12class admin_plugin_farmer_new extends DokuWiki_Admin_Plugin {
13
14    /** @var helper_plugin_farmer $helper */
15    protected $helper;
16
17    /**
18     * @return bool true if only access for superuser, false is for superusers and moderators
19     */
20    public function forAdminOnly() {
21        return true;
22    }
23
24    /**
25     * admin_plugin_farmer_new constructor.
26     */
27    public function __construct() {
28        $this->helper = plugin_load('helper', 'farmer');
29    }
30
31    /**
32     * Should carry out any processing required by the plugin.
33     */
34    public function handle() {
35        global $INPUT;
36        global $ID;
37        if(!$INPUT->has('farmer__submit')) return;
38
39        $data = $this->validateAnimalData();
40        if(!$data) return;
41        if($this->createNewAnimal($data['name'], $data['admin'], $data['pass'])){
42            msg($this->getLang('animal creation success'), 1);
43            $link = wl($ID, array('do'=>'admin', 'page'=>'farmer', 'sub'=>'new'), true, '&');
44            send_redirect($link);
45        }
46    }
47
48    /**
49     * Render HTML output, e.g. helpful text and a form
50     */
51    public function html() {
52
53        $form = new \dokuwiki\Form\Form();
54        $form->addClass('plugin_farmer')->id('farmer__create_animal_form');
55
56        $form->addFieldsetOpen($this->getLang('animal configuration'));
57        $form->addTextInput('animalname', $this->getLang('animal name'));
58        $form->addFieldsetClose();
59
60        $form->addFieldsetOpen($this->getLang('animal administrator'));
61        $form->addRadioButton('adminsetup', $this->getLang('importUsers'))->val('importUsers');
62        $form->addRadioButton('adminsetup', $this->getLang('currentAdmin'))->val('currentAdmin');
63        $form->addRadioButton('adminsetup', $this->getLang('newAdmin'))->val('newAdmin')->attr('checked', 'checked');
64        $form->addPasswordInput('adminPassword', $this->getLang('admin password'));
65        $form->addFieldsetClose();
66
67        $form->addButton('farmer__submit', $this->getLang('submit'))->attr('type', 'submit')->val('newAnimal');
68        echo $form->toHTML();
69
70        echo $this->locale_xhtml('tab_new_help');
71    }
72
73    /**
74     * Validate the data for a new animal
75     *
76     * @return array|bool false on errors, clean data otherwise
77     */
78    protected function validateAnimalData() {
79        global $INPUT;
80
81        $animalname = $INPUT->filter('trim')->str('animalname');
82        $adminsetup = $INPUT->str('adminsetup');
83        $adminpass = $INPUT->filter('trim')->str('adminPassword');
84
85        $errors = array();
86
87        if($animalname === '') {
88            $errors[] = $this->getLang('animalname_missing');
89        } elseif(!$this->helper->validateAnimalName($animalname)) {
90            $errors[] = $this->getLang('animalname_invalid');
91        }
92
93        if($adminsetup === 'newAdmin' && $adminpass === '') {
94            $errors[] = $this->getLang('adminPassword_empty');
95        }
96
97        if($animalname !== '' && file_exists(DOKU_FARMDIR . '/' . $animalname)) {
98            $errors[] = $this->getLang('animalname_preexisting');
99        }
100
101        if($errors) {
102            foreach($errors as $error) {
103                msg($error, -1);
104            }
105            return false;
106        }
107
108        return array(
109            'name' => $animalname,
110            'admin' => $adminsetup,
111            'pass' => $adminpass
112        );
113    }
114
115    /**
116     * Create a new animal
117     *
118     * @param string $name name/title of the animal, will be the directory name for htaccess setup
119     * @param string $adminSetup newAdmin, currentAdmin or importUsers
120     * @param string $adminPassword required if $adminSetup is newAdmin
121     * @return bool true if successful
122     */
123    protected function createNewAnimal($name, $adminSetup, $adminPassword) {
124        $animaldir = DOKU_FARMDIR . '/' . $name;
125
126        // copy basic template
127        $ok = $this->helper->io_copyDir(__DIR__ . '/../_animal', $animaldir);
128        if(!$ok) {
129            msg($this->getLang('animal creation error'), -1);
130            return false;
131        }
132
133        // append title to local config
134        $ok &= io_saveFile($animaldir.'/conf/local.php', "\n".'$conf[\'title\'] = \''.$name.'\';'."\n", true);
135
136        // fixme add logo
137
138        // create admin user
139        if($adminSetup === 'newAdmin') {
140            $users = "# <?php exit()?>\n".$this->makeAdminLine($adminPassword)."\n";
141        } elseif($adminSetup === 'currentAdmin') {
142            $users = "# <?php exit()?>\n".$this->getAdminLine()."\n";
143        } else {
144            $users = io_readFile(DOKU_CONF . 'users.auth.php');
145        }
146        $ok &= io_saveFile($animaldir . '/conf/users.auth.php', $users);
147
148        /* FIXME handle deactivated plugins
149        if($this->getConf('deactivated plugins') === '') {
150            $deactivatedPluginsList = array('farmer',);
151        } else {
152            $deactivatedPluginsList = explode(',', $this->getConf('deactivated plugins'));
153            array_push($deactivatedPluginsList, 'farmer');
154        }
155        foreach($deactivatedPluginsList as $plugin) {
156            $this->helper->deactivatePlugin(trim($plugin), $animal);
157        }
158        */
159
160        return $ok;
161    }
162
163    /**
164     * Creates a new user line
165     *
166     * @param $password
167     * @return string
168     */
169    protected function makeAdminLine($password) {
170        $pass = auth_cryptPassword($password);
171        $line = join("\t", array(
172            'admin',
173            $pass,
174            'Administrator',
175            'admin@example.org',
176            'admin,user'
177        ));
178        return $line;
179    }
180
181    /**
182     * Copies the current user as new admin line
183     *
184     * @return string
185     */
186    protected function getAdminLine() {
187        $currentAdmin = $_SERVER['REMOTE_USER'];
188        $masterUsers = file_get_contents(DOKU_CONF . 'users.auth.php');
189        $masterUsers = ltrim(strstr($masterUsers, "\n" . $currentAdmin . ":"));
190        $newAdmin = substr($masterUsers, 0, strpos($masterUsers, "\n") + 1);
191        return $newAdmin;
192    }
193
194
195}
196
197// vim:ts=4:sw=4:et:
198