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