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