]> git.mxchange.org Git - friendica.git/blob - mod/settings.php
Merge pull request #2899 from tobiasd/20161109-stats
[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(&$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(&$a) {
120
121         if(! local_user())
122                 return;
123
124         if(x($_SESSION,'submanage') && intval($_SESSION['submanage']))
125                 return;
126
127         if(count($a->user) && x($a->user,'uid') && $a->user['uid'] != local_user()) {
128                 notice( t('Permission denied.') . EOL);
129                 return;
130         }
131
132         $old_page_flags = $a->user['page-flags'];
133
134         if(($a->argc > 1) && ($a->argv[1] === 'oauth') && x($_POST,'remove')){
135                 check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
136
137                 $key = $_POST['remove'];
138                 q("DELETE FROM tokens WHERE id='%s' AND uid=%d",
139                         dbesc($key),
140                         local_user());
141                 goaway($a->get_baseurl(true)."/settings/oauth/");
142                 return;
143         }
144
145         if(($a->argc > 2) && ($a->argv[1] === 'oauth')  && ($a->argv[2] === 'edit'||($a->argv[2] === 'add')) && x($_POST,'submit')) {
146
147                 check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth');
148
149                 $name           = ((x($_POST,'name')) ? $_POST['name'] : '');
150                 $key            = ((x($_POST,'key')) ? $_POST['key'] : '');
151                 $secret         = ((x($_POST,'secret')) ? $_POST['secret'] : '');
152                 $redirect       = ((x($_POST,'redirect')) ? $_POST['redirect'] : '');
153                 $icon           = ((x($_POST,'icon')) ? $_POST['icon'] : '');
154                 if ($name=="" || $key=="" || $secret==""){
155                         notice(t("Missing some important data!"));
156
157                 } else {
158                         if ($_POST['submit']==t("Update")){
159                                 $r = q("UPDATE clients SET
160                                                         client_id='%s',
161                                                         pw='%s',
162                                                         name='%s',
163                                                         redirect_uri='%s',
164                                                         icon='%s',
165                                                         uid=%d
166                                                 WHERE client_id='%s'",
167                                                 dbesc($key),
168                                                 dbesc($secret),
169                                                 dbesc($name),
170                                                 dbesc($redirect),
171                                                 dbesc($icon),
172                                                 local_user(),
173                                                 dbesc($key));
174                         } else {
175                                 $r = q("INSERT INTO clients
176                                                         (client_id, pw, name, redirect_uri, icon, uid)
177                                                 VALUES ('%s','%s','%s','%s','%s',%d)",
178                                                 dbesc($key),
179                                                 dbesc($secret),
180                                                 dbesc($name),
181                                                 dbesc($redirect),
182                                                 dbesc($icon),
183                                                 local_user());
184                         }
185                 }
186                 goaway($a->get_baseurl(true)."/settings/oauth/");
187                 return;
188         }
189
190         if(($a->argc > 1) && ($a->argv[1] == 'addon')) {
191                 check_form_security_token_redirectOnErr('/settings/addon', 'settings_addon');
192
193                 call_hooks('plugin_settings_post', $_POST);
194                 return;
195         }
196
197         if(($a->argc > 1) && ($a->argv[1] == 'connectors')) {
198
199                 check_form_security_token_redirectOnErr('/settings/connectors', 'settings_connectors');
200
201                 if(x($_POST, 'general-submit')) {
202                         set_pconfig(local_user(), 'system', 'no_intelligent_shortening', intval($_POST['no_intelligent_shortening']));
203                         set_pconfig(local_user(), 'system', 'ostatus_autofriend', intval($_POST['snautofollow']));
204                         set_pconfig(local_user(), 'ostatus', 'default_group', $_POST['group-selection']);
205                         set_pconfig(local_user(), 'ostatus', 'legacy_contact', $_POST['legacy_contact']);
206                 } elseif(x($_POST, 'imap-submit')) {
207
208                         $mail_server       = ((x($_POST,'mail_server')) ? $_POST['mail_server'] : '');
209                         $mail_port         = ((x($_POST,'mail_port')) ? $_POST['mail_port'] : '');
210                         $mail_ssl          = ((x($_POST,'mail_ssl')) ? strtolower(trim($_POST['mail_ssl'])) : '');
211                         $mail_user         = ((x($_POST,'mail_user')) ? $_POST['mail_user'] : '');
212                         $mail_pass         = ((x($_POST,'mail_pass')) ? trim($_POST['mail_pass']) : '');
213                         $mail_action       = ((x($_POST,'mail_action')) ? trim($_POST['mail_action']) : '');
214                         $mail_movetofolder = ((x($_POST,'mail_movetofolder')) ? trim($_POST['mail_movetofolder']) : '');
215                         $mail_replyto      = ((x($_POST,'mail_replyto')) ? $_POST['mail_replyto'] : '');
216                         $mail_pubmail      = ((x($_POST,'mail_pubmail')) ? $_POST['mail_pubmail'] : '');
217
218
219                         $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
220                         if(get_config('system','dfrn_only'))
221                                 $mail_disabled = 1;
222
223                         if(! $mail_disabled) {
224                                 $failed = false;
225                                 $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
226                                         intval(local_user())
227                                 );
228                                 if(! count($r)) {
229                                         q("INSERT INTO `mailacct` (`uid`) VALUES (%d)",
230                                                 intval(local_user())
231                                         );
232                                 }
233                                 if(strlen($mail_pass)) {
234                                         $pass = '';
235                                         openssl_public_encrypt($mail_pass,$pass,$a->user['pubkey']);
236                                         q("UPDATE `mailacct` SET `pass` = '%s' WHERE `uid` = %d",
237                                                 dbesc(bin2hex($pass)),
238                                                 intval(local_user())
239                                         );
240                                 }
241                                 $r = q("UPDATE `mailacct` SET `server` = '%s', `port` = %d, `ssltype` = '%s', `user` = '%s',
242                                         `action` = %d, `movetofolder` = '%s',
243                                         `mailbox` = 'INBOX', `reply_to` = '%s', `pubmail` = %d WHERE `uid` = %d",
244                                         dbesc($mail_server),
245                                         intval($mail_port),
246                                         dbesc($mail_ssl),
247                                         dbesc($mail_user),
248                                         intval($mail_action),
249                                         dbesc($mail_movetofolder),
250                                         dbesc($mail_replyto),
251                                         intval($mail_pubmail),
252                                         intval(local_user())
253                                 );
254                                 logger("mail: updating mailaccount. Response: ".print_r($r, true));
255                                 $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
256                                         intval(local_user())
257                                 );
258                                 if(count($r)) {
259                                         $eacct = $r[0];
260                                         require_once('include/email.php');
261                                         $mb = construct_mailbox_name($eacct);
262                                         if(strlen($eacct['server'])) {
263                                                 $dcrpass = '';
264                                                 openssl_private_decrypt(hex2bin($eacct['pass']),$dcrpass,$a->user['prvkey']);
265                                                 $mbox = email_connect($mb,$mail_user,$dcrpass);
266                                                 unset($dcrpass);
267                                                 if(! $mbox) {
268                                                         $failed = true;
269                                                         notice( t('Failed to connect with email account using the settings provided.') . EOL);
270                                                 }
271                                         }
272                                 }
273                                 if(! $failed)
274                                         info( t('Email settings updated.') . EOL);
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                                 set_pconfig(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                 $browser_update    = x($_POST, 'browser_update')    ? intval($_POST['browser_update'])     : 0;
305                 if ($browser_update != -1) {
306                         $browser_update = $browser_update * 1000;
307                         if ($browser_update < 10000)
308                                 $browser_update = 10000;
309                 }
310
311                 $itemspage_network = x($_POST,'itemspage_network')  ? intval($_POST['itemspage_network'])  : 40;
312                 if ($itemspage_network > 100) {
313                         $itemspage_network = 100;
314                 }
315                 $itemspage_mobile_network = x($_POST,'itemspage_mobile_network') ? intval($_POST['itemspage_mobile_network']) : 20;
316                 if ($itemspage_mobile_network > 100) {
317                         $itemspage_mobile_network = 100;
318                 }
319
320                 if($mobile_theme !== '') {
321                         set_pconfig(local_user(),'system','mobile_theme',$mobile_theme);
322                 }
323
324                 set_pconfig(local_user(), 'system', 'update_interval'         , $browser_update);
325                 set_pconfig(local_user(), 'system', 'itemspage_network'       , $itemspage_network);
326                 set_pconfig(local_user(), 'system', 'itemspage_mobile_network', $itemspage_mobile_network);
327                 set_pconfig(local_user(), 'system', 'no_smilies'              , $nosmile);
328                 set_pconfig(local_user(), 'system', 'first_day_of_week'       , $first_day_of_week);
329                 set_pconfig(local_user(), 'system', 'ignore_info'             , $noinfo);
330                 set_pconfig(local_user(), 'system', 'infinite_scroll'         , $infinite_scroll);
331                 set_pconfig(local_user(), 'system', 'no_auto_update'          , $no_auto_update);
332                 set_pconfig(local_user(), 'system', 'bandwidth_saver'         , $bandwidth_saver);
333
334                 if ($theme == $a->user['theme']) {
335                         // call theme_post only if theme has not been changed
336                         if (($themeconfigfile = get_theme_config_file($theme)) != null) {
337                                 require_once($themeconfigfile);
338                                 theme_post($a);
339                         }
340                 }
341
342
343                 $r = q("UPDATE `user` SET `theme` = '%s' WHERE `uid` = %d",
344                                 dbesc($theme),
345                                 intval(local_user())
346                 );
347
348                 call_hooks('display_settings_post', $_POST);
349                 goaway('settings/display' );
350                 return; // NOTREACHED
351         }
352
353         check_form_security_token_redirectOnErr('/settings', 'settings');
354
355         if (x($_POST,'resend_relocate')) {
356                 proc_run(PRIORITY_HIGH, 'include/notifier.php', 'relocate', local_user());
357                 info(t("Relocate message has been send to your contacts"));
358                 goaway('settings');
359         }
360
361         call_hooks('settings_post', $_POST);
362
363         if((x($_POST,'password')) || (x($_POST,'confirm'))) {
364
365                 $newpass = $_POST['password'];
366                 $confirm = $_POST['confirm'];
367                 $oldpass = hash('whirlpool', $_POST['opassword']);
368
369                 $err = false;
370                 if($newpass != $confirm ) {
371                         notice( t('Passwords do not match. Password unchanged.') . EOL);
372                         $err = true;
373                 }
374
375                 if((! x($newpass)) || (! x($confirm))) {
376                         notice( t('Empty passwords are not allowed. Password unchanged.') . EOL);
377                         $err = true;
378         }
379
380         //  check if the old password was supplied correctly before
381         //  changing it to the new value
382         $r = q("SELECT `password` FROM `user`WHERE `uid` = %d LIMIT 1", intval(local_user()));
383         if( $oldpass != $r[0]['password'] ) {
384             notice( t('Wrong password.') . EOL);
385             $err = true;
386         }
387
388                 if(! $err) {
389                         $password = hash('whirlpool',$newpass);
390                         $r = q("UPDATE `user` SET `password` = '%s' WHERE `uid` = %d",
391                                 dbesc($password),
392                                 intval(local_user())
393                         );
394                         if($r)
395                                 info( t('Password changed.') . EOL);
396                         else
397                                 notice( t('Password update failed. Please try again.') . EOL);
398                 }
399         }
400
401
402         $username         = ((x($_POST,'username'))   ? notags(trim($_POST['username']))     : '');
403         $email            = ((x($_POST,'email'))      ? notags(trim($_POST['email']))        : '');
404         $timezone         = ((x($_POST,'timezone'))   ? notags(trim($_POST['timezone']))     : '');
405         $language         = ((x($_POST,'language'))   ? notags(trim($_POST['language']))     : '');
406
407         $defloc           = ((x($_POST,'defloc'))     ? notags(trim($_POST['defloc']))       : '');
408         $openid           = ((x($_POST,'openid_url')) ? notags(trim($_POST['openid_url']))   : '');
409         $maxreq           = ((x($_POST,'maxreq'))     ? intval($_POST['maxreq'])             : 0);
410         $expire           = ((x($_POST,'expire'))     ? intval($_POST['expire'])             : 0);
411         $def_gid          = ((x($_POST,'group-selection')) ? intval($_POST['group-selection']) : 0);
412
413
414         $expire_items     = ((x($_POST,'expire_items')) ? intval($_POST['expire_items'])         : 0);
415         $expire_notes     = ((x($_POST,'expire_notes')) ? intval($_POST['expire_notes'])         : 0);
416         $expire_starred   = ((x($_POST,'expire_starred')) ? intval($_POST['expire_starred']) : 0);
417         $expire_photos    = ((x($_POST,'expire_photos'))? intval($_POST['expire_photos'])        : 0);
418         $expire_network_only    = ((x($_POST,'expire_network_only'))? intval($_POST['expire_network_only'])      : 0);
419
420         $allow_location   = (((x($_POST,'allow_location')) && (intval($_POST['allow_location']) == 1)) ? 1: 0);
421         $publish          = (((x($_POST,'profile_in_directory')) && (intval($_POST['profile_in_directory']) == 1)) ? 1: 0);
422         $net_publish      = (((x($_POST,'profile_in_netdirectory')) && (intval($_POST['profile_in_netdirectory']) == 1)) ? 1: 0);
423         $old_visibility   = (((x($_POST,'visibility')) && (intval($_POST['visibility']) == 1)) ? 1 : 0);
424         $account_type     = (((x($_POST,'account-type')) && (intval($_POST['account-type']))) ? intval($_POST['account-type']) : 0);
425         $page_flags       = (((x($_POST,'page-flags')) && (intval($_POST['page-flags']))) ? intval($_POST['page-flags']) : 0);
426         $blockwall        = (((x($_POST,'blockwall')) && (intval($_POST['blockwall']) == 1)) ? 0: 1); // this setting is inverted!
427         $blocktags        = (((x($_POST,'blocktags')) && (intval($_POST['blocktags']) == 1)) ? 0: 1); // this setting is inverted!
428         $unkmail          = (((x($_POST,'unkmail')) && (intval($_POST['unkmail']) == 1)) ? 1: 0);
429         $cntunkmail       = ((x($_POST,'cntunkmail')) ? intval($_POST['cntunkmail']) : 0);
430         $suggestme        = ((x($_POST,'suggestme')) ? intval($_POST['suggestme'])  : 0);
431         $hide_friends     = (($_POST['hide-friends'] == 1) ? 1: 0);
432         $hidewall         = (($_POST['hidewall'] == 1) ? 1: 0);
433         $post_newfriend   = (($_POST['post_newfriend'] == 1) ? 1: 0);
434         $post_joingroup   = (($_POST['post_joingroup'] == 1) ? 1: 0);
435         $post_profilechange   = (($_POST['post_profilechange'] == 1) ? 1: 0);
436
437         $email_textonly   = (($_POST['email_textonly'] == 1) ? 1 : 0);
438
439         $notify = 0;
440
441         if(x($_POST,'notify1'))
442                 $notify += intval($_POST['notify1']);
443         if(x($_POST,'notify2'))
444                 $notify += intval($_POST['notify2']);
445         if(x($_POST,'notify3'))
446                 $notify += intval($_POST['notify3']);
447         if(x($_POST,'notify4'))
448                 $notify += intval($_POST['notify4']);
449         if(x($_POST,'notify5'))
450                 $notify += intval($_POST['notify5']);
451         if(x($_POST,'notify6'))
452                 $notify += intval($_POST['notify6']);
453         if(x($_POST,'notify7'))
454                 $notify += intval($_POST['notify7']);
455         if(x($_POST,'notify8'))
456                 $notify += intval($_POST['notify8']);
457
458         // Adjust the page flag if the account type doesn't fit to the page flag.
459         if (($account_type == ACCOUNT_TYPE_PERSON) AND !in_array($page_flags, array(PAGE_NORMAL, PAGE_SOAPBOX, PAGE_FREELOVE)))
460                 $page_flags = PAGE_NORMAL;
461         elseif (($account_type == ACCOUNT_TYPE_ORGANISATION) AND !in_array($page_flags, array(PAGE_SOAPBOX)))
462                 $page_flags = PAGE_SOAPBOX;
463         elseif (($account_type == ACCOUNT_TYPE_NEWS) AND !in_array($page_flags, array(PAGE_SOAPBOX)))
464                 $page_flags = PAGE_SOAPBOX;
465         elseif (($account_type == ACCOUNT_TYPE_COMMUNITY) AND !in_array($page_flags, array(PAGE_COMMUNITY, PAGE_PRVGROUP)))
466                 $page_flags = PAGE_COMMUNITY;
467
468         $email_changed = false;
469
470         $err = '';
471
472         $name_change = false;
473
474         if($username != $a->user['username']) {
475                 $name_change = true;
476                 if(strlen($username) > 40)
477                         $err .= t(' Please use a shorter name.');
478                 if(strlen($username) < 3)
479                         $err .= t(' Name too short.');
480         }
481
482         if($email != $a->user['email']) {
483                 $email_changed = true;
484                 //  check for the correct password
485                 $r = q("SELECT `password` FROM `user`WHERE `uid` = %d LIMIT 1", intval(local_user()));
486                 $password = hash('whirlpool', $_POST['mpassword']);
487                 if ($password != $r[0]['password']) {
488                         $err .= t('Wrong Password') . EOL;
489                         $email = $a->user['email'];
490                 }
491                 //  check the email is valid
492                 if(! valid_email($email))
493                         $err .= t(' Not valid email.');
494                 //  ensure new email is not the admin mail
495                 //if((x($a->config,'admin_email')) && (strcasecmp($email,$a->config['admin_email']) == 0)) {
496                 if(x($a->config,'admin_email')) {
497                         $adminlist = explode(",", str_replace(" ", "", strtolower($a->config['admin_email'])));
498                         if (in_array(strtolower($email), $adminlist)) {
499                                 $err .= t(' Cannot change to that email.');
500                                 $email = $a->user['email'];
501                         }
502                 }
503         }
504
505         if(strlen($err)) {
506                 notice($err . EOL);
507                 return;
508         }
509
510         if($timezone != $a->user['timezone']) {
511                 if(strlen($timezone))
512                         date_default_timezone_set($timezone);
513         }
514
515         $str_group_allow   = perms2str($_POST['group_allow']);
516         $str_contact_allow = perms2str($_POST['contact_allow']);
517         $str_group_deny    = perms2str($_POST['group_deny']);
518         $str_contact_deny  = perms2str($_POST['contact_deny']);
519
520         $openidserver = $a->user['openidserver'];
521         //$openid = normalise_openid($openid);
522
523         // If openid has changed or if there's an openid but no openidserver, try and discover it.
524
525         if($openid != $a->user['openid'] || (strlen($openid) && (! strlen($openidserver)))) {
526                 $tmp_str = $openid;
527                 if(strlen($tmp_str) && validate_url($tmp_str)) {
528                         logger('updating openidserver');
529                         require_once('library/openid.php');
530                         $open_id_obj = new LightOpenID;
531                         $open_id_obj->identity = $openid;
532                         $openidserver = $open_id_obj->discover($open_id_obj->identity);
533                 }
534                 else
535                         $openidserver = '';
536         }
537
538         set_pconfig(local_user(),'expire','items', $expire_items);
539         set_pconfig(local_user(),'expire','notes', $expire_notes);
540         set_pconfig(local_user(),'expire','starred', $expire_starred);
541         set_pconfig(local_user(),'expire','photos', $expire_photos);
542         set_pconfig(local_user(),'expire','network_only', $expire_network_only);
543
544         set_pconfig(local_user(),'system','suggestme', $suggestme);
545         set_pconfig(local_user(),'system','post_newfriend', $post_newfriend);
546         set_pconfig(local_user(),'system','post_joingroup', $post_joingroup);
547         set_pconfig(local_user(),'system','post_profilechange', $post_profilechange);
548
549         set_pconfig(local_user(),'system','email_textonly', $email_textonly);
550
551         if($page_flags == PAGE_PRVGROUP) {
552                 $hidewall = 1;
553                 if((! $str_contact_allow) && (! $str_group_allow) && (! $str_contact_deny) && (! $str_group_deny)) {
554                         if($def_gid) {
555                                 info( t('Private forum has no privacy permissions. Using default privacy group.'). EOL);
556                                 $str_group_allow = '<' . $def_gid . '>';
557                         }
558                         else {
559                                 notice( t('Private forum has no privacy permissions and no default privacy group.') . EOL);
560                         }
561                 }
562         }
563
564
565         $r = q("UPDATE `user` SET `username` = '%s', `email` = '%s',
566                                 `openid` = '%s', `timezone` = '%s',
567                                 `allow_cid` = '%s', `allow_gid` = '%s', `deny_cid` = '%s', `deny_gid` = '%s',
568                                 `notify-flags` = %d, `page-flags` = %d, `account-type` = %d, `default-location` = '%s',
569                                 `allow_location` = %d, `maxreq` = %d, `expire` = %d, `openidserver` = '%s',
570                                 `def_gid` = %d, `blockwall` = %d, `hidewall` = %d, `blocktags` = %d,
571                                 `unkmail` = %d, `cntunkmail` = %d, `language` = '%s'
572                         WHERE `uid` = %d",
573                         dbesc($username),
574                         dbesc($email),
575                         dbesc($openid),
576                         dbesc($timezone),
577                         dbesc($str_contact_allow),
578                         dbesc($str_group_allow),
579                         dbesc($str_contact_deny),
580                         dbesc($str_group_deny),
581                         intval($notify),
582                         intval($page_flags),
583                         intval($account_type),
584                         dbesc($defloc),
585                         intval($allow_location),
586                         intval($maxreq),
587                         intval($expire),
588                         dbesc($openidserver),
589                         intval($def_gid),
590                         intval($blockwall),
591                         intval($hidewall),
592                         intval($blocktags),
593                         intval($unkmail),
594                         intval($cntunkmail),
595                         dbesc($language),
596                         intval(local_user())
597         );
598         if($r)
599                 info( t('Settings updated.') . EOL);
600
601         // clear session language
602         unset($_SESSION['language']);
603
604         $r = q("UPDATE `profile`
605                 SET `publish` = %d,
606                 `name` = '%s',
607                 `net-publish` = %d,
608                 `hide-friends` = %d
609                 WHERE `is-default` = 1 AND `uid` = %d",
610                 intval($publish),
611                 dbesc($username),
612                 intval($net_publish),
613                 intval($hide_friends),
614                 intval(local_user())
615         );
616
617
618         if($name_change) {
619                 q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s' WHERE `uid` = %d AND `self`",
620                         dbesc($username),
621                         dbesc(datetime_convert()),
622                         intval(local_user())
623                 );
624         }
625
626         if(($old_visibility != $net_publish) || ($page_flags != $old_page_flags)) {
627                 // Update global directory in background
628                 $url = $_SESSION['my_url'];
629                 if($url && strlen(get_config('system','directory')))
630                         proc_run(PRIORITY_LOW, "include/directory.php", $url);
631         }
632
633         require_once('include/profile_update.php');
634         profile_change();
635
636         // Update the global contact for the user
637         update_gcontact_for_user(local_user());
638
639         //$_SESSION['theme'] = $theme;
640         if($email_changed && $a->config['register_policy'] == REGISTER_VERIFY) {
641
642                 // FIXME - set to un-verified, blocked and redirect to logout
643                 // Why? Are we verifying people or email addresses?
644
645         }
646
647         goaway('settings');
648         return; // NOTREACHED
649 }
650
651
652 function settings_content(&$a) {
653
654         $o = '';
655         nav_set_selected('settings');
656
657         if(! local_user()) {
658                 #notice( t('Permission denied.') . EOL );
659                 return;
660         }
661
662         if(x($_SESSION,'submanage') && intval($_SESSION['submanage'])) {
663                 notice( t('Permission denied.') . EOL );
664                 return;
665         }
666
667
668
669         if(($a->argc > 1) && ($a->argv[1] === 'oauth')) {
670
671                 if(($a->argc > 2) && ($a->argv[2] === 'add')) {
672                         $tpl = get_markup_template("settings_oauth_edit.tpl");
673                         $o .= replace_macros($tpl, array(
674                                 '$form_security_token' => get_form_security_token("settings_oauth"),
675                                 '$title'        => t('Add application'),
676                                 '$submit'       => t('Save Settings'),
677                                 '$cancel'       => t('Cancel'),
678                                 '$name'         => array('name', t('Name'), '', ''),
679                                 '$key'          => array('key', t('Consumer Key'), '', ''),
680                                 '$secret'       => array('secret', t('Consumer Secret'), '', ''),
681                                 '$redirect'     => array('redirect', t('Redirect'), '', ''),
682                                 '$icon'         => array('icon', t('Icon url'), '', ''),
683                         ));
684                         return $o;
685                 }
686
687                 if(($a->argc > 3) && ($a->argv[2] === 'edit')) {
688                         $r = q("SELECT * FROM clients WHERE client_id='%s' AND uid=%d",
689                                         dbesc($a->argv[3]),
690                                         local_user());
691
692                         if (!count($r)){
693                                 notice(t("You can't edit this application."));
694                                 return;
695                         }
696                         $app = $r[0];
697
698                         $tpl = get_markup_template("settings_oauth_edit.tpl");
699                         $o .= replace_macros($tpl, array(
700                                 '$form_security_token' => get_form_security_token("settings_oauth"),
701                                 '$title'        => t('Add application'),
702                                 '$submit'       => t('Update'),
703                                 '$cancel'       => t('Cancel'),
704                                 '$name'         => array('name', t('Name'), $app['name'] , ''),
705                                 '$key'          => array('key', t('Consumer Key'), $app['client_id'], ''),
706                                 '$secret'       => array('secret', t('Consumer Secret'), $app['pw'], ''),
707                                 '$redirect'     => array('redirect', t('Redirect'), $app['redirect_uri'], ''),
708                                 '$icon'         => array('icon', t('Icon url'), $app['icon'], ''),
709                         ));
710                         return $o;
711                 }
712
713                 if(($a->argc > 3) && ($a->argv[2] === 'delete')) {
714                         check_form_security_token_redirectOnErr('/settings/oauth', 'settings_oauth', 't');
715
716                         $r = q("DELETE FROM clients WHERE client_id='%s' AND uid=%d",
717                                         dbesc($a->argv[3]),
718                                         local_user());
719                         goaway($a->get_baseurl(true)."/settings/oauth/");
720                         return;
721                 }
722
723
724                 $r = q("SELECT clients.*, tokens.id as oauth_token, (clients.uid=%d) AS my
725                                 FROM clients
726                                 LEFT JOIN tokens ON clients.client_id=tokens.client_id
727                                 WHERE clients.uid IN (%d,0)",
728                                 local_user(),
729                                 local_user());
730
731
732                 $tpl = get_markup_template("settings_oauth.tpl");
733                 $o .= replace_macros($tpl, array(
734                         '$form_security_token' => get_form_security_token("settings_oauth"),
735                         '$baseurl'      => $a->get_baseurl(true),
736                         '$title'        => t('Connected Apps'),
737                         '$add'          => t('Add application'),
738                         '$edit'         => t('Edit'),
739                         '$delete'               => t('Delete'),
740                         '$consumerkey' => t('Client key starts with'),
741                         '$noname'       => t('No name'),
742                         '$remove'       => t('Remove authorization'),
743                         '$apps'         => $r,
744                 ));
745                 return $o;
746
747         }
748
749         if(($a->argc > 1) && ($a->argv[1] === 'addon')) {
750                 $settings_addons = "";
751
752                 $r = q("SELECT * FROM `hook` WHERE `hook` = 'plugin_settings' ");
753                 if(! count($r))
754                         $settings_addons = t('No Plugin settings configured');
755
756                 call_hooks('plugin_settings', $settings_addons);
757
758
759                 $tpl = get_markup_template("settings_addons.tpl");
760                 $o .= replace_macros($tpl, array(
761                         '$form_security_token' => get_form_security_token("settings_addon"),
762                         '$title'        => t('Plugin Settings'),
763                         '$settings_addons' => $settings_addons
764                 ));
765                 return $o;
766         }
767
768         if(($a->argc > 1) && ($a->argv[1] === 'features')) {
769
770                 $arr = array();
771                 $features = get_features();
772                 foreach($features as $fname => $fdata) {
773                         $arr[$fname] = array();
774                         $arr[$fname][0] = $fdata[0];
775                         foreach(array_slice($fdata,1) as $f) {
776                                 $arr[$fname][1][] = array('feature_' .$f[0],$f[1],((intval(feature_enabled(local_user(),$f[0]))) ? "1" : ''),$f[2],array(t('Off'),t('On')));
777                         }
778                 }
779
780
781                 $tpl = get_markup_template("settings_features.tpl");
782                 $o .= replace_macros($tpl, array(
783                         '$form_security_token' => get_form_security_token("settings_features"),
784                         '$title'        => t('Additional Features'),
785                         '$features' => $arr,
786                         '$submit'   => t('Save Settings'),
787                 ));
788                 return $o;
789         }
790
791         if(($a->argc > 1) && ($a->argv[1] === 'connectors')) {
792
793                 $settings_connectors = '<span id="settings_general_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_general_expanded\'); openClose(\'settings_general_inflated\');">';
794                 $settings_connectors .= '<h3 class="connector">'. t('General Social Media Settings').'</h3>';
795                 $settings_connectors .= '</span>';
796                 $settings_connectors .= '<div id="settings_general_expanded" class="settings-block" style="display: none;">';
797                 $settings_connectors .= '<span class="fakelink" onclick="openClose(\'settings_general_expanded\'); openClose(\'settings_general_inflated\');">';
798                 $settings_connectors .= '<h3 class="connector">'. t('General Social Media Settings').'</h3>';
799                 $settings_connectors .= '</span>';
800
801                 $checked = ((get_pconfig(local_user(), 'system', 'no_intelligent_shortening')) ? ' checked="checked" ' : '');
802
803                 $settings_connectors .= '<div id="no_intelligent_shortening" class="field checkbox">';
804                 $settings_connectors .= '<label id="no_intelligent_shortening-label" for="shortening-checkbox">'. t('Disable intelligent shortening'). '</label>';
805                 $settings_connectors .= '<input id="shortening-checkbox" type="checkbox" name="no_intelligent_shortening" value="1" ' . $checked . '/>';
806                 $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>';
807                 $settings_connectors .= '</div>';
808
809                 $checked = ((get_pconfig(local_user(), 'system', 'ostatus_autofriend')) ? ' checked="checked" ' : '');
810
811                 $settings_connectors .= '<div id="snautofollow-wrapper" class="field checkbox">';
812                 $settings_connectors .= '<label id="snautofollow-label" for="snautofollow-checkbox">'. t('Automatically follow any GNU Social (OStatus) followers/mentioners'). '</label>';
813                 $settings_connectors .= '<input id="snautofollow-checkbox" type="checkbox" name="snautofollow" value="1" ' . $checked . '/>';
814                 $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>';
815                 $settings_connectors .= '</div>';
816
817                 $default_group = get_pconfig(local_user(), 'ostatus', 'default_group');
818                 $legacy_contact = get_pconfig(local_user(), 'ostatus', 'legacy_contact');
819
820                 $settings_connectors .= mini_group_select(local_user(), $default_group, t("Default group for OStatus contacts"));
821
822                 if ($legacy_contact != "")
823                         $a->page['htmlhead'] = '<meta http-equiv="refresh" content="0; URL='.$a->get_baseurl().'/ostatus_subscribe?url='.urlencode($legacy_contact).'">';
824
825                 $settings_connectors .= '<div id="legacy-contact-wrapper" class="field input">';
826                 $settings_connectors .= '<label id="legacy-contact-label" for="snautofollow-checkbox">'. t('Your legacy GNU Social account'). '</label>';
827                 $settings_connectors .= '<input id="legacy-contact-checkbox" name="legacy_contact" value="'.$legacy_contact.'"/>';
828                 $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>';
829                 $settings_connectors .= '</div>';
830
831                 $settings_connectors .= '<p><a href="'.$a->get_baseurl().'/repair_ostatus">'.t("Repair OStatus subscriptions").'</a></p>';
832
833                 $settings_connectors .= '<div class="settings-submit-wrapper" ><input type="submit" name="general-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
834
835                 $settings_connectors .= '</div><div class="clear"></div>';
836
837                 call_hooks('connector_settings', $settings_connectors);
838
839                 if (is_site_admin()) {
840                         $diasp_enabled = sprintf( t('Built-in support for %s connectivity is %s'), t('Diaspora'), ((get_config('system','diaspora_enabled')) ? t('enabled') : t('disabled')));
841                         $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')));
842                 } else {
843                         $diasp_enabled = "";
844                         $ostat_enabled = "";
845                 }
846
847                 $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
848                 if(get_config('system','dfrn_only'))
849                         $mail_disabled = 1;
850
851                 if(! $mail_disabled) {
852                         $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
853                                 local_user()
854                         );
855                 }
856                 else {
857                         $r = null;
858                 }
859
860                 $mail_server       = ((count($r)) ? $r[0]['server'] : '');
861                 $mail_port         = ((count($r) && intval($r[0]['port'])) ? intval($r[0]['port']) : '');
862                 $mail_ssl          = ((count($r)) ? $r[0]['ssltype'] : '');
863                 $mail_user         = ((count($r)) ? $r[0]['user'] : '');
864                 $mail_replyto      = ((count($r)) ? $r[0]['reply_to'] : '');
865                 $mail_pubmail      = ((count($r)) ? $r[0]['pubmail'] : 0);
866                 $mail_action       = ((count($r)) ? $r[0]['action'] : 0);
867                 $mail_movetofolder = ((count($r)) ? $r[0]['movetofolder'] : '');
868                 $mail_chk          = ((count($r)) ? $r[0]['last_check'] : '0000-00-00 00:00:00');
869
870
871                 $tpl = get_markup_template("settings_connectors.tpl");
872
873                 if(! service_class_allows(local_user(),'email_connect')) {
874                         $mail_disabled_message = upgrade_bool_message();
875                 }
876                 else {
877                         $mail_disabled_message = (($mail_disabled) ? t('Email access is disabled on this site.') : '');
878                 }
879
880
881                 $o .= replace_macros($tpl, array(
882                         '$form_security_token' => get_form_security_token("settings_connectors"),
883
884                         '$title'        => t('Social Networks'),
885
886                         '$diasp_enabled' => $diasp_enabled,
887                         '$ostat_enabled' => $ostat_enabled,
888
889                         '$h_imap' => t('Email/Mailbox Setup'),
890                         '$imap_desc' => t("If you wish to communicate with email contacts using this service \x28optional\x29, please specify how to connect to your mailbox."),
891                         '$imap_lastcheck' => array('imap_lastcheck', t('Last successful email check:'), $mail_chk,''),
892                         '$mail_disabled' => $mail_disabled_message,
893                         '$mail_server'  => array('mail_server',  t('IMAP server name:'), $mail_server, ''),
894                         '$mail_port'    => array('mail_port',    t('IMAP port:'), $mail_port, ''),
895                         '$mail_ssl'             => array('mail_ssl',     t('Security:'), strtoupper($mail_ssl), '', array( 'notls'=>t('None'), 'TLS'=>'TLS', 'SSL'=>'SSL')),
896                         '$mail_user'    => array('mail_user',    t('Email login name:'), $mail_user, ''),
897                         '$mail_pass'    => array('mail_pass',    t('Email password:'), '', ''),
898                         '$mail_replyto' => array('mail_replyto', t('Reply-to address:'), $mail_replyto, 'Optional'),
899                         '$mail_pubmail' => array('mail_pubmail', t('Send public posts to all email contacts:'), $mail_pubmail, ''),
900                         '$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'))),
901                         '$mail_movetofolder'    => array('mail_movetofolder',    t('Move to folder:'), $mail_movetofolder, ''),
902                         '$submit' => t('Save Settings'),
903
904                         '$settings_connectors' => $settings_connectors
905                 ));
906
907                 call_hooks('display_settings', $o);
908                 return $o;
909         }
910
911         /*
912          * DISPLAY SETTINGS
913          */
914         if(($a->argc > 1) && ($a->argv[1] === 'display')) {
915                 $default_theme = get_config('system','theme');
916                 if(! $default_theme)
917                         $default_theme = 'default';
918                 $default_mobile_theme = get_config('system','mobile-theme');
919                 if(! $mobile_default_theme)
920                         $mobile_default_theme = 'none';
921
922                 $allowed_themes_str = get_config('system','allowed_themes');
923                 $allowed_themes_raw = explode(',',$allowed_themes_str);
924                 $allowed_themes = array();
925                 if(count($allowed_themes_raw))
926                         foreach($allowed_themes_raw as $x)
927                                 if(strlen(trim($x)) && is_dir("view/theme/$x"))
928                                         $allowed_themes[] = trim($x);
929
930
931                 $themes = array();
932                 $mobile_themes = array("---" => t('No special theme for mobile devices'));
933                 $files = glob('view/theme/*'); /* */
934                 if($allowed_themes) {
935                         foreach($allowed_themes as $th) {
936                                 $f = $th;
937                                 $is_experimental = file_exists('view/theme/' . $th . '/experimental');
938                                 $unsupported = file_exists('view/theme/' . $th . '/unsupported');
939                                 $is_mobile = file_exists('view/theme/' . $th . '/mobile');
940                                 if (!$is_experimental or ($is_experimental && (get_config('experimentals','exp_themes')==1 or get_config('experimentals','exp_themes')===false))){
941                                         $theme_name = (($is_experimental) ?  sprintf("%s - \x28Experimental\x29", $f) : $f);
942                                         if($is_mobile) {
943                                                 $mobile_themes[$f]=$theme_name;
944                                         }
945                                         else {
946                                                 $themes[$f]=$theme_name;
947                                         }
948                                 }
949                         }
950                 }
951                 $theme_selected = (!x($_SESSION,'theme')? $default_theme : $_SESSION['theme']);
952                 $mobile_theme_selected = (!x($_SESSION,'mobile-theme')? $default_mobile_theme : $_SESSION['mobile-theme']);
953
954                 $browser_update = intval(get_pconfig(local_user(), 'system','update_interval'));
955                 if (intval($browser_update) != -1)
956                         $browser_update = (($browser_update == 0) ? 40 : $browser_update / 1000); // default if not set: 40 seconds
957
958                 $itemspage_network = intval(get_pconfig(local_user(), 'system','itemspage_network'));
959                 $itemspage_network = (($itemspage_network > 0 && $itemspage_network < 101) ? $itemspage_network : 40); // default if not set: 40 items
960                 $itemspage_mobile_network = intval(get_pconfig(local_user(), 'system','itemspage_mobile_network'));
961                 $itemspage_mobile_network = (($itemspage_mobile_network > 0 && $itemspage_mobile_network < 101) ? $itemspage_mobile_network : 20); // default if not set: 20 items
962
963                 $nosmile = get_pconfig(local_user(),'system','no_smilies');
964                 $nosmile = (($nosmile===false)? '0': $nosmile); // default if not set: 0
965
966                 $first_day_of_week = get_pconfig(local_user(),'system','first_day_of_week');
967                 $first_day_of_week = (($first_day_of_week===false)? '0': $first_day_of_week); // default if not set: 0
968                 $weekdays = array(0 => t("Sunday"), 1 => t("Monday"));
969
970                 $noinfo = get_pconfig(local_user(),'system','ignore_info');
971                 $noinfo = (($noinfo===false)? '0': $noinfo); // default if not set: 0
972
973                 $infinite_scroll = get_pconfig(local_user(),'system','infinite_scroll');
974                 $infinite_scroll = (($infinite_scroll===false)? '0': $infinite_scroll); // default if not set: 0
975
976                 $no_auto_update = get_pconfig(local_user(),'system','no_auto_update');
977                 $no_auto_update = (($no_auto_update===false)? '0': $no_auto_update); // default if not set: 0
978
979                 $bandwidth_saver = get_pconfig(local_user(), 'system', 'bandwidth_saver');
980                 $bandwidth_saver = (($bandwidth_saver === false) ? '0' : $bandwidth_saver); // default if not set: 0
981
982                 $theme_config = "";
983                 if (($themeconfigfile = get_theme_config_file($theme_selected)) != null) {
984                         require_once($themeconfigfile);
985                         $theme_config = theme_content($a);
986                 }
987
988                 $tpl = get_markup_template("settings_display.tpl");
989                 $o = replace_macros($tpl, array(
990                         '$ptitle'       => t('Display Settings'),
991                         '$form_security_token' => get_form_security_token("settings_display"),
992                         '$submit'       => t('Save Settings'),
993                         '$baseurl' => $a->get_baseurl(true),
994                         '$uid' => local_user(),
995
996                         '$theme'        => array('theme', t('Display Theme:'), $theme_selected, '', $themes, true),
997                         '$mobile_theme' => array('mobile_theme', t('Mobile Theme:'), $mobile_theme_selected, '', $mobile_themes, false),
998                         '$ajaxint'   => array('browser_update',  t("Update browser every xx seconds"), $browser_update, t('Minimum of 10 seconds. Enter -1 to disable it.')),
999                         '$itemspage_network'   => array('itemspage_network',  t("Number of items to display per page:"), $itemspage_network, t('Maximum of 100 items')),
1000                         '$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')),
1001                         '$nosmile'      => array('nosmile', t("Don't show emoticons"), $nosmile, ''),
1002                         '$calendar_title' => t('Calendar'),
1003                         '$first_day_of_week'    => array('first_day_of_week', t('Beginning of week:'), $first_day_of_week, '', $weekdays, false),
1004                         '$noinfo'       => array('noinfo', t("Don't show notices"), $noinfo, ''),
1005                         '$infinite_scroll'      => array('infinite_scroll', t("Infinite scroll"), $infinite_scroll, ''),
1006                         '$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.'),
1007                         '$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.')),
1008
1009                         '$d_tset' => t('General Theme Settings'),
1010                         '$d_ctset' => t('Custom Theme Settings'),
1011                         '$d_cset' => t('Content Settings'),
1012                         'stitle' => t('Theme settings'),
1013                         '$theme_config' => $theme_config,
1014                 ));
1015
1016                 $tpl = get_markup_template("settings_display_end.tpl");
1017                 $a->page['end'] .= replace_macros($tpl, array(
1018                         '$theme'        => array('theme', t('Display Theme:'), $theme_selected, '', $themes)
1019                 ));
1020
1021                 return $o;
1022         }
1023
1024
1025         /*
1026          * ACCOUNT SETTINGS
1027          */
1028
1029         require_once('include/acl_selectors.php');
1030
1031         $p = q("SELECT * FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1",
1032                 intval(local_user())
1033         );
1034         if(count($p))
1035                 $profile = $p[0];
1036
1037         $username   = $a->user['username'];
1038         $email      = $a->user['email'];
1039         $nickname   = $a->user['nickname'];
1040         $timezone   = $a->user['timezone'];
1041         $language   = $a->user['language'];
1042         $notify     = $a->user['notify-flags'];
1043         $defloc     = $a->user['default-location'];
1044         $openid     = $a->user['openid'];
1045         $maxreq     = $a->user['maxreq'];
1046         $expire     = ((intval($a->user['expire'])) ? $a->user['expire'] : '');
1047         $blockwall  = $a->user['blockwall'];
1048         $blocktags  = $a->user['blocktags'];
1049         $unkmail    = $a->user['unkmail'];
1050         $cntunkmail = $a->user['cntunkmail'];
1051
1052         $expire_items = get_pconfig(local_user(), 'expire','items');
1053         $expire_items = (($expire_items===false)? '1' : $expire_items); // default if not set: 1
1054
1055         $expire_notes = get_pconfig(local_user(), 'expire','notes');
1056         $expire_notes = (($expire_notes===false)? '1' : $expire_notes); // default if not set: 1
1057
1058         $expire_starred = get_pconfig(local_user(), 'expire','starred');
1059         $expire_starred = (($expire_starred===false)? '1' : $expire_starred); // default if not set: 1
1060
1061         $expire_photos = get_pconfig(local_user(), 'expire','photos');
1062         $expire_photos = (($expire_photos===false)? '0' : $expire_photos); // default if not set: 0
1063
1064         $expire_network_only = get_pconfig(local_user(), 'expire','network_only');
1065         $expire_network_only = (($expire_network_only===false)? '0' : $expire_network_only); // default if not set: 0
1066
1067
1068         $suggestme = get_pconfig(local_user(), 'system','suggestme');
1069         $suggestme = (($suggestme===false)? '0': $suggestme); // default if not set: 0
1070
1071         $post_newfriend = get_pconfig(local_user(), 'system','post_newfriend');
1072         $post_newfriend = (($post_newfriend===false)? '0': $post_newfriend); // default if not set: 0
1073
1074         $post_joingroup = get_pconfig(local_user(), 'system','post_joingroup');
1075         $post_joingroup = (($post_joingroup===false)? '0': $post_joingroup); // default if not set: 0
1076
1077         $post_profilechange = get_pconfig(local_user(), 'system','post_profilechange');
1078         $post_profilechange = (($post_profilechange===false)? '0': $post_profilechange); // default if not set: 0
1079
1080         // nowarn_insecure
1081
1082         if(! strlen($a->user['timezone']))
1083                 $timezone = date_default_timezone_get();
1084
1085         // Set the account type to "Community" when the page is a community page but the account type doesn't fit
1086         // This is only happening on the first visit after the update
1087         if (in_array($a->user['page-flags'], array(PAGE_COMMUNITY, PAGE_PRVGROUP)) AND
1088                 ($a->user['account-type'] != ACCOUNT_TYPE_COMMUNITY))
1089                 $a->user['account-type'] = ACCOUNT_TYPE_COMMUNITY;
1090
1091         $pageset_tpl = get_markup_template('settings_pagetypes.tpl');
1092
1093         $pagetype = replace_macros($pageset_tpl, array(
1094                 '$account_types'        => t("Account Types"),
1095                 '$user'                 => t("Personal Page Subtypes"),
1096                 '$community'            => t("Community Forum Subtypes"),
1097                 '$account_type'         => $a->user['account-type'],
1098                 '$type_person'          => ACCOUNT_TYPE_PERSON,
1099                 '$type_organisation'    => ACCOUNT_TYPE_ORGANISATION,
1100                 '$type_news'            => ACCOUNT_TYPE_NEWS,
1101                 '$type_community'       => ACCOUNT_TYPE_COMMUNITY,
1102
1103                 '$account_person'       => array('account-type', t('Personal Page'), ACCOUNT_TYPE_PERSON,
1104                                                                         t('This account is a regular personal profile'),
1105                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_PERSON)),
1106
1107                 '$account_organisation' => array('account-type', t('Organisation Page'), ACCOUNT_TYPE_ORGANISATION,
1108                                                                         t('This account is a profile for an organisation'),
1109                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_ORGANISATION)),
1110
1111                 '$account_news'         => array('account-type', t('News Page'), ACCOUNT_TYPE_NEWS,
1112                                                                         t('This account is a news account/reflector'),
1113                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_NEWS)),
1114
1115                 '$account_community'    => array('account-type', t('Community Forum'), ACCOUNT_TYPE_COMMUNITY,
1116                                                                         t('This account is a community forum where people can discuss with each other'),
1117                                                                         ($a->user['account-type'] == ACCOUNT_TYPE_COMMUNITY)),
1118
1119                 '$page_normal'          => array('page-flags', t('Normal Account Page'), PAGE_NORMAL,
1120                                                                         t('This account is a normal personal profile'),
1121                                                                         ($a->user['page-flags'] == PAGE_NORMAL)),
1122
1123                 '$page_soapbox'         => array('page-flags', t('Soapbox Page'), PAGE_SOAPBOX,
1124                                                                         t('Automatically approve all connection/friend requests as read-only fans'),
1125                                                                         ($a->user['page-flags'] == PAGE_SOAPBOX)),
1126
1127                 '$page_community'       => array('page-flags', t('Public Forum'), PAGE_COMMUNITY,
1128                                                                         t('Automatically approve all contact requests'),
1129                                                                         ($a->user['page-flags'] == PAGE_COMMUNITY)),
1130
1131                 '$page_freelove'        => array('page-flags', t('Automatic Friend Page'), PAGE_FREELOVE,
1132                                                                         t('Automatically approve all connection/friend requests as friends'),
1133                                                                         ($a->user['page-flags'] == PAGE_FREELOVE)),
1134
1135                 '$page_prvgroup'        => array('page-flags', t('Private Forum [Experimental]'), PAGE_PRVGROUP,
1136                                                                         t('Private forum - approved members only'),
1137                                                                         ($a->user['page-flags'] == PAGE_PRVGROUP)),
1138
1139
1140         ));
1141
1142         $noid = get_config('system','no_openid');
1143
1144         if($noid) {
1145                 $openid_field = false;
1146         }
1147         else {
1148                 $openid_field = array('openid_url', t('OpenID:'),$openid, t("\x28Optional\x29 Allow this OpenID to login to this account."), "", "", "url");
1149         }
1150
1151
1152         $opt_tpl = get_markup_template("field_yesno.tpl");
1153         if(get_config('system','publish_all')) {
1154                 $profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
1155         }
1156         else {
1157                 $profile_in_dir = replace_macros($opt_tpl,array(
1158                         '$field'        => array('profile_in_directory', t('Publish your default profile in your local site directory?'), $profile['publish'], '', array(t('No'),t('Yes'))),
1159                 ));
1160         }
1161
1162         if(strlen(get_config('system','directory'))) {
1163                 $profile_in_net_dir = replace_macros($opt_tpl,array(
1164                         '$field'        => array('profile_in_netdirectory', t('Publish your default profile in the global social directory?'), $profile['net-publish'], '', array(t('No'),t('Yes'))),
1165                 ));
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
1186         $blocktags = replace_macros($opt_tpl,array(
1187                         '$field'        => array('blocktags',  t('Allow friends to tag your posts?'), (intval($a->user['blocktags']) ? '0' : '1'), '', array(t('No'),t('Yes'))),
1188
1189         ));
1190
1191
1192         $suggestme = replace_macros($opt_tpl,array(
1193                         '$field'        => array('suggestme',  t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', array(t('No'),t('Yes'))),
1194
1195         ));
1196
1197
1198         $unkmail = replace_macros($opt_tpl,array(
1199                         '$field'        => array('unkmail',  t('Permit unknown people to send you private mail?'), $unkmail, '', array(t('No'),t('Yes'))),
1200
1201         ));
1202
1203         $invisible = (((! $profile['publish']) && (! $profile['net-publish']))
1204                 ? true : false);
1205
1206         if($invisible)
1207                 info( t('Profile is <strong>not published</strong>.') . EOL );
1208
1209
1210         //$subdir = ((strlen($a->get_path())) ? '<br />' . t('or') . ' ' . 'profile/' . $nickname : '');
1211
1212         $tpl_addr = get_markup_template("settings_nick_set.tpl");
1213
1214         $prof_addr = replace_macros($tpl_addr,array(
1215                 '$desc' => sprintf(t("Your Identity Address is <strong>'%s'</strong> or '%s'."), $nickname.'@'.$a->get_hostname().$a->get_path(), $a->get_baseurl().'/profile/'.$nickname),
1216                 '$basepath' => $a->get_hostname()
1217         ));
1218
1219         $stpl = get_markup_template('settings.tpl');
1220
1221         $expire_arr = array(
1222                 'days' => array('expire',  t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
1223                 'advanced' => t('Advanced expiration settings'),
1224                 'label' => t('Advanced Expiration'),
1225                 'items' => array('expire_items',  t("Expire posts:"), $expire_items, '', array(t('No'),t('Yes'))),
1226                 'notes' => array('expire_notes',  t("Expire personal notes:"), $expire_notes, '', array(t('No'),t('Yes'))),
1227                 'starred' => array('expire_starred',  t("Expire starred posts:"), $expire_starred, '', array(t('No'),t('Yes'))),
1228                 'photos' => array('expire_photos',  t("Expire photos:"), $expire_photos, '', array(t('No'),t('Yes'))),
1229                 'network_only' => array('expire_network_only',  t("Only expire posts by others:"), $expire_network_only, '', array(t('No'),t('Yes'))),
1230         );
1231
1232         require_once('include/group.php');
1233         $group_select = mini_group_select(local_user(),$a->user['def_gid']);
1234
1235
1236         // Private/public post links for the non-JS ACL form
1237         $private_post = 1;
1238         if($_REQUEST['public'])
1239                 $private_post = 0;
1240
1241         $query_str = $a->query_string;
1242         if(strpos($query_str, 'public=1') !== false)
1243                 $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
1244
1245         // I think $a->query_string may never have ? in it, but I could be wrong
1246         // It looks like it's from the index.php?q=[etc] rewrite that the web
1247         // server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
1248         if(strpos($query_str, '?') === false)
1249                 $public_post_link = '?public=1';
1250         else
1251                 $public_post_link = '&public=1';
1252
1253         /* Installed langs */
1254         $lang_choices = get_available_languages();
1255
1256         $o .= replace_macros($stpl, array(
1257                 '$ptitle'       => t('Account Settings'),
1258
1259                 '$submit'       => t('Save Settings'),
1260                 '$baseurl' => $a->get_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' => (! get_config('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                                                                         get_pconfig(local_user(),'system','email_textonly'),
1336                                                                         t('Send text only notification emails, without the html part')),
1337
1338                 '$h_advn' => t('Advanced Account/Page Type Settings'),
1339                 '$h_descadvn' => t('Change the behaviour of this account for special situations'),
1340                 '$pagetype' => $pagetype,
1341
1342                 '$relocate' => t('Relocate'),
1343                 '$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."),
1344                 '$relocate_button' => t("Resend relocate message to contacts"),
1345
1346         ));
1347
1348         call_hooks('settings_form',$o);
1349
1350         $o .= '</form>' . "\r\n";
1351
1352         return $o;
1353
1354 }