]> git.mxchange.org Git - friendica.git/blob - mod/settings.php
Merge remote-tracking branch 'upstream/develop' into rewrites/coding-convention
[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                         /// @todo Don't quit silently here
389                         killme();
390                 } elseif ( $oldpass != $r[0]['password'] ) {
391                         notice( t('Wrong password.') . EOL);
392                         $err = true;
393                 }
394
395                 if (! $err) {
396                         $password = hash('whirlpool',$newpass);
397                         $r = q("UPDATE `user` SET `password` = '%s' WHERE `uid` = %d",
398                                 dbesc($password),
399                                 intval(local_user())
400                         );
401                         if ($r) {
402                                 info( t('Password changed.') . EOL);
403                         } else {
404                                 notice( t('Password update failed. Please try again.') . EOL);
405                         }
406                 }
407         }
408
409
410         $username         = ((x($_POST,'username'))   ? notags(trim($_POST['username']))     : '');
411         $email            = ((x($_POST,'email'))      ? notags(trim($_POST['email']))        : '');
412         $timezone         = ((x($_POST,'timezone'))   ? notags(trim($_POST['timezone']))     : '');
413         $language         = ((x($_POST,'language'))   ? notags(trim($_POST['language']))     : '');
414
415         $defloc           = ((x($_POST,'defloc'))     ? notags(trim($_POST['defloc']))       : '');
416         $openid           = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url']))   : '');
417         $maxreq           = ((x($_POST,'maxreq'))     ? intval($_POST['maxreq'])             : 0);
418         $expire           = ((x($_POST,'expire'))     ? intval($_POST['expire'])             : 0);
419         $def_gid          = ((x($_POST,'group-selection')) ? intval($_POST['group-selection']) : 0);
420
421
422         $expire_items     = ((x($_POST,'expire_items')) ? intval($_POST['expire_items'])         : 0);
423         $expire_notes     = ((x($_POST,'expire_notes')) ? intval($_POST['expire_notes'])         : 0);
424         $expire_starred   = ((x($_POST,'expire_starred')) ? intval($_POST['expire_starred']) : 0);
425         $expire_photos    = ((x($_POST,'expire_photos'))? intval($_POST['expire_photos'])        : 0);
426         $expire_network_only    = ((x($_POST,'expire_network_only'))? intval($_POST['expire_network_only'])      : 0);
427
428         $allow_location   = (((x($_POST,'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0);
429         $publish          = (((x($_POST,'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0);
430         $net_publish      = (((x($_POST,'profile_in_netdirectory')) && (intval($_POST['profile_in_netdirectory']) == 1)) ? 1: 0);
431         $old_visibility   = (((x($_POST,'visibility')) && (intval($_POST['visibility']) == 1)) ? 1 : 0);
432         $account_type     = (((x($_POST,'account-type')) && (intval($_POST['account-type']))) ? intval($_POST['account-type']) : 0);
433         $page_flags       = (((x($_POST,'page-flags')) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0);
434         $blockwall        = (((x($_POST,'blockwall')) && (intval($_POST['blockwall']) == 1)) ? 0: 1); // this setting is inverted!
435         $blocktags        = (((x($_POST,'blocktags')) && (intval($_POST['blocktags']) == 1)) ? 0: 1); // this setting is inverted!
436         $unkmail          = (((x($_POST,'unkmail')) && (intval($_POST['unkmail']) == 1)) ? 1: 0);
437         $cntunkmail       = ((x($_POST,'cntunkmail')) ? intval($_POST['cntunkmail']) : 0);
438         $suggestme        = ((x($_POST,'suggestme')) ? intval($_POST['suggestme'])  : 0);
439         $hide_friends     = (($_POST['hide-friends'] == 1) ? 1: 0);
440         $hidewall         = (($_POST['hidewall'] == 1) ? 1: 0);
441         $post_newfriend   = (($_POST['post_newfriend'] == 1) ? 1: 0);
442         $post_joingroup   = (($_POST['post_joingroup'] == 1) ? 1: 0);
443         $post_profilechange   = (($_POST['post_profilechange'] == 1) ? 1: 0);
444
445         $email_textonly   = (($_POST['email_textonly'] == 1) ? 1 : 0);
446
447         $notify = 0;
448
449         if (x($_POST,'notify1')) {
450                 $notify += intval($_POST['notify1']);
451         }
452         if (x($_POST,'notify2')) {
453                 $notify += intval($_POST['notify2']);
454         }
455         if (x($_POST,'notify3')) {
456                 $notify += intval($_POST['notify3']);
457         }
458         if (x($_POST,'notify4')) {
459                 $notify += intval($_POST['notify4']);
460         }
461         if (x($_POST,'notify5')) {
462                 $notify += intval($_POST['notify5']);
463         }
464         if (x($_POST,'notify6')) {
465                 $notify += intval($_POST['notify6']);
466         }
467         if (x($_POST,'notify7')) {
468                 $notify += intval($_POST['notify7']);
469         }
470         if (x($_POST,'notify8')) {
471                 $notify += intval($_POST['notify8']);
472         }
473
474         // Adjust the page flag if the account type doesn't fit to the page flag.
475         if (($account_type == ACCOUNT_TYPE_PERSON) AND !in_array($page_flags, array(PAGE_NORMAL, PAGE_SOAPBOX, PAGE_FREELOVE))) {
476                 $page_flags = PAGE_NORMAL;
477         } elseif (($account_type == ACCOUNT_TYPE_ORGANISATION) AND !in_array($page_flags, array(PAGE_SOAPBOX))) {
478                 $page_flags = PAGE_SOAPBOX;
479         } elseif (($account_type == ACCOUNT_TYPE_NEWS) AND !in_array($page_flags, array(PAGE_SOAPBOX))) {
480                 $page_flags = PAGE_SOAPBOX;
481         } elseif (($account_type == ACCOUNT_TYPE_COMMUNITY) AND !in_array($page_flags, array(PAGE_COMMUNITY, PAGE_PRVGROUP))) {
482                 $page_flags = PAGE_COMMUNITY;
483         }
484
485         $email_changed = false;
486
487         $err = '';
488
489         $name_change = false;
490
491         if ($username != $a->user['username']) {
492                 $name_change = true;
493                 if (strlen($username) > 40) {
494                         $err .= t(' Please use a shorter name.');
495                 }
496                 if (strlen($username) < 3) {
497                         $err .= t(' Name too short.');
498                 }
499         }
500
501         if ($email != $a->user['email']) {
502                 $email_changed = true;
503                 //  check for the correct password
504                 $r = q("SELECT `password` FROM `user`WHERE `uid` = %d LIMIT 1", intval(local_user()));
505                 $password = hash('whirlpool', $_POST['mpassword']);
506                 if ($password != $r[0]['password']) {
507                         $err .= t('Wrong Password') . EOL;
508                         $email = $a->user['email'];
509                 }
510                 //  check the email is valid
511                 if (! valid_email($email)) {
512                         $err .= t(' Not valid email.');
513                 }
514                 //  ensure new email is not the admin mail
515                 //if ((x($a->config,'admin_email')) && (strcasecmp($email,$a->config['admin_email']) == 0)) {
516                 if (x($a->config,'admin_email')) {
517                         $adminlist = explode(",", str_replace(" ", "", strtolower($a->config['admin_email'])));
518                         if (in_array(strtolower($email), $adminlist)) {
519                                 $err .= t(' Cannot change to that email.');
520                                 $email = $a->user['email'];
521                         }
522                 }
523         }
524
525         if (strlen($err)) {
526                 notice($err . EOL);
527                 return;
528         }
529
530         if ($timezone != $a->user['timezone'] && strlen($timezone)) {
531                 date_default_timezone_set($timezone);
532         }
533
534         $str_group_allow   = perms2str($_POST['group_allow']);
535         $str_contact_allow = perms2str($_POST['contact_allow']);
536         $str_group_deny    = perms2str($_POST['group_deny']);
537         $str_contact_deny  = perms2str($_POST['contact_deny']);
538
539         $openidserver = $a->user['openidserver'];
540         //$openid = normalise_openid($openid);
541
542         // If openid has changed or if there's an openid but no openidserver, try and discover it.
543
544         if ($openid != $a->user['openid'] || (strlen($openid) && (! strlen($openidserver)))) {
545                 $tmp_str = $openid;
546                 if (strlen($tmp_str) && validate_url($tmp_str)) {
547                         logger('updating openidserver');
548                         require_once('library/openid.php');
549                         $open_id_obj = new LightOpenID;
550                         $open_id_obj->identity = $openid;
551                         $openidserver = $open_id_obj->discover($open_id_obj->identity);
552                 } else {
553                         $openidserver = '';
554                 }
555         }
556
557         set_pconfig(local_user(),'expire','items', $expire_items);
558         set_pconfig(local_user(),'expire','notes', $expire_notes);
559         set_pconfig(local_user(),'expire','starred', $expire_starred);
560         set_pconfig(local_user(),'expire','photos', $expire_photos);
561         set_pconfig(local_user(),'expire','network_only', $expire_network_only);
562
563         set_pconfig(local_user(),'system','suggestme', $suggestme);
564         set_pconfig(local_user(),'system','post_newfriend', $post_newfriend);
565         set_pconfig(local_user(),'system','post_joingroup', $post_joingroup);
566         set_pconfig(local_user(),'system','post_profilechange', $post_profilechange);
567
568         set_pconfig(local_user(),'system','email_textonly', $email_textonly);
569
570         if ($page_flags == PAGE_PRVGROUP) {
571                 $hidewall = 1;
572                 if ((! $str_contact_allow) && (! $str_group_allow) && (! $str_contact_deny) && (! $str_group_deny)) {
573                         if ($def_gid) {
574                                 info( t('Private forum has no privacy permissions. Using default privacy group.'). EOL);
575                                 $str_group_allow = '<' . $def_gid . '>';
576                         } else {
577                                 notice( t('Private forum has no privacy permissions and no default privacy group.') . EOL);
578                         }
579                 }
580         }
581
582
583         $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s',
584                                 `openid` = '%s', `timezone` = '%s',
585                                 `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s',
586                                 `notify-flags` = %d, `page-flags` = %d, `account-type` = %d, `default-location` = '%s',
587                                 `allow_location` = %d, `maxreq` = %d, `expire` = %d, `openidserver` = '%s',
588                                 `def_gid` = %d, `blockwall` = %d, `hidewall` = %d, `blocktags` = %d,
589                                 `unkmail` = %d, `cntunkmail` = %d, `language` = '%s'
590                         WHERE `uid` = %d",
591                         dbesc($username),
592                         dbesc($email),
593                         dbesc($openid),
594                         dbesc($timezone),
595                         dbesc($str_contact_allow),
596                         dbesc($str_group_allow),
597                         dbesc($str_contact_deny),
598                         dbesc($str_group_deny),
599                         intval($notify),
600                         intval($page_flags),
601                         intval($account_type),
602                         dbesc($defloc),
603                         intval($allow_location),
604                         intval($maxreq),
605                         intval($expire),
606                         dbesc($openidserver),
607                         intval($def_gid),
608                         intval($blockwall),
609                         intval($hidewall),
610                         intval($blocktags),
611                         intval($unkmail),
612                         intval($cntunkmail),
613                         dbesc($language),
614                         intval(local_user())
615         );
616         if ($r) {
617                 info( t('Settings updated.') . EOL);
618         }
619
620         // clear session language
621         unset($_SESSION['language']);
622
623         $r = q("UPDATE `profile`
624                 SET `publish` = %d,
625                 `name` = '%s',
626                 `net-publish` = %d,
627                 `hide-friends` = %d
628                 WHERE `is-default` = 1 AND `uid` = %d",
629                 intval($publish),
630                 dbesc($username),
631                 intval($net_publish),
632                 intval($hide_friends),
633                 intval(local_user())
634         );
635
636
637         if ($name_change) {
638                 q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `self`",
639                         dbesc($username),
640                         dbesc(datetime_convert()),
641                         intval(local_user())
642                 );
643         }
644
645         if (($old_visibility != $net_publish) || ($page_flags != $old_page_flags)) {
646                 // Update global directory in background
647                 $url = $_SESSION['my_url'];
648                 if ($url && strlen(get_config('system','directory'))) {
649                         proc_run(PRIORITY_LOW, "include/directory.php", $url);
650                 }
651         }
652
653         require_once('include/profile_update.php');
654         profile_change();
655
656         // Update the global contact for the user
657         update_gcontact_for_user(local_user());
658
659         //$_SESSION['theme'] = $theme;
660         if ($email_changed && $a->config['register_policy'] == REGISTER_VERIFY) {
661
662                 /// @TODO set to un-verified, blocked and redirect to logout
663                 /// @TODO Why? Are we verifying people or email addresses?
664
665         }
666
667         goaway('settings');
668         return; // NOTREACHED
669 }
670
671
672 function settings_content(App $a) {
673
674         $o = '';
675         nav_set_selected('settings');
676
677         if (! local_user()) {
678                 #notice( t('Permission denied.') . EOL );
679                 return;
680         }
681
682         if (x($_SESSION,'submanage') && intval($_SESSION['submanage'])) {
683                 notice( t('Permission denied.') . EOL );
684                 return;
685         }
686
687         if (($a->argc > 1) && ($a->argv[1] === 'oauth')) {
688
689                 if (($a->argc > 2) && ($a->argv[2] === 'add')) {
690                         $tpl = get_markup_template("settings_oauth_edit.tpl");
691                         $o .= replace_macros($tpl, array(
692                                 '$form_security_token' => get_form_security_token("settings_oauth"),
693                                 '$title'        => t('Add application'),
694                                 '$submit'       => t('Save Settings'),
695                                 '$cancel'       => t('Cancel'),
696                                 '$name'         => array('name', t('Name'), '', ''),
697                                 '$key'          => array('key', t('Consumer Key'), '', ''),
698                                 '$secret'       => array('secret', t('Consumer Secret'), '', ''),
699                                 '$redirect'     => array('redirect', t('Redirect'), '', ''),
700                                 '$icon'         => array('icon', t('Icon url'), '', ''),
701                         ));
702                         return $o;
703                 }
704
705                 if (($a->argc > 3) && ($a->argv[2] === 'edit')) {
706                         $r = q("SELECT * FROM clients WHERE client_id='%s' AND uid=%d",
707                                         dbesc($a->argv[3]),
708                                         local_user());
709
710                         if (!dbm::is_result($r)){
711                                 notice(t("You can't edit this application."));
712                                 return;
713                         }
714                         $app = $r[0];
715
716                         $tpl = get_markup_template("settings_oauth_edit.tpl");
717                         $o .= replace_macros($tpl, array(
718                                 '$form_security_token' => get_form_security_token("settings_oauth"),
719                                 '$title'        => t('Add application'),
720                                 '$submit'       => t('Update'),
721                                 '$cancel'       => t('Cancel'),
722                                 '$name'         => array('name', t('Name'), $app['name'] , ''),
723                                 '$key'          => array('key', t('Consumer Key'), $app['client_id'], ''),
724                                 '$secret'       => array('secret', t('Consumer Secret'), $app['pw'], ''),
725                                 '$redirect'     => array('redirect', t('Redirect'), $app['redirect_uri'], ''),
726                                 '$icon'         => array('icon', t('Icon url'), $app['icon'], ''),
727                         ));
728                         return $o;
729                 }
730
731                 if (($a->argc > 3) && ($a->argv[2] === 'delete')) {
732                         check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth', 't');
733
734                         $r = q("DELETE FROM clients WHERE client_id='%s' AND uid=%d",
735                                         dbesc($a->argv[3]),
736                                         local_user());
737                         goaway(App::get_baseurl(true)."/settings/oauth/");
738                         return;
739                 }
740
741                 /// @TODO validate result with dbm::is_result()
742                 $r = q("SELECT clients.*, tokens.id as oauth_token, (clients.uid=%d) AS my
743                                 FROM clients
744                                 LEFT JOIN tokens ON clients.client_id=tokens.client_id
745                                 WHERE clients.uid IN (%d,0)",
746                                 local_user(),
747                                 local_user());
748
749
750                 $tpl = get_markup_template("settings_oauth.tpl");
751                 $o .= replace_macros($tpl, array(
752                         '$form_security_token' => get_form_security_token("settings_oauth"),
753                         '$baseurl'      => App::get_baseurl(true),
754                         '$title'        => t('Connected Apps'),
755                         '$add'          => t('Add application'),
756                         '$edit'         => t('Edit'),
757                         '$delete'               => t('Delete'),
758                         '$consumerkey' => t('Client key starts with'),
759                         '$noname'       => t('No name'),
760                         '$remove'       => t('Remove authorization'),
761                         '$apps'         => $r,
762                 ));
763                 return $o;
764
765         }
766
767         if (($a->argc > 1) && ($a->argv[1] === 'addon')) {
768                 $settings_addons = "";
769
770                 $r = q("SELECT * FROM `hook` WHERE `hook` = 'plugin_settings' ");
771                 if (! dbm::is_result($r)) {
772                         $settings_addons = t('No Plugin settings configured');
773                 }
774
775                 call_hooks('plugin_settings', $settings_addons);
776
777
778                 $tpl = get_markup_template("settings_addons.tpl");
779                 $o .= replace_macros($tpl, array(
780                         '$form_security_token' => get_form_security_token("settings_addon"),
781                         '$title'        => t('Plugin Settings'),
782                         '$settings_addons' => $settings_addons
783                 ));
784                 return $o;
785         }
786
787         if (($a->argc > 1) && ($a->argv[1] === 'features')) {
788
789                 $arr = array();
790                 $features = get_features();
791                 foreach ($features as $fname => $fdata) {
792                         $arr[$fname] = array();
793                         $arr[$fname][0] = $fdata[0];
794                         foreach (array_slice($fdata,1) as $f) {
795                                 $arr[$fname][1][] = array('feature_' .$f[0],$f[1],((intval(feature_enabled(local_user(),$f[0]))) ? "1" : ''),$f[2],array(t('Off'),t('On')));
796                         }
797                 }
798
799
800                 $tpl = get_markup_template("settings_features.tpl");
801                 $o .= replace_macros($tpl, array(
802                         '$form_security_token' => get_form_security_token("settings_features"),
803                         '$title'               => t('Additional Features'),
804                         '$features'            => $arr,
805                         '$submit'              => t('Save Settings'),
806                 ));
807                 return $o;
808         }
809
810         if (($a->argc > 1) && ($a->argv[1] === 'connectors')) {
811
812                 $settings_connectors = '<span id="settings_general_inflated" class="settings-block fakelink" style="display: block;" 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                 $settings_connectors .= '<div id="settings_general_expanded" class="settings-block" style="display: none;">';
816                 $settings_connectors .= '<span class="fakelink" onclick="openClose(\'settings_general_expanded\'); openClose(\'settings_general_inflated\');">';
817                 $settings_connectors .= '<h3 class="connector">'. t('General Social Media Settings').'</h3>';
818                 $settings_connectors .= '</span>';
819
820                 $checked = ((get_pconfig(local_user(), 'system', 'no_intelligent_shortening')) ? ' checked="checked" ' : '');
821
822                 $settings_connectors .= '<div id="no_intelligent_shortening" class="field checkbox">';
823                 $settings_connectors .= '<label id="no_intelligent_shortening-label" for="shortening-checkbox">'. t('Disable intelligent shortening'). '</label>';
824                 $settings_connectors .= '<input id="shortening-checkbox" type="checkbox" name="no_intelligent_shortening" value="1" ' . $checked . '/>';
825                 $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>';
826                 $settings_connectors .= '</div>';
827
828                 $checked = ((get_pconfig(local_user(), 'system', 'ostatus_autofriend')) ? ' checked="checked" ' : '');
829
830                 $settings_connectors .= '<div id="snautofollow-wrapper" class="field checkbox">';
831                 $settings_connectors .= '<label id="snautofollow-label" for="snautofollow-checkbox">'. t('Automatically follow any GNU Social (OStatus) followers/mentioners'). '</label>';
832                 $settings_connectors .= '<input id="snautofollow-checkbox" type="checkbox" name="snautofollow" value="1" ' . $checked . '/>';
833                 $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>';
834                 $settings_connectors .= '</div>';
835
836                 $default_group = get_pconfig(local_user(), 'ostatus', 'default_group');
837                 $legacy_contact = get_pconfig(local_user(), 'ostatus', 'legacy_contact');
838
839                 $settings_connectors .= mini_group_select(local_user(), $default_group, t("Default group for OStatus contacts"));
840
841                 /// @TODO Found to much different usage to test empty/non-empty strings (e.g. empty(), trim() == '' ) which is wanted?
842                 if ($legacy_contact != "") {
843                         $a->page['htmlhead'] = '<meta http-equiv="refresh" content="0; URL='.App::get_baseurl().'/ostatus_subscribe?url='.urlencode($legacy_contact).'">';
844                 }
845
846                 $settings_connectors .= '<div id="legacy-contact-wrapper" class="field input">';
847                 $settings_connectors .= '<label id="legacy-contact-label" for="snautofollow-checkbox">'. t('Your legacy GNU Social account'). '</label>';
848                 $settings_connectors .= '<input id="legacy-contact-checkbox" name="legacy_contact" value="'.$legacy_contact.'"/>';
849                 $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>';
850                 $settings_connectors .= '</div>';
851
852                 $settings_connectors .= '<p><a href="'.App::get_baseurl().'/repair_ostatus">'.t("Repair OStatus subscriptions").'</a></p>';
853
854                 $settings_connectors .= '<div class="settings-submit-wrapper" ><input type="submit" name="general-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
855
856                 $settings_connectors .= '</div><div class="clear"></div>';
857
858                 call_hooks('connector_settings', $settings_connectors);
859
860                 if (is_site_admin()) {
861                         $diasp_enabled = sprintf( t('Built-in support for %s connectivity is %s'), t('Diaspora'), ((get_config('system','diaspora_enabled')) ? t('enabled') : t('disabled')));
862                         $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')));
863                 } else {
864                         $diasp_enabled = "";
865                         $ostat_enabled = "";
866                 }
867
868                 $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
869                 if (get_config('system','dfrn_only'))
870                         $mail_disabled = 1;
871
872                 if (! $mail_disabled) {
873                         $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
874                                 local_user()
875                         );
876                 } else {
877                         $r = null;
878                 }
879
880                 $mail_server       = ((dbm::is_result($r)) ? $r[0]['server'] : '');
881                 $mail_port         = ((dbm::is_result($r) && intval($r[0]['port'])) ? intval($r[0]['port']) : '');
882                 $mail_ssl          = ((dbm::is_result($r)) ? $r[0]['ssltype'] : '');
883                 $mail_user         = ((dbm::is_result($r)) ? $r[0]['user'] : '');
884                 $mail_replyto      = ((dbm::is_result($r)) ? $r[0]['reply_to'] : '');
885                 $mail_pubmail      = ((dbm::is_result($r)) ? $r[0]['pubmail'] : 0);
886                 $mail_action       = ((dbm::is_result($r)) ? $r[0]['action'] : 0);
887                 $mail_movetofolder = ((dbm::is_result($r)) ? $r[0]['movetofolder'] : '');
888                 $mail_chk          = ((dbm::is_result($r)) ? $r[0]['last_check'] : NULL_DATE);
889
890
891                 $tpl = get_markup_template("settings_connectors.tpl");
892
893                 if (! service_class_allows(local_user(),'email_connect')) {
894                         $mail_disabled_message = upgrade_bool_message();
895                 } else {
896                         $mail_disabled_message = (($mail_disabled) ? t('Email access is disabled on this site.') : '');
897                 }
898
899
900                 $o .= replace_macros($tpl, array(
901                         '$form_security_token' => get_form_security_token("settings_connectors"),
902
903                         '$title'        => t('Social Networks'),
904
905                         '$diasp_enabled' => $diasp_enabled,
906                         '$ostat_enabled' => $ostat_enabled,
907
908                         '$h_imap' => t('Email/Mailbox Setup'),
909                         '$imap_desc' => t("If you wish to communicate with email contacts using this service \x28optional\x29, please specify how to connect to your mailbox."),
910                         '$imap_lastcheck' => array('imap_lastcheck', t('Last successful email check:'), $mail_chk,''),
911                         '$mail_disabled' => $mail_disabled_message,
912                         '$mail_server'  => array('mail_server',  t('IMAP server name:'), $mail_server, ''),
913                         '$mail_port'    => array('mail_port',    t('IMAP port:'), $mail_port, ''),
914                         '$mail_ssl'             => array('mail_ssl',     t('Security:'), strtoupper($mail_ssl), '', array( 'notls'=>t('None'), 'TLS'=>'TLS', 'SSL'=>'SSL')),
915                         '$mail_user'    => array('mail_user',    t('Email login name:'), $mail_user, ''),
916                         '$mail_pass'    => array('mail_pass',    t('Email password:'), '', ''),
917                         '$mail_replyto' => array('mail_replyto', t('Reply-to address:'), $mail_replyto, 'Optional'),
918                         '$mail_pubmail' => array('mail_pubmail', t('Send public posts to all email contacts:'), $mail_pubmail, ''),
919                         '$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'))),
920                         '$mail_movetofolder'    => array('mail_movetofolder',    t('Move to folder:'), $mail_movetofolder, ''),
921                         '$submit' => t('Save Settings'),
922
923                         '$settings_connectors' => $settings_connectors
924                 ));
925
926                 call_hooks('display_settings', $o);
927                 return $o;
928         }
929
930         /*
931          * DISPLAY SETTINGS
932          */
933         if (($a->argc > 1) && ($a->argv[1] === 'display')) {
934                 $default_theme = get_config('system','theme');
935                 if (! $default_theme) {
936                         $default_theme = 'default';
937                 }
938                 $default_mobile_theme = get_config('system','mobile-theme');
939                 if (! $mobile_default_theme) {
940                         $mobile_default_theme = 'none';
941                 }
942
943                 $allowed_themes_str = get_config('system','allowed_themes');
944                 $allowed_themes_raw = explode(',',$allowed_themes_str);
945                 $allowed_themes = array();
946                 if (count($allowed_themes_raw)) {
947                         foreach ($allowed_themes_raw as $x) {
948                                 if (strlen(trim($x)) && is_dir("view/theme/$x")) {
949                                         $allowed_themes[] = trim($x);
950                                 }
951                         }
952                 }
953
954
955                 $themes = array();
956                 $mobile_themes = array("---" => t('No special theme for mobile devices'));
957                 $files = glob('view/theme/*'); /* */
958                 if ($allowed_themes) {
959                         foreach ($allowed_themes as $th) {
960                                 $f = $th;
961                                 $is_experimental = file_exists('view/theme/' . $th . '/experimental');
962                                 $unsupported = file_exists('view/theme/' . $th . '/unsupported');
963                                 $is_mobile = file_exists('view/theme/' . $th . '/mobile');
964                                 if (!$is_experimental or ($is_experimental && (get_config('experimentals','exp_themes')==1 or get_config('experimentals','exp_themes')===false))){
965                                         $theme_name = (($is_experimental) ?  sprintf("%s - \x28Experimental\x29", $f) : $f);
966                                         if ($is_mobile) {
967                                                 $mobile_themes[$f]=$theme_name;
968                                         } else {
969                                                 $themes[$f]=$theme_name;
970                                         }
971                                 }
972                         }
973                 }
974                 $theme_selected = (!x($_SESSION,'theme')? $default_theme : $_SESSION['theme']);
975                 $mobile_theme_selected = (!x($_SESSION,'mobile-theme')? $default_mobile_theme : $_SESSION['mobile-theme']);
976
977                 $nowarn_insecure = intval(get_pconfig(local_user(), 'system', 'nowarn_insecure'));
978
979                 $browser_update = intval(get_pconfig(local_user(), 'system','update_interval'));
980                 if (intval($browser_update) != -1) {
981                         $browser_update = (($browser_update == 0) ? 40 : $browser_update / 1000); // default if not set: 40 seconds
982                 }
983
984                 $itemspage_network = intval(get_pconfig(local_user(), 'system','itemspage_network'));
985                 $itemspage_network = (($itemspage_network > 0 && $itemspage_network < 101) ? $itemspage_network : 40); // default if not set: 40 items
986                 $itemspage_mobile_network = intval(get_pconfig(local_user(), 'system','itemspage_mobile_network'));
987                 $itemspage_mobile_network = (($itemspage_mobile_network > 0 && $itemspage_mobile_network < 101) ? $itemspage_mobile_network : 20); // default if not set: 20 items
988
989                 $nosmile = get_pconfig(local_user(),'system','no_smilies');
990                 $nosmile = (($nosmile===false)? '0': $nosmile); // default if not set: 0
991
992                 $first_day_of_week = get_pconfig(local_user(),'system','first_day_of_week');
993                 $first_day_of_week = (($first_day_of_week===false)? '0': $first_day_of_week); // default if not set: 0
994                 $weekdays = array(0 => t("Sunday"), 1 => t("Monday"));
995
996                 $noinfo = get_pconfig(local_user(),'system','ignore_info');
997                 $noinfo = (($noinfo===false)? '0': $noinfo); // default if not set: 0
998
999                 $infinite_scroll = get_pconfig(local_user(),'system','infinite_scroll');
1000                 $infinite_scroll = (($infinite_scroll===false)? '0': $infinite_scroll); // default if not set: 0
1001
1002                 $no_auto_update = get_pconfig(local_user(),'system','no_auto_update');
1003                 $no_auto_update = (($no_auto_update===false)? '0': $no_auto_update); // default if not set: 0
1004
1005                 $bandwidth_saver = get_pconfig(local_user(), 'system', 'bandwidth_saver');
1006                 $bandwidth_saver = (($bandwidth_saver === false) ? '0' : $bandwidth_saver); // default if not set: 0
1007
1008                 $theme_config = "";
1009                 if (($themeconfigfile = get_theme_config_file($theme_selected)) != null) {
1010                         require_once($themeconfigfile);
1011                         $theme_config = theme_content($a);
1012                 }
1013
1014                 $tpl = get_markup_template("settings_display.tpl");
1015                 $o = replace_macros($tpl, array(
1016                         '$ptitle'       => t('Display Settings'),
1017                         '$form_security_token' => get_form_security_token("settings_display"),
1018                         '$submit'       => t('Save Settings'),
1019                         '$baseurl' => App::get_baseurl(true),
1020                         '$uid' => local_user(),
1021
1022                         '$theme'        => array('theme', t('Display Theme:'), $theme_selected, '', $themes, true),
1023                         '$mobile_theme' => array('mobile_theme', t('Mobile Theme:'), $mobile_theme_selected, '', $mobile_themes, false),
1024                         '$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.")),
1025                         '$ajaxint'   => array('browser_update',  t("Update browser every xx seconds"), $browser_update, t('Minimum of 10 seconds. Enter -1 to disable it.')),
1026                         '$itemspage_network'   => array('itemspage_network',  t("Number of items to display per page:"), $itemspage_network, t('Maximum of 100 items')),
1027                         '$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')),
1028                         '$nosmile'      => array('nosmile', t("Don't show emoticons"), $nosmile, ''),
1029                         '$calendar_title' => t('Calendar'),
1030                         '$first_day_of_week'    => array('first_day_of_week', t('Beginning of week:'), $first_day_of_week, '', $weekdays, false),
1031                         '$noinfo'       => array('noinfo', t("Don't show notices"), $noinfo, ''),
1032                         '$infinite_scroll'      => array('infinite_scroll', t("Infinite scroll"), $infinite_scroll, ''),
1033                         '$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.'),
1034                         '$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.')),
1035
1036                         '$d_tset' => t('General Theme Settings'),
1037                         '$d_ctset' => t('Custom Theme Settings'),
1038                         '$d_cset' => t('Content Settings'),
1039                         'stitle' => t('Theme settings'),
1040                         '$theme_config' => $theme_config,
1041                 ));
1042
1043                 $tpl = get_markup_template("settings_display_end.tpl");
1044                 $a->page['end'] .= replace_macros($tpl, array(
1045                         '$theme'        => array('theme', t('Display Theme:'), $theme_selected, '', $themes)
1046                 ));
1047
1048                 return $o;
1049         }
1050
1051
1052         /*
1053          * ACCOUNT SETTINGS
1054          */
1055
1056         require_once('include/acl_selectors.php');
1057
1058         $p = q("SELECT * FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1",
1059                 intval(local_user())
1060         );
1061         if (count($p)) {
1062                 $profile = $p[0];
1063         }
1064
1065         $username   = $a->user['username'];
1066         $email      = $a->user['email'];
1067         $nickname   = $a->user['nickname'];
1068         $timezone   = $a->user['timezone'];
1069         $language   = $a->user['language'];
1070         $notify     = $a->user['notify-flags'];
1071         $defloc     = $a->user['default-location'];
1072         $openid     = $a->user['openid'];
1073         $maxreq     = $a->user['maxreq'];
1074         $expire     = ((intval($a->user['expire'])) ? $a->user['expire'] : '');
1075         $blockwall  = $a->user['blockwall'];
1076         $blocktags  = $a->user['blocktags'];
1077         $unkmail    = $a->user['unkmail'];
1078         $cntunkmail = $a->user['cntunkmail'];
1079
1080         $expire_items = get_pconfig(local_user(), 'expire','items');
1081         $expire_items = (($expire_items===false)? '1' : $expire_items); // default if not set: 1
1082
1083         $expire_notes = get_pconfig(local_user(), 'expire','notes');
1084         $expire_notes = (($expire_notes===false)? '1' : $expire_notes); // default if not set: 1
1085
1086         $expire_starred = get_pconfig(local_user(), 'expire','starred');
1087         $expire_starred = (($expire_starred===false)? '1' : $expire_starred); // default if not set: 1
1088
1089         $expire_photos = get_pconfig(local_user(), 'expire','photos');
1090         $expire_photos = (($expire_photos===false)? '0' : $expire_photos); // default if not set: 0
1091
1092         $expire_network_only = get_pconfig(local_user(), 'expire','network_only');
1093         $expire_network_only = (($expire_network_only===false)? '0' : $expire_network_only); // default if not set: 0
1094
1095
1096         $suggestme = get_pconfig(local_user(), 'system','suggestme');
1097         $suggestme = (($suggestme===false)? '0': $suggestme); // default if not set: 0
1098
1099         $post_newfriend = get_pconfig(local_user(), 'system','post_newfriend');
1100         $post_newfriend = (($post_newfriend===false)? '0': $post_newfriend); // default if not set: 0
1101
1102         $post_joingroup = get_pconfig(local_user(), 'system','post_joingroup');
1103         $post_joingroup = (($post_joingroup===false)? '0': $post_joingroup); // default if not set: 0
1104
1105         $post_profilechange = get_pconfig(local_user(), 'system','post_profilechange');
1106         $post_profilechange = (($post_profilechange===false)? '0': $post_profilechange); // default if not set: 0
1107
1108         // nowarn_insecure
1109
1110         if (! strlen($a->user['timezone'])) {
1111                 $timezone = date_default_timezone_get();
1112         }
1113
1114         // Set the account type to "Community" when the page is a community page but the account type doesn't fit
1115         // This is only happening on the first visit after the update
1116         if (in_array($a->user['page-flags'], array(PAGE_COMMUNITY, PAGE_PRVGROUP)) AND
1117                 ($a->user['account-type'] != ACCOUNT_TYPE_COMMUNITY))
1118                 $a->user['account-type'] = ACCOUNT_TYPE_COMMUNITY;
1119
1120         $pageset_tpl = get_markup_template('settings_pagetypes.tpl');
1121
1122         $pagetype = replace_macros($pageset_tpl, array(
1123                 '$account_types'        => t("Account Types"),
1124                 '$user'                 => t("Personal Page Subtypes"),
1125                 '$community'            => t("Community Forum Subtypes"),
1126                 '$account_type'         => $a->user['account-type'],
1127                 '$type_person'          => ACCOUNT_TYPE_PERSON,
1128                 '$type_organisation'    => ACCOUNT_TYPE_ORGANISATION,
1129                 '$type_news'            => ACCOUNT_TYPE_NEWS,
1130                 '$type_community'       => ACCOUNT_TYPE_COMMUNITY,
1131
1132                 '$account_person'       => array('account-type', t('Personal Page'), ACCOUNT_TYPE_PERSON,
1133                                                                         t('This account is a regular personal profile'),
1134                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_PERSON)),
1135
1136                 '$account_organisation' => array('account-type', t('Organisation Page'), ACCOUNT_TYPE_ORGANISATION,
1137                                                                         t('This account is a profile for an organisation'),
1138                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_ORGANISATION)),
1139
1140                 '$account_news'         => array('account-type', t('News Page'), ACCOUNT_TYPE_NEWS,
1141                                                                         t('This account is a news account/reflector'),
1142                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_NEWS)),
1143
1144                 '$account_community'    => array('account-type', t('Community Forum'), ACCOUNT_TYPE_COMMUNITY,
1145                                                                         t('This account is a community forum where people can discuss with each other'),
1146                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_COMMUNITY)),
1147
1148                 '$page_normal'          => array('page-flags', t('Normal Account Page'), PAGE_NORMAL,
1149                                                                         t('This account is a normal personal profile'),
1150                                                                         ($a->user['page-flags'] == PAGE_NORMAL)),
1151
1152                 '$page_soapbox'         => array('page-flags', t('Soapbox Page'), PAGE_SOAPBOX,
1153                                                                         t('Automatically approve all connection/friend requests as read-only fans'),
1154                                                                         ($a->user['page-flags'] == PAGE_SOAPBOX)),
1155
1156                 '$page_community'       => array('page-flags', t('Public Forum'), PAGE_COMMUNITY,
1157                                                                         t('Automatically approve all contact requests'),
1158                                                                         ($a->user['page-flags'] == PAGE_COMMUNITY)),
1159
1160                 '$page_freelove'        => array('page-flags', t('Automatic Friend Page'), PAGE_FREELOVE,
1161                                                                         t('Automatically approve all connection/friend requests as friends'),
1162                                                                         ($a->user['page-flags'] == PAGE_FREELOVE)),
1163
1164                 '$page_prvgroup'        => array('page-flags', t('Private Forum [Experimental]'), PAGE_PRVGROUP,
1165                                                                         t('Private forum - approved members only'),
1166                                                                         ($a->user['page-flags'] == PAGE_PRVGROUP)),
1167
1168
1169         ));
1170
1171         $noid = get_config('system','no_openid');
1172
1173         if ($noid) {
1174                 $openid_field = false;
1175         } else {
1176                 $openid_field = array('openid_url', t('OpenID:'),$openid, t("\x28Optional\x29 Allow this OpenID to login to this account."), "", "", "url");
1177         }
1178
1179         $opt_tpl = get_markup_template("field_yesno.tpl");
1180         if (get_config('system','publish_all')) {
1181                 $profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
1182         } else {
1183                 $profile_in_dir = replace_macros($opt_tpl,array(
1184                         '$field'        => array('profile_in_directory', t('Publish your default profile in your local site directory?'), $profile['publish'], '', array(t('No'),t('Yes'))),
1185                 ));
1186         }
1187
1188         if (strlen(get_config('system','directory'))) {
1189                 $profile_in_net_dir = replace_macros($opt_tpl,array(
1190                         '$field'        => array('profile_in_netdirectory', t('Publish your default profile in the global social directory?'), $profile['net-publish'], '', array(t('No'),t('Yes'))),
1191                 ));
1192         } else {
1193                 $profile_in_net_dir = '';
1194         }
1195
1196         $hide_friends = replace_macros($opt_tpl,array(
1197                         '$field'        => array('hide-friends', t('Hide your contact/friend list from viewers of your default profile?'), $profile['hide-friends'], '', array(t('No'),t('Yes'))),
1198         ));
1199
1200         $hide_wall = replace_macros($opt_tpl,array(
1201                         '$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'))),
1202
1203         ));
1204
1205         $blockwall = replace_macros($opt_tpl,array(
1206                         '$field'        => array('blockwall',  t('Allow friends to post to your profile page?'), (intval($a->user['blockwall']) ? '0' : '1'), '', array(t('No'),t('Yes'))),
1207
1208         ));
1209
1210         $blocktags = replace_macros($opt_tpl,array(
1211                         '$field'        => array('blocktags',  t('Allow friends to tag your posts?'), (intval($a->user['blocktags']) ? '0' : '1'), '', array(t('No'),t('Yes'))),
1212
1213         ));
1214
1215         $suggestme = replace_macros($opt_tpl,array(
1216                         '$field'        => array('suggestme',  t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', array(t('No'),t('Yes'))),
1217
1218         ));
1219
1220         $unkmail = replace_macros($opt_tpl,array(
1221                         '$field'        => array('unkmail',  t('Permit unknown people to send you private mail?'), $unkmail, '', array(t('No'),t('Yes'))),
1222
1223         ));
1224
1225         $invisible = (((! $profile['publish']) && (! $profile['net-publish']))
1226                 ? true : false);
1227
1228         if ($invisible) {
1229                 info( t('Profile is <strong>not published</strong>.') . EOL );
1230         }
1231
1232         //$subdir = ((strlen($a->get_path())) ? '<br />' . t('or') . ' ' . 'profile/' . $nickname : '');
1233
1234         $tpl_addr = get_markup_template("settings_nick_set.tpl");
1235
1236         $prof_addr = replace_macros($tpl_addr,array(
1237                 '$desc' => sprintf(t("Your Identity Address is <strong>'%s'</strong> or '%s'."), $nickname.'@'.$a->get_hostname().$a->get_path(), App::get_baseurl().'/profile/'.$nickname),
1238                 '$basepath' => $a->get_hostname()
1239         ));
1240
1241         $stpl = get_markup_template('settings.tpl');
1242
1243         $expire_arr = array(
1244                 'days' => array('expire',  t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
1245                 'advanced' => t('Advanced expiration settings'),
1246                 'label' => t('Advanced Expiration'),
1247                 'items' => array('expire_items',  t("Expire posts:"), $expire_items, '', array(t('No'),t('Yes'))),
1248                 'notes' => array('expire_notes',  t("Expire personal notes:"), $expire_notes, '', array(t('No'),t('Yes'))),
1249                 'starred' => array('expire_starred',  t("Expire starred posts:"), $expire_starred, '', array(t('No'),t('Yes'))),
1250                 'photos' => array('expire_photos',  t("Expire photos:"), $expire_photos, '', array(t('No'),t('Yes'))),
1251                 'network_only' => array('expire_network_only',  t("Only expire posts by others:"), $expire_network_only, '', array(t('No'),t('Yes'))),
1252         );
1253
1254         require_once('include/group.php');
1255         $group_select = mini_group_select(local_user(),$a->user['def_gid']);
1256
1257         // Private/public post links for the non-JS ACL form
1258         $private_post = 1;
1259         if ($_REQUEST['public']) {
1260                 $private_post = 0;
1261         }
1262
1263         $query_str = $a->query_string;
1264         if (strpos($query_str, 'public=1') !== false) {
1265                 $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
1266         }
1267
1268         // I think $a->query_string may never have ? in it, but I could be wrong
1269         // It looks like it's from the index.php?q=[etc] rewrite that the web
1270         // server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
1271         if (strpos($query_str, '?') === false) {
1272                 $public_post_link = '?public=1';
1273         } else {
1274                 $public_post_link = '&public=1';
1275         }
1276
1277         /* Installed langs */
1278         $lang_choices = get_available_languages();
1279
1280         /// @TODO Fix indending (or so)
1281         $o .= replace_macros($stpl, array(
1282                 '$ptitle'       => t('Account Settings'),
1283
1284                 '$submit'       => t('Save Settings'),
1285                 '$baseurl' => App::get_baseurl(true),
1286                 '$uid' => local_user(),
1287                 '$form_security_token' => get_form_security_token("settings"),
1288                 '$nickname_block' => $prof_addr,
1289
1290                 '$h_pass'       => t('Password Settings'),
1291                 '$password1'=> array('password', t('New Password:'), '', ''),
1292                 '$password2'=> array('confirm', t('Confirm:'), '', t('Leave password fields blank unless changing')),
1293                 '$password3'=> array('opassword', t('Current Password:'), '', t('Your current password to confirm the changes')),
1294                 '$password4'=> array('mpassword', t('Password:'), '', t('Your current password to confirm the changes')),
1295                 '$oid_enable' => (! get_config('system','no_openid')),
1296                 '$openid'       => $openid_field,
1297
1298                 '$h_basic'      => t('Basic Settings'),
1299                 '$username' => array('username',  t('Full Name:'), $username,''),
1300                 '$email'        => array('email', t('Email Address:'), $email, '', '', '', 'email'),
1301                 '$timezone' => array('timezone_select' , t('Your Timezone:'), select_timezone($timezone), ''),
1302                 '$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),
1303                 '$defloc'       => array('defloc', t('Default Post Location:'), $defloc, ''),
1304                 '$allowloc' => array('allow_location', t('Use Browser Location:'), ($a->user['allow_location'] == 1), ''),
1305
1306
1307                 '$h_prv'        => t('Security and Privacy Settings'),
1308
1309                 '$maxreq'       => array('maxreq', t('Maximum Friend Requests/Day:'), $maxreq ,t("\x28to prevent spam abuse\x29")),
1310                 '$permissions' => t('Default Post Permissions'),
1311                 '$permdesc' => t("\x28click to open/close\x29"),
1312                 '$visibility' => $profile['net-publish'],
1313                 '$aclselect' => populate_acl($a->user),
1314                 '$suggestme' => $suggestme,
1315                 '$blockwall'=> $blockwall, // array('blockwall', t('Allow friends to post to your profile page:'), !$blockwall, ''),
1316                 '$blocktags'=> $blocktags, // array('blocktags', t('Allow friends to tag your posts:'), !$blocktags, ''),
1317
1318                 // ACL permissions box
1319                 '$acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector
1320                 '$group_perms' => t('Show to Groups'),
1321                 '$contact_perms' => t('Show to Contacts'),
1322                 '$private' => t('Default Private Post'),
1323                 '$public' => t('Default Public Post'),
1324                 '$is_private' => $private_post,
1325                 '$return_path' => $query_str,
1326                 '$public_link' => $public_post_link,
1327                 '$settings_perms' => t('Default Permissions for New Posts'),
1328
1329                 '$group_select' => $group_select,
1330
1331
1332                 '$expire'       => $expire_arr,
1333
1334                 '$profile_in_dir' => $profile_in_dir,
1335                 '$profile_in_net_dir' => $profile_in_net_dir,
1336                 '$hide_friends' => $hide_friends,
1337                 '$hide_wall' => $hide_wall,
1338                 '$unkmail' => $unkmail,
1339                 '$cntunkmail'   => array('cntunkmail', t('Maximum private messages per day from unknown people:'), $cntunkmail ,t("\x28to prevent spam abuse\x29")),
1340
1341
1342                 '$h_not'        => t('Notification Settings'),
1343                 '$activity_options' => t('By default post a status message when:'),
1344                 '$post_newfriend' => array('post_newfriend',  t('accepting a friend request'), $post_newfriend, ''),
1345                 '$post_joingroup' => array('post_joingroup',  t('joining a forum/community'), $post_joingroup, ''),
1346                 '$post_profilechange' => array('post_profilechange',  t('making an <em>interesting</em> profile change'), $post_profilechange, ''),
1347                 '$lbl_not'      => t('Send a notification email when:'),
1348                 '$notify1'      => array('notify1', t('You receive an introduction'), ($notify & NOTIFY_INTRO), NOTIFY_INTRO, ''),
1349                 '$notify2'      => array('notify2', t('Your introductions are confirmed'), ($notify & NOTIFY_CONFIRM), NOTIFY_CONFIRM, ''),
1350                 '$notify3'      => array('notify3', t('Someone writes on your profile wall'), ($notify & NOTIFY_WALL), NOTIFY_WALL, ''),
1351                 '$notify4'      => array('notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, ''),
1352                 '$notify5'      => array('notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, ''),
1353                 '$notify6'  => array('notify6', t('You receive a friend suggestion'), ($notify & NOTIFY_SUGGEST), NOTIFY_SUGGEST, ''),
1354                 '$notify7'  => array('notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, ''),
1355                 '$notify8'  => array('notify8', t('You are poked/prodded/etc. in a post'), ($notify & NOTIFY_POKE), NOTIFY_POKE, ''),
1356
1357                 '$desktop_notifications' => array('desktop_notifications', t('Activate desktop notifications') , false, t('Show desktop popup on new notifications')),
1358
1359                 '$email_textonly' => array('email_textonly', t('Text-only notification emails'),
1360                                                                         get_pconfig(local_user(),'system','email_textonly'),
1361                                                                         t('Send text only notification emails, without the html part')),
1362
1363                 '$h_advn' => t('Advanced Account/Page Type Settings'),
1364                 '$h_descadvn' => t('Change the behaviour of this account for special situations'),
1365                 '$pagetype' => $pagetype,
1366
1367                 '$relocate' => t('Relocate'),
1368                 '$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."),
1369                 '$relocate_button' => t("Resend relocate message to contacts"),
1370
1371         ));
1372
1373         call_hooks('settings_form',$o);
1374
1375         $o .= '</form>' . "\r\n";
1376
1377         return $o;
1378
1379 }