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