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