]> git.mxchange.org Git - friendica.git/blob - mod/settings.php
d128ad5a757ace343954b307dba2db9a035983e0
[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']) && strlen($timezone)) {
525                 date_default_timezone_set($timezone);
526         }
527
528         $str_group_allow   = perms2str($_POST['group_allow']);
529         $str_contact_allow = perms2str($_POST['contact_allow']);
530         $str_group_deny    = perms2str($_POST['group_deny']);
531         $str_contact_deny  = perms2str($_POST['contact_deny']);
532
533         $openidserver = $a->user['openidserver'];
534         //$openid = normalise_openid($openid);
535
536         // If openid has changed or if there's an openid but no openidserver, try and discover it.
537
538         if ($openid != $a->user['openid'] || (strlen($openid) && (!strlen($openidserver)))) {
539                 $tmp_str = $openid;
540                 if (strlen($tmp_str) && validate_url($tmp_str)) {
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                         proc_run(PRIORITY_LOW, "include/directory.php", $url);
645                 }
646         }
647
648         proc_run(PRIORITY_LOW, 'include/profile_update.php', local_user());
649
650         // Update the global contact for the user
651         update_gcontact_for_user(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 = get_features();
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_enabled(local_user(), $f[0]))) ? "1" : ''), $f[2],array(t('Off'), t('On')));
792                         }
793                 }
794
795
796                 $tpl = get_markup_template("settings_features.tpl");
797                 $o .= replace_macros($tpl, array(
798                         '$form_security_token' => get_form_security_token("settings_features"),
799                         '$title'               => t('Additional Features'),
800                         '$features'            => $arr,
801                         '$submit'              => t('Save Settings'),
802                 ));
803                 return $o;
804         }
805
806         if (($a->argc > 1) && ($a->argv[1] === 'connectors')) {
807
808                 $settings_connectors = '<span id="settings_general_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_general_expanded\'); openClose(\'settings_general_inflated\');">';
809                 $settings_connectors .= '<h3 class="connector">'. t('General Social Media Settings').'</h3>';
810                 $settings_connectors .= '</span>';
811                 $settings_connectors .= '<div id="settings_general_expanded" class="settings-block" style="display: none;">';
812                 $settings_connectors .= '<span class="fakelink" onclick="openClose(\'settings_general_expanded\'); openClose(\'settings_general_inflated\');">';
813                 $settings_connectors .= '<h3 class="connector">'. t('General Social Media Settings').'</h3>';
814                 $settings_connectors .= '</span>';
815
816                 $checked = ((PConfig::get(local_user(), 'system', 'no_intelligent_shortening')) ? ' checked="checked" ' : '');
817
818                 $settings_connectors .= '<div id="no_intelligent_shortening" class="field checkbox">';
819                 $settings_connectors .= '<label id="no_intelligent_shortening-label" for="shortening-checkbox">'. t('Disable intelligent shortening'). '</label>';
820                 $settings_connectors .= '<input id="shortening-checkbox" type="checkbox" name="no_intelligent_shortening" value="1" ' . $checked . '/>';
821                 $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>';
822                 $settings_connectors .= '</div>';
823
824                 $checked = ((PConfig::get(local_user(), 'system', 'ostatus_autofriend')) ? ' checked="checked" ' : '');
825
826                 $settings_connectors .= '<div id="snautofollow-wrapper" class="field checkbox">';
827                 $settings_connectors .= '<label id="snautofollow-label" for="snautofollow-checkbox">'. t('Automatically follow any GNU Social (OStatus) followers/mentioners'). '</label>';
828                 $settings_connectors .= '<input id="snautofollow-checkbox" type="checkbox" name="snautofollow" value="1" ' . $checked . '/>';
829                 $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>';
830                 $settings_connectors .= '</div>';
831
832                 $default_group = PConfig::get(local_user(), 'ostatus', 'default_group');
833                 $legacy_contact = PConfig::get(local_user(), 'ostatus', 'legacy_contact');
834
835                 $settings_connectors .= mini_group_select(local_user(), $default_group, t("Default group for OStatus contacts"));
836
837                 /// @TODO Found to much different usage to test empty/non-empty strings (e.g. empty(), trim() == '') which is wanted?
838                 if ($legacy_contact != "") {
839                         $a->page['htmlhead'] = '<meta http-equiv="refresh" content="0; URL='.System::baseUrl().'/ostatus_subscribe?url='.urlencode($legacy_contact).'">';
840                 }
841
842                 $settings_connectors .= '<div id="legacy-contact-wrapper" class="field input">';
843                 $settings_connectors .= '<label id="legacy-contact-label" for="snautofollow-checkbox">'. t('Your legacy GNU Social account'). '</label>';
844                 $settings_connectors .= '<input id="legacy-contact-checkbox" name="legacy_contact" value="'.$legacy_contact.'"/>';
845                 $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>';
846                 $settings_connectors .= '</div>';
847
848                 $settings_connectors .= '<p><a href="'.System::baseUrl().'/repair_ostatus">'.t("Repair OStatus subscriptions").'</a></p>';
849
850                 $settings_connectors .= '<div class="settings-submit-wrapper" ><input type="submit" name="general-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
851
852                 $settings_connectors .= '</div><div class="clear"></div>';
853
854                 call_hooks('connector_settings', $settings_connectors);
855
856                 if (is_site_admin()) {
857                         $diasp_enabled = sprintf(t('Built-in support for %s connectivity is %s'), t('Diaspora'), ((Config::get('system', 'diaspora_enabled')) ? t('enabled') : t('disabled')));
858                         $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')));
859                 } else {
860                         $diasp_enabled = "";
861                         $ostat_enabled = "";
862                 }
863
864                 $mail_disabled = ((function_exists('imap_open') && (!Config::get('system', 'imap_disabled'))) ? 0 : 1);
865                 if (Config::get('system', 'dfrn_only')) {
866                         $mail_disabled = 1;
867                 }
868                 if (!$mail_disabled) {
869                         $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
870                                 local_user()
871                         );
872                 } else {
873                         $r = null;
874                 }
875
876                 $mail_server       = ((dbm::is_result($r)) ? $r[0]['server'] : '');
877                 $mail_port         = ((dbm::is_result($r) && intval($r[0]['port'])) ? intval($r[0]['port']) : '');
878                 $mail_ssl          = ((dbm::is_result($r)) ? $r[0]['ssltype'] : '');
879                 $mail_user         = ((dbm::is_result($r)) ? $r[0]['user'] : '');
880                 $mail_replyto      = ((dbm::is_result($r)) ? $r[0]['reply_to'] : '');
881                 $mail_pubmail      = ((dbm::is_result($r)) ? $r[0]['pubmail'] : 0);
882                 $mail_action       = ((dbm::is_result($r)) ? $r[0]['action'] : 0);
883                 $mail_movetofolder = ((dbm::is_result($r)) ? $r[0]['movetofolder'] : '');
884                 $mail_chk          = ((dbm::is_result($r)) ? $r[0]['last_check'] : NULL_DATE);
885
886
887                 $tpl = get_markup_template("settings_connectors.tpl");
888
889                 $mail_disabled_message = (($mail_disabled) ? t('Email access is disabled on this site.') : '');
890
891                 $o .= replace_macros($tpl, array(
892                         '$form_security_token' => get_form_security_token("settings_connectors"),
893
894                         '$title'        => t('Social Networks'),
895
896                         '$diasp_enabled' => $diasp_enabled,
897                         '$ostat_enabled' => $ostat_enabled,
898
899                         '$h_imap' => t('Email/Mailbox Setup'),
900                         '$imap_desc' => t("If you wish to communicate with email contacts using this service \x28optional\x29, please specify how to connect to your mailbox."),
901                         '$imap_lastcheck' => array('imap_lastcheck', t('Last successful email check:'), $mail_chk, ''),
902                         '$mail_disabled' => $mail_disabled_message,
903                         '$mail_server'  => array('mail_server',  t('IMAP server name:'), $mail_server, ''),
904                         '$mail_port'    => array('mail_port',    t('IMAP port:'), $mail_port, ''),
905                         '$mail_ssl'             => array('mail_ssl',     t('Security:'), strtoupper($mail_ssl), '', array('notls'=>t('None'), 'TLS'=>'TLS', 'SSL'=>'SSL')),
906                         '$mail_user'    => array('mail_user',    t('Email login name:'), $mail_user, ''),
907                         '$mail_pass'    => array('mail_pass',    t('Email password:'), '', ''),
908                         '$mail_replyto' => array('mail_replyto', t('Reply-to address:'), $mail_replyto, 'Optional'),
909                         '$mail_pubmail' => array('mail_pubmail', t('Send public posts to all email contacts:'), $mail_pubmail, ''),
910                         '$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'))),
911                         '$mail_movetofolder'    => array('mail_movetofolder',    t('Move to folder:'), $mail_movetofolder, ''),
912                         '$submit' => t('Save Settings'),
913
914                         '$settings_connectors' => $settings_connectors
915                 ));
916
917                 call_hooks('display_settings', $o);
918                 return $o;
919         }
920
921         /*
922          * DISPLAY SETTINGS
923          */
924         if (($a->argc > 1) && ($a->argv[1] === 'display')) {
925                 $default_theme = Config::get('system', 'theme');
926                 if (!$default_theme) {
927                         $default_theme = 'default';
928                 }
929                 $default_mobile_theme = Config::get('system', 'mobile-theme');
930                 if (!$mobile_default_theme) {
931                         $mobile_default_theme = 'none';
932                 }
933
934                 $allowed_themes_str = Config::get('system', 'allowed_themes');
935                 $allowed_themes_raw = explode(',', $allowed_themes_str);
936                 $allowed_themes = array();
937                 if (count($allowed_themes_raw)) {
938                         foreach ($allowed_themes_raw as $x) {
939                                 if (strlen(trim($x)) && is_dir("view/theme/$x")) {
940                                         $allowed_themes[] = trim($x);
941                                 }
942                         }
943                 }
944
945
946                 $themes = array();
947                 $mobile_themes = array("---" => t('No special theme for mobile devices'));
948                 $files = glob('view/theme/*'); /* */
949                 if ($allowed_themes) {
950                         foreach ($allowed_themes as $th) {
951                                 $f = $th;
952                                 $is_experimental = file_exists('view/theme/' . $th . '/experimental');
953                                 $unsupported = file_exists('view/theme/' . $th . '/unsupported');
954                                 $is_mobile = file_exists('view/theme/' . $th . '/mobile');
955                                 if (!$is_experimental || ($is_experimental && (Config::get('experimentals', 'exp_themes')==1 || Config::get('experimentals', 'exp_themes')===false))) {
956                                         $theme_name = (($is_experimental) ?  sprintf("%s - \x28Experimental\x29", $f) : $f);
957                                         if ($is_mobile) {
958                                                 $mobile_themes[$f]=$theme_name;
959                                         } else {
960                                                 $themes[$f]=$theme_name;
961                                         }
962                                 }
963                         }
964                 }
965                 $theme_selected = (!x($_SESSION, 'theme')? $default_theme : $_SESSION['theme']);
966                 $mobile_theme_selected = (!x($_SESSION, 'mobile-theme')? $default_mobile_theme : $_SESSION['mobile-theme']);
967
968                 $nowarn_insecure = intval(PConfig::get(local_user(), 'system', 'nowarn_insecure'));
969
970                 $browser_update = intval(PConfig::get(local_user(), 'system', 'update_interval'));
971                 if (intval($browser_update) != -1) {
972                         $browser_update = (($browser_update == 0) ? 40 : $browser_update / 1000); // default if not set: 40 seconds
973                 }
974
975                 $itemspage_network = intval(PConfig::get(local_user(), 'system', 'itemspage_network'));
976                 $itemspage_network = (($itemspage_network > 0 && $itemspage_network < 101) ? $itemspage_network : 40); // default if not set: 40 items
977                 $itemspage_mobile_network = intval(PConfig::get(local_user(), 'system', 'itemspage_mobile_network'));
978                 $itemspage_mobile_network = (($itemspage_mobile_network > 0 && $itemspage_mobile_network < 101) ? $itemspage_mobile_network : 20); // default if not set: 20 items
979
980                 $nosmile = PConfig::get(local_user(), 'system', 'no_smilies');
981                 $nosmile = (($nosmile===false)? '0': $nosmile); // default if not set: 0
982
983                 $first_day_of_week = PConfig::get(local_user(), 'system', 'first_day_of_week');
984                 $first_day_of_week = (($first_day_of_week===false)? '0': $first_day_of_week); // default if not set: 0
985                 $weekdays = array(0 => t("Sunday"), 1 => t("Monday"));
986
987                 $noinfo = PConfig::get(local_user(), 'system', 'ignore_info');
988                 $noinfo = (($noinfo===false)? '0': $noinfo); // default if not set: 0
989
990                 $infinite_scroll = PConfig::get(local_user(), 'system', 'infinite_scroll');
991                 $infinite_scroll = (($infinite_scroll===false)? '0': $infinite_scroll); // default if not set: 0
992
993                 $no_auto_update = PConfig::get(local_user(), 'system', 'no_auto_update');
994                 $no_auto_update = (($no_auto_update===false)? '0': $no_auto_update); // default if not set: 0
995
996                 $bandwidth_saver = PConfig::get(local_user(), 'system', 'bandwidth_saver');
997                 $bandwidth_saver = (($bandwidth_saver === false) ? '0' : $bandwidth_saver); // default if not set: 0
998
999                 $theme_config = "";
1000                 if (($themeconfigfile = get_theme_config_file($theme_selected)) != null) {
1001                         require_once($themeconfigfile);
1002                         $theme_config = theme_content($a);
1003                 }
1004
1005                 $tpl = get_markup_template("settings_display.tpl");
1006                 $o = replace_macros($tpl, array(
1007                         '$ptitle'       => t('Display Settings'),
1008                         '$form_security_token' => get_form_security_token("settings_display"),
1009                         '$submit'       => t('Save Settings'),
1010                         '$baseurl' => System::baseUrl(true),
1011                         '$uid' => local_user(),
1012
1013                         '$theme'        => array('theme', t('Display Theme:'), $theme_selected, '', $themes, true),
1014                         '$mobile_theme' => array('mobile_theme', t('Mobile Theme:'), $mobile_theme_selected, '', $mobile_themes, false),
1015                         '$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.")),
1016                         '$ajaxint'   => array('browser_update',  t("Update browser every xx seconds"), $browser_update, t('Minimum of 10 seconds. Enter -1 to disable it.')),
1017                         '$itemspage_network'   => array('itemspage_network',  t("Number of items to display per page:"), $itemspage_network, t('Maximum of 100 items')),
1018                         '$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')),
1019                         '$nosmile'      => array('nosmile', t("Don't show emoticons"), $nosmile, ''),
1020                         '$calendar_title' => t('Calendar'),
1021                         '$first_day_of_week'    => array('first_day_of_week', t('Beginning of week:'), $first_day_of_week, '', $weekdays, false),
1022                         '$noinfo'       => array('noinfo', t("Don't show notices"), $noinfo, ''),
1023                         '$infinite_scroll'      => array('infinite_scroll', t("Infinite scroll"), $infinite_scroll, ''),
1024                         '$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.')),
1025                         '$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.')),
1026
1027                         '$d_tset' => t('General Theme Settings'),
1028                         '$d_ctset' => t('Custom Theme Settings'),
1029                         '$d_cset' => t('Content Settings'),
1030                         'stitle' => t('Theme settings'),
1031                         '$theme_config' => $theme_config,
1032                 ));
1033
1034                 $tpl = get_markup_template("settings_display_end.tpl");
1035                 $a->page['end'] .= replace_macros($tpl, array(
1036                         '$theme'        => array('theme', t('Display Theme:'), $theme_selected, '', $themes)
1037                 ));
1038
1039                 return $o;
1040         }
1041
1042
1043         /*
1044          * ACCOUNT SETTINGS
1045          */
1046
1047         require_once('include/acl_selectors.php');
1048
1049         $p = q("SELECT * FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1",
1050                 intval(local_user())
1051         );
1052         if (count($p)) {
1053                 $profile = $p[0];
1054         }
1055
1056         $username   = $a->user['username'];
1057         $email      = $a->user['email'];
1058         $nickname   = $a->user['nickname'];
1059         $timezone   = $a->user['timezone'];
1060         $language   = $a->user['language'];
1061         $notify     = $a->user['notify-flags'];
1062         $defloc     = $a->user['default-location'];
1063         $openid     = $a->user['openid'];
1064         $maxreq     = $a->user['maxreq'];
1065         $expire     = ((intval($a->user['expire'])) ? $a->user['expire'] : '');
1066         $blockwall  = $a->user['blockwall'];
1067         $blocktags  = $a->user['blocktags'];
1068         $unkmail    = $a->user['unkmail'];
1069         $cntunkmail = $a->user['cntunkmail'];
1070
1071         $expire_items = PConfig::get(local_user(), 'expire', 'items', true);
1072         $expire_notes = PConfig::get(local_user(), 'expire', 'notes', true);
1073         $expire_starred = PConfig::get(local_user(), 'expire', 'starred', true);
1074         $expire_photos = PConfig::get(local_user(), 'expire', 'photos', false);
1075         $expire_network_only = PConfig::get(local_user(), 'expire', 'network_only', false);
1076         $suggestme = PConfig::get(local_user(), 'system', 'suggestme', false);
1077         $post_newfriend = PConfig::get(local_user(), 'system', 'post_newfriend', false);
1078         $post_joingroup = PConfig::get(local_user(), 'system', 'post_joingroup', false);
1079         $post_profilechange = PConfig::get(local_user(), 'system', 'post_profilechange', false);
1080
1081         // nowarn_insecure
1082
1083         if (!strlen($a->user['timezone'])) {
1084                 $timezone = date_default_timezone_get();
1085         }
1086
1087         // Set the account type to "Community" when the page is a community page but the account type doesn't fit
1088         // This is only happening on the first visit after the update
1089         if (in_array($a->user['page-flags'], array(PAGE_COMMUNITY, PAGE_PRVGROUP)) &&
1090                 ($a->user['account-type'] != ACCOUNT_TYPE_COMMUNITY))
1091                 $a->user['account-type'] = ACCOUNT_TYPE_COMMUNITY;
1092
1093         $pageset_tpl = get_markup_template('settings_pagetypes.tpl');
1094
1095         $pagetype = replace_macros($pageset_tpl, array(
1096                 '$account_types'        => t("Account Types"),
1097                 '$user'                 => t("Personal Page Subtypes"),
1098                 '$community'            => t("Community Forum Subtypes"),
1099                 '$account_type'         => $a->user['account-type'],
1100                 '$type_person'          => ACCOUNT_TYPE_PERSON,
1101                 '$type_organisation'    => ACCOUNT_TYPE_ORGANISATION,
1102                 '$type_news'            => ACCOUNT_TYPE_NEWS,
1103                 '$type_community'       => ACCOUNT_TYPE_COMMUNITY,
1104
1105                 '$account_person'       => array('account-type', t('Personal Page'), ACCOUNT_TYPE_PERSON,
1106                                                                         t('Account for a personal profile.'),
1107                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_PERSON)),
1108
1109                 '$account_organisation' => array('account-type', t('Organisation Page'), ACCOUNT_TYPE_ORGANISATION,
1110                                                                         t('Account for an organisation that automatically approves contact requests as "Followers".'),
1111                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_ORGANISATION)),
1112
1113                 '$account_news'         => array('account-type', t('News Page'), ACCOUNT_TYPE_NEWS,
1114                                                                         t('Account for a news reflector that automatically approves contact requests as "Followers".'),
1115                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_NEWS)),
1116
1117                 '$account_community'    => array('account-type', t('Community Forum'), ACCOUNT_TYPE_COMMUNITY,
1118                                                                         t('Account for community discussions.'),
1119                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_COMMUNITY)),
1120
1121                 '$page_normal'          => array('page-flags', t('Normal Account Page'), PAGE_NORMAL,
1122                                                                         t('Account for a regular personal profile that requires manual approval of "Friends" and "Followers".'),
1123                                                                         ($a->user['page-flags'] == PAGE_NORMAL)),
1124
1125                 '$page_soapbox'         => array('page-flags', t('Soapbox Page'), PAGE_SOAPBOX,
1126                                                                         t('Account for a public profile that automatically approves contact requests as "Followers".'),
1127                                                                         ($a->user['page-flags'] == PAGE_SOAPBOX)),
1128
1129                 '$page_community'       => array('page-flags', t('Public Forum'), PAGE_COMMUNITY,
1130                                                                         t('Automatically approves all contact requests.'),
1131                                                                         ($a->user['page-flags'] == PAGE_COMMUNITY)),
1132
1133                 '$page_freelove'        => array('page-flags', t('Automatic Friend Page'), PAGE_FREELOVE,
1134                                                                         t('Account for a popular profile that automatically approves contact requests as "Friends".'),
1135                                                                         ($a->user['page-flags'] == PAGE_FREELOVE)),
1136
1137                 '$page_prvgroup'        => array('page-flags', t('Private Forum [Experimental]'), PAGE_PRVGROUP,
1138                                                                         t('Requires manual approval of contact requests.'),
1139                                                                         ($a->user['page-flags'] == PAGE_PRVGROUP)),
1140
1141
1142         ));
1143
1144         $noid = Config::get('system', 'no_openid');
1145
1146         if ($noid) {
1147                 $openid_field = false;
1148         } else {
1149                 $openid_field = array('openid_url', t('OpenID:'), $openid, t("\x28Optional\x29 Allow this OpenID to login to this account."), "", "", "url");
1150         }
1151
1152         $opt_tpl = get_markup_template("field_yesno.tpl");
1153         if (Config::get('system', 'publish_all')) {
1154                 $profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
1155         } else {
1156                 $profile_in_dir = replace_macros($opt_tpl, array(
1157                         '$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')))
1158                 ));
1159         }
1160
1161         if (strlen(Config::get('system', 'directory'))) {
1162                 $profile_in_net_dir = replace_macros($opt_tpl, array(
1163                         '$field' => array('profile_in_netdirectory', t('Publish your default profile in the global social directory?'), $profile['net-publish'], '', array(t('No'), t('Yes')))
1164                 ));
1165         } else {
1166                 $profile_in_net_dir = '';
1167         }
1168
1169         $hide_friends = replace_macros($opt_tpl,array(
1170                         '$field'        => array('hide-friends', t('Hide your contact/friend list from viewers of your default profile?'), $profile['hide-friends'], '', array(t('No'), t('Yes'))),
1171         ));
1172
1173         $hide_wall = replace_macros($opt_tpl,array(
1174                         '$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'))),
1175
1176         ));
1177
1178         $blockwall = replace_macros($opt_tpl,array(
1179                         '$field'        => array('blockwall',  t('Allow friends to post to your profile page?'), (intval($a->user['blockwall']) ? '0' : '1'), '', array(t('No'), t('Yes'))),
1180
1181         ));
1182
1183         $blocktags = replace_macros($opt_tpl,array(
1184                         '$field'        => array('blocktags',  t('Allow friends to tag your posts?'), (intval($a->user['blocktags']) ? '0' : '1'), '', array(t('No'), t('Yes'))),
1185
1186         ));
1187
1188         $suggestme = replace_macros($opt_tpl,array(
1189                         '$field'        => array('suggestme',  t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', array(t('No'), t('Yes'))),
1190
1191         ));
1192
1193         $unkmail = replace_macros($opt_tpl,array(
1194                         '$field'        => array('unkmail',  t('Permit unknown people to send you private mail?'), $unkmail, '', array(t('No'), t('Yes'))),
1195
1196         ));
1197
1198         $invisible = (((!$profile['publish']) && (!$profile['net-publish']))
1199                 ? true : false);
1200
1201         if ($invisible) {
1202                 info(t('Profile is <strong>not published</strong>.') . EOL);
1203         }
1204
1205         //$subdir = ((strlen($a->get_path())) ? '<br />' . t('or') . ' ' . 'profile/' . $nickname : '');
1206
1207         $tpl_addr = get_markup_template("settings_nick_set.tpl");
1208
1209         $prof_addr = replace_macros($tpl_addr,array(
1210                 '$desc' => sprintf(t("Your Identity Address is <strong>'%s'</strong> or '%s'."), $nickname.'@'.$a->get_hostname().$a->get_path(), System::baseUrl().'/profile/'.$nickname),
1211                 '$basepath' => $a->get_hostname()
1212         ));
1213
1214         $stpl = get_markup_template('settings.tpl');
1215
1216         $expire_arr = array(
1217                 'days' => array('expire',  t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
1218                 'advanced' => t('Advanced expiration settings'),
1219                 'label' => t('Advanced Expiration'),
1220                 'items' => array('expire_items',  t("Expire posts:"), $expire_items, '', array(t('No'), t('Yes'))),
1221                 'notes' => array('expire_notes',  t("Expire personal notes:"), $expire_notes, '', array(t('No'), t('Yes'))),
1222                 'starred' => array('expire_starred',  t("Expire starred posts:"), $expire_starred, '', array(t('No'), t('Yes'))),
1223                 'photos' => array('expire_photos',  t("Expire photos:"), $expire_photos, '', array(t('No'), t('Yes'))),
1224                 'network_only' => array('expire_network_only',  t("Only expire posts by others:"), $expire_network_only, '', array(t('No'), t('Yes'))),
1225         );
1226
1227         require_once('include/group.php');
1228         $group_select = mini_group_select(local_user(), $a->user['def_gid']);
1229
1230         // Private/public post links for the non-JS ACL form
1231         $private_post = 1;
1232         if ($_REQUEST['public']) {
1233                 $private_post = 0;
1234         }
1235
1236         $query_str = $a->query_string;
1237         if (strpos($query_str, 'public=1') !== false) {
1238                 $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
1239         }
1240
1241         // I think $a->query_string may never have ? in it, but I could be wrong
1242         // It looks like it's from the index.php?q=[etc] rewrite that the web
1243         // server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
1244         if (strpos($query_str, '?') === false) {
1245                 $public_post_link = '?public=1';
1246         } else {
1247                 $public_post_link = '&public=1';
1248         }
1249
1250         /* Installed langs */
1251         $lang_choices = get_available_languages();
1252
1253         /// @TODO Fix indending (or so)
1254         $o .= replace_macros($stpl, array(
1255                 '$ptitle'       => t('Account Settings'),
1256
1257                 '$submit'       => t('Save Settings'),
1258                 '$baseurl' => System::baseUrl(true),
1259                 '$uid' => local_user(),
1260                 '$form_security_token' => get_form_security_token("settings"),
1261                 '$nickname_block' => $prof_addr,
1262
1263                 '$h_pass'       => t('Password Settings'),
1264                 '$password1'=> array('password', t('New Password:'), '', ''),
1265                 '$password2'=> array('confirm', t('Confirm:'), '', t('Leave password fields blank unless changing')),
1266                 '$password3'=> array('opassword', t('Current Password:'), '', t('Your current password to confirm the changes')),
1267                 '$password4'=> array('mpassword', t('Password:'), '', t('Your current password to confirm the changes')),
1268                 '$oid_enable' => (!Config::get('system', 'no_openid')),
1269                 '$openid'       => $openid_field,
1270
1271                 '$h_basic'      => t('Basic Settings'),
1272                 '$username' => array('username',  t('Full Name:'), $username, ''),
1273                 '$email'        => array('email', t('Email Address:'), $email, '', '', '', 'email'),
1274                 '$timezone' => array('timezone_select' , t('Your Timezone:'), select_timezone($timezone), ''),
1275                 '$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),
1276                 '$defloc'       => array('defloc', t('Default Post Location:'), $defloc, ''),
1277                 '$allowloc' => array('allow_location', t('Use Browser Location:'), ($a->user['allow_location'] == 1), ''),
1278
1279
1280                 '$h_prv'        => t('Security and Privacy Settings'),
1281
1282                 '$maxreq'       => array('maxreq', t('Maximum Friend Requests/Day:'), $maxreq , t("\x28to prevent spam abuse\x29")),
1283                 '$permissions' => t('Default Post Permissions'),
1284                 '$permdesc' => t("\x28click to open/close\x29"),
1285                 '$visibility' => $profile['net-publish'],
1286                 '$aclselect' => populate_acl($a->user),
1287                 '$suggestme' => $suggestme,
1288                 '$blockwall'=> $blockwall, // array('blockwall', t('Allow friends to post to your profile page:'), !$blockwall, ''),
1289                 '$blocktags'=> $blocktags, // array('blocktags', t('Allow friends to tag your posts:'), !$blocktags, ''),
1290
1291                 // ACL permissions box
1292                 '$acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector
1293                 '$group_perms' => t('Show to Groups'),
1294                 '$contact_perms' => t('Show to Contacts'),
1295                 '$private' => t('Default Private Post'),
1296                 '$public' => t('Default Public Post'),
1297                 '$is_private' => $private_post,
1298                 '$return_path' => $query_str,
1299                 '$public_link' => $public_post_link,
1300                 '$settings_perms' => t('Default Permissions for New Posts'),
1301
1302                 '$group_select' => $group_select,
1303
1304
1305                 '$expire'       => $expire_arr,
1306
1307                 '$profile_in_dir' => $profile_in_dir,
1308                 '$profile_in_net_dir' => $profile_in_net_dir,
1309                 '$hide_friends' => $hide_friends,
1310                 '$hide_wall' => $hide_wall,
1311                 '$unkmail' => $unkmail,
1312                 '$cntunkmail'   => array('cntunkmail', t('Maximum private messages per day from unknown people:'), $cntunkmail , t("\x28to prevent spam abuse\x29")),
1313
1314
1315                 '$h_not'        => t('Notification Settings'),
1316                 '$activity_options' => t('By default post a status message when:'),
1317                 '$post_newfriend' => array('post_newfriend',  t('accepting a friend request'), $post_newfriend, ''),
1318                 '$post_joingroup' => array('post_joingroup',  t('joining a forum/community'), $post_joingroup, ''),
1319                 '$post_profilechange' => array('post_profilechange',  t('making an <em>interesting</em> profile change'), $post_profilechange, ''),
1320                 '$lbl_not'      => t('Send a notification email when:'),
1321                 '$notify1'      => array('notify1', t('You receive an introduction'), ($notify & NOTIFY_INTRO), NOTIFY_INTRO, ''),
1322                 '$notify2'      => array('notify2', t('Your introductions are confirmed'), ($notify & NOTIFY_CONFIRM), NOTIFY_CONFIRM, ''),
1323                 '$notify3'      => array('notify3', t('Someone writes on your profile wall'), ($notify & NOTIFY_WALL), NOTIFY_WALL, ''),
1324                 '$notify4'      => array('notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, ''),
1325                 '$notify5'      => array('notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, ''),
1326                 '$notify6'  => array('notify6', t('You receive a friend suggestion'), ($notify & NOTIFY_SUGGEST), NOTIFY_SUGGEST, ''),
1327                 '$notify7'  => array('notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, ''),
1328                 '$notify8'  => array('notify8', t('You are poked/prodded/etc. in a post'), ($notify & NOTIFY_POKE), NOTIFY_POKE, ''),
1329
1330                 '$desktop_notifications' => array('desktop_notifications', t('Activate desktop notifications') , false, t('Show desktop popup on new notifications')),
1331
1332                 '$email_textonly' => array('email_textonly', t('Text-only notification emails'),
1333                                                                         PConfig::get(local_user(), 'system', 'email_textonly'),
1334                                                                         t('Send text only notification emails, without the html part')),
1335
1336                 '$detailed_notif' => array('detailed_notif', t('Show detailled notifications'),
1337                                                                         PConfig::get(local_user(), 'system', 'detailed_notif'),
1338                                                                         t('Per default the notificiation are condensed to a single notification per item. When enabled, every notification is displayed.')),
1339
1340                 '$h_advn' => t('Advanced Account/Page Type Settings'),
1341                 '$h_descadvn' => t('Change the behaviour of this account for special situations'),
1342                 '$pagetype' => $pagetype,
1343
1344                 '$relocate' => t('Relocate'),
1345                 '$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."),
1346                 '$relocate_button' => t("Resend relocate message to contacts"),
1347
1348         ));
1349
1350         call_hooks('settings_form', $o);
1351
1352         $o .= '</form>' . "\r\n";
1353
1354         return $o;
1355
1356 }