]> git.mxchange.org Git - friendica.git/blob - mod/settings.php
5fb928724fe4ace270dcd0ba32429879d03c35a3
[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 }