]> git.mxchange.org Git - friendica.git/blob - mod/settings.php
ff05724fed74b2048a9391bac3358be08b956688
[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) AND !in_array($page_flags, array(PAGE_NORMAL, PAGE_SOAPBOX, PAGE_FREELOVE)))
466                 $page_flags = PAGE_NORMAL;
467         elseif (($account_type == ACCOUNT_TYPE_ORGANISATION) AND !in_array($page_flags, array(PAGE_SOAPBOX)))
468                 $page_flags = PAGE_SOAPBOX;
469         elseif (($account_type == ACCOUNT_TYPE_NEWS) AND !in_array($page_flags, array(PAGE_SOAPBOX)))
470                 $page_flags = PAGE_SOAPBOX;
471         elseif (($account_type == ACCOUNT_TYPE_COMMUNITY) AND !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         require_once('include/profile_update.php');
641         profile_change();
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(App::get_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'      => App::get_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='.App::get_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="'.App::get_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 or ($is_experimental && (get_config('experimentals','exp_themes')==1 or 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' => App::get_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, '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)) AND
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('This account is a regular 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('This account is a profile for an organisation'),
1127                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_ORGANISATION)),
1128
1129                 '$account_news'         => array('account-type', t('News Page'), ACCOUNT_TYPE_NEWS,
1130                                                                         t('This account is a news account/reflector'),
1131                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_NEWS)),
1132
1133                 '$account_community'    => array('account-type', t('Community Forum'), ACCOUNT_TYPE_COMMUNITY,
1134                                                                         t('This account is a community forum where people can discuss with each other'),
1135                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_COMMUNITY)),
1136
1137                 '$page_normal'          => array('page-flags', t('Normal Account Page'), PAGE_NORMAL,
1138                                                                         t('This account is a normal personal profile'),
1139                                                                         ($a->user['page-flags'] == PAGE_NORMAL)),
1140
1141                 '$page_soapbox'         => array('page-flags', t('Soapbox Page'), PAGE_SOAPBOX,
1142                                                                         t('Automatically approve all connection/friend requests as read-only fans'),
1143                                                                         ($a->user['page-flags'] == PAGE_SOAPBOX)),
1144
1145                 '$page_community'       => array('page-flags', t('Public Forum'), PAGE_COMMUNITY,
1146                                                                         t('Automatically approve 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('Automatically approve all connection/friend 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('Private forum - approved members only'),
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(), App::get_baseurl().'/profile/'.$nickname),
1227                 '$basepath' => $a->get_hostname()
1228         ));
1229
1230         $stpl = get_markup_template('settings.tpl');
1231
1232         $expire_arr = array(
1233                 'days' => array('expire',  t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
1234                 'advanced' => t('Advanced expiration settings'),
1235                 'label' => t('Advanced Expiration'),
1236                 'items' => array('expire_items',  t("Expire posts:"), $expire_items, '', array(t('No'), t('Yes'))),
1237                 'notes' => array('expire_notes',  t("Expire personal notes:"), $expire_notes, '', array(t('No'), t('Yes'))),
1238                 'starred' => array('expire_starred',  t("Expire starred posts:"), $expire_starred, '', array(t('No'), t('Yes'))),
1239                 'photos' => array('expire_photos',  t("Expire photos:"), $expire_photos, '', array(t('No'), t('Yes'))),
1240                 'network_only' => array('expire_network_only',  t("Only expire posts by others:"), $expire_network_only, '', array(t('No'), t('Yes'))),
1241         );
1242
1243         require_once('include/group.php');
1244         $group_select = mini_group_select(local_user(),$a->user['def_gid']);
1245
1246         // Private/public post links for the non-JS ACL form
1247         $private_post = 1;
1248         if ($_REQUEST['public']) {
1249                 $private_post = 0;
1250         }
1251
1252         $query_str = $a->query_string;
1253         if (strpos($query_str, 'public=1') !== false) {
1254                 $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
1255         }
1256
1257         // I think $a->query_string may never have ? in it, but I could be wrong
1258         // It looks like it's from the index.php?q=[etc] rewrite that the web
1259         // server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
1260         if (strpos($query_str, '?') === false) {
1261                 $public_post_link = '?public=1';
1262         } else {
1263                 $public_post_link = '&public=1';
1264         }
1265
1266         /* Installed langs */
1267         $lang_choices = get_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' => App::get_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 }