xref: /plugin/farmer/admin/new.php (revision 954c40ad15965c60e6a9a47948b3cd54d507ff25)
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            $url = $this->helper->getAnimalURL($data['name']);
43            $link = '<a href="'.$url.'">'.hsc($data['name']).'</a>';
44
45            msg(sprintf($this->getLang('animal creation success'), $link), 1);
46            $link = wl($ID, array('do'=>'admin', 'page'=>'farmer', 'sub'=>'new'), true, '&');
47            send_redirect($link);
48        }
49    }
50
51    /**
52     * Render HTML output, e.g. helpful text and a form
53     */
54    public function html() {
55
56        $form = new \dokuwiki\Form\Form();
57        $form->addClass('plugin_farmer')->id('farmer__create_animal_form');
58
59        $form->addFieldsetOpen($this->getLang('animal configuration'));
60        $form->addTextInput('animalname', $this->getLang('animal name'));
61        $form->addFieldsetClose();
62
63        $form->addFieldsetOpen($this->getLang('animal administrator'));
64        $form->addRadioButton('adminsetup', $this->getLang('importUsers'))->val('importUsers');
65        $form->addRadioButton('adminsetup', $this->getLang('currentAdmin'))->val('currentAdmin');
66        $form->addRadioButton('adminsetup', $this->getLang('newAdmin'))->val('newAdmin')->attr('checked', 'checked');
67        $form->addPasswordInput('adminPassword', $this->getLang('admin password'));
68        $form->addFieldsetClose();
69
70        $form->addButton('farmer__submit', $this->getLang('submit'))->attr('type', 'submit')->val('newAnimal');
71        echo $form->toHTML();
72    }
73
74    /**
75     * Validate the data for a new animal
76     *
77     * @return array|bool false on errors, clean data otherwise
78     */
79    protected function validateAnimalData() {
80        global $INPUT;
81
82        $animalname = $INPUT->filter('trim')->str('animalname');
83        $adminsetup = $INPUT->str('adminsetup');
84        $adminpass = $INPUT->filter('trim')->str('adminPassword');
85
86        $errors = array();
87
88        if($animalname === '') {
89            $errors[] = $this->getLang('animalname_missing');
90        } elseif(!$this->helper->validateAnimalName($animalname)) {
91            $errors[] = $this->getLang('animalname_invalid');
92        }
93
94        if($adminsetup === 'newAdmin' && $adminpass === '') {
95            $errors[] = $this->getLang('adminPassword_empty');
96        }
97
98        if($animalname !== '' && file_exists(DOKU_FARMDIR . '/' . $animalname)) {
99            $errors[] = $this->getLang('animalname_preexisting');
100        }
101
102        if($errors) {
103            foreach($errors as $error) {
104                msg($error, -1);
105            }
106            return false;
107        }
108
109        return array(
110            'name' => $animalname,
111            'admin' => $adminsetup,
112            'pass' => $adminpass
113        );
114    }
115
116    /**
117     * Create a new animal
118     *
119     * @param string $name name/title of the animal, will be the directory name for htaccess setup
120     * @param string $adminSetup newAdmin, currentAdmin or importUsers
121     * @param string $adminPassword required if $adminSetup is newAdmin
122     * @return bool true if successful
123     */
124    protected function createNewAnimal($name, $adminSetup, $adminPassword) {
125        $animaldir = DOKU_FARMDIR . '/' . $name;
126
127        // copy basic template
128        $ok = $this->helper->io_copyDir(__DIR__ . '/../_animal', $animaldir);
129        if(!$ok) {
130            msg($this->getLang('animal creation error'), -1);
131            return false;
132        }
133
134        // append title to local config
135        $ok &= io_saveFile($animaldir.'/conf/local.php', "\n".'$conf[\'title\'] = \''.$name.'\';'."\n", true);
136
137        // create a random logo and favicon
138        if(!class_exists('\splitbrain\RingIcon\RingIcon', false)) {
139            require(__DIR__ . '/../3rdparty/RingIcon.php');
140        }
141        if(!class_exists('\chrisbliss18\phpico\PHPIco', false)) {
142            require(__DIR__ . '/../3rdparty/PHPIco.php');
143        }
144        try {
145            $ringicon = new \splitbrain\RingIcon\RingIcon(64);
146            $ringicon->createImage($animaldir, $animaldir . '/data/media/wiki/logo.png');
147            $icongen = new \chrisbliss18\phpico\PHPIco($animaldir . '/data/media/wiki/logo.png');
148            $icongen->save_ico($animaldir . '/data/media/wiki/favicon.ico');
149        } catch(\Exception $ignore) {
150            // something went wrong, but we don't care. this is a nice to have feature only
151        }
152
153        // create admin user
154        if($adminSetup === 'newAdmin') {
155            $users = "# <?php exit()?>\n".$this->makeAdminLine($adminPassword)."\n";
156        } elseif($adminSetup === 'currentAdmin') {
157            $users = "# <?php exit()?>\n".$this->getAdminLine()."\n";
158        } else {
159            $users = io_readFile(DOKU_CONF . 'users.auth.php');
160        }
161        $ok &= io_saveFile($animaldir . '/conf/users.auth.php', $users);
162
163        /* FIXME handle deactivated plugins
164        if($this->getConf('deactivated plugins') === '') {
165            $deactivatedPluginsList = array('farmer',);
166        } else {
167            $deactivatedPluginsList = explode(',', $this->getConf('deactivated plugins'));
168            array_push($deactivatedPluginsList, 'farmer');
169        }
170        foreach($deactivatedPluginsList as $plugin) {
171            $this->helper->deactivatePlugin(trim($plugin), $animal);
172        }
173        */
174
175        return $ok;
176    }
177
178    /**
179     * Creates a new user line
180     *
181     * @param $password
182     * @return string
183     */
184    protected function makeAdminLine($password) {
185        $pass = auth_cryptPassword($password);
186        $line = join("\t", array(
187            'admin',
188            $pass,
189            'Administrator',
190            'admin@example.org',
191            'admin,user'
192        ));
193        return $line;
194    }
195
196    /**
197     * Copies the current user as new admin line
198     *
199     * @return string
200     */
201    protected function getAdminLine() {
202        $currentAdmin = $_SERVER['REMOTE_USER'];
203        $masterUsers = file_get_contents(DOKU_CONF . 'users.auth.php');
204        $masterUsers = ltrim(strstr($masterUsers, "\n" . $currentAdmin . ":"));
205        $newAdmin = substr($masterUsers, 0, strpos($masterUsers, "\n") + 1);
206        return $newAdmin;
207    }
208
209
210}
211
212// vim:ts=4:sw=4:et:
213