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