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