]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - actions/siteadminpanel.php
UI text fixes and tweaks.
[quix0rs-gnu-social.git] / actions / siteadminpanel.php
1 <?php
2 /**
3  * StatusNet, the distributed open-source microblogging tool
4  *
5  * Site administration panel
6  *
7  * PHP version 5
8  *
9  * LICENCE: This program is free software: you can redistribute it and/or modify
10  * it under the terms of the GNU Affero General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU Affero General Public License for more details.
18  *
19  * You should have received a copy of the GNU Affero General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  * @category  Settings
23  * @package   StatusNet
24  * @author    Evan Prodromou <evan@status.net>
25  * @author    Zach Copley <zach@status.net>
26  * @author    Sarven Capadisli <csarven@status.net>
27  * @copyright 2008-2009 StatusNet, Inc.
28  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
29  * @link      http://status.net/
30  */
31
32 if (!defined('STATUSNET')) {
33     exit(1);
34 }
35
36 /**
37  * Administer site settings
38  *
39  * @category Admin
40  * @package  StatusNet
41  * @author   Evan Prodromou <evan@status.net>
42  * @author   Zach Copley <zach@status.net>
43  * @author   Sarven Capadisli <csarven@status.net>
44  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
45  * @link     http://status.net/
46  */
47
48 class SiteadminpanelAction extends AdminPanelAction
49 {
50     /**
51      * Returns the page title
52      *
53      * @return string page title
54      */
55
56     function title()
57     {
58         return _('Site');
59     }
60
61     /**
62      * Instructions for using this form.
63      *
64      * @return string instructions
65      */
66
67     function getInstructions()
68     {
69         return _('Basic settings for this StatusNet site.');
70     }
71
72     /**
73      * Show the site admin panel form
74      *
75      * @return void
76      */
77
78     function showForm()
79     {
80         $form = new SiteAdminPanelForm($this);
81         $form->show();
82         return;
83     }
84
85     /**
86      * Save settings from the form
87      *
88      * @return void
89      */
90
91     function saveSettings()
92     {
93         static $settings = array('site' => array('name', 'broughtby', 'broughtbyurl',
94                                                  'email', 'timezone', 'language',
95                                                  'ssl', 'sslserver', 'site',
96                                                  'textlimit', 'dupelimit'),
97                                  'snapshot' => array('run', 'reporturl', 'frequency'));
98
99         static $booleans = array('site' => array('private', 'inviteonly', 'closed', 'fancy'));
100
101         $values = array();
102
103         foreach ($settings as $section => $parts) {
104             foreach ($parts as $setting) {
105                 $values[$section][$setting] = $this->trimmed($setting);
106             }
107         }
108
109         foreach ($booleans as $section => $parts) {
110             foreach ($parts as $setting) {
111                 $values[$section][$setting] = ($this->boolean($setting)) ? 1 : 0;
112             }
113         }
114
115         // This throws an exception on validation errors
116
117         $this->validate($values);
118
119         // assert(all values are valid);
120
121         $config = new Config();
122
123         $config->query('BEGIN');
124
125         foreach ($settings as $section => $parts) {
126             foreach ($parts as $setting) {
127                 Config::save($section, $setting, $values[$section][$setting]);
128             }
129         }
130
131         foreach ($booleans as $section => $parts) {
132             foreach ($parts as $setting) {
133                 Config::save($section, $setting, $values[$section][$setting]);
134             }
135         }
136
137         $config->query('COMMIT');
138
139         return;
140     }
141
142     function validate(&$values)
143     {
144         // Validate site name
145
146         if (empty($values['site']['name'])) {
147             $this->clientError(_("Site name must have non-zero length."));
148         }
149
150         // Validate email
151
152         $values['site']['email'] = common_canonical_email($values['site']['email']);
153
154         if (empty($values['site']['email'])) {
155             $this->clientError(_('You must have a valid contact email address'));
156         }
157         if (!Validate::email($values['site']['email'], common_config('email', 'check_domain'))) {
158             $this->clientError(_('Not a valid email address'));
159         }
160
161         // Validate timezone
162
163         if (is_null($values['site']['timezone']) ||
164             !in_array($values['site']['timezone'], DateTimeZone::listIdentifiers())) {
165             $this->clientError(_('Timezone not selected.'));
166             return;
167         }
168
169         // Validate language
170
171         if (!is_null($values['site']['language']) &&
172             !in_array($values['site']['language'], array_keys(get_nice_language_list()))) {
173             $this->clientError(sprintf(_('Unknown language "%s"'), $values['site']['language']));
174         }
175
176         // Validate report URL
177
178         if (!is_null($values['snapshot']['reporturl']) &&
179             !Validate::uri($values['snapshot']['reporturl'], array('allowed_schemes' => array('http', 'https')))) {
180             $this->clientError(_("Invalid snapshot report URL."));
181         }
182
183         // Validate snapshot run value
184
185         if (!in_array($values['snapshot']['run'], array('web', 'cron', 'never'))) {
186             $this->clientError(_("Invalid snapshot run value."));
187         }
188
189         // Validate snapshot run value
190
191         if (!Validate::number($values['snapshot']['frequency'])) {
192             $this->clientError(_("Snapshot frequency must be a number."));
193         }
194
195         // Validate SSL setup
196
197         if (in_array($values['site']['ssl'], array('sometimes', 'always'))) {
198             if (empty($values['site']['sslserver'])) {
199                 $this->clientError(_("You must set an SSL server when enabling SSL."));
200             }
201         }
202
203         if (mb_strlen($values['site']['sslserver']) > 255) {
204             $this->clientError(_("Invalid SSL server. The maximum length is 255 characters."));
205         }
206
207         // Validate text limit
208
209         if (!Validate::number($values['site']['textlimit'], array('min' => 140))) {
210             $this->clientError(_("Minimum text limit is 140 characters."));
211         }
212
213         // Validate dupe limit
214
215         if (!Validate::number($values['site']['dupelimit'], array('min' => 1))) {
216             $this->clientError(_("Dupe limit must 1 or more seconds."));
217         }
218
219     }
220 }
221
222 class SiteAdminPanelForm extends AdminForm
223 {
224     /**
225      * ID of the form
226      *
227      * @return int ID of the form
228      */
229
230     function id()
231     {
232         return 'form_site_admin_panel';
233     }
234
235     /**
236      * class of the form
237      *
238      * @return string class of the form
239      */
240
241     function formClass()
242     {
243         return 'form_settings';
244     }
245
246     /**
247      * Action of the form
248      *
249      * @return string URL of the action
250      */
251
252     function action()
253     {
254         return common_local_url('siteadminpanel');
255     }
256
257     /**
258      * Data elements of the form
259      *
260      * @return void
261      */
262
263     function formData()
264     {
265         $this->out->elementStart('fieldset', array('id' => 'settings_admin_general'));
266         $this->out->element('legend', null, _('General'));
267         $this->out->elementStart('ul', 'form_data');
268         $this->li();
269         $this->input('name', _('Site name'),
270                      _('The name of your site, like "Yourcompany Microblog"'));
271         $this->unli();
272
273         $this->li();
274         $this->input('broughtby', _('Brought by'),
275                      _('Text used for credits link in footer of each page'));
276         $this->unli();
277
278         $this->li();
279         $this->input('broughtbyurl', _('Brought by URL'),
280                      _('URL used for credits link in footer of each page'));
281         $this->unli();
282         $this->li();
283         $this->input('email', _('Email'),
284                      _('Contact email address for your site'));
285         $this->unli();
286         $this->out->elementEnd('ul');
287         $this->out->elementEnd('fieldset');
288
289         $this->out->elementStart('fieldset', array('id' => 'settings_admin_local'));
290         $this->out->element('legend', null, _('Local'));
291         $this->out->elementStart('ul', 'form_data');
292         $timezones = array();
293
294         foreach (DateTimeZone::listIdentifiers() as $k => $v) {
295             $timezones[$v] = $v;
296         }
297
298         asort($timezones);
299
300         $this->li();
301         $this->out->dropdown('timezone', _('Default timezone'),
302                              $timezones, _('Default timezone for the site; usually UTC.'),
303                              true, $this->value('timezone'));
304         $this->unli();
305
306         $this->li();
307         $this->out->dropdown('language', _('Language'),
308                              get_nice_language_list(), _('Default site language'),
309                              false, $this->value('language'));
310         $this->unli();
311
312         $this->out->elementEnd('ul');
313         $this->out->elementEnd('fieldset');
314
315         $this->out->elementStart('fieldset', array('id' => 'settings_admin_urls'));
316         $this->out->element('legend', null, _('URLs'));
317         $this->out->elementStart('ul', 'form_data');
318         $this->li();
319         $this->input('server', _('Server'), _('Site\'s server hostname.'));
320         $this->unli();
321
322         $this->li();
323         $this->out->checkbox('fancy', _('Fancy URLs'),
324                              (bool) $this->value('fancy'),
325                              _('Use fancy (more readable and memorable) URLs?'));
326         $this->unli();
327         $this->out->elementEnd('ul');
328         $this->out->elementEnd('fieldset');
329
330         $this->out->elementStart('fieldset', array('id' => 'settings_admin_access'));
331         $this->out->element('legend', null, _('Access'));
332         $this->out->elementStart('ul', 'form_data');
333         $this->li();
334         $this->out->checkbox('private', _('Private'),
335                              (bool) $this->value('private'),
336                              _('Prohibit anonymous users (not logged in) from viewing site?'));
337         $this->unli();
338
339         $this->li();
340         $this->out->checkbox('inviteonly', _('Invite only'),
341                              (bool) $this->value('inviteonly'),
342                              _('Make registration invitation only.'));
343         $this->unli();
344
345         $this->li();
346         $this->out->checkbox('closed', _('Closed'),
347                              (bool) $this->value('closed'),
348                              _('Disable new registrations.'));
349         $this->unli();
350         $this->out->elementEnd('ul');
351         $this->out->elementEnd('fieldset');
352
353         $this->out->elementStart('fieldset', array('id' => 'settings_admin_snapshots'));
354         $this->out->element('legend', null, _('Snapshots'));
355         $this->out->elementStart('ul', 'form_data');
356         $this->li();
357         $snapshot = array('web' => _('Randomly during Web hit'),
358                           'cron' => _('In a scheduled job'),
359                           'never' => _('Never'));
360         $this->out->dropdown('run', _('Data snapshots'),
361                              $snapshot, _('When to send statistical data to status.net servers'),
362                              false, $this->value('run', 'snapshot'));
363         $this->unli();
364
365         $this->li();
366         $this->input('frequency', _('Frequency'),
367                      _('Snapshots will be sent once every N web hits'),
368                      'snapshot');
369         $this->unli();
370
371         $this->li();
372         $this->input('reporturl', _('Report URL'),
373                      _('Snapshots will be sent to this URL'),
374                      'snapshot');
375         $this->unli();
376         $this->out->elementEnd('ul');
377         $this->out->elementEnd('fieldset');
378
379         $this->out->elementStart('fieldset', array('id' => 'settings_admin_ssl'));
380         $this->out->element('legend', null, _('SSL'));
381         $this->out->elementStart('ul', 'form_data');
382         $this->li();
383         $ssl = array('never' => _('Never'),
384                      'sometimes' => _('Sometimes'),
385                      'always' => _('Always'));
386
387         $this->out->dropdown('ssl', _('Use SSL'),
388                              $ssl, _('When to use SSL'),
389                              false, $this->value('ssl', 'site'));
390         $this->unli();
391
392         $this->li();
393         $this->input('sslserver', _('SSL Server'),
394                      _('Server to direct SSL requests to'));
395         $this->unli();
396         $this->out->elementEnd('ul');
397         $this->out->elementEnd('fieldset');
398
399         $this->out->elementStart('fieldset', array('id' => 'settings_admin_limits'));
400         $this->out->element('legend', null, _('Limits'));
401         $this->out->elementStart('ul', 'form_data');
402         $this->li();
403         $this->input('textlimit', _('Text limit'), _('Maximum number of characters for notices.'));
404         $this->unli();
405
406         $this->li();
407         $this->input('dupelimit', _('Dupe limit'), _('How long users must wait (in seconds) to post the same thing again.'));
408         $this->unli();
409         $this->out->elementEnd('ul');
410         $this->out->elementEnd('fieldset');
411     }
412
413     /**
414      * Action elements
415      *
416      * @return void
417      */
418
419     function formActions()
420     {
421         $this->out->submit('submit', _('Save'), 'submit', null, _('Save site settings'));
422     }
423 }