]> git.mxchange.org Git - friendica.git/blob - mod/settings.php
e693f775958d9db5e14f832f9924c7601ed77a09
[friendica.git] / mod / settings.php
1 <?php
2 /**
3  * @file mod/settings.php
4  */
5 use Friendica\App;
6 use Friendica\Core\System;
7 use Friendica\Core\Worker;
8 use Friendica\Core\Config;
9 use Friendica\Core\PConfig;
10 use Friendica\Database\DBM;
11 use Friendica\Model\GlobalContact;
12
13 require_once 'include/group.php';
14
15 function get_theme_config_file($theme) {
16         $a = get_app();
17         $base_theme = $a->theme_info['extends'];
18
19         if (file_exists("view/theme/$theme/config.php")) {
20                 return "view/theme/$theme/config.php";
21         }
22         if (file_exists("view/theme/$base_theme/config.php")) {
23                 return "view/theme/$base_theme/config.php";
24         }
25         return null;
26 }
27
28 function settings_init(App $a) {
29
30         if (!local_user()) {
31                 notice(t('Permission denied.') . EOL);
32                 return;
33         }
34
35         // These lines provide the javascript needed by the acl selector
36
37         $tpl = get_markup_template("settings-head.tpl");
38         $a->page['htmlhead'] .= replace_macros($tpl,array(
39                 '$ispublic' => t('everybody')
40         ));
41
42
43
44         $tabs = array(
45                 array(
46                         'label' => t('Account'),
47                         'url'   => 'settings',
48                         'selected'      =>  (($a->argc == 1) && ($a->argv[0] === 'settings')?'active':''),
49                         'accesskey' => 'o',
50                 ),
51         );
52
53         if (get_features()) {
54                 $tabs[] =       array(
55                                         'label' => t('Additional features'),
56                                         'url'   => 'settings/features',
57                                         'selected'      => (($a->argc > 1) && ($a->argv[1] === 'features') ? 'active' : ''),
58                                         'accesskey' => 't',
59                                 );
60         }
61
62         $tabs[] =       array(
63                 'label' => t('Display'),
64                 'url'   => 'settings/display',
65                 'selected'      => (($a->argc > 1) && ($a->argv[1] === 'display')?'active':''),
66                 'accesskey' => 'i',
67         );
68
69         $tabs[] =       array(
70                 'label' => t('Social Networks'),
71                 'url'   => 'settings/connectors',
72                 'selected'      => (($a->argc > 1) && ($a->argv[1] === 'connectors')?'active':''),
73                 'accesskey' => 'w',
74         );
75
76         $tabs[] =       array(
77                 'label' => t('Plugins'),
78                 'url'   => 'settings/addon',
79                 'selected'      => (($a->argc > 1) && ($a->argv[1] === 'addon')?'active':''),
80                 'accesskey' => 'l',
81         );
82
83         $tabs[] =       array(
84                 'label' => t('Delegations'),
85                 'url'   => 'delegate',
86                 'selected'      => (($a->argc == 1) && ($a->argv[0] === 'delegate')?'active':''),
87                 'accesskey' => 'd',
88         );
89
90         $tabs[] =       array(
91                 'label' => t('Connected apps'),
92                 'url' => 'settings/oauth',
93                 'selected' => (($a->argc > 1) && ($a->argv[1] === 'oauth')?'active':''),
94                 'accesskey' => 'b',
95         );
96
97         $tabs[] =       array(
98                 'label' => t('Export personal data'),
99                 'url' => 'uexport',
100                 'selected' => (($a->argc == 1) && ($a->argv[0] === 'uexport')?'active':''),
101                 'accesskey' => 'e',
102         );
103
104         $tabs[] =       array(
105                 'label' => t('Remove account'),
106                 'url' => 'removeme',
107                 'selected' => (($a->argc == 1) && ($a->argv[0] === 'removeme')?'active':''),
108                 'accesskey' => 'r',
109         );
110
111
112         $tabtpl = get_markup_template("generic_links_widget.tpl");
113         $a->page['aside'] = replace_macros($tabtpl, array(
114                 '$title' => t('Settings'),
115                 '$class' => 'settings-widget',
116                 '$items' => $tabs,
117         ));
118
119 }
120
121
122 function settings_post(App $a) {
123
124         if (!local_user()) {
125                 return;
126         }
127
128         if (x($_SESSION, 'submanage') && intval($_SESSION['submanage'])) {
129                 return;
130         }
131
132         if (count($a->user) && x($a->user, 'uid') && $a->user['uid'] != local_user()) {
133                 notice(t('Permission denied.') . EOL);
134                 return;
135         }
136
137         $old_page_flags = $a->user['page-flags'];
138
139         if (($a->argc > 1) && ($a->argv[1] === 'oauth') && x($_POST, 'remove')) {
140                 check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
141
142                 $key = $_POST['remove'];
143                 q("DELETE FROM tokens WHERE id='%s' AND uid=%d",
144                         dbesc($key),
145                         local_user());
146                 goaway(System::baseUrl(true)."/settings/oauth/");
147                 return;
148         }
149
150         if (($a->argc > 2) && ($a->argv[1] === 'oauth')  && ($a->argv[2] === 'edit'||($a->argv[2] === 'add')) && x($_POST, 'submit')) {
151
152                 check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
153
154                 $name           = ((x($_POST, 'name')) ? $_POST['name'] : '');
155                 $key            = ((x($_POST, 'key')) ? $_POST['key'] : '');
156                 $secret         = ((x($_POST, 'secret')) ? $_POST['secret'] : '');
157                 $redirect       = ((x($_POST, 'redirect')) ? $_POST['redirect'] : '');
158                 $icon           = ((x($_POST, 'icon')) ? $_POST['icon'] : '');
159                 if ($name=="" || $key=="" || $secret=="") {
160                         notice(t("Missing some important data!"));
161
162                 } else {
163                         if ($_POST['submit']==t("Update")) {
164                                 $r = q("UPDATE clients SET
165                                                         client_id='%s',
166                                                         pw='%s',
167                                                         name='%s',
168                                                         redirect_uri='%s',
169                                                         icon='%s',
170                                                         uid=%d
171                                                 WHERE client_id='%s'",
172                                                 dbesc($key),
173                                                 dbesc($secret),
174                                                 dbesc($name),
175                                                 dbesc($redirect),
176                                                 dbesc($icon),
177                                                 local_user(),
178                                                 dbesc($key));
179                         } else {
180                                 $r = q("INSERT INTO clients
181                                                         (client_id, pw, name, redirect_uri, icon, uid)
182                                                 VALUES ('%s', '%s', '%s', '%s', '%s',%d)",
183                                                 dbesc($key),
184                                                 dbesc($secret),
185                                                 dbesc($name),
186                                                 dbesc($redirect),
187                                                 dbesc($icon),
188                                                 local_user());
189                         }
190                 }
191                 goaway(System::baseUrl(true)."/settings/oauth/");
192                 return;
193         }
194
195         if (($a->argc > 1) && ($a->argv[1] == 'addon')) {
196                 check_form_security_token_redirectOnErr('/settings/addon', 'settings_addon');
197
198                 call_hooks('plugin_settings_post', $_POST);
199                 return;
200         }
201
202         if (($a->argc > 1) && ($a->argv[1] == 'connectors')) {
203
204                 check_form_security_token_redirectOnErr('/settings/connectors', 'settings_connectors');
205
206                 if (x($_POST, 'general-submit')) {
207                         PConfig::set(local_user(), 'system', 'no_intelligent_shortening', intval($_POST['no_intelligent_shortening']));
208                         PConfig::set(local_user(), 'system', 'ostatus_autofriend', intval($_POST['snautofollow']));
209                         PConfig::set(local_user(), 'ostatus', 'default_group', $_POST['group-selection']);
210                         PConfig::set(local_user(), 'ostatus', 'legacy_contact', $_POST['legacy_contact']);
211                 } elseif (x($_POST, 'imap-submit')) {
212
213                         $mail_server       = ((x($_POST, 'mail_server')) ? $_POST['mail_server'] : '');
214                         $mail_port         = ((x($_POST, 'mail_port')) ? $_POST['mail_port'] : '');
215                         $mail_ssl          = ((x($_POST, 'mail_ssl')) ? strtolower(trim($_POST['mail_ssl'])) : '');
216                         $mail_user         = ((x($_POST, 'mail_user')) ? $_POST['mail_user'] : '');
217                         $mail_pass         = ((x($_POST, 'mail_pass')) ? trim($_POST['mail_pass']) : '');
218                         $mail_action       = ((x($_POST, 'mail_action')) ? trim($_POST['mail_action']) : '');
219                         $mail_movetofolder = ((x($_POST, 'mail_movetofolder')) ? trim($_POST['mail_movetofolder']) : '');
220                         $mail_replyto      = ((x($_POST, 'mail_replyto')) ? $_POST['mail_replyto'] : '');
221                         $mail_pubmail      = ((x($_POST, 'mail_pubmail')) ? $_POST['mail_pubmail'] : '');
222
223
224                         $mail_disabled = ((function_exists('imap_open') && (!Config::get('system', 'imap_disabled'))) ? 0 : 1);
225                         if (Config::get('system', 'dfrn_only')) {
226                                 $mail_disabled = 1;
227                         }
228
229                         if (!$mail_disabled) {
230                                 $failed = false;
231                                 $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
232                                         intval(local_user())
233                                 );
234                                 if (!DBM::is_result($r)) {
235                                         dba::insert('mailacct', array('uid' => local_user()));
236                                 }
237                                 if (strlen($mail_pass)) {
238                                         $pass = '';
239                                         openssl_public_encrypt($mail_pass, $pass, $a->user['pubkey']);
240                                         dba::update('mailacct', array('pass' => bin2hex($pass)), array('uid' => local_user()));
241                                 }
242                                 $r = q("UPDATE `mailacct` SET `server` = '%s', `port` = %d, `ssltype` = '%s', `user` = '%s',
243                                         `action` = %d, `movetofolder` = '%s',
244                                         `mailbox` = 'INBOX', `reply_to` = '%s', `pubmail` = %d WHERE `uid` = %d",
245                                         dbesc($mail_server),
246                                         intval($mail_port),
247                                         dbesc($mail_ssl),
248                                         dbesc($mail_user),
249                                         intval($mail_action),
250                                         dbesc($mail_movetofolder),
251                                         dbesc($mail_replyto),
252                                         intval($mail_pubmail),
253                                         intval(local_user())
254                                 );
255                                 logger("mail: updating mailaccount. Response: ".print_r($r, true));
256                                 $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
257                                         intval(local_user())
258                                 );
259                                 if (DBM::is_result($r)) {
260                                         $eacct = $r[0];
261                                         require_once('include/email.php');
262                                         $mb = construct_mailbox_name($eacct);
263                                         if (strlen($eacct['server'])) {
264                                                 $dcrpass = '';
265                                                 openssl_private_decrypt(hex2bin($eacct['pass']), $dcrpass, $a->user['prvkey']);
266                                                 $mbox = email_connect($mb, $mail_user, $dcrpass);
267                                                 unset($dcrpass);
268                                                 if (!$mbox) {
269                                                         $failed = true;
270                                                         notice(t('Failed to connect with email account using the settings provided.') . EOL);
271                                                 }
272                                         }
273                                 }
274                                 if (!$failed) {
275                                         info(t('Email settings updated.') . EOL);
276                                 }
277                         }
278                 }
279
280                 call_hooks('connector_settings_post', $_POST);
281                 return;
282         }
283
284         if (($a->argc > 1) && ($a->argv[1] === 'features')) {
285                 check_form_security_token_redirectOnErr('/settings/features', 'settings_features');
286                 foreach ($_POST as $k => $v) {
287                         if (strpos($k, 'feature_') === 0) {
288                                 PConfig::set(local_user(), 'feature', substr($k, 8), ((intval($v)) ? 1 : 0));
289                         }
290                 }
291                 info(t('Features updated') . EOL);
292                 return;
293         }
294
295         if (($a->argc > 1) && ($a->argv[1] === 'display')) {
296                 check_form_security_token_redirectOnErr('/settings/display', 'settings_display');
297
298                 $theme             = x($_POST, 'theme')             ? notags(trim($_POST['theme']))        : $a->user['theme'];
299                 $mobile_theme      = x($_POST, 'mobile_theme')      ? notags(trim($_POST['mobile_theme'])) : '';
300                 $nosmile           = x($_POST, 'nosmile')           ? intval($_POST['nosmile'])            : 0;
301                 $first_day_of_week = x($_POST, 'first_day_of_week') ? intval($_POST['first_day_of_week'])  : 0;
302                 $noinfo            = x($_POST, 'noinfo')            ? intval($_POST['noinfo'])             : 0;
303                 $infinite_scroll   = x($_POST, 'infinite_scroll')   ? intval($_POST['infinite_scroll'])    : 0;
304                 $no_auto_update    = x($_POST, 'no_auto_update')    ? intval($_POST['no_auto_update'])     : 0;
305                 $bandwidth_saver   = x($_POST, 'bandwidth_saver')   ? intval($_POST['bandwidth_saver'])    : 0;
306                 $nowarn_insecure   = x($_POST, 'nowarn_insecure')   ? intval($_POST['nowarn_insecure'])    : 0;
307                 $browser_update    = x($_POST, 'browser_update')    ? intval($_POST['browser_update'])     : 0;
308                 if ($browser_update != -1) {
309                         $browser_update = $browser_update * 1000;
310                         if ($browser_update < 10000) {
311                                 $browser_update = 10000;
312                         }
313                 }
314
315                 $itemspage_network = x($_POST, 'itemspage_network')  ? intval($_POST['itemspage_network'])  : 40;
316                 if ($itemspage_network > 100) {
317                         $itemspage_network = 100;
318                 }
319                 $itemspage_mobile_network = x($_POST, 'itemspage_mobile_network') ? intval($_POST['itemspage_mobile_network']) : 20;
320                 if ($itemspage_mobile_network > 100) {
321                         $itemspage_mobile_network = 100;
322                 }
323
324                 if ($mobile_theme !== '') {
325                         PConfig::set(local_user(), 'system', 'mobile_theme', $mobile_theme);
326                 }
327
328                 PConfig::set(local_user(), 'system', 'nowarn_insecure'         , $nowarn_insecure);
329                 PConfig::set(local_user(), 'system', 'update_interval'         , $browser_update);
330                 PConfig::set(local_user(), 'system', 'itemspage_network'       , $itemspage_network);
331                 PConfig::set(local_user(), 'system', 'itemspage_mobile_network', $itemspage_mobile_network);
332                 PConfig::set(local_user(), 'system', 'no_smilies'              , $nosmile);
333                 PConfig::set(local_user(), 'system', 'first_day_of_week'       , $first_day_of_week);
334                 PConfig::set(local_user(), 'system', 'ignore_info'             , $noinfo);
335                 PConfig::set(local_user(), 'system', 'infinite_scroll'         , $infinite_scroll);
336                 PConfig::set(local_user(), 'system', 'no_auto_update'          , $no_auto_update);
337                 PConfig::set(local_user(), 'system', 'bandwidth_saver'         , $bandwidth_saver);
338
339                 if ($theme == $a->user['theme']) {
340                         // call theme_post only if theme has not been changed
341                         if (($themeconfigfile = get_theme_config_file($theme)) != null) {
342                                 require_once($themeconfigfile);
343                                 theme_post($a);
344                         }
345                 }
346
347
348                 $r = q("UPDATE `user` SET `theme` = '%s' WHERE `uid` = %d",
349                                 dbesc($theme),
350                                 intval(local_user())
351                 );
352
353                 call_hooks('display_settings_post', $_POST);
354                 goaway('settings/display');
355                 return; // NOTREACHED
356         }
357
358         check_form_security_token_redirectOnErr('/settings', 'settings');
359
360         if (x($_POST,'resend_relocate')) {
361                 Worker::add(PRIORITY_HIGH, 'notifier', 'relocate', local_user());
362                 info(t("Relocate message has been send to your contacts"));
363                 goaway('settings');
364         }
365
366         call_hooks('settings_post', $_POST);
367
368         if (x($_POST, 'password') || x($_POST, 'confirm')) {
369
370                 $newpass = $_POST['password'];
371                 $confirm = $_POST['confirm'];
372                 $oldpass = hash('whirlpool', $_POST['opassword']);
373
374                 $err = false;
375                 if ($newpass != $confirm) {
376                         notice(t('Passwords do not match. Password unchanged.') . EOL);
377                         $err = true;
378                 }
379
380                 if (!x($newpass) || !x($confirm)) {
381                         notice(t('Empty passwords are not allowed. Password unchanged.') . EOL);
382                         $err = true;
383         }
384
385         //  check if the old password was supplied correctly before
386         //  changing it to the new value
387         $r = q("SELECT `password` FROM `user`WHERE `uid` = %d LIMIT 1", intval(local_user()));
388         if ($oldpass != $r[0]['password']) {
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                 $r = q("SELECT `password` FROM `user`WHERE `uid` = %d LIMIT 1", intval(local_user()));
503                 $password = hash('whirlpool', $_POST['mpassword']);
504                 if ($password != $r[0]['password']) {
505                         $err .= t('Wrong Password') . EOL;
506                         $email = $a->user['email'];
507                 }
508                 //  check the email is valid
509                 if (!valid_email($email)) {
510                         $err .= t(' Not valid email.');
511                 }
512                 //  ensure new email is not the admin mail
513                 //if ((x($a->config, 'admin_email')) && (strcasecmp($email, $a->config['admin_email']) == 0)) {
514                 if (x($a->config, 'admin_email')) {
515                         $adminlist = explode(",", str_replace(" ", "", strtolower($a->config['admin_email'])));
516                         if (in_array(strtolower($email), $adminlist)) {
517                                 $err .= t(' Cannot change to that email.');
518                                 $email = $a->user['email'];
519                         }
520                 }
521         }
522
523         if (strlen($err)) {
524                 notice($err . EOL);
525                 return;
526         }
527
528         if (($timezone != $a->user['timezone']) && strlen($timezone)) {
529                 date_default_timezone_set($timezone);
530         }
531
532         $str_group_allow   = perms2str($_POST['group_allow']);
533         $str_contact_allow = perms2str($_POST['contact_allow']);
534         $str_group_deny    = perms2str($_POST['group_deny']);
535         $str_contact_deny  = perms2str($_POST['contact_deny']);
536
537         $openidserver = $a->user['openidserver'];
538         //$openid = normalise_openid($openid);
539
540         // If openid has changed or if there's an openid but no openidserver, try and discover it.
541
542         if ($openid != $a->user['openid'] || (strlen($openid) && (!strlen($openidserver)))) {
543                 $tmp_str = $openid;
544                 if (strlen($tmp_str) && validate_url($tmp_str)) {
545                         logger('updating openidserver');
546                         require_once('library/openid.php');
547                         $open_id_obj = new LightOpenID;
548                         $open_id_obj->identity = $openid;
549                         $openidserver = $open_id_obj->discover($open_id_obj->identity);
550                 } else {
551                         $openidserver = '';
552                 }
553         }
554
555         PConfig::set(local_user(), 'expire', 'items', $expire_items);
556         PConfig::set(local_user(), 'expire', 'notes', $expire_notes);
557         PConfig::set(local_user(), 'expire', 'starred', $expire_starred);
558         PConfig::set(local_user(), 'expire', 'photos', $expire_photos);
559         PConfig::set(local_user(), 'expire', 'network_only', $expire_network_only);
560
561         PConfig::set(local_user(), 'system', 'suggestme', $suggestme);
562         PConfig::set(local_user(), 'system', 'post_newfriend', $post_newfriend);
563         PConfig::set(local_user(), 'system', 'post_joingroup', $post_joingroup);
564         PConfig::set(local_user(), 'system', 'post_profilechange', $post_profilechange);
565
566         PConfig::set(local_user(), 'system', 'email_textonly', $email_textonly);
567         PConfig::set(local_user(), 'system', 'detailed_notif', $detailed_notif);
568
569         if ($page_flags == PAGE_PRVGROUP) {
570                 $hidewall = 1;
571                 if (!$str_contact_allow && !$str_group_allow && !$str_contact_deny && !$str_group_deny) {
572                         if ($def_gid) {
573                                 info(t('Private forum has no privacy permissions. Using default privacy group.'). EOL);
574                                 $str_group_allow = '<' . $def_gid . '>';
575                         } else {
576                                 notice(t('Private forum has no privacy permissions and no default privacy group.') . EOL);
577                         }
578                 }
579         }
580
581
582         $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s',
583                                 `openid` = '%s', `timezone` = '%s',
584                                 `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s',
585                                 `notify-flags` = %d, `page-flags` = %d, `account-type` = %d, `default-location` = '%s',
586                                 `allow_location` = %d, `maxreq` = %d, `expire` = %d, `openidserver` = '%s',
587                                 `def_gid` = %d, `blockwall` = %d, `hidewall` = %d, `blocktags` = %d,
588                                 `unkmail` = %d, `cntunkmail` = %d, `language` = '%s'
589                         WHERE `uid` = %d",
590                         dbesc($username),
591                         dbesc($email),
592                         dbesc($openid),
593                         dbesc($timezone),
594                         dbesc($str_contact_allow),
595                         dbesc($str_group_allow),
596                         dbesc($str_contact_deny),
597                         dbesc($str_group_deny),
598                         intval($notify),
599                         intval($page_flags),
600                         intval($account_type),
601                         dbesc($defloc),
602                         intval($allow_location),
603                         intval($maxreq),
604                         intval($expire),
605                         dbesc($openidserver),
606                         intval($def_gid),
607                         intval($blockwall),
608                         intval($hidewall),
609                         intval($blocktags),
610                         intval($unkmail),
611                         intval($cntunkmail),
612                         dbesc($language),
613                         intval(local_user())
614         );
615         if ($r) {
616                 info(t('Settings updated.') . EOL);
617         }
618
619         // clear session language
620         unset($_SESSION['language']);
621
622         $r = q("UPDATE `profile`
623                 SET `publish` = %d,
624                 `name` = '%s',
625                 `net-publish` = %d,
626                 `hide-friends` = %d
627                 WHERE `is-default` = 1 AND `uid` = %d",
628                 intval($publish),
629                 dbesc($username),
630                 intval($net_publish),
631                 intval($hide_friends),
632                 intval(local_user())
633         );
634
635
636         if ($name_change) {
637                 q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `self`",
638                         dbesc($username),
639                         dbesc(datetime_convert()),
640                         intval(local_user())
641                 );
642         }
643
644         if (($old_visibility != $net_publish) || ($page_flags != $old_page_flags)) {
645                 // Update global directory in background
646                 $url = $_SESSION['my_url'];
647                 if ($url && strlen(Config::get('system', 'directory'))) {
648                         Worker::add(PRIORITY_LOW, "directory", $url);
649                 }
650         }
651
652         Worker::add(PRIORITY_LOW, 'profile_update', local_user());
653
654         // Update the global contact for the user
655         GlobalContact::updateForUser(local_user());
656
657         //$_SESSION['theme'] = $theme;
658         if ($email_changed && $a->config['register_policy'] == REGISTER_VERIFY) {
659
660                 /// @TODO set to un-verified, blocked and redirect to logout
661                 /// @TODO Why? Are we verifying people or email addresses?
662
663         }
664
665         goaway('settings');
666         return; // NOTREACHED
667 }
668
669
670 function settings_content(App $a) {
671
672         $o = '';
673         nav_set_selected('settings');
674
675         if (!local_user()) {
676                 //notice(t('Permission denied.') . EOL);
677                 return;
678         }
679
680         if (x($_SESSION, 'submanage') && intval($_SESSION['submanage'])) {
681                 notice(t('Permission denied.') . EOL);
682                 return;
683         }
684
685
686
687         if (($a->argc > 1) && ($a->argv[1] === 'oauth')) {
688
689                 if (($a->argc > 2) && ($a->argv[2] === 'add')) {
690                         $tpl = get_markup_template("settings_oauth_edit.tpl");
691                         $o .= replace_macros($tpl, array(
692                                 '$form_security_token' => get_form_security_token("settings_oauth"),
693                                 '$title'        => t('Add application'),
694                                 '$submit'       => t('Save Settings'),
695                                 '$cancel'       => t('Cancel'),
696                                 '$name'         => array('name', t('Name'), '', ''),
697                                 '$key'          => array('key', t('Consumer Key'), '', ''),
698                                 '$secret'       => array('secret', t('Consumer Secret'), '', ''),
699                                 '$redirect'     => array('redirect', t('Redirect'), '', ''),
700                                 '$icon'         => array('icon', t('Icon url'), '', ''),
701                         ));
702                         return $o;
703                 }
704
705                 if (($a->argc > 3) && ($a->argv[2] === 'edit')) {
706                         $r = q("SELECT * FROM clients WHERE client_id='%s' AND uid=%d",
707                                         dbesc($a->argv[3]),
708                                         local_user());
709
710                         if (!DBM::is_result($r)) {
711                                 notice(t("You can't edit this application."));
712                                 return;
713                         }
714                         $app = $r[0];
715
716                         $tpl = get_markup_template("settings_oauth_edit.tpl");
717                         $o .= replace_macros($tpl, array(
718                                 '$form_security_token' => get_form_security_token("settings_oauth"),
719                                 '$title'        => t('Add application'),
720                                 '$submit'       => t('Update'),
721                                 '$cancel'       => t('Cancel'),
722                                 '$name'         => array('name', t('Name'), $app['name'] , ''),
723                                 '$key'          => array('key', t('Consumer Key'), $app['client_id'], ''),
724                                 '$secret'       => array('secret', t('Consumer Secret'), $app['pw'], ''),
725                                 '$redirect'     => array('redirect', t('Redirect'), $app['redirect_uri'], ''),
726                                 '$icon'         => array('icon', t('Icon url'), $app['icon'], ''),
727                         ));
728                         return $o;
729                 }
730
731                 if (($a->argc > 3) && ($a->argv[2] === 'delete')) {
732                         check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth', 't');
733
734                         $r = q("DELETE FROM clients WHERE client_id='%s' AND uid=%d",
735                                         dbesc($a->argv[3]),
736                                         local_user());
737                         goaway(System::baseUrl(true)."/settings/oauth/");
738                         return;
739                 }
740
741                 /// @TODO validate result with DBM::is_result()
742                 $r = q("SELECT clients.*, tokens.id as oauth_token, (clients.uid=%d) AS my
743                                 FROM clients
744                                 LEFT JOIN tokens ON clients.client_id=tokens.client_id
745                                 WHERE clients.uid IN (%d, 0)",
746                                 local_user(),
747                                 local_user());
748
749
750                 $tpl = get_markup_template("settings_oauth.tpl");
751                 $o .= replace_macros($tpl, array(
752                         '$form_security_token' => get_form_security_token("settings_oauth"),
753                         '$baseurl'      => System::baseUrl(true),
754                         '$title'        => t('Connected Apps'),
755                         '$add'          => t('Add application'),
756                         '$edit'         => t('Edit'),
757                         '$delete'               => t('Delete'),
758                         '$consumerkey' => t('Client key starts with'),
759                         '$noname'       => t('No name'),
760                         '$remove'       => t('Remove authorization'),
761                         '$apps'         => $r,
762                 ));
763                 return $o;
764
765         }
766
767         if (($a->argc > 1) && ($a->argv[1] === 'addon')) {
768                 $settings_addons = "";
769
770                 $r = q("SELECT * FROM `hook` WHERE `hook` = 'plugin_settings' ");
771                 if (!DBM::is_result($r)) {
772                         $settings_addons = t('No Plugin settings configured');
773                 }
774
775                 call_hooks('plugin_settings', $settings_addons);
776
777
778                 $tpl = get_markup_template("settings_addons.tpl");
779                 $o .= replace_macros($tpl, array(
780                         '$form_security_token' => get_form_security_token("settings_addon"),
781                         '$title'        => t('Plugin Settings'),
782                         '$settings_addons' => $settings_addons
783                 ));
784                 return $o;
785         }
786
787         if (($a->argc > 1) && ($a->argv[1] === 'features')) {
788
789                 $arr = array();
790                 $features = get_features();
791                 foreach ($features as $fname => $fdata) {
792                         $arr[$fname] = array();
793                         $arr[$fname][0] = $fdata[0];
794                         foreach (array_slice($fdata,1) as $f) {
795                                 $arr[$fname][1][] = array('feature_' .$f[0], $f[1],((intval(feature_enabled(local_user(), $f[0]))) ? "1" : ''), $f[2],array(t('Off'), t('On')));
796                         }
797                 }
798
799
800                 $tpl = get_markup_template("settings_features.tpl");
801                 $o .= replace_macros($tpl, array(
802                         '$form_security_token' => get_form_security_token("settings_features"),
803                         '$title'               => t('Additional Features'),
804                         '$features'            => $arr,
805                         '$submit'              => t('Save Settings'),
806                 ));
807                 return $o;
808         }
809
810         if (($a->argc > 1) && ($a->argv[1] === 'connectors')) {
811
812                 $settings_connectors = '<span id="settings_general_inflated" class="settings-block fakelink" style="display: block;" 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                 $settings_connectors .= '<div id="settings_general_expanded" class="settings-block" style="display: none;">';
816                 $settings_connectors .= '<span class="fakelink" onclick="openClose(\'settings_general_expanded\'); openClose(\'settings_general_inflated\');">';
817                 $settings_connectors .= '<h3 class="connector">'. t('General Social Media Settings').'</h3>';
818                 $settings_connectors .= '</span>';
819
820                 $checked = ((PConfig::get(local_user(), 'system', 'no_intelligent_shortening')) ? ' checked="checked" ' : '');
821
822                 $settings_connectors .= '<div id="no_intelligent_shortening" class="field checkbox">';
823                 $settings_connectors .= '<label id="no_intelligent_shortening-label" for="shortening-checkbox">'. t('Disable intelligent shortening'). '</label>';
824                 $settings_connectors .= '<input id="shortening-checkbox" type="checkbox" name="no_intelligent_shortening" value="1" ' . $checked . '/>';
825                 $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>';
826                 $settings_connectors .= '</div>';
827
828                 $checked = ((PConfig::get(local_user(), 'system', 'ostatus_autofriend')) ? ' checked="checked" ' : '');
829
830                 $settings_connectors .= '<div id="snautofollow-wrapper" class="field checkbox">';
831                 $settings_connectors .= '<label id="snautofollow-label" for="snautofollow-checkbox">'. t('Automatically follow any GNU Social (OStatus) followers/mentioners'). '</label>';
832                 $settings_connectors .= '<input id="snautofollow-checkbox" type="checkbox" name="snautofollow" value="1" ' . $checked . '/>';
833                 $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>';
834                 $settings_connectors .= '</div>';
835
836                 $default_group = PConfig::get(local_user(), 'ostatus', 'default_group');
837                 $legacy_contact = PConfig::get(local_user(), 'ostatus', 'legacy_contact');
838
839                 $settings_connectors .= mini_group_select(local_user(), $default_group, t("Default group for OStatus contacts"));
840
841                 /// @TODO Found to much different usage to test empty/non-empty strings (e.g. empty(), trim() == '') which is wanted?
842                 if ($legacy_contact != "") {
843                         $a->page['htmlhead'] = '<meta http-equiv="refresh" content="0; URL='.System::baseUrl().'/ostatus_subscribe?url='.urlencode($legacy_contact).'">';
844                 }
845
846                 $settings_connectors .= '<div id="legacy-contact-wrapper" class="field input">';
847                 $settings_connectors .= '<label id="legacy-contact-label" for="snautofollow-checkbox">'. t('Your legacy GNU Social account'). '</label>';
848                 $settings_connectors .= '<input id="legacy-contact-checkbox" name="legacy_contact" value="'.$legacy_contact.'"/>';
849                 $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>';
850                 $settings_connectors .= '</div>';
851
852                 $settings_connectors .= '<p><a href="'.System::baseUrl().'/repair_ostatus">'.t("Repair OStatus subscriptions").'</a></p>';
853
854                 $settings_connectors .= '<div class="settings-submit-wrapper" ><input type="submit" name="general-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
855
856                 $settings_connectors .= '</div><div class="clear"></div>';
857
858                 call_hooks('connector_settings', $settings_connectors);
859
860                 if (is_site_admin()) {
861                         $diasp_enabled = sprintf(t('Built-in support for %s connectivity is %s'), t('Diaspora'), ((Config::get('system', 'diaspora_enabled')) ? t('enabled') : t('disabled')));
862                         $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')));
863                 } else {
864                         $diasp_enabled = "";
865                         $ostat_enabled = "";
866                 }
867
868                 $mail_disabled = ((function_exists('imap_open') && (!Config::get('system', 'imap_disabled'))) ? 0 : 1);
869                 if (Config::get('system', 'dfrn_only')) {
870                         $mail_disabled = 1;
871                 }
872                 if (!$mail_disabled) {
873                         $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
874                                 local_user()
875                         );
876                 } else {
877                         $r = null;
878                 }
879
880                 $mail_server       = ((DBM::is_result($r)) ? $r[0]['server'] : '');
881                 $mail_port         = ((DBM::is_result($r) && intval($r[0]['port'])) ? intval($r[0]['port']) : '');
882                 $mail_ssl          = ((DBM::is_result($r)) ? $r[0]['ssltype'] : '');
883                 $mail_user         = ((DBM::is_result($r)) ? $r[0]['user'] : '');
884                 $mail_replyto      = ((DBM::is_result($r)) ? $r[0]['reply_to'] : '');
885                 $mail_pubmail      = ((DBM::is_result($r)) ? $r[0]['pubmail'] : 0);
886                 $mail_action       = ((DBM::is_result($r)) ? $r[0]['action'] : 0);
887                 $mail_movetofolder = ((DBM::is_result($r)) ? $r[0]['movetofolder'] : '');
888                 $mail_chk          = ((DBM::is_result($r)) ? $r[0]['last_check'] : NULL_DATE);
889
890
891                 $tpl = get_markup_template("settings_connectors.tpl");
892
893                 $mail_disabled_message = (($mail_disabled) ? t('Email access is disabled on this site.') : '');
894
895                 $o .= replace_macros($tpl, array(
896                         '$form_security_token' => get_form_security_token("settings_connectors"),
897
898                         '$title'        => t('Social Networks'),
899
900                         '$diasp_enabled' => $diasp_enabled,
901                         '$ostat_enabled' => $ostat_enabled,
902
903                         '$h_imap' => t('Email/Mailbox Setup'),
904                         '$imap_desc' => t("If you wish to communicate with email contacts using this service \x28optional\x29, please specify how to connect to your mailbox."),
905                         '$imap_lastcheck' => array('imap_lastcheck', t('Last successful email check:'), $mail_chk, ''),
906                         '$mail_disabled' => $mail_disabled_message,
907                         '$mail_server'  => array('mail_server',  t('IMAP server name:'), $mail_server, ''),
908                         '$mail_port'    => array('mail_port',    t('IMAP port:'), $mail_port, ''),
909                         '$mail_ssl'             => array('mail_ssl',     t('Security:'), strtoupper($mail_ssl), '', array('notls'=>t('None'), 'TLS'=>'TLS', 'SSL'=>'SSL')),
910                         '$mail_user'    => array('mail_user',    t('Email login name:'), $mail_user, ''),
911                         '$mail_pass'    => array('mail_pass',    t('Email password:'), '', ''),
912                         '$mail_replyto' => array('mail_replyto', t('Reply-to address:'), $mail_replyto, 'Optional'),
913                         '$mail_pubmail' => array('mail_pubmail', t('Send public posts to all email contacts:'), $mail_pubmail, ''),
914                         '$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'))),
915                         '$mail_movetofolder'    => array('mail_movetofolder',    t('Move to folder:'), $mail_movetofolder, ''),
916                         '$submit' => t('Save Settings'),
917
918                         '$settings_connectors' => $settings_connectors
919                 ));
920
921                 call_hooks('display_settings', $o);
922                 return $o;
923         }
924
925         /*
926          * DISPLAY SETTINGS
927          */
928         if (($a->argc > 1) && ($a->argv[1] === 'display')) {
929                 $default_theme = Config::get('system', 'theme');
930                 if (!$default_theme) {
931                         $default_theme = 'default';
932                 }
933                 $default_mobile_theme = Config::get('system', 'mobile-theme');
934                 if (!$mobile_default_theme) {
935                         $mobile_default_theme = 'none';
936                 }
937
938                 $allowed_themes_str = Config::get('system', 'allowed_themes');
939                 $allowed_themes_raw = explode(',', $allowed_themes_str);
940                 $allowed_themes = array();
941                 if (count($allowed_themes_raw)) {
942                         foreach ($allowed_themes_raw as $x) {
943                                 if (strlen(trim($x)) && is_dir("view/theme/$x")) {
944                                         $allowed_themes[] = trim($x);
945                                 }
946                         }
947                 }
948
949
950                 $themes = array();
951                 $mobile_themes = array("---" => t('No special theme for mobile devices'));
952                 $files = glob('view/theme/*'); /* */
953                 if ($allowed_themes) {
954                         foreach ($allowed_themes as $th) {
955                                 $f = $th;
956                                 $is_experimental = file_exists('view/theme/' . $th . '/experimental');
957                                 $unsupported = file_exists('view/theme/' . $th . '/unsupported');
958                                 $is_mobile = file_exists('view/theme/' . $th . '/mobile');
959                                 if (!$is_experimental || ($is_experimental && (Config::get('experimentals', 'exp_themes')==1 || is_null(Config::get('experimentals', 'exp_themes'))))) {
960                                         $theme_name = (($is_experimental) ?  sprintf("%s - \x28Experimental\x29", $f) : $f);
961                                         if ($is_mobile) {
962                                                 $mobile_themes[$f]=$theme_name;
963                                         } else {
964                                                 $themes[$f]=$theme_name;
965                                         }
966                                 }
967                         }
968                 }
969                 $theme_selected = (!x($_SESSION, 'theme')? $default_theme : $_SESSION['theme']);
970                 $mobile_theme_selected = (!x($_SESSION, 'mobile-theme')? $default_mobile_theme : $_SESSION['mobile-theme']);
971
972                 $nowarn_insecure = intval(PConfig::get(local_user(), 'system', 'nowarn_insecure'));
973
974                 $browser_update = intval(PConfig::get(local_user(), 'system', 'update_interval'));
975                 if (intval($browser_update) != -1) {
976                         $browser_update = (($browser_update == 0) ? 40 : $browser_update / 1000); // default if not set: 40 seconds
977                 }
978
979                 $itemspage_network = intval(PConfig::get(local_user(), 'system', 'itemspage_network'));
980                 $itemspage_network = (($itemspage_network > 0 && $itemspage_network < 101) ? $itemspage_network : 40); // default if not set: 40 items
981                 $itemspage_mobile_network = intval(PConfig::get(local_user(), 'system', 'itemspage_mobile_network'));
982                 $itemspage_mobile_network = (($itemspage_mobile_network > 0 && $itemspage_mobile_network < 101) ? $itemspage_mobile_network : 20); // default if not set: 20 items
983
984                 $nosmile = PConfig::get(local_user(), 'system', 'no_smilies', 0);
985                 $first_day_of_week = PConfig::get(local_user(), 'system', 'first_day_of_week', 0);
986                 $weekdays = array(0 => t("Sunday"), 1 => t("Monday"));
987
988                 $noinfo = PConfig::get(local_user(), 'system', 'ignore_info', 0);
989                 $infinite_scroll = PConfig::get(local_user(), 'system', 'infinite_scroll', 0);
990                 $no_auto_update = PConfig::get(local_user(), 'system', 'no_auto_update', 0);
991                 $bandwidth_saver = PConfig::get(local_user(), 'system', 'bandwidth_saver', 0);
992
993                 $theme_config = "";
994                 if (($themeconfigfile = get_theme_config_file($theme_selected)) != null) {
995                         require_once($themeconfigfile);
996                         $theme_config = theme_content($a);
997                 }
998
999                 $tpl = get_markup_template("settings_display.tpl");
1000                 $o = replace_macros($tpl, array(
1001                         '$ptitle'       => t('Display Settings'),
1002                         '$form_security_token' => get_form_security_token("settings_display"),
1003                         '$submit'       => t('Save Settings'),
1004                         '$baseurl' => System::baseUrl(true),
1005                         '$uid' => local_user(),
1006
1007                         '$theme'        => array('theme', t('Display Theme:'), $theme_selected, '', $themes, true),
1008                         '$mobile_theme' => array('mobile_theme', t('Mobile Theme:'), $mobile_theme_selected, '', $mobile_themes, false),
1009                         '$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.")),
1010                         '$ajaxint'   => array('browser_update',  t("Update browser every xx seconds"), $browser_update, t('Minimum of 10 seconds. Enter -1 to disable it.')),
1011                         '$itemspage_network'   => array('itemspage_network',  t("Number of items to display per page:"), $itemspage_network, t('Maximum of 100 items')),
1012                         '$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')),
1013                         '$nosmile'      => array('nosmile', t("Don't show emoticons"), $nosmile, ''),
1014                         '$calendar_title' => t('Calendar'),
1015                         '$first_day_of_week'    => array('first_day_of_week', t('Beginning of week:'), $first_day_of_week, '', $weekdays, false),
1016                         '$noinfo'       => array('noinfo', t("Don't show notices"), $noinfo, ''),
1017                         '$infinite_scroll'      => array('infinite_scroll', t("Infinite scroll"), $infinite_scroll, ''),
1018                         '$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.')),
1019                         '$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.')),
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 }