]> git.mxchange.org Git - friendica.git/blob - mod/settings.php
a985985c7b8cb430136b86ba1406ec7861f016cc
[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(), '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(), 'ostatus', 'legacy_contact');
774
775                 if ($legacy_contact != "")
776                         $a->page['htmlhead'] = '<meta http-equiv="refresh" content="0; URL='.$a->get_baseurl().'/ostatus_subscribe?url='.urlencode($legacy_contact).'">';
777
778                 $settings_connectors .= '<div id="legacy-contact-wrapper" class="field input">';
779                 $settings_connectors .= '<label id="legacy-contact-label" for="snautofollow-checkbox">'. t('Your legacy GNU Social account'). '</label>';
780                 $settings_connectors .= '<input id="legacy-contact-checkbox" name="legacy_contact" value="'.$legacy_contact.'"/>';
781                 $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>';
782                 $settings_connectors .= '</div>';
783
784                 $settings_connectors .= '<p><a href="'.$a->get_baseurl().'/repair_ostatus">'.t("Repair OStatus subscriptions").'</a></p>';
785
786                 $settings_connectors .= '<div class="settings-submit-wrapper" ><input type="submit" name="general-submit" class="settings-submit" value="' . t('Save Settings') . '" /></div>';
787
788                 $settings_connectors .= '</div><div class="clear"></div>';
789
790                 call_hooks('connector_settings', $settings_connectors);
791
792                 if (is_site_admin()) {
793                         $diasp_enabled = sprintf( t('Built-in support for %s connectivity is %s'), t('Diaspora'), ((get_config('system','diaspora_enabled')) ? t('enabled') : t('disabled')));
794                         $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')));
795                 } else {
796                         $diasp_enabled = "";
797                         $ostat_enabled = "";
798                 }
799
800                 $mail_disabled = ((function_exists('imap_open') && (! get_config('system','imap_disabled'))) ? 0 : 1);
801                 if(get_config('system','dfrn_only'))
802                         $mail_disabled = 1;
803
804                 if(! $mail_disabled) {
805                         $r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
806                                 local_user()
807                         );
808                 }
809                 else {
810                         $r = null;
811                 }
812
813                 $mail_server       = ((count($r)) ? $r[0]['server'] : '');
814                 $mail_port         = ((count($r) && intval($r[0]['port'])) ? intval($r[0]['port']) : '');
815                 $mail_ssl          = ((count($r)) ? $r[0]['ssltype'] : '');
816                 $mail_user         = ((count($r)) ? $r[0]['user'] : '');
817                 $mail_replyto      = ((count($r)) ? $r[0]['reply_to'] : '');
818                 $mail_pubmail      = ((count($r)) ? $r[0]['pubmail'] : 0);
819                 $mail_action       = ((count($r)) ? $r[0]['action'] : 0);
820                 $mail_movetofolder = ((count($r)) ? $r[0]['movetofolder'] : '');
821                 $mail_chk          = ((count($r)) ? $r[0]['last_check'] : '0000-00-00 00:00:00');
822
823
824                 $tpl = get_markup_template("settings_connectors.tpl");
825
826                 if(! service_class_allows(local_user(),'email_connect')) {
827                         $mail_disabled_message = upgrade_bool_message();
828                 }
829                 else {
830                         $mail_disabled_message = (($mail_disabled) ? t('Email access is disabled on this site.') : '');
831                 }
832
833
834                 $o .= replace_macros($tpl, array(
835                         '$form_security_token' => get_form_security_token("settings_connectors"),
836
837                         '$title'        => t('Social Networks'),
838
839                         '$diasp_enabled' => $diasp_enabled,
840                         '$ostat_enabled' => $ostat_enabled,
841
842                         '$h_imap' => t('Email/Mailbox Setup'),
843                         '$imap_desc' => t("If you wish to communicate with email contacts using this service \x28optional\x29, please specify how to connect to your mailbox."),
844                         '$imap_lastcheck' => array('imap_lastcheck', t('Last successful email check:'), $mail_chk,''),
845                         '$mail_disabled' => $mail_disabled_message,
846                         '$mail_server'  => array('mail_server',  t('IMAP server name:'), $mail_server, ''),
847                         '$mail_port'    => array('mail_port',    t('IMAP port:'), $mail_port, ''),
848                         '$mail_ssl'             => array('mail_ssl',     t('Security:'), strtoupper($mail_ssl), '', array( 'notls'=>t('None'), 'TLS'=>'TLS', 'SSL'=>'SSL')),
849                         '$mail_user'    => array('mail_user',    t('Email login name:'), $mail_user, ''),
850                         '$mail_pass'    => array('mail_pass',    t('Email password:'), '', ''),
851                         '$mail_replyto' => array('mail_replyto', t('Reply-to address:'), $mail_replyto, 'Optional'),
852                         '$mail_pubmail' => array('mail_pubmail', t('Send public posts to all email contacts:'), $mail_pubmail, ''),
853                         '$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'))),
854                         '$mail_movetofolder'    => array('mail_movetofolder',    t('Move to folder:'), $mail_movetofolder, ''),
855                         '$submit' => t('Save Settings'),
856
857                         '$settings_connectors' => $settings_connectors
858                 ));
859
860                 call_hooks('display_settings', $o);
861                 return $o;
862         }
863
864         /*
865          * DISPLAY SETTINGS
866          */
867         if(($a->argc > 1) && ($a->argv[1] === 'display')) {
868                 $default_theme = get_config('system','theme');
869                 if(! $default_theme)
870                         $default_theme = 'default';
871                 $default_mobile_theme = get_config('system','mobile-theme');
872                 if(! $mobile_default_theme)
873                         $mobile_default_theme = 'none';
874
875                 $allowed_themes_str = get_config('system','allowed_themes');
876                 $allowed_themes_raw = explode(',',$allowed_themes_str);
877                 $allowed_themes = array();
878                 if(count($allowed_themes_raw))
879                         foreach($allowed_themes_raw as $x)
880                                 if(strlen(trim($x)) && is_dir("view/theme/$x"))
881                                         $allowed_themes[] = trim($x);
882
883
884                 $themes = array();
885                 $mobile_themes = array("---" => t('No special theme for mobile devices'));
886                 $files = glob('view/theme/*'); /* */
887                 if($allowed_themes) {
888                         foreach($allowed_themes as $th) {
889                                 $f = $th;
890                                 $is_experimental = file_exists('view/theme/' . $th . '/experimental');
891                                 $unsupported = file_exists('view/theme/' . $th . '/unsupported');
892                                 $is_mobile = file_exists('view/theme/' . $th . '/mobile');
893                                 if (!$is_experimental or ($is_experimental && (get_config('experimentals','exp_themes')==1 or get_config('experimentals','exp_themes')===false))){
894                                         $theme_name = (($is_experimental) ?  sprintf("%s - \x28Experimental\x29", $f) : $f);
895                                         if($is_mobile) {
896                                                 $mobile_themes[$f]=$theme_name;
897                                         }
898                                         else {
899                                                 $themes[$f]=$theme_name;
900                                         }
901                                 }
902                         }
903                 }
904                 $theme_selected = (!x($_SESSION,'theme')? $default_theme : $_SESSION['theme']);
905                 $mobile_theme_selected = (!x($_SESSION,'mobile-theme')? $default_mobile_theme : $_SESSION['mobile-theme']);
906
907                 $browser_update = intval(get_pconfig(local_user(), 'system','update_interval'));
908                 $browser_update = (($browser_update == 0) ? 40 : $browser_update / 1000); // default if not set: 40 seconds
909
910                 $itemspage_network = intval(get_pconfig(local_user(), 'system','itemspage_network'));
911                 $itemspage_network = (($itemspage_network > 0 && $itemspage_network < 101) ? $itemspage_network : 40); // default if not set: 40 items
912                 $itemspage_mobile_network = intval(get_pconfig(local_user(), 'system','itemspage_mobile_network'));
913                 $itemspage_mobile_network = (($itemspage_mobile_network > 0 && $itemspage_mobile_network < 101) ? $itemspage_mobile_network : 20); // default if not set: 20 items
914
915                 $nosmile = get_pconfig(local_user(),'system','no_smilies');
916                 $nosmile = (($nosmile===false)? '0': $nosmile); // default if not set: 0
917
918                 $noinfo = get_pconfig(local_user(),'system','ignore_info');
919                 $noinfo = (($noinfo===false)? '0': $noinfo); // default if not set: 0
920
921                 $infinite_scroll = get_pconfig(local_user(),'system','infinite_scroll');
922                 $infinite_scroll = (($infinite_scroll===false)? '0': $infinite_scroll); // default if not set: 0
923
924                 $no_auto_update = get_pconfig(local_user(),'system','no_auto_update');
925                 $no_auto_update = (($no_auto_update===false)? '0': $no_auto_update); // default if not set: 0
926
927                 $theme_config = "";
928                 if( ($themeconfigfile = get_theme_config_file($theme_selected)) != null){
929                         require_once($themeconfigfile);
930                         $theme_config = theme_content($a);
931                 }
932
933                 $tpl = get_markup_template("settings_display.tpl");
934                 $o = replace_macros($tpl, array(
935                         '$ptitle'       => t('Display Settings'),
936                         '$form_security_token' => get_form_security_token("settings_display"),
937                         '$submit'       => t('Save Settings'),
938                         '$baseurl' => $a->get_baseurl(true),
939                         '$uid' => local_user(),
940
941                         '$theme'        => array('theme', t('Display Theme:'), $theme_selected, '', $themes, true),
942                         '$mobile_theme' => array('mobile_theme', t('Mobile Theme:'), $mobile_theme_selected, '', $mobile_themes, false),
943                         '$ajaxint'   => array('browser_update',  t("Update browser every xx seconds"), $browser_update, t('Minimum of 10 seconds, no maximum')),
944                         '$itemspage_network'   => array('itemspage_network',  t("Number of items to display per page:"), $itemspage_network, t('Maximum of 100 items')),
945                         '$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')),
946                         '$nosmile'      => array('nosmile', t("Don't show emoticons"), $nosmile, ''),
947                         '$noinfo'       => array('noinfo', t("Don't show notices"), $noinfo, ''),
948                         '$infinite_scroll'      => array('infinite_scroll', t("Infinite scroll"), $infinite_scroll, ''),
949                         '$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.'),
950
951                         'stitle' => t('Theme settings'),
952                         '$theme_config' => $theme_config,
953                 ));
954
955                 $tpl = get_markup_template("settings_display_end.tpl");
956                 $a->page['end'] .= replace_macros($tpl, array(
957                         '$theme'        => array('theme', t('Display Theme:'), $theme_selected, '', $themes)
958                 ));
959
960                 return $o;
961         }
962
963
964         /*
965          * ACCOUNT SETTINGS
966          */
967
968         require_once('include/acl_selectors.php');
969
970         $p = q("SELECT * FROM `profile` WHERE `is-default` = 1 AND `uid` = %d LIMIT 1",
971                 intval(local_user())
972         );
973         if(count($p))
974                 $profile = $p[0];
975
976         $username   = $a->user['username'];
977         $email      = $a->user['email'];
978         $nickname   = $a->user['nickname'];
979         $timezone   = $a->user['timezone'];
980         $notify     = $a->user['notify-flags'];
981         $defloc     = $a->user['default-location'];
982         $openid     = $a->user['openid'];
983         $maxreq     = $a->user['maxreq'];
984         $expire     = ((intval($a->user['expire'])) ? $a->user['expire'] : '');
985         $blockwall  = $a->user['blockwall'];
986         $blocktags  = $a->user['blocktags'];
987         $unkmail    = $a->user['unkmail'];
988         $cntunkmail = $a->user['cntunkmail'];
989
990         $expire_items = get_pconfig(local_user(), 'expire','items');
991         $expire_items = (($expire_items===false)? '1' : $expire_items); // default if not set: 1
992
993         $expire_notes = get_pconfig(local_user(), 'expire','notes');
994         $expire_notes = (($expire_notes===false)? '1' : $expire_notes); // default if not set: 1
995
996         $expire_starred = get_pconfig(local_user(), 'expire','starred');
997         $expire_starred = (($expire_starred===false)? '1' : $expire_starred); // default if not set: 1
998
999         $expire_photos = get_pconfig(local_user(), 'expire','photos');
1000         $expire_photos = (($expire_photos===false)? '0' : $expire_photos); // default if not set: 0
1001
1002         $expire_network_only = get_pconfig(local_user(), 'expire','network_only');
1003         $expire_network_only = (($expire_network_only===false)? '0' : $expire_network_only); // default if not set: 0
1004
1005
1006         $suggestme = get_pconfig(local_user(), 'system','suggestme');
1007         $suggestme = (($suggestme===false)? '0': $suggestme); // default if not set: 0
1008
1009         $post_newfriend = get_pconfig(local_user(), 'system','post_newfriend');
1010         $post_newfriend = (($post_newfriend===false)? '0': $post_newfriend); // default if not set: 0
1011
1012         $post_joingroup = get_pconfig(local_user(), 'system','post_joingroup');
1013         $post_joingroup = (($post_joingroup===false)? '0': $post_joingroup); // default if not set: 0
1014
1015         $post_profilechange = get_pconfig(local_user(), 'system','post_profilechange');
1016         $post_profilechange = (($post_profilechange===false)? '0': $post_profilechange); // default if not set: 0
1017
1018         // nowarn_insecure
1019
1020         if(! strlen($a->user['timezone']))
1021                 $timezone = date_default_timezone_get();
1022
1023
1024
1025         $pageset_tpl = get_markup_template('pagetypes.tpl');
1026         $pagetype = replace_macros($pageset_tpl, array(
1027                 '$user'         => t("User Types"),
1028                 '$community'    => t("Community Types"),
1029                 '$page_normal'  => array('page-flags', t('Normal Account Page'), PAGE_NORMAL,
1030                                                                         t('This account is a normal personal profile'),
1031                                                                         ($a->user['page-flags'] == PAGE_NORMAL)),
1032
1033                 '$page_soapbox'         => array('page-flags', t('Soapbox Page'), PAGE_SOAPBOX,
1034                                                                         t('Automatically approve all connection/friend requests as read-only fans'),
1035                                                                         ($a->user['page-flags'] == PAGE_SOAPBOX)),
1036
1037                 '$page_community'       => array('page-flags', t('Community Forum/Celebrity Account'), PAGE_COMMUNITY,
1038                                                                         t('Automatically approve all connection/friend requests as read-write fans'),
1039                                                                         ($a->user['page-flags'] == PAGE_COMMUNITY)),
1040
1041                 '$page_freelove'        => array('page-flags', t('Automatic Friend Page'), PAGE_FREELOVE,
1042                                                                         t('Automatically approve all connection/friend requests as friends'),
1043                                                                         ($a->user['page-flags'] == PAGE_FREELOVE)),
1044
1045                 '$page_prvgroup'        => array('page-flags', t('Private Forum [Experimental]'), PAGE_PRVGROUP,
1046                                                                         t('Private forum - approved members only'),
1047                                                                         ($a->user['page-flags'] == PAGE_PRVGROUP)),
1048
1049
1050         ));
1051
1052         $noid = get_config('system','no_openid');
1053
1054         if($noid) {
1055                 $openid_field = false;
1056         }
1057         else {
1058                 $openid_field = array('openid_url', t('OpenID:'),$openid, t("\x28Optional\x29 Allow this OpenID to login to this account."), "", "", "url");
1059         }
1060
1061
1062         $opt_tpl = get_markup_template("field_yesno.tpl");
1063         if(get_config('system','publish_all')) {
1064                 $profile_in_dir = '<input type="hidden" name="profile_in_directory" value="1" />';
1065         }
1066         else {
1067                 $profile_in_dir = replace_macros($opt_tpl,array(
1068                         '$field'        => array('profile_in_directory', t('Publish your default profile in your local site directory?'), $profile['publish'], '', array(t('No'),t('Yes'))),
1069                 ));
1070         }
1071
1072         if(strlen(get_config('system','directory_submit_url'))) {
1073                 $profile_in_net_dir = replace_macros($opt_tpl,array(
1074                         '$field'        => array('profile_in_netdirectory', t('Publish your default profile in the global social directory?'), $profile['net-publish'], '', array(t('No'),t('Yes'))),
1075                 ));
1076         }
1077         else
1078                 $profile_in_net_dir = '';
1079
1080
1081         $hide_friends = replace_macros($opt_tpl,array(
1082                         '$field'        => array('hide-friends', t('Hide your contact/friend list from viewers of your default profile?'), $profile['hide-friends'], '', array(t('No'),t('Yes'))),
1083         ));
1084
1085         $hide_wall = replace_macros($opt_tpl,array(
1086                         '$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'))),
1087
1088         ));
1089
1090         $blockwall = replace_macros($opt_tpl,array(
1091                         '$field'        => array('blockwall',  t('Allow friends to post to your profile page?'), (intval($a->user['blockwall']) ? '0' : '1'), '', array(t('No'),t('Yes'))),
1092
1093         ));
1094
1095
1096         $blocktags = replace_macros($opt_tpl,array(
1097                         '$field'        => array('blocktags',  t('Allow friends to tag your posts?'), (intval($a->user['blocktags']) ? '0' : '1'), '', array(t('No'),t('Yes'))),
1098
1099         ));
1100
1101
1102         $suggestme = replace_macros($opt_tpl,array(
1103                         '$field'        => array('suggestme',  t('Allow us to suggest you as a potential friend to new members?'), $suggestme, '', array(t('No'),t('Yes'))),
1104
1105         ));
1106
1107
1108         $unkmail = replace_macros($opt_tpl,array(
1109                         '$field'        => array('unkmail',  t('Permit unknown people to send you private mail?'), $unkmail, '', array(t('No'),t('Yes'))),
1110
1111         ));
1112
1113         $invisible = (((! $profile['publish']) && (! $profile['net-publish']))
1114                 ? true : false);
1115
1116         if($invisible)
1117                 info( t('Profile is <strong>not published</strong>.') . EOL );
1118
1119
1120         //$subdir = ((strlen($a->get_path())) ? '<br />' . t('or') . ' ' . $a->get_baseurl(true) . '/profile/' . $nickname : '');
1121
1122         $tpl_addr = get_markup_template("settings_nick_set.tpl");
1123
1124         $prof_addr = replace_macros($tpl_addr,array(
1125                 '$desc' => sprintf(t("Your Identity Address is <strong>'%s'</strong> or '%s'."), $nickname.'@'.$a->get_hostname().$a->get_path(), $a->get_baseurl().'/profile/'.$nickname),
1126                 '$basepath' => $a->get_hostname()
1127         ));
1128
1129         $stpl = get_markup_template('settings.tpl');
1130
1131         $expire_arr = array(
1132                 'days' => array('expire',  t("Automatically expire posts after this many days:"), $expire, t('If empty, posts will not expire. Expired posts will be deleted')),
1133                 'advanced' => t('Advanced expiration settings'),
1134                 'label' => t('Advanced Expiration'),
1135                 'items' => array('expire_items',  t("Expire posts:"), $expire_items, '', array(t('No'),t('Yes'))),
1136                 'notes' => array('expire_notes',  t("Expire personal notes:"), $expire_notes, '', array(t('No'),t('Yes'))),
1137                 'starred' => array('expire_starred',  t("Expire starred posts:"), $expire_starred, '', array(t('No'),t('Yes'))),
1138                 'photos' => array('expire_photos',  t("Expire photos:"), $expire_photos, '', array(t('No'),t('Yes'))),
1139                 'network_only' => array('expire_network_only',  t("Only expire posts by others:"), $expire_network_only, '', array(t('No'),t('Yes'))),
1140         );
1141
1142         require_once('include/group.php');
1143         $group_select = mini_group_select(local_user(),$a->user['def_gid']);
1144
1145
1146         // Private/public post links for the non-JS ACL form
1147         $private_post = 1;
1148         if($_REQUEST['public'])
1149                 $private_post = 0;
1150
1151         $query_str = $a->query_string;
1152         if(strpos($query_str, 'public=1') !== false)
1153                 $query_str = str_replace(array('?public=1', '&public=1'), array('', ''), $query_str);
1154
1155         // I think $a->query_string may never have ? in it, but I could be wrong
1156         // It looks like it's from the index.php?q=[etc] rewrite that the web
1157         // server does, which converts any ? to &, e.g. suggest&ignore=61 for suggest?ignore=61
1158         if(strpos($query_str, '?') === false)
1159                 $public_post_link = '?public=1';
1160         else
1161                 $public_post_link = '&public=1';
1162
1163
1164         $o .= replace_macros($stpl, array(
1165                 '$ptitle'       => t('Account Settings'),
1166
1167                 '$submit'       => t('Save Settings'),
1168                 '$baseurl' => $a->get_baseurl(true),
1169                 '$uid' => local_user(),
1170                 '$form_security_token' => get_form_security_token("settings"),
1171                 '$nickname_block' => $prof_addr,
1172
1173                 '$h_pass'       => t('Password Settings'),
1174                 '$password1'=> array('password', t('New Password:'), '', ''),
1175                 '$password2'=> array('confirm', t('Confirm:'), '', t('Leave password fields blank unless changing')),
1176                 '$password3'=> array('opassword', t('Current Password:'), '', t('Your current password to confirm the changes')),
1177                 '$password4'=> array('mpassword', t('Password:'), '', t('Your current password to confirm the changes')),
1178                 '$oid_enable' => (! get_config('system','no_openid')),
1179                 '$openid'       => $openid_field,
1180
1181                 '$h_basic'      => t('Basic Settings'),
1182                 '$username' => array('username',  t('Full Name:'), $username,''),
1183                 '$email'        => array('email', t('Email Address:'), $email, '', '', '', 'email'),
1184                 '$timezone' => array('timezone_select' , t('Your Timezone:'), select_timezone($timezone), ''),
1185                 '$defloc'       => array('defloc', t('Default Post Location:'), $defloc, ''),
1186                 '$allowloc' => array('allow_location', t('Use Browser Location:'), ($a->user['allow_location'] == 1), ''),
1187
1188
1189                 '$h_prv'        => t('Security and Privacy Settings'),
1190
1191                 '$maxreq'       => array('maxreq', t('Maximum Friend Requests/Day:'), $maxreq ,t("\x28to prevent spam abuse\x29")),
1192                 '$permissions' => t('Default Post Permissions'),
1193                 '$permdesc' => t("\x28click to open/close\x29"),
1194                 '$visibility' => $profile['net-publish'],
1195                 '$aclselect' => populate_acl($a->user),
1196                 '$suggestme' => $suggestme,
1197                 '$blockwall'=> $blockwall, // array('blockwall', t('Allow friends to post to your profile page:'), !$blockwall, ''),
1198                 '$blocktags'=> $blocktags, // array('blocktags', t('Allow friends to tag your posts:'), !$blocktags, ''),
1199
1200                 // ACL permissions box
1201                 '$acl_data' => construct_acl_data($a, $a->user), // For non-Javascript ACL selector
1202                 '$group_perms' => t('Show to Groups'),
1203                 '$contact_perms' => t('Show to Contacts'),
1204                 '$private' => t('Default Private Post'),
1205                 '$public' => t('Default Public Post'),
1206                 '$is_private' => $private_post,
1207                 '$return_path' => $query_str,
1208                 '$public_link' => $public_post_link,
1209                 '$settings_perms' => t('Default Permissions for New Posts'),
1210
1211                 '$group_select' => $group_select,
1212
1213
1214                 '$expire'       => $expire_arr,
1215
1216                 '$profile_in_dir' => $profile_in_dir,
1217                 '$profile_in_net_dir' => $profile_in_net_dir,
1218                 '$hide_friends' => $hide_friends,
1219                 '$hide_wall' => $hide_wall,
1220                 '$unkmail' => $unkmail,
1221                 '$cntunkmail'   => array('cntunkmail', t('Maximum private messages per day from unknown people:'), $cntunkmail ,t("\x28to prevent spam abuse\x29")),
1222
1223
1224                 '$h_not'        => t('Notification Settings'),
1225                 '$activity_options' => t('By default post a status message when:'),
1226                 '$post_newfriend' => array('post_newfriend',  t('accepting a friend request'), $post_newfriend, ''),
1227                 '$post_joingroup' => array('post_joingroup',  t('joining a forum/community'), $post_joingroup, ''),
1228                 '$post_profilechange' => array('post_profilechange',  t('making an <em>interesting</em> profile change'), $post_profilechange, ''),
1229                 '$lbl_not'      => t('Send a notification email when:'),
1230                 '$notify1'      => array('notify1', t('You receive an introduction'), ($notify & NOTIFY_INTRO), NOTIFY_INTRO, ''),
1231                 '$notify2'      => array('notify2', t('Your introductions are confirmed'), ($notify & NOTIFY_CONFIRM), NOTIFY_CONFIRM, ''),
1232                 '$notify3'      => array('notify3', t('Someone writes on your profile wall'), ($notify & NOTIFY_WALL), NOTIFY_WALL, ''),
1233                 '$notify4'      => array('notify4', t('Someone writes a followup comment'), ($notify & NOTIFY_COMMENT), NOTIFY_COMMENT, ''),
1234                 '$notify5'      => array('notify5', t('You receive a private message'), ($notify & NOTIFY_MAIL), NOTIFY_MAIL, ''),
1235                 '$notify6'  => array('notify6', t('You receive a friend suggestion'), ($notify & NOTIFY_SUGGEST), NOTIFY_SUGGEST, ''),
1236                 '$notify7'  => array('notify7', t('You are tagged in a post'), ($notify & NOTIFY_TAGSELF), NOTIFY_TAGSELF, ''),
1237                 '$notify8'  => array('notify8', t('You are poked/prodded/etc. in a post'), ($notify & NOTIFY_POKE), NOTIFY_POKE, ''),
1238
1239         '$desktop_notifications' => array('desktop_notifications', t('Activate desktop notifications') , false, t('Show desktop popup on new notifications')),
1240                 
1241                 '$email_textonly' => array('email_textonly', t('Text-only notification emails'),
1242                                                                         get_pconfig(local_user(),'system','email_textonly'),
1243                                                                         t('Send text only notification emails, without the html part')),
1244
1245                 '$h_advn' => t('Advanced Account/Page Type Settings'),
1246                 '$h_descadvn' => t('Change the behaviour of this account for special situations'),
1247                 '$pagetype' => $pagetype,
1248
1249                 '$relocate' => t('Relocate'),
1250                 '$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."),
1251                 '$relocate_button' => t("Resend relocate message to contacts"),
1252
1253         ));
1254
1255         call_hooks('settings_form',$o);
1256
1257         $o .= '</form>' . "\r\n";
1258
1259         return $o;
1260
1261 }}
1262