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