]> git.mxchange.org Git - friendica.git/blob - mod/settings.php
Revert "Move Objects to Model"
[friendica.git] / mod / settings.php
1 <?php
2 /**
3  * @file mod/settings.php
4  */
5 use Friendica\App;
6 use Friendica\Content\Feature;
7 use Friendica\Core\System;
8 use Friendica\Core\Worker;
9 use Friendica\Core\Config;
10 use Friendica\Core\PConfig;
11 use Friendica\Database\DBM;
12 use Friendica\Model\GlobalContact;
13 use Friendica\Model\User;
14 use Friendica\Protocol\Email;
15
16 require_once 'include/group.php';
17
18 function get_theme_config_file($theme) {
19         $a = get_app();
20         $base_theme = $a->theme_info['extends'];
21
22         if (file_exists("view/theme/$theme/config.php")) {
23                 return "view/theme/$theme/config.php";
24         }
25         if (file_exists("view/theme/$base_theme/config.php")) {
26                 return "view/theme/$base_theme/config.php";
27         }
28         return null;
29 }
30
31 function settings_init(App $a) {
32
33         if (!local_user()) {
34                 notice(t('Permission denied.') . EOL);
35                 return;
36         }
37
38         // These lines provide the javascript needed by the acl selector
39
40         $tpl = get_markup_template("settings-head.tpl");
41         $a->page['htmlhead'] .= replace_macros($tpl,array(
42                 '$ispublic' => t('everybody')
43         ));
44
45
46
47         $tabs = array(
48                 array(
49                         'label' => t('Account'),
50                         'url'   => 'settings',
51                         'selected'      =>  (($a->argc == 1) && ($a->argv[0] === 'settings')?'active':''),
52                         'accesskey' => 'o',
53                 ),
54         );
55
56         if (Feature::get()) {
57                 $tabs[] =       array(
58                                         'label' => t('Additional features'),
59                                         'url'   => 'settings/features',
60                                         'selected'      => (($a->argc > 1) && ($a->argv[1] === 'features') ? 'active' : ''),
61                                         'accesskey' => 't',
62                                 );
63         }
64
65         $tabs[] =       array(
66                 'label' => t('Display'),
67                 'url'   => 'settings/display',
68                 'selected'      => (($a->argc > 1) && ($a->argv[1] === 'display')?'active':''),
69                 'accesskey' => 'i',
70         );
71
72         $tabs[] =       array(
73                 'label' => t('Social Networks'),
74                 'url'   => 'settings/connectors',
75                 'selected'      => (($a->argc > 1) && ($a->argv[1] === 'connectors')?'active':''),
76                 'accesskey' => 'w',
77         );
78
79         $tabs[] =       array(
80                 'label' => t('Plugins'),
81                 'url'   => 'settings/addon',
82                 'selected'      => (($a->argc > 1) && ($a->argv[1] === 'addon')?'active':''),
83                 'accesskey' => 'l',
84         );
85
86         $tabs[] =       array(
87                 'label' => t('Delegations'),
88                 'url'   => 'delegate',
89                 'selected'      => (($a->argc == 1) && ($a->argv[0] === 'delegate')?'active':''),
90                 'accesskey' => 'd',
91         );
92
93         $tabs[] =       array(
94                 'label' => t('Connected apps'),
95                 'url' => 'settings/oauth',
96                 'selected' => (($a->argc > 1) && ($a->argv[1] === 'oauth')?'active':''),
97                 'accesskey' => 'b',
98         );
99
100         $tabs[] =       array(
101                 'label' => t('Export personal data'),
102                 'url' => 'uexport',
103                 'selected' => (($a->argc == 1) && ($a->argv[0] === 'uexport')?'active':''),
104                 'accesskey' => 'e',
105         );
106
107         $tabs[] =       array(
108                 'label' => t('Remove account'),
109                 'url' => 'removeme',
110                 'selected' => (($a->argc == 1) && ($a->argv[0] === 'removeme')?'active':''),
111                 'accesskey' => 'r',
112         );
113
114
115         $tabtpl = get_markup_template("generic_links_widget.tpl");
116         $a->page['aside'] = replace_macros($tabtpl, array(
117                 '$title' => t('Settings'),
118                 '$class' => 'settings-widget',
119                 '$items' => $tabs,
120         ));
121
122 }
123
124
125 function settings_post(App $a) {
126
127         if (!local_user()) {
128                 return;
129         }
130
131         if (x($_SESSION, 'submanage') && intval($_SESSION['submanage'])) {
132                 return;
133         }
134
135         if (count($a->user) && x($a->user, 'uid') && $a->user['uid'] != local_user()) {
136                 notice(t('Permission denied.') . EOL);
137                 return;
138         }
139
140         $old_page_flags = $a->user['page-flags'];
141
142         if (($a->argc > 1) && ($a->argv[1] === 'oauth') && x($_POST, 'remove')) {
143                 check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
144
145                 $key = $_POST['remove'];
146                 q("DELETE FROM tokens WHERE id='%s' AND uid=%d",
147                         dbesc($key),
148                         local_user());
149                 goaway(System::baseUrl(true)."/settings/oauth/");
150                 return;
151         }
152
153         if (($a->argc > 2) && ($a->argv[1] === 'oauth')  && ($a->argv[2] === 'edit'||($a->argv[2] === 'add')) && x($_POST, 'submit')) {
154
155                 check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
156
157                 $name           = ((x($_POST, 'name')) ? $_POST['name'] : '');
158                 $key            = ((x($_POST, 'key')) ? $_POST['key'] : '');
159                 $secret         = ((x($_POST, 'secret')) ? $_POST['secret'] : '');
160                 $redirect       = ((x($_POST, 'redirect')) ? $_POST['redirect'] : '');
161                 $icon           = ((x($_POST, 'icon')) ? $_POST['icon'] : '');
162                 if ($name=="" || $key=="" || $secret=="") {
163                         notice(t("Missing some important data!"));
164
165                 } else {
166                         if ($_POST['submit']==t("Update")) {
167                                 $r = q("UPDATE clients SET
168                                                         client_id='%s',
169                                                         pw='%s',
170                                                         name='%s',
171                                                         redirect_uri='%s',
172                                                         icon='%s',
173                                                         uid=%d
174                                                 WHERE client_id='%s'",
175                                                 dbesc($key),
176                                                 dbesc($secret),
177                                                 dbesc($name),
178                                                 dbesc($redirect),
179                                                 dbesc($icon),
180                                                 local_user(),
181                                                 dbesc($key));
182                         } else {
183                                 $r = q("INSERT INTO clients
184                                                         (client_id, pw, name, redirect_uri, icon, uid)
185                                                 VALUES ('%s', '%s', '%s', '%s', '%s',%d)",
186                                                 dbesc($key),
187                                                 dbesc($secret),
188                                                 dbesc($name),
189                                                 dbesc($redirect),
190                                                 dbesc($icon),
191                                                 local_user());
192                         }
193                 }
194                 goaway(System::baseUrl(true)."/settings/oauth/");
195                 return;
196         }
197
198         if (($a->argc > 1) && ($a->argv[1] == 'addon')) {
199                 check_form_security_token_redirectOnErr('/settings/addon', 'settings_addon');
200
201                 call_hooks('plugin_settings_post', $_POST);
202                 return;
203         }
204
205         if (($a->argc > 1) && ($a->argv[1] == 'connectors')) {
206
207                 check_form_security_token_redirectOnErr('/settings/connectors', 'settings_connectors');
208
209                 if (x($_POST, 'general-submit')) {
210                         PConfig::set(local_user(), 'system', 'no_intelligent_shortening', intval($_POST['no_intelligent_shortening']));
211                         PConfig::set(local_user(), 'system', 'ostatus_autofriend', intval($_POST['snautofollow']));
212                         PConfig::set(local_user(), 'ostatus', 'default_group', $_POST['group-selection']);
213                         PConfig::set(local_user(), 'ostatus', 'legacy_contact', $_POST['legacy_contact']);
214                 } elseif (x($_POST, 'imap-submit')) {
215
216                         $mail_server       = ((x($_POST, 'mail_server')) ? $_POST['mail_server'] : '');
217                         $mail_port         = ((x($_POST, 'mail_port')) ? $_POST['mail_port'] : '');
218                         $mail_ssl          = ((x($_POST, 'mail_ssl')) ? strtolower(trim($_POST['mail_ssl'])) : '');
219                         $mail_user         = ((x($_POST, 'mail_user')) ? $_POST['mail_user'] : '');
220                         $mail_pass         = ((x($_POST, 'mail_pass')) ? trim($_POST['mail_pass']) : '');
221                         $mail_action       = ((x($_POST, 'mail_action')) ? trim($_POST['mail_action']) : '');
222                         $mail_movetofolder = ((x($_POST, 'mail_movetofolder')) ? trim($_POST['mail_movetofolder']) : '');
223                         $mail_replyto      = ((x($_POST, 'mail_replyto')) ? $_POST['mail_replyto'] : '');
224                         $mail_pubmail      = ((x($_POST, 'mail_pubmail')) ? $_POST['mail_pubmail'] : '');
225
226
227                         $mail_disabled = ((function_exists('imap_open') && (!Config::get('system', 'imap_disabled'))) ? 0 : 1);
228                         if (Config::get('system', 'dfrn_only')) {
229                                 $mail_disabled = 1;
230                         }
231
232                         if (!$mail_disabled) {
233                                 $failed = false;
234                                 $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
235                                         intval(local_user())
236                                 );
237                                 if (!DBM::is_result($r)) {
238                                         dba::insert('mailacct', array('uid' => local_user()));
239                                 }
240                                 if (strlen($mail_pass)) {
241                                         $pass = '';
242                                         openssl_public_encrypt($mail_pass, $pass, $a->user['pubkey']);
243                                         dba::update('mailacct', array('pass' => bin2hex($pass)), array('uid' => local_user()));
244                                 }
245                                 $r = q("UPDATE `mailacct` SET `server` = '%s', `port` = %d, `ssltype` = '%s', `user` = '%s',
246                                         `action` = %d, `movetofolder` = '%s',
247                                         `mailbox` = 'INBOX', `reply_to` = '%s', `pubmail` = %d WHERE `uid` = %d",
248                                         dbesc($mail_server),
249                                         intval($mail_port),
250                                         dbesc($mail_ssl),
251                                         dbesc($mail_user),
252                                         intval($mail_action),
253                                         dbesc($mail_movetofolder),
254                                         dbesc($mail_replyto),
255                                         intval($mail_pubmail),
256                                         intval(local_user())
257                                 );
258                                 logger("mail: updating mailaccount. Response: ".print_r($r, true));
259                                 $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
260                                         intval(local_user())
261                                 );
262                                 if (DBM::is_result($r)) {
263                                         $eacct = $r[0];
264                                         $mb = Email::constructMailboxName($eacct);
265
266                                         if (strlen($eacct['server'])) {
267                                                 $dcrpass = '';
268                                                 openssl_private_decrypt(hex2bin($eacct['pass']), $dcrpass, $a->user['prvkey']);
269                                                 $mbox = Email::connect($mb, $mail_user, $dcrpass);
270                                                 unset($dcrpass);
271                                                 if (!$mbox) {
272                                                         $failed = true;
273                                                         notice(t('Failed to connect with email account using the settings provided.') . EOL);
274                                                 }
275                                         }
276                                 }
277                                 if (!$failed) {
278                                         info(t('Email settings updated.') . EOL);
279                                 }
280                         }
281                 }
282
283                 call_hooks('connector_settings_post', $_POST);
284                 return;
285         }
286
287         if (($a->argc > 1) && ($a->argv[1] === 'features')) {
288                 check_form_security_token_redirectOnErr('/settings/features', 'settings_features');
289                 foreach ($_POST as $k => $v) {
290                         if (strpos($k, 'feature_') === 0) {
291                                 PConfig::set(local_user(), 'feature', substr($k, 8), ((intval($v)) ? 1 : 0));
292                         }
293                 }
294                 info(t('Features updated') . EOL);
295                 return;
296         }
297
298         if (($a->argc > 1) && ($a->argv[1] === 'display')) {
299                 check_form_security_token_redirectOnErr('/settings/display', 'settings_display');
300
301                 $theme             = x($_POST, 'theme')             ? notags(trim($_POST['theme']))        : $a->user['theme'];
302                 $mobile_theme      = x($_POST, 'mobile_theme')      ? notags(trim($_POST['mobile_theme'])) : '';
303                 $nosmile           = x($_POST, 'nosmile')           ? intval($_POST['nosmile'])            : 0;
304                 $first_day_of_week = x($_POST, 'first_day_of_week') ? intval($_POST['first_day_of_week'])  : 0;
305                 $noinfo            = x($_POST, 'noinfo')            ? intval($_POST['noinfo'])             : 0;
306                 $infinite_scroll   = x($_POST, 'infinite_scroll')   ? intval($_POST['infinite_scroll'])    : 0;
307                 $no_auto_update    = x($_POST, 'no_auto_update')    ? intval($_POST['no_auto_update'])     : 0;
308                 $bandwidth_saver   = x($_POST, 'bandwidth_saver')   ? intval($_POST['bandwidth_saver'])    : 0;
309                 $smart_threading   = x($_POST, 'smart_threading')   ? intval($_POST['smart_threading'])    : 0;
310                 $nowarn_insecure   = x($_POST, 'nowarn_insecure')   ? intval($_POST['nowarn_insecure'])    : 0;
311                 $browser_update    = x($_POST, 'browser_update')    ? intval($_POST['browser_update'])     : 0;
312                 if ($browser_update != -1) {
313                         $browser_update = $browser_update * 1000;
314                         if ($browser_update < 10000) {
315                                 $browser_update = 10000;
316                         }
317                 }
318
319                 $itemspage_network = x($_POST, 'itemspage_network')  ? intval($_POST['itemspage_network'])  : 40;
320                 if ($itemspage_network > 100) {
321                         $itemspage_network = 100;
322                 }
323                 $itemspage_mobile_network = x($_POST, 'itemspage_mobile_network') ? intval($_POST['itemspage_mobile_network']) : 20;
324                 if ($itemspage_mobile_network > 100) {
325                         $itemspage_mobile_network = 100;
326                 }
327
328                 if ($mobile_theme !== '') {
329                         PConfig::set(local_user(), 'system', 'mobile_theme', $mobile_theme);
330                 }
331
332                 PConfig::set(local_user(), 'system', 'nowarn_insecure'         , $nowarn_insecure);
333                 PConfig::set(local_user(), 'system', 'update_interval'         , $browser_update);
334                 PConfig::set(local_user(), 'system', 'itemspage_network'       , $itemspage_network);
335                 PConfig::set(local_user(), 'system', 'itemspage_mobile_network', $itemspage_mobile_network);
336                 PConfig::set(local_user(), 'system', 'no_smilies'              , $nosmile);
337                 PConfig::set(local_user(), 'system', 'first_day_of_week'       , $first_day_of_week);
338                 PConfig::set(local_user(), 'system', 'ignore_info'             , $noinfo);
339                 PConfig::set(local_user(), 'system', 'infinite_scroll'         , $infinite_scroll);
340                 PConfig::set(local_user(), 'system', 'no_auto_update'          , $no_auto_update);
341                 PConfig::set(local_user(), 'system', 'bandwidth_saver'         , $bandwidth_saver);
342                 PConfig::set(local_user(), 'system', 'smart_threading'         , $smart_threading);
343
344                 if ($theme == $a->user['theme']) {
345                         // call theme_post only if theme has not been changed
346                         if (($themeconfigfile = get_theme_config_file($theme)) != null) {
347                                 require_once($themeconfigfile);
348                                 theme_post($a);
349                         }
350                 }
351
352                 $r = q("UPDATE `user` SET `theme` = '%s' WHERE `uid` = %d",
353                                 dbesc($theme),
354                                 intval(local_user())
355                 );
356
357                 call_hooks('display_settings_post', $_POST);
358                 goaway('settings/display');
359                 return; // NOTREACHED
360         }
361
362         check_form_security_token_redirectOnErr('/settings', 'settings');
363
364         if (x($_POST,'resend_relocate')) {
365                 Worker::add(PRIORITY_HIGH, 'Notifier', 'relocate', local_user());
366                 info(t("Relocate message has been send to your contacts"));
367                 goaway('settings');
368         }
369
370         call_hooks('settings_post', $_POST);
371
372         if (x($_POST, 'password') || x($_POST, 'confirm')) {
373                 $newpass = $_POST['password'];
374                 $confirm = $_POST['confirm'];
375
376                 $err = false;
377                 if ($newpass != $confirm) {
378                         notice(t('Passwords do not match. Password unchanged.') . EOL);
379                         $err = true;
380                 }
381
382                 if (!x($newpass) || !x($confirm)) {
383                         notice(t('Empty passwords are not allowed. Password unchanged.') . EOL);
384                         $err = true;
385         }
386
387         //  check if the old password was supplied correctly before changing it to the new value
388         if (!User::authenticate(intval(local_user()), $_POST['opassword'])) {
389             notice(t('Wrong password.') . EOL);
390             $err = true;
391         }
392
393                 if (!$err) {
394                         $password = hash('whirlpool', $newpass);
395                         $r = q("UPDATE `user` SET `password` = '%s' WHERE `uid` = %d",
396                                 dbesc($password),
397                                 intval(local_user())
398                         );
399                         if ($r) {
400                                 info(t('Password changed.') . EOL);
401                         } else {
402                                 notice(t('Password update failed. Please try again.') . EOL);
403                         }
404                 }
405         }
406
407         $username         = ((x($_POST, 'username'))   ? notags(trim($_POST['username']))     : '');
408         $email            = ((x($_POST, 'email'))      ? notags(trim($_POST['email']))        : '');
409         $timezone         = ((x($_POST, 'timezone'))   ? notags(trim($_POST['timezone']))     : '');
410         $language         = ((x($_POST, 'language'))   ? notags(trim($_POST['language']))     : '');
411
412         $defloc           = ((x($_POST, 'defloc'))     ? notags(trim($_POST['defloc']))       : '');
413         $openid           = ((x($_POST, 'openid_url')) ? notags(trim($_POST['openid_url']))   : '');
414         $maxreq           = ((x($_POST, 'maxreq'))     ? intval($_POST['maxreq'])             : 0);
415         $expire           = ((x($_POST, 'expire'))     ? intval($_POST['expire'])             : 0);
416         $def_gid          = ((x($_POST, 'group-selection')) ? intval($_POST['group-selection']) : 0);
417
418
419         $expire_items     = ((x($_POST, 'expire_items')) ? intval($_POST['expire_items'])        : 0);
420         $expire_notes     = ((x($_POST, 'expire_notes')) ? intval($_POST['expire_notes'])        : 0);
421         $expire_starred   = ((x($_POST, 'expire_starred')) ? intval($_POST['expire_starred']) : 0);
422         $expire_photos    = ((x($_POST, 'expire_photos'))? intval($_POST['expire_photos'])       : 0);
423         $expire_network_only    = ((x($_POST, 'expire_network_only'))? intval($_POST['expire_network_only'])     : 0);
424
425         $allow_location   = (((x($_POST, 'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0);
426         $publish          = (((x($_POST, 'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0);
427         $net_publish      = (((x($_POST, 'profile_in_netdirectory')) && (intval($_POST['profile_in_netdirectory']) == 1)) ? 1: 0);
428         $old_visibility   = (((x($_POST, 'visibility')) && (intval($_POST['visibility']) == 1)) ? 1 : 0);
429         $account_type     = (((x($_POST, 'account-type')) && (intval($_POST['account-type']))) ? intval($_POST['account-type']) : 0);
430         $page_flags       = (((x($_POST, 'page-flags')) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0);
431         $blockwall        = (((x($_POST, 'blockwall')) && (intval($_POST['blockwall']) == 1)) ? 0: 1); // this setting is inverted!
432         $blocktags        = (((x($_POST, 'blocktags')) && (intval($_POST['blocktags']) == 1)) ? 0: 1); // this setting is inverted!
433         $unkmail          = (((x($_POST, 'unkmail')) && (intval($_POST['unkmail']) == 1)) ? 1: 0);
434         $cntunkmail       = ((x($_POST, 'cntunkmail')) ? intval($_POST['cntunkmail']) : 0);
435         $suggestme        = ((x($_POST, 'suggestme')) ? intval($_POST['suggestme'])  : 0);
436         $hide_friends     = (($_POST['hide-friends'] == 1) ? 1: 0);
437         $hidewall         = (($_POST['hidewall'] == 1) ? 1: 0);
438         $post_newfriend   = (($_POST['post_newfriend'] == 1) ? 1: 0);
439         $post_joingroup   = (($_POST['post_joingroup'] == 1) ? 1: 0);
440         $post_profilechange   = (($_POST['post_profilechange'] == 1) ? 1: 0);
441
442         $email_textonly   = (($_POST['email_textonly'] == 1) ? 1 : 0);
443         $detailed_notif   = (($_POST['detailed_notif'] == 1) ? 1 : 0);
444
445         $notify = 0;
446
447         if (x($_POST, 'notify1')) {
448                 $notify += intval($_POST['notify1']);
449         }
450         if (x($_POST, 'notify2')) {
451                 $notify += intval($_POST['notify2']);
452         }
453         if (x($_POST, 'notify3')) {
454                 $notify += intval($_POST['notify3']);
455         }
456         if (x($_POST, 'notify4')) {
457                 $notify += intval($_POST['notify4']);
458         }
459         if (x($_POST, 'notify5')) {
460                 $notify += intval($_POST['notify5']);
461         }
462         if (x($_POST, 'notify6')) {
463                 $notify += intval($_POST['notify6']);
464         }
465         if (x($_POST, 'notify7')) {
466                 $notify += intval($_POST['notify7']);
467         }
468         if (x($_POST, 'notify8')) {
469                 $notify += intval($_POST['notify8']);
470         }
471
472         // Adjust the page flag if the account type doesn't fit to the page flag.
473         if (($account_type == ACCOUNT_TYPE_PERSON) && !in_array($page_flags, array(PAGE_NORMAL, PAGE_SOAPBOX, PAGE_FREELOVE))) {
474                 $page_flags = PAGE_NORMAL;
475         } elseif (($account_type == ACCOUNT_TYPE_ORGANISATION) && !in_array($page_flags, array(PAGE_SOAPBOX))) {
476                 $page_flags = PAGE_SOAPBOX;
477         } elseif (($account_type == ACCOUNT_TYPE_NEWS) && !in_array($page_flags, array(PAGE_SOAPBOX))) {
478                 $page_flags = PAGE_SOAPBOX;
479         } elseif (($account_type == ACCOUNT_TYPE_COMMUNITY) && !in_array($page_flags, array(PAGE_COMMUNITY, PAGE_PRVGROUP))) {
480                 $page_flags = PAGE_COMMUNITY;
481         }
482
483         $email_changed = false;
484
485         $err = '';
486
487         $name_change = false;
488
489         if ($username != $a->user['username']) {
490                 $name_change = true;
491                 if (strlen($username) > 40) {
492                         $err .= t(' Please use a shorter name.');
493                 }
494                 if (strlen($username) < 3) {
495                         $err .= t(' Name too short.');
496                 }
497         }
498
499         if ($email != $a->user['email']) {
500                 $email_changed = true;
501                 //  check for the correct password
502                 if (!User::authenticate(intval(local_user()), $_POST['mpassword'])) {
503                         $err .= t('Wrong Password') . EOL;
504                         $email = $a->user['email'];
505                 }
506                 //  check the email is valid
507                 if (!valid_email($email)) {
508                         $err .= t('Invalid email.');
509                 }
510                 //  ensure new email is not the admin mail
511                 //if ((x($a->config, 'admin_email')) && (strcasecmp($email, $a->config['admin_email']) == 0)) {
512                 if (x($a->config, 'admin_email')) {
513                         $adminlist = explode(",", str_replace(" ", "", strtolower($a->config['admin_email'])));
514                         if (in_array(strtolower($email), $adminlist)) {
515                                 $err .= t('Cannot change to that email.');
516                                 $email = $a->user['email'];
517                         }
518                 }
519         }
520
521         if (strlen($err)) {
522                 notice($err . EOL);
523                 return;
524         }
525
526         if (($timezone != $a->user['timezone']) && strlen($timezone)) {
527                 date_default_timezone_set($timezone);
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                         Worker::add(PRIORITY_LOW, "Directory", $url);
647                 }
648         }
649
650         Worker::add(PRIORITY_LOW, 'ProfileUpdate', local_user());
651
652         // Update the global contact for the user
653         GlobalContact::updateForUser(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 = Feature::get();
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::isEnabled(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 || is_null(Config::get('experimentals', 'exp_themes'))))) {
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', 0);
983                 $first_day_of_week = PConfig::get(local_user(), 'system', 'first_day_of_week', 0);
984                 $weekdays = array(0 => t("Sunday"), 1 => t("Monday"));
985
986                 $noinfo = PConfig::get(local_user(), 'system', 'ignore_info', 0);
987                 $infinite_scroll = PConfig::get(local_user(), 'system', 'infinite_scroll', 0);
988                 $no_auto_update = PConfig::get(local_user(), 'system', 'no_auto_update', 0);
989                 $bandwidth_saver = PConfig::get(local_user(), 'system', 'bandwidth_saver', 0);
990                 $smart_threading = PConfig::get(local_user(), 'system', 'smart_threading', 0);
991
992                 $theme_config = "";
993                 if (($themeconfigfile = get_theme_config_file($theme_selected)) != null) {
994                         require_once($themeconfigfile);
995                         $theme_config = theme_content($a);
996                 }
997
998                 $tpl = get_markup_template("settings_display.tpl");
999                 $o = replace_macros($tpl, array(
1000                         '$ptitle'       => t('Display Settings'),
1001                         '$form_security_token' => get_form_security_token("settings_display"),
1002                         '$submit'       => t('Save Settings'),
1003                         '$baseurl' => System::baseUrl(true),
1004                         '$uid' => local_user(),
1005
1006                         '$theme'        => array('theme', t('Display Theme:'), $theme_selected, '', $themes, true),
1007                         '$mobile_theme' => array('mobile_theme', t('Mobile Theme:'), $mobile_theme_selected, '', $mobile_themes, false),
1008                         '$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.")),
1009                         '$ajaxint'   => array('browser_update',  t("Update browser every xx seconds"), $browser_update, t('Minimum of 10 seconds. Enter -1 to disable it.')),
1010                         '$itemspage_network'   => array('itemspage_network',  t("Number of items to display per page:"), $itemspage_network, t('Maximum of 100 items')),
1011                         '$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')),
1012                         '$nosmile'      => array('nosmile', t("Don't show emoticons"), $nosmile, ''),
1013                         '$calendar_title' => t('Calendar'),
1014                         '$first_day_of_week'    => array('first_day_of_week', t('Beginning of week:'), $first_day_of_week, '', $weekdays, false),
1015                         '$noinfo'       => array('noinfo', t("Don't show notices"), $noinfo, ''),
1016                         '$infinite_scroll'      => array('infinite_scroll', t("Infinite scroll"), $infinite_scroll, ''),
1017                         '$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.')),
1018                         '$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.')),
1019                         '$smart_threading' => array('smart_threading', t('Smart Threading'), $smart_threading, t('When enabled, suppress extraneous thread indentation while keeping it where it matters. Only works if threading is available and enabled.')),
1020
1021                         '$d_tset' => t('General Theme Settings'),
1022                         '$d_ctset' => t('Custom Theme Settings'),
1023                         '$d_cset' => t('Content Settings'),
1024                         'stitle' => t('Theme settings'),
1025                         '$theme_config' => $theme_config,
1026                 ));
1027
1028                 $tpl = get_markup_template("settings_display_end.tpl");
1029                 $a->page['end'] .= replace_macros($tpl, array(
1030                         '$theme'        => array('theme', t('Display Theme:'), $theme_selected, '', $themes)
1031                 ));
1032
1033                 return $o;
1034         }
1035
1036
1037         /*
1038          * ACCOUNT SETTINGS
1039          */
1040
1041         require_once('include/acl_selectors.php');
1042
1043         $p = q("SELECT * FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1",
1044                 intval(local_user())
1045         );
1046         if (count($p)) {
1047                 $profile = $p[0];
1048         }
1049
1050         $username   = $a->user['username'];
1051         $email      = $a->user['email'];
1052         $nickname   = $a->user['nickname'];
1053         $timezone   = $a->user['timezone'];
1054         $language   = $a->user['language'];
1055         $notify     = $a->user['notify-flags'];
1056         $defloc     = $a->user['default-location'];
1057         $openid     = $a->user['openid'];
1058         $maxreq     = $a->user['maxreq'];
1059         $expire     = ((intval($a->user['expire'])) ? $a->user['expire'] : '');
1060         $blockwall  = $a->user['blockwall'];
1061         $blocktags  = $a->user['blocktags'];
1062         $unkmail    = $a->user['unkmail'];
1063         $cntunkmail = $a->user['cntunkmail'];
1064
1065         $expire_items = PConfig::get(local_user(), 'expire', 'items', true);
1066         $expire_notes = PConfig::get(local_user(), 'expire', 'notes', true);
1067         $expire_starred = PConfig::get(local_user(), 'expire', 'starred', true);
1068         $expire_photos = PConfig::get(local_user(), 'expire', 'photos', false);
1069         $expire_network_only = PConfig::get(local_user(), 'expire', 'network_only', false);
1070         $suggestme = PConfig::get(local_user(), 'system', 'suggestme', false);
1071         $post_newfriend = PConfig::get(local_user(), 'system', 'post_newfriend', false);
1072         $post_joingroup = PConfig::get(local_user(), 'system', 'post_joingroup', false);
1073         $post_profilechange = PConfig::get(local_user(), 'system', 'post_profilechange', false);
1074
1075         // nowarn_insecure
1076
1077         if (!strlen($a->user['timezone'])) {
1078                 $timezone = date_default_timezone_get();
1079         }
1080
1081         // Set the account type to "Community" when the page is a community page but the account type doesn't fit
1082         // This is only happening on the first visit after the update
1083         if (in_array($a->user['page-flags'], array(PAGE_COMMUNITY, PAGE_PRVGROUP)) &&
1084                 ($a->user['account-type'] != ACCOUNT_TYPE_COMMUNITY))
1085                 $a->user['account-type'] = ACCOUNT_TYPE_COMMUNITY;
1086
1087         $pageset_tpl = get_markup_template('settings_pagetypes.tpl');
1088
1089         $pagetype = replace_macros($pageset_tpl, array(
1090                 '$account_types'        => t("Account Types"),
1091                 '$user'                 => t("Personal Page Subtypes"),
1092                 '$community'            => t("Community Forum Subtypes"),
1093                 '$account_type'         => $a->user['account-type'],
1094                 '$type_person'          => ACCOUNT_TYPE_PERSON,
1095                 '$type_organisation'    => ACCOUNT_TYPE_ORGANISATION,
1096                 '$type_news'            => ACCOUNT_TYPE_NEWS,
1097                 '$type_community'       => ACCOUNT_TYPE_COMMUNITY,
1098
1099                 '$account_person'       => array('account-type', t('Personal Page'), ACCOUNT_TYPE_PERSON,
1100                                                                         t('Account for a personal profile.'),
1101                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_PERSON)),
1102
1103                 '$account_organisation' => array('account-type', t('Organisation Page'), ACCOUNT_TYPE_ORGANISATION,
1104                                                                         t('Account for an organisation that automatically approves contact requests as "Followers".'),
1105                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_ORGANISATION)),
1106
1107                 '$account_news'         => array('account-type', t('News Page'), ACCOUNT_TYPE_NEWS,
1108                                                                         t('Account for a news reflector that automatically approves contact requests as "Followers".'),
1109                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_NEWS)),
1110
1111                 '$account_community'    => array('account-type', t('Community Forum'), ACCOUNT_TYPE_COMMUNITY,
1112                                                                         t('Account for community discussions.'),
1113                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_COMMUNITY)),
1114
1115                 '$page_normal'          => array('page-flags', t('Normal Account Page'), PAGE_NORMAL,
1116                                                                         t('Account for a regular personal profile that requires manual approval of "Friends" and "Followers".'),
1117                                                                         ($a->user['page-flags'] == PAGE_NORMAL)),
1118
1119                 '$page_soapbox'         => array('page-flags', t('Soapbox Page'), PAGE_SOAPBOX,
1120                                                                         t('Account for a public profile that automatically approves contact requests as "Followers".'),
1121                                                                         ($a->user['page-flags'] == PAGE_SOAPBOX)),
1122
1123                 '$page_community'       => array('page-flags', t('Public Forum'), PAGE_COMMUNITY,
1124                                                                         t('Automatically approves all contact requests.'),
1125                                                                         ($a->user['page-flags'] == PAGE_COMMUNITY)),
1126
1127                 '$page_freelove'        => array('page-flags', t('Automatic Friend Page'), PAGE_FREELOVE,
1128                                                                         t('Account for a popular profile that automatically approves contact requests as "Friends".'),
1129                                                                         ($a->user['page-flags'] == PAGE_FREELOVE)),
1130
1131                 '$page_prvgroup'        => array('page-flags', t('Private Forum [Experimental]'), PAGE_PRVGROUP,
1132                                                                         t('Requires manual approval of contact requests.'),
1133                                                                         ($a->user['page-flags'] == PAGE_PRVGROUP)),
1134
1135
1136         ));
1137
1138         $noid = Config::get('system', 'no_openid');
1139
1140         if ($noid) {
1141                 $openid_field = false;
1142         } else {
1143                 $openid_field = array('openid_url', t('OpenID:'), $openid, t("\x28Optional\x29 Allow this OpenID to login to this account."), "", "", "url");
1144         }
1145
1146         $opt_tpl = get_markup_template("field_yesno.tpl");
1147         if (Config::get('system', 'publish_all')) {
1148                 $profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
1149         } else {
1150                 $profile_in_dir = replace_macros($opt_tpl, array(
1151                         '$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')))
1152                 ));
1153         }
1154
1155         if (strlen(Config::get('system', 'directory'))) {
1156                 $profile_in_net_dir = replace_macros($opt_tpl, array(
1157                         '$field' => array('profile_in_netdirectory', t('Publish your default profile in the global social directory?'), $profile['net-publish'], '', array(t('No'), t('Yes')))
1158                 ));
1159         } else {
1160                 $profile_in_net_dir = '';
1161         }
1162
1163         $hide_friends = replace_macros($opt_tpl,array(
1164                         '$field'        => array('hide-friends', t('Hide your contact/friend list from viewers of your default profile?'), $profile['hide-friends'], '', array(t('No'), t('Yes'))),
1165         ));
1166
1167         $hide_wall = replace_macros($opt_tpl,array(
1168                         '$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'))),
1169
1170         ));
1171
1172         $blockwall = replace_macros($opt_tpl,array(
1173                         '$field'        => array('blockwall',  t('Allow friends to post to your profile page?'), (intval($a->user['blockwall']) ? '0' : '1'), '', array(t('No'), t('Yes'))),
1174
1175         ));
1176
1177         $blocktags = replace_macros($opt_tpl,array(
1178                         '$field'        => array('blocktags',  t('Allow friends to tag your posts?'), (intval($a->user['blocktags']) ? '0' : '1'), '', array(t('No'), t('Yes'))),
1179
1180         ));
1181
1182         $suggestme = replace_macros($opt_tpl,array(
1183                         '$field'        => array('suggestme',  t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', array(t('No'), t('Yes'))),
1184
1185         ));
1186
1187         $unkmail = replace_macros($opt_tpl,array(
1188                         '$field'        => array('unkmail',  t('Permit unknown people to send you private mail?'), $unkmail, '', array(t('No'), t('Yes'))),
1189
1190         ));
1191
1192         $invisible = (((!$profile['publish']) && (!$profile['net-publish']))
1193                 ? true : false);
1194
1195         if ($invisible) {
1196                 info(t('Profile is <strong>not published</strong>.') . EOL);
1197         }
1198
1199         //$subdir = ((strlen($a->get_path())) ? '<br />' . t('or') . ' ' . 'profile/' . $nickname : '');
1200
1201         $tpl_addr = get_markup_template("settings_nick_set.tpl");
1202
1203         $prof_addr = replace_macros($tpl_addr,array(
1204                 '$desc' => sprintf(t("Your Identity Address is <strong>'%s'</strong> or '%s'."), $nickname.'@'.$a->get_hostname().$a->get_path(), System::baseUrl().'/profile/'.$nickname),
1205                 '$basepath' => $a->get_hostname()
1206         ));
1207
1208         $stpl = get_markup_template('settings.tpl');
1209
1210         $expire_arr = array(
1211                 'days' => array('expire',  t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
1212                 'advanced' => t('Advanced expiration settings'),
1213                 'label' => t('Advanced Expiration'),
1214                 'items' => array('expire_items',  t("Expire posts:"), $expire_items, '', array(t('No'), t('Yes'))),
1215                 'notes' => array('expire_notes',  t("Expire personal notes:"), $expire_notes, '', array(t('No'), t('Yes'))),
1216                 'starred' => array('expire_starred',  t("Expire starred posts:"), $expire_starred, '', array(t('No'), t('Yes'))),
1217                 'photos' => array('expire_photos',  t("Expire photos:"), $expire_photos, '', array(t('No'), t('Yes'))),
1218                 'network_only' => array('expire_network_only',  t("Only expire posts by others:"), $expire_network_only, '', array(t('No'), t('Yes'))),
1219         );
1220
1221         require_once('include/group.php');
1222         $group_select = mini_group_select(local_user(), $a->user['def_gid']);
1223
1224         // Private/public post links for the non-JS ACL form
1225         $private_post = 1;
1226         if ($_REQUEST['public']) {
1227                 $private_post = 0;
1228         }
1229
1230         $query_str = $a->query_string;
1231         if (strpos($query_str, 'public=1') !== false) {
1232                 $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
1233         }
1234
1235         // I think $a->query_string may never have ? in it, but I could be wrong
1236         // It looks like it's from the index.php?q=[etc] rewrite that the web
1237         // server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
1238         if (strpos($query_str, '?') === false) {
1239                 $public_post_link = '?public=1';
1240         } else {
1241                 $public_post_link = '&public=1';
1242         }
1243
1244         /* Installed langs */
1245         $lang_choices = get_available_languages();
1246
1247         /// @TODO Fix indending (or so)
1248         $o .= replace_macros($stpl, array(
1249                 '$ptitle'       => t('Account Settings'),
1250
1251                 '$submit'       => t('Save Settings'),
1252                 '$baseurl' => System::baseUrl(true),
1253                 '$uid' => local_user(),
1254                 '$form_security_token' => get_form_security_token("settings"),
1255                 '$nickname_block' => $prof_addr,
1256
1257                 '$h_pass'       => t('Password Settings'),
1258                 '$password1'=> array('password', t('New Password:'), '', ''),
1259                 '$password2'=> array('confirm', t('Confirm:'), '', t('Leave password fields blank unless changing')),
1260                 '$password3'=> array('opassword', t('Current Password:'), '', t('Your current password to confirm the changes')),
1261                 '$password4'=> array('mpassword', t('Password:'), '', t('Your current password to confirm the changes')),
1262                 '$oid_enable' => (!Config::get('system', 'no_openid')),
1263                 '$openid'       => $openid_field,
1264
1265                 '$h_basic'      => t('Basic Settings'),
1266                 '$username' => array('username',  t('Full Name:'), $username, ''),
1267                 '$email'        => array('email', t('Email Address:'), $email, '', '', '', 'email'),
1268                 '$timezone' => array('timezone_select' , t('Your Timezone:'), select_timezone($timezone), ''),
1269                 '$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),
1270                 '$defloc'       => array('defloc', t('Default Post Location:'), $defloc, ''),
1271                 '$allowloc' => array('allow_location', t('Use Browser Location:'), ($a->user['allow_location'] == 1), ''),
1272
1273
1274                 '$h_prv'        => t('Security and Privacy Settings'),
1275
1276                 '$maxreq'       => array('maxreq', t('Maximum Friend Requests/Day:'), $maxreq , t("\x28to prevent spam abuse\x29")),
1277                 '$permissions' => t('Default Post Permissions'),
1278                 '$permdesc' => t("\x28click to open/close\x29"),
1279                 '$visibility' => $profile['net-publish'],
1280                 '$aclselect' => populate_acl($a->user),
1281                 '$suggestme' => $suggestme,
1282                 '$blockwall'=> $blockwall, // array('blockwall', t('Allow friends to post to your profile page:'), !$blockwall, ''),
1283                 '$blocktags'=> $blocktags, // array('blocktags', t('Allow friends to tag your posts:'), !$blocktags, ''),
1284
1285                 // ACL permissions box
1286                 '$acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector
1287                 '$group_perms' => t('Show to Groups'),
1288                 '$contact_perms' => t('Show to Contacts'),
1289                 '$private' => t('Default Private Post'),
1290                 '$public' => t('Default Public Post'),
1291                 '$is_private' => $private_post,
1292                 '$return_path' => $query_str,
1293                 '$public_link' => $public_post_link,
1294                 '$settings_perms' => t('Default Permissions for New Posts'),
1295
1296                 '$group_select' => $group_select,
1297
1298
1299                 '$expire'       => $expire_arr,
1300
1301                 '$profile_in_dir' => $profile_in_dir,
1302                 '$profile_in_net_dir' => $profile_in_net_dir,
1303                 '$hide_friends' => $hide_friends,
1304                 '$hide_wall' => $hide_wall,
1305                 '$unkmail' => $unkmail,
1306                 '$cntunkmail'   => array('cntunkmail', t('Maximum private messages per day from unknown people:'), $cntunkmail , t("\x28to prevent spam abuse\x29")),
1307
1308
1309                 '$h_not'        => t('Notification Settings'),
1310                 '$activity_options' => t('By default post a status message when:'),
1311                 '$post_newfriend' => array('post_newfriend',  t('accepting a friend request'), $post_newfriend, ''),
1312                 '$post_joingroup' => array('post_joingroup',  t('joining a forum/community'), $post_joingroup, ''),
1313                 '$post_profilechange' => array('post_profilechange',  t('making an <em>interesting</em> profile change'), $post_profilechange, ''),
1314                 '$lbl_not'      => t('Send a notification email when:'),
1315                 '$notify1'      => array('notify1', t('You receive an introduction'), ($notify & NOTIFY_INTRO), NOTIFY_INTRO, ''),
1316                 '$notify2'      => array('notify2', t('Your introductions are confirmed'), ($notify & NOTIFY_CONFIRM), NOTIFY_CONFIRM, ''),
1317                 '$notify3'      => array('notify3', t('Someone writes on your profile wall'), ($notify & NOTIFY_WALL), NOTIFY_WALL, ''),
1318                 '$notify4'      => array('notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, ''),
1319                 '$notify5'      => array('notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, ''),
1320                 '$notify6'  => array('notify6', t('You receive a friend suggestion'), ($notify & NOTIFY_SUGGEST), NOTIFY_SUGGEST, ''),
1321                 '$notify7'  => array('notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, ''),
1322                 '$notify8'  => array('notify8', t('You are poked/prodded/etc. in a post'), ($notify & NOTIFY_POKE), NOTIFY_POKE, ''),
1323
1324                 '$desktop_notifications' => array('desktop_notifications', t('Activate desktop notifications') , false, t('Show desktop popup on new notifications')),
1325
1326                 '$email_textonly' => array('email_textonly', t('Text-only notification emails'),
1327                                                                         PConfig::get(local_user(), 'system', 'email_textonly'),
1328                                                                         t('Send text only notification emails, without the html part')),
1329
1330                 '$detailed_notif' => array('detailed_notif', t('Show detailled notifications'),
1331                                                                         PConfig::get(local_user(), 'system', 'detailed_notif'),
1332                                                                         t('Per default the notificiation are condensed to a single notification per item. When enabled, every notification is displayed.')),
1333
1334                 '$h_advn' => t('Advanced Account/Page Type Settings'),
1335                 '$h_descadvn' => t('Change the behaviour of this account for special situations'),
1336                 '$pagetype' => $pagetype,
1337
1338                 '$relocate' => t('Relocate'),
1339                 '$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."),
1340                 '$relocate_button' => t("Resend relocate message to contacts"),
1341
1342         ));
1343
1344         call_hooks('settings_form', $o);
1345
1346         $o .= '</form>' . "\r\n";
1347
1348         return $o;
1349
1350 }