]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - actions/siteadminpanel.php
Merge branch 'admin-sections/2' into 0.9.x
[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                                  'snapshot' => array('run', 'reporturl', 'frequency'));
96
97         static $booleans = array('site' => array('private'));
98
99         $values = array();
100
101         foreach ($settings as $section => $parts) {
102             foreach ($parts as $setting) {
103                 $values[$section][$setting] = $this->trimmed($setting);
104             }
105         }
106
107         foreach ($booleans as $section => $parts) {
108             foreach ($parts as $setting) {
109                 $values[$section][$setting] = ($this->boolean($setting)) ? 1 : 0;
110             }
111         }
112
113         // This throws an exception on validation errors
114
115         $this->validate($values);
116
117         // assert(all values are valid);
118
119         $config = new Config();
120
121         $config->query('BEGIN');
122
123         foreach ($settings as $section => $parts) {
124             foreach ($parts as $setting) {
125                 Config::save($section, $setting, $values[$section][$setting]);
126             }
127         }
128
129         foreach ($booleans as $section => $parts) {
130             foreach ($parts as $setting) {
131                 Config::save($section, $setting, $values[$section][$setting]);
132             }
133         }
134
135         $config->query('COMMIT');
136
137         return;
138     }
139
140     function validate(&$values)
141     {
142         // Validate site name
143
144         if (empty($values['site']['name'])) {
145             $this->clientError(_("Site name must have non-zero length."));
146         }
147
148         // Validate email
149
150         $values['site']['email'] = common_canonical_email($values['site']['email']);
151
152         if (empty($values['site']['email'])) {
153             $this->clientError(_('You must have a valid contact email address'));
154         }
155         if (!Validate::email($values['site']['email'], common_config('email', 'check_domain'))) {
156             $this->clientError(_('Not a valid email address'));
157         }
158
159         // Validate timezone
160
161         if (is_null($values['site']['timezone']) ||
162             !in_array($values['site']['timezone'], DateTimeZone::listIdentifiers())) {
163             $this->clientError(_('Timezone not selected.'));
164             return;
165         }
166
167         // Validate language
168
169         if (!is_null($values['site']['language']) &&
170             !in_array($values['site']['language'], array_keys(get_nice_language_list()))) {
171             $this->clientError(sprintf(_('Unknown language "%s"'), $values['site']['language']));
172         }
173
174         // Validate report URL
175
176         if (!is_null($values['snapshot']['reporturl']) &&
177             !Validate::uri($values['snapshot']['reporturl'], array('allowed_schemes' => array('http', 'https')))) {
178             $this->clientError(_("Invalid snapshot report URL."));
179         }
180
181         // Validate snapshot run value
182
183         if (!in_array($values['snapshot']['run'], array('web', 'cron', 'never'))) {
184             $this->clientError(_("Invalid snapshot run value."));
185         }
186
187         // Validate snapshot run value
188
189         if (!Validate::number($values['snapshot']['frequency'])) {
190             $this->clientError(_("Snapshot frequency must be a number."));
191         }
192
193     }
194 }
195
196 class SiteAdminPanelForm extends AdminForm
197 {
198     /**
199      * ID of the form
200      *
201      * @return int ID of the form
202      */
203
204     function id()
205     {
206         return 'form_site_admin_panel';
207     }
208
209     /**
210      * class of the form
211      *
212      * @return string class of the form
213      */
214
215     function formClass()
216     {
217         return 'form_settings';
218     }
219
220     /**
221      * Action of the form
222      *
223      * @return string URL of the action
224      */
225
226     function action()
227     {
228         return common_local_url('siteadminpanel');
229     }
230
231     /**
232      * Data elements of the form
233      *
234      * @return void
235      */
236
237     function formData()
238     {
239         $this->out->elementStart('ul', 'form_data');
240         $this->li();
241         $this->input('name', _('Site name'),
242                      _('The name of your site, like "Yourcompany Microblog"'));
243         $this->unli();
244         $this->li();
245         $this->input('broughtby', _('Brought by'),
246                      _('Text used for credits link in footer of each page'));
247         $this->unli();
248         $this->li();
249         $this->input('broughtbyurl', _('Brought by URL'),
250                      _('URL used for credits link in footer of each page'));
251         $this->unli();
252         $this->li();
253         $this->input('email', _('Email'),
254                      _('contact email address for your site'));
255
256         $this->unli();
257
258         $timezones = array();
259
260         foreach (DateTimeZone::listIdentifiers() as $k => $v) {
261             $timezones[$v] = $v;
262         }
263
264         asort($timezones);
265
266         $this->li();
267
268         $this->out->dropdown('timezone', _('Default timezone'),
269                              $timezones, _('Default timezone for the site; usually UTC.'),
270                              true, $this->value('timezone'));
271
272         $this->unli();
273         $this->li();
274
275         $this->out->dropdown('language', _('Language'),
276                              get_nice_language_list(), _('Default site language'),
277                              false, $this->value('language'));
278
279         $this->unli();
280         $this->li();
281
282         $this->out->checkbox('private', _('Private'),
283                              (bool) $this->value('private'),
284                              _('Prohibit anonymous users (not logged in) from viewing site?'));
285
286         $this->unli();
287
288         $this->li();
289
290         $snapshot = array('web' => _('Randomly during Web hit'),
291                           'cron' => _('In a scheduled job'),
292                           'never' => _('Never'));
293
294         $this->out->dropdown('run', _('Data snapshots'),
295                              $snapshot, _('When to send statistical data to status.net servers'),
296                              false, $this->value('run', 'snapshot'));
297
298         $this->unli();
299         $this->li();
300
301         $this->input('frequency', _('Frequency'),
302                      _('Snapshots will be sent once every N Web hits'),
303                      'snapshot');
304
305         $this->unli();
306
307         $this->li();
308
309         $this->input('reporturl', _('Report URL'),
310                      _('Snapshots will be sent to this URL'),
311                      'snapshot');
312
313         $this->unli();
314
315         $this->out->elementEnd('ul');
316     }
317
318     /**
319      * Action elements
320      *
321      * @return void
322      */
323
324     function formActions()
325     {
326         $this->out->submit('submit', _('Save'), 'submit', null, _('Save site settings'));
327     }
328 }