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