]> git.mxchange.org Git - friendica.git/blob - mod/settings.php
Revert some more unwarranted formatting
[friendica.git] / mod / settings.php
1 <?php
2
3 require_once 'include/group.php';
4 require_once 'include/socgraph.php';
5
6 function get_theme_config_file($theme)
7 {
8         $a = get_app();
9         $base_theme = $a->theme_info['extends'];
10
11         if (file_exists("view/theme/$theme/config.php")) {
12                 return "view/theme/$theme/config.php";
13         }
14         if (file_exists("view/theme/$base_theme/config.php")) {
15                 return "view/theme/$base_theme/config.php";
16         }
17
18         return null;
19 }
20
21 function settings_init(&$a)
22 {
23         if (!local_user()) {
24                 notice(t('Permission denied.').EOL);
25
26                 return;
27         }
28
29         // APC deactivated, since there are problems with PHP 5.5
30         //if (function_exists("apc_delete")) {
31         //      $toDelete = new APCIterator('user', APC_ITER_VALUE);
32         //      apc_delete($toDelete);
33         //}
34
35         // These lines provide the javascript needed by the acl selector
36
37         $tpl = get_markup_template('settings-head.tpl');
38         $a->page['htmlhead'] .= replace_macros($tpl, array(
39                 '$ispublic' => t('everybody'),
40         ));
41
42         $tabs = array(
43                 array(
44                         'label' => t('Account'),
45                         'url' => 'settings',
46                         'selected' => (($a->argc == 1) && ($a->argv[0] === 'settings') ? 'active' : ''),
47                         'accesskey' => 'o',
48                 ),
49         );
50
51         if (get_features()) {
52                 $tabs[] = array(
53                         'label' => t('Additional features'),
54                         'url' => 'settings/features',
55                         'selected' => (($a->argc > 1) && ($a->argv[1] === 'features') ? 'active' : ''),
56                         'accesskey' => 't',
57                 );
58         }
59
60         $tabs[] = array(
61                 'label' => t('Display'),
62                 'url' => 'settings/display',
63                 'selected' => (($a->argc > 1) && ($a->argv[1] === 'display') ? 'active' : ''),
64                 'accesskey' => 'i',
65         );
66
67         $tabs[] = array(
68                 'label' => t('Social Networks'),
69                 'url' => 'settings/connectors',
70                 'selected' => (($a->argc > 1) && ($a->argv[1] === 'connectors') ? 'active' : ''),
71                 'accesskey' => 'w',
72         );
73
74         $tabs[] = array(
75                 'label' => t('Plugins'),
76                 'url' => 'settings/addon',
77                 'selected' => (($a->argc > 1) && ($a->argv[1] === 'addon') ? 'active' : ''),
78                 'accesskey' => 'l',
79         );
80
81         $tabs[] = array(
82                 'label' => t('Delegations'),
83                 'url' => 'delegate',
84                 'selected' => (($a->argc == 1) && ($a->argv[0] === 'delegate') ? 'active' : ''),
85                 'accesskey' => 'd',
86         );
87
88         $tabs[] = array(
89                 'label' => t('Connected apps'),
90                 'url' => 'settings/oauth',
91                 'selected' => (($a->argc > 1) && ($a->argv[1] === 'oauth') ? 'active' : ''),
92                 'accesskey' => 'b',
93         );
94
95         $tabs[] = array(
96                 'label' => t('Export personal data'),
97                 'url' => 'uexport',
98                 'selected' => (($a->argc == 1) && ($a->argv[0] === 'uexport') ? 'active' : ''),
99                 'accesskey' => 'e',
100         );
101
102         $tabs[] = array(
103                 'label' => t('Remove account'),
104                 'url' => 'removeme',
105                 'selected' => (($a->argc == 1) && ($a->argv[0] === 'removeme') ? 'active' : ''),
106                 'accesskey' => 'r',
107         );
108
109         $tabtpl = get_markup_template('generic_links_widget.tpl');
110         $a->page['aside'] = replace_macros($tabtpl, array(
111                 '$title' => t('Settings'),
112                 '$class' => 'settings-widget',
113                 '$items' => $tabs,
114         ));
115 }
116
117 function settings_post(&$a)
118 {
119         if (!local_user()) {
120                 return;
121         }
122
123         if (x($_SESSION, 'submanage') && intval($_SESSION['submanage'])) {
124                 return;
125         }
126
127         if (count($a->user) && x($a->user, 'uid') && $a->user['uid'] != local_user()) {
128                 notice(t('Permission denied.').EOL);
129
130                 return;
131         }
132
133         $old_page_flags = $a->user['page-flags'];
134
135         if (($a->argc > 1) && ($a->argv[1] === 'oauth') && x($_POST, 'remove')) {
136                 check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
137
138                 $key = $_POST['remove'];
139                 q("DELETE FROM tokens WHERE id='%s' AND uid=%d",
140                         dbesc($key),
141                         local_user());
142                 goaway($a->get_baseurl(true).'/settings/oauth/');
143
144                 return;
145         }
146
147         if (($a->argc > 2) && ($a->argv[1] === 'oauth') && ($a->argv[2] === 'edit' || ($a->argv[2] === 'add')) && x($_POST, 'submit')) {
148                 check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
149
150                 $name = ((x($_POST, 'name')) ? $_POST['name'] : '');
151                 $key = ((x($_POST, 'key')) ? $_POST['key'] : '');
152                 $secret = ((x($_POST, 'secret')) ? $_POST['secret'] : '');
153                 $redirect = ((x($_POST, 'redirect')) ? $_POST['redirect'] : '');
154                 $icon = ((x($_POST, 'icon')) ? $_POST['icon'] : '');
155                 if ($name == '' || $key == '' || $secret == '') {
156                         notice(t('Missing some important data!'));
157                 } else {
158                         if ($_POST['submit'] == t('Update')) {
159                                 $r = q("UPDATE clients SET
160                                                         client_id='%s',
161                                                         pw='%s',
162                                                         name='%s',
163                                                         redirect_uri='%s',
164                                                         icon='%s',
165                                                         uid=%d
166                                                 WHERE client_id='%s'",
167                                                 dbesc($key),
168                                                 dbesc($secret),
169                                                 dbesc($name),
170                                                 dbesc($redirect),
171                                                 dbesc($icon),
172                                                 local_user(),
173                                                 dbesc($key));
174                         } else {
175                                 $r = q("INSERT INTO clients
176                                                         (client_id, pw, name, redirect_uri, icon, uid)
177                                                 VALUES ('%s','%s','%s','%s','%s',%d)",
178                                                 dbesc($key),
179                                                 dbesc($secret),
180                                                 dbesc($name),
181                                                 dbesc($redirect),
182                                                 dbesc($icon),
183                                                 local_user());
184                         }
185                 }
186                 goaway($a->get_baseurl(true).'/settings/oauth/');
187
188                 return;
189         }
190
191         if (($a->argc > 1) && ($a->argv[1] == 'addon')) {
192                 check_form_security_token_redirectOnErr('/settings/addon', 'settings_addon');
193
194                 call_hooks('plugin_settings_post', $_POST);
195
196                 return;
197         }
198
199         if (($a->argc > 1) && ($a->argv[1] == 'connectors')) {
200                 check_form_security_token_redirectOnErr('/settings/connectors', 'settings_connectors');
201
202                 if (x($_POST, 'general-submit')) {
203                         set_pconfig(local_user(), 'system', 'no_intelligent_shortening', intval($_POST['no_intelligent_shortening']));
204                         set_pconfig(local_user(), 'system', 'ostatus_autofriend', intval($_POST['snautofollow']));
205                         set_pconfig(local_user(), 'ostatus', 'default_group', $_POST['group-selection']);
206                         set_pconfig(local_user(), 'ostatus', 'legacy_contact', $_POST['legacy_contact']);
207                 } elseif (x($_POST, 'imap-submit')) {
208                         $mail_server = ((x($_POST, 'mail_server')) ? $_POST['mail_server'] : '');
209                         $mail_port = ((x($_POST, 'mail_port')) ? $_POST['mail_port'] : '');
210                         $mail_ssl = ((x($_POST, 'mail_ssl')) ? strtolower(trim($_POST['mail_ssl'])) : '');
211                         $mail_user = ((x($_POST, 'mail_user')) ? $_POST['mail_user'] : '');
212                         $mail_pass = ((x($_POST, 'mail_pass')) ? trim($_POST['mail_pass']) : '');
213                         $mail_action = ((x($_POST, 'mail_action')) ? trim($_POST['mail_action']) : '');
214                         $mail_movetofolder = ((x($_POST, 'mail_movetofolder')) ? trim($_POST['mail_movetofolder']) : '');
215                         $mail_replyto = ((x($_POST, 'mail_replyto')) ? $_POST['mail_replyto'] : '');
216                         $mail_pubmail = ((x($_POST, 'mail_pubmail')) ? $_POST['mail_pubmail'] : '');
217
218                         $mail_disabled = ((function_exists('imap_open') && (!get_config('system', 'imap_disabled'))) ? 0 : 1);
219                         if (get_config('system', 'dfrn_only')) {
220                                 $mail_disabled = 1;
221                         }
222
223                         if (!$mail_disabled) {
224                                 $failed = false;
225                                 $r = q('SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1',
226                                         intval(local_user())
227                                 );
228                                 if (!count($r)) {
229                                         q('INSERT INTO `mailacct` (`uid`) VALUES (%d)',
230                                                 intval(local_user())
231                                         );
232                                 }
233                                 if (strlen($mail_pass)) {
234                                         $pass = '';
235                                         openssl_public_encrypt($mail_pass, $pass, $a->user['pubkey']);
236                                         q("UPDATE `mailacct` SET `pass` = '%s' WHERE `uid` = %d",
237                                                 dbesc(bin2hex($pass)),
238                                                 intval(local_user())
239                                         );
240                                 }
241                                 $r = q("UPDATE `mailacct` SET `server` = '%s', `port` = %d, `ssltype` = '%s', `user` = '%s',
242                                         `action` = %d, `movetofolder` = '%s',
243                                         `mailbox` = 'INBOX', `reply_to` = '%s', `pubmail` = %d WHERE `uid` = %d",
244                                         dbesc($mail_server),
245                                         intval($mail_port),
246                                         dbesc($mail_ssl),
247                                         dbesc($mail_user),
248                                         intval($mail_action),
249                                         dbesc($mail_movetofolder),
250                                         dbesc($mail_replyto),
251                                         intval($mail_pubmail),
252                                         intval(local_user())
253                                 );
254                                 logger('mail: updating mailaccount. Response: '.print_r($r, true));
255                                 $r = q('SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1',
256                                         intval(local_user())
257                                 );
258                                 if (count($r)) {
259                                         $eacct = $r[0];
260                                         require_once 'include/email.php';
261                                         $mb = construct_mailbox_name($eacct);
262                                         if (strlen($eacct['server'])) {
263                                                 $dcrpass = '';
264                                                 openssl_private_decrypt(hex2bin($eacct['pass']), $dcrpass, $a->user['prvkey']);
265                                                 $mbox = email_connect($mb, $mail_user, $dcrpass);
266                                                 unset($dcrpass);
267                                                 if (!$mbox) {
268                                                         $failed = true;
269                                                         notice(t('Failed to connect with email account using the settings provided.').EOL);
270                                                 }
271                                         }
272                                 }
273                                 if (!$failed) {
274                                         info(t('Email settings updated.').EOL);
275                                 }
276                         }
277                 }
278
279                 call_hooks('connector_settings_post', $_POST);
280
281                 return;
282         }
283
284         if (($a->argc > 1) && ($a->argv[1] === 'features')) {
285                 check_form_security_token_redirectOnErr('/settings/features', 'settings_features');
286                 foreach ($_POST as $k => $v) {
287                         if (strpos($k, 'feature_') === 0) {
288                                 set_pconfig(local_user(), 'feature', substr($k, 8), ((intval($v)) ? 1 : 0));
289                         }
290                 }
291                 info(t('Features updated').EOL);
292
293                 return;
294         }
295
296         if (($a->argc > 1) && ($a->argv[1] === 'display')) {
297                 check_form_security_token_redirectOnErr('/settings/display', 'settings_display');
298
299                 $theme = ((x($_POST, 'theme')) ? notags(trim($_POST['theme'])) : $a->user['theme']);
300                 $mobile_theme = ((x($_POST, 'mobile_theme')) ? notags(trim($_POST['mobile_theme'])) : '');
301                 $nosmile = ((x($_POST, 'nosmile')) ? intval($_POST['nosmile']) : 0);
302                 $first_day_of_week = ((x($_POST, 'first_day_of_week')) ? intval($_POST['first_day_of_week']) : 0);
303                 $noinfo = ((x($_POST, 'noinfo')) ? intval($_POST['noinfo']) : 0);
304                 $infinite_scroll = ((x($_POST, 'infinite_scroll')) ? intval($_POST['infinite_scroll']) : 0);
305                 $no_auto_update = ((x($_POST, 'no_auto_update')) ? intval($_POST['no_auto_update']) : 0);
306                 $browser_update = ((x($_POST, 'browser_update')) ? intval($_POST['browser_update']) : 0);
307                 $bandwidth_saver = ((x($_POST, 'bandwidth_saver')) ? intval($_POST['bandwidth_saver']) : 0);
308                 if ($browser_update != -1) {
309                         $browser_update = $browser_update * 1000;
310                         if ($browser_update < 10000) {
311                                 $browser_update = 10000;
312                         }
313                 }
314
315                 $itemspage_network = ((x($_POST, 'itemspage_network')) ? intval($_POST['itemspage_network']) : 40);
316                 if ($itemspage_network > 100) {
317                         $itemspage_network = 100;
318                 }
319                 $itemspage_mobile_network = ((x($_POST, 'itemspage_mobile_network')) ? intval($_POST['itemspage_mobile_network']) : 20);
320                 if ($itemspage_mobile_network > 100) {
321                         $itemspage_mobile_network = 100;
322                 }
323
324                 if ($mobile_theme !== '') {
325                         set_pconfig(local_user(), 'system', 'mobile_theme', $mobile_theme);
326                 }
327
328                 set_pconfig(local_user(), 'system', 'update_interval', $browser_update);
329                 set_pconfig(local_user(), 'system', 'itemspage_network', $itemspage_network);
330                 set_pconfig(local_user(), 'system', 'itemspage_mobile_network', $itemspage_mobile_network);
331                 set_pconfig(local_user(), 'system', 'no_smilies', $nosmile);
332                 set_pconfig(local_user(), 'system', 'first_day_of_week', $first_day_of_week);
333                 set_pconfig(local_user(), 'system', 'ignore_info', $noinfo);
334                 set_pconfig(local_user(), 'system', 'infinite_scroll', $infinite_scroll);
335                 set_pconfig(local_user(), 'system', 'no_auto_update', $no_auto_update);
336                 set_pconfig(local_user(), 'system', 'bandwidth_saver', $bandwidth_saver);
337
338                 if ($theme == $a->user['theme']) {
339                         // call theme_post only if theme has not been changed
340                         if (($themeconfigfile = get_theme_config_file($theme)) != null) {
341                                 require_once $themeconfigfile;
342                                 theme_post($a);
343                         }
344                 }
345
346                 $r = q("UPDATE `user` SET `theme` = '%s' WHERE `uid` = %d",
347                                 dbesc($theme),
348                                 intval(local_user())
349                 );
350
351                 call_hooks('display_settings_post', $_POST);
352                 goaway('settings/display');
353
354                 return; // NOTREACHED
355         }
356
357         check_form_security_token_redirectOnErr('/settings', 'settings');
358
359         if (x($_POST, 'resend_relocate')) {
360                 proc_run(PRIORITY_HIGH, 'include/notifier.php', 'relocate', local_user());
361                 info(t('Relocate message has been send to your contacts'));
362                 goaway('settings');
363         }
364
365         call_hooks('settings_post', $_POST);
366
367         if ((x($_POST, 'password')) || (x($_POST, 'confirm'))) {
368                 $newpass = $_POST['password'];
369                 $confirm = $_POST['confirm'];
370                 $oldpass = hash('whirlpool', $_POST['opassword']);
371
372                 $err = false;
373                 if ($newpass != $confirm) {
374                         notice(t('Passwords do not match. Password unchanged.').EOL);
375                         $err = true;
376                 }
377
378                 if ((!x($newpass)) || (!x($confirm))) {
379                         notice(t('Empty passwords are not allowed. Password unchanged.').EOL);
380                         $err = true;
381                 }
382
383                 //  check if the old password was supplied correctly before
384                 //  changing it to the new value
385                 $r = q('SELECT `password` FROM `user`WHERE `uid` = %d LIMIT 1', intval(local_user()));
386                 if ($oldpass != $r[0]['password']) {
387                         notice(t('Wrong password.').EOL);
388                         $err = true;
389                 }
390
391                 if (!$err) {
392                         $password = hash('whirlpool', $newpass);
393                         $r = q("UPDATE `user` SET `password` = '%s' WHERE `uid` = %d",
394                                 dbesc($password),
395                                 intval(local_user())
396                         );
397                         if ($r) {
398                                 info(t('Password changed.').EOL);
399                         } else {
400                                 notice(t('Password update failed. Please try again.').EOL);
401                         }
402                 }
403         }
404
405
406         $username                = ((x($_POST,'username'))   ? notags(trim($_POST['username']))  : '');
407         $email                  = ((x($_POST,'email'))    ? notags(trim($_POST['email']))               : '');
408         $timezone                = ((x($_POST,'timezone'))   ? notags(trim($_POST['timezone']))  : '');
409         $language                = ((x($_POST,'language'))   ? notags(trim($_POST['language']))  : '');
410
411         $defloc            = ((x($_POST,'defloc'))       ? notags(trim($_POST['defloc']))          : '');
412         $openid            = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url']))   : '');
413         $maxreq            = ((x($_POST,'maxreq'))       ? intval($_POST['maxreq'])                      : 0);
414         $expire            = ((x($_POST,'expire'))       ? intval($_POST['expire'])                      : 0);
415         $def_gid                  = ((x($_POST,'group-selection')) ? intval($_POST['group-selection']) : 0);
416
417
418         $expire_items    = ((x($_POST,'expire_items')) ? intval($_POST['expire_items'])  : 0);
419         $expire_notes    = ((x($_POST,'expire_notes')) ? intval($_POST['expire_notes'])  : 0);
420         $expire_starred   = ((x($_POST,'expire_starred')) ? intval($_POST['expire_starred']) : 0);
421         $expire_photos  = ((x($_POST,'expire_photos'))? intval($_POST['expire_photos'])  : 0);
422         $expire_network_only    = ((x($_POST,'expire_network_only'))? intval($_POST['expire_network_only'])      : 0);
423
424         $allow_location   = (((x($_POST,'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0);
425         $publish                  = (((x($_POST,'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0);
426         $net_publish      = (((x($_POST,'profile_in_netdirectory')) && (intval($_POST['profile_in_netdirectory']) == 1)) ? 1: 0);
427         $old_visibility   = (((x($_POST,'visibility')) && (intval($_POST['visibility']) == 1)) ? 1 : 0);
428         $account_type    = (((x($_POST,'account-type')) && (intval($_POST['account-type']))) ? intval($_POST['account-type']) : 0);
429         $page_flags        = (((x($_POST,'page-flags')) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0);
430         $blockwall              = (((x($_POST,'blockwall')) && (intval($_POST['blockwall']) == 1)) ? 0: 1); // this setting is inverted!
431         $blocktags              = (((x($_POST,'blocktags')) && (intval($_POST['blocktags']) == 1)) ? 0: 1); // this setting is inverted!
432         $unkmail                  = (((x($_POST,'unkmail')) && (intval($_POST['unkmail']) == 1)) ? 1: 0);
433         $cntunkmail        = ((x($_POST,'cntunkmail')) ? intval($_POST['cntunkmail']) : 0);
434         $suggestme              = ((x($_POST,'suggestme')) ? intval($_POST['suggestme'])  : 0);
435         $hide_friends    = (($_POST['hide-friends'] == 1) ? 1: 0);
436         $hidewall                = (($_POST['hidewall'] == 1) ? 1: 0);
437         $post_newfriend   = (($_POST['post_newfriend'] == 1) ? 1: 0);
438         $post_joingroup   = (($_POST['post_joingroup'] == 1) ? 1: 0);
439         $post_profilechange   = (($_POST['post_profilechange'] == 1) ? 1: 0);
440
441         $email_textonly   = (($_POST['email_textonly'] == 1) ? 1 : 0);
442
443         $notify = 0;
444
445         if (x($_POST, 'notify1')) {
446                 $notify += intval($_POST['notify1']);
447         }
448         if (x($_POST, 'notify2')) {
449                 $notify += intval($_POST['notify2']);
450         }
451         if (x($_POST, 'notify3')) {
452                 $notify += intval($_POST['notify3']);
453         }
454         if (x($_POST, 'notify4')) {
455                 $notify += intval($_POST['notify4']);
456         }
457         if (x($_POST, 'notify5')) {
458                 $notify += intval($_POST['notify5']);
459         }
460         if (x($_POST, 'notify6')) {
461                 $notify += intval($_POST['notify6']);
462         }
463         if (x($_POST, 'notify7')) {
464                 $notify += intval($_POST['notify7']);
465         }
466         if (x($_POST, 'notify8')) {
467                 $notify += intval($_POST['notify8']);
468         }
469
470         // Adjust the page flag if the account type doesn't fit to the page flag.
471         if (($account_type == ACCOUNT_TYPE_PERSON) && !in_array($page_flags, array(PAGE_NORMAL, PAGE_SOAPBOX, PAGE_FREELOVE))) {
472                 $page_flags = PAGE_NORMAL;
473         } elseif (($account_type == ACCOUNT_TYPE_ORGANISATION) && !in_array($page_flags, array(PAGE_SOAPBOX))) {
474                 $page_flags = PAGE_SOAPBOX;
475         } elseif (($account_type == ACCOUNT_TYPE_NEWS) && !in_array($page_flags, array(PAGE_SOAPBOX))) {
476                 $page_flags = PAGE_SOAPBOX;
477         } elseif (($account_type == ACCOUNT_TYPE_COMMUNITY) && !in_array($page_flags, array(PAGE_COMMUNITY, PAGE_PRVGROUP))) {
478                 $page_flags = PAGE_COMMUNITY;
479         }
480
481         $email_changed = false;
482
483         $err = '';
484
485         $name_change = false;
486
487         if ($username != $a->user['username']) {
488                 $name_change = true;
489                 if (strlen($username) > 40) {
490                         $err .= t(' Please use a shorter name.');
491                 }
492                 if (strlen($username) < 3) {
493                         $err .= t(' Name too short.');
494                 }
495         }
496
497         if ($email != $a->user['email']) {
498                 $email_changed = true;
499                 //  check for the correct password
500                 $r = q('SELECT `password` FROM `user`WHERE `uid` = %d LIMIT 1', intval(local_user()));
501                 $password = hash('whirlpool', $_POST['mpassword']);
502                 if ($password != $r[0]['password']) {
503                         $err .= t('Wrong Password').EOL;
504                         $email = $a->user['email'];
505                 }
506                 //  check the email is valid
507                 if (!valid_email($email)) {
508                         $err .= t(' Not valid email.');
509                 }
510                 //  ensure new email is not the admin mail
511                 //if((x($a->config,'admin_email')) && (strcasecmp($email,$a->config['admin_email']) == 0)) {
512                 if (x($a->config, 'admin_email')) {
513                         $adminlist = explode(',', str_replace(' ', '', strtolower($a->config['admin_email'])));
514                         if (in_array(strtolower($email), $adminlist)) {
515                                 $err .= t(' Cannot change to that email.');
516                                 $email = $a->user['email'];
517                         }
518                 }
519         }
520
521         if (strlen($err)) {
522                 notice($err.EOL);
523
524                 return;
525         }
526
527         if ($timezone != $a->user['timezone']) {
528                 if (strlen($timezone)) {
529                         date_default_timezone_set($timezone);
530                 }
531         }
532
533         $str_group_allow = perms2str($_POST['group_allow']);
534         $str_contact_allow = perms2str($_POST['contact_allow']);
535         $str_group_deny = perms2str($_POST['group_deny']);
536         $str_contact_deny = perms2str($_POST['contact_deny']);
537
538         $openidserver = $a->user['openidserver'];
539         //$openid = normalise_openid($openid);
540
541         // If openid has changed or if there's an openid but no openidserver, try and discover it.
542
543         if ($openid != $a->user['openid'] || (strlen($openid) && (!strlen($openidserver)))) {
544                 $tmp_str = $openid;
545                 if (strlen($tmp_str) && validate_url($tmp_str)) {
546                         logger('updating openidserver');
547                         require_once 'library/openid.php';
548                         $open_id_obj = new LightOpenID();
549                         $open_id_obj->identity = $openid;
550                         $openidserver = $open_id_obj->discover($open_id_obj->identity);
551                 } else {
552                         $openidserver = '';
553                 }
554         }
555
556         set_pconfig(local_user(), 'expire', 'items', $expire_items);
557         set_pconfig(local_user(), 'expire', 'notes', $expire_notes);
558         set_pconfig(local_user(), 'expire', 'starred', $expire_starred);
559         set_pconfig(local_user(), 'expire', 'photos', $expire_photos);
560         set_pconfig(local_user(), 'expire', 'network_only', $expire_network_only);
561
562         set_pconfig(local_user(), 'system', 'suggestme', $suggestme);
563         set_pconfig(local_user(), 'system', 'post_newfriend', $post_newfriend);
564         set_pconfig(local_user(), 'system', 'post_joingroup', $post_joingroup);
565         set_pconfig(local_user(), 'system', 'post_profilechange', $post_profilechange);
566
567         set_pconfig(local_user(), 'system', 'email_textonly', $email_textonly);
568
569         if ($page_flags == PAGE_PRVGROUP) {
570                 $hidewall = 1;
571                 if ((!$str_contact_allow) && (!$str_group_allow) && (!$str_contact_deny) && (!$str_group_deny)) {
572                         if ($def_gid) {
573                                 info(t('Private forum has no privacy permissions. Using default privacy group.').EOL);
574                                 $str_group_allow = '<'.$def_gid.'>';
575                         } else {
576                                 notice(t('Private forum has no privacy permissions and no default privacy group.').EOL);
577                         }
578                 }
579         }
580
581         $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s',
582                                 `openid` = '%s', `timezone` = '%s',
583                                 `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s',
584                                 `notify-flags` = %d, `page-flags` = %d, `account-type` = %d, `default-location` = '%s',
585                                 `allow_location` = %d, `maxreq` = %d, `expire` = %d, `openidserver` = '%s',
586                                 `def_gid` = %d, `blockwall` = %d, `hidewall` = %d, `blocktags` = %d,
587                                 `unkmail` = %d, `cntunkmail` = %d, `language` = '%s'
588                         WHERE `uid` = %d",
589                         dbesc($username),
590                         dbesc($email),
591                         dbesc($openid),
592                         dbesc($timezone),
593                         dbesc($str_contact_allow),
594                         dbesc($str_group_allow),
595                         dbesc($str_contact_deny),
596                         dbesc($str_group_deny),
597                         intval($notify),
598                         intval($page_flags),
599                         intval($account_type),
600                         dbesc($defloc),
601                         intval($allow_location),
602                         intval($maxreq),
603                         intval($expire),
604                         dbesc($openidserver),
605                         intval($def_gid),
606                         intval($blockwall),
607                         intval($hidewall),
608                         intval($blocktags),
609                         intval($unkmail),
610                         intval($cntunkmail),
611                         dbesc($language),
612                         intval(local_user())
613         );
614         if ($r) {
615                 info(t('Settings updated.').EOL);
616         }
617
618         // clear session language
619         unset($_SESSION['language']);
620
621         $r = q("UPDATE `profile`
622                 SET `publish` = %d,
623                 `name` = '%s',
624                 `net-publish` = %d,
625                 `hide-friends` = %d
626                 WHERE `is-default` = 1 AND `uid` = %d",
627                 intval($publish),
628                 dbesc($username),
629                 intval($net_publish),
630                 intval($hide_friends),
631                 intval(local_user())
632         );
633
634         if ($name_change) {
635                 q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `self`",
636                         dbesc($username),
637                         dbesc(datetime_convert()),
638                         intval(local_user())
639                 );
640         }
641
642         if (($old_visibility != $net_publish) || ($page_flags != $old_page_flags)) {
643                 // Update global directory in background
644                 $url = $_SESSION['my_url'];
645                 if ($url && strlen(get_config('system', 'directory'))) {
646                         proc_run(PRIORITY_LOW, 'include/directory.php', $url);
647                 }
648         }
649
650         require_once 'include/profile_update.php';
651         profile_change();
652
653         // Update the global contact for the user
654         update_gcontact_for_user(local_user());
655
656         //$_SESSION['theme'] = $theme;
657         if ($email_changed && $a->config['register_policy'] == REGISTER_VERIFY) {
658
659                 // FIXME - set to un-verified, blocked and redirect to logout
660                 // Why? Are we verifying people or email addresses?
661         }
662
663         goaway('settings');
664
665         return; // NOTREACHED
666 }
667
668 function settings_content(&$a)
669 {
670         $o = '';
671         nav_set_selected('settings');
672
673         if (!local_user()) {
674                 //notice( t('Permission denied.') . EOL );
675                 return;
676         }
677
678         if (x($_SESSION, 'submanage') && intval($_SESSION['submanage'])) {
679                 notice(t('Permission denied.').EOL);
680
681                 return;
682         }
683
684         if (($a->argc > 1) && ($a->argv[1] === 'oauth')) {
685                 if (($a->argc > 2) && ($a->argv[2] === 'add')) {
686                         $tpl = get_markup_template('settings_oauth_edit.tpl');
687                         $o .= replace_macros($tpl, array(
688                                 '$form_security_token' => get_form_security_token('settings_oauth'),
689                                 '$title' => t('Add application'),
690                                 '$submit' => t('Save Settings'),
691                                 '$cancel' => t('Cancel'),
692                                 '$name' => array('name', t('Name'), '', ''),
693                                 '$key' => array('key', t('Consumer Key'), '', ''),
694                                 '$secret' => array('secret', t('Consumer Secret'), '', ''),
695                                 '$redirect' => array('redirect', t('Redirect'), '', ''),
696                                 '$icon' => array('icon', t('Icon url'), '', ''),
697                         ));
698
699                         return $o;
700                 }
701
702                 if (($a->argc > 3) && ($a->argv[2] === 'edit')) {
703                         $r = q("SELECT * FROM clients WHERE client_id='%s' AND uid=%d",
704                                         dbesc($a->argv[3]),
705                                         local_user());
706
707                         if (!count($r)) {
708                                 notice(t("You can't edit this application."));
709
710                                 return;
711                         }
712                         $app = $r[0];
713
714                         $tpl = get_markup_template('settings_oauth_edit.tpl');
715                         $o .= replace_macros($tpl, array(
716                                 '$form_security_token' => get_form_security_token('settings_oauth'),
717                                 '$title' => t('Add application'),
718                                 '$submit' => t('Update'),
719                                 '$cancel' => t('Cancel'),
720                                 '$name' => array('name', t('Name'), $app['name'], ''),
721                                 '$key' => array('key', t('Consumer Key'), $app['client_id'], ''),
722                                 '$secret' => array('secret', t('Consumer Secret'), $app['pw'], ''),
723                                 '$redirect' => array('redirect', t('Redirect'), $app['redirect_uri'], ''),
724                                 '$icon' => array('icon', t('Icon url'), $app['icon'], ''),
725                         ));
726
727                         return $o;
728                 }
729
730                 if (($a->argc > 3) && ($a->argv[2] === 'delete')) {
731                         check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth', 't');
732
733                         $r = q("DELETE FROM clients WHERE client_id='%s' AND uid=%d",
734                                         dbesc($a->argv[3]),
735                                         local_user());
736                         goaway($a->get_baseurl(true).'/settings/oauth/');
737
738                         return;
739                 }
740
741                 $r = q('SELECT clients.*, tokens.id as oauth_token, (clients.uid=%d) AS my
742                                 FROM clients
743                                 LEFT JOIN tokens ON clients.client_id=tokens.client_id
744                                 WHERE clients.uid IN (%d,0)',
745                                 local_user(),
746                                 local_user());
747
748                 $tpl = get_markup_template('settings_oauth.tpl');
749                 $o .= replace_macros($tpl, array(
750                         '$form_security_token' => get_form_security_token('settings_oauth'),
751                         '$baseurl' => $a->get_baseurl(true),
752                         '$title' => t('Connected Apps'),
753                         '$add' => t('Add application'),
754                         '$edit' => t('Edit'),
755                         '$delete' => t('Delete'),
756                         '$consumerkey' => t('Client key starts with'),
757                         '$noname' => t('No name'),
758                         '$remove' => t('Remove authorization'),
759                         '$apps' => $r,
760                 ));
761
762                 return $o;
763         }
764
765         if (($a->argc > 1) && ($a->argv[1] === 'addon')) {
766                 $settings_addons = '';
767
768                 $r = q("SELECT * FROM `hook` WHERE `hook` = 'plugin_settings' ");
769                 if (!count($r)) {
770                         $settings_addons = t('No Plugin settings configured');
771                 }
772
773                 call_hooks('plugin_settings', $settings_addons);
774
775                 $tpl = get_markup_template('settings_addons.tpl');
776                 $o .= replace_macros($tpl, array(
777                         '$form_security_token' => get_form_security_token('settings_addon'),
778                         '$title' => t('Plugin Settings'),
779                         '$settings_addons' => $settings_addons,
780                 ));
781
782                 return $o;
783         }
784
785         if (($a->argc > 1) && ($a->argv[1] === 'features')) {
786                 $arr = array();
787                 $features = get_features();
788                 foreach ($features as $fname => $fdata) {
789                         $arr[$fname] = array();
790                         $arr[$fname][0] = $fdata[0];
791                         foreach (array_slice($fdata, 1) as $f) {
792                                 $arr[$fname][1][] = array('feature_'.$f[0], $f[1], ((intval(feature_enabled(local_user(), $f[0]))) ? '1' : ''), $f[2], array(t('Off'), t('On')));
793                         }
794                 }
795
796                 $tpl = get_markup_template('settings_features.tpl');
797                 $o .= replace_macros($tpl, array(
798                         '$form_security_token' => get_form_security_token('settings_features'),
799                         '$title' => t('Additional Features'),
800                         '$features' => $arr,
801                         '$submit' => t('Save Settings'),
802                 ));
803
804                 return $o;
805         }
806
807         if (($a->argc > 1) && ($a->argv[1] === 'connectors')) {
808                 $settings_connectors = '<span id="settings_general_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_general_expanded\'); openClose(\'settings_general_inflated\');">';
809                 $settings_connectors .= '<h3 class="connector">'.t('General Social Media Settings').'</h3>';
810                 $settings_connectors .= '</span>';
811                 $settings_connectors .= '<div id="settings_general_expanded" class="settings-block" style="display: none;">';
812                 $settings_connectors .= '<span class="fakelink" onclick="openClose(\'settings_general_expanded\'); openClose(\'settings_general_inflated\');">';
813                 $settings_connectors .= '<h3 class="connector">'.t('General Social Media Settings').'</h3>';
814                 $settings_connectors .= '</span>';
815
816                 $checked = ((get_pconfig(local_user(), 'system', 'no_intelligent_shortening')) ? ' checked="checked" ' : '');
817
818                 $settings_connectors .= '<div id="no_intelligent_shortening" class="field checkbox">';
819                 $settings_connectors .= '<label id="no_intelligent_shortening-label" for="shortening-checkbox">'.t('Disable intelligent shortening').'</label>';
820                 $settings_connectors .= '<input id="shortening-checkbox" type="checkbox" name="no_intelligent_shortening" value="1" '.$checked.'/>';
821                 $settings_connectors .= '<span class="field_help">'.t('Normally the system tries to find the best link to add to shortened posts. If this option is enabled then every shortened post will always point to the original friendica post.').'</span>';
822                 $settings_connectors .= '</div>';
823
824                 $checked = ((get_pconfig(local_user(), 'system', 'ostatus_autofriend')) ? ' checked="checked" ' : '');
825
826                 $settings_connectors .= '<div id="snautofollow-wrapper" class="field checkbox">';
827                 $settings_connectors .= '<label id="snautofollow-label" for="snautofollow-checkbox">'.t('Automatically follow any GNU Social (OStatus) followers/mentioners').'</label>';
828                 $settings_connectors .= '<input id="snautofollow-checkbox" type="checkbox" name="snautofollow" value="1" '.$checked.'/>';
829                 $settings_connectors .= '<span class="field_help">'.t('If you receive a message from an unknown OStatus user, this option decides what to do. If it is checked, a new contact will be created for every unknown user.').'</span>';
830                 $settings_connectors .= '</div>';
831
832                 $default_group = get_pconfig(local_user(), 'ostatus', 'default_group');
833                 $legacy_contact = get_pconfig(local_user(), 'ostatus', 'legacy_contact');
834
835                 $settings_connectors .= mini_group_select(local_user(), $default_group, t('Default group for OStatus contacts'));
836
837                 if ($legacy_contact != '') {
838                         $a->page['htmlhead'] = '<meta http-equiv="refresh" content="0; URL='.$a->get_baseurl().'/ostatus_subscribe?url='.urlencode($legacy_contact).'">';
839                 }
840
841                 $settings_connectors .= '<div id="legacy-contact-wrapper" class="field input">';
842                 $settings_connectors .= '<label id="legacy-contact-label" for="snautofollow-checkbox">'.t('Your legacy GNU Social account').'</label>';
843                 $settings_connectors .= '<input id="legacy-contact-checkbox" name="legacy_contact" value="'.$legacy_contact.'"/>';
844                 $settings_connectors .= '<span class="field_help">'.t('If you enter your old GNU Social/Statusnet account name here (in the format user@domain.tld), your contacts will be added automatically. The field will be emptied when done.').'</span>';
845                 $settings_connectors .= '</div>';
846
847                 $settings_connectors .= '<p><a href="'.$a->get_baseurl().'/repair_ostatus">'.t('Repair OStatus subscriptions').'</a></p>';
848
849                 $settings_connectors .= '<div class="settings-submit-wrapper" ><input type="submit" name="general-submit" class="settings-submit" value="'.t('Save Settings').'" /></div>';
850
851                 $settings_connectors .= '</div><div class="clear"></div>';
852
853                 call_hooks('connector_settings', $settings_connectors);
854
855                 if (is_site_admin()) {
856                         $diasp_enabled = sprintf(t('Built-in support for %s connectivity is %s'), t('Diaspora'), ((get_config('system', 'diaspora_enabled')) ? t('enabled') : t('disabled')));
857                         $ostat_enabled = sprintf(t('Built-in support for %s connectivity is %s'), t('GNU Social (OStatus)'), ((get_config('system', 'ostatus_disabled')) ? t('disabled') : t('enabled')));
858                 } else {
859                         $diasp_enabled = '';
860                         $ostat_enabled = '';
861                 }
862
863                 $mail_disabled = ((function_exists('imap_open') && (!get_config('system', 'imap_disabled'))) ? 0 : 1);
864                 if (get_config('system', 'dfrn_only')) {
865                         $mail_disabled = 1;
866                 }
867
868                 if (!$mail_disabled) {
869                         $r = q('SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1',
870                                 local_user()
871                         );
872                 } else {
873                         $r = null;
874                 }
875
876                 $mail_server = ((count($r)) ? $r[0]['server'] : '');
877                 $mail_port = ((count($r) && intval($r[0]['port'])) ? intval($r[0]['port']) : '');
878                 $mail_ssl = ((count($r)) ? $r[0]['ssltype'] : '');
879                 $mail_user = ((count($r)) ? $r[0]['user'] : '');
880                 $mail_replyto = ((count($r)) ? $r[0]['reply_to'] : '');
881                 $mail_pubmail = ((count($r)) ? $r[0]['pubmail'] : 0);
882                 $mail_action = ((count($r)) ? $r[0]['action'] : 0);
883                 $mail_movetofolder = ((count($r)) ? $r[0]['movetofolder'] : '');
884                 $mail_chk = ((count($r)) ? $r[0]['last_check'] : '0000-00-00 00:00:00');
885
886                 $tpl = get_markup_template('settings_connectors.tpl');
887
888                 if (!service_class_allows(local_user(), 'email_connect')) {
889                         $mail_disabled_message = upgrade_bool_message();
890                 } else {
891                         $mail_disabled_message = (($mail_disabled) ? t('Email access is disabled on this site.') : '');
892                 }
893
894                 $o .= replace_macros($tpl, array(
895                         '$form_security_token' => get_form_security_token('settings_connectors'),
896
897                         '$title' => t('Social Networks'),
898
899                         '$diasp_enabled' => $diasp_enabled,
900                         '$ostat_enabled' => $ostat_enabled,
901
902                         '$h_imap' => t('Email/Mailbox Setup'),
903                         '$imap_desc' => t("If you wish to communicate with email contacts using this service \x28optional\x29, please specify how to connect to your mailbox."),
904                         '$imap_lastcheck' => array('imap_lastcheck', t('Last successful email check:'), $mail_chk, ''),
905                         '$mail_disabled' => $mail_disabled_message,
906                         '$mail_server' => array('mail_server',  t('IMAP server name:'), $mail_server, ''),
907                         '$mail_port' => array('mail_port',       t('IMAP port:'), $mail_port, ''),
908                         '$mail_ssl' => array('mail_ssl',         t('Security:'), strtoupper($mail_ssl), '', array('notls' => t('None'), 'TLS' => 'TLS', 'SSL' => 'SSL')),
909                         '$mail_user' => array('mail_user',      t('Email login name:'), $mail_user, ''),
910                         '$mail_pass' => array('mail_pass',       t('Email password:'), '', ''),
911                         '$mail_replyto' => array('mail_replyto', t('Reply-to address:'), $mail_replyto, 'Optional'),
912                         '$mail_pubmail' => array('mail_pubmail', t('Send public posts to all email contacts:'), $mail_pubmail, ''),
913                         '$mail_action' => array('mail_action',   t('Action after import:'), $mail_action, '', array(0 => t('None'), /*1=>t('Delete'),*/ 2 => t('Mark as seen'), 3 => t('Move to folder'))),
914                         '$mail_movetofolder' => array('mail_movetofolder',       t('Move to folder:'), $mail_movetofolder, ''),
915                         '$submit' => t('Save Settings'),
916
917                         '$settings_connectors' => $settings_connectors,
918                 ));
919
920                 call_hooks('display_settings', $o);
921
922                 return $o;
923         }
924
925         /*
926          * DISPLAY SETTINGS
927          */
928         if (($a->argc > 1) && ($a->argv[1] === 'display')) {
929                 $default_theme = get_config('system', 'theme');
930                 if (!$default_theme) {
931                         $default_theme = 'default';
932                 }
933                 $default_mobile_theme = get_config('system', 'mobile-theme');
934                 if (!$mobile_default_theme) {
935                         $mobile_default_theme = 'none';
936                 }
937
938                 $allowed_themes_str = get_config('system', 'allowed_themes');
939                 $allowed_themes_raw = explode(',', $allowed_themes_str);
940                 $allowed_themes = array();
941                 if (count($allowed_themes_raw)) {
942                         foreach ($allowed_themes_raw as $x) {
943                                 if (strlen(trim($x)) && is_dir("view/theme/$x")) {
944                                         $allowed_themes[] = trim($x);
945                                 }
946                         }
947                 }
948
949                 $themes = array();
950                 $mobile_themes = array('---' => t('No special theme for mobile devices'));
951                 $files = glob('view/theme/*');
952                 if ($allowed_themes) {
953                         foreach ($allowed_themes as $th) {
954                                 $f = $th;
955                                 $is_experimental = file_exists('view/theme/'.$th.'/experimental');
956                                 $unsupported = file_exists('view/theme/'.$th.'/unsupported');
957                                 $is_mobile = file_exists('view/theme/'.$th.'/mobile');
958                                 if (!$is_experimental or ($is_experimental && (get_config('experimentals', 'exp_themes') == 1 or get_config('experimentals', 'exp_themes') === false))) {
959                                         $theme_name = (($is_experimental) ? sprintf("%s - \x28Experimental\x29", $f) : $f);
960                                         if ($is_mobile) {
961                                                 $mobile_themes[$f] = $theme_name;
962                                         } else {
963                                                 $themes[$f] = $theme_name;
964                                         }
965                                 }
966                         }
967                 }
968                 $theme_selected = (!x($_SESSION, 'theme') ? $default_theme : $_SESSION['theme']);
969                 $mobile_theme_selected = (!x($_SESSION, 'mobile-theme') ? $default_mobile_theme : $_SESSION['mobile-theme']);
970
971                 $browser_update = intval(get_pconfig(local_user(), 'system', 'update_interval'));
972                 if (intval($browser_update) != -1) {
973                         $browser_update = (($browser_update == 0) ? 40 : $browser_update / 1000);
974                 } // default if not set: 40 seconds
975
976                 $itemspage_network = intval(get_pconfig(local_user(), 'system', 'itemspage_network'));
977                 $itemspage_network = (($itemspage_network > 0 && $itemspage_network < 101) ? $itemspage_network : 40); // default if not set: 40 items
978                 $itemspage_mobile_network = intval(get_pconfig(local_user(), 'system', 'itemspage_mobile_network'));
979                 $itemspage_mobile_network = (($itemspage_mobile_network > 0 && $itemspage_mobile_network < 101) ? $itemspage_mobile_network : 20); // default if not set: 20 items
980
981                 $nosmile = get_pconfig(local_user(), 'system', 'no_smilies');
982                 $nosmile = (($nosmile === false) ? '0' : $nosmile); // default if not set: 0
983
984                 $first_day_of_week = get_pconfig(local_user(), 'system', 'first_day_of_week');
985                 $first_day_of_week = (($first_day_of_week === false) ? '0' : $first_day_of_week); // default if not set: 0
986                 $weekdays = array(0 => t('Sunday'), 1 => t('Monday'));
987
988                 $noinfo = get_pconfig(local_user(), 'system', 'ignore_info');
989                 $noinfo = (($noinfo === false) ? '0' : $noinfo); // default if not set: 0
990
991                 $infinite_scroll = get_pconfig(local_user(), 'system', 'infinite_scroll');
992                 $infinite_scroll = (($infinite_scroll === false) ? '0' : $infinite_scroll); // default if not set: 0
993
994                 $no_auto_update = get_pconfig(local_user(), 'system', 'no_auto_update');
995                 $no_auto_update = (($no_auto_update === false) ? '0' : $no_auto_update); // default if not set: 0
996
997                 $bandwidth_saver = get_pconfig(local_user(), 'system', 'bandwidth_saver');
998                 $bandwidth_saver = (($bandwidth_saver === false) ? '0' : $bandwidth_saver); // default if not set: 0
999
1000                 $theme_config = '';
1001                 if (($themeconfigfile = get_theme_config_file($theme_selected)) != null) {
1002                         require_once $themeconfigfile;
1003                         $theme_config = theme_content($a);
1004                 }
1005
1006                 $tpl = get_markup_template('settings_display.tpl');
1007                 $o = replace_macros($tpl, array(
1008                         '$ptitle' => t('Display Settings'),
1009                         '$form_security_token' => get_form_security_token('settings_display'),
1010                         '$submit' => t('Save Settings'),
1011                         '$baseurl' => $a->get_baseurl(true),
1012                         '$uid' => local_user(),
1013
1014                         '$theme' => array('theme', t('Display Theme:'), $theme_selected, '', $themes, true),
1015                         '$mobile_theme' => array('mobile_theme', t('Mobile Theme:'), $mobile_theme_selected, '', $mobile_themes, false),
1016                         '$ajaxint' => array('browser_update',  t('Update browser every xx seconds'), $browser_update, t('Minimum of 10 seconds. Enter -1 to disable it.')),
1017                         '$itemspage_network' => array('itemspage_network',  t('Number of items to display per page:'), $itemspage_network, t('Maximum of 100 items')),
1018                         '$itemspage_mobile_network' => array('itemspage_mobile_network',  t('Number of items to display per page when viewed from mobile device:'), $itemspage_mobile_network, t('Maximum of 100 items')),
1019                         '$nosmile' => array('nosmile', t("Don't show emoticons"), $nosmile, ''),
1020                         '$calendar_title' => t('Calendar'),
1021                         '$first_day_of_week' => array('first_day_of_week', t('Beginning of week:'), $first_day_of_week, '', $weekdays, false),
1022                         '$noinfo' => array('noinfo', t("Don't show notices"), $noinfo, ''),
1023                         '$infinite_scroll' => array('infinite_scroll', t('Infinite scroll'), $infinite_scroll, ''),
1024                         '$no_auto_update' => array('no_auto_update', t('Automatic updates only at the top of the network page'), $no_auto_update, 'When disabled, the network page is updated all the time, which could be confusing while reading.'),
1025                         '$bandwidth_saver' => array('bandwidth_saver', t('Bandwith Saver Mode'), $bandwidth_saver, 'When enabled, embedded content is not displayed on automatic updates, they only show on page reload.'),
1026
1027                         '$d_tset' => t('General Theme Settings'),
1028                         '$d_ctset' => t('Custom Theme Settings'),
1029                         '$d_cset' => t('Content Settings'),
1030                         'stitle' => t('Theme settings'),
1031                         '$theme_config' => $theme_config,
1032                 ));
1033
1034                 $tpl = get_markup_template('settings_display_end.tpl');
1035                 $a->page['end'] .= replace_macros($tpl, array(
1036                         '$theme' => array('theme', t('Display Theme:'), $theme_selected, '', $themes),
1037                 ));
1038
1039                 return $o;
1040         }
1041
1042         /*
1043          * ACCOUNT SETTINGS
1044          */
1045
1046         require_once 'include/acl_selectors.php';
1047
1048         $p = q('SELECT * FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1',
1049                 intval(local_user())
1050         );
1051         if (count($p)) {
1052                 $profile = $p[0];
1053         }
1054
1055         $username   = $a->user['username'];
1056         $email    = $a->user['email'];
1057         $nickname   = $a->user['nickname'];
1058         $timezone   = $a->user['timezone'];
1059         $language   = $a->user['language'];
1060         $notify  = $a->user['notify-flags'];
1061         $defloc  = $a->user['default-location'];
1062         $openid  = $a->user['openid'];
1063         $maxreq  = $a->user['maxreq'];
1064         $expire  = ((intval($a->user['expire'])) ? $a->user['expire'] : '');
1065         $blockwall  = $a->user['blockwall'];
1066         $blocktags  = $a->user['blocktags'];
1067         $unkmail        = $a->user['unkmail'];
1068         $cntunkmail = $a->user['cntunkmail'];
1069
1070         $expire_items = get_pconfig(local_user(), 'expire', 'items');
1071         $expire_items = (($expire_items === false) ? '1' : $expire_items); // default if not set: 1
1072
1073         $expire_notes = get_pconfig(local_user(), 'expire', 'notes');
1074         $expire_notes = (($expire_notes === false) ? '1' : $expire_notes); // default if not set: 1
1075
1076         $expire_starred = get_pconfig(local_user(), 'expire', 'starred');
1077         $expire_starred = (($expire_starred === false) ? '1' : $expire_starred); // default if not set: 1
1078
1079         $expire_photos = get_pconfig(local_user(), 'expire', 'photos');
1080         $expire_photos = (($expire_photos === false) ? '0' : $expire_photos); // default if not set: 0
1081
1082         $expire_network_only = get_pconfig(local_user(), 'expire', 'network_only');
1083         $expire_network_only = (($expire_network_only === false) ? '0' : $expire_network_only); // default if not set: 0
1084
1085         $suggestme = get_pconfig(local_user(), 'system', 'suggestme');
1086         $suggestme = (($suggestme === false) ? '0' : $suggestme); // default if not set: 0
1087
1088         $post_newfriend = get_pconfig(local_user(), 'system', 'post_newfriend');
1089         $post_newfriend = (($post_newfriend === false) ? '0' : $post_newfriend); // default if not set: 0
1090
1091         $post_joingroup = get_pconfig(local_user(), 'system', 'post_joingroup');
1092         $post_joingroup = (($post_joingroup === false) ? '0' : $post_joingroup); // default if not set: 0
1093
1094         $post_profilechange = get_pconfig(local_user(), 'system', 'post_profilechange');
1095         $post_profilechange = (($post_profilechange === false) ? '0' : $post_profilechange); // default if not set: 0
1096
1097         // nowarn_insecure
1098
1099         if (!strlen($a->user['timezone'])) {
1100                 $timezone = date_default_timezone_get();
1101         }
1102
1103         // Set the account type to "Community" when the page is a community page but the account type doesn't fit
1104         // This is only happening on the first visit after the update
1105         if (in_array($a->user['page-flags'], array(PAGE_COMMUNITY, PAGE_PRVGROUP)) and
1106                 ($a->user['account-type'] != ACCOUNT_TYPE_COMMUNITY)) {
1107                 $a->user['account-type'] = ACCOUNT_TYPE_COMMUNITY;
1108         }
1109
1110         $pageset_tpl = get_markup_template('settings_pagetypes.tpl');
1111
1112         $pagetype = replace_macros($pageset_tpl, array(
1113                 '$account_types'        => t('Account Types'),
1114                 '$user'                  => t('Personal Page Subtypes'),
1115                 '$community'            => t('Community Forum Subtypes'),
1116                 '$account_type'  => $a->user['account-type'],
1117                 '$type_person'    => ACCOUNT_TYPE_PERSON,
1118                 '$type_organisation'=> ACCOUNT_TYPE_ORGANISATION,
1119                 '$type_news'            => ACCOUNT_TYPE_NEWS,
1120                 '$type_community'   => ACCOUNT_TYPE_COMMUNITY,
1121
1122                 '$account_person' => array('account-type', t('Personal Page'), ACCOUNT_TYPE_PERSON,
1123                                                                         t('This account is a regular personal profile'),
1124                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_PERSON)),
1125
1126                 '$account_organisation' => array('account-type', t('Organisation Page'), ACCOUNT_TYPE_ORGANISATION,
1127                                                                         t('This account is a profile for an organisation'),
1128                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_ORGANISATION)),
1129
1130                 '$account_news' => array('account-type', t('News Page'), ACCOUNT_TYPE_NEWS,
1131                                                                         t('This account is a news account/reflector'),
1132                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_NEWS)),
1133
1134                 '$account_community' => array('account-type', t('Community Forum'), ACCOUNT_TYPE_COMMUNITY,
1135                                                                         t('This account is a community forum where people can discuss with each other'),
1136                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_COMMUNITY)),
1137
1138                 '$page_normal' => array('page-flags', t('Normal Account Page'), PAGE_NORMAL,
1139                                                                         t('This account is a normal personal profile'),
1140                                                                         ($a->user['page-flags'] == PAGE_NORMAL)),
1141
1142                 '$page_soapbox' => array('page-flags', t('Soapbox Page'), PAGE_SOAPBOX,
1143                                                                         t('Automatically approve all connection/friend requests as read-only fans'),
1144                                                                         ($a->user['page-flags'] == PAGE_SOAPBOX)),
1145
1146                 '$page_community' => array('page-flags', t('Public Forum'), PAGE_COMMUNITY,
1147                                                                         t('Automatically approve all contact requests'),
1148                                                                         ($a->user['page-flags'] == PAGE_COMMUNITY)),
1149
1150                 '$page_freelove' => array('page-flags', t('Automatic Friend Page'), PAGE_FREELOVE,
1151                                                                         t('Automatically approve all connection/friend requests as friends'),
1152                                                                         ($a->user['page-flags'] == PAGE_FREELOVE)),
1153
1154                 '$page_prvgroup' => array('page-flags', t('Private Forum [Experimental]'), PAGE_PRVGROUP,
1155                                                                         t('Private forum - approved members only'),
1156                                                                         ($a->user['page-flags'] == PAGE_PRVGROUP)),
1157
1158         ));
1159
1160         $noid = get_config('system', 'no_openid');
1161
1162         if ($noid) {
1163                 $openid_field = false;
1164         } else {
1165                 $openid_field = array('openid_url', t('OpenID:'), $openid, t("\x28Optional\x29 Allow this OpenID to login to this account."), '', '', 'url');
1166         }
1167
1168         $opt_tpl = get_markup_template('field_yesno.tpl');
1169         if (get_config('system', 'publish_all')) {
1170                 $profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
1171         } else {
1172                 $profile_in_dir = replace_macros($opt_tpl, array(
1173                         '$field' => array('profile_in_directory', t('Publish your default profile in your local site directory?'), $profile['publish'], '', array(t('No'), t('Yes'))),
1174                 ));
1175         }
1176
1177         if (strlen(get_config('system', 'directory'))) {
1178                 $profile_in_net_dir = replace_macros($opt_tpl, array(
1179                         '$field' => array('profile_in_netdirectory', t('Publish your default profile in the global social directory?'), $profile['net-publish'], '', array(t('No'), t('Yes'))),
1180                 ));
1181         } else {
1182                 $profile_in_net_dir = '';
1183         }
1184
1185         $hide_friends = replace_macros($opt_tpl, array(
1186                         '$field' => array('hide-friends', t('Hide your contact/friend list from viewers of your default profile?'), $profile['hide-friends'], '', array(t('No'), t('Yes'))),
1187         ));
1188
1189         $hide_wall = replace_macros($opt_tpl, array(
1190                         '$field' => array('hidewall',  t('Hide your profile details from unknown viewers?'), $a->user['hidewall'], t("If enabled, posting public messages to Diaspora and other networks isn't possible."), array(t('No'), t('Yes'))),
1191
1192         ));
1193
1194         $blockwall = replace_macros($opt_tpl, array(
1195                         '$field' => array('blockwall',  t('Allow friends to post to your profile page?'), (intval($a->user['blockwall']) ? '0' : '1'), '', array(t('No'), t('Yes'))),
1196
1197         ));
1198
1199         $blocktags = replace_macros($opt_tpl, array(
1200                         '$field' => array('blocktags',  t('Allow friends to tag your posts?'), (intval($a->user['blocktags']) ? '0' : '1'), '', array(t('No'), t('Yes'))),
1201
1202         ));
1203
1204         $suggestme = replace_macros($opt_tpl, array(
1205                         '$field' => array('suggestme',  t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', array(t('No'), t('Yes'))),
1206
1207         ));
1208
1209         $unkmail = replace_macros($opt_tpl, array(
1210                         '$field' => array('unkmail',  t('Permit unknown people to send you private mail?'), $unkmail, '', array(t('No'), t('Yes'))),
1211
1212         ));
1213
1214         $invisible = (((!$profile['publish']) && (!$profile['net-publish']))
1215                 ? true : false);
1216
1217         if ($invisible) {
1218                 info(t('Profile is <strong>not published</strong>.').EOL);
1219         }
1220
1221         //$subdir = ((strlen($a->get_path())) ? '<br />' . t('or') . ' ' . 'profile/' . $nickname : '');
1222
1223         $tpl_addr = get_markup_template('settings_nick_set.tpl');
1224
1225         $prof_addr = replace_macros($tpl_addr, array(
1226                 '$desc' => sprintf(t("Your Identity Address is <strong>'%s'</strong> or '%s'."), $nickname.'@'.$a->get_hostname().$a->get_path(), $a->get_baseurl().'/profile/'.$nickname),
1227                 '$basepath' => $a->get_hostname(),
1228         ));
1229
1230         $stpl = get_markup_template('settings.tpl');
1231
1232         $expire_arr = array(
1233                 'days' => array('expire',  t('Automatically expire posts after this many days:'), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
1234                 'advanced' => t('Advanced expiration settings'),
1235                 'label' => t('Advanced Expiration'),
1236                 'items' => array('expire_items',  t('Expire posts:'), $expire_items, '', array(t('No'), t('Yes'))),
1237                 'notes' => array('expire_notes',  t('Expire personal notes:'), $expire_notes, '', array(t('No'), t('Yes'))),
1238                 'starred' => array('expire_starred',  t('Expire starred posts:'), $expire_starred, '', array(t('No'), t('Yes'))),
1239                 'photos' => array('expire_photos',  t('Expire photos:'), $expire_photos, '', array(t('No'), t('Yes'))),
1240                 'network_only' => array('expire_network_only',  t('Only expire posts by others:'), $expire_network_only, '', array(t('No'), t('Yes'))),
1241         );
1242
1243         require_once 'include/group.php';
1244         $group_select = mini_group_select(local_user(), $a->user['def_gid']);
1245
1246         // Private/public post links for the non-JS ACL form
1247         $private_post = 1;
1248         if ($_REQUEST['public']) {
1249                 $private_post = 0;
1250         }
1251
1252         $query_str = $a->query_string;
1253         if (strpos($query_str, 'public=1') !== false) {
1254                 $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
1255         }
1256
1257         // I think $a->query_string may never have ? in it, but I could be wrong
1258         // It looks like it's from the index.php?q=[etc] rewrite that the web
1259         // server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
1260         if (strpos($query_str, '?') === false) {
1261                 $public_post_link = '?public=1';
1262         } else {
1263                 $public_post_link = '&public=1';
1264         }
1265
1266         /* Installed langs */
1267         $lang_choices = get_avaiable_languages();
1268
1269         $o .= replace_macros($stpl, array(
1270                 '$ptitle' => t('Account Settings'),
1271
1272                 '$submit' => t('Save Settings'),
1273                 '$baseurl' => $a->get_baseurl(true),
1274                 '$uid' => local_user(),
1275                 '$form_security_token' => get_form_security_token('settings'),
1276                 '$nickname_block' => $prof_addr,
1277
1278                 '$h_pass' => t('Password Settings'),
1279                 '$password1' => array('password', t('New Password:'), '', ''),
1280                 '$password2' => array('confirm', t('Confirm:'), '', t('Leave password fields blank unless changing')),
1281                 '$password3' => array('opassword', t('Current Password:'), '', t('Your current password to confirm the changes')),
1282                 '$password4' => array('mpassword', t('Password:'), '', t('Your current password to confirm the changes')),
1283                 '$oid_enable' => (!get_config('system', 'no_openid')),
1284                 '$openid' => $openid_field,
1285
1286                 '$h_basic' => t('Basic Settings'),
1287                 '$username' => array('username',  t('Full Name:'), $username, ''),
1288                 '$email' => array('email', t('Email Address:'), $email, '', '', '', 'email'),
1289                 '$timezone' => array('timezone_select', t('Your Timezone:'), select_timezone($timezone), ''),
1290                 '$language' => array('language', t('Your Language:'), $language, t('Set the language we use to show you friendica interface and to send you emails'), $lang_choices),
1291                 '$defloc' => array('defloc', t('Default Post Location:'), $defloc, ''),
1292                 '$allowloc' => array('allow_location', t('Use Browser Location:'), ($a->user['allow_location'] == 1), ''),
1293
1294                 '$h_prv' => t('Security and Privacy Settings'),
1295
1296                 '$maxreq' => array('maxreq', t('Maximum Friend Requests/Day:'), $maxreq, t("\x28to prevent spam abuse\x29")),
1297                 '$permissions' => t('Default Post Permissions'),
1298                 '$permdesc' => t("\x28click to open/close\x29"),
1299                 '$visibility' => $profile['net-publish'],
1300                 '$aclselect' => populate_acl($a->user),
1301                 '$suggestme' => $suggestme,
1302                 '$blockwall' => $blockwall, // array('blockwall', t('Allow friends to post to your profile page:'), !$blockwall, ''),
1303                 '$blocktags' => $blocktags, // array('blocktags', t('Allow friends to tag your posts:'), !$blocktags, ''),
1304
1305                 // ACL permissions box
1306                 '$acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector
1307                 '$group_perms' => t('Show to Groups'),
1308                 '$contact_perms' => t('Show to Contacts'),
1309                 '$private' => t('Default Private Post'),
1310                 '$public' => t('Default Public Post'),
1311                 '$is_private' => $private_post,
1312                 '$return_path' => $query_str,
1313                 '$public_link' => $public_post_link,
1314                 '$settings_perms' => t('Default Permissions for New Posts'),
1315
1316                 '$group_select' => $group_select,
1317
1318                 '$expire' => $expire_arr,
1319
1320                 '$profile_in_dir' => $profile_in_dir,
1321                 '$profile_in_net_dir' => $profile_in_net_dir,
1322                 '$hide_friends' => $hide_friends,
1323                 '$hide_wall' => $hide_wall,
1324                 '$unkmail' => $unkmail,
1325                 '$cntunkmail' => array('cntunkmail', t('Maximum private messages per day from unknown people:'), $cntunkmail, t("\x28to prevent spam abuse\x29")),
1326
1327                 '$h_not' => t('Notification Settings'),
1328                 '$activity_options' => t('By default post a status message when:'),
1329                 '$post_newfriend' => array('post_newfriend',  t('accepting a friend request'), $post_newfriend, ''),
1330                 '$post_joingroup' => array('post_joingroup',  t('joining a forum/community'), $post_joingroup, ''),
1331                 '$post_profilechange' => array('post_profilechange',  t('making an <em>interesting</em> profile change'), $post_profilechange, ''),
1332                 '$lbl_not' => t('Send a notification email when:'),
1333                 '$notify1' => array('notify1', t('You receive an introduction'), ($notify & NOTIFY_INTRO), NOTIFY_INTRO, ''),
1334                 '$notify2' => array('notify2', t('Your introductions are confirmed'), ($notify & NOTIFY_CONFIRM), NOTIFY_CONFIRM, ''),
1335                 '$notify3' => array('notify3', t('Someone writes on your profile wall'), ($notify & NOTIFY_WALL), NOTIFY_WALL, ''),
1336                 '$notify4' => array('notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, ''),
1337                 '$notify5' => array('notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, ''),
1338                 '$notify6' => array('notify6', t('You receive a friend suggestion'), ($notify & NOTIFY_SUGGEST), NOTIFY_SUGGEST, ''),
1339                 '$notify7' => array('notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, ''),
1340                 '$notify8' => array('notify8', t('You are poked/prodded/etc. in a post'), ($notify & NOTIFY_POKE), NOTIFY_POKE, ''),
1341
1342                 '$desktop_notifications' => array('desktop_notifications', t('Activate desktop notifications'), false, t('Show desktop popup on new notifications')),
1343
1344                 '$email_textonly' => array('email_textonly', t('Text-only notification emails'),
1345                                                                         get_pconfig(local_user(), 'system', 'email_textonly'),
1346                                                                         t('Send text only notification emails, without the html part'), ),
1347
1348                 '$h_advn' => t('Advanced Account/Page Type Settings'),
1349                 '$h_descadvn' => t('Change the behaviour of this account for special situations'),
1350                 '$pagetype' => $pagetype,
1351
1352                 '$relocate' => t('Relocate'),
1353                 '$relocate_text' => t("If you have moved this profile from another server, and some of your contacts don't receive your updates, try pushing this button."),
1354                 '$relocate_button' => t('Resend relocate message to contacts'),
1355
1356         ));
1357
1358         call_hooks('settings_form', $o);
1359
1360         $o .= '</form>'."\r\n";
1361
1362         return $o;
1363 }