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