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