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