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